datalog-theme 0.9.2 → 0.10.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e78d28d83ac0a0f18ae06135f8d07b0523f4b1669bfe838cf7cb146a77c54307
4
- data.tar.gz: 2f75e9074b965a7edfd417194145ad50ed44a03aa93d789d86ddde7ae4a7a5ec
3
+ metadata.gz: 5b74bf15f89adfc2aa62c676c096602c7831b07e44398fd0968d91da7f86bfb4
4
+ data.tar.gz: 1f696c0c8858b68c1433256bccafd16873d9f1e7dd93458e4d6264cd87218965
5
5
  SHA512:
6
- metadata.gz: 00f97bd9e578136be77bffc0aa079ad80d9498a8f7becce2162d7ca948920b32fe8387e0f977f6a404a05d5c7a0960dad84f915fefe07ee2844b9d36fb7a5351
7
- data.tar.gz: 469a1d9ec77a2e9379979fb392a0bd2d6888516742931599bb8fa3457375a17ec85b7b3d322b8d72018129999b7dda91e7123b6fc906eef5e8fddc4c1d952311
6
+ metadata.gz: dfd30ca2e0683df45f6db2fa03feafeac691e1f79defbda412e380510b746dab12d4a7abd97882c81d54290641c9a0fe1f939dd88a468fb9388a1aeaa0d7e350
7
+ data.tar.gz: ff0175b85f72ae03c61a71629b2c0890d440d46591bdf1bcf31e0b0a4df92d6ccea7185e5cec891fb934d7098717900a35fb8ac7bc58e9b124e84dab5ef57a11
data/CHANGELOG.md CHANGED
@@ -2,6 +2,43 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [0.10.0] - 2026-09-21
6
+
7
+ ### Upgrading from 0.9.x
8
+
9
+ Three changes need an edit on a site that upgrades:
10
+
11
+ - **`components/search-facets.html` is gone.** A site that includes it will not build. Remove the include; the search page's own application covers the same ground, with tests.
12
+ - **The installation panel's id is the package's**, `install-<package-name>`, where it was `installation`. A link or a stylesheet that pointed at `#installation` should point at the new id — or at the page's own `## Installation` heading, which still carries that id where the Markdown has one.
13
+ - **`package-docs__main` is a `<div>`, not a `<main>`.** The page already had a `main` landmark from the default layout, and two is one too many. A selector written as `main.package-docs__main` needs the tag dropped.
14
+
15
+ Two more to know about, neither needing an edit:
16
+
17
+ - `datalog new post` slugifies the way Jekyll does, so a new post with an accented title is filed under a different name than 0.9.x would have given it: `analise-de-series-temporais`, not `an-lise-de-s-ries-temporais`. Posts already published are untouched.
18
+ - A site holding its own copy of `components/enhanced-toc.html` keeps that copy's inline script, and now also loads the contents module in the core bundle. Take the `<script>` block out of the copy, or drop the copy and use the theme's.
19
+
20
+ ### Added
21
+
22
+ - Translations for the breadcrumbs, the footer headings, the remaining sharing buttons and the Packages menu entry, in English, Spanish and Portuguese.
23
+
24
+ ### Removed
25
+
26
+ - `components/search-facets.html`, which no layout or page included, no stylesheet styled, and whose script would have thrown on load. The search page's own application (`assets/js/search/`) is the one that indexes posts, code and math, offers facets and is covered by tests (#341).
27
+
28
+ ### Fixed
29
+
30
+ - Name the equation editor's LaTeX box and tie it to the description beside it. The dialog's title named the dialog, not the box, so a screen reader met an unlabelled multiline text box — and the editor is built into every page that loads MathJax, where an accessibility sweep finds it.
31
+ - Put the site's `baseurl` in front of every bundle in the script manifest the loader reads, and in the 404 page's search form, so a site served from a subdirectory runs its JavaScript instead of importing paths at the domain root (#328).
32
+ - Read MathJax's expressions as a list that can be iterated, so equation numbering, the copy and edit tools, the reference map and the `role="math"` labels reach a typeset page at all. Leave the number to MathJax where it numbers, rather than drawing a second one beside it, and keep the tools out of the element that carries the maths role (#329).
33
+ - Name a scaffolded post after its title, accents and all: `datalog new post` now slugifies the way Jekyll does, so "Análise de Séries Temporais" becomes `analise-de-series-temporais` rather than `an-lise-de-s-ries-temporais`, a title in a script no transliteration covers keeps its own characters, and a title the console tagged as something other than UTF-8 no longer raises (#333).
34
+ - Stop `datalog update` where `npm install` fails, instead of reporting that the theme's dependencies are up to date (#333).
35
+ - Let the browser follow a table-of-contents link instead of intercepting it, so an entry for a numbered heading reaches its section, the heading clears the sticky header by its own scroll margin, and the keyboard carries on from there. The contents now ship as a module in the core bundle: the reading position is measured from the viewport, the progress indicator reports a number rather than `NaN` on a short article, the current entry is marked with `aria-current`, and the percentage no longer sits in a live region that announced every scroll (#330).
36
+ - Ask for the translations the theme already ships. The header's search box, brand link and toggles, the primary navigation's labels and descriptions, the breadcrumbs, the sharing buttons, the contents heading and the footer's headings now read from `_data/i18n`, so a site in Spanish or Portuguese is no longer an English chrome around translated articles. `{% t %}` accepts a variable holding a key, which is how `_data/navigation.yml` names one per entry, and a key the data names but no locale defines falls back to the literal beside it instead of printing the key (#331).
37
+ - Give the installation panel real tab semantics, so the arrow keys move between pip, conda and Git, the selected one is announced, and each panel is named by its tab. Its id is the package's rather than `installation`, which a page's own heading already had; its buttons carry a type; its labels are translated; and it copies through the core bundle's copy button instead of a second clipboard implementation. The tab labels meet the AA contrast ratio (#332).
38
+ - Fall back to the older copy route where the clipboard API is unavailable or refused, and let a template pass the words shown after a copy (#332).
39
+ - Give package pages a dark mode. The package stylesheet had no dark rules at all, so its panels stayed white on a dark page and everything layered on them followed: 421 axe contrast failures in dark mode, 103 in light. Its surfaces, inks and borders now read from the theme's own tokens, the tinted admonitions carry an ink that pairs with their tint in each mode, and a highlighted example no longer sits on a forced dark background that fought the light Rouge palette (#342).
40
+ - Name the version selector on a package page, take the second `main` landmark out of the package layout, start the sidebar's section titles at the level after the page title, and let the keyboard reach an API signature that scrolls sideways (#342).
41
+
5
42
  ## [0.9.2] - 2026-09-20
6
43
 
7
44
  ### Fixed
data/CITATION.cff CHANGED
@@ -16,8 +16,8 @@ abstract: >-
16
16
  It offers integrated notebook publishing, advanced math rendering, interactive
17
17
  visualization workflows, and reproducibility tooling optimised for open science communities.
18
18
  license: MIT
19
- version: 0.9.2
20
- date-released: 2026-09-20
19
+ version: 0.10.0
20
+ date-released: 2026-09-21
21
21
  keywords:
22
22
  - data-science
23
23
  - jekyll
data/README.md CHANGED
@@ -208,7 +208,7 @@ Data-driven configuration allows you to publish or reorder projects, datasets, s
208
208
  Add the theme gem to your Jekyll site:
209
209
 
210
210
  ```ruby
211
- gem "datalog-theme", "~> 0.9.0"
211
+ gem "datalog-theme", "~> 0.10.0"
212
212
  ```
213
213
 
214
214
  The constraint takes the patch releases of the current minor series. Until 1.0 a minor release may include breaking changes, listed in the [changelog](CHANGELOG.md).
data/_data/i18n/en.yml CHANGED
@@ -96,6 +96,9 @@ navigation:
96
96
  visualizations:
97
97
  title: Visualizations
98
98
  description: Plotly, D3, and Observable notebooks
99
+ packages:
100
+ title: Packages
101
+ description: Software packages, libraries, and tools
99
102
  academic:
100
103
  title: Academic Ops
101
104
  description: Citation metrics, submissions, and collaboration hub
@@ -475,6 +478,7 @@ post:
475
478
  many: "{{minutes}} mins read"
476
479
  difficulty_default: Intermediate
477
480
  toc_heading: On this page
481
+ toc_toggle: Toggle table of contents
478
482
  notebook:
479
483
  open_external: Open Jupyter Notebook
480
484
  download: Download Jupyter Notebook
@@ -484,6 +488,11 @@ post:
484
488
  twitter: Share on X (Twitter)
485
489
  linkedin: Share on LinkedIn
486
490
  reddit: Discuss on Reddit
491
+ facebook: Share on Facebook
492
+ email: Share via email
493
+ copy_link: Copy link to clipboard
494
+ email_label: Email
495
+ copy_link_label: Copy link
487
496
  interactive:
488
497
  label: Interactive resources
489
498
  launch: Launch demo
@@ -693,6 +702,11 @@ project:
693
702
  last_commit: "Last commit {{commit}}."
694
703
  view_latest: View latest revision
695
704
  footer:
705
+ explore: Explore
706
+ connect: Connect
707
+ stay_updated: Stay updated
708
+ rss_description: Follow via RSS or check back for new research and tutorials.
709
+ rss_feed: RSS feed
696
710
  heading: Site footer
697
711
  about_title: "About {{site}}"
698
712
  orcid_label: "ORCID: {{id}}"
@@ -757,3 +771,17 @@ analytics:
757
771
  users: Users
758
772
  new_users: New users
759
773
  page_views: Page views
774
+ breadcrumbs:
775
+ label: Breadcrumb
776
+ home: Home
777
+ blog: Blog
778
+ portfolio: Portfolio
779
+ datasets: Datasets
780
+ notebooks: Notebooks
781
+ package_install:
782
+ title: Installation
783
+ terminal: Terminal
784
+ r_console: R Console
785
+ copy: Copy
786
+ copied: Copied!
787
+ copy_error: Could not copy
data/_data/i18n/es.yml CHANGED
@@ -96,6 +96,9 @@ navigation:
96
96
  visualizations:
97
97
  title: Visualizaciones
98
98
  description: Plotly, D3 y notebooks de Observable
99
+ packages:
100
+ title: Paquetes
101
+ description: Paquetes de software, bibliotecas y herramientas
99
102
  academic:
100
103
  title: Operaciones académicas
101
104
  description: Métricas de citación, envíos y colaboración
@@ -475,6 +478,7 @@ post:
475
478
  many: "Lectura de {{minutes}} min"
476
479
  difficulty_default: Intermedio
477
480
  toc_heading: En esta página
481
+ toc_toggle: Mostrar u ocultar el índice
478
482
  notebook:
479
483
  open_external: Abrir notebook de Jupyter
480
484
  download: Descargar notebook de Jupyter
@@ -484,6 +488,11 @@ post:
484
488
  twitter: Compartir en X (Twitter)
485
489
  linkedin: Compartir en LinkedIn
486
490
  reddit: Debatir en Reddit
491
+ facebook: Compartir en Facebook
492
+ email: Compartir por correo
493
+ copy_link: Copiar el enlace
494
+ email_label: Correo
495
+ copy_link_label: Copiar enlace
487
496
  interactive:
488
497
  label: Recursos interactivos
489
498
  launch: Iniciar demostración
@@ -693,6 +702,11 @@ project:
693
702
  last_commit: "Último commit {{commit}}."
694
703
  view_latest: Ver revisión más reciente
695
704
  footer:
705
+ explore: Explorar
706
+ connect: Contacto
707
+ stay_updated: Mantente al día
708
+ rss_description: Sigue el RSS o vuelve para ver nuevas investigaciones y tutoriales.
709
+ rss_feed: Fuente RSS
696
710
  heading: Pie de página
697
711
  about_title: "Acerca de {{site}}"
698
712
  orcid_label: "ORCID: {{id}}"
@@ -757,3 +771,17 @@ analytics:
757
771
  users: Usuarios
758
772
  new_users: Usuarios nuevos
759
773
  page_views: Vistas de página
774
+ breadcrumbs:
775
+ label: Ruta de navegación
776
+ home: Inicio
777
+ blog: Blog
778
+ portfolio: Portafolio
779
+ datasets: Conjuntos de datos
780
+ notebooks: Cuadernos
781
+ package_install:
782
+ title: Instalación
783
+ terminal: Terminal
784
+ r_console: Consola de R
785
+ copy: Copiar
786
+ copied: ¡Copiado!
787
+ copy_error: No se pudo copiar
data/_data/i18n/pt.yml CHANGED
@@ -96,6 +96,9 @@ navigation:
96
96
  visualizations:
97
97
  title: Visualizações
98
98
  description: Plotly, D3 e notebooks Observable
99
+ packages:
100
+ title: Pacotes
101
+ description: Pacotes de software, bibliotecas e ferramentas
99
102
  academic:
100
103
  title: Operações académicas
101
104
  description: Métricas de citação, submissões e colaboração
@@ -475,6 +478,7 @@ post:
475
478
  many: "Leitura de {{minutes}} min"
476
479
  difficulty_default: Intermédio
477
480
  toc_heading: Nesta página
481
+ toc_toggle: Mostrar ou ocultar o índice
478
482
  notebook:
479
483
  open_external: Abrir notebook Jupyter
480
484
  download: Transferir notebook Jupyter
@@ -484,6 +488,11 @@ post:
484
488
  twitter: Partilhar no X (Twitter)
485
489
  linkedin: Partilhar no LinkedIn
486
490
  reddit: Discutir no Reddit
491
+ facebook: Partilhar no Facebook
492
+ email: Partilhar por email
493
+ copy_link: Copiar a ligação
494
+ email_label: Email
495
+ copy_link_label: Copiar ligação
487
496
  interactive:
488
497
  label: Recursos interativos
489
498
  launch: Iniciar demonstração
@@ -693,6 +702,11 @@ project:
693
702
  last_commit: "Último commit {{commit}}."
694
703
  view_latest: Ver revisão mais recente
695
704
  footer:
705
+ explore: Explorar
706
+ connect: Contacto
707
+ stay_updated: Fique a par
708
+ rss_description: Siga o RSS ou volte para ver novas investigações e tutoriais.
709
+ rss_feed: Fonte RSS
696
710
  heading: Rodapé do site
697
711
  about_title: "Sobre {{site}}"
698
712
  orcid_label: "ORCID: {{id}}"
@@ -757,3 +771,17 @@ analytics:
757
771
  users: Usuários
758
772
  new_users: Novos usuários
759
773
  page_views: Visualizações de página
774
+ breadcrumbs:
775
+ label: Caminho de navegação
776
+ home: Início
777
+ blog: Blog
778
+ portfolio: Portefólio
779
+ datasets: Conjuntos de dados
780
+ notebooks: Cadernos
781
+ package_install:
782
+ title: Instalação
783
+ terminal: Terminal
784
+ r_console: Consola do R
785
+ copy: Copiar
786
+ copied: Copiado!
787
+ copy_error: Não foi possível copiar
@@ -19,7 +19,7 @@ Parameters:
19
19
  <code>{{ include.name }}</code>
20
20
  </h3>
21
21
  {% if include.signature %}
22
- <pre class="api-function__signature"><code>{{ include.signature }}</code></pre>
22
+ <pre class="api-function__signature" tabindex="0"><code>{{ include.signature }}</code></pre>
23
23
  {% endif %}
24
24
  </div>
25
25
 
@@ -9,12 +9,12 @@ Parameters:
9
9
  {%- assign show_current = include.show_current | default: true -%}
10
10
  {%- assign separator = include.separator | default: " / " -%}
11
11
 
12
- <nav class="breadcrumbs" aria-label="Breadcrumb">
12
+ <nav class="breadcrumbs" aria-label="{% t 'breadcrumbs.label' %}">
13
13
  <ol class="breadcrumbs__list" itemscope itemtype="https://schema.org/BreadcrumbList">
14
14
  {%- comment -%} Home link {%- endcomment -%}
15
15
  <li class="breadcrumbs__item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
16
16
  <a href="{{ '/' | relative_url }}" class="breadcrumbs__link" itemprop="item">
17
- <span itemprop="name">Home</span>
17
+ <span itemprop="name">{% t 'breadcrumbs.home' %}</span>
18
18
  </a>
19
19
  <meta itemprop="position" content="1" />
20
20
  <span class="breadcrumbs__separator" aria-hidden="true">{{ separator }}</span>
@@ -27,7 +27,7 @@ Parameters:
27
27
  {%- when 'posts' -%}
28
28
  <li class="breadcrumbs__item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
29
29
  <a href="{{ '/blog' | relative_url }}" class="breadcrumbs__link" itemprop="item">
30
- <span itemprop="name">Blog</span>
30
+ <span itemprop="name">{% t 'breadcrumbs.blog' %}</span>
31
31
  </a>
32
32
  <meta itemprop="position" content="{{ position }}" />
33
33
  <span class="breadcrumbs__separator" aria-hidden="true">{{ separator }}</span>
@@ -35,7 +35,7 @@ Parameters:
35
35
  {%- when 'portfolio' -%}
36
36
  <li class="breadcrumbs__item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
37
37
  <a href="{{ '/portfolio' | relative_url }}" class="breadcrumbs__link" itemprop="item">
38
- <span itemprop="name">Portfolio</span>
38
+ <span itemprop="name">{% t 'breadcrumbs.portfolio' %}</span>
39
39
  </a>
40
40
  <meta itemprop="position" content="{{ position }}" />
41
41
  <span class="breadcrumbs__separator" aria-hidden="true">{{ separator }}</span>
@@ -43,7 +43,7 @@ Parameters:
43
43
  {%- when 'datasets' -%}
44
44
  <li class="breadcrumbs__item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
45
45
  <a href="{{ '/datasets' | relative_url }}" class="breadcrumbs__link" itemprop="item">
46
- <span itemprop="name">Datasets</span>
46
+ <span itemprop="name">{% t 'breadcrumbs.datasets' %}</span>
47
47
  </a>
48
48
  <meta itemprop="position" content="{{ position }}" />
49
49
  <span class="breadcrumbs__separator" aria-hidden="true">{{ separator }}</span>
@@ -51,7 +51,7 @@ Parameters:
51
51
  {%- when 'notebooks' -%}
52
52
  <li class="breadcrumbs__item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
53
53
  <a href="{{ '/notebooks' | relative_url }}" class="breadcrumbs__link" itemprop="item">
54
- <span itemprop="name">Notebooks</span>
54
+ <span itemprop="name">{% t 'breadcrumbs.notebooks' %}</span>
55
55
  </a>
56
56
  <meta itemprop="position" content="{{ position }}" />
57
57
  <span class="breadcrumbs__separator" aria-hidden="true">{{ separator }}</span>
@@ -73,7 +73,7 @@ Parameters:
73
73
  aria-hidden="true">
74
74
  <polyline points="6 9 12 15 18 9"></polyline>
75
75
  </svg>
76
- <span class="visually-hidden">Toggle table of contents</span>
76
+ <span class="visually-hidden">{% t 'post.toc_toggle' %}</span>
77
77
  </button>
78
78
  {%- endif -%}
79
79
  </div>
@@ -82,127 +82,11 @@ Parameters:
82
82
  {{ toc_markup }}
83
83
  </div>
84
84
 
85
- <div class="enhanced-toc__stats" aria-live="polite">
85
+ <div class="enhanced-toc__stats">
86
86
  <span class="enhanced-toc__reading-progress" data-reading-progress>
87
- <span class="visually-hidden">Reading progress: </span>
87
+ <span class="visually-hidden">{% t 'header.reading_progress' %} </span>
88
88
  <span data-progress-percent>0</span>% complete
89
89
  </span>
90
90
  </div>
91
91
  </nav>
92
-
93
- <script>
94
- (function() {
95
- 'use strict';
96
-
97
- document.addEventListener('DOMContentLoaded', function() {
98
- const toc = document.querySelector('[data-toc-enhanced]');
99
- if (!toc) return;
100
-
101
- const tocContent = toc.querySelector('.enhanced-toc__content');
102
- const tocLinks = toc.querySelectorAll('.enhanced-toc__content a');
103
- const tocToggle = toc.querySelector('[data-toc-toggle]');
104
- const progressBar = toc.querySelector('[data-toc-progress]');
105
- const progressPercent = toc.querySelector('[data-progress-percent]');
106
-
107
- // Collapsible functionality
108
- if (tocToggle) {
109
- tocToggle.addEventListener('click', function() {
110
- const isExpanded = tocToggle.getAttribute('aria-expanded') === 'true';
111
- tocToggle.setAttribute('aria-expanded', !isExpanded);
112
- tocContent.hidden = isExpanded;
113
- toc.classList.toggle('is-collapsed', isExpanded);
114
- });
115
- }
116
-
117
- // Get all headings that are in the TOC
118
- const headings = Array.from(document.querySelectorAll('.post-content h2[id], .post-content h3[id], .post-content h4[id]'));
119
-
120
- if (headings.length === 0) return;
121
-
122
- // Scroll spy - highlight active section
123
- function updateActiveLink() {
124
- const scrollPosition = window.scrollY + 100; // Offset for better UX
125
-
126
- let currentHeading = null;
127
- for (let i = headings.length - 1; i >= 0; i--) {
128
- if (headings[i].offsetTop <= scrollPosition) {
129
- currentHeading = headings[i];
130
- break;
131
- }
132
- }
133
-
134
- tocLinks.forEach(link => {
135
- link.classList.remove('is-active');
136
- if (currentHeading && link.getAttribute('href') === '#' + currentHeading.id) {
137
- link.classList.add('is-active');
138
- }
139
- });
140
- }
141
-
142
- // Reading progress
143
- function updateProgress() {
144
- const windowHeight = window.innerHeight;
145
- const documentHeight = document.documentElement.scrollHeight;
146
- const scrollTop = window.scrollY;
147
- const trackLength = documentHeight - windowHeight;
148
- const percentScrolled = Math.floor((scrollTop / trackLength) * 100);
149
-
150
- if (progressBar) {
151
- progressBar.style.width = percentScrolled + '%';
152
- }
153
- if (progressPercent) {
154
- progressPercent.textContent = percentScrolled;
155
- }
156
- }
157
-
158
- // Scroll to TOC targets. The stylesheet's scroll-behavior decides whether
159
- // the scroll is smooth, so reduced-motion preferences are respected.
160
- tocLinks.forEach(link => {
161
- link.addEventListener('click', function(e) {
162
- const targetId = this.getAttribute('href');
163
- if (targetId && targetId.startsWith('#')) {
164
- e.preventDefault();
165
- const targetElement = document.querySelector(targetId);
166
- if (targetElement) {
167
- const offsetTop = targetElement.offsetTop - 80; // Account for sticky header
168
- window.scrollTo({ top: offsetTop });
169
- // Update URL without jumping
170
- if (history.pushState) {
171
- history.pushState(null, null, targetId);
172
- }
173
- }
174
- }
175
- });
176
- });
177
-
178
- // Throttle scroll events for performance
179
- let scrollTimeout;
180
- function throttledScroll() {
181
- if (scrollTimeout) {
182
- window.cancelAnimationFrame(scrollTimeout);
183
- }
184
- scrollTimeout = window.requestAnimationFrame(function() {
185
- updateActiveLink();
186
- updateProgress();
187
- });
188
- }
189
-
190
- window.addEventListener('scroll', throttledScroll, { passive: true });
191
-
192
- // Initial update
193
- updateActiveLink();
194
- updateProgress();
195
-
196
- // Make TOC sticky on scroll
197
- const tocTop = toc.offsetTop;
198
- window.addEventListener('scroll', function() {
199
- if (window.scrollY > tocTop - 20) {
200
- toc.classList.add('is-sticky');
201
- } else {
202
- toc.classList.remove('is-sticky');
203
- }
204
- }, { passive: true });
205
- });
206
- })();
207
- </script>
208
92
  {%- endif -%}