jekyll-theme-zer0 1.29.0 → 1.31.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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +886 -2
  3. data/_data/README.md +2 -0
  4. data/_data/ai.yml +5 -3
  5. data/_data/ai_pricing.yml +36 -0
  6. data/_data/backlog.yml +196 -22
  7. data/_data/consumers.yml +147 -5
  8. data/_data/features.yml +147 -21
  9. data/_data/feedback_types.yml +17 -12
  10. data/_data/landing.yml +5 -2
  11. data/_data/navigation/quickstart.yml +4 -0
  12. data/_data/site_builder.yml +874 -0
  13. data/_data/theme-manifest.yml +132 -122
  14. data/_data/ui-text.yml +19 -0
  15. data/_includes/README.md +11 -1
  16. data/_includes/analytics/posthog.html +30 -11
  17. data/_includes/components/README.md +1 -1
  18. data/_includes/components/admin-links.html +2 -2
  19. data/_includes/components/admin-tabs.html +2 -2
  20. data/_includes/components/ai-chat.html +14 -11
  21. data/_includes/components/analytics-dashboard.html +8 -8
  22. data/_includes/components/author-bio.html +1 -1
  23. data/_includes/components/author-card.html +10 -2
  24. data/_includes/components/author-eeat.html +4 -4
  25. data/_includes/components/background-customizer.html +8 -8
  26. data/_includes/components/background-image.html +120 -0
  27. data/_includes/components/background-settings.html +28 -15
  28. data/_includes/components/collection-manager.html +5 -5
  29. data/_includes/components/component-showcase.html +13 -13
  30. data/_includes/components/config-editor.html +12 -12
  31. data/_includes/components/config-viewer.html +8 -8
  32. data/_includes/components/cookie-consent.html +41 -41
  33. data/_includes/components/cta-button.html +7 -2
  34. data/_includes/components/dev-shortcuts.html +7 -7
  35. data/_includes/components/env-dashboard.html +8 -8
  36. data/_includes/components/env-switcher.html +9 -9
  37. data/_includes/components/feature-card.html +2 -2
  38. data/_includes/components/halfmoon.html +2 -2
  39. data/_includes/components/info-section.html +36 -36
  40. data/_includes/components/js-cdn.html +15 -15
  41. data/_includes/components/language-toggle.html +4 -4
  42. data/_includes/components/mermaid.html +79 -435
  43. data/_includes/components/nanobar.html +5 -5
  44. data/_includes/components/nav-editor.html +2 -2
  45. data/_includes/components/nav-export.html +2 -2
  46. data/_includes/components/nav-overview.html +2 -2
  47. data/_includes/components/page-feedback.html +45 -30
  48. data/_includes/components/page-views-init.html +1 -1
  49. data/_includes/components/post-card.html +22 -22
  50. data/_includes/components/post-type-badge.html +2 -2
  51. data/_includes/components/powered-by.html +2 -2
  52. data/_includes/components/preview-image.html +28 -3
  53. data/_includes/components/quick-index.html +2 -2
  54. data/_includes/components/search-modal.html +27 -2
  55. data/_includes/components/searchbar.html +2 -2
  56. data/_includes/components/svg-background.html +2 -2
  57. data/_includes/components/theme-customizer.html +2 -2
  58. data/_includes/components/theme-info.html +6 -6
  59. data/_includes/components/theme-preview-gallery.html +23 -23
  60. data/_includes/content/giscus.html +2 -2
  61. data/_includes/content/intro.html +15 -8
  62. data/_includes/content/jsonld-faq.html +2 -2
  63. data/_includes/content/jsonld-software.html +2 -2
  64. data/_includes/content/seo.html +12 -4
  65. data/_includes/content/sitemap.html +247 -290
  66. data/_includes/content/toc.html +183 -183
  67. data/_includes/core/branding.html +13 -20
  68. data/_includes/core/console-capture.html +32 -74
  69. data/_includes/core/favicon.html +49 -7
  70. data/_includes/core/footer-fabs.html +17 -3
  71. data/_includes/core/footer.html +31 -18
  72. data/_includes/core/head.html +128 -92
  73. data/_includes/core/header.html +85 -54
  74. data/_includes/core/tokens-inline.html +16 -1
  75. data/_includes/docs/bootstrap-docs.html +8 -8
  76. data/_includes/landing/landing-install-cards.html +2 -2
  77. data/_includes/landing/landing-quick-links.html +1 -1
  78. data/_includes/navigation/admin-nav.html +2 -2
  79. data/_includes/navigation/nav-tree.html +8 -8
  80. data/_includes/navigation/navbar.html +21 -18
  81. data/_includes/navigation/section-sidebar.html +16 -16
  82. data/_includes/navigation/sidebar-config.html +36 -2
  83. data/_includes/navigation/sidebar-left.html +15 -15
  84. data/_includes/navigation/sidebar-right.html +6 -6
  85. data/_includes/obsidian/full-graph.html +2 -2
  86. data/_includes/setup/claude-session.html +72 -0
  87. data/_includes/setup/prereq-checklist.html +90 -0
  88. data/_includes/setup/wizard.html +910 -291
  89. data/_includes/stats/stats-categories.html +8 -8
  90. data/_includes/stats/stats-header.html +14 -14
  91. data/_includes/stats/stats-metrics.html +12 -12
  92. data/_includes/stats/stats-no-data.html +12 -12
  93. data/_includes/stats/stats-overview.html +6 -6
  94. data/_includes/stats/stats-tags.html +8 -8
  95. data/_layouts/404.html +38 -24
  96. data/_layouts/admin.html +22 -22
  97. data/_layouts/article.html +54 -37
  98. data/_layouts/author.html +20 -20
  99. data/_layouts/authors.html +2 -2
  100. data/_layouts/book-abc.html +12 -12
  101. data/_layouts/book-story.html +15 -15
  102. data/_layouts/book.html +12 -12
  103. data/_layouts/collection.html +33 -33
  104. data/_layouts/cookbook.html +12 -12
  105. data/_layouts/default.html +27 -24
  106. data/_layouts/home.html +36 -24
  107. data/_layouts/index.html +10 -10
  108. data/_layouts/landing.html +17 -17
  109. data/_layouts/news.html +44 -44
  110. data/_layouts/note.html +40 -39
  111. data/_layouts/notebook.html +36 -35
  112. data/_layouts/recipe.html +24 -24
  113. data/_layouts/root.html +95 -55
  114. data/_layouts/section.html +23 -23
  115. data/_layouts/setup.html +3 -3
  116. data/_layouts/sitemap-collection.html +49 -49
  117. data/_layouts/stats.html +40 -40
  118. data/_layouts/tag.html +12 -12
  119. data/_layouts/welcome.html +21 -21
  120. data/_sass/components/_cookie-banner.scss +48 -0
  121. data/_sass/components/_mermaid.scss +375 -0
  122. data/_sass/components/_setup-wizard.scss +588 -41
  123. data/_sass/components/_ui-enhancements.scss +11 -0
  124. data/_sass/core/_navbar.scss +147 -100
  125. data/_sass/core/_sidebar-extras.scss +2 -14
  126. data/_sass/core/code-copy.scss +27 -8
  127. data/_sass/layouts/_navbar-extras.scss +14 -4
  128. data/assets/css/extension-points-demo.css +27 -0
  129. data/assets/css/main.scss +1 -0
  130. data/assets/data/wiki-index.json +19 -0
  131. data/assets/js/ai-chat.js +47 -5
  132. data/assets/js/auto-hide-nav.js +53 -13
  133. data/assets/js/code-copy.js +72 -1
  134. data/assets/js/extension-points-demo.js +48 -0
  135. data/assets/js/fleet-feedback-capture.js +124 -0
  136. data/assets/js/fleet-feedback.js +853 -0
  137. data/assets/js/mermaid-diagrams.js +1373 -0
  138. data/assets/js/modules/navigation/config.js +9 -6
  139. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  140. data/assets/js/modules/theme/appearance.js +8 -2
  141. data/assets/js/obsidian-local-graph.js +27 -5
  142. data/assets/js/obsidian-wiki-links.js +8 -3
  143. data/assets/js/page-feedback.js +125 -192
  144. data/assets/js/search-modal.js +26 -0
  145. data/assets/js/setup-wizard.js +2119 -363
  146. data/assets/js/site-builder.js +1834 -0
  147. data/assets/js/ui-enhancements.js +11 -3
  148. data/scripts/README.md +15 -0
  149. data/scripts/ai/README.md +38 -0
  150. data/scripts/ai/api_call.rb +124 -0
  151. data/scripts/ai/usage.rb +314 -0
  152. data/scripts/ai/usage_report.rb +225 -0
  153. data/scripts/ci/test_visual_evidence_autogen.py +403 -0
  154. data/scripts/ci/visual_evidence_autogen.py +1070 -0
  155. data/scripts/content-review.rb +20 -1
  156. data/scripts/features/install-preview-generator +1 -1
  157. data/scripts/lib/README.md +12 -0
  158. data/scripts/lib/preview_generator.py +2 -2
  159. data/scripts/test/integration/mermaid +22 -8
  160. data/scripts/test/lib/run_tests.sh +1 -0
  161. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  162. data/scripts/translate.rb +23 -1
  163. metadata +21 -2
