jekyll-theme-zer0 1.29.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 (148) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +715 -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 +169 -18
  7. data/_data/consumers.yml +48 -5
  8. data/_data/features.yml +146 -20
  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 +122 -114
  14. data/_data/ui-text.yml +18 -0
  15. data/_includes/README.md +11 -1
  16. data/_includes/analytics/posthog.html +2 -2
  17. data/_includes/components/admin-links.html +2 -2
  18. data/_includes/components/admin-tabs.html +2 -2
  19. data/_includes/components/ai-chat.html +14 -11
  20. data/_includes/components/analytics-dashboard.html +8 -8
  21. data/_includes/components/author-bio.html +1 -1
  22. data/_includes/components/author-card.html +10 -2
  23. data/_includes/components/author-eeat.html +4 -4
  24. data/_includes/components/background-customizer.html +8 -8
  25. data/_includes/components/background-image.html +114 -0
  26. data/_includes/components/background-settings.html +28 -15
  27. data/_includes/components/collection-manager.html +5 -5
  28. data/_includes/components/component-showcase.html +13 -13
  29. data/_includes/components/config-editor.html +12 -12
  30. data/_includes/components/config-viewer.html +8 -8
  31. data/_includes/components/cookie-consent.html +11 -11
  32. data/_includes/components/cta-button.html +7 -2
  33. data/_includes/components/dev-shortcuts.html +7 -7
  34. data/_includes/components/env-dashboard.html +8 -8
  35. data/_includes/components/env-switcher.html +9 -9
  36. data/_includes/components/feature-card.html +2 -2
  37. data/_includes/components/halfmoon.html +2 -2
  38. data/_includes/components/info-section.html +36 -36
  39. data/_includes/components/js-cdn.html +15 -15
  40. data/_includes/components/language-toggle.html +4 -4
  41. data/_includes/components/mermaid.html +72 -435
  42. data/_includes/components/nanobar.html +5 -5
  43. data/_includes/components/nav-editor.html +2 -2
  44. data/_includes/components/nav-export.html +2 -2
  45. data/_includes/components/nav-overview.html +2 -2
  46. data/_includes/components/page-feedback.html +45 -30
  47. data/_includes/components/page-views-init.html +1 -1
  48. data/_includes/components/post-card.html +22 -22
  49. data/_includes/components/post-type-badge.html +2 -2
  50. data/_includes/components/powered-by.html +2 -2
  51. data/_includes/components/preview-image.html +6 -0
  52. data/_includes/components/quick-index.html +2 -2
  53. data/_includes/components/search-modal.html +27 -2
  54. data/_includes/components/searchbar.html +2 -2
  55. data/_includes/components/svg-background.html +2 -2
  56. data/_includes/components/theme-customizer.html +2 -2
  57. data/_includes/components/theme-info.html +6 -6
  58. data/_includes/components/theme-preview-gallery.html +22 -22
  59. data/_includes/content/giscus.html +2 -2
  60. data/_includes/content/intro.html +8 -8
  61. data/_includes/content/jsonld-faq.html +2 -2
  62. data/_includes/content/jsonld-software.html +2 -2
  63. data/_includes/content/seo.html +4 -4
  64. data/_includes/content/sitemap.html +27 -27
  65. data/_includes/content/toc.html +183 -183
  66. data/_includes/core/branding.html +6 -6
  67. data/_includes/core/console-capture.html +32 -74
  68. data/_includes/core/favicon.html +49 -7
  69. data/_includes/core/footer-fabs.html +17 -3
  70. data/_includes/core/footer.html +31 -18
  71. data/_includes/core/head.html +102 -90
  72. data/_includes/core/header.html +71 -52
  73. data/_includes/docs/bootstrap-docs.html +8 -8
  74. data/_includes/landing/landing-install-cards.html +2 -2
  75. data/_includes/landing/landing-quick-links.html +1 -1
  76. data/_includes/navigation/admin-nav.html +2 -2
  77. data/_includes/navigation/nav-tree.html +8 -8
  78. data/_includes/navigation/navbar.html +12 -12
  79. data/_includes/navigation/section-sidebar.html +16 -16
  80. data/_includes/navigation/sidebar-config.html +36 -2
  81. data/_includes/navigation/sidebar-left.html +15 -15
  82. data/_includes/navigation/sidebar-right.html +6 -6
  83. data/_includes/obsidian/full-graph.html +2 -2
  84. data/_includes/setup/claude-session.html +72 -0
  85. data/_includes/setup/prereq-checklist.html +90 -0
  86. data/_includes/setup/wizard.html +906 -291
  87. data/_includes/stats/stats-categories.html +8 -8
  88. data/_includes/stats/stats-header.html +14 -14
  89. data/_includes/stats/stats-metrics.html +12 -12
  90. data/_includes/stats/stats-no-data.html +12 -12
  91. data/_includes/stats/stats-overview.html +6 -6
  92. data/_includes/stats/stats-tags.html +8 -8
  93. data/_layouts/404.html +38 -24
  94. data/_layouts/admin.html +22 -22
  95. data/_layouts/article.html +39 -34
  96. data/_layouts/author.html +20 -20
  97. data/_layouts/authors.html +2 -2
  98. data/_layouts/book-abc.html +12 -12
  99. data/_layouts/book-story.html +15 -15
  100. data/_layouts/book.html +12 -12
  101. data/_layouts/collection.html +33 -33
  102. data/_layouts/cookbook.html +12 -12
  103. data/_layouts/default.html +27 -24
  104. data/_layouts/home.html +23 -23
  105. data/_layouts/index.html +10 -10
  106. data/_layouts/landing.html +17 -17
  107. data/_layouts/news.html +44 -44
  108. data/_layouts/note.html +38 -38
  109. data/_layouts/notebook.html +34 -34
  110. data/_layouts/recipe.html +24 -24
  111. data/_layouts/root.html +73 -55
  112. data/_layouts/section.html +23 -23
  113. data/_layouts/setup.html +3 -3
  114. data/_layouts/sitemap-collection.html +49 -49
  115. data/_layouts/stats.html +40 -40
  116. data/_layouts/tag.html +12 -12
  117. data/_layouts/welcome.html +21 -21
  118. data/_sass/components/_mermaid.scss +375 -0
  119. data/_sass/components/_setup-wizard.scss +569 -40
  120. data/_sass/core/_navbar.scss +11 -31
  121. data/_sass/layouts/_navbar-extras.scss +14 -4
  122. data/assets/css/main.scss +1 -0
  123. data/assets/js/ai-chat.js +47 -5
  124. data/assets/js/fleet-feedback-capture.js +124 -0
  125. data/assets/js/fleet-feedback.js +853 -0
  126. data/assets/js/mermaid-diagrams.js +1267 -0
  127. data/assets/js/modules/navigation/config.js +9 -6
  128. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  129. data/assets/js/modules/theme/appearance.js +8 -2
  130. data/assets/js/obsidian-wiki-links.js +8 -3
  131. data/assets/js/page-feedback.js +125 -192
  132. data/assets/js/search-modal.js +26 -0
  133. data/assets/js/setup-wizard.js +2112 -361
  134. data/assets/js/site-builder.js +1834 -0
  135. data/assets/js/ui-enhancements.js +11 -3
  136. data/scripts/README.md +15 -0
  137. data/scripts/ai/README.md +38 -0
  138. data/scripts/ai/api_call.rb +124 -0
  139. data/scripts/ai/usage.rb +314 -0
  140. data/scripts/ai/usage_report.rb +225 -0
  141. data/scripts/ci/test_visual_evidence_autogen.py +341 -0
  142. data/scripts/ci/visual_evidence_autogen.py +1060 -0
  143. data/scripts/content-review.rb +20 -1
  144. data/scripts/test/integration/mermaid +22 -8
  145. data/scripts/test/lib/run_tests.sh +1 -0
  146. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  147. data/scripts/translate.rb +23 -1
  148. metadata +19 -2
