mirror of
https://github.com/McShelby/hugo-theme-relearn.git
synced 2024-11-23 07:47:54 +00:00
anchor: add option to scroll into view #886
This commit is contained in:
parent
de438327bc
commit
efa0a93fb7
5 changed files with 81 additions and 17 deletions
|
@ -265,6 +265,20 @@ disableRootBreadcrumb = true
|
||||||
# pages. Only the page title will then be shown on the term pages.
|
# pages. Only the page title will then be shown on the term pages.
|
||||||
disableTermBreadcrumbs = false
|
disableTermBreadcrumbs = false
|
||||||
|
|
||||||
|
# Disable copying heading links to clipboard
|
||||||
|
# Default: false
|
||||||
|
# If set to true, this disables the copying of anchor links to the clipboard;
|
||||||
|
# if also `disableAnchorScrolling=true` then no anchor link will be visible
|
||||||
|
# when hovering a heading.
|
||||||
|
disableAnchorCopy = false
|
||||||
|
|
||||||
|
# Disable scrolling to heading link on click
|
||||||
|
# Default: false
|
||||||
|
# If set to true, this disables the scrolling to the beginning of the heading
|
||||||
|
# when clicked; if also `disableAnchorCopy=true` then no anchor link will
|
||||||
|
# be visible when hovering a heading.
|
||||||
|
disableAnchorScrolling = false
|
||||||
|
|
||||||
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
# Highlight
|
# Highlight
|
||||||
# These options configure how code is displayed.
|
# These options configure how code is displayed.
|
||||||
|
|
|
@ -168,6 +168,26 @@ If you are unhappy with the default, you can define the following CSS variable i
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
## Change Heading Anchor Behavior
|
||||||
|
|
||||||
|
Each heading may have an anchor link that is displayed when the heading is hovered.
|
||||||
|
|
||||||
|
The behavior what should happen if the anchor icon is clicked is configurable in your `hugo.toml`. By default all options are activated. If you deactivate all options, no link will be shown on hover.
|
||||||
|
|
||||||
|
{{< multiconfig file=hugo >}}
|
||||||
|
[params]
|
||||||
|
disableAnchorCopy = false
|
||||||
|
disableAnchorScrolling = false
|
||||||
|
{{< /multiconfig >}}
|
||||||
|
|
||||||
|
### `disableAnchorCopy`
|
||||||
|
|
||||||
|
If set to `true`, this disables the copying of anchor links to the clipboard.
|
||||||
|
|
||||||
|
### `disableAnchorScrolling`
|
||||||
|
|
||||||
|
If set to `true`, this disables the scrolling to the beginning of the heading when clicked.
|
||||||
|
|
||||||
## Own Shortcodes with JavaScript Dependencies
|
## Own Shortcodes with JavaScript Dependencies
|
||||||
|
|
||||||
Certain shortcodes make use of additional dependencies like JavaScript and CSS files. The theme only loads these dependencies if the shortcode is used. To do so correctly the theme adds management code in various files.
|
Certain shortcodes make use of additional dependencies like JavaScript and CSS files. The theme only loads these dependencies if the shortcode is used. To do so correctly the theme adds management code in various files.
|
||||||
|
|
|
@ -20,6 +20,12 @@ This document shows you what's new in the latest release and flags it with one o
|
||||||
|
|
||||||
## 6.2.0.beta (XXXX-XX-XX) {#620}
|
## 6.2.0.beta (XXXX-XX-XX) {#620}
|
||||||
|
|
||||||
|
- {{% badge style="note" title=" " %}}Change{{% /badge %}} The heading anchor links are extended in functionality.
|
||||||
|
|
||||||
|
If you now click on it, not only is the link copied to the clipboard (previous behavior) but also the heading scrolls to the top of the page.
|
||||||
|
|
||||||
|
If you dislike the new behavior, you can deactivate it by setting `disableAnchorScrolling=true` in your `hugo.toml`. See the [docs for further options](basics/customization#change-heading-anchor-behavior).
|
||||||
|
|
||||||
- {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} If you are running Hugo {{% badge color="fuchsia" icon="fa-fw fab fa-hackerrank" title=" " %}}0.132.0{{% /badge %}} or later, the theme is now capable to print [GitHub styled alerts](cont/markdown#alerts).
|
- {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} If you are running Hugo {{% badge color="fuchsia" icon="fa-fw fab fa-hackerrank" title=" " %}}0.132.0{{% /badge %}} or later, the theme is now capable to print [GitHub styled alerts](cont/markdown#alerts).
|
||||||
|
|
||||||
- {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} To support new severity levels for GitHub styled alerts, all shortcodes that support severity levels with their `style` parameter were expanded with the new severities `caution` and `important` and the `color` parameter was expanded with `cyan` and `magenta`. Please note, that coloring and icons of severities may defer from the [display you see on GitHub](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts).
|
- {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} To support new severity levels for GitHub styled alerts, all shortcodes that support severity levels with their `style` parameter were expanded with the new severities `caution` and `important` and the `color` parameter was expanded with `cyan` and `magenta`. Please note, that coloring and icons of severities may defer from the [display you see on GitHub](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts).
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
window.relearn.relBasePath='{{ partial "relBasePath.hugo" $page | safeJS }}';
|
window.relearn.relBasePath='{{ partial "relBasePath.hugo" $page | safeJS }}';
|
||||||
window.relearn.relBaseUri='{{ partial "relBaseUri.hugo" $page | safeJS }}';
|
window.relearn.relBaseUri='{{ partial "relBaseUri.hugo" $page | safeJS }}';
|
||||||
window.relearn.absBaseUri='{{ replaceRE "/*$" "" .Site.BaseURL | safeJS }}';
|
window.relearn.absBaseUri='{{ replaceRE "/*$" "" .Site.BaseURL | safeJS }}';
|
||||||
|
window.relearn.disableAnchorCopy={{ printf "%t" (eq .Site.Params.disableAnchorCopy true) | safeJS }};
|
||||||
|
window.relearn.disableAnchorScrolling={{ printf "%t" (eq .Site.Params.disableAnchorScrolling true) | safeJS }};
|
||||||
{{- with .Site.Home.OutputFormats.Get "search" }}
|
{{- with .Site.Home.OutputFormats.Get "search" }}
|
||||||
window.index_js_url={{ (printf "index.search.js%s" $assetBusting) | relLangURL }};
|
window.index_js_url={{ (printf "index.search.js%s" $assetBusting) | relLangURL }};
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
|
@ -528,18 +528,25 @@ function initOpenapi( update, attrs ){
|
||||||
}
|
}
|
||||||
|
|
||||||
function initAnchorClipboard(){
|
function initAnchorClipboard(){
|
||||||
|
if( window.relearn.disableAnchorCopy && window.relearn.disableAnchorScrolling ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
document.querySelectorAll( 'h1~h2,h1~h3,h1~h4,h1~h5,h1~h6').forEach( function( element ){
|
document.querySelectorAll( 'h1~h2,h1~h3,h1~h4,h1~h5,h1~h6').forEach( function( element ){
|
||||||
var url = encodeURI( (document.location.origin == "null" ? (document.location.protocol + "//" + document.location.host) : document.location.origin )+ document.location.pathname);
|
var url = encodeURI( (document.location.origin == "null" ? (document.location.protocol + "//" + document.location.host) : document.location.origin )+ document.location.pathname);
|
||||||
var link = url + "#" + element.id;
|
var link = url + "#" + element.id;
|
||||||
var new_element = document.createElement( 'span' );
|
var new_element = document.createElement( 'span' );
|
||||||
new_element.classList.add( 'anchor' );
|
new_element.classList.add( 'anchor' );
|
||||||
|
if( !window.relearn.disableAnchorCopy ){
|
||||||
new_element.setAttribute( 'title', window.T_Copy_link_to_clipboard );
|
new_element.setAttribute( 'title', window.T_Copy_link_to_clipboard );
|
||||||
|
}
|
||||||
new_element.setAttribute( 'data-clipboard-text', link );
|
new_element.setAttribute( 'data-clipboard-text', link );
|
||||||
new_element.innerHTML = '<i class="fas fa-link fa-lg"></i>';
|
new_element.innerHTML = '<i class="fas fa-link fa-lg"></i>';
|
||||||
element.appendChild( new_element );
|
element.appendChild( new_element );
|
||||||
});
|
});
|
||||||
|
|
||||||
var anchors = document.querySelectorAll( '.anchor' );
|
var anchors = document.querySelectorAll( '.anchor' );
|
||||||
|
if( !window.relearn.disableAnchorCopy ){
|
||||||
for( var i = 0; i < anchors.length; i++ ) {
|
for( var i = 0; i < anchors.length; i++ ) {
|
||||||
anchors[i].addEventListener( 'mouseleave', function( e ){
|
anchors[i].addEventListener( 'mouseleave', function( e ){
|
||||||
this.removeAttribute( 'aria-label' );
|
this.removeAttribute( 'aria-label' );
|
||||||
|
@ -552,8 +559,25 @@ function initAnchorClipboard(){
|
||||||
e.clearSelection();
|
e.clearSelection();
|
||||||
e.trigger.setAttribute( 'aria-label', window.T_Link_copied_to_clipboard );
|
e.trigger.setAttribute( 'aria-label', window.T_Link_copied_to_clipboard );
|
||||||
e.trigger.classList.add( 'tooltipped', 'tooltipped-s'+(isRtl?'e':'w') );
|
e.trigger.classList.add( 'tooltipped', 'tooltipped-s'+(isRtl?'e':'w') );
|
||||||
|
if( !window.relearn.disableAnchorScrolling ){
|
||||||
|
e.trigger.parentElement.scrollIntoView({ behavior: 'smooth' });
|
||||||
|
var state = window.history.state || {};
|
||||||
|
state = Object.assign( {}, ( typeof state === 'object' ) ? state : {} );
|
||||||
|
history.replaceState( {}, '', e.text );
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if ( !window.relearn.disableAnchorScrolling ){
|
||||||
|
for( var i = 0; i < anchors.length; i++ ) {
|
||||||
|
anchors[i].addEventListener( 'click', function( e ){
|
||||||
|
e.target.parentElement.parentElement.scrollIntoView({ behavior: 'smooth' });
|
||||||
|
var state = window.history.state || {};
|
||||||
|
state = Object.assign( {}, ( typeof state === 'object' ) ? state : {} );
|
||||||
|
history.replaceState( {}, '', e.text );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function initCodeClipboard(){
|
function initCodeClipboard(){
|
||||||
function getCodeText( node ){
|
function getCodeText( node ){
|
||||||
|
@ -1267,7 +1291,7 @@ function scrollToPositions() {
|
||||||
var found = elementContains( search, elc );
|
var found = elementContains( search, elc );
|
||||||
var searchedElem = found.length && found[ 0 ];
|
var searchedElem = found.length && found[ 0 ];
|
||||||
if( searchedElem ){
|
if( searchedElem ){
|
||||||
searchedElem.scrollIntoView( true );
|
searchedElem.scrollIntoView();
|
||||||
var scrolledY = window.scrollY;
|
var scrolledY = window.scrollY;
|
||||||
if( scrolledY ){
|
if( scrolledY ){
|
||||||
window.scroll( 0, scrolledY - 125 );
|
window.scroll( 0, scrolledY - 125 );
|
||||||
|
@ -1281,9 +1305,7 @@ function scrollToPositions() {
|
||||||
try{
|
try{
|
||||||
var e = document.querySelector( window.location.hash );
|
var e = document.querySelector( window.location.hash );
|
||||||
if( e && e.scrollIntoView ){
|
if( e && e.scrollIntoView ){
|
||||||
e.scrollIntoView({
|
e.scrollIntoView();
|
||||||
block: 'start',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
} catch( e ){}
|
} catch( e ){}
|
||||||
}, 10 );
|
}, 10 );
|
||||||
|
|
Loading…
Reference in a new issue