datalog-theme 0.6.1 → 0.8.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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +175 -0
  3. data/CITATION.cff +2 -2
  4. data/README.md +26 -19
  5. data/_data/cdn-integrity.yml +0 -30
  6. data/_includes/analytics/dashboard.html +3 -1
  7. data/_includes/components/api-function.html +20 -1
  8. data/_includes/components/author-bio.html +2 -2
  9. data/_includes/components/enhanced-code-block.html +1 -1
  10. data/_includes/components/hero.html +19 -1
  11. data/_includes/csp-meta.html +115 -11
  12. data/_includes/footer.html +19 -20
  13. data/_includes/head.html +61 -29
  14. data/_includes/header/navigation.html +12 -15
  15. data/_includes/header.html +29 -20
  16. data/_includes/layouts/default/article.html +5 -1
  17. data/_includes/meta/math-config.html +27 -1
  18. data/_includes/meta/schema.html +5 -2
  19. data/_includes/meta/scripts-loader.html +16 -31
  20. data/_includes/post/related-posts.html +4 -7
  21. data/_includes/scripts.html +1 -9
  22. data/_includes/search/index-data.json +131 -0
  23. data/_includes/search/page.html +136 -0
  24. data/_layouts/dataset.html +1 -0
  25. data/_layouts/default.html +16 -8
  26. data/_layouts/home.html +6 -0
  27. data/_layouts/notebook.html +1 -0
  28. data/_layouts/package.html +1 -0
  29. data/_layouts/portfolio.html +1 -0
  30. data/_layouts/post.html +20 -5
  31. data/_layouts/project.html +2 -1
  32. data/_plugins/analytics_dashboard.rb +9 -3
  33. data/_plugins/config_validator.rb +12 -7
  34. data/_plugins/csp_generator.rb +18 -28
  35. data/_plugins/datalog_bibliography.rb +9 -7
  36. data/_plugins/datalog_comments.rb +8 -5
  37. data/_plugins/datalog_slides.rb +9 -8
  38. data/_plugins/i18n.rb +7 -8
  39. data/_plugins/image_optimizer.rb +17 -6
  40. data/_plugins/math_preprocessor.rb +36 -3
  41. data/_plugins/notebook_converter.rb +23 -43
  42. data/_plugins/plugin_loader.rb +3 -1
  43. data/_plugins/publications_generator.rb +8 -2
  44. data/_plugins/rouge_highlight_filter.rb +42 -0
  45. data/_plugins/search_code_blocks.rb +30 -0
  46. data/_plugins/search_normalizer.rb +15 -53
  47. data/_plugins/search_pages.rb +72 -0
  48. data/_sass/_academic-dashboard.scss +262 -0
  49. data/_sass/_base.scss +19 -1
  50. data/_sass/_components.scss +77 -1144
  51. data/_sass/_features.scss +17 -0
  52. data/_sass/_font-fallbacks.scss +43 -0
  53. data/_sass/_header.scss +10 -0
  54. data/_sass/_layout.scss +18 -12
  55. data/_sass/_mathematical.scss +1 -1
  56. data/_sass/_notebooks.scss +322 -0
  57. data/_sass/_open-science-badges.scss +56 -0
  58. data/_sass/{_phase1-enhancements.scss → _post-components.scss} +46 -1
  59. data/_sass/_search-page.scss +530 -0
  60. data/_sass/_search.scss +47 -1
  61. data/_sass/_syntax-highlighting.scss +212 -97
  62. data/_sass/_theme.scss +42 -18
  63. data/_sass/_typography.scss +14 -0
  64. data/_sass/_variables.scss +7 -4
  65. data/assets/css/main.scss +14 -0
  66. data/assets/img/hero-detail-640.webp +0 -0
  67. data/assets/img/hero-detail.webp +0 -0
  68. data/assets/img/social-card.png +0 -0
  69. data/assets/js/dist/academic.js +1 -0
  70. data/assets/js/dist/analytics-dashboard.js +1 -0
  71. data/assets/js/dist/chunks/chunk-225H5YXE.js +1 -0
  72. data/assets/js/dist/core.js +1 -0
  73. data/assets/js/dist/loader.js +1 -0
  74. data/assets/js/dist/math.js +1 -0
  75. data/assets/js/dist/notebook.js +1 -0
  76. data/assets/js/dist/search.js +1 -0
  77. data/assets/js/dist/visualizations.js +11 -0
  78. data/assets/js/loader.js +3 -1
  79. data/datalog-theme.gemspec +43 -22
  80. data/lib/datalog/cli.rb +53 -15
  81. data/lib/datalog/plugin_system/dependency_resolver.rb +0 -2
  82. data/lib/datalog/theme/package.rb +57 -0
  83. data/lib/datalog/theme/repository_checkout.rb +90 -0
  84. data/lib/datalog/theme/version.rb +1 -1
  85. data/lib/datalog/warning_filter.rb +5 -11
  86. data/lib/datalog-theme.rb +21 -0
  87. metadata +75 -146
  88. data/_data/academic.yml +0 -217
  89. data/_data/config/author.yml +0 -121
  90. data/_data/config/features.yml +0 -262
  91. data/_data/config/site.yml +0 -42
  92. data/_data/config/theme.yml +0 -181
  93. data/_data/datasets.yml +0 -28
  94. data/_data/js_meta.json +0 -371
  95. data/_data/navigation.yml +0 -145
  96. data/_data/projects.yml +0 -41
  97. data/_data/publications.yml +0 -28
  98. data/_data/social.yml +0 -73
  99. data/_data/visualizations.yml +0 -51
  100. data/_includes/components/advanced-search.html +0 -682
  101. data/_includes/components/bookmark-system.html +0 -96
  102. data/_includes/components/comments.html +0 -244
  103. data/_includes/components/content-recommendations.html +0 -228
  104. data/_includes/components/email-preferences.html +0 -200
  105. data/_includes/components/enhanced-metadata.html +0 -228
  106. data/_includes/components/language-switcher.html +0 -396
  107. data/_includes/components/navigation-enhancements.html +0 -454
  108. data/_includes/components/newsletter-signup.html +0 -178
  109. data/_includes/components/popular-posts.html +0 -233
  110. data/_includes/components/reading-progress.html +0 -133
  111. data/_includes/components/reading-time.html +0 -121
  112. data/_includes/components/series-navigation.html +0 -124
  113. data/_includes/components/social-proof.html +0 -34
  114. data/_includes/components/user-preferences.html +0 -566
  115. data/_layouts/archive.html +0 -282
  116. data/_layouts/post-sidebar.html +0 -183
  117. data/_sass/_phase3-enhancements.scss +0 -874
  118. data/_sass/_phase4-enhancements.scss +0 -1214
  119. data/_sass/_phase5-enhancements.scss +0 -414
  120. data/assets/img/20220607123041_detail.001.png +0 -0
  121. data/assets/js/academic.js +0 -262
  122. data/assets/js/analytics-dashboard.js +0 -382
  123. data/assets/js/core/dark-mode.js +0 -79
  124. data/assets/js/core/github-cards.js +0 -123
  125. data/assets/js/core/language-filter.js +0 -69
  126. data/assets/js/core/navigation.js +0 -184
  127. data/assets/js/core/scroll-progress.js +0 -45
  128. data/assets/js/core/search-hotkeys.js +0 -62
  129. data/assets/js/core/skip-links.js +0 -62
  130. data/assets/js/main.js +0 -23
  131. data/assets/js/math.js +0 -818
  132. data/assets/js/notebook.js +0 -158
  133. data/assets/js/search/analytics.js +0 -91
  134. data/assets/js/search/app.js +0 -271
  135. data/assets/js/search/autocomplete.js +0 -120
  136. data/assets/js/search/engine.js +0 -260
  137. data/assets/js/search/filters.js +0 -38
  138. data/assets/js/search/render.js +0 -217
  139. data/assets/js/search/utils.js +0 -99
  140. data/assets/js/search.js +0 -354
  141. data/assets/js/visualizations.js +0 -816
  142. data/assets/publications/datalog-publications.bib +0 -8
  143. data/assets/publications/datalog-publications.ris +0 -9
  144. data/assets/publications/publications.bib +0 -30
  145. data/assets/templates/diogo-ribeiro-cv.md +0 -31
  146. data/assets/templates/diogo-ribeiro-cv.tex +0 -32
  147. data/lib/datalog/theme/theme.rb +0 -18
