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,721 @@
1
+ // ============================================================================
2
+ // Phase 1 Enhancements - New Features Styles
3
+ // ============================================================================
4
+ // - Social sharing buttons
5
+ // - Breadcrumb navigation
6
+ // - Author bio cards
7
+ // - Enhanced table of contents
8
+ // - Difficulty badges
9
+ // ============================================================================
10
+
11
+ @use 'mixins' as *;
12
+
13
+ // ============================================================================
14
+ // Social Share Component
15
+ // ============================================================================
16
+
17
+ .social-share {
18
+ margin: 2rem 0;
19
+ padding: 1.5rem;
20
+ background-color: var(--color-background-secondary, #f5f7ff);
21
+ border-radius: 8px;
22
+ border: 1px solid var(--color-border, #e0e4ed);
23
+
24
+ &__heading {
25
+ margin: 0 0 1rem 0;
26
+ font-size: 1rem;
27
+ font-weight: 600;
28
+ color: var(--color-text-primary, #0b1d3d);
29
+ }
30
+
31
+ &__buttons {
32
+ display: flex;
33
+ flex-wrap: wrap;
34
+ gap: 0.75rem;
35
+ }
36
+
37
+ &__button {
38
+ display: inline-flex;
39
+ align-items: center;
40
+ gap: 0.5rem;
41
+ padding: 0.5rem 1rem;
42
+ background-color: var(--color-background, #ffffff);
43
+ border: 1px solid var(--color-border, #e0e4ed);
44
+ border-radius: 6px;
45
+ color: var(--color-text-primary, #0b1d3d);
46
+ text-decoration: none;
47
+ font-size: 0.875rem;
48
+ font-weight: 500;
49
+ transition: all 0.2s ease;
50
+ cursor: pointer;
51
+
52
+ &:hover,
53
+ &:focus {
54
+ background-color: var(--color-accent, #3277f6);
55
+ color: #ffffff;
56
+ border-color: var(--color-accent, #3277f6);
57
+ transform: translateY(-2px);
58
+ box-shadow: 0 4px 12px rgba(50, 119, 246, 0.2);
59
+ }
60
+
61
+ &:active {
62
+ transform: translateY(0);
63
+ }
64
+
65
+ // Platform-specific colors
66
+ &--twitter:hover,
67
+ &--twitter:focus {
68
+ background-color: #1DA1F2;
69
+ border-color: #1DA1F2;
70
+ }
71
+
72
+ &--linkedin:hover,
73
+ &--linkedin:focus {
74
+ background-color: #0077B5;
75
+ border-color: #0077B5;
76
+ }
77
+
78
+ &--facebook:hover,
79
+ &--facebook:focus {
80
+ background-color: #1877F2;
81
+ border-color: #1877F2;
82
+ }
83
+
84
+ &--reddit:hover,
85
+ &--reddit:focus {
86
+ background-color: #FF4500;
87
+ border-color: #FF4500;
88
+ }
89
+
90
+ &--email:hover,
91
+ &--email:focus {
92
+ background-color: #666666;
93
+ border-color: #666666;
94
+ }
95
+
96
+ &--copy {
97
+ &.is-copied {
98
+ background-color: #10B981;
99
+ color: #ffffff;
100
+ border-color: #10B981;
101
+ }
102
+ }
103
+ }
104
+
105
+ &__icon {
106
+ flex-shrink: 0;
107
+ }
108
+
109
+ &__label {
110
+ white-space: nowrap;
111
+ }
112
+ }
113
+
114
+ // ============================================================================
115
+ // Breadcrumbs Navigation
116
+ // ============================================================================
117
+
118
+ .breadcrumbs {
119
+ margin: 1rem 0 2rem;
120
+ padding: 0.75rem 0;
121
+ border-bottom: 1px solid var(--color-border, #e0e4ed);
122
+
123
+ &__list {
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ align-items: center;
127
+ gap: 0.5rem;
128
+ list-style: none;
129
+ margin: 0;
130
+ padding: 0;
131
+ }
132
+
133
+ &__item {
134
+ display: flex;
135
+ align-items: center;
136
+ font-size: 0.875rem;
137
+
138
+ &--current {
139
+ font-weight: 500;
140
+ }
141
+ }
142
+
143
+ &__link {
144
+ color: var(--color-accent, #3277f6);
145
+ text-decoration: none;
146
+ transition: color 0.2s ease;
147
+
148
+ &:hover,
149
+ &:focus {
150
+ color: var(--color-accent-dark, #1d5dcf);
151
+ text-decoration: underline;
152
+ }
153
+ }
154
+
155
+ &__current {
156
+ color: var(--color-text-secondary, #5a6c8a);
157
+ }
158
+
159
+ &__separator {
160
+ margin: 0 0.5rem;
161
+ color: var(--color-text-tertiary, #8995a8);
162
+ user-select: none;
163
+ }
164
+ }
165
+
166
+ // ============================================================================
167
+ // Author Bio Card
168
+ // ============================================================================
169
+
170
+ .author-bio {
171
+ margin: 3rem 0;
172
+ padding: 2rem;
173
+ background-color: var(--color-background-secondary, #f5f7ff);
174
+ border-radius: 12px;
175
+ border: 1px solid var(--color-border, #e0e4ed);
176
+
177
+ &__inner {
178
+ display: flex;
179
+ gap: 1.5rem;
180
+ align-items: flex-start;
181
+ }
182
+
183
+ &__avatar {
184
+ flex-shrink: 0;
185
+ }
186
+
187
+ &__avatar-img {
188
+ width: 80px;
189
+ height: 80px;
190
+ border-radius: 50%;
191
+ object-fit: cover;
192
+ border: 3px solid var(--color-background, #ffffff);
193
+ box-shadow: 0 2px 8px rgba(11, 29, 61, 0.1);
194
+ }
195
+
196
+ &__avatar-placeholder {
197
+ width: 80px;
198
+ height: 80px;
199
+ border-radius: 50%;
200
+ background: linear-gradient(135deg, var(--color-accent, #3277f6), #5b8ef7);
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ font-size: 1.75rem;
205
+ font-weight: 700;
206
+ color: #ffffff;
207
+ box-shadow: 0 2px 8px rgba(50, 119, 246, 0.2);
208
+ }
209
+
210
+ &__content {
211
+ flex: 1;
212
+ }
213
+
214
+ &__name {
215
+ margin: 0 0 0.25rem 0;
216
+ font-size: 1.5rem;
217
+ font-weight: 700;
218
+ color: var(--color-text-primary, #0b1d3d);
219
+ }
220
+
221
+ &__affiliation {
222
+ margin: 0 0 1rem 0;
223
+ font-size: 0.95rem;
224
+ color: var(--color-accent, #3277f6);
225
+ font-weight: 500;
226
+ }
227
+
228
+ &__description {
229
+ margin: 0 0 1rem 0;
230
+ line-height: 1.6;
231
+ color: var(--color-text-secondary, #5a6c8a);
232
+ }
233
+
234
+ &__research {
235
+ margin: 1rem 0;
236
+ font-size: 0.875rem;
237
+ }
238
+
239
+ &__research-label {
240
+ color: var(--color-text-primary, #0b1d3d);
241
+ font-weight: 600;
242
+ }
243
+
244
+ &__research-list {
245
+ color: var(--color-text-secondary, #5a6c8a);
246
+ }
247
+
248
+ &__social {
249
+ display: flex;
250
+ flex-wrap: wrap;
251
+ gap: 0.75rem;
252
+ list-style: none;
253
+ margin: 1.5rem 0 0;
254
+ padding: 0;
255
+ }
256
+
257
+ &__social-link {
258
+ display: inline-flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ width: 36px;
262
+ height: 36px;
263
+ background-color: var(--color-background, #ffffff);
264
+ border: 1px solid var(--color-border, #e0e4ed);
265
+ border-radius: 50%;
266
+ color: var(--color-text-secondary, #5a6c8a);
267
+ transition: all 0.2s ease;
268
+
269
+ &:hover,
270
+ &:focus {
271
+ background-color: var(--color-accent, #3277f6);
272
+ border-color: var(--color-accent, #3277f6);
273
+ color: #ffffff;
274
+ transform: translateY(-2px);
275
+ box-shadow: 0 4px 12px rgba(50, 119, 246, 0.2);
276
+ }
277
+
278
+ svg {
279
+ width: 18px;
280
+ height: 18px;
281
+ }
282
+ }
283
+
284
+ // Compact variant
285
+ &--compact {
286
+ padding: 1.5rem;
287
+
288
+ .author-bio__inner {
289
+ gap: 1rem;
290
+ }
291
+
292
+ .author-bio__avatar-img,
293
+ .author-bio__avatar-placeholder {
294
+ width: 60px;
295
+ height: 60px;
296
+ }
297
+
298
+ .author-bio__name {
299
+ font-size: 1.25rem;
300
+ }
301
+
302
+ .author-bio__description {
303
+ font-size: 0.9rem;
304
+ }
305
+ }
306
+ }
307
+
308
+ // Responsive layout
309
+ @include respond-below(mobile) {
310
+ .author-bio {
311
+ &__inner {
312
+ flex-direction: column;
313
+ align-items: center;
314
+ text-align: center;
315
+ }
316
+
317
+ &__social {
318
+ justify-content: center;
319
+ }
320
+ }
321
+ }
322
+
323
+ // ============================================================================
324
+ // Enhanced Table of Contents
325
+ // ============================================================================
326
+
327
+ .enhanced-toc {
328
+ position: relative;
329
+ margin: 0;
330
+ background-color: var(--color-background-secondary, #f5f7ff);
331
+ border-radius: 8px;
332
+ border: 1px solid var(--color-border, #e0e4ed);
333
+ overflow: hidden;
334
+
335
+ &__progress {
336
+ position: absolute;
337
+ top: 0;
338
+ left: 0;
339
+ width: 100%;
340
+ height: 3px;
341
+ background-color: var(--color-border, #e0e4ed);
342
+ }
343
+
344
+ &__progress-bar {
345
+ height: 100%;
346
+ width: 0%;
347
+ background: linear-gradient(90deg, var(--color-accent, #3277f6), #5b8ef7);
348
+ transition: width 0.2s ease;
349
+ }
350
+
351
+ &__header {
352
+ display: flex;
353
+ align-items: center;
354
+ justify-content: space-between;
355
+ padding: 1rem 1.25rem;
356
+ border-bottom: 1px solid var(--color-border, #e0e4ed);
357
+ background-color: var(--color-background, #ffffff);
358
+ }
359
+
360
+ &__heading {
361
+ margin: 0;
362
+ font-size: 1.125rem;
363
+ font-weight: 700;
364
+ color: var(--color-text-primary, #0b1d3d);
365
+ }
366
+
367
+ &__toggle {
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ width: 32px;
372
+ height: 32px;
373
+ padding: 0;
374
+ background-color: transparent;
375
+ border: 1px solid var(--color-border, #e0e4ed);
376
+ border-radius: 6px;
377
+ color: var(--color-text-secondary, #5a6c8a);
378
+ cursor: pointer;
379
+ transition: all 0.2s ease;
380
+
381
+ &:hover,
382
+ &:focus {
383
+ background-color: var(--color-background-secondary, #f5f7ff);
384
+ border-color: var(--color-accent, #3277f6);
385
+ color: var(--color-accent, #3277f6);
386
+ }
387
+ }
388
+
389
+ &__toggle-icon {
390
+ &--collapse {
391
+ display: none;
392
+ }
393
+ }
394
+
395
+ &.is-collapsed {
396
+ .enhanced-toc__toggle-icon--expand {
397
+ display: none;
398
+ }
399
+
400
+ .enhanced-toc__toggle-icon--collapse {
401
+ display: block;
402
+ }
403
+ }
404
+
405
+ &__content {
406
+ padding: 1.25rem;
407
+ max-height: 70vh;
408
+ overflow-y: auto;
409
+
410
+ .toc {
411
+ margin: 0;
412
+ }
413
+
414
+ ul {
415
+ list-style: none;
416
+ margin: 0;
417
+ padding: 0 0 0 1rem;
418
+ }
419
+
420
+ li {
421
+ margin: 0.375rem 0;
422
+ }
423
+
424
+ a {
425
+ display: block;
426
+ padding: 0.375rem 0.75rem;
427
+ color: var(--color-text-secondary, #5a6c8a);
428
+ text-decoration: none;
429
+ font-size: 0.9rem;
430
+ line-height: 1.5;
431
+ border-left: 2px solid transparent;
432
+ border-radius: 4px;
433
+ transition: all 0.2s ease;
434
+
435
+ &:hover,
436
+ &:focus {
437
+ color: var(--color-accent, #3277f6);
438
+ background-color: rgba(50, 119, 246, 0.05);
439
+ border-left-color: var(--color-accent, #3277f6);
440
+ }
441
+
442
+ &.is-active {
443
+ color: var(--color-accent, #3277f6);
444
+ background-color: rgba(50, 119, 246, 0.1);
445
+ border-left-color: var(--color-accent, #3277f6);
446
+ font-weight: 500;
447
+ }
448
+ }
449
+ }
450
+
451
+ &__stats {
452
+ padding: 0.75rem 1.25rem;
453
+ border-top: 1px solid var(--color-border, #e0e4ed);
454
+ background-color: var(--color-background, #ffffff);
455
+ font-size: 0.8125rem;
456
+ color: var(--color-text-tertiary, #8995a8);
457
+ }
458
+
459
+ &__reading-progress {
460
+ [data-progress-percent] {
461
+ font-weight: 600;
462
+ color: var(--color-accent, #3277f6);
463
+ }
464
+ }
465
+
466
+ // Sticky behavior
467
+ &.is-sticky {
468
+ position: sticky;
469
+ top: 80px; // Adjust based on your header height
470
+ max-height: calc(100vh - 100px);
471
+
472
+ .enhanced-toc__content {
473
+ max-height: calc(100vh - 250px);
474
+ }
475
+ }
476
+ }
477
+
478
+ // ============================================================================
479
+ // Difficulty Badge
480
+ // ============================================================================
481
+
482
+ .difficulty-badge {
483
+ display: inline-flex;
484
+ align-items: center;
485
+ gap: 0.375rem;
486
+ padding: 0.25rem 0.75rem;
487
+ border-radius: 999px;
488
+ font-size: 0.8125rem;
489
+ font-weight: 600;
490
+ line-height: 1.4;
491
+ border: 1px solid;
492
+
493
+ &__icon {
494
+ flex-shrink: 0;
495
+ }
496
+
497
+ &__label {
498
+ text-transform: uppercase;
499
+ letter-spacing: 0.025em;
500
+ }
501
+
502
+ &__description {
503
+ display: none; // Hidden by default, can be shown via parameter
504
+ }
505
+
506
+ // Difficulty levels with distinct colors
507
+ &--beginner {
508
+ background-color: #ECFDF5;
509
+ color: #047857;
510
+ border-color: #A7F3D0;
511
+
512
+ &:hover {
513
+ background-color: #D1FAE5;
514
+ }
515
+ }
516
+
517
+ &--intermediate {
518
+ background-color: #EFF6FF;
519
+ color: #1E40AF;
520
+ border-color: #BFDBFE;
521
+
522
+ &:hover {
523
+ background-color: #DBEAFE;
524
+ }
525
+ }
526
+
527
+ &--advanced {
528
+ background-color: #FFF7ED;
529
+ color: #C2410C;
530
+ border-color: #FED7AA;
531
+
532
+ &:hover {
533
+ background-color: #FFEDD5;
534
+ }
535
+ }
536
+
537
+ &--expert {
538
+ background-color: #FEF2F2;
539
+ color: #991B1B;
540
+ border-color: #FECACA;
541
+
542
+ &:hover {
543
+ background-color: #FEE2E2;
544
+ }
545
+ }
546
+ }
547
+
548
+ // ============================================================================
549
+ // Print Styles
550
+ // ============================================================================
551
+
552
+ @media print {
553
+ .social-share,
554
+ .enhanced-toc__progress,
555
+ .enhanced-toc__toggle,
556
+ .enhanced-toc__stats {
557
+ display: none !important;
558
+ }
559
+
560
+ .breadcrumbs {
561
+ border-bottom: 1px solid #000;
562
+ page-break-after: avoid;
563
+ }
564
+
565
+ .author-bio {
566
+ page-break-inside: avoid;
567
+ border: 1px solid #000;
568
+ }
569
+
570
+ .difficulty-badge {
571
+ border: 1px solid #000;
572
+ print-color-adjust: exact;
573
+ -webkit-print-color-adjust: exact;
574
+ }
575
+
576
+ .enhanced-toc {
577
+ position: relative !important;
578
+ top: auto !important;
579
+ page-break-inside: avoid;
580
+ }
581
+ }
582
+
583
+ // ============================================================================
584
+ // Reduced Motion Support
585
+ // ============================================================================
586
+
587
+ @media (prefers-reduced-motion: reduce) {
588
+ .social-share__button,
589
+ .breadcrumbs__link,
590
+ .author-bio__social-link,
591
+ .enhanced-toc a {
592
+ transition: none !important;
593
+ transform: none !important;
594
+ }
595
+
596
+ .enhanced-toc__progress-bar {
597
+ transition: none !important;
598
+ }
599
+ }
600
+
601
+ // ============================================================================
602
+ // High Contrast Mode Support
603
+ // ============================================================================
604
+
605
+ @media (prefers-contrast: high) {
606
+ .social-share__button,
607
+ .author-bio__social-link {
608
+ border-width: 2px;
609
+ }
610
+
611
+ .difficulty-badge {
612
+ border-width: 2px;
613
+ font-weight: 700;
614
+ }
615
+
616
+ .enhanced-toc a.is-active {
617
+ border-left-width: 4px;
618
+ }
619
+ }
620
+
621
+ // ============================================================================
622
+ // Responsive Design
623
+ // ============================================================================
624
+
625
+ @include respond-below(md) {
626
+ .social-share {
627
+ &__buttons {
628
+ gap: 0.5rem;
629
+ }
630
+
631
+ &__button {
632
+ flex: 1 1 calc(50% - 0.25rem);
633
+ min-width: 140px;
634
+
635
+ .social-share__label {
636
+ font-size: 0.8125rem;
637
+ }
638
+ }
639
+ }
640
+
641
+ .enhanced-toc {
642
+ &.is-sticky {
643
+ position: relative;
644
+ top: 0;
645
+ max-height: none;
646
+ }
647
+
648
+ &__content {
649
+ max-height: 400px;
650
+ }
651
+ }
652
+
653
+ .author-bio {
654
+ padding: 1.5rem;
655
+
656
+ &__avatar-img,
657
+ &__avatar-placeholder {
658
+ width: 60px;
659
+ height: 60px;
660
+ }
661
+
662
+ &__name {
663
+ font-size: 1.25rem;
664
+ }
665
+ }
666
+ }
667
+
668
+ @include respond-below(mobile) {
669
+ .breadcrumbs {
670
+ &__list {
671
+ font-size: 0.8125rem;
672
+ }
673
+
674
+ &__separator {
675
+ margin: 0 0.25rem;
676
+ }
677
+
678
+ &__item {
679
+ &--current .breadcrumbs__current {
680
+ max-width: 150px;
681
+ overflow: hidden;
682
+ text-overflow: ellipsis;
683
+ white-space: nowrap;
684
+ }
685
+ }
686
+ }
687
+
688
+ .social-share {
689
+ &__buttons {
690
+ flex-direction: column;
691
+ }
692
+
693
+ &__button {
694
+ width: 100%;
695
+ justify-content: center;
696
+ }
697
+ }
698
+
699
+ .difficulty-badge {
700
+ font-size: 0.75rem;
701
+ padding: 0.2rem 0.6rem;
702
+
703
+ &__icon {
704
+ width: 14px;
705
+ height: 14px;
706
+ }
707
+ }
708
+ }
709
+
710
+ // ============================================================================
711
+ // Focus Visible (for better keyboard navigation)
712
+ // ============================================================================
713
+
714
+ .social-share__button:focus-visible,
715
+ .breadcrumbs__link:focus-visible,
716
+ .author-bio__social-link:focus-visible,
717
+ .enhanced-toc a:focus-visible,
718
+ .enhanced-toc__toggle:focus-visible {
719
+ outline: 3px solid var(--color-accent, #3277f6);
720
+ outline-offset: 2px;
721
+ }