jekyll-theme-zer0 1.28.0 → 1.30.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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1143 -13
  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 +507 -2
  7. data/_data/consumers.yml +157 -9
  8. data/_data/features.yml +303 -20
  9. data/_data/feedback_types.yml +17 -12
  10. data/_data/i18n/fr.yml +12 -7
  11. data/_data/i18n/manifest.yml +39 -12
  12. data/_data/ingredient_densities.yml +122 -0
  13. data/_data/landing.yml +5 -2
  14. data/_data/navigation/main.yml +16 -0
  15. data/_data/navigation/quickstart.yml +4 -0
  16. data/_data/recipe_courses.yml +64 -0
  17. data/_data/site_builder.yml +874 -0
  18. data/_data/theme-manifest.yml +160 -124
  19. data/_data/ui-text.yml +26 -0
  20. data/_includes/README.md +26 -2
  21. data/_includes/analytics/posthog.html +2 -2
  22. data/_includes/components/admin-links.html +2 -2
  23. data/_includes/components/admin-tabs.html +2 -2
  24. data/_includes/components/ai-chat.html +14 -11
  25. data/_includes/components/analytics-dashboard.html +8 -8
  26. data/_includes/components/author-bio.html +1 -1
  27. data/_includes/components/author-card.html +10 -2
  28. data/_includes/components/author-eeat.html +4 -4
  29. data/_includes/components/background-customizer.html +10 -10
  30. data/_includes/components/background-image.html +114 -0
  31. data/_includes/components/background-settings.html +28 -15
  32. data/_includes/components/collection-manager.html +5 -5
  33. data/_includes/components/component-showcase.html +13 -13
  34. data/_includes/components/config-editor.html +12 -12
  35. data/_includes/components/config-viewer.html +8 -8
  36. data/_includes/components/cookie-consent.html +15 -15
  37. data/_includes/components/cta-button.html +7 -2
  38. data/_includes/components/dev-shortcuts.html +7 -7
  39. data/_includes/components/env-dashboard.html +8 -8
  40. data/_includes/components/env-switcher.html +9 -9
  41. data/_includes/components/feature-card.html +2 -2
  42. data/_includes/components/halfmoon.html +2 -2
  43. data/_includes/components/info-section.html +42 -37
  44. data/_includes/components/js-cdn.html +15 -15
  45. data/_includes/components/language-toggle.html +168 -21
  46. data/_includes/components/mermaid.html +72 -435
  47. data/_includes/components/nanobar.html +5 -5
  48. data/_includes/components/nav-editor.html +2 -2
  49. data/_includes/components/nav-export.html +2 -2
  50. data/_includes/components/nav-overview.html +2 -2
  51. data/_includes/components/page-feedback.html +45 -30
  52. data/_includes/components/page-views-init.html +55 -0
  53. data/_includes/components/page-views.html +33 -0
  54. data/_includes/components/post-card.html +22 -22
  55. data/_includes/components/post-type-badge.html +2 -2
  56. data/_includes/components/powered-by.html +2 -2
  57. data/_includes/components/preview-image.html +6 -0
  58. data/_includes/components/quick-index.html +2 -2
  59. data/_includes/components/recipe-card.html +67 -0
  60. data/_includes/components/recipe-duration.html +50 -0
  61. data/_includes/components/recipe-grams.html +58 -0
  62. data/_includes/components/recipe-index.html +96 -0
  63. data/_includes/components/recipe-ingredients.html +90 -0
  64. data/_includes/components/recipe-meta.html +96 -0
  65. data/_includes/components/recipe-nutrition.html +57 -0
  66. data/_includes/components/recipe-qty.html +73 -0
  67. data/_includes/components/recipe-ratio.html +151 -0
  68. data/_includes/components/recipe-scaler.html +73 -0
  69. data/_includes/components/recipe-steps.html +86 -0
  70. data/_includes/components/recipe-temp.html +45 -0
  71. data/_includes/components/search-modal.html +29 -4
  72. data/_includes/components/searchbar.html +2 -2
  73. data/_includes/components/shortcuts-modal.html +3 -0
  74. data/_includes/components/svg-background.html +2 -2
  75. data/_includes/components/theme-customizer.html +2 -2
  76. data/_includes/components/theme-info.html +14 -7
  77. data/_includes/components/theme-preview-gallery.html +22 -22
  78. data/_includes/content/giscus.html +2 -2
  79. data/_includes/content/intro.html +8 -8
  80. data/_includes/content/jsonld-faq.html +2 -2
  81. data/_includes/content/jsonld-software.html +24 -5
  82. data/_includes/content/seo.html +4 -4
  83. data/_includes/content/sitemap.html +27 -27
  84. data/_includes/content/toc.html +183 -183
  85. data/_includes/core/branding.html +6 -6
  86. data/_includes/core/console-capture.html +32 -74
  87. data/_includes/core/favicon.html +49 -7
  88. data/_includes/core/footer-fabs.html +17 -3
  89. data/_includes/core/footer.html +49 -34
  90. data/_includes/core/head.html +110 -86
  91. data/_includes/core/header.html +76 -54
  92. data/_includes/docs/bootstrap-docs.html +8 -8
  93. data/_includes/landing/landing-install-cards.html +2 -2
  94. data/_includes/landing/landing-quick-links.html +1 -1
  95. data/_includes/navigation/admin-nav.html +2 -2
  96. data/_includes/navigation/nav-tree.html +8 -8
  97. data/_includes/navigation/navbar.html +12 -12
  98. data/_includes/navigation/section-sidebar.html +109 -27
  99. data/_includes/navigation/sidebar-config.html +36 -2
  100. data/_includes/navigation/sidebar-left.html +17 -16
  101. data/_includes/navigation/sidebar-right.html +8 -7
  102. data/_includes/obsidian/full-graph.html +2 -2
  103. data/_includes/setup/claude-session.html +72 -0
  104. data/_includes/setup/prereq-checklist.html +90 -0
  105. data/_includes/setup/wizard.html +924 -222
  106. data/_includes/stats/stats-categories.html +8 -8
  107. data/_includes/stats/stats-header.html +14 -14
  108. data/_includes/stats/stats-metrics.html +14 -14
  109. data/_includes/stats/stats-no-data.html +12 -12
  110. data/_includes/stats/stats-overview.html +6 -6
  111. data/_includes/stats/stats-tags.html +8 -8
  112. data/_layouts/404.html +38 -24
  113. data/_layouts/README.md +2 -0
  114. data/_layouts/admin.html +24 -24
  115. data/_layouts/article.html +43 -33
  116. data/_layouts/author.html +20 -20
  117. data/_layouts/authors.html +2 -2
  118. data/_layouts/book-abc.html +12 -12
  119. data/_layouts/book-story.html +15 -15
  120. data/_layouts/book.html +12 -12
  121. data/_layouts/collection.html +33 -33
  122. data/_layouts/cookbook.html +88 -0
  123. data/_layouts/default.html +31 -28
  124. data/_layouts/home.html +23 -23
  125. data/_layouts/index.html +10 -10
  126. data/_layouts/landing.html +17 -17
  127. data/_layouts/news.html +44 -44
  128. data/_layouts/note.html +38 -38
  129. data/_layouts/notebook.html +34 -34
  130. data/_layouts/recipe.html +274 -0
  131. data/_layouts/root.html +92 -55
  132. data/_layouts/section.html +62 -33
  133. data/_layouts/setup.html +3 -3
  134. data/_layouts/sitemap-collection.html +49 -49
  135. data/_layouts/stats.html +40 -40
  136. data/_layouts/tag.html +12 -12
  137. data/_layouts/welcome.html +21 -21
  138. data/_sass/components/_callout.scss +1 -1
  139. data/_sass/components/_footer.scss +37 -1
  140. data/_sass/components/_mermaid.scss +375 -0
  141. data/_sass/components/_page-views.scss +36 -0
  142. data/_sass/components/_recipe.scss +506 -0
  143. data/_sass/components/_setup-wizard.scss +764 -0
  144. data/_sass/components/_ui-enhancements.scss +6 -6
  145. data/_sass/core/_navbar.scss +261 -46
  146. data/_sass/layouts/_landing.scss +2 -2
  147. data/_sass/layouts/_navbar-extras.scss +14 -4
  148. data/_sass/tokens/_color.scss +6 -0
  149. data/_sass/tokens/_index.scss +2 -0
  150. data/_sass/tokens/_radius.scss +21 -0
  151. data/_sass/tokens/_typography.scss +4 -0
  152. data/_sass/utilities/_focus.scss +14 -0
  153. data/assets/css/main.scss +4 -0
  154. data/assets/js/ai-chat.js +47 -5
  155. data/assets/js/fleet-feedback-capture.js +124 -0
  156. data/assets/js/fleet-feedback.js +853 -0
  157. data/assets/js/mermaid-diagrams.js +1267 -0
  158. data/assets/js/modules/navigation/config.js +9 -6
  159. data/assets/js/modules/navigation/navbar.js +55 -0
  160. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  161. data/assets/js/modules/theme/appearance.js +8 -2
  162. data/assets/js/obsidian-wiki-links.js +8 -3
  163. data/assets/js/page-feedback.js +125 -192
  164. data/assets/js/page-views.js +372 -0
  165. data/assets/js/recipe-scaler.js +501 -0
  166. data/assets/js/search-modal.js +36 -0
  167. data/assets/js/setup-wizard.js +2279 -226
  168. data/assets/js/site-builder.js +1834 -0
  169. data/assets/js/ui-enhancements.js +11 -3
  170. data/scripts/README.md +44 -0
  171. data/scripts/ai/README.md +38 -0
  172. data/scripts/ai/api_call.rb +124 -0
  173. data/scripts/ai/usage.rb +314 -0
  174. data/scripts/ai/usage_report.rb +225 -0
  175. data/scripts/bin/audit-consumer +39 -7
  176. data/scripts/bin/giscus-discussions +213 -14
  177. data/scripts/bin/manifest +35 -12
  178. data/scripts/ci/agent_review_result.py +164 -0
  179. data/scripts/ci/test_agent_review_result.py +172 -0
  180. data/scripts/ci/test_visual_evidence_autogen.py +341 -0
  181. data/scripts/ci/visual_evidence_autogen.py +1060 -0
  182. data/scripts/content-review.rb +20 -1
  183. data/scripts/design-system-check.rb +170 -0
  184. data/scripts/lib/audit.sh +42 -2
  185. data/scripts/lint-liquid-raw.rb +137 -0
  186. data/scripts/test/integration/mermaid +22 -8
  187. data/scripts/test/lib/run_tests.sh +3 -1
  188. data/scripts/test/lib/test_agent_review_result.sh +27 -0
  189. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  190. data/scripts/translate.rb +94 -16
  191. metadata +48 -2