@@ -348,7 +348,26 @@ def check_quality(body, quality)
348
348
 
349
349
  # Bare URLs.
350
350
  if quality['flag_bare_urls']
351
- bare = strip_code_fences(body).scan(%r{(?<![("<\]])\bhttps?://[^\s)>\]]+}).reject { |u| u.include?('](') }
351
+ # Two sources of false positives this guards against:
352
+ # [http://x](http://x) — a CORRECT markdown link whose text is the URL.
353
+ # The lookbehind must exclude `[` too, or the link text is counted.
354
+ # <script>/<style> blocks and HTML attributes — pages that embed a config
355
+ # generator carry URLs in JS strings and markup, which are code, not prose.
356
+ # <code>http://…</code> — inline code in HTML syntax, which the markdown
357
+ # backtick form is already exempt from; the two should agree.
358
+ # Stripping markup in ONE pass leaves split or nested tags behind (CodeQL:
359
+ # incomplete multi-character sanitization). This is prose extraction for
360
+ # counting, never sanitization for output, but iterate to a fixpoint anyway
361
+ # so the result is exact. Each pass strictly shortens the string, so it
362
+ # terminates.
363
+ prose = strip_code_fences(body)
364
+ loop do
365
+ before = prose
366
+ prose = prose.gsub(%r{<(script|style|code|pre)\b[^>]*>.*?</\1\s*>}mi, ' ')
367
+ .gsub(/<[^<>]*>/, ' ')
368
+ break if prose == before
369
+ end
370
+ bare = prose.scan(%r{(?<![("<\[\]])\bhttps?://[^\s)>\]]+}).reject { |u| u.include?('](') }
352
371
  issues << Issue.new('info', 'quality', "#{bare.length} bare URL(s) — wrap as [text](url)") unless bare.empty?
353
372
  end
354
373
  issues
@@ -142,15 +142,16 @@ test_mermaid_init() {
142
142
  local url="$1"
143
143
  local description="$2"
144
144
 
145
- run_test "$description" "curl -s '$url' | grep -q 'mermaid.initialize'"
145
+ run_test "$description" "curl -s '$url' | grep -q 'mermaid-diagrams.js'"
146
146
  }
147
147
 
148
- # Test diagram rendering
148
+ # Test diagram presence (a ```mermaid fence is served as code.language-mermaid;
149
+ # the deferred script turns it into a figure in the browser)
149
150
  test_diagram_rendering() {
150
151
  local url="$1"
151
152
  local description="$2"
152
-
153
- run_test "$description" "curl -s '$url' | grep -q 'class=\"mermaid\"'"
153
+
154
+ run_test "$description" "curl -s '$url' | grep -q 'language-mermaid'"
154
155
  }
155
156
 
156
157
  # Main test execution
@@ -179,16 +180,29 @@ main() {
179
180
  # Mermaid include file tests
180
181
  log_info "Testing Mermaid include file..."
181
182
 
182
- test_file_content "_includes/components/mermaid.html" "site.mermaid.src" "Mermaid script from _config (local vendor path)"
183
- test_file_content "_includes/components/mermaid.html" "mermaid.initialize" "Mermaid initialization script"
184
- test_file_content "_includes/components/mermaid.html" "data-bs-theme" "Bootstrap theme detection configured"
185
- test_file_content "_includes/components/mermaid.html" "getMermaidConfig" "Adaptive light/dark theming configured"
183
+ test_file_content "_includes/components/mermaid.html" "mm.src" "Mermaid script from _config (local vendor path)"
184
+ test_file_content "_includes/components/mermaid.html" "mermaidConfig" "Diagram config block emitted for the behaviour script"
185
+ test_file_content "_includes/components/mermaid.html" "mermaid-diagrams.js" "Behaviour script loaded after the vendor bundle"
186
+ test_file_content "_includes/components/mermaid.html" "defer" "Scripts are deferred (never block parsing)"
187
+
188
+ # Behaviour script (assets/js/mermaid-diagrams.js)
189
+ log_info "Testing diagram behaviour script..."
190
+
191
+ test_file_exists "assets/js/mermaid-diagrams.js" "Diagram behaviour script exists"
192
+ test_file_content "assets/js/mermaid-diagrams.js" "mermaid.initialize" "Mermaid initialization"
193
+ test_file_content "assets/js/mermaid-diagrams.js" "data-bs-theme" "Colour-mode change observed for re-render"
194
+ test_file_content "assets/js/mermaid-diagrams.js" "data-theme-skin" "Skin change observed for re-render"
195
+ test_file_content "assets/js/mermaid-diagrams.js" "themeVariables" "Palette derived into Mermaid theme variables"
196
+ test_file_content "assets/js/mermaid-diagrams.js" "zer0Mermaid" "Public API exposed"
197
+ test_file_exists "_sass/components/_mermaid.scss" "Diagram figure styles exist"
198
+ test_file_content "assets/css/main.scss" "components/mermaid" "Diagram styles imported by the stylesheet manifest"
186
199
 
187
200
  # Documentation tests
188
201
  log_info "Testing documentation..."
189
202
 
190
203
  test_file_content "pages/_docs/features/mermaid-diagrams.md" "mermaid: true" "Main docs have front matter"
191
204
  test_file_content "pages/_docs/features/mermaid-diagrams.md" "graph TD" "Main docs have examples"
205
+ test_file_content "pages/_docs/features/mermaid-diagrams.md" "accTitle" "Main docs cover accessible captions"
192
206
 
193
207
  # Server tests (if not quick mode)
194
208
  if [ "$QUICK" = false ]; then
@@ -132,6 +132,7 @@ main() {
132
132
  source "$TEST_DIR/test_pixelate_images.sh"
133
133
  source "$TEST_DIR/test_content_review.sh"
134
134
  source "$TEST_DIR/test_agent_review_result.sh"
135
+ source "$TEST_DIR/test_visual_evidence_autogen.sh"
135
136
 
136
137
  # Summary
137
138
  echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
@@ -0,0 +1,24 @@
1
+ #!/bin/bash
2
+
3
+ # Bridge for scripts/ci/test_visual_evidence_autogen.py (ZER0-085).
4
+ #
5
+ # The planner/decider behind visual-evidence-autogen.yml lives in
6
+ # scripts/ci/visual_evidence_autogen.py, next to the other CI helpers, and its
7
+ # tests are Python beside it. This wrapper puts them on the CI path: run_tests.sh
8
+ # sources this file, and ./scripts/bin/test runs run_tests.sh on every PR — the
9
+ # same arrangement as test_agent_review_result.sh, for the same reason (a test
10
+ # suite no runner invokes rots silently).
11
+
12
+ VEA_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
13
+
14
+ print_suite_header "Visual-evidence autogen planner (scripts/ci/visual_evidence_autogen.py)"
15
+
16
+ if command -v python3 >/dev/null 2>&1; then
17
+ vea_output="$(python3 "$VEA_ROOT/scripts/ci/test_visual_evidence_autogen.py" 2>&1)"
18
+ vea_status=$?
19
+ echo "$vea_output"
20
+ assert_equals "0" "$vea_status" \
21
+ "scripts/ci/test_visual_evidence_autogen.py passes (plan/decide/contract guards)"
22
+ else
23
+ echo "python3 not available — skipping the visual-evidence autogen tests"
24
+ fi
data/scripts/translate.rb CHANGED
@@ -170,8 +170,30 @@ module Zer0Translate
170
170
  masked
171
171
  end
172
172
 
173
+ # A masked span can carry a placeholder minted by an earlier pattern: a
174
+ # Liquid expression inside a link destination (`](⟦3⟧)`), or inside an
175
+ # inline code span (`` `⟦8⟧` ``). `gsub` never rescans its own replacement
176
+ # text, so one pass restores the outer span and strands the inner token as
177
+ # a literal ⟦N⟧ in the published page. Substitute until the text stops
178
+ # changing — nesting can only run as deep as the pattern list is long — and
179
+ # refuse to hand back anything still holding a placeholder, so a corrupt
180
+ # page fails its job instead of shipping.
173
181
  def unmask(text)
174
- text.gsub(PLACEHOLDER_RE) { |token| @map.fetch(token, token) }
182
+ result = text
183
+ (INLINE_PATTERNS.length + 1).times do
184
+ expanded = result.gsub(PLACEHOLDER_RE) { |token| @map.fetch(token, token) }
185
+ break if expanded == result
186
+
187
+ result = expanded
188
+ end
189
+
190
+ leftover = result.scan(PLACEHOLDER_RE).uniq
191
+ unless leftover.empty?
192
+ raise Translator::TranslationError,
193
+ "unresolved placeholder(s) #{leftover.join(', ')} after unmasking"
194
+ end
195
+
196
+ result
175
197
  end
176
198
  end
177
199
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-theme-zer0
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.29.0
4
+ version: 1.30.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amr Abdel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-09-01 00:00:00.000000000 Z
11
+ date: 2026-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -79,6 +79,7 @@ files:
79
79
  - README.md
80
80
  - _data/README.md
81
81
  - _data/ai.yml
82
+ - _data/ai_pricing.yml
82
83
  - _data/authors.yml
83
84
  - _data/backlog.yml
84
85
  - _data/consumers.yml
@@ -109,6 +110,7 @@ files:
109
110
  - _data/roadmap_plan.yml
110
111
  - _data/routing.yml
111
112
  - _data/series.yml
113
+ - _data/site_builder.yml
112
114
  - _data/statistics_config.yml
113
115
  - _data/theme-manifest.yml
114
116
  - _data/theme_backgrounds.yml
@@ -131,6 +133,7 @@ files:
131
133
  - _includes/components/author-card.html
132
134
  - _includes/components/author-eeat.html
133
135
  - _includes/components/background-customizer.html
136
+ - _includes/components/background-image.html
134
137
  - _includes/components/background-settings.html
135
138
  - _includes/components/book-card.html
136
139
  - _includes/components/book-nav.html
@@ -242,6 +245,8 @@ files:
242
245
  - _includes/navigation/unified-drawer.html
243
246
  - _includes/obsidian/full-graph.html
244
247
  - _includes/search-data.json
248
+ - _includes/setup/claude-session.html
249
+ - _includes/setup/prereq-checklist.html
245
250
  - _includes/setup/wizard.html
246
251
  - _includes/stats/README.md
247
252
  - _includes/stats/stats-categories.html
@@ -290,6 +295,7 @@ files:
290
295
  - _sass/components/_content-tables.scss
291
296
  - _sass/components/_cookie-banner.scss
292
297
  - _sass/components/_footer.scss
298
+ - _sass/components/_mermaid.scss
293
299
  - _sass/components/_notes-index.scss
294
300
  - _sass/components/_notes.scss
295
301
  - _sass/components/_page-feedback.scss
@@ -356,7 +362,10 @@ files:
356
362
  - assets/js/code-copy.js
357
363
  - assets/js/config-utility.js
358
364
  - assets/js/docs.min.js
365
+ - assets/js/fleet-feedback-capture.js
366
+ - assets/js/fleet-feedback.js
359
367
  - assets/js/halfmoon.js
368
+ - assets/js/mermaid-diagrams.js
360
369
  - assets/js/modules/navigation/config.js
361
370
  - assets/js/modules/navigation/focus.js
362
371
  - assets/js/modules/navigation/gestures.js
@@ -388,6 +397,7 @@ files:
388
397
  - assets/js/setup-wizard.js
389
398
  - assets/js/share-actions.js
390
399
  - assets/js/side-bar-folders.js
400
+ - assets/js/site-builder.js
391
401
  - assets/js/skin-editor.js
392
402
  - assets/js/stats.js
393
403
  - assets/js/table-copy.js
@@ -433,6 +443,10 @@ files:
433
443
  - assets/vendor/mathjax/es5/tex-mml-chtml.js
434
444
  - assets/vendor/mermaid/mermaid.min.js
435
445
  - scripts/README.md
446
+ - scripts/ai/README.md
447
+ - scripts/ai/api_call.rb
448
+ - scripts/ai/usage.rb
449
+ - scripts/ai/usage_report.rb
436
450
  - scripts/analyze-commits.sh
437
451
  - scripts/bin/audit-consumer
438
452
  - scripts/bin/build
@@ -447,6 +461,8 @@ files:
447
461
  - scripts/ci/agent_review_result.py
448
462
  - scripts/ci/classify_changes.py
449
463
  - scripts/ci/test_agent_review_result.py
464
+ - scripts/ci/test_visual_evidence_autogen.py
465
+ - scripts/ci/visual_evidence_autogen.py
450
466
  - scripts/content-review.rb
451
467
  - scripts/convert-notebooks.sh
452
468
  - scripts/design-system-check.rb
@@ -588,6 +604,7 @@ files:
588
604
  - scripts/test/lib/test_pixelate_images.sh
589
605
  - scripts/test/lib/test_validation.sh
590
606
  - scripts/test/lib/test_version.sh
607
+ - scripts/test/lib/test_visual_evidence_autogen.sh
591
608
  - scripts/test/theme/validate
592
609
  - scripts/translate.rb
593
610
  - scripts/update-preview-paths.sh