@@ -1,874 +0,0 @@
1
- // ============================================================================
2
- // Phase 3 Enhancements Stylesheet
3
- // Advanced features: Archives, Reading Progress, Recommendations, Comments
4
- // ============================================================================
5
-
6
- @use 'mixins' as *;
7
-
8
- // ----------------------------------------------------------------------------
9
- // Archive Layout
10
- // ----------------------------------------------------------------------------
11
-
12
- .archive-layout {
13
- max-width: 1200px;
14
- margin: 0 auto;
15
- padding: 2rem 1rem;
16
-
17
- &__header {
18
- margin-bottom: 3rem;
19
- text-align: center;
20
-
21
- h1 {
22
- font-size: 2.5rem;
23
- margin-bottom: 1rem;
24
- color: var(--color-text-primary, #1a202c);
25
- }
26
-
27
- p {
28
- font-size: 1.125rem;
29
- color: var(--color-text-secondary, #4a5568);
30
- }
31
- }
32
-
33
- &__stats {
34
- display: flex;
35
- gap: 2rem;
36
- justify-content: center;
37
- flex-wrap: wrap;
38
- margin-bottom: 2rem;
39
- }
40
-
41
- &__stat {
42
- text-align: center;
43
-
44
- &-value {
45
- display: block;
46
- font-size: 2rem;
47
- font-weight: 700;
48
- color: var(--color-accent, #3b82f6);
49
- }
50
-
51
- &-label {
52
- display: block;
53
- font-size: 0.875rem;
54
- color: var(--color-text-secondary, #4a5568);
55
- text-transform: uppercase;
56
- letter-spacing: 0.05em;
57
- }
58
- }
59
-
60
- &__filters {
61
- background: var(--color-background-secondary, #f7fafc);
62
- padding: 1.5rem;
63
- border-radius: 8px;
64
- margin-bottom: 2rem;
65
- display: flex;
66
- gap: 1rem;
67
- flex-wrap: wrap;
68
- align-items: center;
69
-
70
- label {
71
- font-size: 0.875rem;
72
- font-weight: 600;
73
- color: var(--color-text-primary, #1a202c);
74
- margin-right: 0.5rem;
75
- }
76
-
77
- select {
78
- padding: 0.5rem 2rem 0.5rem 1rem;
79
- border: 1px solid var(--color-border, #cbd5e0);
80
- border-radius: 6px;
81
- background-color: white;
82
- font-size: 0.875rem;
83
- cursor: pointer;
84
- transition: all 0.2s ease;
85
-
86
- &:hover {
87
- border-color: var(--color-accent, #3b82f6);
88
- }
89
-
90
- &:focus {
91
- outline: none;
92
- border-color: var(--color-accent, #3b82f6);
93
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
94
- }
95
- }
96
-
97
- button[data-reset-filters] {
98
- margin-left: auto;
99
- padding: 0.5rem 1rem;
100
- background: transparent;
101
- border: 1px solid var(--color-border, #cbd5e0);
102
- border-radius: 6px;
103
- cursor: pointer;
104
- font-size: 0.875rem;
105
- transition: all 0.2s ease;
106
-
107
- &:hover {
108
- background: var(--color-background-secondary, #f7fafc);
109
- border-color: var(--color-accent, #3b82f6);
110
- }
111
- }
112
- }
113
-
114
- &__results-count {
115
- text-align: center;
116
- margin-bottom: 2rem;
117
- font-size: 0.875rem;
118
- color: var(--color-text-secondary, #4a5568);
119
- }
120
- }
121
-
122
- .archive-year {
123
- margin-bottom: 3rem;
124
-
125
- &__header {
126
- display: flex;
127
- align-items: center;
128
- gap: 1rem;
129
- margin-bottom: 1.5rem;
130
- padding-bottom: 0.75rem;
131
- border-bottom: 2px solid var(--color-border, #cbd5e0);
132
-
133
- h2 {
134
- font-size: 1.75rem;
135
- margin: 0;
136
- color: var(--color-text-primary, #1a202c);
137
- }
138
-
139
- &-count {
140
- font-size: 0.875rem;
141
- color: var(--color-text-secondary, #4a5568);
142
- padding: 0.25rem 0.75rem;
143
- background: var(--color-background-secondary, #f7fafc);
144
- border-radius: 12px;
145
- }
146
- }
147
- }
148
-
149
- .archive-month {
150
- margin-bottom: 2rem;
151
-
152
- &__header {
153
- margin-bottom: 1rem;
154
-
155
- h3 {
156
- font-size: 1.25rem;
157
- color: var(--color-text-primary, #1a202c);
158
- margin: 0;
159
- }
160
- }
161
-
162
- &__posts {
163
- list-style: none;
164
- padding: 0;
165
- margin: 0;
166
- }
167
- }
168
-
169
- .archive-post {
170
- display: flex;
171
- gap: 1.5rem;
172
- padding: 1rem;
173
- border-radius: 8px;
174
- transition: all 0.2s ease;
175
- align-items: flex-start;
176
-
177
- &:hover {
178
- background: var(--color-background-secondary, #f7fafc);
179
- }
180
-
181
- &__date {
182
- flex-shrink: 0;
183
- width: 60px;
184
- text-align: center;
185
- color: var(--color-text-secondary, #4a5568);
186
- font-size: 0.875rem;
187
- line-height: 1.4;
188
-
189
- &-day {
190
- display: block;
191
- font-size: 1.5rem;
192
- font-weight: 700;
193
- color: var(--color-accent, #3b82f6);
194
- }
195
-
196
- &-month {
197
- display: block;
198
- text-transform: uppercase;
199
- font-size: 0.75rem;
200
- letter-spacing: 0.05em;
201
- }
202
- }
203
-
204
- &__content {
205
- flex: 1;
206
- }
207
-
208
- &__title {
209
- margin: 0 0 0.5rem;
210
- font-size: 1.125rem;
211
- line-height: 1.4;
212
-
213
- a {
214
- color: var(--color-text-primary, #1a202c);
215
- text-decoration: none;
216
- transition: color 0.2s ease;
217
-
218
- &:hover {
219
- color: var(--color-accent, #3b82f6);
220
- }
221
- }
222
- }
223
-
224
- &__excerpt {
225
- margin: 0 0 0.5rem;
226
- color: var(--color-text-secondary, #4a5568);
227
- font-size: 0.875rem;
228
- line-height: 1.6;
229
- }
230
-
231
- &__meta {
232
- display: flex;
233
- gap: 0.75rem;
234
- flex-wrap: wrap;
235
- align-items: center;
236
- font-size: 0.875rem;
237
- color: var(--color-text-secondary, #4a5568);
238
- }
239
-
240
- &__tags {
241
- display: flex;
242
- gap: 0.5rem;
243
- flex-wrap: wrap;
244
- margin-top: 0.5rem;
245
- }
246
-
247
- &__tag {
248
- padding: 0.25rem 0.5rem;
249
- background: var(--color-background-secondary, #f7fafc);
250
- border-radius: 4px;
251
- font-size: 0.75rem;
252
- color: var(--color-text-secondary, #4a5568);
253
- text-decoration: none;
254
- transition: all 0.2s ease;
255
-
256
- &:hover {
257
- background: var(--color-accent, #3b82f6);
258
- color: white;
259
- }
260
- }
261
- }
262
-
263
- // ----------------------------------------------------------------------------
264
- // Reading Progress Tracker
265
- // ----------------------------------------------------------------------------
266
-
267
- .reading-progress {
268
- position: relative;
269
-
270
- &--top {
271
- position: fixed;
272
- top: 0;
273
- left: 0;
274
- right: 0;
275
- z-index: 100;
276
- background: white;
277
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
278
- }
279
-
280
- &--bottom {
281
- position: fixed;
282
- bottom: 0;
283
- left: 0;
284
- right: 0;
285
- z-index: 100;
286
- background: white;
287
- box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);
288
- }
289
-
290
- &--sticky {
291
- position: sticky;
292
- top: 80px;
293
- z-index: 10;
294
- }
295
-
296
- &__bar {
297
- height: 4px;
298
- background: var(--color-background-secondary, #e2e8f0);
299
- overflow: hidden;
300
- }
301
-
302
- &__fill {
303
- height: 100%;
304
- background: linear-gradient(90deg, var(--color-accent, #3b82f6), var(--color-accent-dark, #2563eb));
305
- transition: width 0.1s ease-out;
306
- will-change: width;
307
- }
308
-
309
- &__stats {
310
- display: flex;
311
- gap: 2rem;
312
- justify-content: center;
313
- align-items: center;
314
- padding: 0.5rem 1rem;
315
- font-size: 0.875rem;
316
- color: var(--color-text-secondary, #4a5568);
317
- }
318
-
319
- &__percentage,
320
- &__time {
321
- display: flex;
322
- align-items: center;
323
- gap: 0.5rem;
324
- }
325
-
326
- &__icon {
327
- flex-shrink: 0;
328
- }
329
- }
330
-
331
- // ----------------------------------------------------------------------------
332
- // Reading Time Estimates
333
- // ----------------------------------------------------------------------------
334
-
335
- .reading-time {
336
- display: inline-flex;
337
- align-items: center;
338
- gap: 0.375rem;
339
- color: var(--color-text-secondary, #4a5568);
340
- font-size: 0.875rem;
341
-
342
- &__icon {
343
- flex-shrink: 0;
344
- opacity: 0.7;
345
- }
346
-
347
- &__separator {
348
- margin: 0 0.25rem;
349
- opacity: 0.5;
350
- }
351
-
352
- &--badge {
353
- padding: 0.5rem 1rem;
354
- background: var(--color-background-secondary, #f7fafc);
355
- border-radius: 6px;
356
- font-weight: 500;
357
-
358
- .reading-time__badge {
359
- display: flex;
360
- flex-direction: column;
361
- gap: 0.25rem;
362
- }
363
-
364
- .reading-time__word-count {
365
- font-size: 0.75rem;
366
- opacity: 0.7;
367
- }
368
- }
369
-
370
- &--detailed {
371
- padding: 1rem;
372
- background: var(--color-background-secondary, #f7fafc);
373
- border-radius: 8px;
374
- flex-direction: column;
375
- align-items: flex-start;
376
- gap: 0.5rem;
377
-
378
- .reading-time__details {
379
- display: flex;
380
- flex-direction: column;
381
- gap: 0.5rem;
382
- width: 100%;
383
- }
384
-
385
- .reading-time__primary {
386
- font-size: 1.125rem;
387
- color: var(--color-text-primary, #1a202c);
388
- }
389
-
390
- .reading-time__secondary {
391
- display: flex;
392
- gap: 1rem;
393
- font-size: 0.875rem;
394
- }
395
-
396
- .reading-time__range {
397
- font-size: 0.75rem;
398
- color: var(--color-text-secondary, #4a5568);
399
- }
400
- }
401
- }
402
-
403
- // ----------------------------------------------------------------------------
404
- // Content Recommendations
405
- // ----------------------------------------------------------------------------
406
-
407
- .content-recommendations {
408
- margin: 3rem 0;
409
- padding: 2rem;
410
- background: var(--color-background-secondary, #f7fafc);
411
- border-radius: 12px;
412
-
413
- &__heading {
414
- font-size: 1.5rem;
415
- margin: 0 0 1.5rem;
416
- color: var(--color-text-primary, #1a202c);
417
- }
418
-
419
- &__list {
420
- display: grid;
421
- gap: 1.5rem;
422
- }
423
-
424
- &--grid &__list {
425
- @media (min-width: 768px) {
426
- grid-template-columns: repeat(2, 1fr);
427
- }
428
-
429
- @media (min-width: 1024px) {
430
- grid-template-columns: repeat(3, 1fr);
431
- }
432
- }
433
-
434
- &--list &__list {
435
- grid-template-columns: 1fr;
436
- }
437
-
438
- &--compact &__list {
439
- gap: 1rem;
440
- }
441
-
442
- &__footer {
443
- margin-top: 1.5rem;
444
- text-align: center;
445
- }
446
-
447
- &__view-all {
448
- display: inline-flex;
449
- align-items: center;
450
- gap: 0.5rem;
451
- padding: 0.75rem 1.5rem;
452
- background: white;
453
- border: 1px solid var(--color-border, #cbd5e0);
454
- border-radius: 8px;
455
- color: var(--color-text-primary, #1a202c);
456
- text-decoration: none;
457
- font-weight: 500;
458
- transition: all 0.2s ease;
459
-
460
- &:hover {
461
- background: var(--color-accent, #3b82f6);
462
- color: white;
463
- border-color: var(--color-accent, #3b82f6);
464
- }
465
-
466
- svg {
467
- transition: transform 0.2s ease;
468
- }
469
-
470
- &:hover svg {
471
- transform: translateX(4px);
472
- }
473
- }
474
- }
475
-
476
- .recommendation-card {
477
- background: white;
478
- border-radius: 8px;
479
- overflow: hidden;
480
- transition: all 0.2s ease;
481
- border: 1px solid var(--color-border, #e2e8f0);
482
-
483
- &:hover {
484
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
485
- transform: translateY(-2px);
486
- }
487
-
488
- &__image {
489
- position: relative;
490
- width: 100%;
491
- padding-top: 56.25%; // 16:9 aspect ratio
492
- overflow: hidden;
493
- background: var(--color-background-secondary, #f7fafc);
494
-
495
- a {
496
- position: absolute;
497
- top: 0;
498
- left: 0;
499
- right: 0;
500
- bottom: 0;
501
- }
502
-
503
- img {
504
- position: absolute;
505
- top: 0;
506
- left: 0;
507
- width: 100%;
508
- height: 100%;
509
- object-fit: cover;
510
- transition: transform 0.3s ease;
511
- }
512
-
513
- &:hover img {
514
- transform: scale(1.05);
515
- }
516
- }
517
-
518
- &__content {
519
- padding: 1.25rem;
520
- }
521
-
522
- &__title {
523
- margin: 0 0 0.75rem;
524
- font-size: 1.125rem;
525
- line-height: 1.4;
526
- }
527
-
528
- &__link {
529
- color: var(--color-text-primary, #1a202c);
530
- text-decoration: none;
531
- transition: color 0.2s ease;
532
-
533
- &:hover {
534
- color: var(--color-accent, #3b82f6);
535
- }
536
- }
537
-
538
- &__excerpt {
539
- margin: 0 0 1rem;
540
- color: var(--color-text-secondary, #4a5568);
541
- font-size: 0.875rem;
542
- line-height: 1.6;
543
- }
544
-
545
- &__meta {
546
- display: flex;
547
- gap: 0.5rem;
548
- flex-wrap: wrap;
549
- align-items: center;
550
- font-size: 0.875rem;
551
- color: var(--color-text-secondary, #4a5568);
552
- margin-bottom: 0.75rem;
553
- }
554
-
555
- &__separator {
556
- opacity: 0.5;
557
- }
558
-
559
- &__score {
560
- padding: 0.125rem 0.5rem;
561
- background: var(--color-background-secondary, #f7fafc);
562
- border-radius: 4px;
563
- font-size: 0.75rem;
564
- font-family: monospace;
565
- }
566
-
567
- &__tags {
568
- display: flex;
569
- gap: 0.5rem;
570
- flex-wrap: wrap;
571
- }
572
-
573
- &__tag {
574
- padding: 0.25rem 0.625rem;
575
- background: var(--color-background-secondary, #f7fafc);
576
- border-radius: 4px;
577
- font-size: 0.75rem;
578
- color: var(--color-text-secondary, #4a5568);
579
- }
580
- }
581
-
582
- // Compact layout variant
583
- .content-recommendations--compact {
584
- .recommendation-card {
585
- display: flex;
586
- gap: 1rem;
587
-
588
- &__image {
589
- width: 120px;
590
- padding-top: 0;
591
- height: 80px;
592
- flex-shrink: 0;
593
- }
594
-
595
- &__content {
596
- padding: 0.5rem 0.5rem 0.5rem 0;
597
- }
598
-
599
- &__title {
600
- font-size: 1rem;
601
- margin-bottom: 0.5rem;
602
- }
603
-
604
- &__excerpt {
605
- display: none;
606
- }
607
- }
608
- }
609
-
610
- // ----------------------------------------------------------------------------
611
- // Comments Section
612
- // ----------------------------------------------------------------------------
613
-
614
- .comments-section {
615
- margin: 4rem 0 2rem;
616
- padding-top: 2rem;
617
- border-top: 2px solid var(--color-border, #e2e8f0);
618
-
619
- &__header {
620
- display: flex;
621
- align-items: center;
622
- justify-content: space-between;
623
- margin-bottom: 2rem;
624
- }
625
-
626
- &__title {
627
- display: flex;
628
- align-items: center;
629
- gap: 0.75rem;
630
- font-size: 1.5rem;
631
- margin: 0;
632
- color: var(--color-text-primary, #1a202c);
633
- }
634
-
635
- &__icon {
636
- color: var(--color-accent, #3b82f6);
637
- }
638
-
639
- &__count {
640
- padding: 0.25rem 0.75rem;
641
- background: var(--color-background-secondary, #f7fafc);
642
- border-radius: 12px;
643
- font-size: 0.875rem;
644
- color: var(--color-text-secondary, #4a5568);
645
- font-weight: 500;
646
- }
647
-
648
- &__placeholder {
649
- text-align: center;
650
- padding: 3rem 1rem;
651
- background: var(--color-background-secondary, #f7fafc);
652
- border-radius: 8px;
653
- }
654
-
655
- &__load-button {
656
- display: inline-flex;
657
- align-items: center;
658
- gap: 0.75rem;
659
- padding: 1rem 2rem;
660
- background: white;
661
- border: 2px solid var(--color-border, #cbd5e0);
662
- border-radius: 8px;
663
- cursor: pointer;
664
- font-size: 1rem;
665
- font-weight: 500;
666
- color: var(--color-text-primary, #1a202c);
667
- transition: all 0.2s ease;
668
-
669
- &:hover {
670
- background: var(--color-accent, #3b82f6);
671
- color: white;
672
- border-color: var(--color-accent, #3b82f6);
673
- }
674
-
675
- &:focus {
676
- outline: none;
677
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2);
678
- }
679
-
680
- svg {
681
- transition: transform 0.2s ease;
682
- }
683
-
684
- &:hover svg {
685
- transform: scale(1.1);
686
- }
687
- }
688
-
689
- &__container {
690
- min-height: 200px;
691
- }
692
-
693
- &__privacy {
694
- margin-top: 1.5rem;
695
- padding-top: 1rem;
696
- border-top: 1px solid var(--color-border, #e2e8f0);
697
- text-align: center;
698
-
699
- small {
700
- display: inline-flex;
701
- align-items: center;
702
- gap: 0.5rem;
703
- color: var(--color-text-secondary, #4a5568);
704
- font-size: 0.875rem;
705
- }
706
-
707
- a {
708
- color: var(--color-accent, #3b82f6);
709
- text-decoration: none;
710
-
711
- &:hover {
712
- text-decoration: underline;
713
- }
714
- }
715
-
716
- svg {
717
- flex-shrink: 0;
718
- }
719
- }
720
-
721
- &__custom {
722
- padding: 2rem;
723
- background: var(--color-background-secondary, #f7fafc);
724
- border-radius: 8px;
725
- }
726
- }
727
-
728
- // ----------------------------------------------------------------------------
729
- // Responsive Design
730
- // ----------------------------------------------------------------------------
731
-
732
- @include respond-below(md) {
733
- .archive-layout {
734
- padding: 1rem 0.5rem;
735
-
736
- &__header h1 {
737
- font-size: 2rem;
738
- }
739
-
740
- &__filters {
741
- flex-direction: column;
742
- align-items: stretch;
743
-
744
- select {
745
- width: 100%;
746
- }
747
-
748
- button[data-reset-filters] {
749
- margin-left: 0;
750
- }
751
- }
752
- }
753
-
754
- .archive-post {
755
- flex-direction: column;
756
- gap: 0.75rem;
757
-
758
- &__date {
759
- width: auto;
760
- text-align: left;
761
- display: flex;
762
- align-items: baseline;
763
- gap: 0.5rem;
764
-
765
- &-day {
766
- font-size: 1.25rem;
767
- }
768
- }
769
- }
770
-
771
- .reading-progress {
772
- &__stats {
773
- flex-direction: column;
774
- gap: 0.5rem;
775
- font-size: 0.75rem;
776
- }
777
- }
778
-
779
- .content-recommendations {
780
- padding: 1.5rem 1rem;
781
-
782
- &--grid &__list {
783
- grid-template-columns: 1fr;
784
- }
785
- }
786
-
787
- .comments-section {
788
- &__header {
789
- flex-direction: column;
790
- align-items: flex-start;
791
- gap: 1rem;
792
- }
793
- }
794
- }
795
-
796
- // ----------------------------------------------------------------------------
797
- // Print Styles
798
- // ----------------------------------------------------------------------------
799
-
800
- @media print {
801
- .reading-progress,
802
- .comments-section,
803
- .archive-layout__filters {
804
- display: none !important;
805
- }
806
-
807
- .content-recommendations {
808
- page-break-inside: avoid;
809
- break-inside: avoid;
810
- }
811
-
812
- .recommendation-card {
813
- box-shadow: none !important;
814
- border: 1px solid #ddd;
815
- }
816
- }
817
-
818
- // ----------------------------------------------------------------------------
819
- // Accessibility
820
- // ----------------------------------------------------------------------------
821
-
822
- // Reduced motion support
823
- @media (prefers-reduced-motion: reduce) {
824
- .reading-progress__fill,
825
- .recommendation-card,
826
- .archive-post,
827
- .comments-section__load-button svg {
828
- transition: none !important;
829
- }
830
-
831
- .recommendation-card__image img {
832
- transform: none !important;
833
- }
834
- }
835
-
836
- // High contrast mode support
837
- @media (prefers-contrast: high) {
838
- .archive-post,
839
- .recommendation-card,
840
- .comments-section__load-button {
841
- border-width: 2px;
842
- }
843
-
844
- .reading-progress__bar {
845
- background: #000;
846
-
847
- .reading-progress__fill {
848
- background: #0066ff;
849
- }
850
- }
851
- }
852
-
853
- // Focus visible styles
854
- .archive-post__title a:focus-visible,
855
- .recommendation-card__link:focus-visible,
856
- .comments-section__load-button:focus-visible,
857
- .content-recommendations__view-all:focus-visible {
858
- outline: 3px solid var(--color-accent, #3b82f6);
859
- outline-offset: 2px;
860
- border-radius: 4px;
861
- }
862
-
863
- // Screen reader only content
864
- .visually-hidden {
865
- position: absolute;
866
- width: 1px;
867
- height: 1px;
868
- padding: 0;
869
- margin: -1px;
870
- overflow: hidden;
871
- clip: rect(0, 0, 0, 0);
872
- white-space: nowrap;
873
- border-width: 0;
874
- }