@@ -1,5 +1,5 @@
1
1
  {% comment %} Feature: ZER0-011 {% endcomment %}
2
- <!--
2
+ {% comment %}
3
3
  ===================================================================
4
4
  HEADER - Main Navigation and Site Header
5
5
  ===================================================================
@@ -36,48 +36,67 @@
36
36
  - When `position: navbar`, the bar mounts inside `#top-progress-target` below
37
37
  - Otherwise it floats fixed to the viewport (top or bottom)
38
38
  ===================================================================
39
- -->
39
+ {% endcomment %}
40
40
 
41
- <!-- ================================ -->
42
- <!-- SKIP TO CONTENT LINK -->
43
- <!-- ================================ -->
44
- <!-- UI strings resolve per page language (core/i18n.html sets `ui`) -->
41
+ {% comment %} ================================ {% endcomment %}
42
+ {% comment %} SKIP TO CONTENT LINK {% endcomment %}
43
+ {% comment %} ================================ {% endcomment %}
44
+ {% comment %} UI strings resolve per page language (core/i18n.html sets `ui`) {% endcomment %}
45
45
  {%- include core/i18n.html -%}
46
- <!-- Accessibility: allows keyboard users to skip navigation -->
46
+ {% comment %} Accessibility: allows keyboard users to skip navigation {% endcomment %}
47
47
  <a href="#main-content" class="visually-hidden-focusable position-absolute top-0 start-0 z-3 m-3 btn btn-primary">
48
48
  {{ ui.skip_main_content | default: "Skip to main content" }}
49
49
  </a>
50
50
 
