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
@@ -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.
@@ -76,7 +76,12 @@ layout: default
76
76
  {% endif %}
77
77
  {% endif %}
78
78
 
79
- <article id="main" class="post h-entry" role="main" itemscope itemtype="https://schema.org/BlogPosting">
79
+ {% comment %} No main role and no generic main id on this element: root.html already
80
+ provides the page's single <main id="main-content"> landmark, and a main role here
81
+ both duplicated it and suppressed this element's native `article` landmark (issue
82
+ #484, the same class of defect as #299). The generic id had no referents either —
83
+ the skip link targets #main-content. Asserted by test/visual/core/landmarks.spec.js. {% endcomment %}
84
+ <article class="post h-entry" itemscope itemtype="https://schema.org/BlogPosting">
80
85
 
81
86
  {% comment %} ================================ {% endcomment %}
82
87
  {% comment %} BREAKING NEWS ALERT BANNER {% endcomment %}
@@ -93,9 +98,9 @@ layout: default
93
98
  </div>
94
99
  {% endif %}
95
100
 
96
- <!-- ================================ -->
97
- <!-- ARTICLE HEADER -->
98
- <!-- ================================ -->
101
+ {% comment %} ================================ {% endcomment %}
102
+ {% comment %} ARTICLE HEADER {% endcomment %}
103
+ {% comment %} ================================ {% endcomment %}
99
104
  <header class="post-header mb-4">
100
105
 
101
106
  {% comment %} Post Type Badge {% endcomment %}
@@ -125,9 +130,9 @@ layout: default
125
130
  <p class="lead text-muted">{{ page.sub-title }}</p>
126
131
  {% endif %}
127
132
 
128
- <!-- Post Metadata -->
133
+ {% comment %} Post Metadata {% endcomment %}
129
134
  <div class="post-meta text-muted mb-3">
130
- <!-- Author -->
135
+ {% comment %} Author {% endcomment %}
131
136
  {% if page.author %}
132
137
  <span class="post-author" itemprop="author" itemscope itemtype="https://schema.org/Person">
133
138
  {% include components/author-card.html author=page.author style="inline" name_itemprop="name" %}
@@ -135,7 +140,7 @@ layout: default
135
140
  <span class="mx-2">•</span>
136
141
  {% endif %}
137
142
 
138
- <!-- Publication Date -->
143
+ {% comment %} Publication Date {% endcomment %}
139
144
  {% if page.date %}
140
145
  <time class="post-date dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
141
146
  <i class="bi bi-calendar me-1"></i>
@@ -144,7 +149,7 @@ layout: default
144
149
  <span class="mx-2">•</span>
145
150
  {% endif %}
146
151
 
147
- <!-- Reading Time -->
152
+ {% comment %} Reading Time {% endcomment %}
148
153
  {% assign words = content | number_of_words %}
149
154
  {% assign minutes = words | divided_by: 200 %}
150
155
  {% if minutes < 1 %}{% assign minutes = 1 %}{% endif %}
@@ -153,12 +158,12 @@ layout: default
153
158
  {{ minutes }} min read
154
159
  </span>
155
160
 
156
- <!-- Page Views -->
161
+ {% comment %} Page Views {% endcomment %}
157
162
  {% comment %} The badge ships hidden and carries its own leading separator,
158
163
  so a page with no count yet leaves no dangling "•" in the meta row. {% endcomment %}
159
164
  {% include components/page-views.html separator=true %}
160
165
 
161
- <!-- Last Modified -->
166
+ {% comment %} Last Modified {% endcomment %}
162
167
  {% if page.lastmod %}
163
168
  <span class="mx-2">•</span>
164
169
  <span class="post-updated" itemprop="dateModified" content="{{ page.lastmod | date_to_xmlschema }}">
@@ -168,7 +173,7 @@ layout: default
168
173
  {% endif %}
169
174
  </div>
170
175
 
171
- <!-- Category Link -->
176
+ {% comment %} Category Link {% endcomment %}
172
177
  {% comment %} Category base is configurable (`category_base`, default `/news`).
173
178
  Only link the badge when that category index page actually exists in the
174
179
  build; on a remote-theme Pages consumer the category section is
@@ -199,7 +204,7 @@ layout: default
199
204
  </div>
200
205
  {% endif %}
201
206
 
202
- <!-- Tags -->
207
+ {% comment %} Tags {% endcomment %}
203
208
  {% comment %} Only link tag badges when a tags index page actually exists in
204
209
  the build (configurable via `tags_page`, default `/tags/`). On a
205
210
  remote-theme Pages consumer the tags page is plugin/page-generated and