@@ -1,8 +1,8 @@
1
1
  {% comment %} Feature: ZER0-043 {% endcomment %}
2
- <!-- ================================================ -->
3
- <!-- CATEGORIES ANALYSIS SECTION -->
4
- <!-- Top categories with post counts -->
5
- <!-- ================================================ -->
2
+ {% comment %} ================================================ {% endcomment %}
3
+ {% comment %} CATEGORIES ANALYSIS SECTION {% endcomment %}
4
+ {% comment %} Top categories with post counts {% endcomment %}
5
+ {% comment %} ================================================ {% endcomment %}
6
6
  <div id="categories" class="card shadow-sm h-100">
7
7
  <div class="card-header bg-primary-subtle">
8
8
  <div class="d-flex align-items-center justify-content-between">
@@ -18,7 +18,7 @@
18
18
  <div class="card-body p-0">
19
19
  {% if site.data.content_statistics.categories and site.data.content_statistics.categories.size > 0 %}
20
20
 
21
- <!-- Categories List -->
21
+ {% comment %} Categories List {% endcomment %}
22
22
  <div class="list-group list-group-flush stats-taxonomy-list">
23
23
  {% for category in site.data.content_statistics.categories %}
24
24
  <div class="list-group-item d-flex justify-content-between align-items-center{% if forloop.index > 15 %} d-none stats-category-extra{% endif %}">
