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,153 @@
1
+ // Theme variables for the DataLog analytics theme.
2
+ // Focused on high contrast readability for code, math, and academic layouts.
3
+
4
+ // Font families
5
+ // IBM Plex — designed for technical and data-driven content
6
+ $font-family-sans: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
7
+ $font-family-serif: 'IBM Plex Serif', Georgia, serif;
8
+ $font-family-mono: 'IBM Plex Mono', 'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
9
+ $font-stack-code: $font-family-mono !default;
10
+ $font-stack-sans: $font-family-sans !default;
11
+ $font-stack-serif: $font-family-serif !default;
12
+
13
+ // Font sizing scale (modular, tuned for academic typography)
14
+ $font-size-root: 16px;
15
+ $font-size-scale: (
16
+ xs: 0.8125rem,
17
+ sm: 0.875rem,
18
+ base: 1rem,
19
+ md: 1.125rem,
20
+ lg: 1.25rem,
21
+ xl: 1.5rem,
22
+ xxl: 1.75rem,
23
+ display: clamp(2.25rem, 2.5vw + 1.5rem, 3rem)
24
+ );
25
+
26
+ // Line-height settings for dense technical prose
27
+ $line-height-tight: 1.3;
28
+ $line-height-base: 1.6;
29
+ $line-height-loose: 1.75;
30
+
31
+ // Color palette — balanced warm/cool tones for readability and visual variety
32
+ $color-surface-50: #fafaf9; // warm white
33
+ $color-surface-100: #f3f2ef; // warm light gray
34
+ $color-surface-900: #1a1a2e; // deep navy (kept for hero/footer contrast)
35
+ $color-ink-900: #1c1917; // warm near-black
36
+ $color-ink-700: #44403c; // warm dark gray
37
+ $color-ink-500: #6f6862; // warm mid gray (>=4.5:1 on surface-100)
38
+ $color-ink-300: #a8a29e; // warm light gray
39
+ $color-ink-100: #e7e5e4 !default;
40
+ $color-ink-400: #a1a1aa !default;
41
+ $color-ink-600: #57534e !default;
42
+ $color-ink-800: #292524 !default;
43
+ $color-accent-primary: #2563eb; // vivid blue — links, primary actions
44
+ $color-accent-secondary: #0d9488; // teal — badges, secondary highlights
45
+ $color-accent-tertiary: #7c3aed; // purple — charts, visual accents
46
+ $color-success: #16a34a;
47
+ $color-warning: #d97706;
48
+ $color-critical: #dc2626;
49
+ $color-neutral-50: #fafaf9 !default;
50
+ $color-neutral-100: #f5f5f4;
51
+ $color-neutral-200: #e7e5e4;
52
+ $color-neutral-400: #a8a29e;
53
+ $color-neutral-600: #57534e;
54
+ $color-neutral-900: #1c1917;
55
+ $color-neutral-300: #d6d3d1 !default;
56
+ $color-neutral-500: #78716c !default;
57
+ $color-neutral-700: #44403c !default;
58
+ $color-critical-50: #fdecea !default;
59
+ $color-critical-100: #f9d1cd !default;
60
+ $color-critical-200: #f3a9a2 !default;
61
+ $color-critical-300: #ed8079 !default;
62
+ $color-critical-400: #e65f54 !default;
63
+ $color-critical-500: #db4437 !default; // existing main
64
+ $color-critical-600: #c3382b !default; // ← REQUIRED (used by components)
65
+ $color-critical-700: #9f2f25 !default;
66
+ $color-critical-800: #7b251e !default;
67
+ $color-critical-900: #561b16 !default;
68
+ $color-danger-50: #ffe5e5 !default;
69
+ $color-danger-100: #fbbcbc !default;
70
+ $color-danger-300: #f28b82 !default;
71
+ $dark-danger-400: #b33030 !default;
72
+ $color-danger-500: #db4437 !default; // same base as $color-critical
73
+ $color-danger-600: #c53929 !default; // ← NEW (used in components)
74
+ $color-danger-700: #a52714 !default;
75
+ $color-danger-900: #7f1d1d !default;
76
+
77
+ // Dark mode adjustments
78
+ $dark-surface-50: #262626 !default;
79
+ $dark-surface-100: #171717; // near-black, neutral
80
+ $dark-surface-200: #1e1e1e; // slightly lighter
81
+ $dark-surface-300: #2a2a2a; // card backgrounds
82
+ $dark-ink-900: #f5f5f4; // warm white text
83
+ $dark-ink-700: #d6d3d1;
84
+ $dark-ink-500: #a8a29e;
85
+ $dark-ink-300: #78716c !default;
86
+ $dark-ink-200: #57534e !default;
87
+ $dark-ink-100: #44403c !default;
88
+ $dark-ink-050: #fafaf9 !default;
89
+ $dark-ink-000: #fafaf9 !default;
90
+ $dark-accent-primary: #60a5fa; // lighter blue for dark bg
91
+ $dark-accent-secondary: #2dd4bf; // lighter teal
92
+ $dark-accent-tertiary: #a78bfa !default; // lighter purple
93
+
94
+ // Border colors
95
+ $color-border: $color-neutral-200 !default;
96
+ $color-border-dark: $dark-surface-100 !default;
97
+
98
+ // Foreground and surface
99
+ $color-foreground: $color-ink-900 !default;
100
+ $color-surface: $color-surface-50 !default;
101
+ $color-surface-dark: $dark-surface-200 !default;
102
+
103
+ // Spacing scale (4pt grid)
104
+ $space-unit: 0.25rem;
105
+ $spacing: (
106
+ 0: 0,
107
+ 1: $space-unit,
108
+ 2: $space-unit * 2,
109
+ 3: $space-unit * 3,
110
+ 4: $space-unit * 4,
111
+ 5: $space-unit * 6,
112
+ 6: $space-unit * 8,
113
+ 7: $space-unit * 10,
114
+ 8: $space-unit * 12
115
+ );
116
+
117
+ // Border radius scale
118
+ $radius: (
119
+ sm: 0.25rem,
120
+ md: 0.375rem,
121
+ lg: 0.5rem,
122
+ xl: 0.75rem,
123
+ "2xl": 1rem,
124
+ full: 9999px
125
+ ) !default;
126
+
127
+ // Elevation levels for cards and visualisations
128
+ $shadow-soft: 0 8px 20px rgba(15, 23, 42, 0.08);
129
+ $shadow-strong: 0 20px 40px rgba(15, 23, 42, 0.16);
130
+
131
+ // Layout constraints
132
+ $max-width-reading: 72ch;
133
+ $max-width-wide: 1200px;
134
+ $max-width-full: 1440px;
135
+
136
+ // Breakpoints geared for dashboard-like layouts
137
+ $breakpoints: (
138
+ xs: 26rem,
139
+ sm: 36rem,
140
+ mobile: 40rem,
141
+ md: 48rem,
142
+ lg: 64rem,
143
+ xl: 80rem
144
+ );
145
+
146
+ // Transition timing for interactive components
147
+ $transition-base: 150ms ease;
148
+ $transition-snappy: 120ms cubic-bezier(0.4, 0, 0.2, 1);
149
+
150
+ // Z-index scale for sticky header & overlays
151
+ $z-header: 100;
152
+ $z-overlay: 900;
153
+ $z-skiplink: 1000;
@@ -0,0 +1,242 @@
1
+ @use 'sass:map';
2
+
3
+ @use 'variables' as *;
4
+ @use 'mixins' as *;
5
+
6
+ .viz-table-container {
7
+ display: grid;
8
+ gap: map.get($spacing, 3);
9
+ padding-top: map.get($spacing, 3);
10
+ border-top: 1px solid rgba($color-ink-900, 0.12);
11
+ }
12
+
13
+ body.dark-mode .viz-table-container {
14
+ border-top-color: rgba($dark-ink-500, 0.35);
15
+ }
16
+
17
+ .viz-table-toggle {
18
+ justify-self: start;
19
+ border: 1px solid rgba($color-ink-900, 0.18);
20
+ background: rgba($color-ink-900, 0.04);
21
+ color: $color-ink-800;
22
+ font-weight: 600;
23
+ font-size: map.get($font-size-scale, xs);
24
+ border-radius: 999px;
25
+ padding: map.get($spacing, 2) map.get($spacing, 4);
26
+ cursor: pointer;
27
+ transition: background $transition-base, color $transition-base, border-color $transition-base;
28
+ }
29
+
30
+ .viz-table-toggle:hover,
31
+ .viz-table-toggle:focus-visible {
32
+ border-color: $color-accent-primary;
33
+ background: rgba($color-accent-primary, 0.16);
34
+ color: $color-accent-primary;
35
+ }
36
+
37
+ .viz-table-toggle:focus-visible {
38
+ outline: 3px solid rgba($color-accent-primary, 0.35);
39
+ outline-offset: 2px;
40
+ }
41
+
42
+ body.dark-mode .viz-table-toggle {
43
+ border-color: rgba($dark-ink-500, 0.35);
44
+ background: rgba($dark-surface-300, 0.55);
45
+ color: rgba($dark-ink-500, 0.9);
46
+ }
47
+
48
+ body.dark-mode .viz-table-toggle:hover,
49
+ body.dark-mode .viz-table-toggle:focus-visible {
50
+ border-color: $dark-accent-primary;
51
+ background: rgba($dark-accent-primary, 0.28);
52
+ color: $dark-accent-primary;
53
+ outline-color: rgba($dark-accent-primary, 0.45);
54
+ }
55
+
56
+ .viz-table-wrapper {
57
+ overflow-x: auto;
58
+ max-width: 100%;
59
+ border-radius: 0.75rem;
60
+ border: 1px solid rgba($color-ink-900, 0.12);
61
+ background: $color-surface;
62
+ padding: map.get($spacing, 3);
63
+ }
64
+
65
+ body.dark-mode .viz-table-wrapper {
66
+ border-color: rgba($dark-ink-500, 0.35);
67
+ background: rgba($dark-surface-200, 0.7);
68
+ }
69
+
70
+ .viz-table {
71
+ width: 100%;
72
+ border-collapse: collapse;
73
+ min-width: 18rem;
74
+ font-size: map.get($font-size-scale, sm);
75
+ }
76
+
77
+ .viz-table caption {
78
+ text-align: left;
79
+ font-weight: 600;
80
+ color: $color-ink-700;
81
+ margin-bottom: map.get($spacing, 2);
82
+ }
83
+
84
+ body.dark-mode .viz-table caption {
85
+ color: rgba($dark-ink-500, 0.95);
86
+ }
87
+
88
+ .viz-table th,
89
+ .viz-table td {
90
+ padding: map.get($spacing, 2);
91
+ border-bottom: 1px solid rgba($color-ink-900, 0.08);
92
+ text-align: left;
93
+ vertical-align: top;
94
+ }
95
+
96
+ .viz-table th[scope='col'] {
97
+ font-size: map.get($font-size-scale, xs);
98
+ text-transform: uppercase;
99
+ letter-spacing: 0.05em;
100
+ color: $color-ink-600;
101
+ }
102
+
103
+ body.dark-mode .viz-table th,
104
+ body.dark-mode .viz-table td {
105
+ border-bottom-color: rgba($dark-ink-500, 0.3);
106
+ }
107
+
108
+ body.dark-mode .viz-table th[scope='col'] {
109
+ color: rgba($dark-ink-500, 0.85);
110
+ }
111
+
112
+ .viz-table tbody tr:nth-of-type(even) {
113
+ background: rgba($color-accent-secondary, 0.06);
114
+ }
115
+
116
+ body.dark-mode .viz-table tbody tr:nth-of-type(even) {
117
+ background: rgba($dark-accent-secondary, 0.22);
118
+ }
119
+
120
+ .viz-table td:focus-visible,
121
+ .viz-table th:focus-visible {
122
+ outline: 3px solid rgba($color-accent-primary, 0.45);
123
+ outline-offset: 2px;
124
+ }
125
+
126
+ body.dark-mode .viz-table td:focus-visible,
127
+ body.dark-mode .viz-table th:focus-visible {
128
+ outline-color: rgba($dark-accent-primary, 0.5);
129
+ }
130
+
131
+ // ---------------------------------------------------------------------------
132
+ // Gallery filters
133
+ // ---------------------------------------------------------------------------
134
+ .viz-filters {
135
+ margin-bottom: map.get($spacing, 4);
136
+ }
137
+
138
+ .viz-filter-btn {
139
+ &.is-active {
140
+ background: $color-accent-primary;
141
+ color: white;
142
+ border-color: $color-accent-primary;
143
+ }
144
+ }
145
+
146
+ body.dark-mode .viz-filter-btn.is-active {
147
+ background: $dark-accent-primary;
148
+ color: $color-ink-900;
149
+ border-color: $dark-accent-primary;
150
+ }
151
+
152
+ // ---------------------------------------------------------------------------
153
+ // Embed blocks
154
+ // ---------------------------------------------------------------------------
155
+ .viz-block {
156
+ border: 1px solid rgba($color-neutral-200, 0.5);
157
+ border-radius: map.get($radius, lg);
158
+ overflow: hidden;
159
+ margin: map.get($spacing, 4) 0;
160
+ }
161
+
162
+ body.dark-mode .viz-block {
163
+ border-color: rgba($dark-ink-500, 0.15);
164
+ }
165
+
166
+ .viz-canvas {
167
+ min-height: 12rem;
168
+ padding: map.get($spacing, 3);
169
+ position: relative;
170
+
171
+ iframe {
172
+ width: 100%;
173
+ border: none;
174
+ border-radius: map.get($radius, md);
175
+ }
176
+
177
+ svg {
178
+ max-width: 100%;
179
+ height: auto;
180
+ }
181
+ }
182
+
183
+ .viz-header {
184
+ display: flex;
185
+ flex-wrap: wrap;
186
+ align-items: center;
187
+ gap: map.get($spacing, 3);
188
+ padding: map.get($spacing, 3) map.get($spacing, 4);
189
+ border-bottom: 1px solid rgba($color-neutral-200, 0.3);
190
+ background: rgba($color-neutral-100, 0.3);
191
+ }
192
+
193
+ body.dark-mode .viz-header {
194
+ border-bottom-color: rgba($dark-ink-500, 0.1);
195
+ background: rgba($dark-surface-300, 0.3);
196
+ }
197
+
198
+ .viz-title {
199
+ font-size: map.get($font-size-scale, base);
200
+ font-weight: 600;
201
+ margin: 0;
202
+ }
203
+
204
+ .viz-meta {
205
+ font-size: map.get($font-size-scale, xs);
206
+ color: $color-ink-500;
207
+ margin: 0;
208
+ }
209
+
210
+ body.dark-mode .viz-meta {
211
+ color: $dark-ink-500;
212
+ }
213
+
214
+ .viz-status {
215
+ font-size: map.get($font-size-scale, xs);
216
+ color: $color-ink-500;
217
+ margin-left: auto;
218
+ }
219
+
220
+ .viz-toolbar {
221
+ display: flex;
222
+ gap: map.get($spacing, 2);
223
+ padding: map.get($spacing, 2) map.get($spacing, 4);
224
+ border-top: 1px solid rgba($color-neutral-200, 0.3);
225
+ background: rgba($color-neutral-100, 0.2);
226
+
227
+ &__button {
228
+ font-size: map.get($font-size-scale, xs);
229
+ font-weight: 500;
230
+ color: $color-accent-primary;
231
+ text-decoration: none;
232
+
233
+ &:hover { text-decoration: underline; }
234
+ }
235
+ }
236
+
237
+ body.dark-mode .viz-toolbar {
238
+ border-top-color: rgba($dark-ink-500, 0.1);
239
+ background: rgba($dark-surface-300, 0.2);
240
+
241
+ &__button { color: $dark-accent-primary; }
242
+ }
@@ -0,0 +1,4 @@
1
+ ---
2
+ # Only front matter so Jekyll processes this file
3
+ ---
4
+ @use "theme";
Binary file
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "DataLog",
3
+ "short_name": "DataLog",
4
+ "description": "Data science and analytics research blog",
5
+ "icons": [
6
+ {
7
+ "src": "/assets/img/favicons/android-chrome-192x192.png",
8
+ "sizes": "192x192",
9
+ "type": "image/png"
10
+ },
11
+ {
12
+ "src": "/assets/img/favicons/android-chrome-512x512.png",
13
+ "sizes": "512x512",
14
+ "type": "image/png"
15
+ }
16
+ ],
17
+ "theme_color": "#3454d1",
18
+ "background_color": "#ffffff",
19
+ "display": "standalone",
20
+ "start_url": "/"
21
+ }
@@ -0,0 +1,20 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400" role="img" aria-labelledby="title desc">
2
+ <title id="title">Data visualization placeholder</title>
3
+ <desc id="desc">Abstract chart illustration representing data-driven storytelling.</desc>
4
+ <defs>
5
+ <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="0%">
6
+ <stop offset="0%" stop-color="#38bdf8" />
7
+ <stop offset="100%" stop-color="#6366f1" />
8
+ </linearGradient>
9
+ </defs>
10
+ <rect width="800" height="400" fill="#0f172a" rx="32" />
11
+ <g transform="translate(60,60)">
12
+ <rect x="0" y="80" width="120" height="160" fill="url(#grad)" rx="16" />
13
+ <rect x="160" y="40" width="120" height="200" fill="#22d3ee" rx="16" />
14
+ <rect x="320" y="120" width="120" height="120" fill="#a855f7" rx="16" />
15
+ <rect x="480" y="20" width="120" height="220" fill="#f97316" rx="16" />
16
+ <polyline points="0,240 160,200 320,260 480,180 600,220" fill="none" stroke="#fbbf24" stroke-width="6" stroke-linecap="round" stroke-linejoin="round" />
17
+ </g>
18
+ <text x="60" y="340" fill="#e2e8f0" font-family="Inter, sans-serif" font-size="32" font-weight="600">DataLog</text>
19
+ <text x="60" y="372" fill="#cbd5f5" font-family="Inter, sans-serif" font-size="20">Visualize your data stories</text>
20
+ </svg>