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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1143 -13
- data/_data/README.md +2 -0
- data/_data/ai.yml +5 -3
- data/_data/ai_pricing.yml +36 -0
- data/_data/backlog.yml +507 -2
- data/_data/consumers.yml +157 -9
- data/_data/features.yml +303 -20
- data/_data/feedback_types.yml +17 -12
- data/_data/i18n/fr.yml +12 -7
- data/_data/i18n/manifest.yml +39 -12
- data/_data/ingredient_densities.yml +122 -0
- data/_data/landing.yml +5 -2
- data/_data/navigation/main.yml +16 -0
- data/_data/navigation/quickstart.yml +4 -0
- data/_data/recipe_courses.yml +64 -0
- data/_data/site_builder.yml +874 -0
- data/_data/theme-manifest.yml +160 -124
- data/_data/ui-text.yml +26 -0
- data/_includes/README.md +26 -2
- data/_includes/analytics/posthog.html +2 -2
- data/_includes/components/admin-links.html +2 -2
- data/_includes/components/admin-tabs.html +2 -2
- data/_includes/components/ai-chat.html +14 -11
- data/_includes/components/analytics-dashboard.html +8 -8
- data/_includes/components/author-bio.html +1 -1
- data/_includes/components/author-card.html +10 -2
- data/_includes/components/author-eeat.html +4 -4
- data/_includes/components/background-customizer.html +10 -10
- data/_includes/components/background-image.html +114 -0
- data/_includes/components/background-settings.html +28 -15
- data/_includes/components/collection-manager.html +5 -5
- data/_includes/components/component-showcase.html +13 -13
- data/_includes/components/config-editor.html +12 -12
- data/_includes/components/config-viewer.html +8 -8
- data/_includes/components/cookie-consent.html +15 -15
- data/_includes/components/cta-button.html +7 -2
- data/_includes/components/dev-shortcuts.html +7 -7
- data/_includes/components/env-dashboard.html +8 -8
- data/_includes/components/env-switcher.html +9 -9
- data/_includes/components/feature-card.html +2 -2
- data/_includes/components/halfmoon.html +2 -2
- data/_includes/components/info-section.html +42 -37
- data/_includes/components/js-cdn.html +15 -15
- data/_includes/components/language-toggle.html +168 -21
- data/_includes/components/mermaid.html +72 -435
- data/_includes/components/nanobar.html +5 -5
- data/_includes/components/nav-editor.html +2 -2
- data/_includes/components/nav-export.html +2 -2
- data/_includes/components/nav-overview.html +2 -2
- data/_includes/components/page-feedback.html +45 -30
- data/_includes/components/page-views-init.html +55 -0
- data/_includes/components/page-views.html +33 -0
- data/_includes/components/post-card.html +22 -22
- data/_includes/components/post-type-badge.html +2 -2
- data/_includes/components/powered-by.html +2 -2
- data/_includes/components/preview-image.html +6 -0
- data/_includes/components/quick-index.html +2 -2
- data/_includes/components/recipe-card.html +67 -0
- data/_includes/components/recipe-duration.html +50 -0
- data/_includes/components/recipe-grams.html +58 -0
- data/_includes/components/recipe-index.html +96 -0
- data/_includes/components/recipe-ingredients.html +90 -0
- data/_includes/components/recipe-meta.html +96 -0
- data/_includes/components/recipe-nutrition.html +57 -0
- data/_includes/components/recipe-qty.html +73 -0
- data/_includes/components/recipe-ratio.html +151 -0
- data/_includes/components/recipe-scaler.html +73 -0
- data/_includes/components/recipe-steps.html +86 -0
- data/_includes/components/recipe-temp.html +45 -0
- data/_includes/components/search-modal.html +29 -4
- data/_includes/components/searchbar.html +2 -2
- data/_includes/components/shortcuts-modal.html +3 -0
- data/_includes/components/svg-background.html +2 -2
- data/_includes/components/theme-customizer.html +2 -2
- data/_includes/components/theme-info.html +14 -7
- data/_includes/components/theme-preview-gallery.html +22 -22
- data/_includes/content/giscus.html +2 -2
- data/_includes/content/intro.html +8 -8
- data/_includes/content/jsonld-faq.html +2 -2
- data/_includes/content/jsonld-software.html +24 -5
- data/_includes/content/seo.html +4 -4
- data/_includes/content/sitemap.html +27 -27
- data/_includes/content/toc.html +183 -183
- data/_includes/core/branding.html +6 -6
- data/_includes/core/console-capture.html +32 -74
- data/_includes/core/favicon.html +49 -7
- data/_includes/core/footer-fabs.html +17 -3
- data/_includes/core/footer.html +49 -34
- data/_includes/core/head.html +110 -86
- data/_includes/core/header.html +76 -54
- data/_includes/docs/bootstrap-docs.html +8 -8
- data/_includes/landing/landing-install-cards.html +2 -2
- data/_includes/landing/landing-quick-links.html +1 -1
- data/_includes/navigation/admin-nav.html +2 -2
- data/_includes/navigation/nav-tree.html +8 -8
- data/_includes/navigation/navbar.html +12 -12
- data/_includes/navigation/section-sidebar.html +109 -27
- data/_includes/navigation/sidebar-config.html +36 -2
- data/_includes/navigation/sidebar-left.html +17 -16
- data/_includes/navigation/sidebar-right.html +8 -7
- data/_includes/obsidian/full-graph.html +2 -2
- data/_includes/setup/claude-session.html +72 -0
- data/_includes/setup/prereq-checklist.html +90 -0
- data/_includes/setup/wizard.html +924 -222
- data/_includes/stats/stats-categories.html +8 -8
- data/_includes/stats/stats-header.html +14 -14
- data/_includes/stats/stats-metrics.html +14 -14
- data/_includes/stats/stats-no-data.html +12 -12
- data/_includes/stats/stats-overview.html +6 -6
- data/_includes/stats/stats-tags.html +8 -8
- data/_layouts/404.html +38 -24
- data/_layouts/README.md +2 -0
- data/_layouts/admin.html +24 -24
- data/_layouts/article.html +43 -33
- data/_layouts/author.html +20 -20
- data/_layouts/authors.html +2 -2
- data/_layouts/book-abc.html +12 -12
- data/_layouts/book-story.html +15 -15
- data/_layouts/book.html +12 -12
- data/_layouts/collection.html +33 -33
- data/_layouts/cookbook.html +88 -0
- data/_layouts/default.html +31 -28
- data/_layouts/home.html +23 -23
- data/_layouts/index.html +10 -10
- data/_layouts/landing.html +17 -17
- data/_layouts/news.html +44 -44
- data/_layouts/note.html +38 -38
- data/_layouts/notebook.html +34 -34
- data/_layouts/recipe.html +274 -0
- data/_layouts/root.html +92 -55
- data/_layouts/section.html +62 -33
- data/_layouts/setup.html +3 -3
- data/_layouts/sitemap-collection.html +49 -49
- data/_layouts/stats.html +40 -40
- data/_layouts/tag.html +12 -12
- data/_layouts/welcome.html +21 -21
- data/_sass/components/_callout.scss +1 -1
- data/_sass/components/_footer.scss +37 -1
- data/_sass/components/_mermaid.scss +375 -0
- data/_sass/components/_page-views.scss +36 -0
- data/_sass/components/_recipe.scss +506 -0
- data/_sass/components/_setup-wizard.scss +764 -0
- data/_sass/components/_ui-enhancements.scss +6 -6
- data/_sass/core/_navbar.scss +261 -46
- data/_sass/layouts/_landing.scss +2 -2
- data/_sass/layouts/_navbar-extras.scss +14 -4
- data/_sass/tokens/_color.scss +6 -0
- data/_sass/tokens/_index.scss +2 -0
- data/_sass/tokens/_radius.scss +21 -0
- data/_sass/tokens/_typography.scss +4 -0
- data/_sass/utilities/_focus.scss +14 -0
- data/assets/css/main.scss +4 -0
- data/assets/js/ai-chat.js +47 -5
- data/assets/js/fleet-feedback-capture.js +124 -0
- data/assets/js/fleet-feedback.js +853 -0
- data/assets/js/mermaid-diagrams.js +1267 -0
- data/assets/js/modules/navigation/config.js +9 -6
- data/assets/js/modules/navigation/navbar.js +55 -0
- data/assets/js/modules/navigation/scroll-spy.js +315 -80
- data/assets/js/modules/theme/appearance.js +8 -2
- data/assets/js/obsidian-wiki-links.js +8 -3
- data/assets/js/page-feedback.js +125 -192
- data/assets/js/page-views.js +372 -0
- data/assets/js/recipe-scaler.js +501 -0
- data/assets/js/search-modal.js +36 -0
- data/assets/js/setup-wizard.js +2279 -226
- data/assets/js/site-builder.js +1834 -0
- data/assets/js/ui-enhancements.js +11 -3
- data/scripts/README.md +44 -0
- data/scripts/ai/README.md +38 -0
- data/scripts/ai/api_call.rb +124 -0
- data/scripts/ai/usage.rb +314 -0
- data/scripts/ai/usage_report.rb +225 -0
- data/scripts/bin/audit-consumer +39 -7
- data/scripts/bin/giscus-discussions +213 -14
- data/scripts/bin/manifest +35 -12
- data/scripts/ci/agent_review_result.py +164 -0
- data/scripts/ci/test_agent_review_result.py +172 -0
- data/scripts/ci/test_visual_evidence_autogen.py +341 -0
- data/scripts/ci/visual_evidence_autogen.py +1060 -0
- data/scripts/content-review.rb +20 -1
- data/scripts/design-system-check.rb +170 -0
- data/scripts/lib/audit.sh +42 -2
- data/scripts/lint-liquid-raw.rb +137 -0
- data/scripts/test/integration/mermaid +22 -8
- data/scripts/test/lib/run_tests.sh +3 -1
- data/scripts/test/lib/test_agent_review_result.sh +27 -0
- data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
- data/scripts/translate.rb +94 -16
- metadata +48 -2
data/_layouts/article.html
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
128
|
+
{% comment %} Post Metadata {% endcomment %}
|
|
129
129
|
<div class="post-meta text-muted mb-3">
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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>
|
data/_layouts/authors.html
CHANGED
|
@@ -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">
|
data/_layouts/book-abc.html
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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">
|
data/_layouts/book-story.html
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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">
|
data/_layouts/collection.html
CHANGED
|
@@ -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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
92
|
+
{% comment %} Bootstrap card with equal height for consistent layout {% endcomment %}
|
|
93
93
|
<div class="card h-100">
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
104
|
-
|
|
102
|
+
{% comment %} ====================== {% endcomment %}
|
|
103
|
+
{% comment %} CARD CONTENT SECTION {% endcomment %}
|
|
104
|
+
{% comment %} ====================== {% endcomment %}
|
|
105
105
|
<div class="card-body">
|
|
106
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
|
|
119
|
+
{% comment %} ====================== {% endcomment %}
|
|
120
|
+
{% comment %} CARD FOOTER SECTION {% endcomment %}
|
|
121
|
+
{% comment %} ====================== {% endcomment %}
|
|
122
122
|
<div class="card-footer">
|
|
123
|
-
|
|
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>
|