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
@@ -2,7 +2,7 @@
2
2
  # Features: ZER0-019, ZER0-035, ZER0-064
3
3
  layout: default
4
4
  ---
5
- <!--
5
+ {% comment %}
6
6
  ===================================================================
7
7
  ARTICLE LAYOUT - Blog Post and Article Display with Post Type Support
8
8
  ===================================================================
@@ -43,7 +43,7 @@ layout: default
43
43
  - site.giscus configuration for comment system
44
44
  - Bootstrap 5 components
45
45
  ===================================================================
46
- -->
46
+ {% endcomment %}
47
47
 
48
48
  {% comment %}
49
49
  Determine post type and (article-local) sidebar visibility.
@@ -93,9 +93,9 @@ layout: default
93
93
  </div>
94
94
  {% endif %}
95
95
 
96
- <!-- ================================ -->
97
- <!-- ARTICLE HEADER -->
98
- <!-- ================================ -->
96
+ {% comment %} ================================ {% endcomment %}
97
+ {% comment %} ARTICLE HEADER {% endcomment %}
98
+ {% comment %} ================================ {% endcomment %}
99
99
  <header class="post-header mb-4">
100
100
 
101
101
  {% comment %} Post Type Badge {% endcomment %}
@@ -125,9 +125,9 @@ layout: default
125
125
  <p class="lead text-muted">{{ page.sub-title }}</p>
126
126
  {% endif %}
127
127
 
128
- <!-- Post Metadata -->
128
+ {% comment %} Post Metadata {% endcomment %}
129
129
  <div class="post-meta text-muted mb-3">
130
- <!-- Author -->
130
+ {% comment %} Author {% endcomment %}
131
131
  {% if page.author %}
132
132
  <span class="post-author" itemprop="author" itemscope itemtype="https://schema.org/Person">
133
133
  {% include components/author-card.html author=page.author style="inline" name_itemprop="name" %}
@@ -135,7 +135,7 @@ layout: default
135
135
  <span class="mx-2">•</span>
136
136
  {% endif %}
137
137
 
138
- <!-- Publication Date -->
138
+ {% comment %} Publication Date {% endcomment %}
139
139
  {% if page.date %}
140
140
  <time class="post-date dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
141
141
  <i class="bi bi-calendar me-1"></i>
@@ -144,7 +144,7 @@ layout: default
144
144
  <span class="mx-2">•</span>
145
145
  {% endif %}
146
146
 
147
- <!-- Reading Time -->
147
+ {% comment %} Reading Time {% endcomment %}
148
148
  {% assign words = content | number_of_words %}
149
149
  {% assign minutes = words | divided_by: 200 %}
150
150
  {% if minutes < 1 %}{% assign minutes = 1 %}{% endif %}
@@ -153,7 +153,12 @@ layout: default
153
153
  {{ minutes }} min read
154
154
  </span>
155
155
 
156
- <!-- Last Modified -->
156
+ {% comment %} Page Views {% endcomment %}
157
+ {% comment %} The badge ships hidden and carries its own leading separator,
158
+ so a page with no count yet leaves no dangling "•" in the meta row. {% endcomment %}
159
+ {% include components/page-views.html separator=true %}
160
+
161
+ {% comment %} Last Modified {% endcomment %}
157
162
  {% if page.lastmod %}
158
163
  <span class="mx-2">•</span>
159
164
  <span class="post-updated" itemprop="dateModified" content="{{ page.lastmod | date_to_xmlschema }}">
@@ -163,7 +168,7 @@ layout: default
163
168
  {% endif %}
164
169
  </div>
165
170
 
166
- <!-- Category Link -->
171
+ {% comment %} Category Link {% endcomment %}
167
172
  {% comment %} Category base is configurable (`category_base`, default `/news`).
168
173
  Only link the badge when that category index page actually exists in the
169
174
  build; on a remote-theme Pages consumer the category section is
@@ -194,7 +199,7 @@ layout: default
194
199
  </div>
195
200
  {% endif %}
196
201
 
197
- <!-- Tags -->
202
+ {% comment %} Tags {% endcomment %}
198
203
  {% comment %} Only link tag badges when a tags index page actually exists in
199
204
  the build (configurable via `tags_page`, default `/tags/`). On a