@@ -50,7 +50,7 @@
50
50
  {% endfor %}
51
51
  </div>
52
52
 
53
- <!-- Show More Button if there are more categories -->
53
+ {% comment %} Show More Button if there are more categories {% endcomment %}
54
54
  {% if site.data.content_statistics.categories.size > 15 %}
55
55
  <div class="card-footer text-center">
56
56
  <button class="btn btn-outline-primary btn-sm"
@@ -67,7 +67,7 @@
67
67
 
68
68
  {% else %}
69
69
 
70
- <!-- No Categories Available -->
70
+ {% comment %} No Categories Available {% endcomment %}
71
71
  <div class="text-center py-5">
72
72
  <i class="bi bi-folder-x display-4 text-muted mb-3"></i>
73
73
  <h5 class="text-muted">No categories found</h5>
@@ -77,7 +77,7 @@
77
77
  {% endif %}
78
78
  </div>
79
79
 
80
- <!-- Categories Summary Footer -->
80
+ {% comment %} Categories Summary Footer {% endcomment %}
81
81
  {% if site.data.content_statistics.categories and site.data.content_statistics.categories.size > 0 %}
82
82
  <div class="card-footer">
83
83
  <div class="row text-center">
@@ -1,28 +1,28 @@
1
1
  {% comment %} Feature: ZER0-043 {% endcomment %}
2
- <!-- ================================================ -->
3
- <!-- STATS PAGE HEADER -->
4
- <!-- Title, description, and metadata display -->
5
- <!-- ================================================ -->
2
+ {% comment %} ================================================ {% endcomment %}
3
+ {% comment %} STATS PAGE HEADER {% endcomment %}
4
+ {% comment %} Title, description, and metadata display {% endcomment %}
5
+ {% comment %} ================================================ {% endcomment %}
6
6
  <div class="row mb-5">
7
7
  <div class="col-12">
8
8
  <div class="text-center mb-4">
9
- <!-- Header Icon with Bootstrap classes -->
9
+ {% comment %} Header Icon with Bootstrap classes {% endcomment %}
10
10
  <div class="d-inline-flex align-items-center justify-content-center bg-primary-subtle rounded-circle p-4 mb-4 shadow-lg stats-header-icon">
11
11
  <i class="bi bi-graph-up fs-1 text-primary stats-icon-rotate"></i>
12
12
  </div>
13
13
 
14
- <!-- Title with Bootstrap typography -->
14
+ {% comment %} Title with Bootstrap typography {% endcomment %}
15
15
  <h1 class="display-3 mb-3 fw-bold text-primary">
16
16
  {{ page.title | default: "Site Statistics Portal" }}
17
17
  </h1>
18
18
 
19
- <!-- Description with Bootstrap lead class -->
19
+ {% comment %} Description with Bootstrap lead class {% endcomment %}
20
20
  <p class="lead mb-4 fs-4">
21
21
  {{ page.description | default: "Comprehensive analytics and insights from the knowledge base" }}
22
22
  </p>
23
23
  </div>
24
24
 
25
- <!-- Last updated reflects build-time stats (generated_at or site.time) -->
25
+ {% comment %} Last updated reflects build-time stats (generated_at or site.time) {% endcomment %}
26
26
  {% if site.data.content_statistics %}
27
27
  {% assign stats_last_updated = site.data.content_statistics.generated_at | default: site.time %}
28
28
  <div class="alert alert-info shadow-sm d-flex align-items-center justify-content-between" role="alert">
@@ -59,13 +59,13 @@
59
59
  </div>
60
60
  </div>
61
61
 