51
51
  <header id="navbar" class="container-fluid text-center fixed-top" role="banner">
52
52
 
53
- <!-- ================================ -->
54
- <!-- TOP NAVIGATION BAR -->
55
- <!-- ================================ -->
53
+ {% comment %} ================================ {% endcomment %}
54
+ {% comment %} TOP NAVIGATION BAR {% endcomment %}
55
+ {% comment %} ================================ {% endcomment %}
56
56
  <div class="navbar navbar-expand-lg bg-body-tertiary flex-nowrap w-100 bottom-shadow">
57
57
 
58
- <!-- ========================== -->
59
- <!-- MAIN NAVIGATION CONTAINER -->
60
- <!-- ========================== -->
58
+ {% comment %} ========================== {% endcomment %}
59
+ {% comment %} MAIN NAVIGATION CONTAINER {% endcomment %}
60
+ {% comment %} ========================== {% endcomment %}
61
61
  <nav class="container-fluid order-2 order-lg-1 d-flex align-items-center gap-1 flex-nowrap navbar-main w-100" aria-label="Primary navigation">
62
62
 
63
- <!-- Leading cluster: sidebar toggle + brand + titles (grid column 1 on lg+) -->
63
+ {% comment %} Leading cluster: sidebar toggle + brand + titles (grid column 1 on lg+) {% endcomment %}
64
64
  <div class="navbar-main-start d-flex align-items-center gap-1 gap-lg-2 min-w-0 flex-shrink-1 flex-grow-1">
65
65
 
66
- <!-- ========================== -->
67
- <!-- MOBILE MENU CONTROLS -->
68
- <!-- ========================== -->
66
+ {% comment %} ========================== {% endcomment %}
67
+ {% comment %} MOBILE MENU CONTROLS {% endcomment %}
68
+ {% comment %} ========================== {% endcomment %}
69
69
 
70
- <!-- Left Sidebar Toggle - Mobile view only. Uses the shared
70
+ {% comment %} Left Sidebar Toggle - Mobile view only. Uses the shared
71
71
  resolver (navigation/sidebar-config.html) so this gate can
72
- never drift from the default layout's aside. -->
72
+ never drift from the default layout's aside. {% endcomment %}
73
73
  {% include navigation/sidebar-config.html %}
74
74
 
