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
data/_layouts/news.html CHANGED
@@ -3,7 +3,7 @@
3
3
  layout: root
4
4
  source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
5
5
  ---
6
- <!--
6
+ {% comment %}
7
7
  ===================================================================
8
8
  NEWS LAYOUT - Main News Homepage with Section Style Support
9
9
  ===================================================================
@@ -49,7 +49,7 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
49
49
 
50
50
  Note: All cards are inlined to avoid Liquid nesting depth issues
51
51
  ===================================================================
52
- -->
52
+ {% endcomment %}
53
53
 
54
54
  {% comment %}
55
55
  WARNING: section_style is required in front matter!
@@ -92,9 +92,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
92
92
  {% if _tags_index_page %}{% assign _tags_linkable = true %}{% endif %}
93
93
  {% endif %}
94
94
 
95
- <!-- ================================ -->
96
- <!-- NEWS HEADER -->
97
- <!-- ================================ -->
95
+ {% comment %} ================================ {% endcomment %}
96
+ {% comment %} NEWS HEADER {% endcomment %}
97
+ {% comment %} ================================ {% endcomment %}
98
98
  <div class="container-fluid bg-dark text-white py-3 mb-4">
99
99
  <div class="container">
100
100
  <div class="row align-items-center">
@@ -131,18 +131,18 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
131
131
  </div>
132
132
  </div>
133
133
 