62
- <!-- ================================================ -->
63
- <!-- STATS NAVIGATION BREADCRUMBS -->
64
- <!-- Quick navigation within the stats page -->
65
- <!-- ================================================ -->
62
+ {% comment %} ================================================ {% endcomment %}
63
+ {% comment %} STATS NAVIGATION BREADCRUMBS {% endcomment %}
64
+ {% comment %} Quick navigation within the stats page {% endcomment %}
65
+ {% comment %} ================================================ {% endcomment %}
66
66
  <div class="row mb-5">
67
67
  <div class="col-12">
68
- <!-- Bootstrap breadcrumb -->
68
+ {% comment %} Bootstrap breadcrumb {% endcomment %}
69
69
  <nav aria-label="Statistics navigation">
70
70
  <ol class="breadcrumb p-3 rounded shadow-sm">
71
71
  <li class="breadcrumb-item">
@@ -79,7 +79,7 @@
79
79
  </ol>
80
80
  </nav>
81
81
 
82
- <!-- Quick Jump Navigation using Bootstrap button group -->
82
+ {% comment %} Quick Jump Navigation using Bootstrap button group {% endcomment %}
83
83
  {% if site.data.content_statistics %}
84
84
  <div class="text-center">
85
85
  <div class="btn-group btn-group-lg shadow-sm d-flex flex-wrap gap-2" role="group" aria-label="Statistics navigation">
@@ -11,7 +11,7 @@
11
11
  <div class="card-body">
12
12
  <div class="row g-4">
13
13
 
14
- <!-- Content Overview Column -->
14
+ {% comment %} Content Overview Column {% endcomment %}
15
15
  <div class="col-md-4">
16
16
  <div class="h-100 p-3 bg-body-secondary rounded">
17
17
  <h5 class="text-primary mb-3">
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  </div>
44
44
 
45
- <!-- Top Performers Column -->
45
+ {% comment %} Top Performers Column {% endcomment %}
46
46
  <div class="col-md-4">
47
47
  <div class="h-100 p-3 bg-body-secondary rounded">
48
48
  <h5 class="text-success mb-3">
@@ -67,7 +67,7 @@
67
67
  </div>
68
68
  {% endif %}
69
69
 
70
- <!-- Content Distribution -->
70
+ {% comment %} Content Distribution {% endcomment %}
71
71
  <div class="mb-3">
72
72
  <strong>Content Distribution:</strong><br>
73
73
  {% if site.data.content_statistics.categories and site.data.content_statistics.categories.size > 0 %}
@@ -92,14 +92,14 @@
92
92
  </div>
93
93
  </div>
94
94
 
95
- <!-- Data Health Column -->
95
+ {% comment %} Data Health Column {% endcomment %}
96
96
  <div class="col-md-4">
97
97
  <div class="h-100 p-3 bg-body-secondary rounded">
98
98
  <h5 class="text-warning-emphasis mb-3">
99
99
  <i class="bi bi-heart-pulse me-2"></i> Data Health
100
100
  </h5>
101
101
 
102
- <!-- Last Update Status -->
102
+ {% comment %} Last Update Status {% endcomment %}
103
103
  <div class="mb-3">
104
104
  <strong>Last Updated:</strong><br>
105
105
  {% if site.data.content_statistics.generated_at %}
@@ -111,7 +111,7 @@
111
111
  {% endif %}
112
112
  </div>
113
113
 
114
- <!-- Data Completeness -->
114
+ {% comment %} Data Completeness {% endcomment %}
115
115
  <div class="mb-3">
116
116
  <strong>Data Completeness:</strong><br>
117
117
  {% assign completeness_score = 0 %}
@@ -146,7 +146,7 @@
146
146
  <small class="text-muted">Overall data quality</small>
147
147
  </div>
148
148
 
149
- <!-- Refresh Instructions -->
149
+ {% comment %} Refresh Instructions {% endcomment %}
150
150
  {% unless site.data.content_statistics %}
151
151
  <div class="alert alert-warning alert-sm p-2" role="alert">
152
152
  <small>
@@ -161,7 +161,7 @@
161
161
  </div>
162
162
  </div>
163
163
 
164
- <!-- Action Buttons Footer -->
164
+ {% comment %} Action Buttons Footer {% endcomment %}
165
165
  <div class="card-footer text-center">
166
166
  <div class="btn-group" role="group">
167
167
  <button type="button" class="btn btn-outline-primary" onclick="window.print()">
@@ -179,17 +179,17 @@
179
179
  </div>
180
180
  </div>
181
181
 
182
- <!-- ================================================ -->
183
- <!-- HELP MODAL -->
184
- <!-- Information about statistics and data sources -->
185
- <!-- ================================================ -->
182
+ {% comment %} ================================================ {% endcomment %}
183
+ {% comment %} HELP MODAL {% endcomment %}
184
+ {% comment %} Information about statistics and data sources {% endcomment %}
185
+ {% comment %} ================================================ {% endcomment %}
186
186
  <div class="modal fade" id="helpModal" tabindex="-1" aria-labelledby="helpModalLabel" aria-hidden="true">
187
187
  <div class="modal-dialog">
188
188
  <div class="modal-content">
189
189
  <div class="modal-header bg-body border-bottom">
