datalog-theme 0.6.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 (180) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +162 -0
  3. data/CITATION.cff +29 -0
  4. data/LICENSE +21 -0
  5. data/README.md +257 -0
  6. data/_data/academic.yml +217 -0
  7. data/_data/cdn-integrity.yml +51 -0
  8. data/_data/config/author.yml +121 -0
  9. data/_data/config/features.yml +262 -0
  10. data/_data/config/site.yml +42 -0
  11. data/_data/config/theme.yml +181 -0
  12. data/_data/datasets.yml +28 -0
  13. data/_data/i18n/en.yml +438 -0
  14. data/_data/i18n/es.yml +438 -0
  15. data/_data/i18n/pt.yml +438 -0
  16. data/_data/js_manifest.json +22 -0
  17. data/_data/js_meta.json +371 -0
  18. data/_data/navigation.yml +145 -0
  19. data/_data/projects.yml +41 -0
  20. data/_data/publications.yml +28 -0
  21. data/_data/social.yml +73 -0
  22. data/_data/visualizations.yml +51 -0
  23. data/_includes/analytics/dashboard.html +149 -0
  24. data/_includes/analytics.html +9 -0
  25. data/_includes/components/academic-dashboard.html +347 -0
  26. data/_includes/components/advanced-search.html +682 -0
  27. data/_includes/components/api-function.html +94 -0
  28. data/_includes/components/author-bio.html +166 -0
  29. data/_includes/components/bookmark-system.html +96 -0
  30. data/_includes/components/breadcrumbs.html +89 -0
  31. data/_includes/components/citation-tools.html +94 -0
  32. data/_includes/components/comments.html +244 -0
  33. data/_includes/components/content-provenance.html +43 -0
  34. data/_includes/components/content-recommendations.html +228 -0
  35. data/_includes/components/difficulty-badge.html +84 -0
  36. data/_includes/components/email-preferences.html +200 -0
  37. data/_includes/components/enhanced-code-block.html +212 -0
  38. data/_includes/components/enhanced-metadata.html +228 -0
  39. data/_includes/components/enhanced-toc.html +209 -0
  40. data/_includes/components/hero.html +15 -0
  41. data/_includes/components/language-switcher.html +396 -0
  42. data/_includes/components/math-fallback.html +19 -0
  43. data/_includes/components/navigation-enhancements.html +454 -0
  44. data/_includes/components/newsletter-signup.html +178 -0
  45. data/_includes/components/open-science-badges.html +16 -0
  46. data/_includes/components/package-install.html +194 -0
  47. data/_includes/components/performance-monitor.html +170 -0
  48. data/_includes/components/popular-posts.html +233 -0
  49. data/_includes/components/post-hero.html +62 -0
  50. data/_includes/components/reading-progress.html +133 -0
  51. data/_includes/components/reading-time.html +121 -0
  52. data/_includes/components/responsive-image.html +63 -0
  53. data/_includes/components/search-facets.html +307 -0
  54. data/_includes/components/series-navigation.html +124 -0
  55. data/_includes/components/social-proof.html +34 -0
  56. data/_includes/components/social-share.html +119 -0
  57. data/_includes/components/user-preferences.html +566 -0
  58. data/_includes/components/visualization-card.html +24 -0
  59. data/_includes/components/viz-table-fallback.html +19 -0
  60. data/_includes/critical-css/default.html +0 -0
  61. data/_includes/critical-css/home.html +0 -0
  62. data/_includes/critical-css/post.html +0 -0
  63. data/_includes/csp-meta.html +17 -0
  64. data/_includes/footer/nav-column.html +31 -0
  65. data/_includes/footer.html +76 -0
  66. data/_includes/head.html +337 -0
  67. data/_includes/header/navigation.html +48 -0
  68. data/_includes/header.html +70 -0
  69. data/_includes/helpers/array-to-sentence.html +21 -0
  70. data/_includes/helpers/date-format.html +16 -0
  71. data/_includes/helpers/link-with-icon.html +26 -0
  72. data/_includes/layouts/default/article.html +67 -0
  73. data/_includes/meta/language-attributes.html +25 -0
  74. data/_includes/meta/math-config.html +21 -0
  75. data/_includes/meta/schema.html +153 -0
  76. data/_includes/meta/scripts-loader.html +52 -0
  77. data/_includes/post/related-posts.html +63 -0
  78. data/_includes/scripts.html +72 -0
  79. data/_includes/skip-link.html +1 -0
  80. data/_includes/toc.html +2 -0
  81. data/_layouts/archive.html +282 -0
  82. data/_layouts/dataset.html +52 -0
  83. data/_layouts/default.html +33 -0
  84. data/_layouts/home.html +48 -0
  85. data/_layouts/notebook.html +173 -0
  86. data/_layouts/package.html +238 -0
  87. data/_layouts/page.html +16 -0
  88. data/_layouts/portfolio.html +41 -0
  89. data/_layouts/post-sidebar.html +183 -0
  90. data/_layouts/post.html +338 -0
  91. data/_layouts/project.html +252 -0
  92. data/_layouts/research.html +504 -0
  93. data/_plugins/analytics_dashboard.rb +315 -0
  94. data/_plugins/config_validator.rb +397 -0
  95. data/_plugins/csp_generator.rb +115 -0
  96. data/_plugins/datalog_bibliography.rb +19 -0
  97. data/_plugins/datalog_comments.rb +18 -0
  98. data/_plugins/datalog_slides.rb +20 -0
  99. data/_plugins/front_matter_compat.rb +109 -0
  100. data/_plugins/i18n.rb +160 -0
  101. data/_plugins/image_optimizer.rb +445 -0
  102. data/_plugins/math_preprocessor.rb +185 -0
  103. data/_plugins/notebook_converter.rb +1107 -0
  104. data/_plugins/plugin_loader.rb +185 -0
  105. data/_plugins/publications_generator.rb +234 -0
  106. data/_plugins/reading_time.rb +15 -0
  107. data/_plugins/search_normalizer.rb +74 -0
  108. data/_plugins/sri_filter.rb +18 -0
  109. data/_plugins/toc_filter.rb +68 -0
  110. data/_plugins/warning_filter.rb +3 -0
  111. data/_sass/_base.scss +142 -0
  112. data/_sass/_components.scss +2380 -0
  113. data/_sass/_header.scss +470 -0
  114. data/_sass/_interactive.scss +344 -0
  115. data/_sass/_layout.scss +1760 -0
  116. data/_sass/_mathematical.scss +368 -0
  117. data/_sass/_mixins.scss +99 -0
  118. data/_sass/_package-docs.scss +715 -0
  119. data/_sass/_phase1-enhancements.scss +721 -0
  120. data/_sass/_phase3-enhancements.scss +874 -0
  121. data/_sass/_phase4-enhancements.scss +1214 -0
  122. data/_sass/_phase5-enhancements.scss +414 -0
  123. data/_sass/_search.scss +654 -0
  124. data/_sass/_syntax-highlighting.scss +128 -0
  125. data/_sass/_theme.scss +79 -0
  126. data/_sass/_typography.scss +148 -0
  127. data/_sass/_utilities.scss +334 -0
  128. data/_sass/_variables.scss +153 -0
  129. data/_sass/_visualizations.scss +242 -0
  130. data/assets/css/main.scss +4 -0
  131. data/assets/img/20220607123041_detail.001.png +0 -0
  132. data/assets/img/favicons/android-chrome-192x192.png +0 -0
  133. data/assets/img/favicons/android-chrome-512x512.png +0 -0
  134. data/assets/img/favicons/apple-touch-icon.png +0 -0
  135. data/assets/img/favicons/favicon-16x16.png +0 -0
  136. data/assets/img/favicons/favicon-32x32.png +0 -0
  137. data/assets/img/favicons/favicon.ico +0 -0
  138. data/assets/img/favicons/site.webmanifest +21 -0
  139. data/assets/img/portfolio-placeholder.svg +20 -0
  140. data/assets/js/academic.js +262 -0
  141. data/assets/js/analytics-dashboard.js +382 -0
  142. data/assets/js/core/dark-mode.js +79 -0
  143. data/assets/js/core/github-cards.js +123 -0
  144. data/assets/js/core/language-filter.js +69 -0
  145. data/assets/js/core/navigation.js +184 -0
  146. data/assets/js/core/scroll-progress.js +45 -0
  147. data/assets/js/core/search-hotkeys.js +62 -0
  148. data/assets/js/core/skip-links.js +62 -0
  149. data/assets/js/loader.js +163 -0
  150. data/assets/js/main.js +23 -0
  151. data/assets/js/math.js +818 -0
  152. data/assets/js/notebook.js +158 -0
  153. data/assets/js/search/analytics.js +91 -0
  154. data/assets/js/search/app.js +271 -0
  155. data/assets/js/search/autocomplete.js +120 -0
  156. data/assets/js/search/engine.js +260 -0
  157. data/assets/js/search/filters.js +38 -0
  158. data/assets/js/search/render.js +217 -0
  159. data/assets/js/search/utils.js +99 -0
  160. data/assets/js/search.js +354 -0
  161. data/assets/js/visualizations.js +816 -0
  162. data/assets/publications/datalog-publications.bib +8 -0
  163. data/assets/publications/datalog-publications.ris +9 -0
  164. data/assets/publications/publications.bib +30 -0
  165. data/assets/templates/diogo-ribeiro-cv.md +31 -0
  166. data/assets/templates/diogo-ribeiro-cv.tex +32 -0
  167. data/bin/datalog +26 -0
  168. data/datalog-theme.gemspec +72 -0
  169. data/lib/datalog/cli.rb +563 -0
  170. data/lib/datalog/plugin_system/dependency_resolver.rb +223 -0
  171. data/lib/datalog/plugin_system.rb +237 -0
  172. data/lib/datalog/plugins/citations.rb +182 -0
  173. data/lib/datalog/plugins/comments.rb +183 -0
  174. data/lib/datalog/plugins/search.rb +45 -0
  175. data/lib/datalog/plugins/slides.rb +121 -0
  176. data/lib/datalog/theme/theme.rb +18 -0
  177. data/lib/datalog/theme/version.rb +7 -0
  178. data/lib/datalog/warning_filter.rb +28 -0
  179. data/lib/datalog-theme.rb +17 -0
  180. metadata +555 -0