134
- <!-- Not a <main>: root.html already provides the single <main id="main-content">
135
- landmark; a nested <main> here would duplicate it (issue #299). -->
134
+ {% comment %} Not a <main>: root.html already provides the single <main id="main-content">
135
+ landmark; a nested <main> here would duplicate it (issue #299). {% endcomment %}
136
136
  <div class="container">
137
137
 
138
138
  {% if section_style == "magazine" %}
139
- <!-- ================================ -->
140
- <!-- MAGAZINE STYLE LAYOUT -->
141
- <!-- ================================ -->
139
+ {% comment %} ================================ {% endcomment %}
140
+ {% comment %} MAGAZINE STYLE LAYOUT {% endcomment %}
141
+ {% comment %} ================================ {% endcomment %}
142
142
 
143
- <!-- ================================ -->
144
- <!-- HERO - BREAKING NEWS -->
145
- <!-- ================================ -->
143
+ {% comment %} ================================ {% endcomment %}
144
+ {% comment %} HERO - BREAKING NEWS {% endcomment %}
145
+ {% comment %} ================================ {% endcomment %}
146
146
  {% assign breaking_posts = all_posts | where: "breaking", true %}
147
147
  {% assign hero_post = breaking_posts | first %}
148
148
 
@@ -215,9 +215,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
215
215
  </section>
216
216
  {% endif %}
217
217
 
218
- <!-- ================================ -->
219
- <!-- SECTION QUICK NAVIGATION -->
220
- <!-- ================================ -->
218
+ {% comment %} ================================ {% endcomment %}
219
+ {% comment %} SECTION QUICK NAVIGATION {% endcomment %}
220
+ {% comment %} ================================ {% endcomment %}
221
221
  <section class="section-nav mb-5">
222
222
  <div class="row row-cols-2 row-cols-md-3 row-cols-lg-6 g-3">
223
223
  {% for sec_name in news_sections %}
@@ -242,9 +242,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
242
242
  </div>
243
243
  </section>
244
244
 
245
- <!-- ================================ -->
246
- <!-- FEATURED STORIES -->
247
- <!-- ================================ -->
245
+ {% comment %} ================================ {% endcomment %}
246
+ {% comment %} FEATURED STORIES {% endcomment %}
247
+ {% comment %} ================================ {% endcomment %}
248
248
  {% assign featured_posts = all_posts | where: "featured", true %}
249
249
  {% if featured_posts.size > 0 %}
250
250
  <section class="featured-section mb-5">
@@ -255,7 +255,7 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
255
255
  </div>
256
256
 
257
257
  <div class="row g-4">
258
- <!-- Main Featured Post -->
258
+ {% comment %} Main Featured Post {% endcomment %}
259
259
  {% assign main_featured = featured_posts | first %}
260
260
  <div class="col-lg-6">
261
261
  <div class="card h-100 border-0 shadow">
@@ -300,7 +300,7 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
300
300
  </div>
301
301
  </div>
302
302
 
303
- <!-- Secondary Featured Posts -->
303
+ {% comment %} Secondary Featured Posts {% endcomment %}
304
304
  <div class="col-lg-6">
305
305
  <div class="row row-cols-1 row-cols-md-2 g-4">
306
306
  {% for fpost in featured_posts offset:1 limit:4 %}
@@ -334,9 +334,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
334
334
  </section>
335
335
  {% endif %}
336
336
 
337
- <!-- ================================ -->
338
- <!-- POSTS BY SECTION -->
339
- <!-- ================================ -->
337
+ {% comment %} ================================ {% endcomment %}
338
+ {% comment %} POSTS BY SECTION {% endcomment %}
339
+ {% comment %} ================================ {% endcomment %}
340
340
  {% for sec_name in news_sections limit: 3 %}
341
341
  {% assign section_posts = all_posts | where_exp: "post", "post.categories contains sec_name" %}
342
342
  {% assign _sec_nav = site.data.navigation.posts | where: "title", sec_name | first %}
@@ -395,9 +395,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
395
395
  {% endfor %}
396
396
 
397
397
  {% elsif section_style == "grid" %}
398
- <!-- ================================ -->
399
- <!-- GRID STYLE LAYOUT -->
400
- <!-- ================================ -->
398
+ {% comment %} ================================ {% endcomment %}
399
+ {% comment %} GRID STYLE LAYOUT {% endcomment %}
400
+ {% comment %} ================================ {% endcomment %}
401
401
  <section class="grid-section mb-5">
402
402
  <h2 class="h4 mb-4">
403
403
  <i class="bi bi-grid me-2"></i>All Articles
@@ -453,9 +453,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
453
453
  </section>
454
454
 
455
455
  {% elsif section_style == "list" %}
456
- <!-- ================================ -->
457
- <!-- LIST STYLE LAYOUT -->
458
- <!-- ================================ -->
456
+ {% comment %} ================================ {% endcomment %}
457
+ {% comment %} LIST STYLE LAYOUT {% endcomment %}
458
+ {% comment %} ================================ {% endcomment %}
459
459
  <section class="list-section mb-5">
460
460
  <h2 class="h4 mb-4">
461
461
  <i class="bi bi-list-ul me-2"></i>Latest Articles
@@ -509,9 +509,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
509
509
 
510
510
  {% endif %}
511
511
 
512
- <!-- ================================ -->
513
- <!-- LATEST POSTS -->
514
- <!-- ================================ -->
512
+ {% comment %} ================================ {% endcomment %}
513
+ {% comment %} LATEST POSTS {% endcomment %}
514
+ {% comment %} ================================ {% endcomment %}
515
515
  {% if section_style == "magazine" %}
516
516
  <section class="latest-section mb-5">
517
517
  <div class="d-flex justify-content-between align-items-center mb-4">
@@ -557,9 +557,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
557
557
  </section>
558
558
  {% endif %}
559
559
 
560
- <!-- ================================ -->
561
- <!-- PAGE CONTENT (if any) -->
562
- <!-- ================================ -->
560
+ {% comment %} ================================ {% endcomment %}
561
+ {% comment %} PAGE CONTENT (if any) {% endcomment %}
562
+ {% comment %} ================================ {% endcomment %}
563
563
  {% if content != blank %}
564
564
  <section class="page-content mb-5">
565
565
  <div class="card border-0 shadow-sm">
@@ -570,12 +570,12 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
570
570
  </section>
571
571
  {% endif %}
572
572
 
573
- <!-- ================================ -->
574
- <!-- TAGS & ARCHIVES -->
575
- <!-- ================================ -->
573
+ {% comment %} ================================ {% endcomment %}
574
+ {% comment %} TAGS & ARCHIVES {% endcomment %}
575
+ {% comment %} ================================ {% endcomment %}
576
576
  <section class="footer-widgets mb-5">
577
577
  <div class="row g-4">
578
- <!-- Popular Tags -->
578
+ {% comment %} Popular Tags {% endcomment %}
579
579
  <div class="col-md-6">
580
580
  <div class="card h-100 border-0 bg-body-tertiary">
581
581
  <div class="card-body">
@@ -610,7 +610,7 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
610
610
  </div>
611
611
  </div>
612
612
 
613
- <!-- Archives -->
613
+ {% comment %} Archives {% endcomment %}
614
614
  <div class="col-md-6">
615
615
  <div class="card h-100 border-0 bg-body-tertiary">
616
616
  <div class="card-body">
@@ -661,9 +661,9 @@ source: "https://getbootstrap.com/docs/5.3/examples/blog/#"
661
661
  </div>
662
662
  </section>
663
663
 
664
- <!-- ================================ -->
665
- <!-- NEWSLETTER SIGNUP -->
666
- <!-- ================================ -->
664
+ {% comment %} ================================ {% endcomment %}
665
+ {% comment %} NEWSLETTER SIGNUP {% endcomment %}
666
+ {% comment %} ================================ {% endcomment %}
667
667
  {% comment %}
668
668
  Renders only when it can actually do something: a configured form
669
669
  endpoint (news.newsletter.endpoint) posts for real; otherwise a
data/_layouts/note.html CHANGED
@@ -5,7 +5,7 @@ layout: default
5
5
  {% assign page_absolute_url = page.url | absolute_url %}
6
6
  {% assign linkedin_share_title = page.title | default: site.title | strip_html | strip_newlines | strip %}
7
7
  {% assign linkedin_share_description = page.description | default: page.excerpt | default: site.description | strip_html | strip_newlines | strip %}
8
- <!--
8
+ {% comment %}
9
9
  ===================================================================
10
10
  NOTE LAYOUT - Quick Notes and Reference Display
11
11
  ===================================================================
@@ -36,21 +36,22 @@ layout: default
36
36
  - Bootstrap 5 components
37
37
  - Giscus comments (optional)
38
38
  ===================================================================
39
- -->
39
+ {% endcomment %}
40
40
 
41
- <article id="main" class="note-article h-entry" role="main" itemscope itemtype="https://schema.org/Article">
41
+ {% comment %} No main role and no generic main id — see article.html (issue #484). {% endcomment %}
42
+ <article class="note-article h-entry" itemscope itemtype="https://schema.org/Article">
42
43
 
43
- <!-- ================================ -->
44
- <!-- NOTE HEADER -->
45
- <!-- ================================ -->
44
+ {% comment %} ================================ {% endcomment %}
45
+ {% comment %} NOTE HEADER {% endcomment %}
46
+ {% comment %} ================================ {% endcomment %}
46
47
  <header class="note-header mb-4">
47
48
  <h1 id="page-title" class="note-title p-name" itemprop="headline">
48
49
  {{ page.title }}
49
50
  </h1>
50
51
 
51
- <!-- Note Metadata -->
52
+ {% comment %} Note Metadata {% endcomment %}
52
53
  <div class="note-meta text-muted mb-3">
53
- <!-- Author -->
54
+ {% comment %} Author {% endcomment %}
54
55
  {% if page.author %}
55
56
  <span class="note-author" itemprop="author" itemscope itemtype="https://schema.org/Person">
56
57
  {% include components/author-card.html author=page.author style="inline" name_itemprop="name" %}
@@ -58,7 +59,7 @@ layout: default
58
59
  <span class="mx-2">•</span>
59
60
  {% endif %}
60
61
 
61
- <!-- Publication Date -->
62
+ {% comment %} Publication Date {% endcomment %}
62
63
  {% if page.date %}
63
64
  <time class="note-date dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
64
65
  <i class="bi bi-calendar me-1"></i>
@@ -67,7 +68,7 @@ layout: default
67
68
  <span class="mx-2">•</span>
68
69
  {% endif %}
69
70
 
70
- <!-- Reading Time -->
71
+ {% comment %} Reading Time {% endcomment %}
71
72
  {% assign words = content | number_of_words %}
72
73
  {% assign minutes = words | divided_by: 200 %}
73
74
  {% if minutes < 1 %}{% assign minutes = 1 %}{% endif %}
@@ -76,7 +77,7 @@ layout: default
76
77
  {{ minutes }} min read
77
78
  </span>
78
79
 
79
- <!-- Last Modified -->
80
+ {% comment %} Last Modified {% endcomment %}
80
81
  {% if page.lastmod %}
81
82
  <span class="mx-2">•</span>
82
83
  <span class="note-updated" itemprop="dateModified" content="{{ page.lastmod | date_to_xmlschema }}">
@@ -85,7 +86,7 @@ layout: default
85
86
  </span>
86
87
  {% endif %}
87
88
 
88
- <!-- Difficulty Badge -->
89
+ {% comment %} Difficulty Badge {% endcomment %}
89
90
  {% if page.difficulty %}
90
91
  <span class="mx-2">•</span>
91
92
  <span class="note-difficulty">
@@ -103,7 +104,7 @@ layout: default
103
104
  {% endif %}
104
105
  </div>
105
106
 
106
- <!-- Tags -->
107
+ {% comment %} Tags {% endcomment %}
107
108
  {% comment %} Link tag badges only when a tags index exists (configurable via
108
109
  `tags_page`); otherwise render plain badges so remote-theme consumers
109
110
  without a /tags/ page don't get 404 links. See issue #204. {% endcomment %}
@@ -123,7 +124,7 @@ layout: default
123
124
  </div>
124
125
  {% endif %}
125
126
 
126
- <!-- Categories -->
127
+ {% comment %} Categories {% endcomment %}
127
128
  {% if page.categories and page.categories.size > 0 %}
128
129
  <div class="note-categories mb-3">
129
130
  <i class="bi bi-folder me-1"></i>
@@ -136,7 +137,7 @@ layout: default
136
137
  </div>
137
138
  {% endif %}
138
139
 
139
- <!-- Description -->
140
+ {% comment %} Description {% endcomment %}
140
141
  {% if page.description %}
141
142
  <div class="note-description lead mb-4" itemprop="description">
142
143
  {{ page.description }}
@@ -144,26 +145,26 @@ layout: default
144
145
  {% endif %}
145
146
  </header>
146
147
 
147
- <!-- ================================ -->
148
- <!-- NOTE CONTENT -->
149
- <!-- ================================ -->
148
+ {% comment %} ================================ {% endcomment %}
149
+ {% comment %} NOTE CONTENT {% endcomment %}
150
+ {% comment %} ================================ {% endcomment %}
150
151
  <div class="note-content e-content" itemprop="articleBody">
151
152
  {{ content }}
152
153
  </div>
153
154
 
154
- <!-- ================================ -->
155
- <!-- AUTHOR BIO SECTION -->
156
- <!-- ================================ -->
155
+ {% comment %} ================================ {% endcomment %}
156
+ {% comment %} AUTHOR BIO SECTION {% endcomment %}
157
+ {% comment %} ================================ {% endcomment %}
157
158
  {% if page.author and page.author_profile != false %}
158
159
  {% include components/author-bio.html author=page.author %}
159
160
  {% endif %}
160
161
 
161
- <!-- ================================ -->
162
- <!-- NOTE FOOTER -->
163
- <!-- ================================ -->
162
+ {% comment %} ================================ {% endcomment %}
163
+ {% comment %} NOTE FOOTER {% endcomment %}
164
+ {% comment %} ================================ {% endcomment %}
164
165
  <footer class="note-footer mt-5 pt-4 border-top">
165
166
 
166
- <!-- Share Buttons -->
167
+ {% comment %} Share Buttons {% endcomment %}
167
168
  {% if page.share != false %}
168
169
  <div class="share-buttons mb-4">
169
170
  <h5 class="mb-3">Share this note</h5>
@@ -190,7 +191,7 @@ layout: default
190
191
  </div>
191
192
  {% endif %}
192
193
 
193
- <!-- Related Notes -->
194
+ {% comment %} Related Notes {% endcomment %}
194
195
  {% if site.notes.size > 1 %}
195
196
  <div class="related-notes mt-5">
196
197
  <h5 class="mb-3">Related Notes</h5>
@@ -238,28 +239,28 @@ layout: default
238
239
  {% endif %}
239
240
  </footer>
240
241
 
241
- <!-- ================================ -->
242
- <!-- COMMENTS SECTION -->
243
- <!-- ================================ -->
242
+ {% comment %} ================================ {% endcomment %}
243
+ {% comment %} COMMENTS SECTION {% endcomment %}
244
+ {% comment %} ================================ {% endcomment %}
244
245
  {% if page.comments != false and site.giscus.enabled %}
245
246
  <div class="note-comments mt-5 pt-4 border-top">
246
247
  <h5 class="mb-4">Comments</h5>
247
248
  {% include content/giscus.html %}
248
249
  </div>
249
250
  {% endif %}
250
- <!-- ================================ -->
251
- <!-- BACKLINKS — "Linked mentions" -->
252
- <!-- ================================ -->
253
- <!-- Obsidian-style panel of pages that wiki-link or markdown-link to this note. -->
254
- <!-- Disable per-page with `backlinks: false` in front matter. -->
251
+ {% comment %} ================================ {% endcomment %}
252
+ {% comment %} BACKLINKS — "Linked mentions" {% endcomment %}
253
+ {% comment %} ================================ {% endcomment %}
254
+ {% comment %} Obsidian-style panel of pages that wiki-link or markdown-link to this note. {% endcomment %}
255
+ {% comment %} Disable per-page with `backlinks: false` in front matter. {% endcomment %}
255
256
  {% include content/backlinks.html %}
256
257
 
257
258
  </article>
258
259
 
259
- <!-- ================================ -->
260
- <!-- NAVIGATION -->
261
- <!-- ================================ -->
262
- <!-- Previous/Next Note Navigation -->
260
+ {% comment %} ================================ {% endcomment %}
261
+ {% comment %} NAVIGATION {% endcomment %}
262
+ {% comment %} ================================ {% endcomment %}
263
+ {% comment %} Previous/Next Note Navigation {% endcomment %}
263
264
  {% assign notes = site.notes | sort: 'date' | reverse %}
264
265
  {% assign current_index = nil %}
265
266
  {% for note in notes %}
@@ -304,7 +305,7 @@ layout: default
304
305
  </nav>
305
306
  {% endif %}
306
307
 
307
- <!-- Schema.org metadata -->
308
+ {% comment %} Schema.org metadata {% endcomment %}
308
309
  <script type="application/ld+json">
309
310
  {
310
311
  "@context": "https://schema.org",
@@ -2,7 +2,7 @@
2
2
  # Features: ZER0-012, ZER0-019, ZER0-035
3
3
  layout: default
4
4
  ---
5
- <!--
5
+ {% comment %}
6
6
  ===================================================================
7
7
  NOTEBOOK LAYOUT - Jupyter Notebook Display
8
8
  ===================================================================
@@ -32,21 +32,22 @@ layout: default
32
32
  - Rouge syntax highlighter (Jekyll default)
33
33
  - Bootstrap 5 components
34
34
  ===================================================================
35
- -->
35
+ {% endcomment %}
36
36
 
37
- <article id="main" class="notebook-article h-entry" role="main" itemscope itemtype="https://schema.org/TechArticle">
37
+ {% comment %} No main role and no generic main id — see article.html (issue #484). {% endcomment %}
38
+ <article class="notebook-article h-entry" itemscope itemtype="https://schema.org/TechArticle">
38
39
 
39
- <!-- ================================ -->
40
- <!-- NOTEBOOK HEADER -->
41
- <!-- ================================ -->
40
+ {% comment %} ================================ {% endcomment %}
41
+ {% comment %} NOTEBOOK HEADER {% endcomment %}
42
+ {% comment %} ================================ {% endcomment %}
42
43
  <header class="notebook-header mb-4">
43
44
  <h1 id="page-title" class="notebook-title p-name" itemprop="headline">
44
45
  {{ page.title }}
45
46
  </h1>
46
47
 
47
- <!-- Notebook Metadata -->
48
+ {% comment %} Notebook Metadata {% endcomment %}
48
49
  <div class="notebook-meta text-muted mb-3">
49
- <!-- Author -->
50
+ {% comment %} Author {% endcomment %}
50
51
  {% if page.author %}
51
52
  <span class="notebook-author" itemprop="author" itemscope itemtype="https://schema.org/Person">
52
53
  {% include components/author-card.html author=page.author style="inline" name_itemprop="name" %}
@@ -54,7 +55,7 @@ layout: default
54
55
  <span class="mx-2">•</span>
55
56
  {% endif %}
56
57
 
57
- <!-- Publication Date -->
58
+ {% comment %} Publication Date {% endcomment %}
58
59
  {% if page.date %}
59
60
  <time class="notebook-date dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
60
61
  <i class="bi bi-calendar me-1"></i>
@@ -63,7 +64,7 @@ layout: default
63
64
  <span class="mx-2">•</span>
64
65
  {% endif %}
65
66
 
66
- <!-- Reading Time -->
67
+ {% comment %} Reading Time {% endcomment %}
67
68
  {% assign words = content | number_of_words %}
68
69
  {% assign minutes = words | divided_by: 200 %}
69
70
  {% if minutes < 1 %}{% assign minutes = 1 %}{% endif %}
@@ -72,7 +73,7 @@ layout: default
72
73
  {{ minutes }} min read
73
74
  </span>
74
75
 
75
- <!-- Last Modified -->
76
+ {% comment %} Last Modified {% endcomment %}
76
77
  {% if page.lastmod %}
77
78
  <span class="mx-2">•</span>
78
79
  <span class="notebook-updated" itemprop="dateModified" content="{{ page.lastmod | date_to_xmlschema }}">
@@ -81,7 +82,7 @@ layout: default
81
82
  </span>
82
83
  {% endif %}
83
84
 
84
- <!-- Kernel Info -->
85
+ {% comment %} Kernel Info {% endcomment %}
85
86
  {% if page.jupyter_metadata %}
86
87
  <span class="mx-2">•</span>
87
88
  <span class="notebook-kernel">
@@ -91,7 +92,7 @@ layout: default
91
92
  {% endif %}
92
93
  </div>
93
94
 
94
- <!-- Tags -->
95
+ {% comment %} Tags {% endcomment %}
95
96
  {% comment %} Link tag badges only when a tags index exists (configurable via
96
97
  `tags_page`); otherwise render plain badges so remote-theme consumers
97
98
  without a /tags/ page don't get 404 links. See issue #204. {% endcomment %}
@@ -111,7 +112,7 @@ layout: default
111
112
  </div>
112
113
  {% endif %}
113
114
 
114
- <!-- Categories -->
115
+ {% comment %} Categories {% endcomment %}
115
116
  {% if page.categories and page.categories.size > 0 %}
116
117
  <div class="notebook-categories mb-3">
117
118
  <i class="bi bi-folder me-1"></i>
@@ -124,7 +125,7 @@ layout: default
124
125
  </div>
125
126
  {% endif %}
126
127
 
127
- <!-- Description -->
128
+ {% comment %} Description {% endcomment %}
128
129
  {% if page.description %}
129
130
  <div class="notebook-description lead mb-4" itemprop="description">
130
131
  {{ page.description }}
@@ -132,26 +133,26 @@ layout: default
132
133
  {% endif %}
133
134
  </header>
134
135
 
135
- <!-- ================================ -->
136
- <!-- NOTEBOOK CONTENT -->
137
- <!-- ================================ -->
136
+ {% comment %} ================================ {% endcomment %}
137
+ {% comment %} NOTEBOOK CONTENT {% endcomment %}
138
+ {% comment %} ================================ {% endcomment %}
138
139
  <div class="notebook-content e-content" itemprop="articleBody">
139
140
  {{ content }}
140
141
  </div>
141
142
 
142
- <!-- ================================ -->
143
- <!-- AUTHOR BIO SECTION -->
144
- <!-- ================================ -->
143
+ {% comment %} ================================ {% endcomment %}
144
+ {% comment %} AUTHOR BIO SECTION {% endcomment %}
145
+ {% comment %} ================================ {% endcomment %}
145
146
  {% if page.author and page.author_profile != false %}
146
147
  {% include components/author-bio.html author=page.author %}
147
148
  {% endif %}
148
149
 
149
- <!-- ================================ -->
150
- <!-- NOTEBOOK FOOTER -->
151
- <!-- ================================ -->
150
+ {% comment %} ================================ {% endcomment %}
151
+ {% comment %} NOTEBOOK FOOTER {% endcomment %}
152
+ {% comment %} ================================ {% endcomment %}
152
153
  <footer class="notebook-footer mt-5 pt-4 border-top">
153
154
 
154
- <!-- Share Buttons -->
155
+ {% comment %} Share Buttons {% endcomment %}
155
156
  {% if page.share != false %}
156
157
  <div class="share-buttons mb-4">
157
158
  <h5 class="mb-3">Share this notebook</h5>
@@ -172,7 +173,7 @@ layout: default
172
173
  </div>
173
174
  {% endif %}
174
175
 
175
- <!-- Download Original Notebook -->
176
+ {% comment %} Download Original Notebook {% endcomment %}
176
177
  <div class="download-notebook mb-4">
177
178
  <a href="https://raw.githubusercontent.com/{{ site.repository }}/{{ site.branch | default: 'main' }}/pages/_notebooks/{{ page.slug }}.ipynb"
178
179
  class="btn btn-outline-secondary btn-sm" download>
@@ -180,7 +181,7 @@ layout: default
180
181
  </a>
181
182
  </div>
182
183
 
183
- <!-- Related Notebooks -->
184
+ {% comment %} Related Notebooks {% endcomment %}
184
185
  {% if site.notebooks.size > 1 %}
185
186
  <div class="related-notebooks mt-5">
186
187
  <h5 class="mb-3">Related Notebooks</h5>
@@ -221,9 +222,9 @@ layout: default
221
222
  {% endif %}
222
223
  </footer>
223
224
 
224
- <!-- ================================ -->
225
- <!-- COMMENTS SECTION -->
226
- <!-- ================================ -->
225
+ {% comment %} ================================ {% endcomment %}
226
+ {% comment %} COMMENTS SECTION {% endcomment %}
227
+ {% comment %} ================================ {% endcomment %}
227
228
  {% if page.comments != false and site.giscus.enabled %}
228
229
  <div class="notebook-comments mt-5 pt-4 border-top">
229
230
  <h5 class="mb-4">Comments</h5>
@@ -233,10 +234,10 @@ layout: default
233
234
 
234
235
  </article>
235
236
 
236
- <!-- ================================ -->
237
- <!-- NAVIGATION -->
238
- <!-- ================================ -->
239
- <!-- Previous/Next Notebook Navigation -->
237
+ {% comment %} ================================ {% endcomment %}
238
+ {% comment %} NAVIGATION {% endcomment %}
239
+ {% comment %} ================================ {% endcomment %}
240
+ {% comment %} Previous/Next Notebook Navigation {% endcomment %}
240
241
  {% assign notebooks = site.notebooks | sort: 'date' | reverse %}
241
242
  {% assign current_index = nil %}
242
243
  {% for notebook in notebooks %}
@@ -281,7 +282,7 @@ layout: default
281
282
  </nav>
282
283
  {% endif %}
283
284
 
284
- <!-- Schema.org metadata -->
285
+ {% comment %} Schema.org metadata {% endcomment %}
285
286
  <script type="application/ld+json">
286
287
  {
287
288
  "@context": "https://schema.org",