Progress Indicator in TOC

This commit is contained in:
Nuno Coração 2023-01-14 23:05:10 +00:00
parent d569a0146e
commit 62dbfc51c5
8 changed files with 95 additions and 17 deletions

View file

@ -684,6 +684,11 @@ select {
max-width: 65ch; max-width: 65ch;
} }
.prose :where(p):not(:where([class~="not-prose"] *)) {
margin-top: 1.25em;
margin-bottom: 1.25em;
}
.prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) { .prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) {
color: var(--tw-prose-lead); color: var(--tw-prose-lead);
font-size: 1.25em; font-size: 1.25em;
@ -1051,11 +1056,6 @@ select {
line-height: 1.75; line-height: 1.75;
} }
.prose :where(p):not(:where([class~="not-prose"] *)) {
margin-top: 1.25em;
margin-bottom: 1.25em;
}
.prose :where(video):not(:where([class~="not-prose"] *)) { .prose :where(video):not(:where([class~="not-prose"] *)) {
margin-top: 2em; margin-top: 2em;
margin-bottom: 2em; margin-bottom: 2em;
@ -1175,6 +1175,17 @@ select {
display: none; display: none;
} }
.prose :where(a.active):not(:where([class~="not-prose"] *)) {
text-decoration-color: rgba(var(--color-primary-600), 1);
text-decoration-line: underline;
text-decoration-thickness: 3px;
text-underline-offset: 4px;
}
.prose-invert :where(a.active):not(:where([class~="not-prose"] *)) {
text-decoration-color: rgba(var(--color-primary-400), 1);
}
.sr-only { .sr-only {
position: absolute; position: absolute;
width: 1px; width: 1px;
@ -1433,10 +1444,6 @@ select {
margin-right: -0.5rem; margin-right: -0.5rem;
} }
.mr-1 {
margin-right: 0.25rem;
}
.ml-auto { .ml-auto {
margin-left: auto; margin-left: auto;
} }
@ -3426,6 +3433,10 @@ body:has(#menu-controller:checked) {
background-color: rgba(var(--color-neutral-700), 1); background-color: rgba(var(--color-neutral-700), 1);
} }
.dark .dark\:prose-invert :where(a.active):not(:where([class~="not-prose"] *)) {
text-decoration-color: rgba(var(--color-primary-400), 1);
}
.dark .dark\:text-neutral-500 { .dark .dark\:text-neutral-500 {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgba(var(--color-neutral-500), var(--tw-text-opacity)); color: rgba(var(--color-neutral-500), var(--tw-text-opacity));

View file

@ -0,0 +1 @@
//for future

2
assets/lib/jquery/jquery.slim.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,24 +1,57 @@
<details open class="mt-0 overflow-hidden rounded-lg ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 hidden lg:block"> <details open class="mt-0 overflow-hidden rounded-lg ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 hidden lg:block">
<summary <summary
class="block py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden" class="block py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden">
>
{{ i18n "article.table_of_contents" }} {{ i18n "article.table_of_contents" }}
</summary> </summary>
<div <div
class="min-w-[220px] py-2 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600" class="min-w-[220px] py-2 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600">
>
{{ .TableOfContents | emojify }} {{ .TableOfContents | emojify }}
</div> </div>
</details> </details>
<details class="mt-0 overflow-hidden rounded-lg ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 lg:hidden"> <details class="mt-0 overflow-hidden rounded-lg ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 lg:hidden">
<summary <summary
class="py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden" class="py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden">
>
{{ i18n "article.table_of_contents" }} {{ i18n "article.table_of_contents" }}
</summary> </summary>
<div <div
class="py-2 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600" class="py-2 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600">
>
{{ .TableOfContents | emojify }} {{ .TableOfContents | emojify }}
</div> </div>
</details> </details>
<script>
(function () {
var $toc = $('#TableOfContents');
if ($toc.length > 0) {
var $window = $(window);
function onScroll() {
var currentScroll = $window.scrollTop();
var h = $('.anchor');
var id = "";
h.each(function (i, e) {
e = $(e);
if (e.offset().top - $(window).height()/2 <= currentScroll) {
id = e.attr('id');
}
});
var active = $toc.find('a.active');
if (active.length == 1 && active.eq(0).attr('href') == '#' + id) return true;
active.each(function (i, e) {
$(e).removeClass('active').siblings('ul').hide();
});
$toc.find('a[href="#' + id + '"]').parentsUntil('#TableOfContents').each(function (i, e) {
console.log($(e).children('a'))
$(e).children('a').addClass('active').parents('ul').show();
});
}
$window.on('scroll', onScroll);
$(document).ready(function () {
$toc.find('a').parent('li').find('ul').hide();
onScroll();
});
}
})();
</script>

View file

@ -1,3 +1,7 @@
{{/* jQuery */}}
{{ $jqueryLib := resources.Get "lib/jquery/jquery.slim.min.js" }}
<script src="{{ $jqueryLib.RelPermalink }}" integrity="{{ $jqueryLib.Data.Integrity }}"></script>
{{/* Mermaid */}} {{/* Mermaid */}}
{{ if .Page.HasShortcode "mermaid" }} {{ if .Page.HasShortcode "mermaid" }}
{{ $mermaidLib := resources.Get "lib/mermaid/mermaid.min.js" }} {{ $mermaidLib := resources.Get "lib/mermaid/mermaid.min.js" }}

13
package-lock.json generated
View file

@ -19,6 +19,7 @@
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"chart.js": "^4.1.2", "chart.js": "^4.1.2",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"jquery": "^3.6.3",
"katex": "^0.16.4", "katex": "^0.16.4",
"mermaid": "^9.3.0", "mermaid": "^9.3.0",
"prettier": "^2.8.2", "prettier": "^2.8.2",
@ -904,6 +905,12 @@
"node": ">=0.12.0" "node": ">=0.12.0"
} }
}, },
"node_modules/jquery": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==",
"dev": true
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -2224,6 +2231,12 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
}, },
"jquery": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==",
"dev": true
},
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",

View file

@ -37,6 +37,7 @@
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"chart.js": "^4.1.2", "chart.js": "^4.1.2",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"jquery": "^3.6.3",
"katex": "^0.16.4", "katex": "^0.16.4",
"mermaid": "^9.3.0", "mermaid": "^9.3.0",
"prettier": "^2.8.2", "prettier": "^2.8.2",
@ -80,6 +81,10 @@
{ {
"from": "node_modules/typeit/dist/index.umd.js", "from": "node_modules/typeit/dist/index.umd.js",
"to": "assets/lib/typeit/typeit.umd.js" "to": "assets/lib/typeit/typeit.umd.js"
},
{
"from": "node_modules/jquery/dist/jquery.slim.min.js",
"to": "assets/lib/jquery/jquery.slim.min.js"
} }
], ],
"dependencies": { "dependencies": {

View file

@ -136,6 +136,12 @@ module.exports = {
'p::after': { 'p::after': {
display: 'none' display: 'none'
}, },
'a.active': {
"text-decoration-color": theme("colors.primary.600 / 1"),
"text-decoration-line": "underline",
"text-decoration-thickness": "3px",
"text-underline-offset": "4px"
}
}, },
}, },
invert: { invert: {
@ -153,6 +159,9 @@ module.exports = {
code:{ code:{
backgroundColor: theme("colors.neutral.700 / 1"), backgroundColor: theme("colors.neutral.700 / 1"),
}, },
'a.active': {
"text-decoration-color": theme("colors.primary.400 / 1")
}
}, },
}, },
}), }),