190
- <h5 class="modal-title" id="helpModalLabel">
190
+ <h2 class="modal-title h5" id="helpModalLabel">
191
191
  <i class="bi bi-question-circle"></i> Statistics Help
192
- </h5>
192
+ </h2>
193
193
  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
194
194
  </div>
195
195
  <div class="modal-body">
@@ -1,11 +1,11 @@
1
- <!-- ================================================ -->
2
- <!-- NO DATA AVAILABLE SECTION -->
3
- <!-- Error state when statistics are not generated -->
4
- <!-- ================================================ -->
1
+ {% comment %} ================================================ {% endcomment %}
2
+ {% comment %} NO DATA AVAILABLE SECTION {% endcomment %}
3
+ {% comment %} Error state when statistics are not generated {% endcomment %}
4
+ {% comment %} ================================================ {% endcomment %}
5
5
  <div class="row justify-content-center">
6
6
  <div class="col-lg-8">
7
7
 
8
- <!-- Main Alert -->
8
+ {% comment %} Main Alert {% endcomment %}
9
9
  <div class="alert alert-warning shadow-sm" role="alert">
10
10
  <div class="text-center py-4">
11
11
  <i class="bi bi-exclamation-triangle display-1 text-warning-emphasis mb-4"></i>
@@ -16,7 +16,7 @@
16
16
  </div>
17
17
  </div>
18
18
 
19
- <!-- Instructions Card -->
19
+ {% comment %} Instructions Card {% endcomment %}
20
20
  <div class="card shadow-sm mb-4">
21
21
  <div class="card-header bg-primary-subtle">
22
22
  <h4 class="mb-0 text-primary-emphasis">
@@ -56,7 +56,7 @@
56
56
  </div>
57
57
  </div>
58
58
 
59
- <!-- Alternative Setup Information -->
59
+ {% comment %} Alternative Setup Information {% endcomment %}
60
60
  <div class="card shadow-sm mb-4">
61
61
  <div class="card-header bg-info-subtle">
62
62
  <h4 class="mb-0 text-info-emphasis">
@@ -90,7 +90,7 @@
90
90
  </div>
91
91
  </div>
92
92
 
93
- <!-- Troubleshooting -->
93
+ {% comment %} Troubleshooting {% endcomment %}
94
94
  <div class="card shadow-sm">
95
95
  <div class="card-header bg-secondary-subtle">
96
96
  <h4 class="mb-0 text-secondary-emphasis">
@@ -136,10 +136,10 @@
136
136
  </div>
137
137
  </div>
138
138
 
139
- <!-- ================================================ -->
140
- <!-- NO DATA PAGE ACTIONS -->
141
- <!-- Additional helpful actions -->
142
- <!-- ================================================ -->
139
+ {% comment %} ================================================ {% endcomment %}
140
+ {% comment %} NO DATA PAGE ACTIONS {% endcomment %}
141
+ {% comment %} Additional helpful actions {% endcomment %}
142
+ {% comment %} ================================================ {% endcomment %}
143
143
  <div class="row justify-content-center mt-4">
144
144
  <div class="col-lg-8">
145
145
  <div class="text-center">
@@ -1,6 +1,6 @@
1
1
  {% comment %} Feature: ZER0-043 {% endcomment %}
2
2
  <div id="overview" class="mb-5">
3
- <!-- Section Header -->
3
+ {% comment %} Section Header {% endcomment %}
4
4
  <div class="text-center mb-4">
5
5
  <h2 class="display-5 fw-bold text-primary mb-3">
6
6
  <i class="bi bi-speedometer2 me-2"></i>
@@ -11,10 +11,10 @@
11
11
  </p>
12
12
  </div>
13
13
 
14
- <!-- Stats Cards Grid -->
14
+ {% comment %} Stats Cards Grid {% endcomment %}
15
15
  <div class="row g-4">
16
16
 
17
- <!-- Total Posts Card -->
17
+ {% comment %} Total Posts Card {% endcomment %}
18
18
  <div class="col-lg-3 col-md-6">
19
19
  <div class="card h-100 shadow-sm stats-card">
20
20
  <div class="card-body text-center p-4">
@@ -33,7 +33,7 @@
33
33
  </div>
34
34
  </div>
35
35
 
36
- <!-- Total Categories Card -->
36
+ {% comment %} Total Categories Card {% endcomment %}
37
37
  <div class="col-lg-3 col-md-6">
38
38
  <div class="card h-100 shadow-sm stats-card">
39
39
  <div class="card-body text-center p-4">
@@ -52,7 +52,7 @@
52
52
  </div>
53
53
  </div>
54
54
 
55
- <!-- Total Tags Card -->
55
+ {% comment %} Total Tags Card {% endcomment %}
56
56
  <div class="col-lg-3 col-md-6">
57
57
  <div class="card h-100 shadow-sm stats-card">
58
58
  <div class="card-body text-center p-4">
@@ -71,7 +71,7 @@
71
71
  </div>
72
72
  </div>
73
73
 
74
- <!-- Total Words Card -->
74
+ {% comment %} Total Words Card {% endcomment %}
75
75
  <div class="col-lg-3 col-md-6">
76
76
  <div class="card h-100 shadow-sm stats-card">
77
77
  <div class="card-body text-center p-4">
@@ -1,8 +1,8 @@
1
1
  {% comment %} Feature: ZER0-043 {% endcomment %}
