datalog-theme 0.10.1 → 0.11.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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +127 -0
  3. data/CITATION.cff +2 -2
  4. data/README.md +4 -2
  5. data/_data/i18n/en.yml +55 -3
  6. data/_data/i18n/es.yml +55 -3
  7. data/_data/i18n/pt.yml +55 -3
  8. data/_includes/analytics/dashboard.html +24 -9
  9. data/_includes/components/academic-dashboard.html +168 -133
  10. data/_includes/components/author-bio.html +7 -5
  11. data/_includes/components/author-list.html +6 -5
  12. data/_includes/components/citation-tools.html +2 -1
  13. data/_includes/components/content-provenance.html +19 -1
  14. data/_includes/components/correction-report.html +15 -8
  15. data/_includes/components/hero.html +22 -15
  16. data/_includes/components/package-index.html +121 -0
  17. data/_includes/components/package-install.html +27 -50
  18. data/_includes/components/post-list.html +14 -0
  19. data/_includes/components/responsive-image.html +15 -21
  20. data/_includes/footer.html +1 -1
  21. data/_includes/head.html +70 -11
  22. data/_includes/layouts/default/article.html +76 -46
  23. data/_includes/meta/dataset-json.html +171 -0
  24. data/_includes/meta/math-config.html +15 -1
  25. data/_includes/meta/package-json.html +69 -0
  26. data/_includes/meta/person-json.html +36 -13
  27. data/_includes/meta/publisher.html +15 -0
  28. data/_includes/meta/schema.html +108 -23
  29. data/_includes/meta/scholarly.html +10 -5
  30. data/_includes/post/related-posts.html +17 -43
  31. data/_includes/scripts.html +2 -2
  32. data/_includes/search/index-data.json +10 -1
  33. data/_includes/search/page.html +11 -6
  34. data/_layouts/archive.html +67 -0
  35. data/_layouts/dataset.html +2 -1
  36. data/_layouts/default.html +13 -11
  37. data/_layouts/docs.html +53 -0
  38. data/_layouts/home.html +30 -1
  39. data/_layouts/notebook.html +5 -1
  40. data/_layouts/package.html +38 -21
  41. data/_layouts/portfolio.html +1 -0
  42. data/_layouts/post.html +21 -62
  43. data/_layouts/project.html +2 -1
  44. data/_layouts/research.html +14 -2
  45. data/_plugins/analytics_dashboard.rb +4 -1
  46. data/_plugins/archive.rb +114 -0
  47. data/_plugins/authors.rb +50 -1
  48. data/_plugins/citation_exports.rb +12 -1
  49. data/_plugins/config_validator.rb +77 -2
  50. data/_plugins/correction_fallback.rb +110 -0
  51. data/_plugins/image_optimizer.rb +129 -22
  52. data/_plugins/math_preprocessor.rb +7 -48
  53. data/_plugins/notebook_converter.rb +44 -5
  54. data/_plugins/packages.rb +84 -0
  55. data/_plugins/page_dates.rb +37 -0
  56. data/_plugins/references.rb +16 -2
  57. data/_plugins/related_posts.rb +149 -0
  58. data/_plugins/search_sections.rb +110 -0
  59. data/_plugins/site_identity.rb +42 -0
  60. data/_plugins/social_cards.rb +17 -0
  61. data/_sass/_academic-dashboard.scss +18 -30
  62. data/_sass/_base.scss +2 -0
  63. data/_sass/_components.scss +21 -23
  64. data/_sass/_docs.scss +143 -0
  65. data/_sass/_features.scss +6 -0
  66. data/_sass/_layout.scss +65 -6
  67. data/_sass/_mathematical.scss +61 -19
  68. data/_sass/_notebooks.scss +1 -32
  69. data/_sass/_package-docs.scss +6 -9
  70. data/_sass/_post-components.scss +23 -23
  71. data/_sass/_print.scss +1 -1
  72. data/_sass/_search-page.scss +75 -0
  73. data/_sass/_search.scss +17 -26
  74. data/_sass/_syntax-highlighting.scss +23 -1
  75. data/_sass/_theme.scss +1 -0
  76. data/_sass/_utilities.scss +87 -40
  77. data/_sass/_variables.scss +31 -29
  78. data/assets/css/main.scss +2 -1
  79. data/assets/js/dist/academic.js +1 -1
  80. data/assets/js/dist/analytics-dashboard.js +1 -1
  81. data/assets/js/dist/chunks/chunk-TNVD6UAM.js +1 -0
  82. data/assets/js/dist/comments.js +1 -1
  83. data/assets/js/dist/contact.js +1 -1
  84. data/assets/js/dist/core.js +1 -1
  85. data/assets/js/dist/corrections.js +5 -1
  86. data/assets/js/dist/loader.js +1 -1
  87. data/assets/js/dist/math.js +2 -1
  88. data/assets/js/dist/moderation.js +1 -1
  89. data/assets/js/dist/reactions.js +1 -1
  90. data/assets/js/dist/search.js +1 -1
  91. data/assets/js/dist/sources.json +20 -16
  92. data/assets/js/dist/subscriptions.js +1 -1
  93. data/assets/js/loader.js +6 -2
  94. data/lib/datalog/audit/checks.rb +269 -0
  95. data/lib/datalog/audit/known_keys.rb +61 -0
  96. data/lib/datalog/audit/site_reader.rb +118 -0
  97. data/lib/datalog/audit/source_file.rb +85 -0
  98. data/lib/datalog/audit.rb +145 -0
  99. data/lib/datalog/citations/bibtex.rb +200 -0
  100. data/lib/datalog/citations/entry.rb +333 -0
  101. data/lib/datalog/citations/markup.rb +79 -0
  102. data/lib/datalog/cli.rb +164 -89
  103. data/lib/datalog/critical_css.rb +126 -21
  104. data/lib/datalog/latex_speech/words.json +88 -0
  105. data/lib/datalog/latex_speech.rb +355 -0
  106. data/lib/datalog/packages/command.rb +51 -0
  107. data/lib/datalog/packages/refresh.rb +187 -0
  108. data/lib/datalog/packages.rb +177 -0
  109. data/lib/datalog/plugin_system.rb +5 -0
  110. data/lib/datalog/plugins/citations.rb +325 -109
  111. data/lib/datalog/site_config.rb +26 -0
  112. data/lib/datalog/social_cards/font.rb +286 -0
  113. data/lib/datalog/social_cards/fonts/IBMPlexSans-Regular.ttf +0 -0
  114. data/lib/datalog/social_cards/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
  115. data/lib/datalog/social_cards/fonts/OFL.txt +92 -0
  116. data/lib/datalog/social_cards/geometry.rb +51 -0
  117. data/lib/datalog/social_cards/outline.rb +54 -0
  118. data/lib/datalog/social_cards/plain_text.rb +258 -0
  119. data/lib/datalog/social_cards/template.rb +322 -0
  120. data/lib/datalog/social_cards/template.svg +17 -0
  121. data/lib/datalog/social_cards/typesetter.rb +178 -0
  122. data/lib/datalog/social_cards.rb +369 -0
  123. data/lib/datalog/theme/updater.rb +307 -0
  124. data/lib/datalog/theme/version.rb +1 -1
  125. metadata +44 -7
  126. data/_includes/components/enhanced-code-block.html +0 -212
  127. data/_includes/components/performance-monitor.html +0 -170
  128. data/_includes/components/viz-table-fallback.html +0 -19
  129. data/_plugins/datalog_bibliography.rb +0 -21
  130. data/assets/js/dist/chunks/chunk-WIRUK3OZ.js +0 -1