@@ -234,6 +239,10 @@ layout: default
234
239
  post_type defaults (issue #303).
235
240
  Nested ifs keep the "only when page.preview exists" guard intact (Liquid has
236
241
  no parentheses, so a flat `a or b and c` would misgroup).
242
+ The hero is the above-the-fold LCP element, so it loads eagerly at high
243
+ priority (the include defaults to lazy); its box is reserved in CSS by
244
+ `.featured-hero img` (components/_ui-enhancements.scss), not by width/height
245
+ attributes, because preview assets vary in shape (issue #485).
237
246
  {% endcomment %}
238
247
  {% assign show_hero = false %}
239
248
  {% if page.preview %}
@@ -247,7 +256,10 @@ layout: default
247
256
  src=page.preview
248
257
  alt=page.title
249
258
  class="w-100 rounded-3 shadow"
250
- style="max-height: 500px; object-fit: cover;"
259
+ style="max-height: 500px; object-fit: cover;"
260
+ loading="eager"
261
+ fetchpriority="high"
262
+ decoding="async"
251
263
  %}
252
264
  {% if page.preview_caption %}
253
265
  <figcaption class="text-muted small mt-2 text-center">{{ page.preview_caption }}</figcaption>
@@ -374,9 +386,9 @@ layout: default
374
386
  </aside>
375
387
  {% endif %}
376
388
 
377
- <!-- ================================ -->
378
- <!-- ARTICLE CONTENT -->
379
- <!-- ================================ -->
389
+ {% comment %} ================================ {% endcomment %}
390
+ {% comment %} ARTICLE CONTENT {% endcomment %}
391
+ {% comment %} ================================ {% endcomment %}
380
392
  <div class="post-content e-content {% if post_type == 'featured' %}fs-5{% endif %}" itemprop="articleBody">
381
393
  {{ content }}
382
394
  </div>
@@ -419,9 +431,9 @@ layout: default
419
431
  </aside>
420
432
  {% endif %}
421
433
 
422
- <!-- ================================ -->
423
- <!-- AUTHOR BIO SECTION -->
424
- <!-- ================================ -->
434
+ {% comment %} ================================ {% endcomment %}
435
+ {% comment %} AUTHOR BIO SECTION {% endcomment %}
436
+ {% comment %} ================================ {% endcomment %}
425
437
  {% comment %}
426
438
  "About the Author" is honored when the post has an author and the
427
439
  `author_profile` front-matter flag is not false (defaults to true for the
@@ -432,9 +444,9 @@ layout: default
432
444
  {% include components/author-bio.html author=page.author %}
433
445
  {% endif %}
434
446
 
435
- <!-- ================================ -->
436
- <!-- RELATED POSTS SECTION -->
437
- <!-- ================================ -->
447
+ {% comment %} ================================ {% endcomment %}
448
+ {% comment %} RELATED POSTS SECTION {% endcomment %}
449
+ {% comment %} ================================ {% endcomment %}
438
450
  {% if page.tags.size > 0 %}
439
451
  {% assign related_posts = "" | split: "" %}
440
452
  {% for tag in page.tags %}
@@ -449,9 +461,14 @@ layout: default
449
461
 
450
462
  {% if related_posts.size > 0 %}
451
463
  <aside class="related-posts my-5 pt-4 border-top">
452
- <h3 class="h5 mb-3">
464
+ {%- comment -%}
465
+ h2, not h3: this aside is a sibling of "About the Author" (also h2),
466
+ not a child of it. The old h3 also made every card title below it an
467
+ h6, a two-level jump (#436). Size is held by .h5.
468
+ {%- endcomment -%}
469
+ <h2 class="h5 mb-3">
453
470
  <i class="bi bi-journal-text me-2"></i>Related Posts
454
- </h3>
471
+ </h2>
455
472
  <div class="row row-cols-1 row-cols-md-3 g-3">
456
473
  {% for rpost in related_posts %}
457
474
  <div class="col">
@@ -464,15 +481,15 @@ layout: default
464
481
  {% endif %}
465
482
  <a href="{{ rpost.url | relative_url }}" class="text-decoration-none">
466
483
  {% assign rpost_img = rpost.preview | default: site.teaser %}
467
- {% include components/preview-image.html src=rpost_img alt=rpost.title class="card-img-top" %}
484
+ {% include components/preview-image.html src=rpost_img alt=rpost.title class="card-img-top" width="1536" height="1024" %}
468
485
  </a>
469
486
  </div>
470
487
  <div class="card-body">
471
- <h6 class="card-title mb-1">
488
+ <h3 class="h6 card-title mb-1">
472
489
  <a href="{{ rpost.url | relative_url }}" class="text-decoration-none text-body-emphasis">
473
490
  {{ rpost.title | truncate: 60 }}
474
491
  </a>
475
- </h6>
492
+ </h3>
476
493
  <small class="text-muted">
477
494
  <i class="bi bi-calendar me-1"></i>{{ rpost.date | date: "%b %d, %Y" }}
478
495
  </small>
@@ -485,12 +502,12 @@ layout: default
485
502
  {% endif %}
486
503
  {% endif %}
487
504
 
488
- <!-- ================================ -->
489
- <!-- POST NAVIGATION -->
490
- <!-- ================================ -->
505
+ {% comment %} ================================ {% endcomment %}
506
+ {% comment %} POST NAVIGATION {% endcomment %}
507
+ {% comment %} ================================ {% endcomment %}
491
508
  <nav class="post-navigation my-5 pt-4 border-top" aria-label="Post navigation">
492
509
  <div class="row g-3">
493
- <!-- Previous Post -->
510
+ {% comment %} Previous Post {% endcomment %}
494
511
  <div class="col-md-6">
495
512
  {% if page.previous %}
496
513
  <a href="{{ page.previous.url | relative_url }}" class="post-nav-card post-nav-card--prev">
@@ -513,7 +530,7 @@ layout: default
513
530
  {% endif %}
514
531
  </div>
515
532
 
516
- <!-- Next Post -->
533
+ {% comment %} Next Post {% endcomment %}
517
534
  <div class="col-md-6">
518
535
  {% if page.next %}
519
536
  <a href="{{ page.next.url | relative_url }}" class="post-nav-card post-nav-card--next">
@@ -538,9 +555,9 @@ layout: default
538
555
  </div>
539
556
  </nav>
540
557
 
541
- <!-- ================================ -->
542
- <!-- COMMENT SYSTEM -->
543
- <!-- ================================ -->
558
+ {% comment %} ================================ {% endcomment %}
559
+ {% comment %} COMMENT SYSTEM {% endcomment %}
560
+ {% comment %} ================================ {% endcomment %}
544
561
  {% if page.comments != false and site.giscus.enabled %}
545
562
  <section class="post-comments mt-5 pt-4 border-top" id="comments">
546
563
  <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">