2
- <!-- ================================================ -->
3
- <!-- TAGS ANALYSIS SECTION -->
4
- <!-- Top tags with usage counts -->
5
- <!-- ================================================ -->
2
+ {% comment %} ================================================ {% endcomment %}
3
+ {% comment %} TAGS ANALYSIS SECTION {% endcomment %}
4
+ {% comment %} Top tags with usage counts {% endcomment %}
5
+ {% comment %} ================================================ {% endcomment %}
6
6
  <div id="tags" class="card shadow-sm h-100">
7
7
  <div class="card-header bg-success-subtle">
8
8
  <div class="d-flex align-items-center justify-content-between">
@@ -18,7 +18,7 @@
18
18
  <div class="card-body p-0">
19
19
  {% if site.data.content_statistics.tags and site.data.content_statistics.tags.size > 0 %}
20
20
 
21
- <!-- Tags List -->
21
+ {% comment %} Tags List {% endcomment %}
22
22
  <div class="list-group list-group-flush stats-taxonomy-list">
23
23
  {% for tag in site.data.content_statistics.tags %}
24
24
  <div class="list-group-item d-flex justify-content-between align-items-center{% if forloop.index > 15 %} d-none stats-tag-extra{% endif %}">
@@ -66,7 +66,7 @@
66
66
  {% endunless %}
67
67
  {% endif %}
68
68
 
69
- <!-- Tag Cloud Section -->
69
+ {% comment %} Tag Cloud Section {% endcomment %}
70
70
  <div class="card-footer">
71
71
  <h6 class="mb-3 fw-bold">
72
72
  <i class="bi bi-cloud"></i> Tag Cloud
@@ -100,7 +100,7 @@
100
100
 
101
101
  {% else %}
102
102
 
103
- <!-- No Tags Available -->
103
+ {% comment %} No Tags Available {% endcomment %}
104
104
  <div class="text-center py-5">
105
105
  <i class="bi bi-tags-fill display-4 text-muted mb-3"></i>
106
106
  <h5 class="text-muted">No tags found</h5>
@@ -110,7 +110,7 @@
110
110
  {% endif %}
111
111
  </div>
112
112
 
113
- <!-- Tags Summary Footer -->
113
+ {% comment %} Tags Summary Footer {% endcomment %}
114
114
  {% if site.data.content_statistics.tags and site.data.content_statistics.tags.size > 0 %}
115
115
  <div class="card-footer">
116
116
  <div class="row text-center">
data/_layouts/404.html CHANGED
@@ -2,7 +2,7 @@
2
2
  # Feature: ZER0-047
3
3
  layout: root
4
4
  ---
5
- <!--
5
+ {% comment %}
6
6
  ===================================================================
7
7
  404 LAYOUT - Not-found page with unconfigured-site setup mode
8
8
  ===================================================================
@@ -30,14 +30,14 @@ layout: root
30
30
  Extra content: anything in the stub page's body renders below the
31
31
  standard 404 content ({{ content }} at the bottom).
32
32
  ===================================================================
33
- -->
33
+ {% endcomment %}
34
34
 
35
35
  {% include components/setup-check.html %}
36
36
 
37
37
  {% if site_needs_setup %}
38
- <!-- ================================================================== -->
39
- <!-- SETUP MODE: Site is not yet configured — guide the user -->
40
- <!-- ================================================================== -->
38
+ {% comment %} ================================================================== {% endcomment %}
39
+ {% comment %} SETUP MODE: Site is not yet configured — guide the user {% endcomment %}
40
+ {% comment %} ================================================================== {% endcomment %}
41
41
  <div class="container-lg py-5">
42
42
  <div class="text-center mb-5">
43
43
  <i class="bi bi-gear-wide-connected display-1 text-primary"></i>
@@ -48,7 +48,7 @@ layout: root
48
48
  </p>
49
49
  </div>
50
50
 
51
- <!-- Quick-detect: user site vs project site -->
51
+ {% comment %} Quick-detect: user site vs project site {% endcomment %}
52
52
  <div class="row justify-content-center mb-4">
53
53
  <div class="col-lg-8">
54
54
  <div class="alert alert-info d-flex align-items-start" role="alert">
@@ -69,7 +69,7 @@ layout: root
69
69
  </div>
70
70
  </div>
71
71
 
72
- <!-- Step-by-step setup instructions -->
72
+ {% comment %} Step-by-step setup instructions {% endcomment %}
73
73
  <div class="row justify-content-center">
74
74
  <div class="col-lg-8">
75
75
 
@@ -170,7 +170,7 @@ git push origin main</code></pre>
170
170
  </div>
171
171
  </div>
172
172
 
173
- <!-- Resources -->
173
+ {% comment %} Resources {% endcomment %}
174
174
  <div class="text-center mt-4">
175
175
  <a href="https://github.com/bamr87/zer0-mistakes" class="btn btn-dark me-2" target="_blank" rel="noopener">
176
176
  <i class="bi bi-github me-1"></i> Theme Repository
@@ -188,9 +188,9 @@ git push origin main</code></pre>
188
188
  </div>
189
189
 
190
190
  {% else %}