@@ -0,0 +1,238 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ <div class="package-docs">
6
+ {%- comment -%} Package Header {%- endcomment -%}
7
+ <div class="package-docs__header">
8
+ <div class="package-docs__header-content">
9
+ <div class="package-docs__title-area">
10
+ <h1 class="package-docs__title">
11
+ {% if page.icon %}
12
+ <span class="package-docs__icon">{{ page.icon }}</span>
13
+ {% endif %}
14
+ {{ page.title }}
15
+ </h1>
16
+ {% if page.tagline %}
17
+ <p class="package-docs__tagline">{{ page.tagline }}</p>
18
+ {% endif %}
19
+ </div>
20
+
21
+ <div class="package-docs__meta">
22
+ {% if page.version %}
23
+ <div class="package-docs__version">
24
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
25
+ <circle cx="12" cy="12" r="10"></circle>
26
+ <polyline points="12 6 12 12 16 14"></polyline>
27
+ </svg>
28
+ <span>v{{ page.version }}</span>
29
+ </div>
30
+ {% endif %}
31
+
32
+ {% if page.language %}
33
+ <div class="package-docs__language">
34
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
35
+ <polyline points="16 18 22 12 16 6"></polyline>
36
+ <polyline points="8 6 2 12 8 18"></polyline>
37
+ </svg>
38
+ <span>{{ page.language }}</span>
39
+ </div>
40
+ {% endif %}
41
+
42
+ {% if page.license %}
43
+ <div class="package-docs__license">
44
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
45
+ <rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>
46
+ <path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
47
+ </svg>
48
+ <span>{{ page.license }}</span>
49
+ </div>
50
+ {% endif %}
51
+ </div>
52
+
53
+ <div class="package-docs__actions">
54
+ {% if page.github_url %}
55
+ <a href="{{ page.github_url }}" class="package-docs__action-btn" target="_blank" rel="noopener">
56
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
57
+ <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
58
+ </svg>
59
+ <span>GitHub</span>
60
+ </a>
61
+ {% endif %}
62
+
63
+ {% if page.pypi_url %}
64
+ <a href="{{ page.pypi_url }}" class="package-docs__action-btn" target="_blank" rel="noopener">
65
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
66
+ <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>
67
+ </svg>
68
+ <span>PyPI</span>
69
+ </a>
70
+ {% endif %}
71
+
72
+ {% if page.cran_url %}
73
+ <a href="{{ page.cran_url }}" class="package-docs__action-btn" target="_blank" rel="noopener">
74
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
75
+ <circle cx="12" cy="12" r="10"></circle>
76
+ <text x="12" y="16" font-size="12" text-anchor="middle" fill="currentColor">R</text>
77
+ </svg>
78
+ <span>CRAN</span>
79
+ </a>
80
+ {% endif %}
81
+ </div>
82
+ </div>
83
+ </div>
84
+
85
+ <div class="package-docs__container">
86
+ {%- comment -%} Sidebar Navigation {%- endcomment -%}
87
+ <aside class="package-docs__sidebar">
88
+ <nav class="package-nav" aria-label="Package navigation">
89
+ {% if page.nav_sections %}
90
+ {% for section in page.nav_sections %}
91
+ <div class="package-nav__section">
92
+ <h3 class="package-nav__section-title">{{ section.title }}</h3>
93
+ <ul class="package-nav__list">
94
+ {% for item in section.items %}
95
+ <li class="package-nav__item">
96
+ <a href="#{{ item.id }}" class="package-nav__link">
97
+ {{ item.title }}
98
+ </a>
99
+ </li>
100
+ {% endfor %}
101
+ </ul>
102
+ </div>
103
+ {% endfor %}
104
+ {% else %}
105
+ {%- comment -%} Auto-generate from headings {%- endcomment -%}
106
+ <div class="package-nav__section">
107
+ <h3 class="package-nav__section-title">Contents</h3>
108
+ <ul class="package-nav__list">
109
+ <li class="package-nav__item">
110
+ <a href="#installation" class="package-nav__link">Installation</a>
111
+ </li>
112
+ <li class="package-nav__item">
113
+ <a href="#quick-start" class="package-nav__link">Quick Start</a>
114
+ </li>
115
+ <li class="package-nav__item">
116
+ <a href="#api-reference" class="package-nav__link">API Reference</a>
117
+ </li>
118
+ <li class="package-nav__item">
119
+ <a href="#examples" class="package-nav__link">Examples</a>
120
+ </li>
121
+ <li class="package-nav__item">
122
+ <a href="#changelog" class="package-nav__link">Changelog</a>
123
+ </li>
124
+ </ul>
125
+ </div>
126
+ {% endif %}
127
+
128
+ {%- comment -%} Version Selector {%- endcomment -%}
129
+ {% if page.versions %}
130
+ <div class="package-nav__section package-nav__section--versions">
131
+ <h3 class="package-nav__section-title">Versions</h3>
132
+ <select class="package-nav__version-select" data-navigate-on-change>
133
+ {% for v in page.versions %}
134
+ <option value="{{ v.url }}" {% if v.version == page.version %}selected{% endif %}>
135
+ v{{ v.version }} {% if v.status %}({{ v.status }}){% endif %}
136
+ </option>
137
+ {% endfor %}
138
+ </select>
139
+ </div>
140
+ {% endif %}
141
+
142
+ {%- comment -%} Related Packages {%- endcomment -%}
143
+ {% if page.related_packages %}
144
+ <div class="package-nav__section">
145
+ <h3 class="package-nav__section-title">Related Packages</h3>
146
+ <ul class="package-nav__list">
147
+ {% for pkg in page.related_packages %}
148
+ <li class="package-nav__item">
149
+ <a href="{{ pkg.url | relative_url }}" class="package-nav__link">{{ pkg.name }}</a>
150
+ </li>
151
+ {% endfor %}
152
+ </ul>
153
+ </div>
154
+ {% endif %}
155
+ </nav>
156
+ </aside>
157
+
158
+ {%- comment -%} Main Content {%- endcomment -%}
159
+ <main class="package-docs__main">
160
+ <article class="package-docs__content">
161
+ {{ content }}
162
+ </article>
163
+
164
+ {%- comment -%} Footer Navigation {%- endcomment -%}
165
+ <nav class="package-docs__footer-nav">
166
+ {% if page.previous_page %}
167
+ <a href="{{ page.previous_page.url | relative_url }}" class="package-docs__footer-nav-link package-docs__footer-nav-link--prev">
168
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
169
+ <polyline points="15 18 9 12 15 6"></polyline>
170
+ </svg>
171
+ <div>
172
+ <span class="package-docs__footer-nav-label">Previous</span>
173
+ <span class="package-docs__footer-nav-title">{{ page.previous_page.title }}</span>
174
+ </div>
175
+ </a>
176
+ {% endif %}
177
+
178
+ {% if page.next_page %}
179
+ <a href="{{ page.next_page.url | relative_url }}" class="package-docs__footer-nav-link package-docs__footer-nav-link--next">
180
+ <div>
181
+ <span class="package-docs__footer-nav-label">Next</span>
182
+ <span class="package-docs__footer-nav-title">{{ page.next_page.title }}</span>
183
+ </div>
184
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
185
+ <polyline points="9 18 15 12 9 6"></polyline>
186
+ </svg>
187
+ </a>
188
+ {% endif %}
189
+ </nav>
190
+ </main>
191
+ </div>
192
+ </div>
193
+
194
+ <script>
195
+ (function() {
196
+ 'use strict';
197
+
198
+ // Highlight active section in sidebar
199
+ const observer = new IntersectionObserver((entries) => {
200
+ entries.forEach(entry => {
201
+ if (entry.isIntersecting) {
202
+ const id = entry.target.getAttribute('id');
203
+ if (!id) return;
204
+
205
+ // Remove active class from all links
206
+ document.querySelectorAll('.package-nav__link').forEach(link => {
207
+ link.classList.remove('package-nav__link--active');
208
+ });
209
+
210
+ // Add active class to current link
211
+ const activeLink = document.querySelector(`.package-nav__link[href="#${id}"]`);
212
+ if (activeLink) {
213
+ activeLink.classList.add('package-nav__link--active');
214
+ }
215
+ }
216
+ });
217
+ }, {
218
+ rootMargin: '-80px 0px -80% 0px'
219
+ });
220
+
221
+ // Observe all headings
222
+ document.querySelectorAll('.package-docs__content h2[id], .package-docs__content h3[id]').forEach(heading => {
223
+ observer.observe(heading);
224
+ });
225
+
226
+ // Smooth scroll for anchor links
227
+ document.querySelectorAll('.package-nav__link[href^="#"]').forEach(link => {
228
+ link.addEventListener('click', (e) => {
229
+ e.preventDefault();
230
+ const target = document.querySelector(link.getAttribute('href'));
231
+ if (target) {
232
+ target.scrollIntoView({ behavior: 'smooth', block: 'start' });
233
+ history.pushState(null, null, link.getAttribute('href'));
234
+ }
235
+ });
236
+ });
237
+ })();
238
+ </script>
@@ -0,0 +1,16 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+ <section class="page">
5
+ <div class="container">
6
+ {% if page.hero_image %}
7
+ <div class="page-hero-media">
8
+ {% assign hero_alt = page.hero_alt | default: page.title | default: site.title %}
9
+ {% include components/responsive-image.html src=page.hero_image alt=hero_alt sizes="(min-width: 64rem) 40rem, 100vw" class="page-hero-image" %}
10
+ </div>
11
+ {% endif %}
12
+ <div class="page-content">
13
+ {{ content }}
14
+ </div>
15
+ </div>
16
+ </section>
@@ -0,0 +1,41 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+ <article class="portfolio-item">
5
+ <header class="portfolio-header">
6
+ <h1>{{ page.title }}</h1>
7
+ {% if page.hero_image %}
8
+ <div class="portfolio-hero-media">
9
+ {% assign hero_alt = page.hero_alt | default: page.title %}
10
+ {% include components/responsive-image.html src=page.hero_image alt=hero_alt sizes="(min-width: 64rem) 48rem, 100vw" class="portfolio-hero-image" %}
11
+ </div>
12
+ {% endif %}
13
+ {% if page.client %}<p class="portfolio-meta"><strong>Client:</strong> {{ page.client }}</p>{% endif %}
14
+ {% if page.tools %}<p class="portfolio-meta"><strong>Tools:</strong> {{ page.tools | array_to_sentence_string }}</p>{% endif %}
15
+ {% if page.metrics %}
16
+ <ul class="portfolio-metrics">
17
+ {% for metric in page.metrics %}
18
+ <li><span class="metric-label">{{ metric.label }}:</span> <span class="metric-value">{{ metric.value }}</span></li>
19
+ {% endfor %}
20
+ </ul>
21
+ {% endif %}
22
+ </header>
23
+ <div class="portfolio-content">
24
+ {{ content }}
25
+ </div>
26
+ {% if page.visualization_embed %}
27
+ <div class="portfolio-visualization" role="region" aria-label="Interactive visualization">
28
+ {{ page.visualization_embed | raw }}
29
+ </div>
30
+ {% endif %}
31
+ {% if page.links %}
32
+ <div class="portfolio-links">
33
+ <h2>Resources</h2>
34
+ <ul>
35
+ {% for link in page.links %}
36
+ <li><a href="{{ link.url | relative_url }}">{{ link.label }}</a></li>
37
+ {% endfor %}
38
+ </ul>
39
+ </div>
40
+ {% endif %}
41
+ </article>
@@ -0,0 +1,183 @@
1
+ ---
2
+ layout: default
3
+ schema_type: TechnicalArticle
4
+ ---
5
+
6
+ {%- comment -%}
7
+ Sidebar layout variant for posts
8
+ This layout provides an alternative post presentation with a sidebar containing:
9
+ - Table of contents
10
+ - Related posts
11
+ - Author info
12
+ - Quick actions
13
+ {%- endcomment -%}
14
+
15
+ {% assign localization_config = site.theme_options.localization %}
16
+ {% assign date_format = page.date_format | default: localization_config.date_format | default: 'long' %}
17
+ {% assign reading_minutes = page.reading_minutes | default: page.content | strip_html | reading_time %}
18
+ {% if reading_minutes == 1 %}
19
+ {% capture reading_label %}{% t 'post.reading_time.one' %}{% endcapture %}
20
+ {% else %}
21
+ {% capture reading_label %}{% t 'post.reading_time.many' minutes: reading_minutes %}{% endcapture %}
22
+ {% endif %}
23
+ {% assign reading_label = reading_label | strip %}
24
+
25
+ {% capture difficulty_default %}{% t 'post.difficulty_default' %}{% endcapture %}
26
+ {% assign difficulty = page.difficulty | default: site.post_defaults.difficulty | default: difficulty_default | strip %}
27
+
28
+ {% capture toc_default_label %}{% t 'post.toc_heading' %}{% endcapture %}
29
+ {% assign toc_heading = page.toc_label | default: toc_default_label | strip %}
30
+ {% assign toc_min = page.toc_h_min | default: 2 %}
31
+ {% assign toc_max = page.toc_h_max | default: 4 %}
32
+
33
+ {% assign canonical_url = page.url | absolute_url %}
34
+ {% assign author_name = page.author | default: site.author.name %}
35
+ {% assign author_affiliation = page.author_affiliation | default: site.author.affiliation %}
36
+
37
+ {% assign post_tags = page.tags %}
38
+ {% assign has_tags = false %}
39
+ {% if post_tags and post_tags.size > 0 %}{% assign has_tags = true %}{% endif %}
40
+ {% assign has_categories = false %}
41
+ {% if page.categories and page.categories.size > 0 %}{% assign has_categories = true %}{% endif %}
42
+
43
+ {% assign time_required = 'PT' | append: reading_minutes | append: 'M' %}
44
+
45
+ {%- comment -%} Breadcrumb navigation {%- endcomment -%}
46
+ {% include components/breadcrumbs.html %}
47
+
48
+ <div class="post-sidebar-layout">
49
+ {%- comment -%} Main Content Area {%- endcomment -%}
50
+ <main class="post-sidebar-layout__main" itemscope itemtype="https://schema.org/TechnicalArticle">
51
+ <meta itemprop="url" content="{{ canonical_url }}" />
52
+ <meta itemprop="datePublished" content="{{ page.date | date_to_xmlschema }}" />
53
+ {% if page.last_modified_at or page.updated %}
54
+ <meta itemprop="dateModified" content="{{ page.last_modified_at | default: page.updated | date_to_xmlschema }}" />
55
+ {% endif %}
56
+ <meta itemprop="author" content="{{ author_name }}" />
57
+ <meta itemprop="publisher" content="{{ site.author.affiliation | default: site.title }}" />
58
+ <meta itemprop="timeRequired" content="{{ time_required }}" />
59
+ {% if difficulty %}<meta itemprop="learningResourceType" content="{{ difficulty }}" />{% endif %}
60
+ {% if has_tags %}<meta itemprop="keywords" content="{{ post_tags | join: ', ' }}" />{% endif %}
61
+
62
+ <article class="post-sidebar-layout__article">
63
+ <header class="post-sidebar-layout__header">
64
+ <h1 class="post-sidebar-layout__title">{{ page.title }}</h1>
65
+
66
+ <div class="post-sidebar-layout__meta">
67
+ <time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
68
+ {{ page.date | localize_date: date_format }}
69
+ </time>
70
+ <span class="post-sidebar-layout__separator">•</span>
71
+ <span>{{ reading_label }}</span>
72
+ {% if difficulty %}
73
+ <span class="post-sidebar-layout__separator">•</span>
74
+ {% include components/difficulty-badge.html level=difficulty %}
75
+ {% endif %}
76
+ </div>
77
+
78
+ {% if page.excerpt %}
79
+ <p class="post-sidebar-layout__excerpt" itemprop="description">{{ page.excerpt }}</p>
80
+ {% endif %}
81
+
82
+ {% if has_tags or has_categories %}
83
+ <div class="post-sidebar-layout__taxonomy">
84
+ {% if has_tags %}
85
+ {% for tag in post_tags %}
86
+ {% assign tag_slug = tag | slugify %}
87
+ <a class="post-sidebar-layout__tag" href="{{ site.tag_archive.path | default: '/tags/' | append: '#' | append: tag_slug | relative_url }}">{{ tag }}</a>
88
+ {% endfor %}
89
+ {% endif %}
90
+ </div>
91
+ {% endif %}
92
+
93
+ {%- comment -%} Social sharing {%- endcomment -%}
94
+ {% include components/social-share.html url=canonical_url title=page.title description=page.excerpt %}
95
+ </header>
96
+
97
+ <div class="post-sidebar-layout__content" itemprop="articleBody">
98
+ {{ content }}
99
+ </div>
100
+
101
+ <footer class="post-sidebar-layout__footer">
102
+ {%- comment -%} Author bio {%- endcomment -%}
103
+ {% include components/author-bio.html author=author_name compact=true %}
104
+
105
+ {%- comment -%} Series navigation if applicable {%- endcomment -%}
106
+ {% if page.series %}
107
+ {% include components/series-navigation.html series=page.series %}
108
+ {% endif %}
109
+ </footer>
110
+ </article>
111
+ </main>
112
+
113
+ {%- comment -%} Sidebar {%- endcomment -%}
114
+ <aside class="post-sidebar-layout__sidebar" aria-label="Sidebar content">
115
+ {%- comment -%} Sticky sidebar container {%- endcomment -%}
116
+ <div class="post-sidebar-layout__sidebar-sticky">
117
+
118
+ {%- comment -%} Table of Contents {%- endcomment -%}
119
+ {% if page.toc != false %}
120
+ {% include components/enhanced-toc.html html=content h_min=toc_min h_max=toc_max heading=toc_heading %}
121
+ {% endif %}
122
+
123
+ {%- comment -%} Quick Info Card {%- endcomment -%}
124
+ <div class="sidebar-card sidebar-card--info">
125
+ <h3 class="sidebar-card__heading">Article Info</h3>
126
+ <dl class="sidebar-card__list">
127
+ <div class="sidebar-card__item">
128
+ <dt>Published</dt>
129
+ <dd>{{ page.date | date: "%B %d, %Y" }}</dd>
130
+ </div>
131
+ {% if page.last_modified_at %}
132
+ <div class="sidebar-card__item">
133
+ <dt>Updated</dt>
134
+ <dd>{{ page.last_modified_at | date: "%B %d, %Y" }}</dd>
135
+ </div>
136
+ {% endif %}
137
+ <div class="sidebar-card__item">
138
+ <dt>Reading Time</dt>
139
+ <dd>{{ reading_minutes }} min</dd>
140
+ </div>
141
+ {% if page.word_count %}
142
+ <div class="sidebar-card__item">
143
+ <dt>Word Count</dt>
144
+ <dd>{{ page.word_count | number_with_delimiter }}</dd>
145
+ </div>
146
+ {% endif %}
147
+ </dl>
148
+ </div>
149
+
150
+ {%- comment -%} Newsletter signup {%- endcomment -%}
151
+ {% if site.phase2_features.newsletter.enabled %}
152
+ {% include components/newsletter-signup.html compact=true %}
153
+ {% endif %}
154
+
155
+ {%- comment -%} Related posts (compact) {%- endcomment -%}
156
+ <div class="sidebar-card sidebar-card--related">
157
+ <h3 class="sidebar-card__heading">Related Articles</h3>
158
+ {% include post/related-posts.html page=page limit=3 compact=true %}
159
+ </div>
160
+ </div>
161
+ </aside>
162
+ </div>
163
+
164
+ {%- comment -%} Post navigation at bottom {%- endcomment -%}
165
+ <nav class="post-navigation" aria-label="Post navigation">
166
+ {% if page.previous %}
167
+ <div class="post-navigation__prev">
168
+ <span class="post-navigation__label">← Previous</span>
169
+ <a href="{{ page.previous.url | relative_url }}" class="post-navigation__link">
170
+ {{ page.previous.title }}
171
+ </a>
172
+ </div>
173
+ {% endif %}
174
+
175
+ {% if page.next %}
176
+ <div class="post-navigation__next">
177
+ <span class="post-navigation__label">Next →</span>
178
+ <a href="{{ page.next.url | relative_url }}" class="post-navigation__link">
179
+ {{ page.next.title }}
180
+ </a>
181
+ </div>
182
+ {% endif %}
183
+ </nav>