data/_sass/_docs.scss ADDED
@@ -0,0 +1,143 @@
1
+ @use 'sass:map';
2
+ @use 'variables' as *;
3
+
4
+ // The guide layout is opt-in. Other pages and theme consumers keep their layout.
5
+ .layout-docs .site-main.container,
6
+ .layout-docs .page > .container {
7
+ width: min(100% - 2rem, 76rem);
8
+ max-width: none;
9
+ }
10
+
11
+ .docs-shell {
12
+ display: grid;
13
+ gap: clamp(1.25rem, 3vw, 2.5rem);
14
+ align-items: start;
15
+ min-width: 0;
16
+ }
17
+
18
+ .docs-sidebar {
19
+ padding: 1rem;
20
+ border: 1px solid var(--color-border);
21
+ border-radius: 0.75rem;
22
+ background: var(--color-background-secondary);
23
+ color: var(--color-text-primary);
24
+
25
+ ul {
26
+ display: grid;
27
+ grid-template-columns: repeat(2, minmax(0, 1fr));
28
+ gap: 0.15rem;
29
+ margin: 0 0 0.75rem;
30
+ padding: 0;
31
+ list-style: none;
32
+ }
33
+
34
+ a {
35
+ display: block;
36
+ padding: 0.4rem 0.6rem;
37
+ border-radius: 0.35rem;
38
+ color: var(--color-text-secondary);
39
+ text-decoration: none;
40
+ overflow-wrap: anywhere;
41
+
42
+ &:hover,
43
+ &:focus-visible,
44
+ &[aria-current='page'] {
45
+ color: var(--color-accent-text);
46
+ background: var(--color-background);
47
+ }
48
+
49
+ &[aria-current='page'] { font-weight: 700; }
50
+ &:focus-visible { outline: 2px solid var(--color-accent-text); outline-offset: 2px; }
51
+ }
52
+ }
53
+
54
+ .docs-sidebar__heading {
55
+ margin: 0.8rem 0 0.35rem;
56
+ padding-inline: 0.6rem;
57
+ color: var(--color-text-primary);
58
+ font-size: 0.82rem;
59
+ letter-spacing: 0.04em;
60
+ text-transform: uppercase;
61
+ }
62
+
63
+ .docs-sidebar .docs-sidebar__home,
64
+ .docs-sidebar .docs-sidebar__repo { color: var(--color-accent-text); font-weight: 600; }
65
+
66
+ .docs-main,
67
+ .docs-content,
68
+ .docs-on-this-page { min-width: 0; }
69
+
70
+ .docs-content {
71
+ max-width: 48rem;
72
+ overflow-wrap: anywhere;
73
+
74
+ :is(h2, h3, h4) { scroll-margin-top: calc(var(--header-height, 96px) + 1rem); }
75
+ h2 { padding-bottom: 0.45rem; border-bottom: 1px solid var(--color-border); }
76
+ :is(p, li) { line-height: 1.7; }
77
+
78
+ // Keep long examples inside the reading column, including rendered math.
79
+ pre,
80
+ .highlighter-rouge,
81
+ .code-block-wrapper { max-width: 100%; overflow-x: auto; }
82
+ :is(.math-expression, mjx-container[display='true'], .katex-display, figure) {
83
+ max-width: 100%;
84
+ overflow-x: auto;
85
+ }
86
+
87
+ table:not(.rouge-table) {
88
+ display: block;
89
+ max-width: 100%;
90
+ overflow-x: auto;
91
+ border-collapse: collapse;
92
+ margin-block: 1.5rem;
93
+
94
+ th, td { padding: 0.65rem 0.9rem; border: 1px solid var(--color-border); text-align: left; }
95
+ th { background: var(--color-background-secondary); }
96
+ caption { color: var(--color-text-secondary); }
97
+ }
98
+
99
+ .callout {
100
+ margin-block: 1.5rem;
101
+ border-left-color: var(--color-accent-text);
102
+ background: var(--color-background-secondary);
103
+ color: var(--color-text-primary);
104
+
105
+ p:last-child { margin-bottom: 0; }
106
+ }
107
+
108
+ .code-copy:focus-visible {
109
+ outline: 2px solid var(--color-accent-text);
110
+ outline-offset: 2px;
111
+ }
112
+ }
113
+
114
+ .docs-pagination {
115
+ display: flex;
116
+ flex-wrap: wrap;
117
+ gap: 1rem;
118
+ justify-content: space-between;
119
+ margin-block: 2rem 1rem;
120
+ padding-block: 1rem;
121
+ border-top: 1px solid var(--color-border);
122
+
123
+ a { color: var(--color-accent-text); font-weight: 600; }
124
+ span { display: block; color: var(--color-text-secondary); font-size: 0.85rem; font-weight: 400; }
125
+ }
126
+
127
+ .docs-back-to-top { color: var(--color-accent-text); }
128
+
129
+ @media (min-width: map.get($breakpoints, lg)) {
130
+ .docs-shell { grid-template-columns: 12rem minmax(0, 1fr) 12rem; }
131
+ .docs-shell:not(:has(.docs-on-this-page)) { grid-template-columns: 12rem minmax(0, 1fr); }
132
+ .docs-sidebar,
133
+ .docs-on-this-page { position: sticky; top: 8.5rem; max-height: calc(100vh - 9rem); overflow-y: auto; }
134
+ .docs-sidebar ul { grid-template-columns: 1fr; }
135
+ .docs-on-this-page .enhanced-toc { font-size: 0.9rem; }
136
+ .docs-on-this-page .enhanced-toc__heading { font-size: 0.9rem; }
137
+ .docs-on-this-page .enhanced-toc__content { padding: 0.5rem; }
138
+ }
139
+
140
+ @media (max-width: map.get($breakpoints, lg)) {
141
+ .docs-on-this-page { grid-row: 2; }
142
+ .docs-on-this-page .enhanced-toc__stats { display: none; }
143
+ }
data/_sass/_features.scss CHANGED
@@ -15,3 +15,9 @@ $notebooks: true !default;
15
15
  $packages: true !default;
