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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +886 -2
- data/_data/README.md +2 -0
- data/_data/ai.yml +5 -3
- data/_data/ai_pricing.yml +36 -0
- data/_data/backlog.yml +196 -22
- data/_data/consumers.yml +147 -5
- data/_data/features.yml +147 -21
- data/_data/feedback_types.yml +17 -12
- data/_data/landing.yml +5 -2
- data/_data/navigation/quickstart.yml +4 -0
- data/_data/site_builder.yml +874 -0
- data/_data/theme-manifest.yml +132 -122
- data/_data/ui-text.yml +19 -0
- data/_includes/README.md +11 -1
- data/_includes/analytics/posthog.html +30 -11
- data/_includes/components/README.md +1 -1
- 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 +8 -8
- data/_includes/components/background-image.html +120 -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 +41 -41
- 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 +36 -36
- data/_includes/components/js-cdn.html +15 -15
- data/_includes/components/language-toggle.html +4 -4
- data/_includes/components/mermaid.html +79 -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 +1 -1
- 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 +28 -3
- data/_includes/components/quick-index.html +2 -2
- data/_includes/components/search-modal.html +27 -2
- data/_includes/components/searchbar.html +2 -2
- data/_includes/components/svg-background.html +2 -2
- data/_includes/components/theme-customizer.html +2 -2
- data/_includes/components/theme-info.html +6 -6
- data/_includes/components/theme-preview-gallery.html +23 -23
- data/_includes/content/giscus.html +2 -2
- data/_includes/content/intro.html +15 -8
- data/_includes/content/jsonld-faq.html +2 -2
- data/_includes/content/jsonld-software.html +2 -2
- data/_includes/content/seo.html +12 -4
- data/_includes/content/sitemap.html +247 -290
- data/_includes/content/toc.html +183 -183
- data/_includes/core/branding.html +13 -20
- 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 +31 -18
- data/_includes/core/head.html +128 -92
- data/_includes/core/header.html +85 -54
- data/_includes/core/tokens-inline.html +16 -1
- 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 +21 -18
- data/_includes/navigation/section-sidebar.html +16 -16
- data/_includes/navigation/sidebar-config.html +36 -2
- data/_includes/navigation/sidebar-left.html +15 -15
- data/_includes/navigation/sidebar-right.html +6 -6
- 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 +910 -291
- data/_includes/stats/stats-categories.html +8 -8
- data/_includes/stats/stats-header.html +14 -14
- data/_includes/stats/stats-metrics.html +12 -12
- 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/admin.html +22 -22
- data/_layouts/article.html +54 -37
- 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 +12 -12
- data/_layouts/default.html +27 -24
- data/_layouts/home.html +36 -24
- data/_layouts/index.html +10 -10
- data/_layouts/landing.html +17 -17
- data/_layouts/news.html +44 -44
- data/_layouts/note.html +40 -39
- data/_layouts/notebook.html +36 -35
- data/_layouts/recipe.html +24 -24
- data/_layouts/root.html +95 -55
- data/_layouts/section.html +23 -23
- 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/_cookie-banner.scss +48 -0
- data/_sass/components/_mermaid.scss +375 -0
- data/_sass/components/_setup-wizard.scss +588 -41
- data/_sass/components/_ui-enhancements.scss +11 -0
- data/_sass/core/_navbar.scss +147 -100
- data/_sass/core/_sidebar-extras.scss +2 -14
- data/_sass/core/code-copy.scss +27 -8
- data/_sass/layouts/_navbar-extras.scss +14 -4
- data/assets/css/extension-points-demo.css +27 -0
- data/assets/css/main.scss +1 -0
- data/assets/data/wiki-index.json +19 -0
- data/assets/js/ai-chat.js +47 -5
- data/assets/js/auto-hide-nav.js +53 -13
- data/assets/js/code-copy.js +72 -1
- data/assets/js/extension-points-demo.js +48 -0
- data/assets/js/fleet-feedback-capture.js +124 -0
- data/assets/js/fleet-feedback.js +853 -0
- data/assets/js/mermaid-diagrams.js +1373 -0
- data/assets/js/modules/navigation/config.js +9 -6
- data/assets/js/modules/navigation/scroll-spy.js +315 -80
- data/assets/js/modules/theme/appearance.js +8 -2
- data/assets/js/obsidian-local-graph.js +27 -5
- data/assets/js/obsidian-wiki-links.js +8 -3
- data/assets/js/page-feedback.js +125 -192
- data/assets/js/search-modal.js +26 -0
- data/assets/js/setup-wizard.js +2119 -363
- data/assets/js/site-builder.js +1834 -0
- data/assets/js/ui-enhancements.js +11 -3
- data/scripts/README.md +15 -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/ci/test_visual_evidence_autogen.py +403 -0
- data/scripts/ci/visual_evidence_autogen.py +1070 -0
- data/scripts/content-review.rb +20 -1
- data/scripts/features/install-preview-generator +1 -1
- data/scripts/lib/README.md +12 -0
- data/scripts/lib/preview_generator.py +2 -2
- data/scripts/test/integration/mermaid +22 -8
- data/scripts/test/lib/run_tests.sh +1 -0
- data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
- data/scripts/translate.rb +23 -1
- metadata +21 -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.
|
|
@@ -76,7 +76,12 @@ layout: default
|
|
|
76
76
|
{% endif %}
|
|
77
77
|
{% endif %}
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
{% comment %} No main role and no generic main id on this element: root.html already
|
|
80
|
+
provides the page's single <main id="main-content"> landmark, and a main role here
|
|
81
|
+
both duplicated it and suppressed this element's native `article` landmark (issue
|
|
82
|
+
#484, the same class of defect as #299). The generic id had no referents either —
|
|
83
|
+
the skip link targets #main-content. Asserted by test/visual/core/landmarks.spec.js. {% endcomment %}
|
|
84
|
+
<article class="post h-entry" itemscope itemtype="https://schema.org/BlogPosting">
|
|
80
85
|
|
|
81
86
|
{% comment %} ================================ {% endcomment %}
|
|
82
87
|
{% comment %} BREAKING NEWS ALERT BANNER {% endcomment %}
|
|
@@ -93,9 +98,9 @@ layout: default
|
|
|
93
98
|
</div>
|
|
94
99
|
{% endif %}
|
|
95
100
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
{% comment %} ================================ {% endcomment %}
|
|
102
|
+
{% comment %} ARTICLE HEADER {% endcomment %}
|
|
103
|
+
{% comment %} ================================ {% endcomment %}
|
|
99
104
|
<header class="post-header mb-4">
|
|
100
105
|
|
|
101
106
|
{% comment %} Post Type Badge {% endcomment %}
|
|
@@ -125,9 +130,9 @@ layout: default
|
|
|
125
130
|
<p class="lead text-muted">{{ page.sub-title }}</p>
|
|
126
131
|
{% endif %}
|
|
127
132
|
|
|
128
|
-
|
|
133
|
+
{% comment %} Post Metadata {% endcomment %}
|
|
129
134
|
<div class="post-meta text-muted mb-3">
|
|
130
|
-
|
|
135
|
+
{% comment %} Author {% endcomment %}
|
|
131
136
|
{% if page.author %}
|
|
132
137
|
<span class="post-author" itemprop="author" itemscope itemtype="https://schema.org/Person">
|
|
133
138
|
{% include components/author-card.html author=page.author style="inline" name_itemprop="name" %}
|
|
@@ -135,7 +140,7 @@ layout: default
|
|
|
135
140
|
<span class="mx-2">•</span>
|
|
136
141
|
{% endif %}
|
|
137
142
|
|
|
138
|
-
|
|
143
|
+
{% comment %} Publication Date {% endcomment %}
|
|
139
144
|
{% if page.date %}
|
|
140
145
|
<time class="post-date dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
|
|
141
146
|
<i class="bi bi-calendar me-1"></i>
|
|
@@ -144,7 +149,7 @@ layout: default
|
|
|
144
149
|
<span class="mx-2">•</span>
|
|
145
150
|
{% endif %}
|
|
146
151
|
|
|
147
|
-
|
|
152
|
+
{% comment %} Reading Time {% endcomment %}
|
|
148
153
|
{% assign words = content | number_of_words %}
|
|
149
154
|
{% assign minutes = words | divided_by: 200 %}
|
|
150
155
|
{% if minutes < 1 %}{% assign minutes = 1 %}{% endif %}
|
|
@@ -153,12 +158,12 @@ layout: default
|
|
|
153
158
|
{{ minutes }} min read
|
|
154
159
|
</span>
|
|
155
160
|
|
|
156
|
-
|
|
161
|
+
{% comment %} Page Views {% endcomment %}
|
|
157
162
|
{% comment %} The badge ships hidden and carries its own leading separator,
|
|
158
163
|
so a page with no count yet leaves no dangling "•" in the meta row. {% endcomment %}
|
|
159
164
|
{% include components/page-views.html separator=true %}
|
|
160
165
|
|
|
161
|
-
|
|
166
|
+
{% comment %} Last Modified {% endcomment %}
|
|
162
167
|
{% if page.lastmod %}
|
|
163
168
|
<span class="mx-2">•</span>
|
|
164
169
|
<span class="post-updated" itemprop="dateModified" content="{{ page.lastmod | date_to_xmlschema }}">
|
|
@@ -168,7 +173,7 @@ layout: default
|
|
|
168
173
|
{% endif %}
|
|
169
174
|
</div>
|
|
170
175
|
|
|
171
|
-
|
|
176
|
+
{% comment %} Category Link {% endcomment %}
|
|
172
177
|
{% comment %} Category base is configurable (`category_base`, default `/news`).
|
|
173
178
|
Only link the badge when that category index page actually exists in the
|
|
174
179
|
build; on a remote-theme Pages consumer the category section is
|
|
@@ -199,7 +204,7 @@ layout: default
|
|
|
199
204
|
</div>
|
|
200
205
|
{% endif %}
|
|
201
206
|
|
|
202
|
-
|
|
207
|
+
{% comment %} Tags {% endcomment %}
|
|
203
208
|
{% comment %} Only link tag badges when a tags index page actually exists in
|
|
204
209
|
the build (configurable via `tags_page`, default `/tags/`). On a
|
|
205
210
|
remote-theme Pages consumer the tags page is plugin/page-generated and
|
|
@@ -234,6 +239,10 @@ layout: default
|
|
|
234
239
|
post_type defaults (issue #303).
|
|
235
240
|
Nested ifs keep the "only when page.preview exists" guard intact (Liquid has
|
|
236
241
|
no parentheses, so a flat `a or b and c` would misgroup).
|
|
242
|
+
The hero is the above-the-fold LCP element, so it loads eagerly at high
|
|
243
|
+
priority (the include defaults to lazy); its box is reserved in CSS by
|
|
244
|
+
`.featured-hero img` (components/_ui-enhancements.scss), not by width/height
|
|
245
|
+
attributes, because preview assets vary in shape (issue #485).
|
|
237
246
|
{% endcomment %}
|
|
238
247
|
{% assign show_hero = false %}
|
|
239
248
|
{% if page.preview %}
|
|
@@ -247,7 +256,10 @@ layout: default
|
|
|
247
256
|
src=page.preview
|
|
248
257
|
alt=page.title
|
|
249
258
|
class="w-100 rounded-3 shadow"
|
|
250
|
-
style="max-height: 500px; object-fit: cover;"
|
|
259
|
+
style="max-height: 500px; object-fit: cover;"
|
|
260
|
+
loading="eager"
|
|
261
|
+
fetchpriority="high"
|
|
262
|
+
decoding="async"
|
|
251
263
|
%}
|
|
252
264
|
{% if page.preview_caption %}
|
|
253
265
|
<figcaption class="text-muted small mt-2 text-center">{{ page.preview_caption }}</figcaption>
|
|
@@ -374,9 +386,9 @@ layout: default
|
|
|
374
386
|
</aside>
|
|
375
387
|
{% endif %}
|
|
376
388
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
389
|
+
{% comment %} ================================ {% endcomment %}
|
|
390
|
+
{% comment %} ARTICLE CONTENT {% endcomment %}
|
|
391
|
+
{% comment %} ================================ {% endcomment %}
|
|
380
392
|
<div class="post-content e-content {% if post_type == 'featured' %}fs-5{% endif %}" itemprop="articleBody">
|
|
381
393
|
{{ content }}
|
|
382
394
|
</div>
|
|
@@ -419,9 +431,9 @@ layout: default
|
|
|
419
431
|
</aside>
|
|
420
432
|
{% endif %}
|
|
421
433
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
434
|
+
{% comment %} ================================ {% endcomment %}
|
|
435
|
+
{% comment %} AUTHOR BIO SECTION {% endcomment %}
|
|
436
|
+
{% comment %} ================================ {% endcomment %}
|
|
425
437
|
{% comment %}
|
|
426
438
|
"About the Author" is honored when the post has an author and the
|
|
427
439
|
`author_profile` front-matter flag is not false (defaults to true for the
|
|
@@ -432,9 +444,9 @@ layout: default
|
|
|
432
444
|
{% include components/author-bio.html author=page.author %}
|
|
433
445
|
{% endif %}
|
|
434
446
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
447
|
+
{% comment %} ================================ {% endcomment %}
|
|
448
|
+
{% comment %} RELATED POSTS SECTION {% endcomment %}
|
|
449
|
+
{% comment %} ================================ {% endcomment %}
|
|
438
450
|
{% if page.tags.size > 0 %}
|
|
439
451
|
{% assign related_posts = "" | split: "" %}
|
|
440
452
|
{% for tag in page.tags %}
|
|
@@ -449,9 +461,14 @@ layout: default
|
|
|
449
461
|
|
|
450
462
|
{% if related_posts.size > 0 %}
|
|
451
463
|
<aside class="related-posts my-5 pt-4 border-top">
|
|
452
|
-
|
|
464
|
+
{%- comment -%}
|
|
465
|
+
h2, not h3: this aside is a sibling of "About the Author" (also h2),
|
|
466
|
+
not a child of it. The old h3 also made every card title below it an
|
|
467
|
+
h6, a two-level jump (#436). Size is held by .h5.
|
|
468
|
+
{%- endcomment -%}
|
|
469
|
+
<h2 class="h5 mb-3">
|
|
453
470
|
<i class="bi bi-journal-text me-2"></i>Related Posts
|
|
454
|
-
</
|
|
471
|
+
</h2>
|
|
455
472
|
<div class="row row-cols-1 row-cols-md-3 g-3">
|
|
456
473
|
{% for rpost in related_posts %}
|
|
457
474
|
<div class="col">
|
|
@@ -464,15 +481,15 @@ layout: default
|
|
|
464
481
|
{% endif %}
|
|
465
482
|
<a href="{{ rpost.url | relative_url }}" class="text-decoration-none">
|
|
466
483
|
{% assign rpost_img = rpost.preview | default: site.teaser %}
|
|
467
|
-
{% include components/preview-image.html src=rpost_img alt=rpost.title class="card-img-top" %}
|
|
484
|
+
{% include components/preview-image.html src=rpost_img alt=rpost.title class="card-img-top" width="1536" height="1024" %}
|
|
468
485
|
</a>
|
|
469
486
|
</div>
|
|
470
487
|
<div class="card-body">
|
|
471
|
-
<
|
|
488
|
+
<h3 class="h6 card-title mb-1">
|
|
472
489
|
<a href="{{ rpost.url | relative_url }}" class="text-decoration-none text-body-emphasis">
|
|
473
490
|
{{ rpost.title | truncate: 60 }}
|
|
474
491
|
</a>
|
|
475
|
-
</
|
|
492
|
+
</h3>
|
|
476
493
|
<small class="text-muted">
|
|
477
494
|
<i class="bi bi-calendar me-1"></i>{{ rpost.date | date: "%b %d, %Y" }}
|
|
478
495
|
</small>
|
|
@@ -485,12 +502,12 @@ layout: default
|
|
|
485
502
|
{% endif %}
|
|
486
503
|
{% endif %}
|
|
487
504
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
505
|
+
{% comment %} ================================ {% endcomment %}
|
|
506
|
+
{% comment %} POST NAVIGATION {% endcomment %}
|
|
507
|
+
{% comment %} ================================ {% endcomment %}
|
|
491
508
|
<nav class="post-navigation my-5 pt-4 border-top" aria-label="Post navigation">
|
|
492
509
|
<div class="row g-3">
|
|
493
|
-
|
|
510
|
+
{% comment %} Previous Post {% endcomment %}
|
|
494
511
|
<div class="col-md-6">
|
|
495
512
|
{% if page.previous %}
|
|
496
513
|
<a href="{{ page.previous.url | relative_url }}" class="post-nav-card post-nav-card--prev">
|
|
@@ -513,7 +530,7 @@ layout: default
|
|
|
513
530
|
{% endif %}
|
|
514
531
|
</div>
|
|
515
532
|
|
|
516
|
-
|
|
533
|
+
{% comment %} Next Post {% endcomment %}
|
|
517
534
|
<div class="col-md-6">
|
|
518
535
|
{% if page.next %}
|
|
519
536
|
<a href="{{ page.next.url | relative_url }}" class="post-nav-card post-nav-card--next">
|
|
@@ -538,9 +555,9 @@ layout: default
|
|
|
538
555
|
</div>
|
|
539
556
|
</nav>
|
|
540
557
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
558
|
+
{% comment %} ================================ {% endcomment %}
|
|
559
|
+
{% comment %} COMMENT SYSTEM {% endcomment %}
|
|
560
|
+
{% comment %} ================================ {% endcomment %}
|
|
544
561
|
{% if page.comments != false and site.giscus.enabled %}
|
|
545
562
|
<section class="post-comments mt-5 pt-4 border-top" id="comments">
|
|
546
563
|
<h2 class="h4 mb-4">
|
data/_layouts/author.html
CHANGED
|
@@ -66,9 +66,9 @@ hide_intro: true
|
|
|
66
66
|
{% assign latest_date = nil %}
|
|
67
67
|
{% for doc in author_docs %}{% if doc.date %}{% assign latest_date = doc.date %}{% break %}{% endif %}{% endfor %}
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
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">
|