200
205
  remote-theme Pages consumer the tags page is plugin/page-generated and
@@ -369,9 +374,9 @@ layout: default
369
374
  </aside>
370
375
  {% endif %}
371
376
 
372
- <!-- ================================ -->
373
- <!-- ARTICLE CONTENT -->
374
- <!-- ================================ -->
377
+ {% comment %} ================================ {% endcomment %}
378
+ {% comment %} ARTICLE CONTENT {% endcomment %}
379
+ {% comment %} ================================ {% endcomment %}
375
380
  <div class="post-content e-content {% if post_type == 'featured' %}fs-5{% endif %}" itemprop="articleBody">
376
381
  {{ content }}
377
382
  </div>
@@ -414,9 +419,9 @@ layout: default
414
419
  </aside>
415
420
  {% endif %}
416
421
 
417
- <!-- ================================ -->
418
- <!-- AUTHOR BIO SECTION -->
419
- <!-- ================================ -->
422
+ {% comment %} ================================ {% endcomment %}
423
+ {% comment %} AUTHOR BIO SECTION {% endcomment %}
424
+ {% comment %} ================================ {% endcomment %}
420
425
  {% comment %}
421
426
  "About the Author" is honored when the post has an author and the
422
427
  `author_profile` front-matter flag is not false (defaults to true for the
@@ -427,9 +432,9 @@ layout: default
427
432
  {% include components/author-bio.html author=page.author %}
428
433
  {% endif %}
429
434
 
430
- <!-- ================================ -->
431
- <!-- RELATED POSTS SECTION -->
432
- <!-- ================================ -->
435
+ {% comment %} ================================ {% endcomment %}
436
+ {% comment %} RELATED POSTS SECTION {% endcomment %}
437
+ {% comment %} ================================ {% endcomment %}
433
438
  {% if page.tags.size > 0 %}
434
439
  {% assign related_posts = "" | split: "" %}
435
440
  {% for tag in page.tags %}
@@ -444,9 +449,14 @@ layout: default
444
449
 
445
450
  {% if related_posts.size > 0 %}
446
451
  <aside class="related-posts my-5 pt-4 border-top">
447
- <h3 class="h5 mb-3">
452
+ {%- comment -%}
453
+ h2, not h3: this aside is a sibling of "About the Author" (also h2),
454
+ not a child of it. The old h3 also made every card title below it an
455
+ h6, a two-level jump (#436). Size is held by .h5.
456
+ {%- endcomment -%}
457
+ <h2 class="h5 mb-3">
448
458
  <i class="bi bi-journal-text me-2"></i>Related Posts
449
- </h3>
459
+ </h2>
450
460
  <div class="row row-cols-1 row-cols-md-3 g-3">
451
461
  {% for rpost in related_posts %}
452
462
  <div class="col">
@@ -463,11 +473,11 @@ layout: default
463
473
  </a>
464
474
  </div>
465
475
  <div class="card-body">
466
- <h6 class="card-title mb-1">
476
+ <h3 class="h6 card-title mb-1">
467
477
  <a href="{{ rpost.url | relative_url }}" class="text-decoration-none text-body-emphasis">
468
478
  {{ rpost.title | truncate: 60 }}
469
479
  </a>
470
- </h6>
480
+ </h3>
471
481
  <small class="text-muted">
472
482
  <i class="bi bi-calendar me-1"></i>{{ rpost.date | date: "%b %d, %Y" }}
473
483
  </small>
@@ -480,12 +490,12 @@ layout: default
480
490
  {% endif %}
481
491
  {% endif %}
482
492
 
483
- <!-- ================================ -->
484
- <!-- POST NAVIGATION -->
485
- <!-- ================================ -->
493
+ {% comment %} ================================ {% endcomment %}
494
+ {% comment %} POST NAVIGATION {% endcomment %}
495
+ {% comment %} ================================ {% endcomment %}
486
496
  <nav class="post-navigation my-5 pt-4 border-top" aria-label="Post navigation">
487
497
  <div class="row g-3">
488
- <!-- Previous Post -->
498
+ {% comment %} Previous Post {% endcomment %}
489
499
  <div class="col-md-6">
490
500
  {% if page.previous %}
491
501
  <a href="{{ page.previous.url | relative_url }}" class="post-nav-card post-nav-card--prev">
@@ -508,7 +518,7 @@ layout: default
508
518
  {% endif %}
509
519
  </div>
510
520
 
511
- <!-- Next Post -->
521
+ {% comment %} Next Post {% endcomment %}
512
522
  <div class="col-md-6">
513
523
  {% if page.next %}
514
524
  <a href="{{ page.next.url | relative_url }}" class="post-nav-card post-nav-card--next">
@@ -533,9 +543,9 @@ layout: default
533
543
  </div>
534
544
  </nav>
535
545
 
536
- <!-- ================================ -->
537
- <!-- COMMENT SYSTEM -->
538
- <!-- ================================ -->
546
+ {% comment %} ================================ {% endcomment %}
547
+ {% comment %} COMMENT SYSTEM {% endcomment %}
548
+ {% comment %} ================================ {% endcomment %}
539
549
  {% if page.comments != false and site.giscus.enabled %}
540
550
  <section class="post-comments mt-5 pt-4 border-top" id="comments">
541
551
  <h2 class="h4 mb-4">
data/_layouts/author.html CHANGED
@@ -66,9 +66,9 @@ hide_intro: true
66
66
  {% assign latest_date = nil %}
67
67
  {% for doc in author_docs %}{% if doc.date %}{% assign latest_date = doc.date %}{% break %}{% endif %}{% endfor %}
68
68
 
69
- <!-- ========================== -->
70
- <!-- BREADCRUMB -->
71
- <!-- ========================== -->
69
+ {% comment %} ========================== {% endcomment %}
70
+ {% comment %} BREADCRUMB {% endcomment %}
71
+ {% comment %} ========================== {% endcomment %}
72
72
  {%- comment -%}
73
73
  Only link the /authors/ breadcrumb crumb when that index page actually exists
74
74
  in the build. A pure remote-theme Pages consumer doesn't get the
@@ -98,9 +98,9 @@ hide_intro: true
98
98
  </ol>
99
99
  </nav>
100
100
 
101
- <!-- ========================== -->
102
- <!-- PROFILE HERO -->
103
- <!-- ========================== -->
101
+ {% comment %} ========================== {% endcomment %}
102
+ {% comment %} PROFILE HERO {% endcomment %}
103
+ {% comment %} ========================== {% endcomment %}
104
104
  <header class="author-hero card border-0 shadow-sm mb-4" itemscope itemtype="https://schema.org/Person">
105
105
  <div class="card-body p-4 p-md-5">
106
106
  <div class="d-flex flex-column flex-sm-row align-items-center align-items-sm-start gap-4">
@@ -118,14 +118,14 @@ hide_intro: true
118
118
  {% if author_data.tagline %}<p class="author-hero__tagline lead mb-2" itemprop="slogan">{{ author_data.tagline }}</p>{% endif %}
119
119
  {% if author_data.bio %}<p class="text-body-secondary mb-3" itemprop="description">{{ author_data.bio }}</p>{% endif %}
120
120
 
121
- <!-- Hero meta: location + latest activity -->
121
+ {% comment %} Hero meta: location + latest activity {% endcomment %}
122
122
  <div class="author-hero__meta d-flex flex-wrap justify-content-center justify-content-sm-start gap-3 text-body-secondary small mb-3">
123
123
  {% if author_data.location %}<span itemprop="homeLocation"><i class="bi bi-geo-alt me-1" aria-hidden="true"></i>{{ author_data.location }}</span>{% endif %}
124
124
  <span><i class="bi bi-collection me-1" aria-hidden="true"></i>{{ author_docs.size }} contribution{% unless author_docs.size == 1 %}s{% endunless %}</span>
125
125
  {% if latest_date %}<span><i class="bi bi-clock-history me-1" aria-hidden="true"></i>Last active {{ latest_date | date: "%b %Y" }}</span>{% endif %}
126
126
  </div>
127
127
 
128
- <!-- Expertise chips -->
128
+ {% comment %} Expertise chips {% endcomment %}
129
129
  {% assign hero_chips = author_data.topics | default: author_data.expertise %}
130
130
  {% if hero_chips %}
131
131
  <div class="author-expertise d-flex flex-wrap justify-content-center justify-content-sm-start gap-1 mb-3">
@@ -135,7 +135,7 @@ hide_intro: true
135
135
  </div>
136
136
  {% endif %}
137
137
 
138
- <!-- Social links -->
138
+ {% comment %} Social links {% endcomment %}
139
139
  <div class="author-social d-flex flex-wrap justify-content-center justify-content-sm-start gap-2">
140
140
  {% if author_data.github %}<a href="https://github.com/{{ author_data.github }}" class="btn btn-sm btn-outline-secondary" target="_blank" rel="noopener" itemprop="sameAs"><i class="bi bi-github me-1" aria-hidden="true"></i>GitHub</a>{% endif %}
141
141
  {% if author_data.twitter %}<a href="https://x.com/{{ author_data.twitter }}" class="btn btn-sm btn-outline-secondary" target="_blank" rel="noopener" aria-label="X" itemprop="sameAs"><i class="bi bi-twitter-x me-1" aria-hidden="true"></i>X</a>{% endif %}
@@ -155,14 +155,14 @@ hide_intro: true
155
155
  </header>
156
156
 
157
157
  {% if author_docs.size > 0 %}
158
- <!-- ========================== -->
159
- <!-- INTERACTIVE CONTENT HUB -->
160
- <!-- ========================== -->
158
+ {% comment %} ========================== {% endcomment %}
159
+ {% comment %} INTERACTIVE CONTENT HUB {% endcomment %}
160
+ {% comment %} ========================== {% endcomment %}
161
161
  <section class="author-content" data-author-profile>
162
162
 
163
163
  <h2 class="visually-hidden">Contributions by {{ author_name }}</h2>
164
164
 
165
- <!-- Stats dashboard = interactive type filters (each card filters the grid) -->
165
+ {% comment %} Stats dashboard = interactive type filters (each card filters the grid) {% endcomment %}
166
166
  <div class="author-stats" role="group" aria-label="Filter contributions by type">
167
167
  <button type="button" class="author-stat is-active" data-filter="all" aria-pressed="true">
168
168
  <span class="author-stat__num">{{ author_docs.size }}</span>
@@ -188,7 +188,7 @@ hide_intro: true
188
188
  {% endfor %}
189
189
  </div>
190
190
 
191
- <!-- Controls: search + sort + live result count -->
191
+ {% comment %} Controls: search + sort + live result count {% endcomment %}
192
192
  <div class="author-controls d-flex flex-column flex-md-row gap-2 align-items-stretch align-items-md-center mt-3">
193
193
  <div class="author-search flex-grow-1 position-relative">
194
194
  <i class="bi bi-search author-search__icon" aria-hidden="true"></i>
@@ -208,7 +208,7 @@ hide_intro: true
208
208
  </div>
209
209
  </div>
210
210
 
211
- <!-- Topic / tag cloud (clickable filters) -->
211
+ {% comment %} Topic / tag cloud (clickable filters) {% endcomment %}
212
212
  {% if unique_tags.size > 0 %}
213
213
  <div class="author-tagcloud mt-3" role="group" aria-label="Filter by topic">
214
214
  <span class="author-tagcloud__label text-body-secondary small me-1"><i class="bi bi-tags me-1" aria-hidden="true"></i>Topics:</span>
@@ -218,12 +218,12 @@ hide_intro: true
218
218
  </div>
219
219
  {% endif %}
220
220
 
221
- <!-- Live result count (announced to screen readers) -->
221
+ {% comment %} Live result count (announced to screen readers) {% endcomment %}
222
222
  <p class="author-resultcount text-body-secondary small mt-3 mb-2" data-author-count aria-live="polite">
223
223
  Showing {{ author_docs.size }} of {{ author_docs.size }}
224
224
  </p>
225
225
 
226
- <!-- Content grid -->
226
+ {% comment %} Content grid {% endcomment %}
227
227
  <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4" id="author-grid" data-author-grid>
228
228
  {% for doc in author_docs %}
229
229
  {% assign dtags = doc.tags | join: "|" | downcase %}
@@ -237,7 +237,7 @@ hide_intro: true
237
237
  {% endfor %}
238
238
  </div>
239
239
 
240
- <!-- No-results state (shown by JS when filters match nothing) -->
240
+ {% comment %} No-results state (shown by JS when filters match nothing) {% endcomment %}
241
241
  <div class="author-noresults text-center py-5 d-none" data-author-noresults>
242
242
  <i class="bi bi-search fs-1 text-muted" aria-hidden="true"></i>
243
243
  <p class="text-muted mt-3 mb-2">No contributions match your filters.</p>
@@ -245,7 +245,7 @@ hide_intro: true
245
245
  </div>
246
246
  </section>
247
247
 
248
- <!-- Structured data: this author's contributions as a CollectionPage / ItemList -->
248
+ {% comment %} Structured data: this author's contributions as a CollectionPage / ItemList {% endcomment %}
249
249
  <script type="application/ld+json">
250
250
  {
251
251
  "@context": "https://schema.org",
@@ -280,7 +280,7 @@ hide_intro: true
280
280
  body content (e.g. the Guest profile, which is a contribution guide). {% endcomment %}
281
281
  {% assign page_body = content | strip %}
282
282
  {% if page_body == "" %}
283
- <!-- Empty state -->
283
+ {% comment %} Empty state {% endcomment %}
284
284
  <div class="text-center py-5">
285
285
  <i class="bi bi-journal-x fs-1 text-muted" aria-hidden="true"></i>
286
286
  <p class="text-muted mt-3">No published content from this author yet.</p>
@@ -2,7 +2,7 @@
2
2
  # Features: ZER0-019, ZER0-061
3
3
  layout: default
4
4
  ---
5
- <!--
5
+ {% comment %}
6
6
  ===================================================================
7
7
  AUTHORS INDEX LAYOUT - Directory of all author profiles
8
8
  ===================================================================
@@ -24,7 +24,7 @@ layout: default
24
24
  - _data/authors.yml
25
25
  - components/author-card.html (style="compact")
26
26
  ===================================================================
27
- -->
27
+ {% endcomment %}
28
28
 
29
29
  <header class="authors-index-header mb-5">
30
30
  <div class="d-flex align-items-center mb-3">
@@ -22,9 +22,9 @@ layout: root
22
22
  {%- assign _first = page.alphabet | first -%}
23
23
 
24
24
  <article class="book-abc" itemscope itemtype="https://schema.org/Book">
25
- <!-- ================================ -->
26
- <!-- COVER HERO -->
27
- <!-- ================================ -->
25
+ {% comment %} ================================ {% endcomment %}
26
+ {% comment %} COVER HERO {% endcomment %}
27
+ {% comment %} ================================ {% endcomment %}
28
28
  <header class="book-hero zer0-bg-hero py-5">
29
29
  <div class="container-xl">
30
30
  <div class="row g-5 align-items-center justify-content-center">
@@ -67,27 +67,27 @@ layout: root
67
67
 
68
68
  <div class="container-xl py-5">
69
69
 
70
- <!-- ================================ -->
71
- <!-- A–Z QUICK JUMP -->
72
- <!-- ================================ -->
70
+ {% comment %} ================================ {% endcomment %}
71
+ {% comment %} A–Z QUICK JUMP {% endcomment %}
72
+ {% comment %} ================================ {% endcomment %}
73
73
  <nav class="abc-jump" aria-label="Jump to a letter">
74
74
  {%- for _e in page.alphabet -%}
75
75
  <a class="abc-jump-link" href="#letter-{{ _e.letter | downcase }}">{{ _e.letter }}</a>
76
76
  {%- endfor -%}
77
77
  </nav>
78
78
 
79
- <!-- ================================ -->
80
- <!-- THE ALPHABET BOARD -->
81
- <!-- ================================ -->
79
+ {% comment %} ================================ {% endcomment %}
80
+ {% comment %} THE ALPHABET BOARD {% endcomment %}
81
+ {% comment %} ================================ {% endcomment %}
82
82
  <div class="abc-board abc-style--{{ page.art_style | default: 'isometric-tech-toy' }}">
83
83
  {%- for _e in page.alphabet -%}
84
84
  {%- include components/abc-letter.html entry=_e -%}
85
85
  {%- endfor -%}
86
86
  </div>
87
87
 
88
- <!-- ================================ -->
89
- <!-- AI COLOPHON -->
90
- <!-- ================================ -->
88
+ {% comment %} ================================ {% endcomment %}
89
+ {% comment %} AI COLOPHON {% endcomment %}
90
+ {% comment %} ================================ {% endcomment %}
91
91
  {%- if page.art_style_prompt or page.generator -%}
92
92
  <aside class="book-colophon card border-0 bg-body-tertiary mt-5 mx-auto" style="max-width: var(--zer0-book-measure);">
93
93
  <div class="card-body">
@@ -20,9 +20,9 @@ layout: root
20
20
  {%- assign _book_page = site.books | where: "book", _slug | where: "layout", "book" | first -%}
21
21
 
22
22
  <article class="book-story container-xl py-4 py-md-5" itemscope itemtype="https://schema.org/Chapter">
23
- <!-- ================================ -->
24
- <!-- STORY HEADER -->
25
- <!-- ================================ -->
23
+ {% comment %} ================================ {% endcomment %}
24
+ {% comment %} STORY HEADER {% endcomment %}
25
+ {% comment %} ================================ {% endcomment %}
26
26
  <header class="book-story-header text-center mb-4 mb-md-5">
27
27
  {%- if _book_page -%}
28
28
  <nav aria-label="Book">
@@ -40,9 +40,9 @@ layout: root
40
40
  {%- endif -%}
41
41
  </header>
42
42
 
43
- <!-- ================================ -->
44
- <!-- STORY BODY -->
45
- <!-- ================================ -->
43
+ {% comment %} ================================ {% endcomment %}
44
+ {% comment %} STORY BODY {% endcomment %}
45
+ {% comment %} ================================ {% endcomment %}
46
46
  <div class="book-story-content" itemprop="text">
47
47
  {{ content }}
48
48
  </div>
@@ -51,16 +51,16 @@ layout: root
51
51
  <p class="book-the-end fs-4 mt-5">The End</p>
52
52
  {%- endunless -%}
53
53
 
54
- <!-- ================================ -->
55
- <!-- STORY NAVIGATION -->
56
- <!-- ================================ -->
54
+ {% comment %} ================================ {% endcomment %}
55
+ {% comment %} STORY NAVIGATION {% endcomment %}
56
+ {% comment %} ================================ {% endcomment %}
57
57
  {%- if page.chapter -%}
58
58
  {%- include components/book-nav.html book=_slug chapter=page.chapter -%}
59
59
  {%- endif -%}
60
60
 
61
- <!-- ================================ -->
62
- <!-- ILLUSTRATION COLOPHON -->
63
- <!-- ================================ -->
61
+ {% comment %} ================================ {% endcomment %}
62
+ {% comment %} ILLUSTRATION COLOPHON {% endcomment %}
63
+ {% comment %} ================================ {% endcomment %}
64
64
  {%- if page.illustrations and page.illustrations.size > 0 -%}
65
65
  <details class="book-colophon mt-4">
66
66
  <summary class="small"><i class="bi bi-stars me-1" aria-hidden="true"></i>How the illustrations in this story were made</summary>
@@ -79,9 +79,9 @@ layout: root
79
79
  </details>
80
80
  {%- endif -%}
81
81
 
82
- <!-- ================================ -->
83
- <!-- COMMENTS -->
84
- <!-- ================================ -->
82
+ {% comment %} ================================ {% endcomment %}
83
+ {% comment %} COMMENTS {% endcomment %}
84
+ {% comment %} ================================ {% endcomment %}
85
85
  {%- if page.comments and site.giscus.enabled -%}
86
86
  <section class="post-comments mt-5 pt-4 border-top" id="comments">
87
87
  <h2 class="h4 mb-4"><i class="bi bi-chat-dots me-2" aria-hidden="true"></i>Comments</h2>
data/_layouts/book.html CHANGED
@@ -21,9 +21,9 @@ layout: root
21
21
  {%- assign _cover = page.cover_image | default: page.preview -%}
22
22
 
23
23
  <article class="book-landing" itemscope itemtype="https://schema.org/Book">
24
- <!-- ================================ -->
25
- <!-- COVER HERO -->
26
- <!-- ================================ -->
24
+ {% comment %} ================================ {% endcomment %}
25
+ {% comment %} COVER HERO {% endcomment %}
26
+ {% comment %} ================================ {% endcomment %}
27
27
  <header class="book-hero zer0-bg-hero py-5">
28
28
  <div class="container-xl">
29
29
  <div class="row g-5 align-items-center justify-content-center">
@@ -69,9 +69,9 @@ layout: root
69
69
  <div class="row justify-content-center">
70
70
  <div class="col-lg-9 col-xl-8">
71
71
 
72
- <!-- ================================ -->
73
- <!-- ABOUT THIS BOOK (page body) -->
74
- <!-- ================================ -->
72
+ {% comment %} ================================ {% endcomment %}
73
+ {% comment %} ABOUT THIS BOOK (page body) {% endcomment %}
74
+ {% comment %} ================================ {% endcomment %}
75
75
  {%- assign _body = content | strip -%}
76
76
  {%- if _body != "" -%}
77
77
  <section class="book-about mb-5">
@@ -79,14 +79,14 @@ layout: root
79
79
  </section>
80
80
  {%- endif -%}
81
81
 
82
- <!-- ================================ -->
83
- <!-- TABLE OF CONTENTS -->
84
- <!-- ================================ -->
82
+ {% comment %} ================================ {% endcomment %}
83
+ {% comment %} TABLE OF CONTENTS {% endcomment %}
84
+ {% comment %} ================================ {% endcomment %}
85
85
  {%- include components/book-toc.html book=_slug -%}
86
86
 
87
- <!-- ================================ -->
88
- <!-- AI COLOPHON -->
89
- <!-- ================================ -->
87
+ {% comment %} ================================ {% endcomment %}
88
+ {% comment %} AI COLOPHON {% endcomment %}
89
+ {% comment %} ================================ {% endcomment %}
90
90
  {%- if page.illustration_style or page.generator -%}
91
91
  <aside class="book-colophon card border-0 bg-body-tertiary mt-5">
92
92
  <div class="card-body">
@@ -2,7 +2,7 @@
2
2
  # Feature: ZER0-019
3
3
  layout: default
4
4
  ---
5
- <!--
5
+ {% comment %}
6
6
  ===================================================================
7
7
  COLLECTION LAYOUT - Display template for Jekyll collections
8
8
  ===================================================================
@@ -42,18 +42,18 @@ layout: default
42
42
  - Bootstrap 5 card and grid components
43
43
  - Site configuration for public_folder and teaser image
44
44
  ===================================================================
45
- -->
45
+ {% endcomment %}
46
46
 
47
- <!-- ========================== -->
48
- <!-- COLLECTION PAGE CONTENT -->
49
- <!-- ========================== -->
50
- <!-- Main content area for collection description or introduction -->
47
+ {% comment %} ========================== {% endcomment %}
48
+ {% comment %} COLLECTION PAGE CONTENT {% endcomment %}
49
+ {% comment %} ========================== {% endcomment %}
50
+ {% comment %} Main content area for collection description or introduction {% endcomment %}
51
51
  {{ content }}
52
52
 
53
- <!-- ========================== -->
54
- <!-- COLLECTION DATA PROCESSING -->
55
- <!-- ========================== -->
56
- <!-- Extract and sort collection entries based on page configuration.
53
+ {% comment %} ========================== {% endcomment %}
54
+ {% comment %} COLLECTION DATA PROCESSING {% endcomment %}
55
+ {% comment %} ========================== {% endcomment %}
56
+ {% comment %} Extract and sort collection entries based on page configuration.
57
57
 
58
58
  Jekyll sets page.collection automatically for a document inside a
59
59
  collection, but a standalone page can also select this layout in its front
@@ -61,12 +61,12 @@ layout: default
61
61
  declare — site[page.collection] is nil, and `sort` on nil raises
62
62
  "Cannot sort a null object.", which aborts the ENTIRE build rather than
63
63
  just this page. Resolve to an empty list instead so one misconfigured page
64
- cannot take the site down. -->
64
+ cannot take the site down. {% endcomment %}
65
65
  {% assign entries = site[page.collection] %}
66
66
  {% if entries %}
67
67
  {% assign entries = entries | sort: page.sort_order %}
68
68
 
69
- <!-- Handle reverse sorting if specified -->
69
+ {% comment %} Handle reverse sorting if specified {% endcomment %}
70
70
  {% if page.sort_order == 'reverse' %}
71
71
  {% assign entries = entries | reverse %}
72
72
  {% endif %}
@@ -74,53 +74,53 @@ layout: default
74
74
  {% assign entries = "" | split: "" %}
75
75
  {% endif %}
76
76
 
77
- <!-- ========================== -->
78
- <!-- COLLECTION INDEX HEADER -->
79
- <!-- ========================== -->
77
+ {% comment %} ========================== {% endcomment %}
78
+ {% comment %} COLLECTION INDEX HEADER {% endcomment %}
79
+ {% comment %} ========================== {% endcomment %}
80
80
  <h2 id="index-collection">
81
81
  Collection Index - {{ page.collection }}
82
82
  </h2>
83
83
 
84
- <!-- ================================ -->
85
- <!-- COLLECTION ITEMS GRID -->
86
- <!-- ================================ -->
87
- <!-- Responsive card grid: 1 column mobile, up to 3 columns desktop -->
84
+ {% comment %} ================================ {% endcomment %}
85
+ {% comment %} COLLECTION ITEMS GRID {% endcomment %}
86
+ {% comment %} ================================ {% endcomment %}
87
+ {% comment %} Responsive card grid: 1 column mobile, up to 3 columns desktop {% endcomment %}
88
88
  <div class="row row-cols-1 row-cols-md-3 g-4">
89
89
 
90
90
  {% for post in entries %}
91
91
  <div class="col">
92
- <!-- Bootstrap card with equal height for consistent layout -->
92
+ {% comment %} Bootstrap card with equal height for consistent layout {% endcomment %}
93
93
  <div class="card h-100">
94
94
 
95
- <!-- ====================== -->
96
- <!-- CARD IMAGE SECTION -->
97
- <!-- ====================== -->
98
- <!-- Display preview image with fallback to site teaser -->
95
+ {% comment %} ====================== {% endcomment %}
96
+ {% comment %} CARD IMAGE SECTION {% endcomment %}
97
+ {% comment %} ====================== {% endcomment %}
98
+ {% comment %} Display preview image with fallback to site teaser {% endcomment %}
99
99
  {% assign coll_img = post.preview | default: site.teaser %}
100
100
  {% include components/preview-image.html src=coll_img alt=post.title class="card-img-top" %}
101
101
 
102
- <!-- ====================== -->
103
- <!-- CARD CONTENT SECTION -->
104
- <!-- ====================== -->
102
+ {% comment %} ====================== {% endcomment %}
103
+ {% comment %} CARD CONTENT SECTION {% endcomment %}
104
+ {% comment %} ====================== {% endcomment %}
105
105
  <div class="card-body">
106
- <!-- Post title with SEO microdata -->
106
+ {% comment %} Post title with SEO microdata {% endcomment %}
107
107
  <h5 class="card-title" itemprop="headline">
108
108
  <a class="card-link" href="{{ post.url | relative_url }}" rel="permalink">
109
109
  {{ post.title }}
110
110
  </a>
111
111
  </h5>
112
112
 
113
- <!-- Post excerpt with HTML stripped and character limit -->
113
+ {% comment %} Post excerpt with HTML stripped and character limit {% endcomment %}
114
114
  <p class="card-text" itemprop="description">
115
115
  {{ post.excerpt | strip_html | truncate: 160 }}
116
116
  </p>
117
117
  </div>
118
118
 
119
- <!-- ====================== -->
120
- <!-- CARD FOOTER SECTION -->
121
- <!-- ====================== -->
119
+ {% comment %} ====================== {% endcomment %}
120
+ {% comment %} CARD FOOTER SECTION {% endcomment %}
121
+ {% comment %} ====================== {% endcomment %}
122
122
  <div class="card-footer">
123
- <!-- Last modified date for content freshness indicator -->
123
+ {% comment %} Last modified date for content freshness indicator {% endcomment %}
124
124
  <small class="text-body-secondary post-meta">
125
125
  Last updated {{ post.lastmod | date: '%B %d, %Y' }}
126
126
  </small>