16
16
  $academic-dashboard: true !default;
17
17
  $open-science-badges: true !default;
18
+
19
+ // The framed panel around each display equation that
20
+ // theme_options.math.display_style: card asks for. Its rules apply under the
21
+ // `math-card` class the layout puts on <body> for such a site, so a stylesheet
22
+ // that carries them still sets a plain site's equations plain.
23
+ $math-card: true !default;
data/_sass/_layout.scss CHANGED
@@ -73,15 +73,33 @@ body.dark-mode .page-meta {
73
73
  // ---------------------------------------------------------------------------
74
74
  .hero {
75
75
  position: relative;
76
- // Solid base under the image: keeps the white text legible if the image
77
- // fails to load, and gives contrast checkers a real colour to measure.
78
- background: $color-surface-900 var(--hero-bg) center / cover no-repeat;
76
+ // A dark base keeps the white copy readable with or without an image.
77
+ background: $color-surface-900;
79
78
  color: #fff;
80
79
  padding: clamp(4rem, 10vw, 8rem) 0;
81
80
  text-align: center;
82
81
  overflow: hidden;
83
82
  }
84
83
 
84
+ .hero--image {
85
+ background: $color-surface-900 var(--hero-bg) center / cover no-repeat;
86
+ }
87
+
88
+ .hero--contained {
89
+ border-radius: map.get($radius, xl);
90
+ padding: clamp(2.5rem, 6vw, 5rem);
91
+ text-align: left;
92
+
93
+ .hero-content {
94
+ width: 100%;
95
+ padding: 0;
96
+ }
97
+
98
+ .hero-tagline {
99
+ margin-inline: 0;
100
+ }
101
+ }
102
+
85
103
  .hero-overlay {
86
104
  position: absolute;
87
105
  inset: 0;
@@ -97,6 +115,33 @@ body.dark-mode .page-meta {
97
115
  pointer-events: none;
98
116
  }
99
117
 
118
+ .hero-actions {
119
+ display: flex;
120
+ flex-wrap: wrap;
121
+ gap: map.get($spacing, 3);
122
+
123
+ .btn {
124
+ min-height: 2.75rem;
125
+ align-items: center;
126
+ }
127
+ }
128
+
129
+ .hero .btn-secondary,
130
+ body.dark-mode .hero .btn-secondary {
131
+ color: #fff;
132
+ border-color: rgba(#fff, 0.75);
133
+
134
+ &:hover,
135
+ &:focus-visible {
136
+ color: #fff;
137
+ background: rgba(#fff, 0.12);
138
+ }
139
+ }
140
+
141
+ @media (prefers-reduced-motion: reduce) {
142
+ .hero-actions .btn { transition: none; }
143
+ }
144
+
100
145
  .hero-content {
101
146
  position: relative;
102
147
  z-index: 1;
@@ -191,6 +236,14 @@ body.dark-mode .section-title {
191
236
  }
192
237
  }
193
238
 
239
+ .home-feature-card {
240
+ border-top: 3px solid $color-accent-secondary;
241
+ }
242
+
243
+ body.dark-mode .home-feature-card {
244
+ border-top-color: $dark-accent-secondary;
245
+ }
246
+
194
247
  .card-meta {
195
248
  font-size: map.get($font-size-scale, xs);
196
249
  color: $color-ink-500;
@@ -279,10 +332,10 @@ body.dark-mode .footer {
279
332
  }
280
333
  }
281
334
 
282
- // body.dark-mode a outranks the rule above; on the navy footer the dark
283
- // accent needs the lighter shade to reach 4.5:1 through the muted paragraphs.
335
+ // body.dark-mode a outranks the rule above; use the readable dark accent
336
+ // on the navy footer too.
284
337
  body.dark-mode & a {
285
- color: #93c5fd;
338
+ color: $dark-accent-primary;
286
339
  }
287
340
 
288
341
  p {
@@ -794,6 +847,7 @@ body.dark-mode .year-chart__label {
794
847
 
795
848
  .project-links {
796
849
  display: flex;
850
+ flex-wrap: wrap;
797
851
  gap: map.get($spacing, 2);
798
852
  padding-top: map.get($spacing, 2);
799
853
  }
@@ -998,6 +1052,11 @@ body.dark-mode .post-meta-list {
998
1052
  border-bottom-color: rgba($dark-ink-500, 0.12);
999
1053
  }
1000
1054
 
1055
+ // The same list under a page's own heading, kept off the content below (#411).
1056
+ .article-meta {
1057
+ margin-bottom: map.get($spacing, 5);
1058
+ }
1059
+
1001
1060
  .post-meta-term {
1002
1061
  font-size: map.get($font-size-scale, xs);
1003
1062
  font-weight: 600;
@@ -2,26 +2,27 @@
2
2
 
3
3
  @use 'variables' as *;
4
4
  @use 'mixins' as *;
5
+ @use 'features';
5
6
 
7
+ // A display equation stands on its own line with space around it, as in print
8
+ // (theme_options.math.display_style: plain, the default): no frame, nothing
9
+ // added to its height but its margins. Its copy and edit tools appear where
10
+ // the pointer or the focus is.
6
11
  .math-expression {
7
12
  position: relative;
8
- margin: map.get($spacing, 6) auto;
9
- padding: map.get($spacing, 6) map.get($spacing, 6) map.get($spacing, 5) map.get($spacing, 6);
10
- border-radius: 1.1rem;
11
- border: 1px solid rgba($color-neutral-900, 0.12);
12
- background: rgba($color-neutral-100, 0.9);
13
- box-shadow: 0 12px 30px rgba($color-neutral-900, 0.08);
13
+ margin: 1.25rem auto;
14
14
  display: grid;
15
15
  min-width: 0;
16
16
  max-width: 100%;
17
17
  overflow-x: auto;
18
18
  gap: map.get($spacing, 3);
19
- transition: border-color $transition-snappy, box-shadow $transition-snappy, background $transition-snappy;
19
+ // Room at the sides for the equation's focus ring, which the scrolling box
20
+ // would otherwise clip; above and below, MathJax's own margins leave room.
21
+ padding-inline: map.get($spacing, 1);
20
22
 
21
- &:focus-within {
22
- border-color: $color-accent-primary;
23
- box-shadow: 0 0 0 4px rgba($color-accent-primary, 0.18);
24
- background: rgba($color-neutral-100, 0.96);
23
+ > mjx-container:focus-visible {
24
+ outline: 2px solid $color-accent-primary;
25
+ outline-offset: 2px;
25
26
  }
26
27
 
27
28
  mjx-container[display='true'] {
@@ -77,13 +78,23 @@
77
78
  font-family: $font-family-serif;
78
79
  }
79
80
 
81
+ // At the end of the line, which the equation leaves empty unless it fills the
82
+ // column, and out of sight until the pointer or the focus reaches the equation.
83
+ // It stays in the tab order: tabbing onto a button shows it.
80
84
  .math-expression__toolbar {
81
85
  position: absolute;
82
- top: map.get($spacing, 3);
83
- left: map.get($spacing, 3);
86
+ top: 50%;
87
+ // Room for a button's focus ring, which the scrolling box would clip.
88
+ inset-inline-end: map.get($spacing, 2);
89
+ transform: translateY(-50%);
84
90
  display: inline-flex;
85
91
  gap: map.get($spacing, 2);
86
92
  z-index: 2;
93
+ opacity: 0;
94
+ }
95
+
96
+ .math-expression:is(:hover, :focus-within) .math-expression__toolbar {
97
+ opacity: 1;
87
98
  }
88
99
 
89
100
  .math-expression__button {
@@ -313,12 +324,6 @@
313
324
  }
314
325
 
315
326
  body.dark-mode {
316
- .math-expression {
317
- background: rgba($dark-surface-200, 0.92);
318
- border-color: rgba($dark-ink-500, 0.3);
319
- box-shadow: none;
320
- }
321
-
322
327
  .math-expression__number {
323
328
  color: rgba($dark-ink-500, 0.85);
324
329
  }
@@ -403,3 +408,40 @@ body.dark-mode {
403
408
  }
404
409
  }
405
410
  }
411
+
412
+ // theme_options.math.display_style: card. Each display equation in a framed
413
+ // panel with its tools always in view, as before the theme set equations
414
+ // plain. assets/css/main.scss compiles these rules only for a site that asks
415
+ // for the card, and the layout puts `math-card` on <body> for it.
416
+ @if features.$math-card {
417
+ .math-card {
418
+ .math-expression {
419
+ margin-block: map.get($spacing, 6);
420
+ padding: map.get($spacing, 6) map.get($spacing, 6) map.get($spacing, 5) map.get($spacing, 6);
421
+ border-radius: 1.1rem;
422
+ border: 1px solid rgba($color-neutral-900, 0.12);
423
+ background: rgba($color-neutral-100, 0.9);
424
+ box-shadow: 0 12px 30px rgba($color-neutral-900, 0.08);
425
+ transition: border-color $transition-snappy, box-shadow $transition-snappy, background $transition-snappy;
426
+
427
+ &:focus-within {
428
+ border-color: $color-accent-primary;
429
+ box-shadow: 0 0 0 4px rgba($color-accent-primary, 0.18);
430
+ background: rgba($color-neutral-100, 0.96);
431
+ }
432
+ }
433
+
434
+ .math-expression__toolbar {
435
+ top: map.get($spacing, 3);
436
+ inset-inline: map.get($spacing, 3) auto;
437
+ transform: none;
438
+ opacity: 1;
439
+ }
440
+ }
441
+
442
+ body.dark-mode.math-card .math-expression {
443
+ background: rgba($dark-surface-200, 0.92);
444
+ border-color: rgba($dark-ink-500, 0.3);
445
+ box-shadow: none;
446
+ }
447
+ }
@@ -99,7 +99,7 @@
99
99
 
100
100
  .notebook-article__tags li {
101
101
  background: rgba($color-accent-tertiary, 0.18);
102
- color: $color-accent-tertiary;
102
+ color: $color-accent-tertiary-text;
103
103
  border-radius: 999px;
104
104
  padding: map.get($spacing, 1) map.get($spacing, 3);
105
105
  font-size: map.get($font-size-scale, xs);
@@ -256,32 +256,6 @@
256
256
  margin: 0;
257
257
  }
258
258
 
259
- .notebook-output--stream {
260
- color: $color-ink-700;
261
- }
262
-
263
- .notebook-output--error {
264
- color: $color-critical-600;
265
- background: rgba($color-critical-200, 0.35);
266
- border: 1px solid rgba($color-critical-400, 0.6);
267
- }
268
-
269
- .notebook-output__trace {
270
- margin-top: map.get($spacing, 2);
271
- white-space: pre-wrap;
272
- }
273
-
274
- .notebook-output__figure {
275
- margin: 0;
276
- }
277
-
278
- .notebook-output__figure img {
279
- width: 100%;
280
- height: auto;
281
- border-radius: 0.75rem;
282
- box-shadow: 0 10px 30px rgba($color-ink-900, 0.15);
283
- }
284
-
285
259
  .notebook-output-plotly,
286
260
  .notebook-output-vega {
287
261
  min-height: 320px;
@@ -299,11 +273,6 @@
299
273
  margin: 0;
300
274
  }
301
275
 
302
- .notebook-output--widget {
303
- font-style: italic;
304
- color: $color-accent-secondary-text;
305
- }
306
-
307
276
  .notebook-segment {
308
277
  display: grid;
309
278
  gap: map.get($spacing, 2);
@@ -7,18 +7,15 @@
7
7
  @use 'mixins' as *;
8
8
  @use 'variables' as *;
9
9
 
10
- // Color scheme - ReadTheDocs inspired
11
- $pkg-primary: #2980b9;
12
- // $pkg-primary is a brand colour for borders, gradients and rules. As text it
13
- // reads at 4.08:1 on the panel, short of WCAG AA, and a single darker value
14
- // would fail again on a dark surface — so text uses the theme's own accent and
15
- // secondary inks, which _theme.scss defines for each mode.
10
+ // The docs share the theme's indigo and navy palette; their text uses the
11
+ // effective mode's accent ink on both light and dark surfaces.
12
+ $pkg-primary: $color-accent-primary;
16
13
  $pkg-primary-text: var(--color-accent-text);
17
14
  $pkg-muted-text: var(--color-text-secondary);
18
15
  $pkg-success: #27ae60;
19
16
  $pkg-warning: #f39c12;
20
17
  $pkg-danger: #e74c3c;
21
- $pkg-sidebar-bg: #343131;
18
+ $pkg-sidebar-bg: $dark-surface-200;
22
19
  $pkg-sidebar-text: #b3b3b3;
23
20
  $pkg-sidebar-link: #9b9b9b;
24
21
  $pkg-sidebar-link-hover: #fff;
@@ -200,7 +197,7 @@ body.dark-mode {
200
197
  padding: 0.125rem 0.375rem;
201
198
  border-radius: 3px;
202
199
  font-size: 0.9em;
203
- color: #c7254e;
200
+ color: var(--color-accent-text);
204
201
  }
205
202
 
206
203
  pre {
@@ -650,7 +647,7 @@ body.dark-mode {
650
647
  }
651
648
 
652
649
  a {
653
- color: $pkg-primary;
650
+ color: $pkg-primary-text;
654
651
  text-decoration: none;
655
652
 
656
653
  &:hover {
@@ -9,6 +9,7 @@
9
9
  // ============================================================================
10
10
 
11
11
  @use 'mixins' as *;
12
+ @use 'variables' as *;
12
13
 
13
14
  // ============================================================================
14
15
  // Social Share Component
@@ -51,11 +52,11 @@
51
52
 
52
53
  &:hover,
53
54
  &:focus {
54
- background-color: var(--color-accent, #3277f6);
55
+ background-color: var(--color-accent);
55
56
  color: #ffffff;
56
- border-color: var(--color-accent, #3277f6);
57
+ border-color: var(--color-accent);
57
58
  transform: translateY(-2px);
58
- box-shadow: 0 4px 12px rgba(50, 119, 246, 0.2);
59
+ box-shadow: 0 4px 12px rgba($color-accent-primary, 0.2);
59
60
  }
60
61
 
61
62
  &:active {
@@ -141,7 +142,7 @@
141
142
  }
142
143
 
143
144
  &__link {
144
- color: var(--color-accent, #3277f6);
145
+ color: var(--color-accent);
145
146
  text-decoration: none;
146
147
  transition: color 0.2s ease;
147
148
 
@@ -197,14 +198,14 @@
197
198
  width: 80px;
198
199
  height: 80px;
199
200
  border-radius: 50%;
200
- background: linear-gradient(135deg, var(--color-accent, #3277f6), #5b8ef7);
201
+ background: linear-gradient(135deg, var(--color-accent, #4338ca), $color-accent-secondary);
201
202
  display: flex;
202
203
  align-items: center;
203
204
  justify-content: center;
204
205
  font-size: 1.75rem;
205
206
  font-weight: 700;
206
207
  color: #ffffff;
207
- box-shadow: 0 2px 8px rgba(50, 119, 246, 0.2);
208
+ box-shadow: 0 2px 8px rgba($color-accent-primary, 0.2);
208
209
  }
209
210
 
210
211
  &__content {
@@ -221,7 +222,7 @@
221
222
  &__affiliation {
222
223
  margin: 0 0 1rem 0;
223
224
  font-size: 0.95rem;
224
- color: var(--color-accent, #3277f6);
225
+ color: var(--color-accent);
225
226
  font-weight: 500;
226
227
  }
227
228
 
@@ -268,11 +269,11 @@
268
269
 
269
270
  &:hover,
270
271
  &:focus {
271
- background-color: var(--color-accent, #3277f6);
272
- border-color: var(--color-accent, #3277f6);
272
+ background-color: var(--color-accent);
273
+ border-color: var(--color-accent);
273
274
  color: #ffffff;
274
275
  transform: translateY(-2px);
275
- box-shadow: 0 4px 12px rgba(50, 119, 246, 0.2);
276
+ box-shadow: 0 4px 12px rgba($color-accent-primary, 0.2);
276
277
  }
277
278
 
278
279
  svg {
@@ -344,7 +345,7 @@
344
345
  &__progress-bar {
345
346
  height: 100%;
346
347
  width: 0%;
347
- background: linear-gradient(90deg, var(--color-accent, #3277f6), #5b8ef7);
348
+ background: linear-gradient(90deg, var(--color-accent, #4338ca), $color-accent-secondary);
348
349
  transition: width 0.2s ease;
349
350
  }
350
351
 
@@ -381,8 +382,8 @@
381
382
  &:hover,
382
383
  &:focus {
383
384
  background-color: var(--color-background-secondary, #f5f7ff);
384
- border-color: var(--color-accent, #3277f6);
385
- color: var(--color-accent, #3277f6);
385
+ border-color: var(--color-accent);
386
+ color: var(--color-accent);
386
387
  }
387
388
  }
388
389
 
@@ -434,16 +435,15 @@
434
435
 
435
436
  &:hover,
436
437
  &:focus {
437
- color: var(--color-accent, #3277f6);
438
- background-color: rgba(50, 119, 246, 0.05);
439
- border-left-color: var(--color-accent, #3277f6);
438
+ color: var(--color-accent);
439
+ background-color: rgba($color-accent-primary, 0.05);
440
+ border-left-color: var(--color-accent);
440
441
  }
441
442
 
442
443
  &.is-active {
443
- // On the tint below the plain accent reaches only 4.12:1.
444
- color: var(--color-accent-text, #1d4ed8);
445
- background-color: rgba(50, 119, 246, 0.1);
446
- border-left-color: var(--color-accent, #3277f6);
444
+ color: var(--color-accent-text);
445
+ background-color: rgba($color-accent-primary, 0.1);
446
+ border-left-color: var(--color-accent);
447
447
  font-weight: 500;
448
448
  }
449
449
  }
@@ -454,14 +454,14 @@
454
454
  border-top: 1px solid var(--color-border, #e0e4ed);
455
455
  background-color: var(--color-background, #ffffff);
456
456
  font-size: 0.8125rem;
457
- // The tertiary ink is for decoration: 2.41:1 in the light theme, 3.73:1 in the dark one.
457
+ // The secondary ink remains legible against the background in both modes.
458
458
  color: var(--color-text-secondary, #6f6862);
459
459
  }
460
460
 
461
461
  &__reading-progress {
462
462
  [data-progress-percent] {
463
463
  font-weight: 600;
464
- color: var(--color-accent, #3277f6);
464
+ color: var(--color-accent);
465
465
  }
466
466
  }
467
467
 
@@ -763,6 +763,6 @@ body.dark-mode .difficulty-badge {
763
763
  .author-bio__social-link:focus-visible,
764
764
  .enhanced-toc a:focus-visible,
765
765
  .enhanced-toc__toggle:focus-visible {
766
- outline: 3px solid var(--color-accent, #3277f6);
766
+ outline: 3px solid var(--color-accent);
767
767
  outline-offset: 2px;
768
768
  }
data/_sass/_print.scss CHANGED
@@ -149,7 +149,7 @@ body.reading-mode {
149
149
  .reactions__status,
150
150
  .subscription-manage__status,
151
151
  .webmentions__status,
152
- .enhanced-code-block__feedback {
152
+ .datalog-bibliography__back {
153
153
  display: none !important;
154
154
  }
155
155