datalog-theme 0.9.1 → 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 +4 -4
- data/CHANGELOG.md +46 -0
- data/CITATION.cff +2 -2
- data/README.md +1 -1
- data/_data/i18n/en.yml +28 -0
- data/_data/i18n/es.yml +28 -0
- data/_data/i18n/pt.yml +28 -0
- data/_includes/components/api-function.html +1 -1
- data/_includes/components/breadcrumbs.html +6 -6
- data/_includes/components/enhanced-toc.html +3 -119
- data/_includes/components/package-install.html +76 -163
- data/_includes/components/social-share.html +10 -10
- data/_includes/footer/nav-column.html +5 -2
- data/_includes/footer.html +5 -5
- data/_includes/header/navigation.html +11 -2
- data/_includes/header.html +8 -8
- data/_includes/scripts.html +2 -1
- data/_layouts/package.html +9 -7
- data/_plugins/i18n.rb +15 -1
- data/_plugins/image_optimizer.rb +8 -2
- data/_plugins/js_manifest_filter.rb +35 -0
- data/_plugins/math_preprocessor.rb +42 -2
- data/_sass/_package-docs.scss +57 -31
- data/assets/js/dist/comments.js +2 -2
- data/assets/js/dist/core.js +1 -1
- data/assets/js/dist/math.js +1 -1
- data/assets/js/dist/moderation.js +1 -1
- data/assets/js/dist/sources.json +8 -6
- data/assets/js/dist/subscriptions.js +1 -1
- data/lib/datalog/cli.rb +17 -8
- data/lib/datalog/slug.rb +38 -0
- data/lib/datalog/theme/version.rb +1 -1
- metadata +4 -3
- data/_includes/components/search-facets.html +0 -307
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5b74bf15f89adfc2aa62c676c096602c7831b07e44398fd0968d91da7f86bfb4
|
|
4
|
+
data.tar.gz: 1f696c0c8858b68c1433256bccafd16873d9f1e7dd93458e4d6264cd87218965
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dfd30ca2e0683df45f6db2fa03feafeac691e1f79defbda412e380510b746dab12d4a7abd97882c81d54290641c9a0fe1f939dd88a468fb9388a1aeaa0d7e350
|
|
7
|
+
data.tar.gz: ff0175b85f72ae03c61a71629b2c0890d440d46591bdf1bcf31e0b0a4df92d6ccea7185e5cec891fb934d7098717900a35fb8ac7bc58e9b124e84dab5ef57a11
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,52 @@
|
|
|
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
|
+
|
|
42
|
+
## [0.9.2] - 2026-09-20
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- Keep newly posted comments visible when an older thread read finishes, and refresh moderation reads that overlap completed actions without losing their filters or pagination.
|
|
47
|
+
- Retry subscription preference saves with the edited topics, clearing retry handlers left by earlier loading failures.
|
|
48
|
+
- Preserve indented code blocks during math preprocessing, distinguish them from indented prose, and accept longer closing code fences so following math is still detected.
|
|
49
|
+
- Percent-encode generated image paths once in the responsive manifest so filenames containing spaces produce valid image candidates in Markdown and responsive-image includes.
|
|
50
|
+
|
|
5
51
|
## [0.9.1] - 2026-09-20
|
|
6
52
|
|
|
7
53
|
Planned patch release: **0.9.1**. This release contains bug fixes only.
|
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.
|
|
20
|
-
date-released: 2026-09-
|
|
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.
|
|
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="
|
|
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">
|
|
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">
|
|
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">
|
|
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">
|
|
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">
|
|
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">
|
|
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"
|
|
85
|
+
<div class="enhanced-toc__stats">
|
|
86
86
|
<span class="enhanced-toc__reading-progress" data-reading-progress>
|
|
87
|
-
<span class="visually-hidden">
|
|
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 -%}
|