191
- <!-- ================================================================== -->
192
- <!-- NORMAL 404: Site is configured — show standard error page -->
193
- <!-- ================================================================== -->
191
+ {% comment %} ================================================================== {% endcomment %}
192
+ {% comment %} NORMAL 404: Site is configured — show standard error page {% endcomment %}
193
+ {% comment %} ================================================================== {% endcomment %}
194
194
  <div class="container text-center mt-5">
195
195
  <h1 class="display-1 text-danger">404</h1>
196
196
 
@@ -227,33 +227,47 @@ git push origin main</code></pre>
227
227
  </div>
228
228
 
229
229
  <a class="btn btn-danger mt-4" href="{{ '/' | relative_url }}">Return to Homepage</a>
230
- {% if site.github_user and site.repository_name %}
230
+ {%- comment -%}
231
+ Report the dead URL through the page-feedback widget rather than through a
232
+ third hand-rolled issue-URL builder. This page used to encode its own
233
+ title and body — a two-line report with no page context, no environment,
234
+ and no captured errors — which is exactly the report a maintainer cannot
235
+ act on. Pre-typed `fix-page`; the missing URL rides in as `extra`, and the
236
+ widget attaches the rest (UPS-FB-09).
237
+
238
+ Still a real link, so it works with the widget disabled or JavaScript off:
239
+ page-feedback.js intercepts [data-pf-open] only when it is running.
240
+ {%- endcomment -%}
241
+ {% assign _404_repo = site.repository | default: site.github_user | append: '/' | append: site.repository_name %}
242
+ {% if site.page_feedback.enabled and _404_repo != '/' %}
231
243
  <div class="mt-3">
232
- {% capture _issue_title %}404 Error{% endcapture %}
233
- {% capture _issue_body %}I encountered a 404 error on this site. Please investigate.{% endcapture %}
234
244
  <a id="github-issue-link"
235
245
  class="btn btn-secondary"
236
- href="https://github.com/{{ site.github_user }}/{{ site.repository_name }}/issues/new?title={{ _issue_title | uri_escape }}&body={{ _issue_body | uri_escape }}"
246
+ href="https://github.com/{{ _404_repo }}/issues/new?template=page_improvement.yml&labels=page-feedback"
247
+ data-pf-open
248
+ data-pf-type="fix-page"
237
249
  target="_blank"
238
250
  rel="noopener noreferrer">
239
- Submit an Issue on GitHub
251
+ Report this broken link
240
252
  </a>
241
253
  </div>
242
254
  <script>
243
- document.addEventListener('DOMContentLoaded', function() {
244
- var githubIssueLink = document.getElementById('github-issue-link');
245
- if (!githubIssueLink) return;
246
- var currentUrl = window.location.href;
247
- var repoSlug = '{{ site.github_user }}/{{ site.repository_name }}';
248
- githubIssueLink.href = 'https://github.com/' + repoSlug + '/issues/new?title=' + encodeURIComponent('404 Error on ' + currentUrl) + '&body=' + encodeURIComponent('I encountered a 404 error on the following page: ' + currentUrl + '. Please investigate.');
249
- });
255
+ // The widget cannot know which URL 404'd — this page can. Hand it over as
256
+ // the pre-filled description the moment the reader opens the dialog.
257
+ document.addEventListener('click', function (event) {
258
+ var trigger = event.target.closest && event.target.closest('#github-issue-link');
259
+ if (!trigger || !window.zer0PageFeedback) return;
260
+ var missing = window.location.href;
261
+ trigger.setAttribute('data-pf-description',
262
+ 'This URL returned 404: ' + missing + (document.referrer ? '\nLinked from: ' + document.referrer : ''));
263
+ }, true);
250
264
  </script>
251
265
  {% endif %}
252
266
  </div>
253
267
  {% endif %}
254
268
 
255
269
  {% if content != blank %}
256
- <!-- Extra content from the consumer's 404 stub body -->
270
+ {% comment %} Extra content from the consumer's 404 stub body {% endcomment %}
257
271
  <div class="container mt-4">
258
272
  {{ content }}
259
273
  </div>
data/_layouts/README.md CHANGED
@@ -18,6 +18,8 @@ root.html (base template)
18
18
  ├── landing.html (landing pages)
19
19
  ├── book.html (book landing page - cover hero + table of contents)
20
20
  ├── book-story.html (immersive picture-book story pages)
21
+ ├── cookbook.html (cookbook landing page - cover + recipe index by course)
22
+ ├── recipe.html (one recipe - fact bar, scaler, ingredients, method, ratio)
21
23
  ├── stats.html (statistics dashboard)
22
24
  └── index.html (search pages)