75
- {% if sidebar_has_content %}
76
- {%- comment -%}
77
- When site.navigation.unified_mobile_drawer is true, the sidebar
78
- toggle opens the consolidated drawer (Browse tab pre-selected)
79
- instead of the legacy #bdSidebar offcanvas.
80
- {%- endcomment -%}
75
+ {%- comment -%}
76
+ Two conditions, and BOTH are required (issue #373).
77
+
78
+ `sidebar_has_content` asks "is there nav content to show". It is
79
+ not enough on its own: this include is pulled in by
80
+ _layouts/root.html, so it renders on EVERY layout, while
81
+ `#bdSidebar` is emitted by _layouts/default.html alone. On a
82
+ layout that inherits root directly — admin, stats, 404, section,
83
+ home … — the toggle rendered pointing at an offcanvas that was
84
+ never in the document: a dead control, and aria-controls
85
+ dangling into nothing for assistive tech. Measured before the
86
+ fix: 37 of 415 built pages.
87
+
88
+ The unified drawer is exempt because #zer0UnifiedDrawer IS
89
+ emitted from root.html, so it exists on every layout — that
90
+ target is always real and the toggle is always live.
91
+ {%- endcomment -%}
92
+ {% if sidebar_has_content and site.navigation.unified_mobile_drawer %}
93
+ {%- assign _sidebar_toggle_ok = true -%}
94
+ {% elsif sidebar_has_content and sidebar_offcanvas_rendered %}
95
+ {%- assign _sidebar_toggle_ok = true -%}
96
+ {% else %}
97
+ {%- assign _sidebar_toggle_ok = false -%}
98
+ {% endif %}
99
+ {% if _sidebar_toggle_ok %}
81
100
  {%- if site.navigation.unified_mobile_drawer -%}
82
101
  {%- assign _sidebar_target = "#zer0UnifiedDrawer" -%}
83
102
  {%- assign _sidebar_controls = "zer0UnifiedDrawer" -%}
@@ -98,11 +117,11 @@
98
117
  </div>
99
118
  {% endif %}
100
119
 
101
- <!-- ========================== -->
102
- <!-- BRAND AND HOME NAVIGATION -->
103
- <!-- ========================== -->
120
+ {% comment %} ========================== {% endcomment %}
121
+ {% comment %} BRAND AND HOME NAVIGATION {% endcomment %}
122
+ {% comment %} ========================== {% endcomment %}
104
123
  <div class="navbar-brand-group d-inline-flex align-items-center gap-2">
105
- <!-- Home Navigation Button (Desktop only) -->
124
+ {% comment %} Home Navigation Button (Desktop only) {% endcomment %}
106
125
  <div class="navbar-home-links d-none" role="navigation" aria-label="Quick navigation">
107
126
  {%- assign nav_home = site.data.navigation.home -%}
108
127
  {%- if nav_home and nav_home.size > 0 -%}
@@ -118,18 +137,18 @@
118
137
  {%- endif -%}
119
138
  </div>
120
139
 
121
- <!-- Brand Logo Link to Root -->
122
- <!-- Logo path configured in _config.yml -->
140
+ {% comment %} Brand Logo Link to Root {% endcomment %}
141
+ {% comment %} Logo path configured in _config.yml {% endcomment %}
123
142
  {% capture logo_path %}{{ site.logo }}{% endcapture %}
124
143
  <a class="navbar-brand" href="{{ site.baseurl }}/" aria-label="Home - {{ site.title }}" {% if page.url == '/' %}aria-current="page"{% endif %}>
125
144
  <img src="{{ logo_path | relative_url }}" alt="{{ site.title }} logo" width="30" height="30">
126
145
  </a>
127
146
  </div>
128
147
 
129
- <!-- ========================== -->
130
- <!-- SITE BRANDING SECTION -->
131
- <!-- ========================== -->
132
- <!-- Site title and subtitle display -->
148
+ {% comment %} ========================== {% endcomment %}
149
+ {% comment %} SITE BRANDING SECTION {% endcomment %}
150
+ {% comment %} ========================== {% endcomment %}
151
+ {% comment %} Site title and subtitle display {% endcomment %}
133
152
  {% include core/branding.html %}
134
153
 
135
154
  </div>
@@ -141,21 +160,21 @@
141
160
  {%- endcomment -%}
142
161
  {% include navigation/navbar-mobile-quicklinks.html %}
143
162
 
144
- <!-- ========================== -->
145
- <!-- MAIN NAVIGATION MENU -->
146
- <!-- ========================== -->
147
- <!-- Primary navigation items from _data/navigation.yml -->
163
+ {% comment %} ========================== {% endcomment %}
164
+ {% comment %} MAIN NAVIGATION MENU {% endcomment %}
165
+ {% comment %} ========================== {% endcomment %}
166
+ {% comment %} Primary navigation items from _data/navigation.yml {% endcomment %}
148
167
  {% include navigation/navbar.html %}
149
168
 
150
- <!-- ========================== -->
151
- <!-- UTILITY CONTROLS -->
152
- <!-- ========================== -->
169
+ {% comment %} ========================== {% endcomment %}
170
+ {% comment %} UTILITY CONTROLS {% endcomment %}
171
+ {% comment %} ========================== {% endcomment %}
153
172
  <div class="navbar-utility-controls d-flex align-items-center flex-shrink-0" role="group" aria-label="Utility controls">
154
- <!-- Language selection lives in the Settings offcanvas
173
+ {% comment %} Language selection lives in the Settings offcanvas
155
174
  (components/info-section.html, Appearance tab) so the bar
156
- keeps its width for the main navigation items. -->
175
+ keeps its width for the main navigation items. {% endcomment %}
157
176
 
158
- <!-- Search Modal Toggle -->
177
+ {% comment %} Search Modal Toggle {% endcomment %}
159
178
  <button
160
179
  class="btn nav-search-button"
161
180
  type="button"
@@ -170,7 +189,7 @@
170
189
  <kbd class="nav-search-kbd d-none d-xl-inline-flex" aria-hidden="true">/</kbd>
171
190
  </button>
172
191
 
173
- <!-- Settings Offcanvas Toggle -->
192
+ {% comment %} Settings Offcanvas Toggle {% endcomment %}
174
193
  <button
175
194
  class="btn nav-settings-button d-none d-lg-inline-flex"
176
195
  type="button"
@@ -183,7 +202,7 @@
183
202
  <i class="{{site.default_icon}} bi-gear" aria-hidden="true"></i>
184
203
  </button>
185
204
 
186
- <!-- Navigation Menu Toggle - Mobile view -->
205
+ {% comment %} Navigation Menu Toggle - Mobile view {% endcomment %}
187
206
  {%- if site.navigation.unified_mobile_drawer -%}
188
207
  {%- assign _menu_target = "#zer0UnifiedDrawer" -%}
189
208
  {%- assign _menu_controls = "zer0UnifiedDrawer" -%}
@@ -191,27 +210,39 @@
191
210
  {%- assign _menu_target = "#bdNavbar" -%}
192
211
  {%- assign _menu_controls = "bdNavbar" -%}
193
212
  {%- endif -%}
213
+ {% comment %} Below lg this is a LABELLED control, not a bare glyph (#405).
214
+ Two toggles coexist here — the sidebar hamburger and this one — and
215
+ three-dots vs. list gave no clue which opened what. The gear is
216
+ `d-lg-none`-excluded above (desktop only; on mobile its contents are
217
+ reached through the drawer), so labelling this one is what makes the
218
+ pair unambiguous.
219
+ aria-label matches the visible "Menu" text verbatim (rather than the
220
+ older, more descriptive "Toggle main navigation") so the accessible
221
+ name CONTAINS the visible label in every locale — WCAG 2.5.3 Label in
222
+ Name — instead of only coincidentally in English. {% endcomment %}
223
+ {%- assign _menu_toggle_label = ui.nav_menu_toggle_label | default: "Menu" -%}
194
224
  <div class="bd-navbar-toggle d-lg-none">
195
- <button class="navbar-toggler p-2"
225
+ <button class="navbar-toggler navbar-toggler-labeled p-2"
196
226
  type="button"
197
227
  data-bs-toggle="offcanvas"
198
228
  data-bs-target="{{ _menu_target }}"
199
229
  aria-controls="{{ _menu_controls }}"
200
- aria-label="Toggle main navigation"
230
+ aria-label="{{ _menu_toggle_label }}"
201
231
  aria-expanded="false">
202
232
  <span class="bi bi-three-dots" aria-hidden="true"></span>
233
+ <span class="navbar-toggler-text">{{ _menu_toggle_label }}</span>
203
234
  </button>
204
235
  </div>
205
236
  </div>
206
237
  </nav>
207
238
  </div>
208
239
 
209
- <!-- ========================== -->
210
- <!-- PROGRESS BAR MOUNT POINT -->
211
- <!-- ========================== -->
212
- <!-- Nanobar mounts here when site.nanobar.position == "navbar" so the bar
240
+ {% comment %} ========================== {% endcomment %}
241
+ {% comment %} PROGRESS BAR MOUNT POINT {% endcomment %}
242
+ {% comment %} ========================== {% endcomment %}
243
+ {% comment %} Nanobar mounts here when site.nanobar.position == "navbar" so the bar
213
244
  renders as a thin strip directly under the header. For "top" / "bottom"
214
- the bar floats fixed to the viewport and no mount is needed. -->
245
+ the bar floats fixed to the viewport and no mount is needed. {% endcomment %}
215
246
  {%- assign _nb_pos = site.nanobar.position | default: "top" -%}
216
247
  {%- if site.nanobar.enabled != false and _nb_pos == "navbar" -%}
217
248
  <div id="top-progress-target" class="nanobar-mount" aria-hidden="true"></div>
@@ -16,21 +16,36 @@
16
16
 
17
17
  Only emits a key if the config value is present, so the default cascade
18
18
  remains intact when consumers omit `theme_color` from _config.yml.
19
+
20
+ Precedence (T-048 / #459): the active skin beats `theme_color`.
21
+ The skin palettes in _sass/theme/_skins.scss set --zer0-color-primary,
22
+ --zer0-color-link and --zer0-color-accent together with --bs-primary.
23
+ So the config values for those three tokens are only emitted when no
24
+ palette skin is active. Otherwise this block would win on source order,
25
+ because `:root` and `[data-theme-skin]` have the same specificity, and the
26
+ theme layer would disagree with Bootstrap. `palette_skins` must list every
27
+ skin that _skins.scss gives a palette; test/visual/features/appearance.spec.js
28
+ checks that.
19
29
  ===================================================================
20
30
  {%- endcomment -%}
21
31
  {%- assign tc = site.theme_color -%}
32
+ {%- assign palette_skins = "air,aqua,dirt,neon,mint,plum,sunrise" | split: "," -%}
22
33
  {%- if tc -%}
23
34
  <style id="zer0-tokens-inline">
24
35
  :root {
25
- {%- if tc.main %} --zer0-color-primary: {{ tc.main }};{%- endif %}
26
36
  {%- if tc.secondary %} --zer0-color-secondary: {{ tc.secondary }};{%- endif %}
27
37
  {%- if tc.red %} --zer0-color-danger: {{ tc.red }};{%- endif %}
28
38
  {%- if tc.yellow %} --zer0-color-warning: {{ tc.yellow }};{%- endif %}
29
39
  {%- if tc.green %} --zer0-color-success: {{ tc.green }};{%- endif %}
30
40
  {%- if tc.teal %} --zer0-color-info: {{ tc.teal }};{%- endif %}
41
+ }
42
+ {%- if tc.main or tc.blue or tc.purple %}
43
+ :root{% for s in palette_skins %}:not([data-theme-skin="{{ s }}"]){% endfor %} {
44
+ {%- if tc.main %} --zer0-color-primary: {{ tc.main }};{%- endif %}
31
45
  {%- if tc.blue %} --zer0-color-link: {{ tc.blue }};{%- endif %}
32
46
  {%- if tc.purple %} --zer0-color-accent: {{ tc.purple }};{%- endif %}
33
47
  }
48
+ {%- endif %}
34
49
  </style>
35
50
  {%- endif -%}
36
51
 
@@ -1,6 +1,6 @@
1
- <!-- Style.html
1
+ {% comment %} Style.html
2
2
  _includes/style.html
3
- -->
3
+ {% endcomment %}
4
4
 
5
5
  <div class="bd-cheatsheet container-fluid">
6
6
  <section id="content">
@@ -933,7 +933,7 @@
933
933
  <li><a class="dropdown-item" href="#">Another action</a></li>
934
934
  <li><a class="dropdown-item" href="#">Something else here</a></li>
935
935
  </ul>
936
- </div><!-- /btn-group -->
936
+ </div>{% comment %} /btn-group {% endcomment %}
937
937
  <div class="btn-group">
938
938
  <button type="button" class="btn btn-secondary">Secondary</button>
939
939
  <button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -944,7 +944,7 @@
944
944
  <li><a class="dropdown-item" href="#">Another action</a></li>
945
945
  <li><a class="dropdown-item" href="#">Something else here</a></li>
946
946
  </ul>
947
- </div><!-- /btn-group -->
947
+ </div>{% comment %} /btn-group {% endcomment %}
948
948
  <div class="btn-group">
949
949
  <button type="button" class="btn btn-success">Success</button>
950
950
  <button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -955,7 +955,7 @@
955
955
  <li><a class="dropdown-item" href="#">Another action</a></li>
956
956
  <li><a class="dropdown-item" href="#">Something else here</a></li>
957
957
  </ul>
958
- </div><!-- /btn-group -->example-divider
958
+ </div>{% comment %} /btn-group {% endcomment %}example-divider
959
959
  <div class="btn-group">
960
960
  <button type="button" class="btn btn-info">Info</button>
961
961
  <button type="button" class="btn btn-info dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -966,7 +966,7 @@
966
966
  <li><a class="dropdown-item" href="#">Another action</a></li>
967
967
  <li><a class="dropdown-item" href="#">Something else here</a></li>
968
968
  </ul>
969
- </div><!-- /btn-group -->
969
+ </div>{% comment %} /btn-group {% endcomment %}
970
970
  <div class="btn-group">
971
971
  <button type="button" class="btn btn-warning">Warning</button>
972
972
  <button type="button" class="btn btn-warning dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -977,7 +977,7 @@
977
977
  <li><a class="dropdown-item" href="#">Another action</a></li>
978
978
  <li><a class="dropdown-item" href="#">Something else here</a></li>
979
979
  </ul>
980
- </div><!-- /btn-group -->
980
+ </div>{% comment %} /btn-group {% endcomment %}
981
981
  <div class="btn-group">
982
982
  <button type="button" class="btn btn-danger">Danger</button>
983
983
  <button type="button" class="btn btn-danger dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
@@ -988,7 +988,7 @@
988
988
  <li><a class="dropdown-item" href="#">Another action</a></li>
989
989
  <li><a class="dropdown-item" href="#">Something else here</a></li>
990
990
  </ul>
991
- </div><!-- /btn-group -->
991
+ </div>{% comment %} /btn-group {% endcomment %}
992
992
  </div></div>
993
993
  <div class="bd-example-snippet bd-code-snippet"><div class="bd-example">
994
994
  <div class="btn-group w-100 align-items-center justify-content-between flex-wrap">
@@ -1,4 +1,4 @@
1
- <!-- Installation method cards; uses site.resources.* and environment where helpful -->
1
+ {% comment %} Installation method cards; uses site.resources.* and environment where helpful {% endcomment %}
2
2
  <div class="row g-4 justify-content-center">
3
3
  <div class="col-12 col-sm-10 col-md-6 col-lg-4">
4
4
  <div class="card h-100 border-0 shadow-sm">
@@ -55,7 +55,7 @@ cd &lt;you&gt;.github.io
55
55
  </div>
56
56
  </div>
57
57
 
58
- <!-- Contributing guide call-to-action placed below all cards -->
58
+ {% comment %} Contributing guide call-to-action placed below all cards {% endcomment %}
59
59
  <div class="text-center mt-4">
60
60
  <a class="btn btn-outline-secondary" href="{{ site.resources.contributing | default: '' | join: '' | default: '#' }}" target="_blank" rel="noopener">
61
61
  <i class="bi bi-journal-text me-2"></i>Read the Contributing Guide
@@ -1,4 +1,4 @@
1
- <!-- Quick Links bar for landing page; uses site.resources config -->
1
+ {% comment %} Quick Links bar for landing page; uses site.resources config {% endcomment %}
2
2
  <div class="bg-dark text-white py-3">
3
3
  <div class="container-xl px-4 px-md-5">
4
4
  <div class="row g-3 justify-content-center text-center align-items-center">
@@ -1,5 +1,5 @@
1
1
  {% comment %} Feature: ZER0-050 {% endcomment %}
2
- <!--
2
+ {% comment %}
3
3
  ===================================================================
4
4
  ADMIN NAV — Data-driven sidebar navigation for admin/settings pages
5
5
  ===================================================================
@@ -15,7 +15,7 @@
15
15
  _data/navigation/admin.yml
16
16
  Used by: _layouts/admin.html
17
17
  ===================================================================
18
- -->
18
+ {% endcomment %}
19
19
 
20
20
  {% assign current_path = page.url %}
21
21
  {% assign admin_items = site.data.navigation.admin %}
@@ -1,4 +1,4 @@
1
- <!--
1
+ {% comment %}
2
2
  ===================================================================
3
3
  NAV TREE - Flat YAML Navigation Renderer
4
4
  ===================================================================
@@ -28,7 +28,7 @@
28
28
  Usage:
29
29
  include navigation/nav-tree.html nav="docs"
30
30
  ===================================================================
31
- -->
31
+ {% endcomment %}
32
32
 
33
33
  {% assign navigation = site.data.navigation[include.nav] %}
34
34
 
@@ -42,7 +42,7 @@
42
42
 
43
43
  <li class="mb-1 nav-tree-item" data-depth="0">
44
44
  {% if has_children %}
45
- <!-- Parent item with children - collapsible -->
45
+ {% comment %} Parent item with children - collapsible {% endcomment %}
46
46
  <div class="d-flex align-items-center">
47
47
  {% if item.url %}
48
48
  <a href="{{ item.url | relative_url }}"
@@ -73,7 +73,7 @@
73
73
  {% endif %}
74
74
  </div>
75
75
 
76
- <!-- Children container (Level 1) -->
76
+ {% comment %} Children container (Level 1) {% endcomment %}
77
77
  <div class="collapse{% if is_expanded %} show{% endif %}" id="{{ item_id }}">
78
78
  <ul class="list-unstyled fw-normal ps-3 nav-tree-children">
79
79
  {% for child in item.children %}
@@ -84,7 +84,7 @@
84
84
 
85
85
  <li class="mb-1 nav-tree-item" data-depth="1">
86
86
  {% if child_has_children %}
87
- <!-- Level 1 parent with children -->
87
+ {% comment %} Level 1 parent with children {% endcomment %}
88
88
  <div class="d-flex align-items-center">
89
89
  {% if child.url %}
90
90
  <a href="{{ child.url | relative_url }}"
@@ -114,7 +114,7 @@
114
114
  {% endif %}
115
115
  </div>
116
116
 
117
- <!-- Children container (Level 2) -->
117
+ {% comment %} Children container (Level 2) {% endcomment %}
118
118
  <div class="collapse{% if child_expanded %} show{% endif %}" id="{{ child_id }}">
119
119
  <ul class="list-unstyled fw-normal ps-3 nav-tree-children">
120
120
  {% for grandchild in child.children %}
@@ -137,7 +137,7 @@
137
137
  </ul>
138
138
  </div>
139
139
  {% else %}
140
- <!-- Level 1 leaf item -->
140
+ {% comment %} Level 1 leaf item {% endcomment %}
141
141
  {% if child.url %}
142
142
  <a href="{{ child.url | relative_url }}"
143
143
  class="nav-tree-link d-inline-flex align-items-center rounded py-1 px-2 text-decoration-none{% if child_active %} active{% endif %}">
@@ -156,7 +156,7 @@
156
156
  </ul>
157
157
  </div>
158
158
  {% else %}
159
- <!-- Root level leaf item -->
159
+ {% comment %} Root level leaf item {% endcomment %}
160
160
  {% if item.url %}
161
161
  <a href="{{ item.url | relative_url }}"
162
162
  class="nav-tree-link d-inline-flex align-items-center rounded py-1 px-2 text-decoration-none{% if is_active %} active{% endif %}">
@@ -1,25 +1,25 @@
1
1
  {% comment %} Features: ZER0-049, ZER0-055 {% endcomment %}
2
- <!--
2
+ {% comment %}
3
3
  file: navbar.html
4
4
  path: /includes/navbar.html
5
5
  includes:
6
6
  purpose: Offcanvas main navigation following Bootstrap 5 best practices
7
7
  with hover-activated dropdowns for desktop and accessible interactions
8
- -->
8
+ {% endcomment %}
9
9
 
10
- <!-- Navigation Links - Responsive Offcanvas (inline at lg+, offcanvas below) -->
10
+ {% comment %} Navigation Links - Responsive Offcanvas (inline at lg+, offcanvas below) {% endcomment %}
11
11
  {%- include core/i18n.html -%}
12
12
  <div class="offcanvas-lg offcanvas-end" tabindex="-1" id="bdNavbar" aria-labelledby="mainNavOffcanvasLabel">
13
13
 
14
- <!-- Main Navigation Header - Offcanvas -->
14
+ {% comment %} Main Navigation Header - Offcanvas {% endcomment %}
15
15
  <div class="offcanvas-header border-bottom">
16
16
  <h2 class="offcanvas-title h5 mb-0" id="mainNavOffcanvasLabel">{{ ui.main_nav_label | default: "Main Navigation" }}</h2>
17
17
  <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close navigation menu" data-bs-target="#bdNavbar"></button>
18
18
  </div>
19
19
 
20
- <!-- Main Navigation Body - Offcanvas -->
20
+ {% comment %} Main Navigation Body - Offcanvas {% endcomment %}
21
21
  <div class="offcanvas-body">
22
- <!-- Desktop: width is the grid middle track; labels ellipsis or icon-only via container query -->
22
+ {% comment %} Desktop: width is the grid middle track; labels ellipsis or icon-only via container query {% endcomment %}
23
23
  <div class="bd-navbar-nav-viewport">
24
24
  <ul class="navbar-nav justify-content-lg-center text-start flex-grow-1">
25
25
  <li class="nav-item d-lg-none">
@@ -44,12 +44,12 @@
44
44
 
45
45
  {%- if has_children -%}
46
46
  <li class="nav-item dropdown d-flex align-items-center nav-hover-dropdown">
47
- <!-- Parent link navigates directly -->
47
+ {% comment %} Parent link navigates directly {% endcomment %}
48
48
  <a
49
49
  class="nav-link"
50
50
  href="{{ link.url | relative_url }}"
51
51
  aria-label="{{ link.title }}"
52
- {%- if link.url == page.url -%} aria-current="page"{%- endif -%}
52
+ {% if link.url == page.url %}aria-current="page"{% endif %}
53
53
  title="{{ link.title }}"
54
54
  >
55
55
  {%- if link.icon -%}
@@ -58,11 +58,15 @@
58
58
  <span class="nav-link-text">{{ link.title }}</span>
59
59
  </a>
60
60
 
61
- <!-- Split toggle opens the dropdown (click on mobile, hover on desktop) -->
62
- <!-- Note: No data-bs-toggle="dropdown" — custom JS handles all interactions
63
- to avoid Bootstrap's native handler conflicting with our toggle logic -->
61
+ {% comment %} Split toggle opens the dropdown (click on mobile, hover on desktop) {% endcomment %}
62
+ {% comment %} Note: No data-bs-toggle="dropdown" — custom JS handles all interactions
63
+ to avoid Bootstrap's native handler conflicting with our toggle logic {% endcomment %}
64
+ {% comment %} No `ms-1`: at lg+ the chevron is absolutely positioned over the
65
+ parent link's reserved padding (_navbar.scss), so a left margin would
66
+ re-open the dead zone between label and chevron that #405 closed. Below
67
+ lg the offcanvas layout keeps them as ordinary siblings. {% endcomment %}
64
68
  <button
65
- class="nav-link dropdown-toggle dropdown-toggle-split ms-1"
69
+ class="nav-link dropdown-toggle dropdown-toggle-split"
66
70
  type="button"
67
71
  id="dropdown-{{ link.title | slugify }}"
68
72
  aria-expanded="false"
@@ -78,8 +82,7 @@
78
82
  <a
79
83
  class="dropdown-item"
80
84
  href="{{ child.url | relative_url }}"
81
-
82
- {%- if child.url == page.url -%} aria-current="page"{%- endif -%}
85
+ {% if child.url == page.url %}aria-current="page"{% endif %}
83
86
  >
84
87
  {%- if child.icon -%}
85
88
  <i class="{{site.default_icon}} {{ child.icon }} me-2" aria-hidden="true"></i>
@@ -96,7 +99,7 @@
96
99
  class="nav-link"
97
100
  href="{{ link.url | relative_url }}"
98
101
  aria-label="{{ link.title }}"
99
- {%- if link.url == page.url -%} aria-current="page"{%- endif -%}
102
+ {% if link.url == page.url %}aria-current="page"{% endif %}
100
103
  title="{{ link.title }}"
101
104
  >
102
105
  {%- if link.icon -%}
@@ -125,7 +128,7 @@
125
128
  href="{{ col_url | relative_url }}"
126
129
  aria-label="{{ col_title }}"
127
130
  title="{{ col_title }}"
128
- {%- if page.collection == collection.label -%} aria-current="page"{%- endif -%}
131
+ {% if page.collection == collection.label %}aria-current="page"{% endif %}
129
132
  >
130
133
  <span class="nav-link-text">{{ col_title }}</span>
131
134
  </a>
@@ -165,8 +168,8 @@
165
168
  </div>
166
169
  </div>
167
170
 
168
- <!--
171
+ {% comment %}
169
172
  Navigation styles are now in _sass/core/_navbar.scss
170
173
  Navigation scripts are now in assets/js/navigation.js
171
174
  These are loaded automatically via the theme's asset pipeline
172
- -->
175
+ {% endcomment %}
@@ -1,4 +1,4 @@
1
- <!--
1
+ {% comment %}
2
2
  ===================================================================
3
3
  SECTION SIDEBAR - Fixed Topic Navigation
4
4
  ===================================================================
@@ -28,7 +28,7 @@
28
28
  - Bootstrap 5 offcanvas component
29
29
  - Bootstrap Icons
30
30
  ===================================================================
31
- -->
31
+ {% endcomment %}
32
32
 
33
33
  {% assign sidebar_id = include.sidebar_id | default: "sectionSidebar" %}
34
34
  {% assign section_posts = include.section_posts %}
@@ -71,13 +71,13 @@
71
71
  {% endfor %}
72
72
  {% endif %}
73
73
 
74
- <!-- ================================ -->
75
- <!-- DESKTOP SIDEBAR (Fixed Sticky) -->
76
- <!-- ================================ -->
74
+ {% comment %} ================================ {% endcomment %}
75
+ {% comment %} DESKTOP SIDEBAR (Fixed Sticky) {% endcomment %}
76
+ {% comment %} ================================ {% endcomment %}
77
77
  <aside class="section-sidebar-desktop d-none d-lg-block w-100">
78
78
  <div class="position-sticky" style="top: 80px;">
79
79
 
80
- <!-- Topics Card -->
80
+ {% comment %} Topics Card {% endcomment %}
81
81
  <div class="card border-0 shadow-sm">
82
82
  <div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
83
83
  <h5 class="mb-0">
@@ -134,7 +134,7 @@
134
134
  {% endif %}
135
135
  </div>
136
136
 
137
- <!-- Section Stats -->
137
+ {% comment %} Section Stats {% endcomment %}
138
138
  <div class="card border-0 shadow-sm mt-3">
139
139
  <div class="card-body">
140
140
  <h6 class="text-muted mb-3">
@@ -158,9 +158,9 @@
158
158
  </div>
159
159
  </aside>
160
160
 
161
- <!-- ================================ -->
162
- <!-- MOBILE OFFCANVAS SIDEBAR -->
163
- <!-- ================================ -->
161
+ {% comment %} ================================ {% endcomment %}
162
+ {% comment %} MOBILE OFFCANVAS SIDEBAR {% endcomment %}
163
+ {% comment %} ================================ {% endcomment %}
164
164
  <div class="offcanvas offcanvas-start" tabindex="-1" id="{{ sidebar_id }}" aria-labelledby="{{ sidebar_id }}Label">
165
165
  <div class="offcanvas-header bg-primary text-white">
166
166
  <h2 class="offcanvas-title h5" id="{{ sidebar_id }}Label">
@@ -208,9 +208,9 @@
208
208
  </div>
209
209
  </div>
210
210
 
211
- <!-- ================================ -->
212
- <!-- SIDEBAR STYLES -->
213
- <!-- ================================ -->
211
+ {% comment %} ================================ {% endcomment %}
212
+ {% comment %} SIDEBAR STYLES {% endcomment %}
213
+ {% comment %} ================================ {% endcomment %}
214
214
  <style>
215
215
  /* Sidebar Navigation */
216
216
  .sidebar-nav .nav-link {
@@ -258,9 +258,9 @@
258
258
  }
259
259
  </style>
260
260
 
261
- <!-- ================================ -->
262
- <!-- SIDEBAR JAVASCRIPT -->
263
- <!-- ================================ -->
261
+ {% comment %} ================================ {% endcomment %}
262
+ {% comment %} SIDEBAR JAVASCRIPT {% endcomment %}
263
+ {% comment %} ================================ {% endcomment %}
264
264
  <script>
265
265
  (function() {
266
266
  // Smooth scroll for sidebar links