23
25
  ```
data/_layouts/admin.html CHANGED
@@ -2,7 +2,7 @@
2
2
  # Features: ZER0-019, ZER0-050
3
3
  layout: root
4
4
  ---
5
- <!--
5
+ {% comment %}
6
6
  ===================================================================
7
7
  ADMIN LAYOUT - Administrative and configuration page layout
8
8
  ===================================================================
@@ -36,7 +36,7 @@ layout: root
36
36
  - Bootstrap 5 grid, offcanvas, nav components
37
37
  - Bootstrap Icons
38
38
  ===================================================================
39
- -->
39
+ {% endcomment %}
40
40
 
41
41
  {% comment %} ════════════════════════════════════════════════════════ {% endcomment %}
42
42
  {% comment %} ADMIN NAV DATA {% endcomment %}
@@ -46,13 +46,13 @@ layout: root
46
46
 
47
47
  {% assign show_sidebar = page.admin_nav | default: true %}
48
48
 
49
- <!-- ================================================ -->
50
- <!-- ADMIN PAGE HEADER -->
51
- <!-- Breadcrumbs + title bar (no author/read-time) -->
52
- <!-- ================================================ -->
49
+ {% comment %} ================================================ {% endcomment %}
50
+ {% comment %} ADMIN PAGE HEADER {% endcomment %}
51
+ {% comment %} Breadcrumbs + title bar (no author/read-time) {% endcomment %}
52
+ {% comment %} ================================================ {% endcomment %}
53
53
  <div class="bg-body-tertiary border-bottom">
54
54
  <div class="container-xxl py-3">
55
- <!-- Breadcrumbs -->
55
+ {% comment %} Breadcrumbs {% endcomment %}
56
56
  <nav aria-label="breadcrumb">
57
57
  <ol class="breadcrumb mb-2 small">
58
58
  <li class="breadcrumb-item"><a href="{{ '/' | relative_url }}"><i class="bi bi-house-door"></i> Home</a></li>
@@ -61,9 +61,9 @@ layout: root
61
61
  </ol>
62
62
  </nav>
63
63
 
64
- <!-- Title row -->
64
+ {% comment %} Title row {% endcomment %}
65
65
  <div class="d-flex align-items-center">
66
- <!-- Mobile sidebar toggle -->
66
+ {% comment %} Mobile sidebar toggle {% endcomment %}
67
67
  {% if show_sidebar %}
68
68
  <button class="btn btn-outline-secondary me-3 d-lg-none"
69
69
  type="button"
@@ -90,7 +90,7 @@ layout: root
90
90
  {% endif %}
91
91
  </div>
92
92
 
93
- <!-- Page-level action buttons (from front matter admin_actions) -->
93
+ {% comment %} Page-level action buttons (from front matter admin_actions) {% endcomment %}
94
94
  {% if page.admin_actions %}
95
95
  <div class="d-none d-md-flex gap-2 ms-3">
96
96
  {% for action in page.admin_actions %}
@@ -106,20 +106,20 @@ layout: root
106
106
  </div>
107
107
  </div>
108
108
 
109
- <!-- ================================================ -->
110
- <!-- MAIN LAYOUT: SIDEBAR + CONTENT -->
111
- <!-- ================================================ -->
109
+ {% comment %} ================================================ {% endcomment %}
110
+ {% comment %} MAIN LAYOUT: SIDEBAR + CONTENT {% endcomment %}
111
+ {% comment %} ================================================ {% endcomment %}
112
112
  <div class="container-xxl py-4">
113
113
  <div class="row">
114
114
 
115
115
  {% if show_sidebar %}
116
- <!-- ════════════════════════════════ -->
117
- <!-- ADMIN SIDEBAR -->
118
- <!-- Desktop: sticky column -->
119
- <!-- Mobile: offcanvas -->
120
- <!-- ════════════════════════════════ -->
116
+ {% comment %} ════════════════════════════════ {% endcomment %}
117
+ {% comment %} ADMIN SIDEBAR {% endcomment %}
118
+ {% comment %} Desktop: sticky column {% endcomment %}
119
+ {% comment %} Mobile: offcanvas {% endcomment %}
120
+ {% comment %} ════════════════════════════════ {% endcomment %}
121
121
 
122
- <!-- Desktop sidebar (lg+) -->
122
+ {% comment %} Desktop sidebar (lg+) {% endcomment %}
123
123
  <div class="col-lg-3 d-none d-lg-block">
124
124
  <div class="position-sticky" style="top: 5rem;">
125
125
  <nav class="admin-sidebar" aria-label="Admin navigation">
@@ -131,13 +131,13 @@ layout: root
131
131
  </div>
132
132
  </div>
133
133
 
134
- <!-- Mobile offcanvas sidebar -->
134
+ {% comment %} Mobile offcanvas sidebar {% endcomment %}
135
135
  <div class="offcanvas offcanvas-start d-lg-none" tabindex="-1"
136
136
  id="adminSidebar" aria-labelledby="adminSidebarLabel">
137
137
  <div class="offcanvas-header">
138
- <h5 class="offcanvas-title" id="adminSidebarLabel">
138
+ <h2 class="offcanvas-title h5" id="adminSidebarLabel">
139
139
  <i class="bi bi-sliders me-1"></i> Administration
140
- </h5>
140
+ </h2>
141
141
  <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
142
142
  </div>
143
143
  <div class="offcanvas-body">
@@ -145,7 +145,7 @@ layout: root
145
145
  </div>
146
146
  </div>
147
147
 
148
- <!-- Main content area (with sidebar) -->
148
+ {% comment %} Main content area (with sidebar) {% endcomment %}
149
149
  <div class="col-lg-9">
150
150
  <div id="admin-content">
151
151
  {{ content }}
@@ -154,7 +154,7 @@ layout: root
154
154
 
155
155
  {% else %}
156
156
 
157
- <!-- Full-width content (no sidebar) -->
157
+ {% comment %} Full-width content (no sidebar) {% endcomment %}
158
158
  <div class="col-12">
159
159
  <div id="admin-content">
160
160
  {{ content }}