mirror of
https://github.com/gethinode/hinode.git
synced 2025-10-07 18:14:28 +00:00
Compare commits
208 Commits
v0.12.0-al
...
v0.14.4
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c8e2d3410c | ||
![]() |
8d53c762d7 | ||
![]() |
22d2e41601 | ||
![]() |
b462c31916 | ||
![]() |
dbb5b4be69 | ||
![]() |
4f288ec5dd | ||
![]() |
8fb47e27af | ||
![]() |
a0d2063738 | ||
![]() |
c17986bb49 | ||
![]() |
bafd522530 | ||
![]() |
930e151365 | ||
![]() |
6687e09d68 | ||
![]() |
86ec79d08a | ||
![]() |
afb42a188c | ||
![]() |
c303e97eb0 | ||
![]() |
1ad2a4c617 | ||
![]() |
2bf15ca8b2 | ||
![]() |
e00ab2a2fd | ||
![]() |
98c422a6d4 | ||
![]() |
527060e219 | ||
![]() |
b5c81cd121 | ||
![]() |
9fbe81a668 | ||
![]() |
cf4ed131aa | ||
![]() |
15a9eb2c5c | ||
![]() |
3271fcc97e | ||
![]() |
0752b4cfbf | ||
![]() |
965845137c | ||
![]() |
8f83138cbc | ||
![]() |
86d726d10c | ||
![]() |
2860edd1bd | ||
![]() |
d802df87ef | ||
![]() |
808b3a5694 | ||
![]() |
cde8495583 | ||
![]() |
c2aaff81cf | ||
![]() |
5421839028 | ||
![]() |
a74466e281 | ||
![]() |
454c659e44 | ||
![]() |
2de384497e | ||
![]() |
ca41d9adb4 | ||
![]() |
a633e4eea0 | ||
![]() |
a341e916b9 | ||
![]() |
a3d289843f | ||
![]() |
8700e18ad9 | ||
![]() |
8936dafac6 | ||
![]() |
4d1c7d46eb | ||
![]() |
bffe6425da | ||
![]() |
3e1c3a2c9c | ||
![]() |
df83103718 | ||
![]() |
e54417bc02 | ||
![]() |
61f2b82221 | ||
![]() |
2689107e5a | ||
![]() |
d20d053232 | ||
![]() |
35fb72d408 | ||
![]() |
18cee3cac6 | ||
![]() |
192021fbb3 | ||
![]() |
a3c5d36584 | ||
![]() |
42d169bbc0 | ||
![]() |
3b4b3a65b6 | ||
![]() |
32ee66bf90 | ||
![]() |
6b8ff44fb0 | ||
![]() |
70cc8946b0 | ||
![]() |
eab0cfa6ab | ||
![]() |
1580898f1a | ||
![]() |
530fb03d29 | ||
![]() |
3e5261bd36 | ||
![]() |
e2d409baed | ||
![]() |
d009874ece | ||
![]() |
f8adffc131 | ||
![]() |
68a3a3be30 | ||
![]() |
c077c8b53b | ||
![]() |
6a0c6af296 | ||
![]() |
2bf16b0e59 | ||
![]() |
e56cc645e2 | ||
![]() |
8c361a8417 | ||
![]() |
65e9e57c9e | ||
![]() |
ffa4473d25 | ||
![]() |
6c5fe6f208 | ||
![]() |
60efecf946 | ||
![]() |
70fdf7c4f0 | ||
![]() |
ee4bb45368 | ||
![]() |
a08695d97e | ||
![]() |
1abeabcacd | ||
![]() |
16b2c8b058 | ||
![]() |
f8eab705fb | ||
![]() |
13b8421893 | ||
![]() |
6324a90d77 | ||
![]() |
faccca732b | ||
![]() |
04736fd8f1 | ||
![]() |
9c4378e5af | ||
![]() |
0574627010 | ||
![]() |
9e668775db | ||
![]() |
cefd152430 | ||
![]() |
48d2002d1c | ||
![]() |
259f0f321c | ||
![]() |
d24cb8ccb3 | ||
![]() |
96226e2d8a | ||
![]() |
27857b7fd5 | ||
![]() |
9a67f7bd4f | ||
![]() |
e15cd08bea | ||
![]() |
dd817bc5ce | ||
![]() |
4b4c9d1711 | ||
![]() |
38e68ac757 | ||
![]() |
c14d3868bb | ||
![]() |
067c244770 | ||
![]() |
d76d275ddb | ||
![]() |
1803759b6b | ||
![]() |
2833cfc15a | ||
![]() |
0a174def75 | ||
![]() |
7a7d3a93f9 | ||
![]() |
c1afe32344 | ||
![]() |
749dab16ca | ||
![]() |
264012eefb | ||
![]() |
fda4efa72b | ||
![]() |
6a0bdf0f61 | ||
![]() |
1a09879bea | ||
![]() |
81cc8fe02f | ||
![]() |
ef3d79f875 | ||
![]() |
c66bb79ac5 | ||
![]() |
c5c5695541 | ||
![]() |
a3343c29dc | ||
![]() |
50a697c1fb | ||
![]() |
6cf7a410f4 | ||
![]() |
bdade82dea | ||
![]() |
38aac9507e | ||
![]() |
0eec1da639 | ||
![]() |
1e8bc5f11d | ||
![]() |
56f467e02c | ||
![]() |
83049db4bc | ||
![]() |
78599c8f76 | ||
![]() |
fc6e916fca | ||
![]() |
a0febc31ee | ||
![]() |
800c82dba5 | ||
![]() |
8b59f3b6f7 | ||
![]() |
9795e04a9b | ||
![]() |
6381cb3519 | ||
![]() |
01927f22b6 | ||
![]() |
da75210771 | ||
![]() |
b47bf99744 | ||
![]() |
2a4ba34c51 | ||
![]() |
fc07cec664 | ||
![]() |
538a1d2de3 | ||
![]() |
6dda374b73 | ||
![]() |
e53a333ebf | ||
![]() |
5ed8c28bee | ||
![]() |
fa47b7d93e | ||
![]() |
f1693c8cf0 | ||
![]() |
740fd91038 | ||
![]() |
9a0dba5ee4 | ||
![]() |
e4b7b252b3 | ||
![]() |
569562cf24 | ||
![]() |
60b53f2fa9 | ||
![]() |
3e5f23cf89 | ||
![]() |
c7b16cf2f4 | ||
![]() |
191d6e3d94 | ||
![]() |
9dd7bf64e1 | ||
![]() |
580675f8b1 | ||
![]() |
b2b43d550b | ||
![]() |
f79317b317 | ||
![]() |
3d7bcc4356 | ||
![]() |
a7256ff270 | ||
![]() |
8ffc6dbd59 | ||
![]() |
5bb0cf07e6 | ||
![]() |
37e9e70c55 | ||
![]() |
b4ddc8c58d | ||
![]() |
a7c4be508d | ||
![]() |
0988e07106 | ||
![]() |
7dcbfe8373 | ||
![]() |
fdebbccfa1 | ||
![]() |
7d1cd93e87 | ||
![]() |
3a056829c5 | ||
![]() |
0ee0febc15 | ||
![]() |
ac081a3084 | ||
![]() |
9d07b5da5a | ||
![]() |
67f1708691 | ||
![]() |
c5e5ec0f21 | ||
![]() |
d461333738 | ||
![]() |
32c422a2a8 | ||
![]() |
b66660b557 | ||
![]() |
be95c3cd68 | ||
![]() |
74aa32e595 | ||
![]() |
4c305b38a5 | ||
![]() |
63c609c1d3 | ||
![]() |
d7424d26eb | ||
![]() |
1f66740c19 | ||
![]() |
cb032b4fb8 | ||
![]() |
3889382e19 | ||
![]() |
86addfd6dd | ||
![]() |
9110fb5ab4 | ||
![]() |
fad4cdbfd2 | ||
![]() |
c403d422d9 | ||
![]() |
0ecfa72864 | ||
![]() |
62af498414 | ||
![]() |
ee37599ded | ||
![]() |
9a4c7c7776 | ||
![]() |
c05eeb015c | ||
![]() |
d9f898a2e1 | ||
![]() |
36f31a57ae | ||
![]() |
17b3bbaf80 | ||
![]() |
26bc4ebb00 | ||
![]() |
d13d80af2f | ||
![]() |
64abaf8d1e | ||
![]() |
ffc9c47b45 | ||
![]() |
092630b030 | ||
![]() |
2ec60a8b71 | ||
![]() |
9af871fee7 | ||
![]() |
883ab3f7a0 | ||
![]() |
d6a49ccb90 | ||
![]() |
fdc58d52e9 |
@@ -1,3 +1,4 @@
|
|||||||
|
assets/js/analytics.js
|
||||||
assets/js/color.js
|
assets/js/color.js
|
||||||
assets/js/flexsearch.js
|
assets/js/flexsearch.js
|
||||||
assets/js/vendor
|
assets/js/vendor
|
||||||
|
@@ -116,7 +116,7 @@ Hinode is inspired by the following themes:
|
|||||||
|
|
||||||
## Donate
|
## Donate
|
||||||
|
|
||||||
<a href="https://www.buymeacoffee.com/markdumay" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/lato-orange.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;"></a>
|
<a href="https://www.buymeacoffee.com/markdumay" target="_blank" rel="noopener noreferrer"><img src="https://cdn.buymeacoffee.com/buttons/lato-orange.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;"></a>
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
69
assets/js/analytics.js
Normal file
69
assets/js/analytics.js
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// Adapted from https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/google_analytics.html
|
||||||
|
|
||||||
|
{{- define "__ga_js_set_doNotTrack" -}}{{/* This is also used in the async version. */}}
|
||||||
|
{{- $pc := .Site.Config.Privacy.GoogleAnalytics -}}
|
||||||
|
{{- if not $pc.RespectDoNotTrack -}}
|
||||||
|
var doNotTrack = false;
|
||||||
|
{{- else -}}
|
||||||
|
var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
|
||||||
|
var doNotTrack = (dnt == "1" || dnt == "yes");
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $pc := .Site.Config.Privacy.GoogleAnalytics -}}
|
||||||
|
{{- if (and (not .Site.IsServer) (not $pc.Disable)) -}}
|
||||||
|
{{ with .Site.GoogleAnalytics -}}
|
||||||
|
{{ if hasPrefix . "G-"}}
|
||||||
|
{{ template "__ga_js_set_doNotTrack" $ }}
|
||||||
|
|
||||||
|
if (!doNotTrack) {
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
|
||||||
|
function gtag() {
|
||||||
|
dataLayer.push(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
gtag('js', new Date());
|
||||||
|
gtag('config', '{{ . }}', { 'anonymize_ip': {{- $pc.AnonymizeIP -}} });
|
||||||
|
}
|
||||||
|
|
||||||
|
{{ else if hasPrefix . "UA-" }}
|
||||||
|
{{ template "__ga_js_set_doNotTrack" $ }}
|
||||||
|
|
||||||
|
if (!doNotTrack) {
|
||||||
|
(function(i, s, o, g, r, a, m) {
|
||||||
|
i['GoogleAnalyticsObject'] = r;
|
||||||
|
i[r] = i[r] || function() {
|
||||||
|
(i[r].q = i[r].q || []).push(arguments)
|
||||||
|
}, i[r].l = 1 * new Date();
|
||||||
|
a = s.createElement(o),
|
||||||
|
m = s.getElementsByTagName(o)[0];
|
||||||
|
a.async = 1;
|
||||||
|
a.src = g;
|
||||||
|
m.parentNode.insertBefore(a, m)
|
||||||
|
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
|
||||||
|
|
||||||
|
{{- if $pc.UseSessionStorage }}
|
||||||
|
if (window.sessionStorage) {
|
||||||
|
var GA_SESSION_STORAGE_KEY = 'ga:clientId';
|
||||||
|
ga('create', '{{ . }}', {
|
||||||
|
'storage': 'none',
|
||||||
|
'clientId': sessionStorage.getItem(GA_SESSION_STORAGE_KEY)
|
||||||
|
});
|
||||||
|
|
||||||
|
ga(function(tracker) {
|
||||||
|
sessionStorage.setItem(GA_SESSION_STORAGE_KEY, tracker.get('clientId'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
{{ else }}
|
||||||
|
ga('create', '{{ . }}', 'auto');
|
||||||
|
{{ end -}}
|
||||||
|
{{ if $pc.AnonymizeIP }}
|
||||||
|
ga('set', 'anonymizeIp', true);
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
ga('send', 'pageview');
|
||||||
|
}
|
||||||
|
{{- end }}
|
||||||
|
{{ end -}}
|
||||||
|
{{- end }}
|
@@ -14,10 +14,12 @@ const addCopyButtons = (clipboard) => {
|
|||||||
// 2. Create a button that will trigger a copy operation
|
// 2. Create a button that will trigger a copy operation
|
||||||
const button = document.createElement('button')
|
const button = document.createElement('button')
|
||||||
button.className = 'clipboard-button'
|
button.className = 'clipboard-button'
|
||||||
|
button.setAttribute('data-toast-target', 'toast-copied-code-message')
|
||||||
button.type = 'button'
|
button.type = 'button'
|
||||||
button.innerHTML = svgCopy
|
button.innerHTML = svgCopy
|
||||||
button.addEventListener('click', () => {
|
button.addEventListener('click', () => {
|
||||||
clipboard.writeText(codeBlock.innerText).then(
|
const text = codeBlock.innerText.split('\n').filter(Boolean).join('\n')
|
||||||
|
clipboard.writeText(text).then(
|
||||||
() => {
|
() => {
|
||||||
button.blur()
|
button.blur()
|
||||||
button.innerHTML = svgCheck
|
button.innerHTML = svgCheck
|
||||||
@@ -36,3 +38,10 @@ const addCopyButtons = (clipboard) => {
|
|||||||
if (navigator && navigator.clipboard) {
|
if (navigator && navigator.clipboard) {
|
||||||
addCopyButtons(navigator.clipboard)
|
addCopyButtons(navigator.clipboard)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-clipboard]').forEach(trigger => {
|
||||||
|
const text = trigger.getAttribute('data-clipboard')
|
||||||
|
trigger.addEventListener('click', () => {
|
||||||
|
navigator.clipboard.writeText(text)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@@ -1,89 +1,30 @@
|
|||||||
/*
|
{{- $search := default true site.Params.navigation.search -}}
|
||||||
Source:
|
{{- if $search -}}
|
||||||
- https://raw.githubusercontent.com/h-enk/doks/master/assets/js/index.js
|
var search = document.getElementById('search');
|
||||||
*/
|
var suggestions = document.getElementById('suggestions');
|
||||||
|
var index = new FlexSearch.Document({
|
||||||
|
tokenize: "forward",
|
||||||
|
cache: 100,
|
||||||
|
document: {
|
||||||
|
id: "id",
|
||||||
|
tag: "tag",
|
||||||
|
store: ["href", "title", "description"],
|
||||||
|
index: ["title", "description", "content"]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var suggestions = document.getElementById('suggestions');
|
/*
|
||||||
var search = document.getElementById('search');
|
Source:
|
||||||
|
- https://github.com/nextapps-de/flexsearch#index-documents-field-search
|
||||||
if (search !== null) {
|
- https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
|
||||||
document.addEventListener('keydown', inputFocus);
|
*/
|
||||||
}
|
function initIndex() {
|
||||||
|
|
||||||
function inputFocus(e) {
|
|
||||||
if (e.ctrlKey && e.key === '/' ) {
|
|
||||||
e.preventDefault();
|
|
||||||
search.focus();
|
|
||||||
}
|
|
||||||
if (e.key === 'Escape' ) {
|
|
||||||
search.blur();
|
|
||||||
suggestions.classList.add('d-none');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener('click', function(event) {
|
|
||||||
|
|
||||||
var isClickInsideElement = suggestions.contains(event.target);
|
|
||||||
|
|
||||||
if (!isClickInsideElement) {
|
|
||||||
suggestions.classList.add('d-none');
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
|
||||||
Source:
|
|
||||||
- https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3
|
|
||||||
*/
|
|
||||||
|
|
||||||
document.addEventListener('keydown',suggestionFocus);
|
|
||||||
|
|
||||||
function suggestionFocus(e) {
|
|
||||||
const suggestionsHidden = suggestions.classList.contains('d-none');
|
|
||||||
if (suggestionsHidden) return;
|
|
||||||
|
|
||||||
const focusableSuggestions= [...suggestions.querySelectorAll('a')];
|
|
||||||
if (focusableSuggestions.length === 0) return;
|
|
||||||
|
|
||||||
const index = focusableSuggestions.indexOf(document.activeElement);
|
|
||||||
|
|
||||||
if (e.key === "ArrowUp") {
|
|
||||||
e.preventDefault();
|
|
||||||
const nextIndex = index > 0 ? index - 1 : 0;
|
|
||||||
focusableSuggestions[nextIndex].focus();
|
|
||||||
}
|
|
||||||
else if (e.key === "ArrowDown") {
|
|
||||||
e.preventDefault();
|
|
||||||
const nextIndex= index + 1 < focusableSuggestions.length ? index + 1 : index;
|
|
||||||
focusableSuggestions[nextIndex].focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Source:
|
|
||||||
- https://github.com/nextapps-de/flexsearch#index-documents-field-search
|
|
||||||
- https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function(){
|
|
||||||
|
|
||||||
var index = new FlexSearch.Document({
|
|
||||||
tokenize: "forward",
|
|
||||||
cache: 100,
|
|
||||||
document: {
|
|
||||||
id: "id",
|
|
||||||
tag: "tag",
|
|
||||||
store: ["href", "title", "description"],
|
|
||||||
index: ["title", "description", "content"]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// https://discourse.gohugo.io/t/range-length-or-last-element/3803/2
|
// https://discourse.gohugo.io/t/range-length-or-last-element/3803/2
|
||||||
// Note: uses .Site.AllPages as .Site.RegularPages only returns content for the current language
|
// Note: uses .Site.AllPages as .Site.RegularPages only returns content for the current language;
|
||||||
// pages without a title (such as browserconfig.xml) are excluded
|
// pages without a title (such as browserconfig.xml) are excluded
|
||||||
{{ $list := where (where site.AllPages "Kind" "in" "page") "Title" "!=" "" }}
|
{{ $list := where (where site.AllPages "Kind" "in" "page") "Title" "!=" "" }}
|
||||||
{{ $len := (len $list) -}}
|
{{ $len := (len $list) -}}
|
||||||
|
|
||||||
index.add(
|
index.add(
|
||||||
{{ range $index, $element := $list -}}
|
{{ range $index, $element := $list -}}
|
||||||
{
|
{
|
||||||
@@ -103,59 +44,121 @@ Source:
|
|||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
;
|
;
|
||||||
|
|
||||||
search.addEventListener('input', show_results, true);
|
search.addEventListener('input', showResults, true);
|
||||||
|
}
|
||||||
function show_results(){
|
|
||||||
const maxResult = 5;
|
function hideSuggestions(e) {
|
||||||
var searchQuery = this.value;
|
var isClickInsideElement = suggestions.contains(e.target);
|
||||||
// filter the results for the currently tagged language
|
|
||||||
const lang = document.documentElement.lang;
|
if (!isClickInsideElement) {
|
||||||
var results = index.search(searchQuery, { index: ['title', 'description', 'content'], limit: maxResult, tag: lang, enrich: true });
|
suggestions.classList.add('d-none');
|
||||||
|
|
||||||
// flatten results since index.search() returns results for each indexed field
|
|
||||||
const flatResults = new Map(); // keyed by href to dedupe results
|
|
||||||
for (const result of results.flatMap(r => r.result)) {
|
|
||||||
if (flatResults.has(result.doc.href)) continue;
|
|
||||||
flatResults.set(result.doc.href, result.doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
suggestions.innerHTML = "";
|
|
||||||
suggestions.classList.remove('d-none');
|
|
||||||
|
|
||||||
// inform user that no results were found
|
|
||||||
if (flatResults.size === 0 && searchQuery) {
|
|
||||||
const noResultsMessage = document.createElement('div')
|
|
||||||
noResultsMessage.innerHTML = `{{ T "ui_no_results" }} "<strong>${searchQuery}</strong>"`
|
|
||||||
noResultsMessage.classList.add("suggestion__no-results");
|
|
||||||
suggestions.appendChild(noResultsMessage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// construct a list of suggestions
|
|
||||||
for(const [href, doc] of flatResults) {
|
|
||||||
const entry = document.createElement('div');
|
|
||||||
suggestions.appendChild(entry);
|
|
||||||
|
|
||||||
const a = document.createElement('a');
|
|
||||||
a.href = href;
|
|
||||||
entry.appendChild(a);
|
|
||||||
|
|
||||||
const title = document.createElement('span');
|
|
||||||
title.classList.add('text-start');
|
|
||||||
title.textContent = doc.title;
|
|
||||||
title.classList.add("suggestion__title");
|
|
||||||
a.appendChild(title);
|
|
||||||
|
|
||||||
const description = document.createElement('span');
|
|
||||||
description.textContent = doc.description;
|
|
||||||
description.classList.add("suggestion__description");
|
|
||||||
a.appendChild(description);
|
|
||||||
|
|
||||||
suggestions.appendChild(entry);
|
|
||||||
|
|
||||||
if(suggestions.childElementCount == maxResult) break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}());
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Source:
|
||||||
|
- https://raw.githubusercontent.com/h-enk/doks/master/assets/js/index.js
|
||||||
|
*/
|
||||||
|
function inputFocus(e) {
|
||||||
|
if (e.ctrlKey && e.key === '/' ) {
|
||||||
|
e.preventDefault();
|
||||||
|
search.focus();
|
||||||
|
}
|
||||||
|
if (e.key === 'Escape' ) {
|
||||||
|
search.blur();
|
||||||
|
suggestions.classList.add('d-none');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Source:
|
||||||
|
- https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3
|
||||||
|
*/
|
||||||
|
function suggestionFocus(e) {
|
||||||
|
const suggestionsHidden = suggestions.classList.contains('d-none');
|
||||||
|
if (suggestionsHidden) return;
|
||||||
|
|
||||||
|
const focusableSuggestions= [...suggestions.querySelectorAll('a')];
|
||||||
|
if (focusableSuggestions.length === 0) return;
|
||||||
|
|
||||||
|
const index = focusableSuggestions.indexOf(document.activeElement);
|
||||||
|
|
||||||
|
if (e.key === "ArrowUp") {
|
||||||
|
e.preventDefault();
|
||||||
|
const nextIndex = index > 0 ? index - 1 : 0;
|
||||||
|
focusableSuggestions[nextIndex].focus();
|
||||||
|
}
|
||||||
|
else if (e.key === "ArrowDown") {
|
||||||
|
e.preventDefault();
|
||||||
|
const nextIndex= index + 1 < focusableSuggestions.length ? index + 1 : index;
|
||||||
|
focusableSuggestions[nextIndex].focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Source:
|
||||||
|
- https://github.com/nextapps-de/flexsearch#index-documents-field-search
|
||||||
|
- https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
|
||||||
|
*/
|
||||||
|
function showResults() {
|
||||||
|
const maxResult = 5;
|
||||||
|
var searchQuery = this.value;
|
||||||
|
// filter the results for the currently tagged language
|
||||||
|
const lang = document.documentElement.lang;
|
||||||
|
var results = index.search(searchQuery, { index: ['title', 'description', 'content'], limit: maxResult, tag: lang, enrich: true });
|
||||||
|
|
||||||
|
// flatten results since index.search() returns results for each indexed field
|
||||||
|
const flatResults = new Map(); // keyed by href to dedupe results
|
||||||
|
for (const result of results.flatMap(r => r.result)) {
|
||||||
|
if (flatResults.has(result.doc.href)) continue;
|
||||||
|
flatResults.set(result.doc.href, result.doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
suggestions.innerHTML = "";
|
||||||
|
suggestions.classList.remove('d-none');
|
||||||
|
|
||||||
|
// inform user that no results were found
|
||||||
|
if (flatResults.size === 0 && searchQuery) {
|
||||||
|
const msg = suggestions.dataset.noResults;
|
||||||
|
const noResultsMessage = document.createElement('div')
|
||||||
|
noResultsMessage.innerHTML = `${msg} "<strong>${searchQuery}</strong>"`
|
||||||
|
noResultsMessage.classList.add("suggestion__no-results");
|
||||||
|
suggestions.appendChild(noResultsMessage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// construct a list of suggestions
|
||||||
|
for (const [href, doc] of flatResults) {
|
||||||
|
const entry = document.createElement('div');
|
||||||
|
suggestions.appendChild(entry);
|
||||||
|
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.href = href;
|
||||||
|
entry.appendChild(a);
|
||||||
|
|
||||||
|
const title = document.createElement('span');
|
||||||
|
title.classList.add('text-start');
|
||||||
|
title.textContent = doc.title;
|
||||||
|
title.classList.add("suggestion__title");
|
||||||
|
a.appendChild(title);
|
||||||
|
|
||||||
|
const description = document.createElement('span');
|
||||||
|
description.textContent = doc.description;
|
||||||
|
description.classList.add("suggestion__description");
|
||||||
|
a.appendChild(description);
|
||||||
|
|
||||||
|
suggestions.appendChild(entry);
|
||||||
|
|
||||||
|
if (suggestions.childElementCount == maxResult) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search !== null && suggestions !== null) {
|
||||||
|
document.addEventListener('keydown', inputFocus);
|
||||||
|
document.addEventListener('keydown', suggestionFocus);
|
||||||
|
document.addEventListener('click', hideSuggestions);
|
||||||
|
initIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
{{- end -}}
|
20
assets/js/menu.js
Normal file
20
assets/js/menu.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
const url = new URL(window.location.href)
|
||||||
|
const menu = url.searchParams.get('menu')
|
||||||
|
const child = url.searchParams.get('child')
|
||||||
|
const menuItems = document.querySelectorAll('[data-nav="main"]')
|
||||||
|
|
||||||
|
if (menu !== null) {
|
||||||
|
menuItems.forEach(element => {
|
||||||
|
element.classList.remove('active')
|
||||||
|
})
|
||||||
|
|
||||||
|
const targetMainItems = document.querySelectorAll(`[data-nav-main="${menu}"]:not([data-nav-child])`)
|
||||||
|
targetMainItems.forEach(element => {
|
||||||
|
element.classList.add('active')
|
||||||
|
})
|
||||||
|
|
||||||
|
const targetChildItems = document.querySelectorAll(`[data-nav-main="${menu}"][data-nav-child="${child}"]`)
|
||||||
|
targetChildItems.forEach(element => {
|
||||||
|
element.classList.add('active')
|
||||||
|
})
|
||||||
|
}
|
@@ -2,23 +2,25 @@ const navbar = document.querySelector('.navbar')
|
|||||||
const toggler = document.getElementById('main-nav-toggler')
|
const toggler = document.getElementById('main-nav-toggler')
|
||||||
const modeSelectors = document.querySelectorAll('.switch-mode-collapsed')
|
const modeSelectors = document.querySelectorAll('.switch-mode-collapsed')
|
||||||
|
|
||||||
// set the navbar background color to opaque when scrolling past a breakpoint
|
if (navbar !== null && toggler !== null) {
|
||||||
window.onscroll = () => {
|
// set the navbar background color to opaque when scrolling past a breakpoint
|
||||||
if (window.scrollY > 75) {
|
window.onscroll = () => {
|
||||||
navbar.classList.add('nav-active')
|
if (window.scrollY > 75) {
|
||||||
} else {
|
navbar.classList.add('nav-active')
|
||||||
navbar.classList.remove('nav-active')
|
} else {
|
||||||
}
|
navbar.classList.remove('nav-active')
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// set the navbar background color to opaque when expanded
|
|
||||||
toggler.onclick = () => {
|
// set the navbar background color to opaque when expanded
|
||||||
navbar.classList.toggle('navbar-expanded')
|
toggler.onclick = () => {
|
||||||
}
|
navbar.classList.toggle('navbar-expanded')
|
||||||
|
}
|
||||||
// invoke the navbar toggler for each mode switcher to collapse the main menu afterwards
|
|
||||||
for (let i = 0; i < modeSelectors.length; ++i) {
|
// invoke the navbar toggler for each mode switcher to collapse the main menu afterwards
|
||||||
modeSelectors[i].onclick = () => {
|
for (let i = 0; i < modeSelectors.length; ++i) {
|
||||||
toggler.click()
|
modeSelectors[i].onclick = () => {
|
||||||
|
toggler.click()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,24 @@
|
|||||||
// Bootstrap toast example: https://getbootstrap.com/docs/5.2/components/toasts/
|
// Script to move all embedded toast messages into a container with id 'toast-container'. The container ensures multiple
|
||||||
const toastTrigger = document.getElementById('toastButton')
|
// toast messages are stacked properly. The script targets all elements specified by a 'data-toast-target' and ensures
|
||||||
const toastLiveExample = document.getElementById('toastMessage')
|
// the click event of the origin is linked as well.
|
||||||
if (toastTrigger) {
|
|
||||||
toastTrigger.addEventListener('click', () => {
|
const container = document.getElementById('toast-container')
|
||||||
// eslint-disable-next-line no-undef
|
if (container !== null) {
|
||||||
const toast = new bootstrap.Toast(toastLiveExample)
|
// process all data-toast-target elements
|
||||||
toast.show()
|
document.querySelectorAll('[data-toast-target]').forEach(trigger => {
|
||||||
|
const target = document.getElementById(trigger.getAttribute('data-toast-target'))
|
||||||
|
if (target !== null) {
|
||||||
|
// move the element to the toast containr
|
||||||
|
container.appendChild(target)
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-undef
|
||||||
|
const toast = bootstrap.Toast.getOrCreateInstance(target)
|
||||||
|
if (toast !== null) {
|
||||||
|
// associate the click event of the origin with the toast element
|
||||||
|
trigger.addEventListener('click', () => {
|
||||||
|
toast.show()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -6,3 +6,22 @@
|
|||||||
.open > .dropdown-toggle.btn-primary {
|
.open > .dropdown-toggle.btn-primary {
|
||||||
color: #fff if($enable-important-utilities, !important, null);
|
color: #fff if($enable-important-utilities, !important, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn-social {
|
||||||
|
--bs-btn-bg: transparent;
|
||||||
|
--bs-btn-border-width: none;
|
||||||
|
--bs-btn-color: var(--bs-secondary);
|
||||||
|
--bs-btn-border-color: none;
|
||||||
|
--bs-btn-hover-bg: none;
|
||||||
|
--bs-btn-hover-border-color: none;
|
||||||
|
--bs-btn-active-bg: none;
|
||||||
|
--bs-btn-active-border-color: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-social:hover,
|
||||||
|
.btn-social:focus,
|
||||||
|
.btn-social:active,
|
||||||
|
.btn-social.active,
|
||||||
|
.open > .dropdown-toggle.btn-primary {
|
||||||
|
color: var(--bs-primary) if($enable-important-utilities, !important, null);
|
||||||
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
//
|
//
|
||||||
// Table of contents sidebar
|
// Table of contents sidebar & drop-down panel
|
||||||
//
|
//
|
||||||
// scss-docs-start toc
|
// scss-docs-start toc
|
||||||
.toc {
|
.toc-sidebar {
|
||||||
grid-area: toc;
|
grid-area: toc;
|
||||||
right: 0;
|
right: 0;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
.toc nav {
|
.toc nav {
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
|
margin-bottom: -0.875rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toc nav ul {
|
.toc nav ul {
|
||||||
@@ -33,6 +34,10 @@
|
|||||||
|
|
||||||
.toc nav a {
|
.toc nav a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--bs-primary);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.toc nav a:not(:hover) {
|
.toc nav a:not(:hover) {
|
||||||
@@ -42,3 +47,21 @@
|
|||||||
.toc nav a code {
|
.toc nav a code {
|
||||||
font: inherit;
|
font: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.toc-button {
|
||||||
|
--bs-btn-hover-color: var(--bs-primary);
|
||||||
|
--bs-btn-hover-bg: var(--bs-body-bg);
|
||||||
|
--bs-btn-hover-border-color: var(--bs-primary);
|
||||||
|
--bs-btn-active-color: var(--bs-primary);
|
||||||
|
--bs-btn-active-bg: var(--bs-body-bg);
|
||||||
|
--bs-btn-active-border-color: var(--bs-primary);
|
||||||
|
|
||||||
|
&.active,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: var(--bs-primary);
|
||||||
|
border-color: var(--bs-primary);
|
||||||
|
box-shadow: 0 0 0 4px var(--bs-primary-border-subtle);
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -6,6 +6,7 @@ enableGitInfo = true
|
|||||||
# toml-docs-end main
|
# toml-docs-end main
|
||||||
|
|
||||||
# additional settings
|
# additional settings
|
||||||
|
googleAnalytics = "G-T85PPZ36GN"
|
||||||
baseURL = "https://demo.gethinode.com/"
|
baseURL = "https://demo.gethinode.com/"
|
||||||
canonifyURLs = false
|
canonifyURLs = false
|
||||||
enableEmoji = true
|
enableEmoji = true
|
||||||
@@ -17,7 +18,7 @@ enableInlineShortcodes = true
|
|||||||
ignoreErrors = ["error-remote-getjson"]
|
ignoreErrors = ["error-remote-getjson"]
|
||||||
|
|
||||||
# toml-docs-start timeout
|
# toml-docs-start timeout
|
||||||
timeout = "60s"
|
timeout = "180s"
|
||||||
# toml-docs-end timeout
|
# toml-docs-end timeout
|
||||||
|
|
||||||
# toml-docs-start language
|
# toml-docs-start language
|
||||||
|
@@ -8,10 +8,10 @@
|
|||||||
[en.params.head]
|
[en.params.head]
|
||||||
tagline = "A Hugo Theme"
|
tagline = "A Hugo Theme"
|
||||||
[en.params.feature]
|
[en.params.feature]
|
||||||
link = "/en/about"
|
link = "about"
|
||||||
caption = "About"
|
caption = "About"
|
||||||
[en.params.footer]
|
[en.params.footer]
|
||||||
license = "Licensed under Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank'>CC BY-NC-SA 4.0</a>)."
|
license = "Licensed under Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer'>CC BY-NC-SA 4.0</a>)."
|
||||||
socialTitle = "Follow me"
|
socialTitle = "Follow me"
|
||||||
socialCaption = "I work on everything coding and tweet developer memes"
|
socialCaption = "I work on everything coding and tweet developer memes"
|
||||||
# toml-docs-end lang-param
|
# toml-docs-end lang-param
|
||||||
@@ -23,9 +23,9 @@
|
|||||||
[nl.params.head]
|
[nl.params.head]
|
||||||
tagline = "Een Hugo Thema"
|
tagline = "Een Hugo Thema"
|
||||||
[nl.params.feature]
|
[nl.params.feature]
|
||||||
link = "/nl/over-mij"
|
link = "over-mij"
|
||||||
caption = "Over mij"
|
caption = "Over mij"
|
||||||
[nl.params.footer]
|
[nl.params.footer]
|
||||||
license = "Gelicenseerd onder Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank'>CC BY-NC-SA 4.0</a>)."
|
license = "Gelicenseerd onder Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer'>CC BY-NC-SA 4.0</a>)."
|
||||||
socialTitle = "Volg mij"
|
socialTitle = "Volg mij"
|
||||||
socialCaption = "Ik doe aan programmeren en tweet memes"
|
socialCaption = "Ik doe aan programmeren en tweet memes"
|
@@ -1,33 +1,33 @@
|
|||||||
[[main]]
|
[[main]]
|
||||||
name = "About"
|
name = "About"
|
||||||
url = "/about/"
|
pageRef = "/about/"
|
||||||
weight = 10
|
weight = 10
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Blog"
|
name = "Blog"
|
||||||
url = "/blog/"
|
pageRef = "/blog/"
|
||||||
weight = 20
|
weight = 20
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Projects"
|
name = "Projects"
|
||||||
url = "/projects/"
|
pageRef = "/projects/"
|
||||||
weight = 30
|
weight = 30
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Sample project"
|
name = "Sample project"
|
||||||
url = "/en/projects/sample-project/"
|
pageRef = "/projects/sample-project/"
|
||||||
parent = "Projects"
|
parent = "Projects"
|
||||||
weight = 1
|
weight = 1
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Another project"
|
name = "Another project"
|
||||||
url = "/en/projects/another-project/"
|
pageRef = "/projects/another-project/"
|
||||||
parent = "Projects"
|
parent = "Projects"
|
||||||
weight = 2
|
weight = 2
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Tags"
|
name = "Tags"
|
||||||
url = "/tags/"
|
pageRef = "/tags/"
|
||||||
weight = 40
|
weight = 40
|
||||||
|
|
||||||
[[social]]
|
[[social]]
|
||||||
@@ -51,23 +51,23 @@
|
|||||||
# toml-docs-start sample-navigation
|
# toml-docs-start sample-navigation
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Blog"
|
name = "Blog"
|
||||||
url = "/blog/"
|
pageRef = "/blog/"
|
||||||
weight = 10
|
weight = 10
|
||||||
|
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Projects"
|
name = "Projects"
|
||||||
url = "/projects/"
|
pageRef = "/projects/"
|
||||||
weight = 20
|
weight = 20
|
||||||
|
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Sample project"
|
name = "Sample project"
|
||||||
url = "/en/projects/sample-project/"
|
pageRef = "/projects/sample-project/"
|
||||||
parent = "Projects"
|
parent = "Projects"
|
||||||
weight = 1
|
weight = 1
|
||||||
|
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Another project"
|
name = "Another project"
|
||||||
url = "/en/projects/another-project/"
|
pageRef = "/projects/another-project/"
|
||||||
parent = "Projects"
|
parent = "Projects"
|
||||||
weight = 2
|
weight = 2
|
||||||
# toml-docs-end sample-navigation
|
# toml-docs-end sample-navigation
|
@@ -1,33 +1,33 @@
|
|||||||
[[main]]
|
[[main]]
|
||||||
name = "Over mij"
|
name = "Over mij"
|
||||||
url = "/over-mij/"
|
pageRef = "/over-mij/"
|
||||||
weight = 10
|
weight = 10
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Blog"
|
name = "Blog"
|
||||||
url = "/blog/"
|
pageRef = "/blog/"
|
||||||
weight = 20
|
weight = 20
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Projecten"
|
name = "Projecten"
|
||||||
url = "/projecten/"
|
pageRef = "/projecten/"
|
||||||
weight = 30
|
weight = 30
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Voorbeeldproject"
|
name = "Voorbeeldproject"
|
||||||
url = "/nl/projecten/voorbeeldproject/"
|
pageRef = "/projecten/voorbeeldproject/"
|
||||||
parent = "Projecten"
|
parent = "Projecten"
|
||||||
weight = 1
|
weight = 1
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Ander project"
|
name = "Ander project"
|
||||||
url = "/nl/projecten/ander-project/"
|
pageRef = "/projecten/ander-project/"
|
||||||
parent = "Projecten"
|
parent = "Projecten"
|
||||||
weight = 2
|
weight = 2
|
||||||
|
|
||||||
[[main]]
|
[[main]]
|
||||||
name = "Tags"
|
name = "Tags"
|
||||||
url = "/tags/"
|
pageRef = "/tags/"
|
||||||
weight = 40
|
weight = 40
|
||||||
|
|
||||||
[[social]]
|
[[social]]
|
||||||
@@ -51,23 +51,23 @@
|
|||||||
# toml-docs-start sample-navigation
|
# toml-docs-start sample-navigation
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Blog"
|
name = "Blog"
|
||||||
url = "/blog/"
|
pageRef = "/blog/"
|
||||||
weight = 10
|
weight = 10
|
||||||
|
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Projecten"
|
name = "Projecten"
|
||||||
url = "/projecten/"
|
pageRef = "/projecten/"
|
||||||
weight = 20
|
weight = 20
|
||||||
|
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Voorbeeldproject"
|
name = "Voorbeeldproject"
|
||||||
url = "/nl/projecten/voorbeeldproject/"
|
pageRef = "/projecten/voorbeeldproject/"
|
||||||
parent = "Projecten"
|
parent = "Projecten"
|
||||||
weight = 1
|
weight = 1
|
||||||
|
|
||||||
[[sample]]
|
[[sample]]
|
||||||
name = "Ander project"
|
name = "Ander project"
|
||||||
url = "/nl/projecten/ander-project/"
|
pageRef = "/projecten/ander-project/"
|
||||||
parent = "Projecten"
|
parent = "Projecten"
|
||||||
weight = 2
|
weight = 2
|
||||||
# toml-docs-end sample-navigation
|
# toml-docs-end sample-navigation
|
@@ -10,6 +10,8 @@
|
|||||||
[docs]
|
[docs]
|
||||||
version = "0.8"
|
version = "0.8"
|
||||||
basePath = ""
|
basePath = ""
|
||||||
|
github = "https://github.com/gethinode/hinode"
|
||||||
|
release = "https://github.com/gethinode/hinode/releases/tag/"
|
||||||
# toml-docs-end docs
|
# toml-docs-end docs
|
||||||
|
|
||||||
# toml-docs-start home
|
# toml-docs-start home
|
||||||
@@ -34,12 +36,56 @@
|
|||||||
sidebar = true
|
sidebar = true
|
||||||
# toml-docs-end navigation
|
# toml-docs-end navigation
|
||||||
|
|
||||||
# toml-docs-start list
|
# toml-docs-start messages
|
||||||
[list]
|
[messages]
|
||||||
[blog]
|
placement = "bottom-right"
|
||||||
|
# toml-docs-end messages
|
||||||
|
|
||||||
|
# toml-docs-start sharing
|
||||||
|
[sharing]
|
||||||
|
enabled = true
|
||||||
|
sort = "weight"
|
||||||
|
reverse = false
|
||||||
|
|
||||||
|
[[sharing.providers]]
|
||||||
|
name = "LinkedIn"
|
||||||
|
url = "https://www.linkedin.com/sharing/share-offsite/?url={url}"
|
||||||
|
icon = "fab linkedin"
|
||||||
|
weight = 10
|
||||||
|
|
||||||
|
[[sharing.providers]]
|
||||||
|
name = "Twitter"
|
||||||
|
url = "https://twitter.com/home?status={url}"
|
||||||
|
icon = "fab twitter"
|
||||||
|
weight = 20
|
||||||
|
|
||||||
|
[[sharing.providers]]
|
||||||
|
name = "Facebook"
|
||||||
|
url = "https://www.facebook.com/sharer.php?u={url}"
|
||||||
|
icon = "fab facebook"
|
||||||
|
weight = 30
|
||||||
|
|
||||||
|
[[sharing.providers]]
|
||||||
|
name = "WhatsApp"
|
||||||
|
url = "whatsapp://send?text={title}%20{url}"
|
||||||
|
icon = "fab whatsapp"
|
||||||
|
weight = 40
|
||||||
|
|
||||||
|
[[sharing.providers]]
|
||||||
|
name = "email"
|
||||||
|
url = "{url}"
|
||||||
|
icon = "fas link"
|
||||||
|
weight = 50
|
||||||
|
clipboard = true
|
||||||
|
# toml-docs-end sharing
|
||||||
|
|
||||||
|
# toml-docs-start sections
|
||||||
|
[sections]
|
||||||
|
[sections.blog]
|
||||||
title = "Blog"
|
title = "Blog"
|
||||||
sort = "date"
|
sort = "date"
|
||||||
reverse = false
|
reverse = true
|
||||||
|
nested = true
|
||||||
cols = 3
|
cols = 3
|
||||||
color = ""
|
color = ""
|
||||||
padding = "0"
|
padding = "0"
|
||||||
@@ -49,12 +95,14 @@
|
|||||||
style = "border-0 card-zoom"
|
style = "border-0 card-zoom"
|
||||||
homepage = 3
|
homepage = 3
|
||||||
separator = true
|
separator = true
|
||||||
[projects]
|
[sections.projects]
|
||||||
title = "Projects"
|
title = "Projects"
|
||||||
sort = "title"
|
sort = "title"
|
||||||
reverse = false
|
reverse = false
|
||||||
|
nested = true
|
||||||
cols = 1
|
cols = 1
|
||||||
color = "body-tertiary"
|
background = "body-tertiary"
|
||||||
|
color = "body"
|
||||||
padding = "3"
|
padding = "3"
|
||||||
header = "none"
|
header = "none"
|
||||||
footer = "tags"
|
footer = "tags"
|
||||||
@@ -62,7 +110,7 @@
|
|||||||
style = "border-1 card-emphasize"
|
style = "border-1 card-emphasize"
|
||||||
homepage = 3
|
homepage = 3
|
||||||
separator = false
|
separator = false
|
||||||
# toml-docs-end list
|
# toml-docs-end sections
|
||||||
|
|
||||||
[favicon]
|
[favicon]
|
||||||
logo = "img/favicon.png"
|
logo = "img/favicon.png"
|
||||||
|
@@ -8,14 +8,15 @@ for = '/**'
|
|||||||
Content-Security-Policy = """\
|
Content-Security-Policy = """\
|
||||||
default-src 'self'; \
|
default-src 'self'; \
|
||||||
script-src 'self' \
|
script-src 'self' \
|
||||||
https://utteranc.es/client.js; \
|
https://utteranc.es/client.js https://*.google-analytics.com https://*.googletagmanager.com; \
|
||||||
style-src 'self' https://utteranc.es https://fonts.googleapis.com https://www.youtube.com; \
|
style-src 'self' https://utteranc.es https://fonts.googleapis.com https://www.youtube.com; \
|
||||||
object-src 'none'; \
|
object-src 'none'; \
|
||||||
base-uri 'self'; \
|
base-uri 'self'; \
|
||||||
connect-src 'self'; \
|
connect-src 'self'
|
||||||
|
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
|
||||||
font-src 'self' https://fonts.gstatic.com; \
|
font-src 'self' https://fonts.gstatic.com; \
|
||||||
frame-src 'self' https://utteranc.es https://www.youtube-nocookie.com https://www.youtube.com; \
|
frame-src 'self' https://utteranc.es https://www.youtube-nocookie.com https://www.youtube.com; \
|
||||||
img-src 'self' https://i.vimeocdn.com https://i.ytimg.com; \
|
img-src 'self' https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com; \
|
||||||
manifest-src 'self'; \
|
manifest-src 'self'; \
|
||||||
media-src 'self' \
|
media-src 'self' \
|
||||||
"""
|
"""
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Blog
|
title: Blog
|
||||||
|
nested: true
|
||||||
---
|
---
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Bootstrap elements
|
title: Bootstrap elements
|
||||||
date: 2023-02-17
|
date: 2023-05-20
|
||||||
description: Use shortcodes to add common Bootstrap elements with ease.
|
description: Use shortcodes to add common Bootstrap elements with ease.
|
||||||
tags: ["bootstrap", "shortcode"]
|
tags: ["bootstrap", "shortcode"]
|
||||||
thumbnail: img/boots.jpg
|
thumbnail: img/boots.jpg
|
||||||
@@ -223,6 +223,16 @@ As an example, the following shortcode displays a light navigation header.
|
|||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
|
## Release
|
||||||
|
|
||||||
|
As an example, the following shortcode displays a default release button.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD037 -->
|
||||||
|
{{< example lang="hugo" >}}
|
||||||
|
{{</* release version="v0.14.1" */>}}
|
||||||
|
{{< /example >}}
|
||||||
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
## Spinner
|
## Spinner
|
||||||
|
|
||||||
As an example, the following shortcode displays a centered spinner.
|
As an example, the following shortcode displays a centered spinner.
|
||||||
@@ -241,12 +251,20 @@ As an example, the following shortcode displays a button that, when clicked, tri
|
|||||||
|
|
||||||
<!-- markdownlint-disable MD037 -->
|
<!-- markdownlint-disable MD037 -->
|
||||||
{{< example lang="hugo" >}}
|
{{< example lang="hugo" >}}
|
||||||
{{</* button id="toastButton" */>}}
|
{{</* button toast="toast-example-1" */>}}
|
||||||
Show toast
|
Show toast 1
|
||||||
{{</* /button */>}}
|
{{</* /button */>}}
|
||||||
|
|
||||||
{{</* toast header="Custom title" */>}}
|
{{</* button toast="toast-example-2" */>}}
|
||||||
This is a toast message.
|
Show toast 2
|
||||||
|
{{</* /button */>}}
|
||||||
|
|
||||||
|
{{</* toast id="toast-example-1" header="First title" */>}}
|
||||||
|
This is the first toast message.
|
||||||
|
{{</* /toast */>}}
|
||||||
|
|
||||||
|
{{</* toast id="toast-example-2" header="Second title" */>}}
|
||||||
|
This is the second toast message.
|
||||||
{{</* /toast */>}}
|
{{</* /toast */>}}
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
@@ -257,8 +275,6 @@ As an example, the following shortcode displays a tooltip for a colored hyperlin
|
|||||||
|
|
||||||
<!-- markdownlint-disable MD037 -->
|
<!-- markdownlint-disable MD037 -->
|
||||||
{{< example lang="hugo" >}}
|
{{< example lang="hugo" >}}
|
||||||
{{</* tooltip color="primary" title="Tooltip" href="#!" */>}}
|
{{</* tooltip color="primary" title="Tooltip" href="#!" */>}}Tooltip{{</* /tooltip */>}} demonstration
|
||||||
Tooltip demonstration
|
|
||||||
{{</* /tooltip */>}}
|
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Bootstrap elementen
|
title: Bootstrap elementen
|
||||||
|
slug: bootstrap-elementen
|
||||||
date: 2023-02-17
|
date: 2023-02-17
|
||||||
description: Gebruik shortcodes om eenvoudig Bootstrap elementen toe te voegen.
|
description: Gebruik shortcodes om eenvoudig Bootstrap elementen toe te voegen.
|
||||||
tags: ["bootstrap", "shortcode"]
|
tags: ["bootstrap", "shortcode"]
|
||||||
@@ -223,6 +224,16 @@ De volgende shortcode toont een navigatiemenu.
|
|||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
|
## Release
|
||||||
|
|
||||||
|
De volgende shortcode toont een knop voor een nieuwe release.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD037 -->
|
||||||
|
{{< example lang="hugo" >}}
|
||||||
|
{{</* release version="v0.14.1" */>}}
|
||||||
|
{{< /example >}}
|
||||||
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
## Spinner
|
## Spinner
|
||||||
|
|
||||||
De volgende shortcode toont een ronddraaiende cirkel.
|
De volgende shortcode toont een ronddraaiende cirkel.
|
||||||
@@ -241,12 +252,20 @@ De volgende shortcode toont een knop die een bericht laat verschijnen op het sch
|
|||||||
|
|
||||||
<!-- markdownlint-disable MD037 -->
|
<!-- markdownlint-disable MD037 -->
|
||||||
{{< example lang="hugo" >}}
|
{{< example lang="hugo" >}}
|
||||||
{{</* button id="toastButton" */>}}
|
{{</* button toast="toast-example-1" */>}}
|
||||||
Toon bericht
|
Toon bericht 1
|
||||||
{{</* /button */>}}
|
{{</* /button */>}}
|
||||||
|
|
||||||
{{</* toast header="Titel" */>}}
|
{{</* button toast="toast-example-2" */>}}
|
||||||
Dit is een bericht.
|
Toon bericht 2
|
||||||
|
{{</* /button */>}}
|
||||||
|
|
||||||
|
{{</* toast id="toast-example-1" header="Eerste titel" */>}}
|
||||||
|
Dit is het eerste bericht.
|
||||||
|
{{</* /toast */>}}
|
||||||
|
|
||||||
|
{{</* toast id="toast-example-2" header="Tweede titel" */>}}
|
||||||
|
Dit is het tweede bericht.
|
||||||
{{</* /toast */>}}
|
{{</* /toast */>}}
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
@@ -257,8 +276,6 @@ De volgende shortcode toont een uitleg voor een gekleurde link.
|
|||||||
|
|
||||||
<!-- markdownlint-disable MD037 -->
|
<!-- markdownlint-disable MD037 -->
|
||||||
{{< example lang="hugo" >}}
|
{{< example lang="hugo" >}}
|
||||||
{{</* tooltip color="primary" title="Tooltip" href="#!" */>}}
|
{{</* tooltip color="primary" title="Tooltip" href="#!" */>}}Tooltip{{</* /tooltip */>}} demonstratie
|
||||||
Tooltip demonstration
|
|
||||||
{{</* /tooltip */>}}
|
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Eerste artikel
|
title: Eerste artikel
|
||||||
|
slug: eerste-artikel
|
||||||
date: 2022-10-01
|
date: 2022-10-01
|
||||||
description: Dit is mijn eerste artikel.
|
description: Dit is mijn eerste artikel.
|
||||||
tags: ["blog"]
|
tags: ["blog"]
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Vierde artikel
|
title: Vierde artikel
|
||||||
|
slug: vierde-artikel
|
||||||
date: 2023-01-01
|
date: 2023-01-01
|
||||||
description: Dit is mijn vierde artikel.
|
description: Dit is mijn vierde artikel.
|
||||||
tags: ["blog"]
|
tags: ["blog"]
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Tweede artikel
|
title: Tweede artikel
|
||||||
|
slug: tweede-artikel
|
||||||
date: 2022-11-01
|
date: 2022-11-01
|
||||||
description: Dit is mijn tweede artikel.
|
description: Dit is mijn tweede artikel.
|
||||||
tags: ["blog"]
|
tags: ["blog"]
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
author: Mark Dumay
|
author: Mark Dumay
|
||||||
title: Derde artikel
|
title: Derde artikel
|
||||||
|
slug: derde-artikel
|
||||||
date: 2022-12-01
|
date: 2022-12-01
|
||||||
description: Dit is mijn derde artikel.
|
description: Dit is mijn derde artikel.
|
||||||
tags: ["blog"]
|
tags: ["blog"]
|
||||||
|
24
i18n/en.yaml
24
i18n/en.yaml
@@ -27,8 +27,16 @@
|
|||||||
translation: "Next Post"
|
translation: "Next Post"
|
||||||
- id: recentProjects
|
- id: recentProjects
|
||||||
translation: "Projects"
|
translation: "Projects"
|
||||||
|
- id: moreFeatures
|
||||||
|
translation: "More Features"
|
||||||
|
- id: moreGuides
|
||||||
|
translation: "More Guides"
|
||||||
|
- id: moreOpensource
|
||||||
|
translation: "More Features"
|
||||||
- id: moreProjects
|
- id: moreProjects
|
||||||
translation: "More Projects"
|
translation: "More Projects"
|
||||||
|
- id: moreUsers
|
||||||
|
translation: "More Users"
|
||||||
- id: read
|
- id: read
|
||||||
translation: "read"
|
translation: "read"
|
||||||
- id: minutesShort
|
- id: minutesShort
|
||||||
@@ -56,7 +64,7 @@
|
|||||||
- id: toggleSidebar
|
- id: toggleSidebar
|
||||||
translation: "Toggle sidebar navigation"
|
translation: "Toggle sidebar navigation"
|
||||||
- id: colorMode
|
- id: colorMode
|
||||||
translation: "Color mode"
|
translation: "Toggle theme"
|
||||||
- id: colorLight
|
- id: colorLight
|
||||||
translation: "Light"
|
translation: "Light"
|
||||||
- id: colorDark
|
- id: colorDark
|
||||||
@@ -65,6 +73,20 @@
|
|||||||
translation: "Auto"
|
translation: "Auto"
|
||||||
- id: toggleMainNav
|
- id: toggleMainNav
|
||||||
translation: "Toggle main navigation"
|
translation: "Toggle main navigation"
|
||||||
|
- id: demo
|
||||||
|
translation: "Demo"
|
||||||
|
- id: addedFeature
|
||||||
|
translation: "Added in"
|
||||||
|
- id: deprecatedFeature
|
||||||
|
translation: "Deprecated in"
|
||||||
|
- id: shareLink
|
||||||
|
translation: "Share via"
|
||||||
|
- id: copiedToClipboard
|
||||||
|
translation: "copied to clipboard"
|
||||||
|
- id: link
|
||||||
|
translation: "Link"
|
||||||
|
- id: code
|
||||||
|
translation: "Code"
|
||||||
|
|
||||||
# 404 page
|
# 404 page
|
||||||
- id: pageNotFound
|
- id: pageNotFound
|
||||||
|
14
i18n/nl.yaml
14
i18n/nl.yaml
@@ -56,7 +56,7 @@
|
|||||||
- id: toggleSidebar
|
- id: toggleSidebar
|
||||||
translation: "Toon of verberg navigatie"
|
translation: "Toon of verberg navigatie"
|
||||||
- id: colorMode
|
- id: colorMode
|
||||||
translation: "Modus"
|
translation: "Pas modus aan"
|
||||||
- id: colorLight
|
- id: colorLight
|
||||||
translation: "Licht"
|
translation: "Licht"
|
||||||
- id: colorDark
|
- id: colorDark
|
||||||
@@ -65,6 +65,18 @@
|
|||||||
translation: "Automatisch"
|
translation: "Automatisch"
|
||||||
- id: toggleMainNav
|
- id: toggleMainNav
|
||||||
translation: "Toon of verberg hoofdnavigatie"
|
translation: "Toon of verberg hoofdnavigatie"
|
||||||
|
- id: addedFeature
|
||||||
|
translation: "Toegevoegd in"
|
||||||
|
- id: deprecatedFeature
|
||||||
|
translation: "Verouderd in"
|
||||||
|
- id: shareLink
|
||||||
|
translation: "Delen via"
|
||||||
|
- id: copiedToClipboard
|
||||||
|
translation: "gekopieerd naar clipboard"
|
||||||
|
- id: link
|
||||||
|
translation: "Link"
|
||||||
|
- id: code
|
||||||
|
translation: "Code"
|
||||||
|
|
||||||
# 404 page
|
# 404 page
|
||||||
- id: pageNotFound
|
- id: pageNotFound
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
<p class="display-1 mt-3 fw-bold">404</p>
|
<p class="display-1 mt-3 fw-bold">404</p>
|
||||||
<p class="fs-3">{{ T "pageNotFoundTitle" }}</p>
|
<p class="fs-3">{{ T "pageNotFoundTitle" }}</p>
|
||||||
</span>
|
</span>
|
||||||
<p>{{ T "pageNotFound" }} <a href="{{ "/" | relURL }}">{{ T "pageNotFoundHome" }}</a>.</p>
|
<p>{{ T "pageNotFound" }} <a href="{{ "/" | relLangURL }}">{{ T "pageNotFoundHome" }}</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
{{- if site.Params.main.enableDarkMode -}}
|
{{- if site.Params.main.enableDarkMode -}}
|
||||||
{{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "page" .) -}}
|
{{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "header" true "page" .) -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
<div class="d-flex flex-column min-vh-100{{ if and .IsHome .Site.Params.home.style }} {{ .Site.Params.home.style }}{{ end }}">
|
<div class="d-flex flex-column min-vh-100{{ if and .IsHome .Site.Params.home.style }} {{ .Site.Params.home.style }}{{ end }}">
|
||||||
<div class="{{ if .Site.Params.navigation.fixed }}mb-4{{ end }}">
|
<div class="{{ if .Site.Params.navigation.fixed }}mb-4{{ end }}">
|
||||||
@@ -33,19 +33,23 @@
|
|||||||
<div class="d-flex flex-column flex-fill">
|
<div class="d-flex flex-column flex-fill">
|
||||||
{{ block "main" . }}{{ end -}}
|
{{ block "main" . }}{{ end -}}
|
||||||
</div>
|
</div>
|
||||||
<div class="">
|
{{ if not .Site.Params.main.footerBelowFold }}
|
||||||
{{- partial "footer/social.html" . -}}
|
<div class="">
|
||||||
{{- partial "footer/footer.html" . -}}
|
{{- partial "footer/social.html" . -}}
|
||||||
</div>
|
{{- partial "footer/footer.html" . -}}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ else -}}
|
{{ else -}}
|
||||||
<div class="d-flex flex-column flex-fill {{ if .Site.Params.navigation.fixed }}mt-5{{ end }}">
|
<div class="d-flex flex-column flex-fill {{ if .Site.Params.navigation.fixed }}mt-5{{ end }}">
|
||||||
{{ block "main" . }}{{ end -}}
|
{{ block "main" . }}{{ end -}}
|
||||||
</div>
|
</div>
|
||||||
<div class="">
|
{{ if not .Site.Params.main.footerBelowFold }}
|
||||||
{{- partial "footer/social.html" . -}}
|
<div class="">
|
||||||
{{- partial "footer/footer.html" . -}}
|
{{- partial "footer/social.html" . -}}
|
||||||
</div>
|
{{- partial "footer/footer.html" . -}}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -53,10 +57,18 @@
|
|||||||
<div class="">
|
<div class="">
|
||||||
{{ block "main" . }}{{ end -}}
|
{{ block "main" . }}{{ end -}}
|
||||||
</div>
|
</div>
|
||||||
{{- partial "footer/social.html" . -}}
|
<div class="">
|
||||||
{{- partial "footer/footer.html" . -}}
|
{{- partial "footer/social.html" . -}}
|
||||||
{{ end -}}
|
{{- partial "footer/footer.html" . -}}
|
||||||
|
</div>
|
||||||
|
{{ else if .Site.Params.main.footerBelowFold }}
|
||||||
|
<div class="">
|
||||||
|
{{- partial "footer/social.html" . -}}
|
||||||
|
{{- partial "footer/footer.html" . -}}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{- partialCached "footer/scripts.html" (dict "page" .) }}
|
{{- partial "footer/toast-container.html" . -}}
|
||||||
|
{{- partialCached "footer/scripts.html" (dict "header" false "page" .) }}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -1,9 +1,12 @@
|
|||||||
{{- define "main" -}}
|
{{- define "main" -}}
|
||||||
{{- partial "assets/section-list.html" (dict
|
{{- partial "assets/section-list.html" (dict
|
||||||
"page" .
|
"page" .
|
||||||
"section" .Section
|
"section" .Type
|
||||||
"home" false
|
"home" false
|
||||||
|
"nested" .Params.Nested
|
||||||
"title" .Title
|
"title" .Title
|
||||||
|
"description" .Description
|
||||||
|
"content" .Content
|
||||||
"paginate" true)
|
"paginate" true)
|
||||||
-}}
|
-}}
|
||||||
{{- end -}}
|
{{- end -}}
|
@@ -1,11 +1,13 @@
|
|||||||
{{- define "partials/header.html" -}}
|
{{- define "partials/header.html" -}}
|
||||||
{{ if site.Params.navigation.breadcrumb }}{{ partial "breadcrumb.html" . }}{{ end -}}
|
{{ if site.Params.navigation.breadcrumb }}{{ partial "assets/breadcrumb.html" . }}{{ end -}}
|
||||||
{{ if in (slice "docs" "minimal") .Layout }}
|
{{ if in (slice "docs" "minimal") .Layout }}
|
||||||
{{ with .Title }}<p class="display-4 mt-3">{{ . }}</p>{{ end }}
|
{{ with .Title }}<p class="display-4 mt-5">{{ . }}</p>{{ end }}
|
||||||
|
{{ partial "assets/sharing.html" . }}
|
||||||
|
<p class="lead mb-5">{{ .Description }}</p>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
{{ $lastmodstr := (partial "utilities/date.html" (dict "date" .Lastmod "format" "long")) -}}
|
{{ $lastmodstr := (partial "utilities/date.html" (dict "date" .Lastmod "format" "long")) -}}
|
||||||
{{ $datestr := (partial "utilities/date.html" (dict "date" .Date "format" "long")) -}}
|
{{ $datestr := (partial "utilities/date.html" (dict "date" .Date "format" "long")) -}}
|
||||||
{{ with .Title }}<p class="display-4 mt-3">{{ . }}</p>{{ end }}
|
{{ with .Title }}<p class="display-4 mt-5">{{ . }}</p>{{ end }}
|
||||||
<small class="text-body-secondary text-uppercase">
|
<small class="text-body-secondary text-uppercase">
|
||||||
{{ $datestr | i18n "postedOnDate" -}}
|
{{ $datestr | i18n "postedOnDate" -}}
|
||||||
{{ if ne $datestr $lastmodstr -}} ({{ $lastmodstr | i18n "lastModified" }}){{ end }} •
|
{{ if ne $datestr $lastmodstr -}} ({{ $lastmodstr | i18n "lastModified" }}){{ end }} •
|
||||||
@@ -13,45 +15,49 @@
|
|||||||
{{ .WordCount | lang.FormatNumber 0 }} {{ i18n "words" }}
|
{{ .WordCount | lang.FormatNumber 0 }} {{ i18n "words" }}
|
||||||
</small>
|
</small>
|
||||||
|
|
||||||
<div class="mt-3">
|
{{- if gt (len (.GetTerms "tags")) 0 -}}
|
||||||
<div class="d-none-dark">
|
<div class="mt-3">
|
||||||
{{ range (.GetTerms "tags") -}}
|
<div class="d-none-dark">
|
||||||
<a class="btn btn-light btn-sm" href="{{ (path.Join .Page.RelPermalink) | relURL }}" role="button">{{ .LinkTitle }}</a>
|
{{ range (.GetTerms "tags") -}}
|
||||||
|
<a class="btn btn-light btn-sm" href="{{ (path.Join .Page.RelPermalink) | relLangURL }}" role="button">{{ .LinkTitle }}</a>
|
||||||
{{ end -}}
|
|
||||||
|
{{ end -}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-none-light">
|
||||||
|
{{ range (.GetTerms "tags") -}}
|
||||||
|
<a class="btn btn-outline-secondary btn-sm" href="{{ (path.Join .Page.RelPermalink) | relLangURL }}" role="button">{{ .LinkTitle }}</a>
|
||||||
|
|
||||||
|
{{ end -}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{- end -}}
|
||||||
<div class="d-none-light">
|
{{ partial "assets/sharing.html" . }}
|
||||||
{{ range (.GetTerms "tags") -}}
|
<p class="lead mb-5 mt-3">{{ .Description }}</p>
|
||||||
<a class="btn btn-outline-secondary btn-sm" href="{{ (path.Join .Page.RelPermalink) | relURL }}" role="button">{{ .LinkTitle }}</a>
|
|
||||||
|
|
||||||
{{ end -}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{ define "partials/body.html" -}}
|
{{ define "partials/body.html" -}}
|
||||||
{{ if eq .Layout "docs"}}
|
{{- if and .Site.Params.navigation.toc .Params.includeToc | default true -}}
|
||||||
<p class="lead mb-5">{{ .Description }}</p>
|
<div class="d-md-none pb-5">{{ partial "assets/toc-dropdown.html" . }}</div>
|
||||||
{{ .Content }}
|
{{- end -}}
|
||||||
{{ else }}
|
|
||||||
<p class="lead mb-5 mt-3">{{ .Description }}</p>
|
{{ if not (in (slice "docs" "minimal") .Layout) }}
|
||||||
{{ if .Params.thumbnail -}}
|
{{ if .Params.thumbnail -}}
|
||||||
{{- $credits := "" -}}
|
{{- $credits := "" -}}
|
||||||
{{- if .Params.photoCredits }}{{ if .Params.PhotoSource }}{{ $credits = printf "%s %s %s %s" (T "photoBy") .Params.photoCredits (T "photoOn") .Params.PhotoSource }}{{ end }}{{ end -}}
|
{{- if .Params.photoCredits }}{{ if .Params.PhotoSource }}{{ $credits = printf "%s %s %s %s" (T "photoBy") .Params.photoCredits (T "photoOn") .Params.PhotoSource }}{{ end }}{{ end -}}
|
||||||
{{- partial "image.html" (dict "url" .Params.thumbnail "ratio" "21x9" "outerClass" "img-wrap" "innerClass" "rounded" "title" .Params.title "caption" $credits) -}}
|
{{- partial "assets/image.html" (dict "url" .Params.thumbnail "ratio" "21x9" "outerClass" "img-wrap" "innerClass" "rounded" "title" .Params.title "caption" $credits) -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ .Content }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ .Content }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{ define "partials/footer.html" -}}
|
{{ define "partials/footer.html" -}}
|
||||||
{{ if eq .Layout "docs"}}
|
{{ if eq .Layout "docs" }}
|
||||||
<div class="mt-5 small">
|
<div class="mt-5 small">
|
||||||
{{ partial "utilities/git.html" . }}
|
{{ partial "utilities/git.html" . }}
|
||||||
</div>
|
</div>
|
||||||
{{ else }}
|
{{ else if ne .Layout "minimal" }}
|
||||||
<div class="row row-cols-2 mt-5 mb-3">
|
<div class="row row-cols-2 mt-5 mb-3">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
{{ with .NextInSection -}}
|
{{ with .NextInSection -}}
|
||||||
@@ -82,7 +88,7 @@
|
|||||||
{{- $version := .Scratch.Get "version" -}}
|
{{- $version := .Scratch.Get "version" -}}
|
||||||
{{- $sidebar := .Site.Params.navigation.sidebar | default true -}}
|
{{- $sidebar := .Site.Params.navigation.sidebar | default true -}}
|
||||||
{{ if and $menu $sidebar -}}
|
{{ if and $menu $sidebar -}}
|
||||||
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvass-sidebar" aria-labelledby="offcanvas-label">
|
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvass-sidebar" aria-inledby="offcanvas-label">
|
||||||
<div class="offcanvas-header">
|
<div class="offcanvas-header">
|
||||||
<h5 class="offcanvas-title" id="offcanvas-label">{{ strings.FirstUpper .Section }}</h5>
|
<h5 class="offcanvas-title" id="offcanvas-label">{{ strings.FirstUpper .Section }}</h5>
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
||||||
@@ -92,7 +98,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container-xxl">
|
<div class="container-xxl px-3 px-xxl-0">
|
||||||
<div class="row row-cols-md-2 row-cols-lg-3">
|
<div class="row row-cols-md-2 row-cols-lg-3">
|
||||||
<div class="col col-md-3 col-lg-2 d-none pt-5 d-md-block sidebar-overflow sticky-top">
|
<div class="col col-md-3 col-lg-2 d-none pt-5 d-md-block sidebar-overflow sticky-top">
|
||||||
{{ partial "assets/sidebar" (dict "page" . "menu" $menu "version" $version) }}
|
{{ partial "assets/sidebar" (dict "page" . "menu" $menu "version" $version) }}
|
||||||
@@ -110,7 +116,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<div class="container-xxl">
|
<div class="container-xxl px-3 px-xxl-0">
|
||||||
<div class="row row-cols-1 row-cols-sm-3">
|
<div class="row row-cols-1 row-cols-sm-3">
|
||||||
<div class="col col-md-2 d-none d-md-block"></div>
|
<div class="col col-md-2 d-none d-md-block"></div>
|
||||||
<div class="col col-sm-12 col-md-8">
|
<div class="col col-sm-12 col-md-8">
|
||||||
|
11
layouts/alias.html
Normal file
11
layouts/alias.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html{{ with site.LanguageCode | default site.Language.Lang }} lang="{{ . }}"{{ end }}>
|
||||||
|
<head>
|
||||||
|
<title>{{ .Permalink }}</title>
|
||||||
|
<link rel="canonical" href="{{ .Permalink }}">
|
||||||
|
<meta name="robots" content="noindex">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<noscript><meta http-equiv="refresh" content="0; url={{ .Permalink }}"></noscript>
|
||||||
|
<script src="/js/alias.js"></script>
|
||||||
|
</head>
|
||||||
|
</html>
|
@@ -1,10 +0,0 @@
|
|||||||
<!-- Hugo considers all first-level directories to be a root section. As such, as "/en/docs/" is considered to be a
|
|
||||||
branch bundle, despite it not having an "_index.md" page. Being a branch bundle, Hugo uses a list template to
|
|
||||||
render the "/en/docs/" page. This overwrites the alias defined in "/en/docs/<ver>/getting-started/introduction/".
|
|
||||||
|
|
||||||
This empty list template is deliberately added to the "/layouts/docs/" directory to prevent Hugo from generating
|
|
||||||
a list page for "/en/docs/" (all other nested sections). This enables the alias defined in
|
|
||||||
"/en/docs/<version>/getting-started/introduction/".
|
|
||||||
|
|
||||||
See https://gohugo.io/content-management/sections/ for more details.
|
|
||||||
-->
|
|
@@ -6,11 +6,13 @@
|
|||||||
{{- $page := . -}}
|
{{- $page := . -}}
|
||||||
|
|
||||||
{{- range $index, $section := site.Params.home.sections -}}
|
{{- range $index, $section := site.Params.home.sections -}}
|
||||||
{{- $pages := where site.RegularPages "Type" "in" $section -}}
|
{{- $sectionPage := site.GetPage "section" $section -}}
|
||||||
{{- $sectionURL := "" -}}
|
{{- $sectionURL := $sectionPage.RelPermalink -}}
|
||||||
{{- range $page := first 1 $pages -}}
|
{{- $title := $sectionPage.Title -}}
|
||||||
{{- $sectionURL = $page.Parent.RelPermalink -}}
|
{{- $thumbnail := $sectionPage.Params.Thumbnail -}}
|
||||||
{{- end -}}
|
{{- $icon := $sectionPage.Params.Icon -}}
|
||||||
|
{{- $description := $sectionPage.Description -}}
|
||||||
|
{{- $content := $sectionPage.Content -}}
|
||||||
|
|
||||||
{{- $moreTitle := (T (printf "more%s" (strings.FirstUpper $section))) -}}
|
{{- $moreTitle := (T (printf "more%s" (strings.FirstUpper $section))) -}}
|
||||||
|
|
||||||
@@ -18,12 +20,12 @@
|
|||||||
"page" $page
|
"page" $page
|
||||||
"section" $section
|
"section" $section
|
||||||
"home" true
|
"home" true
|
||||||
|
"nested" true
|
||||||
|
"thumbnail" $thumbnail
|
||||||
|
"icon" $icon
|
||||||
|
"content" $content
|
||||||
"moreTitle" $moreTitle
|
"moreTitle" $moreTitle
|
||||||
"sectionURL" $sectionURL)
|
"sectionURL" $sectionURL)
|
||||||
-}}
|
-}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- range $index, $section := site.Params.home.snippets -}}
|
|
||||||
{{- partial "assets/snippet-list.html" (dict "page" $page "section" $section) -}}
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
{{- end -}}
|
15
layouts/partials/assets/breadcrumb.html
Normal file
15
layouts/partials/assets/breadcrumb.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<nav aria-label="breadcrumb">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
{{- range $index, $item := .Page.Ancestors.Reverse -}}
|
||||||
|
{{- $title := .Title -}}
|
||||||
|
{{- if .IsHome }}{{ $title = T "home" }}{{ end -}}
|
||||||
|
{{- $address := or .Permalink (.Params.Redirect | absLangURL) -}}
|
||||||
|
{{ if $address }}
|
||||||
|
<li class="breadcrumb-item"><a href="{{ $address }}">{{ $title }}</a></li>
|
||||||
|
{{ else }}
|
||||||
|
<li class="breadcrumb-item">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
{{- end -}}
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">{{ .Page.Title }}</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
140
layouts/partials/assets/button.html
Normal file
140
layouts/partials/assets/button.html
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
<!--
|
||||||
|
Displays a button. The shortcode supports the following arguments:
|
||||||
|
"title" Title of the button, required unless icon is set.
|
||||||
|
"href" Optional address for the button or hyperlink.
|
||||||
|
"id" Optional id of the button, to be used in the DOM.
|
||||||
|
"state" Optional state of the button, either "enabled" (default), "disabled", "active", or "inactive".
|
||||||
|
"size" Optional size of the button, either "sm", "md" (default), or "lg".
|
||||||
|
"color" Optional theme color of the element, either "primary" (default), "secondary", "success",
|
||||||
|
"danger", "warning", "info", "light", "dark", "white", or "black".
|
||||||
|
"outline" Optional flag indicating the button should be outlined, either "false" (default) or "true".
|
||||||
|
"badge" Optional positioned badge to display on top of the button.
|
||||||
|
"aria-label" Optional assistive label for the badge.
|
||||||
|
"tooltip" Optional text to display in a tooltip. Cannot be used together with collapse. Ignored for active/
|
||||||
|
inactive buttons.
|
||||||
|
"collapse" Optional panel to collapse. Cannot be used together with tooltip. Ignored for active/inactive buttons.
|
||||||
|
"type" Optional type of the element, either "link" or "button" (default).
|
||||||
|
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
|
||||||
|
"class" Optional class attribute of the button element, e.g. “toc-button”.
|
||||||
|
"icon" Font Awesome icon class attribute, required unless title is set. An example value is "fas sort".
|
||||||
|
"order" Optional order of the icon, either "first" or "last" (default).
|
||||||
|
"justify" Optional justification of the button title and icon, either "start", "end", "center" (default),
|
||||||
|
"between", "around", or "evenly".
|
||||||
|
"toast" Optional id of the toast to display when the button is clicked.
|
||||||
|
"clipboard" Optional text to be copied to the clipboard when the button is clicked.
|
||||||
|
-->
|
||||||
|
|
||||||
|
{{- $title := trim .title " \r\n" -}}
|
||||||
|
{{- $icon := .icon }}
|
||||||
|
{{- if not (or $title $icon) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Missing element title or icon" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $id := .id }}
|
||||||
|
|
||||||
|
{{- $state := "enabled" -}}
|
||||||
|
{{- with .state }}{{ $state = . }}{{ end -}}
|
||||||
|
{{- $supportedStates := slice "enabled" "disabled" "active" "inactive" -}}
|
||||||
|
{{- if not (in $supportedStates $state) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'state': %s" $state -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $size := "md" -}}
|
||||||
|
{{- with .size }}{{ $size = . }}{{ end -}}
|
||||||
|
{{- $supportedSizes := slice "sm" "md" "lg" -}}
|
||||||
|
{{- if not (in $supportedSizes $size) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'size': %s" $size -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $color := "primary" -}}
|
||||||
|
{{- with .color }}{{ $color = . }}{{ end -}}
|
||||||
|
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" -}}
|
||||||
|
{{- if not (in $supportedColors $color) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'color': %s" $color -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $outline := false -}}
|
||||||
|
{{- with .outline }}{{ $outline = . }}{{ end -}}
|
||||||
|
|
||||||
|
{{- $badge := "" -}}
|
||||||
|
{{- with .badge }}{{ $badge = . }}{{ end -}}
|
||||||
|
|
||||||
|
{{- $label := "" -}}
|
||||||
|
{{- with .label }}{{ $label = . }}{{ end -}}
|
||||||
|
|
||||||
|
{{- $tooltip := "" -}}
|
||||||
|
{{- if not (strings.HasSuffix $state "active") -}}
|
||||||
|
{{- with .tooltip }}{{ $tooltip = . }}{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $href := .href -}}
|
||||||
|
|
||||||
|
{{- $collapse := "" -}}
|
||||||
|
{{- if not (strings.HasSuffix $state "active") -}}
|
||||||
|
{{- with .collapse }}{{ $collapse = . }}{{ $href = printf "#%s" . }}{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $tooltip -}}
|
||||||
|
{{- if $collapse -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Cannot use tooltip and collapse at the same time" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $type := "button" -}}
|
||||||
|
{{- with .type }}{{ $type = . }}{{ end -}}
|
||||||
|
{{- $supportedTypes := slice "button" "link" -}}
|
||||||
|
{{- if not (in $supportedTypes $type) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'type': %s" $type -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $placement := "top" -}}
|
||||||
|
{{- with .placement }}{{ $placement = . }}{{ end -}}
|
||||||
|
{{- $supportedPlacements := slice "top" "bottom" "left" "right" -}}
|
||||||
|
{{- if not (in $supportedPlacements $placement) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'placement': %s" $placement -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $class := .class }}
|
||||||
|
|
||||||
|
{{- $order := "last" -}}
|
||||||
|
{{- with .order }}{{ $order = . }}{{ end -}}
|
||||||
|
{{- $supportedOrders := slice "first" "last" -}}
|
||||||
|
{{- if not (in $supportedOrders $order) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'order': %s" $order -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $justify := "center" -}}
|
||||||
|
{{- with .justify }}{{ $justify = . }}{{ end -}}
|
||||||
|
{{- $supportedJustify := slice "start" "end" "center" "between" "around" "evenly" -}}
|
||||||
|
{{- if not (in $supportedJustify $justify) -}}
|
||||||
|
{{- errorf "partial [assets/button.html] - Invalid value for param 'justify': %s" $justify -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $toast := .toast -}}
|
||||||
|
{{- $clipboard := .clipboard -}}
|
||||||
|
|
||||||
|
<a aria-label="{{ $title }}" {{ if ne $state "disabled" }}{{ with $href }}href="{{ . }}"{{ end }}{{ end }}
|
||||||
|
{{ with $id }}id="{{ . }}"{{ end }}
|
||||||
|
{{ with $toast }}data-toast-target="{{ $toast }}"{{ end }}
|
||||||
|
{{ with $clipboard }}data-clipboard="{{ $clipboard }}"{{ end }}
|
||||||
|
{{ if eq $type "button" }}class="btn btn-{{ if $outline }}outline-{{ end }}{{ $color }} {{ if ne $size "md"}}btn-{{ $size }}{{ end }} position-relative {{ if in (slice "disabled" "active") $state }}{{ $state }}{{ end }} {{ $class }}"
|
||||||
|
role="button" {{ if eq $state "disabled" }}aria-disabled="true"{{ end }}
|
||||||
|
{{ else }} class="link-{{ $color }} position-relative {{ $class }}"{{ end }}
|
||||||
|
{{ with $tooltip }}data-bs-toggle="tooltip" data-bs-title="{{ . }}" data-bs-placement="{{ $placement }}"{{ end }}
|
||||||
|
{{ with $collapse }}data-bs-toggle="collapse" aria-expanded="false" aria-controls="{{ . }}"{{ end }}
|
||||||
|
{{ if eq $state "active" }}data-bs-toggle="button" aria-pressed="true"{{ end }}
|
||||||
|
{{ if eq $state "inactive" }}data-bs-toggle="button" aria-pressed="false"{{ end }}
|
||||||
|
>
|
||||||
|
|
||||||
|
<div class="d-flex justify-content-{{ $justify }}">
|
||||||
|
<div>{{ $title }}</div>
|
||||||
|
{{- with $icon }}<div class="align-self-center{{ if eq $order "first" }} order-first pe-1{{ else }} ps-1{{ end }}">{{ partial "assets/icon.html" (dict "icon" $icon) }}</div>{{ end }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{- with $badge }}
|
||||||
|
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">
|
||||||
|
{{ . }}
|
||||||
|
{{ with $label }}<span class="visually-hidden">{{ . }}</span>{{ end }}
|
||||||
|
</span>
|
||||||
|
{{- end -}}
|
||||||
|
</a>
|
@@ -31,24 +31,26 @@
|
|||||||
|
|
||||||
{{- $page := .page -}}
|
{{- $page := .page -}}
|
||||||
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
||||||
{{- errorf "Invalid value for param 'page'" -}}
|
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'page'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $supportedTypes := slice "page.Pages" "resource.Resources" -}}
|
||||||
{{ $list := .list }}
|
{{ $list := .list }}
|
||||||
{{- if ne (printf "%T" $list) "page.Pages" -}}
|
{{- if not (in $supportedTypes (printf "%T" $list)) -}}
|
||||||
{{- errorf "Invalid value for param 'items'" -}}
|
{{ warnf "Type: %T" $list }}
|
||||||
|
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'list'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $count := len $list -}}
|
{{- $count := len $list -}}
|
||||||
{{- $max := .max -}}
|
{{- $max := .max -}}
|
||||||
{{- if ne (printf "%T" $max) "int" -}}
|
{{- if ne (printf "%T" $max) "int" -}}
|
||||||
{{- errorf "Invalid value for param 'max'" -}}
|
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'max'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $max = math.Min $max $count -}}
|
{{- $max = math.Min $max $count -}}
|
||||||
|
|
||||||
{{- $cols := .cols -}}
|
{{- $cols := .cols -}}
|
||||||
{{- if or (lt $cols 1) (gt $cols 5) -}}
|
{{- if or (lt $cols 1) (gt $cols 5) -}}
|
||||||
{{- errorf "Invalid value for param 'cols': %d" $cols -}}
|
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'cols': %d" $cols -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $colGrid := "row-cols-1" -}}
|
{{- $colGrid := "row-cols-1" -}}
|
||||||
{{- if eq $cols 2 }}{{ $colGrid = "row-cols-1 row-cols-sm-1 row-cols-md-2" -}}
|
{{- if eq $cols 2 }}{{ $colGrid = "row-cols-1 row-cols-sm-1 row-cols-md-2" -}}
|
||||||
@@ -56,12 +58,10 @@
|
|||||||
{{- else if eq $cols 4 }}{{ $colGrid = "row-cols-1 row-cols-sm-2 row-cols-md-4" -}}
|
{{- else if eq $cols 4 }}{{ $colGrid = "row-cols-1 row-cols-sm-2 row-cols-md-4" -}}
|
||||||
{{- else if eq $cols 5 }}{{ $colGrid = "row-cols-1 row-cols-sm-3 row-cols-md-5" }}{{ end -}}
|
{{- else if eq $cols 5 }}{{ $colGrid = "row-cols-1 row-cols-sm-3 row-cols-md-5" }}{{ end -}}
|
||||||
|
|
||||||
{{- $title := .title -}}
|
|
||||||
|
|
||||||
{{- $paginate := false -}}
|
{{- $paginate := false -}}
|
||||||
{{- with .paginate -}}
|
{{- with .paginate -}}
|
||||||
{{- if ne (printf "%T" .) "bool" -}}
|
{{- if ne (printf "%T" .) "bool" -}}
|
||||||
{{- errorf "Invalid value for param 'paginate'" -}}
|
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'paginate'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $paginate = . -}}
|
{{- $paginate = . -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
{{- $separator := false -}}
|
{{- $separator := false -}}
|
||||||
{{- with .separator -}}
|
{{- with .separator -}}
|
||||||
{{- if ne (printf "%T" .) "bool" -}}
|
{{- if ne (printf "%T" .) "bool" -}}
|
||||||
{{- errorf "Invalid value for param 'separator'" -}}
|
{{- errorf "partial [assets/card-group.html] - Invalid value for param 'separator'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $separator = . -}}
|
{{- $separator = . -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
@@ -87,56 +87,52 @@
|
|||||||
{{- $footer := .footer -}}
|
{{- $footer := .footer -}}
|
||||||
{{- $orientation := .orientation -}}
|
{{- $orientation := .orientation -}}
|
||||||
|
|
||||||
<div class="container-fluid p-4">
|
<div class="container-fluid p-4 px-xxl-0">
|
||||||
{{ with $title }}<p class="display-4 mt-3{{ if and page.IsHome site.Params.home.centerHeadline }} text-center{{ end }}">{{ . }}</p>{{ end }}
|
{{ $paginator := "" }}
|
||||||
{{ if $paginate }}
|
{{ if $paginate }}
|
||||||
<div class="row {{ $colGrid }}">
|
{{ $paginator = $page.Paginate $list }}
|
||||||
{{ $paginator := $page.Paginate $list }}
|
{{ $list = first $paginator.PageSize (after (mul (sub $paginator.PageNumber 1) $paginator.PageSize) $list) }}
|
||||||
{{ range $index, $element := first $paginator.PageSize (after (mul (sub $paginator.PageNumber 1) $paginator.PageSize) $list) }}
|
{{ end }}
|
||||||
<div class="col pt-3 pb-3">
|
|
||||||
{{- partial "assets/card.html" (dict
|
<div class="row {{ $colGrid }}">
|
||||||
"path" $element.File.Path
|
{{ range $index, $element := $list }}
|
||||||
"class" (printf "h-100 %s" $class)
|
{{- $params := (dict
|
||||||
"color" $color
|
"class" (printf "h-100 %s" $class)
|
||||||
"padding" $padding
|
"color" $color
|
||||||
"header" $header
|
"padding" $padding
|
||||||
"footer" $footer
|
"header" $header
|
||||||
"orientation" $orientation
|
"footer" $footer
|
||||||
)
|
"orientation" $orientation
|
||||||
-}}
|
) -}}
|
||||||
|
|
||||||
|
{{- if $element.Permalink -}}
|
||||||
|
{{- $params = merge $params (dict "path" $element.File.Path) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $params = merge $params (dict
|
||||||
|
"title" $element.Title
|
||||||
|
"href" $element.Permalink
|
||||||
|
"description" (or $element.Description $element.Content)
|
||||||
|
"thumbnail" $element.Params.thumbnail
|
||||||
|
"icon" $element.Params.icon
|
||||||
|
) -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<div class="col pt-3 pb-3">
|
||||||
|
{{- partial "assets/card.html" $params -}}
|
||||||
|
</div>
|
||||||
|
{{- if and (lt $index (sub $max 1)) $separator -}}
|
||||||
|
<div class="col d-block d-sm-none">
|
||||||
|
<hr>
|
||||||
</div>
|
</div>
|
||||||
{{- if and (lt $index (sub $max 1)) $separator -}}
|
{{- end -}}
|
||||||
<div class="col d-block d-sm-none">
|
{{- end -}}
|
||||||
<hr>
|
</div>
|
||||||
</div>
|
|
||||||
{{- end -}}
|
{{ if $paginate }}
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
{{- if gt $paginator.TotalPages 1 -}}
|
{{- if gt $paginator.TotalPages 1 -}}
|
||||||
{{- partial "assets/pagination.html" $page -}}
|
<div class="pt-3">{{ partial "assets/pagination.html" $page }}</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<div class="row {{ $colGrid }}">
|
|
||||||
{{ range $index, $element := $list }}
|
|
||||||
<div class="col pt-3 pb-3">
|
|
||||||
{{- partial "assets/card.html" (dict
|
|
||||||
"path" $element.File.Path
|
|
||||||
"class" (printf "h-100 %s" $class)
|
|
||||||
"color" $color
|
|
||||||
"padding" $padding
|
|
||||||
"header" $header
|
|
||||||
"footer" $footer
|
|
||||||
"orientation" $orientation
|
|
||||||
)
|
|
||||||
-}}
|
|
||||||
</div>
|
|
||||||
{{- if and (lt $index (sub $max 1)) $separator -}}
|
|
||||||
<div class="col d-block d-sm-none">
|
|
||||||
<hr>
|
|
||||||
</div>
|
|
||||||
{{- end -}}
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
{{ if gt $count $max }}
|
{{ if gt $count $max }}
|
||||||
<a class="btn btn-outline-primary" href="{{ $moreURL| safeURL }}" role="button">{{ $moreTitle }}</a>
|
<a class="btn btn-outline-primary" href="{{ $moreURL| safeURL }}" role="button">{{ $moreTitle }}</a>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
The shortcode supports the following arguments:
|
The shortcode supports the following arguments:
|
||||||
"path" Optional path of the page, override with other parameters.
|
"path" Optional path of the page, override with other parameters.
|
||||||
"title" Required title of the card.
|
"title" Required title of the card.
|
||||||
"href" Required address for the button or hyperlink.
|
"href" Optional address for the button or hyperlink.
|
||||||
"class" Optional class attribute of the card element, e.g. “w-50”.
|
"class" Optional class attribute of the card element, e.g. “w-50”.
|
||||||
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
||||||
"warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". By default, no
|
"warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". By default, no
|
||||||
@@ -28,10 +28,17 @@
|
|||||||
{{- $color := .color -}}
|
{{- $color := .color -}}
|
||||||
{{- $description := .description -}}
|
{{- $description := .description -}}
|
||||||
|
|
||||||
<a href="{{ $href }}" class="{{ if $color }}link-bg-{{ $color }}{{ else }}card-body-link{{ end }} stretched-link">
|
{{- if $href -}}
|
||||||
|
<a href="{{ $href }}" class="{{ if $color }}link-bg-{{ $color }}{{ else }}card-body-link{{ end }} stretched-link">
|
||||||
|
<p class="card-title fs-5 fw-bold">{{ $title }}</p>
|
||||||
|
{{ with $description }}<p class="card-text mb-4 {{ if $color }}link-bg-{{ $color }}{{ else }}card-body-link{{ end }}">{{ . }}</p>{{ end -}}
|
||||||
|
</a>
|
||||||
|
{{- else -}}
|
||||||
|
<div>
|
||||||
<p class="card-title fs-5 fw-bold">{{ $title }}</p>
|
<p class="card-title fs-5 fw-bold">{{ $title }}</p>
|
||||||
{{ with $description }}<p class="card-text mb-4 {{ if $color }}link-bg-{{ $color }}{{ else }}card-body-link{{ end }}">{{ . }}</p>{{ end -}}
|
{{ with $description }}<p class="card-text mb-4 {{ if $color }}link-bg-{{ $color }}{{ else }}card-body-link{{ end }}">{{ . }}</p>{{ end -}}
|
||||||
</a>
|
</div>
|
||||||
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
<!-- Inline partial to render the card's header or footer -->
|
<!-- Inline partial to render the card's header or footer -->
|
||||||
@@ -60,7 +67,7 @@
|
|||||||
|
|
||||||
{{- range $index, $tag := first $maxTags ($page.GetTerms "tags") -}}
|
{{- range $index, $tag := first $maxTags ($page.GetTerms "tags") -}}
|
||||||
{{- if gt $index 0 }} • {{ end -}}
|
{{- if gt $index 0 }} • {{ end -}}
|
||||||
<a href="{{ (path.Join $tag.Page.RelPermalink) | relURL }}" class="{{ $link }} tag-link" aria-label="tag: {{ $tag.LinkTitle }}">{{ $tag.LinkTitle }}</a>
|
<a href="{{ (path.Join $tag.Page.RelPermalink) | relLangURL }}" class="{{ $link }} tag-link" aria-label="tag: {{ $tag.LinkTitle }}">{{ $tag.LinkTitle }}</a>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
</small></p>
|
</small></p>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
@@ -69,7 +76,7 @@
|
|||||||
{{- if .path }}
|
{{- if .path }}
|
||||||
{{- $page = site.GetPage .path }}
|
{{- $page = site.GetPage .path }}
|
||||||
{{- if not $page }}
|
{{- if not $page }}
|
||||||
{{- errorf "Cannot find page: %s" .path -}}
|
{{- errorf "partial [assets/card.html] - Cannot find page: %s" .path -}}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
@@ -84,7 +91,7 @@
|
|||||||
{{- if $color -}}
|
{{- if $color -}}
|
||||||
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
||||||
{{- if not (in $supportedColors $color) -}}
|
{{- if not (in $supportedColors $color) -}}
|
||||||
{{- errorf "Invalid value for param 'color': %s" $color -}}
|
{{- errorf "partial [assets/card.html] - Invalid value for param 'color': %s" $color -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
@@ -92,13 +99,13 @@
|
|||||||
{{- with .header }}{{ $header = . }}{{ end -}}
|
{{- with .header }}{{ $header = . }}{{ end -}}
|
||||||
{{- $supportedKeywords := slice "full" "publication" "tags" "none" -}}
|
{{- $supportedKeywords := slice "full" "publication" "tags" "none" -}}
|
||||||
{{- if not (in $supportedKeywords $header) -}}
|
{{- if not (in $supportedKeywords $header) -}}
|
||||||
{{- errorf "Invalid value for param 'header': %s" $header -}}
|
{{- errorf "partial [assets/card.html] - Invalid value for param 'header': %s" $header -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $footer := "none" -}}
|
{{- $footer := "none" -}}
|
||||||
{{- with .footer }}{{ $footer = . }}{{ end -}}
|
{{- with .footer }}{{ $footer = . }}{{ end -}}
|
||||||
{{- if not (in $supportedKeywords $footer) -}}
|
{{- if not (in $supportedKeywords $footer) -}}
|
||||||
{{- errorf "Invalid value for param 'footer': %s" $footer -}}
|
{{- errorf "partial [assets/card.html] - Invalid value for param 'footer': %s" $footer -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- with $page -}}
|
{{- with $page -}}
|
||||||
@@ -109,46 +116,42 @@
|
|||||||
{{- if not $icon }}{{ $icon = .Params.icon }}{{ end -}}
|
{{- if not $icon }}{{ $icon = .Params.icon }}{{ end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- if not $href -}}
|
|
||||||
{{- errorf "Missing value for param 'href'" -}}
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
{{- $class := .class -}}
|
{{- $class := .class -}}
|
||||||
|
|
||||||
{{- $padding := "auto" -}}
|
{{- $padding := "auto" -}}
|
||||||
{{- with .padding }}{{ $padding = . }}{{ end -}}
|
{{- with .padding }}{{ $padding = . }}{{ end -}}
|
||||||
{{- $supportedPaddings := slice "0" "1" "2" "3" "4" "5" "auto" -}}
|
{{- $supportedPaddings := slice "0" "1" "2" "3" "4" "5" "auto" -}}
|
||||||
{{- if not (in $supportedPaddings $padding) -}}
|
{{- if not (in $supportedPaddings $padding) -}}
|
||||||
{{- errorf "Invalid value for param 'padding': %s" $padding -}}
|
{{- errorf "partial [assets/card.html] - Invalid value for param 'padding': %s" $padding -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $orientation := "stacked" -}}
|
{{- $orientation := "stacked" -}}
|
||||||
{{- with .orientation }}{{ $orientation = . }}{{ end -}}
|
{{- with .orientation }}{{ $orientation = . }}{{ end -}}
|
||||||
{{- $supportedOrientations := slice "stacked" "horizontal" "none" -}}
|
{{- $supportedOrientations := slice "stacked" "horizontal" "none" -}}
|
||||||
{{- if not (in $supportedOrientations $orientation) -}}
|
{{- if not (in $supportedOrientations $orientation) -}}
|
||||||
{{- errorf "Invalid value for param 'orientation': %s" $orientation -}}
|
{{- errorf "partial [assets/card.html] - Invalid value for param 'orientation': %s" $orientation -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- if eq $orientation "none" }}{{ $thumbnail = "" }}{{ $icon = "" }}{{ end -}}
|
{{- if eq $orientation "none" }}{{ $thumbnail = "" }}{{ $icon = "" }}{{ end -}}
|
||||||
|
|
||||||
{{- if eq $orientation "horizontal" -}}
|
{{- if eq $orientation "horizontal" -}}
|
||||||
<div class="card mb-3 {{ with $color }}bg-{{ . }} text-bg-{{ . }}{{ end }} {{ $class }}">
|
<div class="card mb-3 {{ with $color }}bg-{{ . }} text-bg-{{ . }}{{ end }} {{ $class }}">
|
||||||
<div class="row g-0">
|
<div class="row g-0 row-cols-1">
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
{{- if $thumbnail -}}
|
{{- if $thumbnail -}}
|
||||||
{{- partial "image.html" (dict "url" $thumbnail "ratio" "1x1" "outerClass" "h-100 card-img-wrap" "innerClass" "rounded-start card-img-h100" "title" $title) -}}
|
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" "1x1" "outerClass" "h-100 card-img-wrap" "innerClass" "rounded-start card-img-h100" "title" $title) -}}
|
||||||
{{- else if $icon -}}
|
{{- else if $icon -}}
|
||||||
<div class="pt-{{ $padding }} ps-{{ $padding }} pe-{{ $padding }}">
|
<div class="pt-{{ $padding }} ps-{{ $padding }} pe-{{ $padding }}">
|
||||||
{{- partial "assets/icon.html" (dict "icon" (printf "%s fa-4x text-secondary" $icon)) -}}
|
{{- partial "assets/icon.html" (dict "icon" (printf "%s fa-4x text-secondary" $icon)) -}}
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-8">
|
<div class="col-8">
|
||||||
<div class="card-body d-flex p-{{ $padding }} flex-column h-100">
|
<div class="card-body d-flex p-{{ $padding }} flex-column h-100">
|
||||||
<div>{{ partial "card-caption.html" (dict "page" $page "keywords" $header "color" $color) }}</div>
|
{{ if $page }}<div>{{ partial "card-caption.html" (dict "page" $page "keywords" $header "color" $color) }}</div>{{ end }}
|
||||||
<div class="h-100">
|
<div class="h-100">
|
||||||
{{- partial "card-body.html" (dict "title" $title "href" $href "color" $color "description" $description) -}}
|
{{- partial "card-body.html" (dict "title" $title "href" $href "color" $color "description" $description) -}}
|
||||||
</div>
|
</div>
|
||||||
<div>{{ partial "card-caption.html" (dict "page" $page "keywords" $footer "color" $color) }}</div>
|
{{ if $page }}<div>{{ partial "card-caption.html" (dict "page" $page "keywords" $footer "color" $color) }}</div>{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -156,16 +159,16 @@
|
|||||||
{{- else -}}
|
{{- else -}}
|
||||||
<div class="card {{ with $color }}bg-{{ . }} text-bg-{{ . }}{{ end }} {{ $class }}">
|
<div class="card {{ with $color }}bg-{{ . }} text-bg-{{ . }}{{ end }} {{ $class }}">
|
||||||
{{- if $thumbnail -}}
|
{{- if $thumbnail -}}
|
||||||
{{- partial "image.html" (dict "url" $thumbnail "ratio" "16x9" "outerClass" "card-img-wrap" "innerClass" "card-img-top" "title" $title) -}}
|
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" "16x9" "outerClass" "card-img-wrap" "innerClass" "card-img-top" "title" $title) -}}
|
||||||
{{- else if $icon -}}
|
{{- else if $icon -}}
|
||||||
<div class="pt-{{ $padding }} ps-{{ $padding }} pe-{{ $padding }}">
|
<div class="pt-{{ $padding }} ps-{{ $padding }} pe-{{ $padding }}">
|
||||||
{{- partial "assets/icon.html" (dict "icon" (printf "%s fa-4x text-secondary" $icon)) -}}
|
{{- partial "assets/icon.html" (dict "icon" (printf "%s fa-4x text-secondary" $icon)) -}}
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
<div class="card-body d-flex flex-column p-{{ $padding }}">
|
<div class="card-body d-flex flex-column p-{{ $padding }}">
|
||||||
{{- partial "card-caption.html" (dict "page" $page "keywords" $header "color" $color) -}}
|
{{ if $page }}{{- partial "card-caption.html" (dict "page" $page "keywords" $header "color" $color) -}}{{ end }}
|
||||||
{{- partial "card-body.html" (dict "title" $title "href" $href "color" $color "description" $description) -}}
|
{{- partial "card-body.html" (dict "title" $title "href" $href "color" $color "description" $description) -}}
|
||||||
{{- partial "card-caption.html" (dict "page" $page "keywords" $footer "color" $color) -}}
|
{{ if $page }}{{- partial "card-caption.html" (dict "page" $page "keywords" $footer "color" $color) -}}{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{{- $icon := .icon -}}
|
{{- $icon := .icon -}}
|
||||||
{{- if not $icon -}}
|
{{- if not $icon -}}
|
||||||
{{- errorf "Expected value for param 'icon'" -}}
|
{{- errorf "partial [assets/icon.html] - Expected value for param 'icon'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $icon_class := split $icon " " -}}
|
{{- $icon_class := split $icon " " -}}
|
||||||
@@ -12,5 +12,5 @@
|
|||||||
{{- else if eq (index $icon_class 0) "fa" -}}
|
{{- else if eq (index $icon_class 0) "fa" -}}
|
||||||
<i class="fa-regular fa-{{ $attr }}"></i>
|
<i class="fa-regular fa-{{ $attr }}"></i>
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- errorf "Unrecognized icon class: %s" $icon_class -}}
|
{{- errorf "partial [assets/icon.html] - Unrecognized icon class: %s" $icon_class -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
{{- $title := .title -}}
|
{{- $title := .title -}}
|
||||||
{{- $caption := .caption -}}
|
{{- $caption := .caption -}}
|
||||||
{{- if ne (printf "%T" $mode) "bool" -}}
|
{{- if ne (printf "%T" $mode) "bool" -}}
|
||||||
{{- errorf "Invalid value for param 'mode'" -}}
|
{{- errorf "partial [assets/image.html] - Invalid value for param 'mode'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $modes := site.Params.main.modes | default (slice "light" "dark") -}}
|
{{- $modes := site.Params.main.modes | default (slice "light" "dark") -}}
|
||||||
|
|
||||||
@@ -132,23 +132,14 @@
|
|||||||
|
|
||||||
{{- range $none := $modes -}}
|
{{- range $none := $modes -}}
|
||||||
{{- if ne $none $mode -}}
|
{{- if ne $none $mode -}}
|
||||||
{{- $outerClass = printf "%s d-none-%s" $outerClass $none -}}
|
{{- $outerClass = printf "%s d-none-%s" (or $outerClass "") $none -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- if $caption -}}
|
{{- if $caption -}}
|
||||||
<figure class="figure {{ $outerClass }}">
|
<figure {{ with $outerClass }}class="{{ . }}"{{ end }}>
|
||||||
<img class="figure-img img-fluid {{ $innerClass }}"
|
{{ end }}
|
||||||
{{ with $imgset -}}
|
<div class="{{ with $ratio }}ratio ratio-{{ . }}{{ end }}{{ if not $caption }} {{ $outerClass }}{{ end }}">
|
||||||
srcset="{{ . }}"
|
|
||||||
sizes="100vw"
|
|
||||||
{{- end }}
|
|
||||||
src="{{ $fallbackURL }}"
|
|
||||||
alt="{{ $title }}">
|
|
||||||
<figcaption class="figure-caption">{{ $caption | safeHTML }}</figcaption>
|
|
||||||
</figure>
|
|
||||||
{{- else -}}
|
|
||||||
<div class="{{ with $ratio }}ratio ratio-{{ . }}{{ end }} {{ $outerClass }}">
|
|
||||||
<img class="img-fluid {{ $innerClass }}"
|
<img class="img-fluid {{ $innerClass }}"
|
||||||
{{ with $imgset -}}
|
{{ with $imgset -}}
|
||||||
srcset="{{ . }}"
|
srcset="{{ . }}"
|
||||||
@@ -157,7 +148,10 @@
|
|||||||
src="{{ $fallbackURL }}"
|
src="{{ $fallbackURL }}"
|
||||||
alt="{{ $title }}">
|
alt="{{ $title }}">
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- if $caption -}}
|
||||||
|
<figcaption class="figure-caption">{{ $caption | safeHTML }}</figcaption>
|
||||||
|
</figure>
|
||||||
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
<!-- Initiate the regular or color-mode image -->
|
<!-- Initiate the regular or color-mode image -->
|
@@ -27,18 +27,19 @@
|
|||||||
{{- define "partials/list-img.html" -}}
|
{{- define "partials/list-img.html" -}}
|
||||||
{{- $thumbnail := .thumbnail -}}
|
{{- $thumbnail := .thumbnail -}}
|
||||||
{{- $style := .style -}}
|
{{- $style := .style -}}
|
||||||
|
{{- $mode := .mode -}}
|
||||||
{{- partial "image.html" (dict "url" $thumbnail "outerClass" $style "mode" true) -}}
|
{{- partial "assets/image.html" (dict "url" $thumbnail "outerClass" $style "mode" $mode) -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $page := .page -}}
|
{{- $page := .page -}}
|
||||||
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
||||||
{{- errorf "Invalid value for param 'page'" -}}
|
{{- errorf "partial [assets/list.html] - Invalid value for param 'page'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $supportedTypes := slice "page.Pages" "resource.Resources" -}}
|
||||||
{{ $list := .list }}
|
{{ $list := .list }}
|
||||||
{{- if ne (printf "%T" $list) "resource.Resources" -}}
|
{{- if not (in $supportedTypes (printf "%T" $list)) -}}
|
||||||
{{- errorf "Invalid value for param 'items'" -}}
|
{{- errorf "partial [assets/list.html] - Invalid value for param 'list'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $title := .title -}}
|
{{- $title := .title -}}
|
||||||
@@ -47,16 +48,11 @@
|
|||||||
|
|
||||||
{{ $vertical := false }}
|
{{ $vertical := false }}
|
||||||
{{ $type := "pills" }}
|
{{ $type := "pills" }}
|
||||||
{{- $id := .Ordinal -}}
|
|
||||||
|
|
||||||
<div class="d-none d-md-block p-0">
|
<div class="d-none d-md-block p-0">
|
||||||
{{- range $index, $item := $list -}}
|
{{- range $index, $item := $list -}}
|
||||||
{{- $odd := eq (mod $index 2) 1 -}}
|
{{- $odd := eq (mod $index 2) 1 -}}
|
||||||
<div class="container ratio-section d-flex flex-column">
|
<div class="container ratio-section d-flex flex-column">
|
||||||
{{ if eq $index 0 }}
|
|
||||||
{{ with $title }}<p class="display-4 pt-5{{ if and page.IsHome site.Params.home.centerHeadline }} text-center{{ end }}">{{ . }}</p>{{ end }}
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="row pt-5 pb-5 align-items-center flex-fill row-cols-2">
|
<div class="row pt-5 pb-5 align-items-center flex-fill row-cols-2">
|
||||||
<div class="col-6{{ if $odd }} order-last{{ end }}">
|
<div class="col-6{{ if $odd }} order-last{{ end }}">
|
||||||
{{- $style := "reveal fade-bottom" -}}
|
{{- $style := "reveal fade-bottom" -}}
|
||||||
@@ -64,10 +60,10 @@
|
|||||||
{{- $style = "reveal fade-bottom-n5 rotate-n5 ps-3" -}}
|
{{- $style = "reveal fade-bottom-n5 rotate-n5 ps-3" -}}
|
||||||
{{- if $odd }}{{ $style = "reveal fade-bottom-5 rotate-5 pe-3" }}{{ end }}
|
{{- if $odd }}{{ $style = "reveal fade-bottom-5 rotate-5 pe-3" }}{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ partial "partials/list-img.html" (dict "thumbnail" $item.Params.Thumbnail "style" $style) }}
|
{{ partial "partials/list-img.html" (dict "thumbnail" $item.Params.Thumbnail "style" $style "mode" $item.Params.colormode) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6{{ if $odd }} order-first{{ end }} psw-lg-5 p-5">
|
<div class="col-6{{ if $odd }} order-first{{ end }} psw-lg-5 p-5">
|
||||||
{{ partial "partials/list-content.html" (dict "title" $item.Title "content" $item.Content )}}
|
{{ partial "partials/list-content.html" (dict "title" $item.Title "content" (or $item.Description $item.Content)) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,15 +74,12 @@
|
|||||||
{{- range $index, $item := $list -}}
|
{{- range $index, $item := $list -}}
|
||||||
{{- $odd := eq (mod $index 2) 1 -}}
|
{{- $odd := eq (mod $index 2) 1 -}}
|
||||||
<div class="container d-flex flex-column">
|
<div class="container d-flex flex-column">
|
||||||
{{ if eq $index 0 }}
|
|
||||||
{{ with $title }}<p class="display-4 pt-5{{ if and page.IsHome site.Params.home.centerHeadline }} text-center{{ end }}">{{ . }}</p>{{ end }}
|
|
||||||
{{ end }}
|
|
||||||
<div class="row pt-5 pb-5 align-items-center flex-fill row-cols-2">
|
<div class="row pt-5 pb-5 align-items-center flex-fill row-cols-2">
|
||||||
<div class="col-12 text-center">
|
<div class="col-12 text-center">
|
||||||
{{ partial "partials/list-img.html" (dict "thumbnail" $item.Params.Thumbnail)}}
|
{{ partial "partials/list-img.html" (dict "thumbnail" $item.Params.Thumbnail "mode" $item.Params.colormode) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 p-3">
|
<div class="col-12 p-3">
|
||||||
{{ partial "partials/list-content.html" (dict "title" $item.Title "content" $item.Content )}}
|
{{ partial "partials/list-content.html" (dict "title" $item.Title "content" (or $item.Description $item.Content)) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -3,10 +3,12 @@
|
|||||||
supports the following arguments:
|
supports the following arguments:
|
||||||
"page" Required context of the current page.
|
"page" Required context of the current page.
|
||||||
"list" Required array of pages.
|
"list" Required array of pages.
|
||||||
"title" Optional title of the card group.
|
"title" Optional title of the tab group.
|
||||||
"type" Optional type of the tab group, either "tabs", "pills", or "underline".
|
"type" Optional type of the tab group, either "tabs", "pills" (default), or "underline".
|
||||||
"vertical" Optional flag to show vertical tabs instead of horizontal tabs (default).
|
"vertical" Optional flag to show vertical tabs instead of horizontal tabs (default).
|
||||||
"class": Optional class attribute of the tab group, e.g. “nav-fill”.
|
"class" Optional class attribute of the tab group, e.g. “nav-fill”.
|
||||||
|
"pane" Optional style of the panes, either "none" (default) or "persona".
|
||||||
|
"width" Optional responsive width of the tab group, either "50" or "100" (default).
|
||||||
|
|
||||||
In addition, the following arguments are passed to the individual tabs.
|
In addition, the following arguments are passed to the individual tabs.
|
||||||
"class" Optional class attribute of the tab element, e.g. “w-50”.
|
"class" Optional class attribute of the tab element, e.g. “w-50”.
|
||||||
@@ -16,47 +18,95 @@
|
|||||||
|
|
||||||
{{- $page := .page -}}
|
{{- $page := .page -}}
|
||||||
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
{{- if ne (printf "%T" $page) "*hugolib.pageState" -}}
|
||||||
{{- errorf "Invalid value for param 'page'" -}}
|
{{- errorf "partial [assets/nav.html] - Invalid value for param 'page'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $id := "0" -}}
|
||||||
|
{{- with .id -}}
|
||||||
|
{{ $id = . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{- $supportedTypes := slice "page.Pages" "resource.Resources" -}}
|
||||||
{{ $list := .list }}
|
{{ $list := .list }}
|
||||||
{{- if ne (printf "%T" $list) "resource.Resources" -}}
|
{{- if not (in $supportedTypes (printf "%T" $list)) -}}
|
||||||
{{- errorf "Invalid value for param 'items'" -}}
|
{{- errorf "partial [assets/nav.html] - Invalid value for param 'list'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{ $pane := "none" }}
|
||||||
|
{{ with .pane }}
|
||||||
|
{{- $supportedPanes := slice "none" "persona" -}}
|
||||||
|
{{- $pane = . }}
|
||||||
|
{{- if not (in $supportedPanes $pane) -}}
|
||||||
|
{{- errorf "partial [assets/nav.html] - Invalid value for param 'pane'" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $supportedWidths := slice 50 100 -}}
|
||||||
|
{{ $widthParam := 100 -}}
|
||||||
|
{{ $width := 100 }}
|
||||||
|
{{ with .width }}{{ $widthParam = . }}{{ end -}}
|
||||||
|
{{ if in $supportedWidths $widthParam -}}
|
||||||
|
{{ $width = int $widthParam }}
|
||||||
|
{{ else -}}
|
||||||
|
{{ errorf "partial [assets/nav.html] - Invalid value for param 'width': %s" $widthParam -}}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
{{- $title := .title -}}
|
{{- $title := .title -}}
|
||||||
{{- $class := .class -}}
|
{{- $class := .class -}}
|
||||||
{{- $color := .color -}}
|
{{- $color := .color -}}
|
||||||
|
|
||||||
|
{{ $supportedFlags := slice "true" "false" -}}
|
||||||
|
{{ $verticalParam := "false" -}}
|
||||||
{{ $vertical := false }}
|
{{ $vertical := false }}
|
||||||
|
{{ with .vertical }}{{ $verticalParam = . }}{{ end -}}
|
||||||
|
{{ if in $supportedFlags $verticalParam -}}
|
||||||
|
{{ if eq $verticalParam "true" }}{{ $vertical = true }}{{ else }}{{ $vertical = false }}{{ end -}}
|
||||||
|
{{ else -}}
|
||||||
|
{{ errorf "partial [assets/nav.html] - Invalid value for param 'vertical': %s" $verticalParam -}}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
{{ $type := "pills" }}
|
{{ $type := "pills" }}
|
||||||
{{- $id := .Ordinal -}}
|
{{ with .type }}
|
||||||
|
{{ $type = . -}}
|
||||||
{{ if $vertical }}<div class="d-flex align-items-start">{{ end }}
|
{{ $supportedNavTypes := slice "tabs" "pills" "underline" -}}
|
||||||
<div class="nav{{ with $type }} nav-{{ . }}{{ end }}{{ with $class }} {{ . }}{{ end }}{{ if $vertical }} flex-column{{ end }}" id="nav-{{ $id }}" role="tablist"{{ if $vertical }} aria-orientation="vertical"{{ end }}>
|
{{ if $type }}
|
||||||
{{- range $index, $item := $list -}}
|
{{ if not (in $supportedNavTypes $type) -}}
|
||||||
{{ $show := eq $index 0}}
|
{{ errorf "partial [assets/nav.html] - Invalid value for param 'type': %s" $type -}}
|
||||||
<button class="nav-link text-nowrap{{ if $show }} active{{ end }}" id="nav-{{ $id }}-btn-{{ $index }}" data-bs-toggle="pill" data-bs-target="#nav-{{ $id }}-{{ $index }}"
|
{{ end -}}
|
||||||
type="button" role="tab" aria-controls="nav-{{ $id }}-{{ $index }}" aria-selected="{{ if eq $index 0 }}true{{ else }}false{{ end }}">
|
|
||||||
{{ $item.Title }}
|
|
||||||
</button>
|
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
</div>
|
{{ end -}}
|
||||||
|
|
||||||
<div class="tab-content {{ if eq $type "tabs" }}border border-top-0 p-3{{ else if $vertical }}ms-3{{ else }}mt-3{{ end }}">
|
<div class="{{ if eq $width 50 }}col-sm-12 col-md-10 col-lg-8 col-xl-6{{ else }}col-12{{ end }} mx-auto pt-5 pb-5">
|
||||||
{{ range $index, $item := $list }}
|
{{ if $vertical }}<div class="d-flex align-items-start">{{ end }}
|
||||||
{{ $header := $item.Title }}
|
<div class="nav{{ with $type }} nav-{{ . }}{{ end }}{{ with $class }} {{ . }}{{ end }}{{ if $vertical }} flex-column{{ end }}" id="nav-{{ $id }}" role="tablist"{{ if $vertical }} aria-orientation="vertical"{{ end }}>
|
||||||
{{ $body := $item.Content }}
|
{{- range $index, $item := $list -}}
|
||||||
{{ $show := eq $index 0}}
|
{{ $show := eq $index 0}}
|
||||||
<div class="tab-pane{{ if $show }} active{{ end }}" id="nav-{{ $id }}-{{ $index }}" role="tabpanel" aria-labelledby="{{ $id }}-btn-{{ $index }}" tabindex="0">
|
<button class="nav-link text-nowrap{{ if $show }} active{{ end }}" id="nav-{{ $id }}-btn-{{ $index }}" data-bs-toggle="pill" data-bs-target="#nav-{{ $id }}-{{ $index }}"
|
||||||
{{- partial "assets/persona.html" (dict
|
type="button" role="tab" aria-controls="nav-{{ $id }}-{{ $index }}" aria-selected="{{ if eq $index 0 }}true{{ else }}false{{ end }}">
|
||||||
"title" $item.Title
|
{{ $item.Title }}
|
||||||
"class" $class
|
</button>
|
||||||
"color" $color
|
{{ end -}}
|
||||||
"content" $item.Content
|
</div>
|
||||||
"thumbnail" $item.Params.Thumbnail
|
|
||||||
) -}}
|
<div class="tab-content {{ if eq $type "tabs" }}border border-top-0 p-3{{ else if $vertical }}ms-3{{ else }}mt-3{{ end }}">
|
||||||
</div>
|
{{ range $index, $item := $list }}
|
||||||
{{ end }}
|
{{ $header := $item.Title }}
|
||||||
</div>
|
{{ $body := $item.Content }}
|
||||||
{{ if $vertical }}</div>{{ end }}
|
{{ $show := eq $index 0}}
|
||||||
|
<div class="tab-pane{{ if $show }} active{{ end }}" id="nav-{{ $id }}-{{ $index }}" role="tabpanel" aria-labelledby="{{ $id }}-btn-{{ $index }}" tabindex="0">
|
||||||
|
{{- if eq $pane "persona" -}}
|
||||||
|
{{- partial "assets/persona.html" (dict
|
||||||
|
"title" $item.Title
|
||||||
|
"class" $class
|
||||||
|
"color" $color
|
||||||
|
"content" (or $item.Description $item.Content)
|
||||||
|
"thumbnail" $item.Params.Thumbnail
|
||||||
|
) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- (or $item.Description $item.Content) -}}
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ if $vertical }}</div>{{ end }}
|
||||||
|
</div>
|
46
layouts/partials/assets/navbar-item.html
Normal file
46
layouts/partials/assets/navbar-item.html
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{{- $menu := .menu -}}
|
||||||
|
{{- $parent := .parent -}}
|
||||||
|
{{- $page := .page -}}
|
||||||
|
{{- $class := .class -}}
|
||||||
|
{{- $anchorClass := "" -}}
|
||||||
|
|
||||||
|
{{- $menuURL := (or $menu.PageRef $menu.URL) | relLangURL -}}
|
||||||
|
{{- $pageURL := $page.RelPermalink | relLangURL -}}
|
||||||
|
{{- $isActive := hasPrefix $pageURL $menuURL -}}
|
||||||
|
{{- $isAlias := $menu.Params.alias -}}
|
||||||
|
|
||||||
|
{{- $url := urls.Parse $menuURL -}}
|
||||||
|
{{- $baseURL := urls.Parse $.Site.Params.Baseurl -}}
|
||||||
|
{{- $isExternal := ne $url.Host $baseURL.Host -}}
|
||||||
|
{{- $externalHref := "" }}
|
||||||
|
{{- if $isExternal }}{{ $externalHref = "target=\"_blank\" rel=\"noopener noreferrer\"" }}{{ end -}}
|
||||||
|
|
||||||
|
{{- $mainNav := urlize (lower $menu.Name) -}}
|
||||||
|
{{- $childNav := "" -}}
|
||||||
|
|
||||||
|
{{- $button := "" -}}
|
||||||
|
{{- if $parent -}}
|
||||||
|
{{- $mainNav = urlize (lower $parent.Name) -}}
|
||||||
|
{{- $childNav = urlize (lower $menu.Name) -}}
|
||||||
|
{{- $anchorClass = "dropdown-item" -}}
|
||||||
|
{{- else if $menu.HasChildren -}}
|
||||||
|
{{- $anchorClass = "nav-link dropdown-toggle" -}}
|
||||||
|
{{- $button = " role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\"" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $anchorClass = "nav-link" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $params := "" -}}
|
||||||
|
{{- if and $isAlias (not $isExternal) -}}
|
||||||
|
{{- $params = printf "?menu=%s" $mainNav -}}
|
||||||
|
{{- with $childNav }}{{ $params = printf "%s&child=%s" $params . }}{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<a class="{{ $anchorClass }}{{ if $isActive }} active{{ end }}{{ with $class }} {{. }}{{ end }}"
|
||||||
|
data-nav="main" data-nav-main="{{ $mainNav }}"{{ with $childNav }} data-nav-child="{{ . }}"{{ end }}
|
||||||
|
href="{{ $menuURL }}{{ $params | safeHTMLAttr }}"{{ with $externalHref }} {{ . | safeHTMLAttr }}{{ end }} {{ $button | safeHTMLAttr }}>
|
||||||
|
|
||||||
|
{{- with $menu.Pre }}{{ . }}{{ end -}}
|
||||||
|
<span {{ if $isActive }} class="active"{{ end }}>{{ $menu.Name }}</span>
|
||||||
|
{{- with $menu.Post }}{{ . }}{{ end -}}
|
||||||
|
{{- if $isExternal }} {{ partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}{{ end -}}
|
||||||
|
</a>
|
@@ -1,12 +1,13 @@
|
|||||||
<!--
|
<!--
|
||||||
Displays a navigation header with a toggler. The partial supports the following arguments:
|
Displays a navigation header with a toggler. The partial supports the following arguments:
|
||||||
|
"id" Optional id of the navbar toggler, defaults to "navbar-collapse-0".
|
||||||
"page" Required object reference to the current page.
|
"page" Required object reference to the current page.
|
||||||
"menus" Optional name of the menu configuration, defaults to "main".
|
"menus" Optional name of the menu configuration, defaults to "main".
|
||||||
"size" Optional size of the button, either "sm", "md" (default), or "lg".
|
"size" Optional size of the button, either "sm", "md" (default), or "lg".
|
||||||
"fixed" Optional flag to indicate the navbar should stick to the top, defaults to false.
|
"fixed" Optional flag to indicate the navbar should stick to the top, defaults to false.
|
||||||
"color" Optional background color of the navbar, either "primary", "secondary", "success",
|
"color" Optional background color of the navbar, either "primary", "secondary", "success",
|
||||||
"danger", "warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". The
|
"danger", "warning", "info", "white", "black", "body", or "body-tertiary". The default color is
|
||||||
default color is none.
|
none.
|
||||||
"mode" Optional flag to include a color mode switcher, default is "true" (if dark mode is enabled).
|
"mode" Optional flag to include a color mode switcher, default is "true" (if dark mode is enabled).
|
||||||
"search" Optional flag to include a search input, default is "true".
|
"search" Optional flag to include a search input, default is "true".
|
||||||
"logo" Optional address of the logo image, defaults to the parameter "logo" set in the "main" section of
|
"logo" Optional address of the logo image, defaults to the parameter "logo" set in the "main" section of
|
||||||
@@ -16,7 +17,6 @@
|
|||||||
|
|
||||||
<!-- Inline partial to render the color mode switcher -->
|
<!-- Inline partial to render the color mode switcher -->
|
||||||
{{- define "partials/navbar-mode.html" -}}
|
{{- define "partials/navbar-mode.html" -}}
|
||||||
{{- $id := .id -}}
|
|
||||||
{{- $size := .size -}}
|
{{- $size := .size -}}
|
||||||
{{- $collapsed := .collapsed -}}
|
{{- $collapsed := .collapsed -}}
|
||||||
|
|
||||||
@@ -50,26 +50,28 @@
|
|||||||
|
|
||||||
{{- $supportedFlags := slice "true" "false" -}}
|
{{- $supportedFlags := slice "true" "false" -}}
|
||||||
|
|
||||||
{{- $id := 0 -}}
|
{{- $id := printf "navbar-collapse-%d" 0 -}}
|
||||||
{{- with .id }}{{ $id = . }}{{ end -}}
|
{{ with .id }}
|
||||||
|
{{ $id = . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{- $page := .page -}}
|
{{- $page := .page -}}
|
||||||
{{- if not $page -}}
|
{{- if not $page -}}
|
||||||
{{- errorf "Missing value for param 'page'" -}}
|
{{- errorf "partial [assets/navbar.html] - Missing value for param 'page'" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $menuName := "main" }}
|
{{- $menuName := "main" }}
|
||||||
{{- with .menus }}{{ $menuName = .}}{{ end -}}
|
{{- with .menus }}{{ $menuName = .}}{{ end -}}
|
||||||
{{- $menus := index site.Menus $menuName -}}
|
{{- $menus := index site.Menus $menuName -}}
|
||||||
{{- if or (ne (printf "%T" $menus) "navigation.Menu") (ne (index $menus 0).Menu $menuName) -}}
|
{{- if or (ne (printf "%T" $menus) "navigation.Menu") (ne (index $menus 0).Menu $menuName) -}}
|
||||||
{{- errorf "Invalid value for param 'menus': %s" $menuName -}}
|
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'menus': %s" $menuName -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $size := "md" -}}
|
{{- $size := "md" -}}
|
||||||
{{- with .size }}{{ $size = . }}{{ end -}}
|
{{- with .size }}{{ $size = . }}{{ end -}}
|
||||||
{{- $supportedSizes := slice "xs" "sm" "md" "lg" "xl" -}}
|
{{- $supportedSizes := slice "xs" "sm" "md" "lg" "xl" -}}
|
||||||
{{- if not (in $supportedSizes $size) -}}
|
{{- if not (in $supportedSizes $size) -}}
|
||||||
{{- errorf "Invalid value for param 'size': %s" $size -}}
|
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'size': %s" $size -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $fixedParam := "false" -}}
|
{{- $fixedParam := "false" -}}
|
||||||
@@ -78,15 +80,15 @@
|
|||||||
{{- if in $supportedFlags $fixedParam -}}
|
{{- if in $supportedFlags $fixedParam -}}
|
||||||
{{- if eq $fixedParam "true" }}{{ $fixed = true }}{{ else }}{{ $fixed = false }}{{ end -}}
|
{{- if eq $fixedParam "true" }}{{ $fixed = true }}{{ else }}{{ $fixed = false }}{{ end -}}
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- errorf "Invalid value for param 'fixed': %s" $fixedParam -}}
|
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'fixed': %s" $fixedParam -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $color := "" -}}
|
{{- $color := "" -}}
|
||||||
{{- with .color -}}
|
{{- with .color -}}
|
||||||
{{- $color = . -}}
|
{{- $color = . -}}
|
||||||
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "white" "black" "body" "body-tertiary" -}}
|
||||||
{{- if not (in $supportedColors $color) -}}
|
{{- if not (in $supportedColors $color) -}}
|
||||||
{{- errorf "Invalid value for param 'color': %s" $color -}}
|
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'color': %s" $color -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
@@ -96,7 +98,7 @@
|
|||||||
{{- if in $supportedFlags $searchParam -}}
|
{{- if in $supportedFlags $searchParam -}}
|
||||||
{{- if eq $searchParam "true" }}{{ $search = true }}{{ else }}{{ $search = false }}{{ end -}}
|
{{- if eq $searchParam "true" }}{{ $search = true }}{{ else }}{{ $search = false }}{{ end -}}
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- errorf "Invalid value for param 'search': %s" $searchParam -}}
|
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'search': %s" $searchParam -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
@@ -106,7 +108,7 @@
|
|||||||
{{- if in $supportedFlags $darkModeParam -}}
|
{{- if in $supportedFlags $darkModeParam -}}
|
||||||
{{- if eq $darkModeParam "true" }}{{ $enableDarkMode = site.Params.main.enableDarkMode }}{{ else }}{{ $enableDarkMode = false }}{{ end -}}
|
{{- if eq $darkModeParam "true" }}{{ $enableDarkMode = site.Params.main.enableDarkMode }}{{ else }}{{ $enableDarkMode = false }}{{ end -}}
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- errorf "Invalid value for param 'darkMode': %s" $darkModeParam -}}
|
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'darkMode': %s" $darkModeParam -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
@@ -124,7 +126,11 @@
|
|||||||
{{- $pre := .Pre -}}
|
{{- $pre := .Pre -}}
|
||||||
{{- $post := .Post -}}
|
{{- $post := .Post -}}
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-{{ $size }} {{ with $color }}bg-{{ . }}{{ end }} {{ if $fixed }}fixed-top{{ end }} p-4">
|
{{- $theme := "" -}}
|
||||||
|
{{- if eq $color "black" }}{{ $theme = "dark" }}{{ end -}}
|
||||||
|
{{- if eq $color "white" }}{{ $theme = "light" }}{{ end -}}
|
||||||
|
|
||||||
|
<nav class="navbar navbar-expand-{{ $size }} {{ with $color }}bg-{{ . }}{{ end }} {{ if $fixed }}fixed-top{{ end }} p-4"{{ with $theme }} data-bs-theme="{{ . }}"{{ end }}>
|
||||||
<div class="container-xxl p-0">
|
<div class="container-xxl p-0">
|
||||||
<!-- Insert sidebar toggler when applicable -->
|
<!-- Insert sidebar toggler when applicable -->
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
@@ -151,54 +157,34 @@
|
|||||||
|
|
||||||
<!-- Insert main navigation toggler -->
|
<!-- Insert main navigation toggler -->
|
||||||
<div class="d-flex fw-30">
|
<div class="d-flex fw-30">
|
||||||
<button id="main-nav-toggler" class="navbar-toggler collapsed p-0" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent-{{ $id }}"
|
<button id="main-nav-toggler" class="navbar-toggler collapsed p-0" type="button" data-bs-toggle="collapse" data-bs-target="#{{ $id }}"
|
||||||
aria-controls="navbarSupportedContent-{{ $id }}" aria-expanded="false" aria-label="{{ T "toggleMainNav" }}">
|
aria-controls="{{ $id }}" aria-expanded="false" aria-label="{{ T "toggleMainNav" }}">
|
||||||
<span class="toggler-icon top-bar emphasis"></span>
|
<span class="toggler-icon top-bar emphasis"></span>
|
||||||
<span class="toggler-icon middle-bar emphasis"></span>
|
<span class="toggler-icon middle-bar emphasis"></span>
|
||||||
<span class="toggler-icon bottom-bar emphasis"></span>
|
<span class="toggler-icon bottom-bar emphasis"></span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="navbar-collapse collapse" id="navbarSupportedContent-{{ $id }}">
|
<div class="navbar-collapse collapse" id="{{ $id }}">
|
||||||
<!-- Insert search input -->
|
<!-- Insert search input -->
|
||||||
{{- if $search }}{{ partial "assets/search-input.html" -}}{{ end -}}
|
{{- if $search }}{{ partial "assets/search-input.html" -}}{{ end -}}
|
||||||
|
|
||||||
<!-- Render top-menu items (maximum depth of 2) -->
|
<!-- Render top-menu items (maximum depth of 2) -->
|
||||||
<ul class="navbar-nav ms-auto">
|
<ul class="navbar-nav ms-auto">
|
||||||
{{- range $menu := $menus -}}
|
{{- range $menu := $menus -}}
|
||||||
{{- $menu_item_url := $menu.URL | relLangURL -}}
|
<li class="nav-item{{ if .HasChildren }} dropdown{{ end }}">
|
||||||
{{- $page_url:= $page.RelPermalink | relLangURL -}}
|
{{- partial "assets/navbar-item.html" (dict "menu" $menu "page" $page) -}}
|
||||||
{{- $active := hasPrefix $page_url $menu_item_url -}}
|
{{- if .HasChildren -}}
|
||||||
|
|
||||||
{{- $url := urls.Parse .URL -}}
|
|
||||||
{{- $baseurl := urls.Parse $.Site.Params.Baseurl -}}
|
|
||||||
{{- if .HasChildren -}}
|
|
||||||
<li class="nav-item dropdown">
|
|
||||||
<a class="nav-link {{ if $active }}active{{ end }} dropdown-toggle" href="{{ .URL }}" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
{{ if $active }}<span class="active">{{ .Name }}</span>{{ else }}{{ .Name }}{{ end }}
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-end">
|
<ul class="dropdown-menu dropdown-menu-end">
|
||||||
{{- range .Children -}}
|
{{- range .Children -}}
|
||||||
{{- $child_active := eq $page_url .URL -}}
|
{{- partial "assets/navbar-item.html" (dict "menu" . "parent" $menu "page" $page) -}}
|
||||||
<li><a class="dropdown-item {{ if $child_active }}active{{ end }}" href="{{ .URL }}">{{ .Name }}</a></li>
|
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
{{- end -}}
|
||||||
{{- else -}}
|
</li>
|
||||||
<li class="nav-item">
|
|
||||||
{{- $external := ne $url.Host $baseurl.Host -}}
|
|
||||||
<a class="nav-link {{ if $active }}active{{ end }}"
|
|
||||||
href="{{ with .Page }}{{ .RelPermalink }}{{ else }}{{ .URL | relLangURL }}{{ end }}" {{ if $external }}target="_blank" {{ end }}>
|
|
||||||
{{- with $pre}}{{ . }}{{ end -}}
|
|
||||||
<span {{if $active }} class="active"{{end}}>{{ .Name }}</span>
|
|
||||||
{{- with $post}}{{ . }}{{ end -}}
|
|
||||||
{{- if $external }} {{ partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}{{ end -}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
<!-- Insert divider if applicable -->
|
||||||
{{- if or $enableLanguage $enableDarkMode -}}
|
{{- if or $enableLanguage $enableDarkMode -}}
|
||||||
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
|
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
|
||||||
<div class="vr d-none d-md-flex h-100 mx-md-2"></div>
|
<div class="vr d-none d-md-flex h-100 mx-md-2"></div>
|
||||||
@@ -232,8 +218,8 @@
|
|||||||
|
|
||||||
<!-- Insert color mode switcher -->
|
<!-- Insert color mode switcher -->
|
||||||
{{- if $enableDarkMode -}}
|
{{- if $enableDarkMode -}}
|
||||||
{{- partial "partials/navbar-mode.html" (dict "id" $id "size" $size "collapsed" true) -}}
|
{{- partial "partials/navbar-mode.html" (dict "size" $size "collapsed" true) -}}
|
||||||
{{- partial "partials/navbar-mode.html" (dict "id" $id "size" $size "collapsed" false) -}}
|
{{- partial "partials/navbar-mode.html" (dict "size" $size "collapsed" false) -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
{{- if .path }}
|
{{- if .path }}
|
||||||
{{- $page = site.GetPage .path }}
|
{{- $page = site.GetPage .path }}
|
||||||
{{- if not $page }}
|
{{- if not $page }}
|
||||||
{{- errorf "Cannot find page: %s" .path -}}
|
{{- errorf "partial [assets/persona.html] - Cannot find page: %s" .path -}}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
{{- if $color -}}
|
{{- if $color -}}
|
||||||
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
||||||
{{- if not (in $supportedColors $color) -}}
|
{{- if not (in $supportedColors $color) -}}
|
||||||
{{- errorf "Invalid value for param 'color': %s" $color -}}
|
{{- errorf "partial [assets/persona.html] - Invalid value for param 'color': %s" $color -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
<div class="position-absolute top-50 start-0 translate-middle-y col-4 ps-3">
|
<div class="position-absolute top-50 start-0 translate-middle-y col-4 ps-3">
|
||||||
{{- if $thumbnail -}}
|
{{- if $thumbnail -}}
|
||||||
{{- partial "image.html" (dict "url" $thumbnail "ratio" "1x1" "innerClass" "rounded-5") -}}
|
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" "1x1" "innerClass" "rounded-5") -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="position-absolute top-25 start-50 translate-middle col-6">
|
<div class="position-absolute top-25 start-50 translate-middle col-6">
|
||||||
{{- if $thumbnail -}}
|
{{- if $thumbnail -}}
|
||||||
{{- partial "image.html" (dict "url" $thumbnail "ratio" "1x1" "innerClass" "rounded-5") -}}
|
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" "1x1" "innerClass" "rounded-5") -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<div class="d-flex ms-md-3">
|
<div class="d-flex ms-md-3">
|
||||||
<form class="search position-relative flex-grow-1 me-auto">
|
<form class="search position-relative flex-grow-1 me-auto">
|
||||||
<input id="search" class="form-control is-search" type="search" placeholder="{{ T "ui_search" }}" aria-label="{{ T "ui_search" }}" autocomplete="off">
|
<input id="search" class="form-control is-search" type="search" placeholder="{{ T "ui_search" }}" aria-label="{{ T "ui_search" }}" autocomplete="off">
|
||||||
<div id="suggestions" class="shadow bg-body rounded d-none"></div>
|
<div id="suggestions" class="shadow bg-body rounded d-none" data-no-results="{{ T "ui_no_results" }}"></div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
46
layouts/partials/assets/section-header.html
Normal file
46
layouts/partials/assets/section-header.html
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{{- $title := .title -}}
|
||||||
|
{{- $thumbnail := .thumbnail -}}
|
||||||
|
{{- $icon := .icon -}}
|
||||||
|
{{- $sectionHeader := .sectionHeader -}}
|
||||||
|
{{- $description := .description -}}
|
||||||
|
{{- $content := .content -}}
|
||||||
|
|
||||||
|
{{- define "partials/section-header-img.html" -}}
|
||||||
|
{{- $title := .title -}}
|
||||||
|
{{- $thumbnail := .thumbnail -}}
|
||||||
|
{{- $icon := .icon -}}
|
||||||
|
{{ $padding := 5 }}
|
||||||
|
|
||||||
|
{{- if $thumbnail -}}
|
||||||
|
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" "1x1" "outerClass" "h-100 card-img-wrap" "innerClass" "rounded-start card-img-h100" "title" $title) -}}
|
||||||
|
{{- else if $icon -}}
|
||||||
|
<div class="text-secondary fw-bold">
|
||||||
|
{{- partial "assets/icon.html" (dict "icon" (printf "%s fa-10x" $icon)) -}}
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<div class="container-fluid p-4 px-xxl-0">
|
||||||
|
{{ with $title }}<p class="display-4 mt-3{{ if and page.IsHome site.Params.home.centerHeadline }} text-center{{ end }}">{{ . }}</p>{{ end }}
|
||||||
|
{{ with $description }} <p class="lead mb-5">{{ . }}</p>{{ end }}
|
||||||
|
{{- if $content -}}
|
||||||
|
<div class="row row-cols-1 row-cols-lg-3 pt-5">
|
||||||
|
<div class="col col-lg-3 d-none d-lg-block"></div>
|
||||||
|
<div class="col col-sm-12 col-lg-6 text-center">
|
||||||
|
<div class="row row-cols-1{{ if ne $sectionHeader "justify-content-center" }} row-cols-sm-2{{ end }} row-gap-5 p-0 align-items-center flex-fill">
|
||||||
|
{{- if eq $sectionHeader "justify-content-center" -}}
|
||||||
|
<div class="col p-0 w-50 mx-auto pb-5">{{ partial "partials/section-header-img.html" (dict "title" $title "thumbnail" $thumbnail "icon" $icon )}}</div>
|
||||||
|
<div class="col fs-md-5 fs-6">{{ $content }}</div>
|
||||||
|
{{- else if eq $sectionHeader "justify-content-end" -}}
|
||||||
|
<div class="col p-0">{{ partial "partials/section-header-img.html" (dict "title" $title "thumbnail" $thumbnail "icon" $icon )}}</div>
|
||||||
|
<div class="col fs-md-5 fs-6 text-sm-start">{{ $content }}</div>
|
||||||
|
{{- else -}}
|
||||||
|
<div class="col fs-md-5 fs-6 text-sm-start">{{ $content }}</div>
|
||||||
|
<div class="col p-0">{{ partial "partials/section-header-img.html" (dict "title" $title "thumbnail" $thumbnail "icon" $icon )}}</div>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col col-lg-3 d-none d-lg-block"></div>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
@@ -1,17 +1,22 @@
|
|||||||
{{- $page := .page }}
|
{{- $page := .page }}
|
||||||
{{- $section := .section }}
|
{{- $section := .section }}
|
||||||
{{- if not $section }}{{ errorf "Missing value for param 'section'" }}{{ end -}}
|
{{- if not $section }}{{ errorf "partial [assets/section-list.html] - Missing value for param 'section'" }}{{ end -}}
|
||||||
{{- $home := .home }}
|
{{- $home := .home }}
|
||||||
{{ if ne (printf "%T" $home) "bool" }}
|
{{ if ne (printf "%T" $home) "bool" }}
|
||||||
{{ errorf "Invalid value for param 'home'"}}
|
{{ errorf "partial [assets/section-list.html] - Invalid value for param 'home'"}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{- $title := .title -}}
|
{{- $title := .title -}}
|
||||||
|
{{- $icon := .icon -}}
|
||||||
|
{{- $thumbnail := .thumbnail -}}
|
||||||
|
{{- $sectionHeader := .sectionHeader -}}
|
||||||
|
{{- $description := .description -}}
|
||||||
|
{{- $content := .content -}}
|
||||||
{{- $moreTitle := .moreTitle -}}
|
{{- $moreTitle := .moreTitle -}}
|
||||||
{{- $sectionURL := .sectionURL -}}
|
{{- $sectionURL := .sectionURL -}}
|
||||||
|
{{- $nested := .nested | default true -}}
|
||||||
{{- $paginate := true -}}
|
{{- $paginate := true -}}
|
||||||
{{- $sort := "date" -}}
|
{{- $sort := "date" -}}
|
||||||
{{- $reverse := true -}}
|
{{- $order := "desc" -}}
|
||||||
{{- $separator := false -}}
|
{{- $separator := false -}}
|
||||||
{{- $orientation := "stacked" -}}
|
{{- $orientation := "stacked" -}}
|
||||||
{{- $cols := 3 -}}
|
{{- $cols := 3 -}}
|
||||||
@@ -22,11 +27,18 @@
|
|||||||
{{- $style := "" -}}
|
{{- $style := "" -}}
|
||||||
{{- $homepage := 3 -}}
|
{{- $homepage := 3 -}}
|
||||||
{{- $background := "" -}}
|
{{- $background := "" -}}
|
||||||
|
{{- $layout := "card" -}}
|
||||||
|
{{- $pane := "none" -}}
|
||||||
|
{{- $type := "pills" -}}
|
||||||
|
{{- $vertical := "false" -}}
|
||||||
|
{{- $width := 100 -}}
|
||||||
|
|
||||||
{{- with (index site.Params $section) -}}
|
{{- with (index site.Params.sections $section) -}}
|
||||||
{{- with index . "title" }}{{ $title = . }}{{ end -}}
|
{{- with index . "title" }}{{ $title = or $.title . }}{{ end -}}
|
||||||
|
{{- with index . "sectionHeader" }}{{ $sectionHeader = . }}{{ end -}}
|
||||||
{{- with index . "sort" }}{{ $sort = . }}{{ end -}}
|
{{- with index . "sort" }}{{ $sort = . }}{{ end -}}
|
||||||
{{- if (index . "reverse") }}{{ $reverse = true }}{{ else }}{{ $reverse = false }}{{ end -}}
|
{{- if (index . "reverse") }}{{ $order = "desc" }}{{ else }}{{ $order = "asc" }}{{ end -}}
|
||||||
|
{{- if $home }}{{- if (isset . "nested") }}{{ $nested = (index . "nested") }}{{ end -}}{{ end -}}
|
||||||
{{- if (index . "separator") }}{{ $separator = true }}{{ else }}{{ $separator = false }}{{ end -}}
|
{{- if (index . "separator") }}{{ $separator = true }}{{ else }}{{ $separator = false }}{{ end -}}
|
||||||
{{- with index . "orientation" }}{{ $orientation = . }}{{ end -}}
|
{{- with index . "orientation" }}{{ $orientation = . }}{{ end -}}
|
||||||
{{- with index . "cols" }}{{ $cols = . }}{{ end -}}
|
{{- with index . "cols" }}{{ $cols = . }}{{ end -}}
|
||||||
@@ -37,53 +49,99 @@
|
|||||||
{{- with index . "style" }}{{ $style = . }}{{ end -}}
|
{{- with index . "style" }}{{ $style = . }}{{ end -}}
|
||||||
{{- with index . "homepage" }}{{ $homepage = . }}{{ end -}}
|
{{- with index . "homepage" }}{{ $homepage = . }}{{ end -}}
|
||||||
{{- with index . "background" }}{{ $background = . }}{{ end -}}
|
{{- with index . "background" }}{{ $background = . }}{{ end -}}
|
||||||
|
{{- with index . "layout" }}{{ $layout = . }}{{ end -}}
|
||||||
|
{{- with index . "pane" }}{{ $pane = . }}{{ end -}}
|
||||||
|
{{- with index . "type" }}{{ $type = . }}{{ end -}}
|
||||||
|
{{- with index . "vertical" }}{{ $vertical = . }}{{ end -}}
|
||||||
|
{{- with index . "width" }}{{ $width = . }}{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{ if ne (printf "%T" $nested) "bool" }}
|
||||||
|
{{ errorf "partial [assets/section-list.html] - Invalid value for param 'nested'"}}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $list := "" }}
|
||||||
|
{{ if $nested }}
|
||||||
|
{{ $list = where site.RegularPages "Type" "in" $section }}
|
||||||
|
{{ else if $home }}
|
||||||
|
{{ $sectionPage := site.GetPage "section" $section }}
|
||||||
|
{{ $list = $sectionPage.RegularPages }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $list = $page.RegularPages }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $max := (len $list) -}}
|
||||||
|
{{ if eq $max 0 }}
|
||||||
|
{{- $bundle := site.GetPage $section -}}
|
||||||
|
{{- $list = $bundle.Resources.Match "*" -}}
|
||||||
|
{{- $max = len $list -}}
|
||||||
|
{{ end }}
|
||||||
|
{{- $list = sort $list (printf "Params.%s" $sort) $order -}}
|
||||||
|
|
||||||
|
{{- $supportedLayouts := slice "card" "list" "nav" -}}
|
||||||
|
{{- if not (in $supportedLayouts $layout) -}}
|
||||||
|
{{- errorf "partial [assets/section-list.html] - Invalid value for param 'layout': %s" $layout -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- $list := where site.RegularPages "Type" "in" $section -}}
|
{{ if gt $max 0 }}
|
||||||
{{- $max := (len $list) -}}
|
{{- if $home -}}
|
||||||
{{- if $home -}}
|
{{- $paginate = false -}}
|
||||||
{{- $paginate = false -}}
|
{{- $max = int (math.Min $homepage $max) -}}
|
||||||
{{- $max = int (math.Min $homepage $max) -}}
|
{{ end -}}
|
||||||
{{ end -}}
|
{{- $cols = int (math.Min $cols $max) -}}
|
||||||
|
|
||||||
{{- $cols = int (math.Min $cols $max) -}}
|
{{- $params := (dict
|
||||||
|
|
||||||
{{- if eq $sort "weight" -}}
|
|
||||||
{{- $list = $list.ByWeight -}}
|
|
||||||
{{- else if eq $sort "publication" -}}
|
|
||||||
{{- $list = $list.ByPublishDate -}}
|
|
||||||
{{- else if eq $sort "expiration" -}}
|
|
||||||
{{- $list = $list.ByExpiryDate -}}
|
|
||||||
{{- else if eq $sort "lastmod" -}}
|
|
||||||
{{- $list = $list.ByLastmod -}}
|
|
||||||
{{- else if eq $sort "length" -}}
|
|
||||||
{{- $list = $list.ByLength -}}
|
|
||||||
{{- else if eq $sort "title" -}}
|
|
||||||
{{- $list = $list.ByTitle -}}
|
|
||||||
{{- else if eq $sort "linktitle" -}}
|
|
||||||
{{- $list = $list.ByLinkTitle -}}
|
|
||||||
{{- else if ne $sort "date" -}}
|
|
||||||
{{- $list = $list.ByParam $sort -}}
|
|
||||||
{{- end -}}
|
|
||||||
{{- if $reverse -}}{{- $list = $list.Reverse -}}{{ end -}}
|
|
||||||
|
|
||||||
<div class="container-xxl flex-fill p-0{{ with $background }} bg-{{ . }}{{ end }}">
|
|
||||||
{{- partial "assets/card-group.html" (dict
|
|
||||||
"page" $page
|
"page" $page
|
||||||
"list" $list
|
"list" $list
|
||||||
"max" $max
|
|
||||||
"cols" $cols
|
|
||||||
"title" $title
|
"title" $title
|
||||||
"href" $sectionURL
|
"icon" $icon
|
||||||
"hrefTitle" $moreTitle
|
"thumbnail" $thumbnail
|
||||||
"separator" $separator
|
"sectionHeader" $sectionHeader
|
||||||
"paginate" $paginate
|
"description" $description
|
||||||
|
"content" $content
|
||||||
"class" $style
|
"class" $style
|
||||||
"orientation" $orientation
|
|
||||||
"color" $color
|
"color" $color
|
||||||
"padding" $padding
|
)
|
||||||
"header" $header
|
|
||||||
"footer" $footer
|
|
||||||
)
|
|
||||||
-}}
|
-}}
|
||||||
</div>
|
{{- $partial := "" -}}
|
||||||
|
|
||||||
|
<div class="container-fluid {{ with $background }} bg-{{ . }}{{ end }}">
|
||||||
|
<div class="container-xxl flex-fill p-0">
|
||||||
|
{{- partial "assets/section-header.html" $params -}}
|
||||||
|
|
||||||
|
{{ if eq $layout "card" }}
|
||||||
|
{{- $partial = "assets/card-group.html" -}}
|
||||||
|
{{- $params = merge $params (dict
|
||||||
|
"max" $max
|
||||||
|
"cols" $cols
|
||||||
|
"href" $sectionURL
|
||||||
|
"hrefTitle" $moreTitle
|
||||||
|
"separator" $separator
|
||||||
|
"paginate" $paginate
|
||||||
|
"orientation" $orientation
|
||||||
|
"padding" $padding
|
||||||
|
"header" $header
|
||||||
|
"footer" $footer
|
||||||
|
)
|
||||||
|
-}}
|
||||||
|
{{ else if eq $layout "nav" }}
|
||||||
|
{{- $partial = "assets/nav.html" -}}
|
||||||
|
{{- $params = merge $params (dict
|
||||||
|
"layout" $layout
|
||||||
|
"id" $section
|
||||||
|
"pane" $pane
|
||||||
|
"type" $type
|
||||||
|
"vertical" $vertical
|
||||||
|
"width" $width
|
||||||
|
)
|
||||||
|
-}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $partial = "assets/list.html" -}}
|
||||||
|
{{- $params = merge $params (dict
|
||||||
|
"layout" $layout
|
||||||
|
)
|
||||||
|
-}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- partial $partial $params -}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
28
layouts/partials/assets/sharing.html
Normal file
28
layouts/partials/assets/sharing.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{{- if .Site.Params.sharing.enabled -}}
|
||||||
|
{{- if or .Params.sharing (not (isset .Params "sharing")) -}}
|
||||||
|
{{- $page := . -}}
|
||||||
|
{{- $order := "asc" -}}
|
||||||
|
{{- $list := .Site.Params.sharing.providers -}}
|
||||||
|
{{- if .Site.Params.sharing.reverse }}{{ $order = "desc" }}{{ else }}{{ $order = "asc" }}{{ end -}}
|
||||||
|
{{- $sort := .Site.Params.sharing.sort | default "weight" -}}
|
||||||
|
{{- $list = sort $list $sort $order -}}
|
||||||
|
<div class="py-3 text-body-secondary">
|
||||||
|
{{ T "shareLink" }}
|
||||||
|
{{- range $index, $item := $list -}}
|
||||||
|
{{- $url := $item.url -}}
|
||||||
|
{{- $url = replace $url "{url}" $page.Permalink -}}
|
||||||
|
{{- $url = replace $url "{title}" (urlquery $page.Title) -}}
|
||||||
|
{{- $url = $url | safeURL -}}
|
||||||
|
{{- $target := "" -}}
|
||||||
|
{{- $clipboard := "" -}}
|
||||||
|
{{- if .clipboard -}}
|
||||||
|
{{- $target = (printf "toast-message-%s-%d" (anchorize $item.name) $index ) -}}
|
||||||
|
{{- $clipboard = $url -}}
|
||||||
|
{{- $url = "#!" -}}
|
||||||
|
{{- partial "assets/toast.html" (dict "id" $target "message" (printf "%s %s" (T "link") (T "copiedToClipboard"))) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{ partial "assets/button.html" (dict "toast" $target "clipboard" $clipboard "href" $url "icon" $item.icon "class" "btn-social px-1" )}}
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
@@ -1,58 +0,0 @@
|
|||||||
{{- $page := .page }}
|
|
||||||
{{- $section := .section }}
|
|
||||||
{{- if not $section }}{{ errorf "Missing value for param 'section'" }}{{ end -}}
|
|
||||||
{{- $bundle := site.GetPage $section -}}
|
|
||||||
|
|
||||||
{{- $title := $bundle.Title -}}
|
|
||||||
{{- $sort := "date" -}}
|
|
||||||
{{- $order := "desc" -}}
|
|
||||||
{{- $style := "" -}}
|
|
||||||
{{- $background := "" -}}
|
|
||||||
{{- $color := "" -}}
|
|
||||||
{{- $layout := "tabs" -}}
|
|
||||||
|
|
||||||
{{- with (index site.Params $section) -}}
|
|
||||||
{{- with index . "title" }}{{ $title = . }}{{ end -}}
|
|
||||||
{{- with index . "sort" }}{{ $sort = . }}{{ end -}}
|
|
||||||
{{- if (index . "reverse") }}{{ $order = "desc" }}{{ else }}{{ $order = "asc" }}{{ end -}}
|
|
||||||
{{- with index . "style" }}{{ $style = . }}{{ end -}}
|
|
||||||
{{- with index . "background" }}{{ $background = . }}{{ end -}}
|
|
||||||
{{- with index . "color" }}{{ $color = . }}{{ end -}}
|
|
||||||
{{- with index . "layout" }}{{ $layout = . }}{{ end -}}
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
{{- $list := $bundle.Resources.Match "*" -}}
|
|
||||||
{{- $list = sort $list (printf "Params.%s" $sort) $order -}}
|
|
||||||
|
|
||||||
<div class="container-fluid {{ with $background }} bg-{{ . }}{{ end }}">
|
|
||||||
<div class="container-xxl flex-fill p-0">
|
|
||||||
{{ if eq $layout "tabs" }}
|
|
||||||
<div class="p-0">
|
|
||||||
{{ with $title }}<p class="display-4 pt-5{{ if and page.IsHome site.Params.home.centerHeadline }} text-center{{ end }}">{{ . }}</p>{{ end }}
|
|
||||||
<div class="col-sm-12 col-md-10 col-lg-8 col-xl-6 mx-auto pt-5 pb-5">
|
|
||||||
{{- partial "assets/nav.html" (dict
|
|
||||||
"page" $page
|
|
||||||
"list" $list
|
|
||||||
"title" $title
|
|
||||||
"class" $style
|
|
||||||
"color" $color
|
|
||||||
"layout" $layout
|
|
||||||
)
|
|
||||||
-}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{- else -}}
|
|
||||||
<div class=" p-0">
|
|
||||||
{{- partial "assets/list.html" (dict
|
|
||||||
"page" $page
|
|
||||||
"list" $list
|
|
||||||
"title" $title
|
|
||||||
"class" $style
|
|
||||||
"color" $color
|
|
||||||
"layout" $layout
|
|
||||||
)
|
|
||||||
-}}
|
|
||||||
</div>
|
|
||||||
{{- end -}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
28
layouts/partials/assets/toast.html
Normal file
28
layouts/partials/assets/toast.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<!--
|
||||||
|
Prepares a toast message. Use a trigger to display the message. The shortcode supports the following arguments:
|
||||||
|
"id" Optional id of the toast message, defaults to "toast-message-0".
|
||||||
|
"header": Optional header of the toast message.
|
||||||
|
"message": Required toast message.
|
||||||
|
-->
|
||||||
|
|
||||||
|
{{- $id := printf "toast-message-%d" 0 -}}
|
||||||
|
{{ with .id }}
|
||||||
|
{{ $id = . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $header := .header -}}
|
||||||
|
{{ if not $header -}}
|
||||||
|
{{ $header = site.Title -}}
|
||||||
|
{{ end -}}
|
||||||
|
{{- $message := .message -}}
|
||||||
|
{{ if not $message -}}
|
||||||
|
{{- errorf "partial [assets/toast.html] - Missing message text" -}}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
|
<div id="{{ $id }}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||||
|
<div class="toast-header">
|
||||||
|
{{ with $header }}<strong class="me-auto">{{ . }}</strong>{{ end }}
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="toast-body">{{ $message }}</div>
|
||||||
|
</div>
|
23
layouts/partials/assets/toc-dropdown.html
Normal file
23
layouts/partials/assets/toc-dropdown.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{{ $items := len (findRE "<li.*?>(.|\n)*?</li>" .TableOfContents) -}}
|
||||||
|
{{ if (gt $items 1) -}}
|
||||||
|
<div class="d-grid gap-2 mx-auto">
|
||||||
|
{{ partial "assets/button.html" (dict
|
||||||
|
"title" (T "toc")
|
||||||
|
"color" "secondary"
|
||||||
|
"outline" "true"
|
||||||
|
"class" "toc-button"
|
||||||
|
"icon" "fas sort"
|
||||||
|
"justify" "between"
|
||||||
|
"collapse" "toc-collapse"
|
||||||
|
"order" "last")
|
||||||
|
-}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<div class="collapse border bg-body-tertiary rounded p-1 navbar-nav-scroll" id="toc-collapse">
|
||||||
|
<div class="toc toc-panel text-body-secondary p-2">
|
||||||
|
<small>{{ .TableOfContents }}</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</p>
|
||||||
|
{{ end -}}
|
@@ -1,6 +1,6 @@
|
|||||||
{{ $items := len (findRE "<li.*?>(.|\n)*?</li>" .TableOfContents) -}}
|
{{ $items := len (findRE "<li.*?>(.|\n)*?</li>" .TableOfContents) -}}
|
||||||
{{ if (gt $items 1) -}}
|
{{ if (gt $items 1) -}}
|
||||||
<div class="toc mb-5 my-md-0 ps-xl-3 mb-lg-5 p-3 text-body-secondary sticky-top">
|
<div class="toc toc-sidebar mb-5 my-md-0 ps-xl-3 mb-lg-5 p-3 text-body-secondary sticky-top">
|
||||||
<strong class="d-block h6 my-2 pb-2 border-bottom">{{ T "toc" }}</strong>
|
<strong class="d-block h6 my-2 pb-2 border-bottom">{{ T "toc" }}</strong>
|
||||||
{{ .TableOfContents }}
|
{{ .TableOfContents }}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,8 +0,0 @@
|
|||||||
<nav aria-label="breadcrumb">
|
|
||||||
<ol class="breadcrumb">
|
|
||||||
{{- range .Page.Ancestors.Reverse -}}
|
|
||||||
<li class="breadcrumb-item"><a href="{{ .Permalink }}">{{ if not .IsHome }}{{ .Title }}{{ else }}{{ T "home" }}{{ end }}</a></li>
|
|
||||||
{{- end -}}
|
|
||||||
<li class="breadcrumb-item active" aria-current="page">{{ .Page.Title }}</li>
|
|
||||||
</ol>
|
|
||||||
</nav>
|
|
@@ -1,105 +0,0 @@
|
|||||||
<!--
|
|
||||||
Displays a button. The shortcode supports the following arguments:
|
|
||||||
"title" Required title of the button.
|
|
||||||
"href" Optional address for the button or hyperlink.
|
|
||||||
"id" Optional id of the button, to be used in the DOM.
|
|
||||||
"state" Optional state of the button, either "enabled" (default), "disabled", "active", or "inactive".
|
|
||||||
"size" Optional size of the button, either "sm", "md" (default), or "lg".
|
|
||||||
"color" Optional theme color of the element, either "primary" (default), "secondary", "success",
|
|
||||||
"danger", "warning", "info", "light", "dark", "white", or "black".
|
|
||||||
"outline" Optional flag indicating the button should be outlined, either "false" (default) or "true".
|
|
||||||
"badge" Optional positioned badge to display on top of the button.
|
|
||||||
"aria-label" Optional assistive label for the badge.
|
|
||||||
"tooltip" Optional text to display in a tooltip. Cannot be used together with collapse. Ignored for active/
|
|
||||||
inactive buttons.
|
|
||||||
"collapse" Optional panel to collapse. Cannot be used together with tooltip. Ignored for active/inactive buttons.
|
|
||||||
"type" Optional type of the element, either "link" or "button" (default).
|
|
||||||
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
|
|
||||||
-->
|
|
||||||
|
|
||||||
{{ $title := trim .title " \r\n" -}}
|
|
||||||
{{ if not $title -}}
|
|
||||||
{{ errorf "Missing element title" -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $id := .id }}
|
|
||||||
|
|
||||||
{{ $state := "enabled" -}}
|
|
||||||
{{ with .state }}{{ $state = . }}{{ end -}}
|
|
||||||
{{ $supportedStates := slice "enabled" "disabled" "active" "inactive" -}}
|
|
||||||
{{ if not (in $supportedStates $state) -}}
|
|
||||||
{{ errorf "Invalid value for param 'state': %s" $state -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $size := "md" -}}
|
|
||||||
{{ with .size }}{{ $size = . }}{{ end -}}
|
|
||||||
{{ $supportedSizes := slice "sm" "md" "lg" -}}
|
|
||||||
{{ if not (in $supportedSizes $size) -}}
|
|
||||||
{{ errorf "Invalid value for param 'size': %s" $size -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $color := "primary" -}}
|
|
||||||
{{ with .color }}{{ $color = . }}{{ end -}}
|
|
||||||
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" -}}
|
|
||||||
{{ if not (in $supportedColors $color) -}}
|
|
||||||
{{ errorf "Invalid value for param 'color': %s" $color -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $outline := false -}}
|
|
||||||
{{ with .outline }}{{ $outline = . }}{{ end -}}
|
|
||||||
|
|
||||||
{{ $badge := "" -}}
|
|
||||||
{{ with .badge }}{{ $badge = . }}{{ end -}}
|
|
||||||
|
|
||||||
{{ $label := "" -}}
|
|
||||||
{{ with .label }}{{ $label = . }}{{ end -}}
|
|
||||||
|
|
||||||
{{ $tooltip := "" -}}
|
|
||||||
{{ if not (strings.HasSuffix $state "active") -}}
|
|
||||||
{{ with .tooltip }}{{ $tooltip = . }}{{ end -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $href := .href -}}
|
|
||||||
|
|
||||||
{{ $collapse := "" -}}
|
|
||||||
{{ if not (strings.HasSuffix $state "active") -}}
|
|
||||||
{{ with .collapse }}{{ $collapse = . }}{{ $href = printf "#%s" . }}{{ end -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ if $tooltip -}}
|
|
||||||
{{ if $collapse -}}
|
|
||||||
{{ errorf "Cannot use tooltip and collapse at the same time" -}}
|
|
||||||
{{ end -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $type := "button" -}}
|
|
||||||
{{ with .type }}{{ $type = . }}{{ end -}}
|
|
||||||
{{ $supportedTypes := slice "button" "link" -}}
|
|
||||||
{{ if not (in $supportedTypes $type) -}}
|
|
||||||
{{ errorf "Invalid value for param 'type': %s" $type -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $placement := "top" -}}
|
|
||||||
{{ with .placement }}{{ $placement = . }}{{ end -}}
|
|
||||||
{{ $supportedPlacements := slice "top" "bottom" "left" "right" -}}
|
|
||||||
{{ if not (in $supportedPlacements $placement) -}}
|
|
||||||
{{ errorf "Invalid value for param 'placement': %s" $placement -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
<a {{ if ne $state "disabled" }}{{ with $href }}href="{{ . }}"{{ end }}{{ end }}
|
|
||||||
{{ with $id }}id="{{ . }}"{{ end }}
|
|
||||||
{{ if eq $type "button" }}class="btn btn-{{ if $outline }}outline-{{ end }}{{ $color }} {{ if ne $size "md"}}btn-{{ $size }}{{ end }} position-relative {{ if in (slice "disabled" "active") $state }}{{ $state }}{{ end }}" role="button" {{ if eq $state "disabled" }}aria-disabled="true"{{ end }}
|
|
||||||
{{ else }}class="link-{{ $color }} position-relative"{{ end }}
|
|
||||||
{{ with $tooltip }}data-bs-toggle="tooltip" data-bs-title="{{ . }}" data-bs-placement="{{ $placement }}"{{ end }}
|
|
||||||
{{ with $collapse }}data-bs-toggle="collapse" aria-expanded="false" aria-controls="{{ . }}"{{ end }}
|
|
||||||
{{ if eq $state "active" }}data-bs-toggle="button" aria-pressed="true"{{ end }}
|
|
||||||
{{ if eq $state "inactive" }}data-bs-toggle="button" aria-pressed="false"{{ end }}
|
|
||||||
>
|
|
||||||
{{ $title -}}
|
|
||||||
{{ with $badge }}
|
|
||||||
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">
|
|
||||||
{{ . }}
|
|
||||||
{{ with $label }}<span class="visually-hidden">{{ . }}</span>{{ end }}
|
|
||||||
</span>
|
|
||||||
{{ end }}
|
|
||||||
</a>
|
|
@@ -1,6 +1,7 @@
|
|||||||
{{ $filename := .filename | default "js/main.bundle.js" -}}
|
{{ $filename := .filename | default "js/main.bundle.js" -}}
|
||||||
{{ $match := .match | default "{js/*.js,js/vendor/**.js}" }}
|
{{ $match := .match | default "{js/*.js,js/vendor/**.js}" }}
|
||||||
{{ $page := .page }}
|
{{ $page := .page }}
|
||||||
|
{{ $header := .header }}
|
||||||
|
|
||||||
{{ $files := slice -}}
|
{{ $files := slice -}}
|
||||||
{{ range $index, $file := resources.Match $match -}}
|
{{ range $index, $file := resources.Match $match -}}
|
||||||
@@ -11,6 +12,13 @@
|
|||||||
{{ $bundle := $files | resources.Concat $filename -}}
|
{{ $bundle := $files | resources.Concat $filename -}}
|
||||||
{{ $js := $bundle | resources.ExecuteAsTemplate $filename $page -}}
|
{{ $js := $bundle | resources.ExecuteAsTemplate $filename $page -}}
|
||||||
|
|
||||||
|
{{- if and (not site.IsServer) $header -}}
|
||||||
|
{{- $pc := site.Config.Privacy.GoogleAnalytics -}}
|
||||||
|
{{- if and (not $pc.Disable) (hasPrefix site.GoogleAnalytics "G-") }}
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.GoogleAnalytics }}"></script>
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
{{- if not hugo.IsProduction -}}
|
{{- if not hugo.IsProduction -}}
|
||||||
<script src="{{ $js.RelPermalink }}"></script>
|
<script src="{{ $js.RelPermalink }}"></script>
|
||||||
{{ else -}}
|
{{ else -}}
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col text-sm-start text-center col-sm-6 col-md-4">
|
<div class="col text-sm-start text-center col-sm-6 col-md-4">
|
||||||
{{ range .Site.Menus.social -}}
|
{{ range .Site.Menus.social -}}
|
||||||
<a href="{{ .URL | relURL }}" target="_blank" rel="noopener" aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
|
<a href="{{ .URL | relLangURL }}" target="_blank" rel="noopener noreferrer" aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
|
||||||
{{ .Pre | safeHTML }}
|
{{ .Pre | safeHTML }}
|
||||||
</a>
|
</a>
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
31
layouts/partials/footer/toast-container.html
Normal file
31
layouts/partials/footer/toast-container.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<!--
|
||||||
|
Defines a container to stack toast messages. By default, toast messages are displayed in the bottom right of the
|
||||||
|
viewport. Multiple toast messages are stacked vertically. Adjust the configuration by adjusting 'messages' in the
|
||||||
|
site parameters. The following arguments are supported:
|
||||||
|
"placement" Optional position of the toast messages relative to the viewport: "top-left", "top-center",
|
||||||
|
"top-right", "middle-left", "middle-center", "middle-right", "bottom-left", "bottom-center", or
|
||||||
|
"bottom-right" (default).
|
||||||
|
-->
|
||||||
|
|
||||||
|
{{- $placement := "bottom-right" -}}
|
||||||
|
{{- $position := "bottom-0 end-0" -}}
|
||||||
|
{{- with site.Params.messages.placement }}{{ $placement = . }}{{ end -}}
|
||||||
|
{{- $supportedPlacements := slice "top-left" "top-center" "top-right" "middle-left" "middle-center" "middle-right" "bottom-left" "bottom-center" "bottom-right" -}}
|
||||||
|
{{- if not (in $supportedPlacements $placement) -}}
|
||||||
|
{{- errorf "partial [footer/toast-container.html] - Invalid value for param 'placement': %s" $placement -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if eq $placement "top-left" }}{{ $position = "top-0 start-0" -}}
|
||||||
|
{{- else if eq $placement "top-center" }}{{ $position = "top-0 start-50 translate-middle-x" -}}
|
||||||
|
{{- else if eq $placement "top-right" }}{{ $position = "top-0 end-0" -}}
|
||||||
|
{{- else if eq $placement "middle-left" }}{{ $position = "top-50 start-0 translate-middle-y" -}}
|
||||||
|
{{- else if eq $placement "middle-center" }}{{ $position = "top-50 start-50 translate-middle" -}}
|
||||||
|
{{- else if eq $placement "middle-right" }}{{ $position = "top-50 end-0 translate-middle-y" -}}
|
||||||
|
{{- else if eq $placement "bottom-left" }}{{ $position = "bottom-0 start-0" -}}
|
||||||
|
{{- else if eq $placement "bottom-center" }}{{ $position = "bottom-0 start-50 translate-middle-x" -}}
|
||||||
|
{{- else if eq $placement "bottom-right" }}{{ $position = "bottom-0 end-0" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<div id="toast-container" class="toast-container position-fixed {{ $position }} p-3">
|
||||||
|
{{- partial "assets/toast.html" (dict "id" "toast-copied-code-message" "message" (printf "%s %s" (T "code") (T "copiedToClipboard"))) -}}
|
||||||
|
</div>
|
@@ -30,7 +30,7 @@
|
|||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- if not hugo.IsProduction -}}
|
{{- if not hugo.IsProduction -}}
|
||||||
<link rel="stylesheet" href="{{ $css.Permalink | relURL }}">
|
<link rel="stylesheet" href="{{ $css.Permalink }}">
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- $css = $css | fingerprint | resources.PostProcess -}}
|
{{- $css = $css | fingerprint | resources.PostProcess -}}
|
||||||
<link rel="stylesheet" href="{{ $css.Permalink }}" integrity="{{ $css.Data.Integrity }}" crossorigin="anonymous">
|
<link rel="stylesheet" href="{{ $css.Permalink }}" integrity="{{ $css.Data.Integrity }}" crossorigin="anonymous">
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<!-- Copied from doks -->
|
<!-- Copied from doks -->
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<meta name="twitter:site" content="{{ .Site.Params.twitterSite }}">
|
{{ with .Site.Params.twitterSite }}<meta name="twitter:site" content="{{ . }}">{{ end }}
|
||||||
<meta name="twitter:creator" content="{{ .Site.Params.twitterCreator }}">
|
{{ with .Site.Params.twitterCreator }}<meta name="twitter:creator" content="{{ . }}">{{ end }}
|
||||||
<meta name="twitter:title" content="{{ $.Scratch.Get "title" }}">
|
<meta name="twitter:title" content="{{ $.Scratch.Get "title" }}">
|
||||||
<meta name="twitter:description" content="{{ $.Scratch.Get "description" }}">
|
<meta name="twitter:description" content="{{ $.Scratch.Get "description" }}">
|
||||||
<meta name="twitter:image" content="{{ $.Scratch.Get "thumbnail" }}">
|
<meta name="twitter:image" content="{{ $.Scratch.Get "thumbnail" }}">
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col col-sm-6 col-md-4">
|
<div class="col col-sm-6 col-md-4">
|
||||||
{{ if .Site.Params.home.featurePhoto }}
|
{{ if .Site.Params.home.featurePhoto }}
|
||||||
{{- partial "image.html" (dict "url" .Site.Params.home.featurePhoto "ratio" "4x3" "outerClass" "img-wrap" "innerClass" "rounded" "title" .Site.Title) -}}
|
{{- partial "assets/image.html" (dict "url" .Site.Params.home.featurePhoto "ratio" "4x3" "outerClass" "img-wrap" "innerClass" "rounded" "title" .Site.Title) -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-md-2 d-none d-md-block"></div>
|
<div class="col col-md-2 d-none d-md-block"></div>
|
||||||
|
@@ -1 +1,6 @@
|
|||||||
{{ return index .Site.Data .Section }}
|
{{- $menu := "" -}}
|
||||||
|
{{- if .IsPage -}}
|
||||||
|
{{- $menu = index .Site.Data .Section -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- return $menu -}}
|
@@ -1,5 +1,5 @@
|
|||||||
{{ $lastmodstr := (partial "utilities/date.html" (dict "date" .Lastmod "format" "long")) -}}
|
{{ $lastmodstr := (partial "utilities/date.html" (dict "date" .Lastmod "format" "long")) -}}
|
||||||
Last updated: {{ $lastmodstr }}
|
Last updated: {{ $lastmodstr }}
|
||||||
{{ with .GitInfo }}
|
{{ with .GitInfo }}
|
||||||
• <a href="{{ site.Params.schema.gitHub }}/commit/{{ .Hash }}">{{ .Subject }} ({{ .AbbreviatedHash }})</a>
|
• <a href="{{ site.Params.docs.github | default site.Params.schema.github }}/commit/{{ .Hash }}">{{ .Subject }} ({{ .AbbreviatedHash }})</a>
|
||||||
{{ end -}}
|
{{ end -}}
|
@@ -5,13 +5,19 @@
|
|||||||
"show" Optional flag to indicate an item should be shown as collapsed.
|
"show" Optional flag to indicate an item should be shown as collapsed.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
{{- $id := .Ordinal -}}
|
||||||
|
{{- $parent := printf "accordion-%d" .Parent.Ordinal -}}
|
||||||
|
{{- with (.Parent.Get "id") -}}
|
||||||
|
{{- $parent = . -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
{{- $id := .Ordinal -}}
|
{{- $id := .Ordinal -}}
|
||||||
{{ $header := .Get "header" -}}
|
{{ $header := .Get "header" -}}
|
||||||
{{ if not $header -}}
|
{{ if not $header -}}
|
||||||
{{ if .Parent }}
|
{{ if .Parent }}
|
||||||
{{ errorf "Missing value for param 'header': %s" .Parent.Position -}}
|
{{ errorf "Missing value for param 'header': %s" .Parent.Position -}}
|
||||||
{{ else }}
|
{{ else }}
|
||||||
{{ errorf "Missing value for param 'header': %s" .Position -}}
|
{{ errorf "Missing value for param 'header': %s" .Position -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
@@ -35,8 +41,6 @@
|
|||||||
{{ errorf "Invalid value for param 'show': %s" $showParam -}}
|
{{ errorf "Invalid value for param 'show': %s" $showParam -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{- $parent := printf "accordion-%d" .Parent.Ordinal -}}
|
|
||||||
|
|
||||||
<div class="accordion-item">
|
<div class="accordion-item">
|
||||||
{{- with $header -}}
|
{{- with $header -}}
|
||||||
<h2 class="accordion-header m-0" id="{{ $parent }}-heading-{{ $id }}">
|
<h2 class="accordion-header m-0" id="{{ $parent }}-heading-{{ $id }}">
|
||||||
|
@@ -1,12 +1,34 @@
|
|||||||
<!--
|
<!--
|
||||||
Displays a group of vertically collapsing and expanding items. Add accordion-item inner elements for each accordion
|
Displays a group of vertically collapsing and expanding items. Add accordion-item inner elements for each accordion
|
||||||
item. The shortcode supports the following arguments:
|
item. The shortcode supports the following arguments:
|
||||||
|
"id": Optional id of the accordion, defaults to "accordion-" with a sequential number.
|
||||||
|
"always-open": Optional flag to make accordion items stay open when another item is opened.
|
||||||
"class": Optional class attribute of the accordion element, e.g. “w-50”.
|
"class": Optional class attribute of the accordion element, e.g. “w-50”.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
{{- $id := .Ordinal -}}
|
{{- $id := printf "accordion-%d" .Ordinal -}}
|
||||||
|
{{ with .Get "id" }}
|
||||||
|
{{ $id = . }}
|
||||||
|
{{ end }}
|
||||||
{{- $class := .Get "class" -}}
|
{{- $class := .Get "class" -}}
|
||||||
|
|
||||||
<div id="accordion-{{ $id }}" class="accordion mb-3{{ with $class }} {{ . }}{{ end }}">
|
{{- $openParam := "false" -}}
|
||||||
{{- .Inner -}}
|
{{- $open := false -}}
|
||||||
|
{{- with .Get "always-open" }}{{ $openParam = . }}{{ end -}}
|
||||||
|
{{- $supportedFlags := slice "true" "false" -}}
|
||||||
|
{{- if in $supportedFlags $openParam -}}
|
||||||
|
{{- if eq $openParam "true" }}{{ $open = true }}{{ end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- errorf "Invalid value for param 'always-open': %s" .Position -}}
|
||||||
|
{{- $error = true -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $body := .Inner -}}
|
||||||
|
{{- if $open -}}
|
||||||
|
{{- $pattern := printf "data-bs-parent=\"#%s\"" $id -}}
|
||||||
|
{{- $body = (replace .Inner $pattern "") | markdownify | safeHTML }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<div id="{{ $id }}" class="accordion mb-3{{ with $class }} {{ . }}{{ end }}">
|
||||||
|
{{- $body -}}
|
||||||
</div>
|
</div>
|
@@ -6,15 +6,19 @@
|
|||||||
"icon" Optional class and name of a Font Awesome icon to include.
|
"icon" Optional class and name of a Font Awesome icon to include.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
{{- $error := false -}}
|
||||||
{{ $color := "primary" -}}
|
{{ $color := "primary" -}}
|
||||||
{{ with .Get "color" }}{{ $color = . }}{{ end -}}
|
{{ with .Get "color" }}{{ $color = . }}{{ end -}}
|
||||||
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" -}}
|
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" -}}
|
||||||
{{ if not (in $supportedColors $color) -}}
|
{{ if not (in $supportedColors $color) -}}
|
||||||
{{ errorf "Invalid value for param 'color': %s" .Position -}}
|
{{ errorf "Invalid value for param 'color': %s" .Position -}}
|
||||||
{{ $color = "primary" -}}
|
{{ $error = true -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{ $icon := .Get "icon" }}
|
{{ $icon := "" }}
|
||||||
|
{{ with .Get "icon" }}
|
||||||
|
{{ $icon = partial "assets/icon.html" (dict "icon" (printf "%s fa-2x fa-pull-left" .)) }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{ $dismissibleParam := "false" -}}
|
{{ $dismissibleParam := "false" -}}
|
||||||
{{ $dismissible := false -}}
|
{{ $dismissible := false -}}
|
||||||
@@ -24,10 +28,13 @@
|
|||||||
{{ if eq $dismissibleParam "true" }}{{ $dismissible = true }}{{ end -}}
|
{{ if eq $dismissibleParam "true" }}{{ $dismissible = true }}{{ end -}}
|
||||||
{{ else -}}
|
{{ else -}}
|
||||||
{{ errorf "Invalid value for param 'dismissible': %s" .Position -}}
|
{{ errorf "Invalid value for param 'dismissible': %s" .Position -}}
|
||||||
|
{{ $error = true -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
<div class="alert alert-{{ $color }} {{ if $dismissible }}alert-dismissible fade show{{ end }}" role="alert">
|
{{- if not $error -}}
|
||||||
{{ with $icon }}<i class="{{ . }} fa-2x fa-pull-left"></i>{{ end }}
|
<div class="alert alert-{{ $color }} {{ if $dismissible }}alert-dismissible fade show{{ end }}" role="alert">
|
||||||
{{ trim .Inner " \r\n" | markdownify | safeHTML -}}
|
{{ with $icon }}{{ . }}{{ end }}
|
||||||
{{ if $dismissible }}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>{{ end }}
|
{{ trim .Inner " \r\n" | markdownify | safeHTML -}}
|
||||||
</div>
|
{{ if $dismissible }}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>{{ end }}
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
@@ -15,5 +15,5 @@
|
|||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- if not $error -}}
|
{{- if not $error -}}
|
||||||
{{- partial "breadcrumb.html" $page -}}
|
{{- partial "assets/breadcrumb.html" $page -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
@@ -14,6 +14,7 @@
|
|||||||
inactive buttons.
|
inactive buttons.
|
||||||
"collapse" Optional panel to collapse. Cannot be used together with tooltip. Ignored for active/inactive buttons.
|
"collapse" Optional panel to collapse. Cannot be used together with tooltip. Ignored for active/inactive buttons.
|
||||||
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
|
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
|
||||||
|
"toast" Optional id of the toast to display when the button is clicked.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
{{ $error := false }}
|
{{ $error := false }}
|
||||||
@@ -77,6 +78,23 @@
|
|||||||
{{ $error = true }}
|
{{ $error = true }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
|
{{- $toast := .Get "toast" -}}
|
||||||
|
|
||||||
{{ if not $error }}
|
{{ if not $error }}
|
||||||
{{- partial "button.html" (dict "type" $type "title" $title "size" $size "color" $color "outline" $outline "badge" $badge "label" $label "tooltip" $tooltip "collapse" $collapse "href" $href "id" $id "state" $state "placement" $placement) -}}
|
{{- partial "assets/button.html" (dict
|
||||||
|
"type" $type
|
||||||
|
"title" $title
|
||||||
|
"size" $size
|
||||||
|
"color" $color
|
||||||
|
"outline" $outline
|
||||||
|
"badge" $badge
|
||||||
|
"label" $label
|
||||||
|
"tooltip" $tooltip
|
||||||
|
"collapse" $collapse
|
||||||
|
"href" $href
|
||||||
|
"id" $id
|
||||||
|
"state" $state
|
||||||
|
"placement" $placement
|
||||||
|
"toast" $toast)
|
||||||
|
-}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
@@ -1,18 +1,23 @@
|
|||||||
<!--
|
<!--
|
||||||
Displays a carousel of several responsive images (see the image shortcode for more details). Add inner <img>
|
Displays a carousel of several responsive images (see the image shortcode for more details). Add inner <img>
|
||||||
elements to define individual image slides. The shortcode supports the following arguments:
|
elements to define individual image slides. The shortcode supports the following arguments:
|
||||||
|
"id": Optional id of the carousel, defaults to "carousel-" with a sequential number.
|
||||||
"ratio": Optional ratio of the image, either "1x1", "4x3", "16x9", or "21x9". Other values are ignored.
|
"ratio": Optional ratio of the image, either "1x1", "4x3", "16x9", or "21x9". Other values are ignored.
|
||||||
Instead, the original aspect ratio of the image is preserved.
|
Instead, the original aspect ratio of the image is preserved.
|
||||||
"class": Optional class attribute of the carousel element, e.g. “w-75”.
|
"class": Optional class attribute of the carousel element, e.g. “w-75”.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
{{- $id := printf "carousel-%d" .Ordinal -}}
|
||||||
|
{{ with .Get "id" }}
|
||||||
|
{{ $id = . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{ $ratio := .Get "ratio" -}}
|
{{ $ratio := .Get "ratio" -}}
|
||||||
{{ $class := .Get "class" -}}
|
{{ $class := .Get "class" -}}
|
||||||
{{ $id := .Ordinal -}}
|
|
||||||
{{ $images := .Inner -}}
|
{{ $images := .Inner -}}
|
||||||
{{ $items := len (findRE "carousel-item" $images) -}}
|
{{ $items := len (findRE "carousel-item" $images) -}}
|
||||||
|
|
||||||
<div id="carousel-{{ $id }}" class="carousel slide mb-3{{ with $class }} {{ . }}{{ end }}" data-bs-ride="true">
|
<div id="{{ $id }}" class="carousel slide mb-3{{ with $class }} {{ . }}{{ end }}" data-bs-ride="true">
|
||||||
<div class="carousel-indicators">
|
<div class="carousel-indicators">
|
||||||
{{ range $index := (seq $items) -}}
|
{{ range $index := (seq $items) -}}
|
||||||
<button type="button" data-bs-target="#carousel-{{ $id }}" data-bs-slide-to="{{ sub $index 1 }}" {{ if eq $index 1 }}class="active"{{ end }} aria-current="true" aria-label="Slide {{ $index }}"></button>
|
<button type="button" data-bs-target="#carousel-{{ $id }}" data-bs-slide-to="{{ sub $index 1 }}" {{ if eq $index 1 }}class="active"{{ end }} aria-current="true" aria-label="Slide {{ $index }}"></button>
|
||||||
@@ -21,11 +26,11 @@
|
|||||||
<div class="carousel-inner">
|
<div class="carousel-inner">
|
||||||
{{ $images }}
|
{{ $images }}
|
||||||
</div>
|
</div>
|
||||||
<button class="carousel-control-prev" type="button" data-bs-target="#carousel-{{ $id }}" data-bs-slide="prev">
|
<button class="carousel-control-prev" type="button" data-bs-target="#{{ $id }}" data-bs-slide="prev">
|
||||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||||
<span class="visually-hidden">Previous</span>
|
<span class="visually-hidden">Previous</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="carousel-control-next" type="button" data-bs-target="#carousel-{{ $id }}" data-bs-slide="next">
|
<button class="carousel-control-next" type="button" data-bs-target="#{{ $id }}" data-bs-slide="next">
|
||||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||||
<span class="visually-hidden">Next</span>
|
<span class="visually-hidden">Next</span>
|
||||||
</button>
|
</button>
|
||||||
|
@@ -35,7 +35,7 @@
|
|||||||
{{ errorf "Invalid value for param 'mode': %s" $modeParam -}}
|
{{ errorf "Invalid value for param 'mode': %s" $modeParam -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{- partial "image.html" (dict
|
{{- partial "assets/image.html" (dict
|
||||||
"url" $url
|
"url" $url
|
||||||
"ratio" $ratio
|
"ratio" $ratio
|
||||||
"innerClass" $class
|
"innerClass" $class
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
{{- if $src -}}
|
{{- if $src -}}
|
||||||
<div class="carousel-item {{ if eq .Ordinal 0 }}active{{ end }}">
|
<div class="carousel-item {{ if eq .Ordinal 0 }}active{{ end }}">
|
||||||
{{ partial "image.html" (dict "url" $src "ratio" $ratio "innerClass" "d-block w-100") }}
|
{{ partial "assets/image.html" (dict "url" $src "ratio" $ratio "innerClass" "d-block w-100") }}
|
||||||
<div class="carousel-caption gradient"></div>
|
<div class="carousel-caption gradient"></div>
|
||||||
{{ with $caption }}
|
{{ with $caption }}
|
||||||
<div class="carousel-caption d-none d-md-block">
|
<div class="carousel-caption d-none d-md-block">
|
||||||
|
@@ -2,13 +2,15 @@
|
|||||||
Displays a navigation header with a toggler. The menu items are derived from the site's configuration. Nested items
|
Displays a navigation header with a toggler. The menu items are derived from the site's configuration. Nested items
|
||||||
are supported at one-level depth. The navigation bar includes a search area and a language switcher if applicable.
|
are supported at one-level depth. The navigation bar includes a search area and a language switcher if applicable.
|
||||||
The shortcode supports the following arguments:
|
The shortcode supports the following arguments:
|
||||||
|
"id" Optional id of the navbar toggler, defaults to "navbar-collapse-n" with a sequential number n
|
||||||
|
starting at 1.
|
||||||
"path" Required path of the active page.
|
"path" Required path of the active page.
|
||||||
"menus" Optional name of the menu configuration, defaults to "main".
|
"menus" Optional name of the menu configuration, defaults to "main".
|
||||||
"size" Optional breakpoint of the navbar toggler, either "xs", "sm", "md" (default), "lg", or "xl".
|
"size" Optional breakpoint of the navbar toggler, either "xs", "sm", "md" (default), "lg", or "xl".
|
||||||
"style" Optional style of the navbar, either "light" (default) or "dark".
|
"style" Optional style of the navbar, either "light" (default) or "dark".
|
||||||
"color" Optional background color of the navbar, either "primary", "secondary", "success",
|
"color" Optional background color of the navbar, either "primary", "secondary", "success",
|
||||||
"danger", "warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". The
|
"danger", "warning", "info", "white", "black", "body", or "body-tertiary". The default color is
|
||||||
default color is none.
|
none.
|
||||||
"mode" Optional flag to include a color mode switcher, default is "true" (if dark mode is enabled).
|
"mode" Optional flag to include a color mode switcher, default is "true" (if dark mode is enabled).
|
||||||
"search" Optional flag to include a search input, default is "true".
|
"search" Optional flag to include a search input, default is "true".
|
||||||
"logo" Optional address of the logo image.
|
"logo" Optional address of the logo image.
|
||||||
@@ -16,10 +18,13 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
{{ $error := false }}
|
{{ $error := false }}
|
||||||
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body" "body-tertiary" -}}
|
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "white" "black" "body" "body" "body-tertiary" -}}
|
||||||
{{ $supportedFlags := slice "true" "false" -}}
|
{{ $supportedFlags := slice "true" "false" -}}
|
||||||
|
|
||||||
{{ $id := add .Ordinal 1 }}
|
{{- $id := printf "navbar-collapse-%d" (add .Ordinal 1) -}}
|
||||||
|
{{ with .Get "id" }}
|
||||||
|
{{ $id = . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{ $path := .Get "path" }}
|
{{ $path := .Get "path" }}
|
||||||
{{ $page := .Site.GetPage $path }}
|
{{ $page := .Site.GetPage $path }}
|
||||||
|
@@ -3,8 +3,8 @@
|
|||||||
"path" Required path of the page.
|
"path" Required path of the page.
|
||||||
"class" Optional class attribute of the card element, e.g. “w-50”.
|
"class" Optional class attribute of the card element, e.g. “w-50”.
|
||||||
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
|
||||||
"warning", "info", "light", "dark", "white", "black", or "body-tertiary". By default, no color
|
"warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". By default, no
|
||||||
is specified.
|
color is specified.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
{{- $error := false -}}
|
{{- $error := false -}}
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
{{- $color := "" -}}
|
{{- $color := "" -}}
|
||||||
{{- with .Get "color" }}{{ $color = . }}{{ end -}}
|
{{- with .Get "color" }}{{ $color = . }}{{ end -}}
|
||||||
{{- if $color -}}
|
{{- if $color -}}
|
||||||
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body-tertiary" -}}
|
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
|
||||||
{{- if not (in $supportedColors $color) -}}
|
{{- if not (in $supportedColors $color) -}}
|
||||||
{{- errorf "Invalid value for param 'color': %s" .Position -}}
|
{{- errorf "Invalid value for param 'color': %s" .Position -}}
|
||||||
{{- $error = true -}}
|
{{- $error = true -}}
|
||||||
|
68
layouts/shortcodes/release.html
Normal file
68
layouts/shortcodes/release.html
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
<!--
|
||||||
|
Displays a release button that links to a specific release. Use the optional state to indicate if it is a new or
|
||||||
|
deprecated feature.
|
||||||
|
"version": Required version string, expects semver notation with a "v" prefix.
|
||||||
|
"state": Optional state, either "new" or "deprecated".
|
||||||
|
"short": Optional flag to indicate the release button should use short notation.
|
||||||
|
-->
|
||||||
|
|
||||||
|
{{- $error := false -}}
|
||||||
|
{{- $version := .Get "version" -}}
|
||||||
|
{{- $inline := false -}}
|
||||||
|
|
||||||
|
{{- $state := "new" -}}
|
||||||
|
{{- with .Get "state" }}{{ $state = . }}{{ end -}}
|
||||||
|
{{- $supportedStates := slice "new" "deprecated" -}}
|
||||||
|
{{- if not (in $supportedStates $state) -}}
|
||||||
|
{{- errorf "Invalid value for param 'state': %s" .Position -}}
|
||||||
|
{{- $error = true -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $shortParam := "false" -}}
|
||||||
|
{{- $short := false -}}
|
||||||
|
{{- with .Get "short" }}{{ $shortParam = . }}{{ end -}}
|
||||||
|
{{- $supportedFlags := slice "true" "false" -}}
|
||||||
|
{{- if in $supportedFlags $shortParam -}}
|
||||||
|
{{- if eq $shortParam "true" }}{{ $short = true }}{{ end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- errorf "Invalid value for param 'short': %s" .Position -}}
|
||||||
|
{{- $error = true -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $inlineParam := "false" -}}
|
||||||
|
{{- $inline := false -}}
|
||||||
|
{{- with .Get "inline" }}{{ $inlineParam = . }}{{ end -}}
|
||||||
|
{{- $supportedFlags := slice "true" "false" -}}
|
||||||
|
{{- if in $supportedFlags $inlineParam -}}
|
||||||
|
{{- if eq $inlineParam "true" }}{{ $inline = true }}{{ end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- errorf "Invalid value for param 'inline': %s" .Position -}}
|
||||||
|
{{- $error = true -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $title := $version -}}
|
||||||
|
{{- $color := "success" -}}
|
||||||
|
{{- if eq $state "deprecated" -}}
|
||||||
|
{{- $color = "secondary" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if not $short -}}
|
||||||
|
{{- if eq $state "deprecated" -}}
|
||||||
|
{{- $title = (printf "Deprecated in %s" $version) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $title = (printf "Added in %s" $version) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if not $error -}}
|
||||||
|
<div class="pb-3">
|
||||||
|
{{- partial "assets/button.html" (dict
|
||||||
|
"title" $title
|
||||||
|
"href" (printf "%s/%s" (strings.TrimSuffix "/" site.Params.docs.release) $version)
|
||||||
|
"size" "sm"
|
||||||
|
"color" $color
|
||||||
|
"outline" "true"
|
||||||
|
"class" "rounded-2 fw-semibold")
|
||||||
|
-}}
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
@@ -1,9 +1,21 @@
|
|||||||
{{ $input := .Inner | markdownify }}
|
{{- $responsiveVals := slice "table-responsive" "table-responsive-none" "table-responsive-sm" "table-responsive-md" "table-responsive-lg" "table-responsive-xl" "table-responsive-xxl" -}}
|
||||||
{{ $input = replace $input "style=\"text-align:left\"" "class=\"text-start\"" }}
|
{{- $responsive := intersect .Params $responsiveVals -}}
|
||||||
{{ $input = replace $input "style=\"text-align:center\"" "class=\"text-center\"" }}
|
{{- $main := complement $responsive .Params -}}
|
||||||
{{ $input = replace $input "style=\"text-align:right\"" "class=\"text-end\"" }}
|
|
||||||
{{ $class := .Get 0 | default "" }}
|
{{- if in $responsive "table-responsive-none" -}}
|
||||||
{{ $old := "<table>" }}
|
{{- $responsive = "" -}}
|
||||||
{{ $new := printf "<table class=\"table %s\">" $class }}
|
{{- else if not $responsive -}}
|
||||||
{{ $input := replace $input $old $new }}
|
{{ $responsive = (slice "table-responsive") -}}
|
||||||
{{ $input | safeHTML }}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $input := .Inner | markdownify }}
|
||||||
|
{{- $input = replace $input "style=\"text-align:left\"" "class=\"text-start\"" -}}
|
||||||
|
{{- $input = replace $input "style=\"text-align:center\"" "class=\"text-center\"" -}}
|
||||||
|
{{- $input = replace $input "style=\"text-align:right\"" "class=\"text-end\"" -}}
|
||||||
|
{{- $class := delimit $main " " -}}
|
||||||
|
{{- $old := "<table>" -}}
|
||||||
|
{{- $new := printf "<table class=\"table %s\">" $class -}}
|
||||||
|
{{ $input := replace $input $old $new -}}
|
||||||
|
{{- with $responsive }}<div class="{{ delimit . " " }}">{{ end -}}
|
||||||
|
{{ $input | safeHTML }}
|
||||||
|
{{- with $responsive }}</div>{{ end -}}
|
@@ -1,24 +1,17 @@
|
|||||||
<!--
|
<!--
|
||||||
Prepares a toast message. Use a trigger to display the message. The shortcode supports the following arguments:
|
Prepares a toast message. Use a trigger to display the message. The shortcode supports the following arguments:
|
||||||
|
"id" Optional id of the toast message, defaults to "toast-message-n" with sequence n.
|
||||||
"header": Optional header of the toast message. Uses the site title by default.
|
"header": Optional header of the toast message. Uses the site title by default.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
{{- $error := false -}}
|
||||||
|
{{- $id := printf "toast-message-%d" .Ordinal -}}
|
||||||
|
{{- with .Get "id" }}{{ $id = . }}{{ end -}}
|
||||||
{{ $header := .Get "header" -}}
|
{{ $header := .Get "header" -}}
|
||||||
{{ if not $header -}}
|
|
||||||
{{ $header = site.Title -}}
|
|
||||||
{{ end -}}
|
|
||||||
|
|
||||||
{{ $message := trim .Inner " \r\n" -}}
|
{{ $message := trim .Inner " \r\n" -}}
|
||||||
|
|
||||||
{{ if not $message -}}
|
{{ if not $message -}}
|
||||||
{{ errorf "Missing inner element text: %s" .Position -}}
|
{{ errorf "Missing inner element text: %s" .Position -}}
|
||||||
|
{{ else if not $error -}}
|
||||||
|
{{ partial "assets/toast.html" (dict "id" $id "header" $header "message" $message) }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
<div class="toast-container position-fixed bottom-0 end-0 p-3">
|
|
||||||
<div id="toastMessage" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
|
||||||
<div class="toast-header">
|
|
||||||
<strong class="me-auto">{{ $header }}</strong>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
|
||||||
</div>
|
|
||||||
<div class="toast-body">{{ $message }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
Displays a tooltip for a link. The shortcode supports the following arguments:
|
Displays a tooltip for a link. The shortcode supports the following arguments:
|
||||||
"color": Optional theme color of the element, either "primary" (default), "secondary", "success",
|
"color": Optional theme color of the element, either "primary" (default), "secondary", "success",
|
||||||
"danger", "warning", "info", "light", "dark", "white", or "black".
|
"danger", "warning", "info", "light", or "dark".
|
||||||
"title" Required text to display in the tooltip.
|
"title" Required text to display in the tooltip.
|
||||||
"href" Required address for the button or hyperlink.
|
"href" Required address for the button or hyperlink.
|
||||||
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
|
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
{{ $color := "primary" -}}
|
{{ $color := "primary" -}}
|
||||||
{{ with .Get "color" }}{{ $color = . }}{{ end -}}
|
{{ with .Get "color" }}{{ $color = . }}{{ end -}}
|
||||||
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" -}}
|
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" -}}
|
||||||
{{ if not (in $supportedColors $color) -}}
|
{{ if not (in $supportedColors $color) -}}
|
||||||
{{ errorf "Invalid value for param 'color': %s" .Position -}}
|
{{ errorf "Invalid value for param 'color': %s" .Position -}}
|
||||||
{{ $error = true }}
|
{{ $error = true }}
|
||||||
@@ -41,5 +41,5 @@
|
|||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{ if not $error }}
|
{{ if not $error }}
|
||||||
{{- partial "button.html" (dict "type" $type "title" $title "color" $color "tooltip" $tooltip "href" $href "placement" $placement) -}}
|
<div class="d-inline-flex">{{- partial "assets/button.html" (dict "type" $type "title" $title "color" $color "tooltip" $tooltip "href" $href "placement" $placement) -}}</div>
|
||||||
{{ end }}
|
{{ end }}
|
@@ -1,9 +1,9 @@
|
|||||||
{{ define "main" }}
|
{{ define "main" }}
|
||||||
<div class="container-fluid">
|
<div class="container-xxl px-3 px-xxl-0">
|
||||||
<div class="row row-cols-1 row-cols-sm-3 align-items-center p-3">
|
<div class="row row-cols-1 row-cols-sm-3">
|
||||||
<div class="col col-md-2 d-none d-md-block"></div>
|
<div class="col col-md-2 d-none d-md-block"></div>
|
||||||
<div class="col col-sm-12 col-md-8">
|
<div class="col col-sm-12 col-md-8">
|
||||||
<p class="display-4">{{ .Name | humanize }}</p>
|
<p class="display-4 mt-5">{{ .Name | humanize }}</p>
|
||||||
|
|
||||||
{{ if eq .Kind "taxonomy" }}
|
{{ if eq .Kind "taxonomy" }}
|
||||||
<div class="row mt-5"></div>
|
<div class="row mt-5"></div>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
{{ .Count }} {{ if gt .Count 1 }} {{ T "articles" }} {{ else }} {{ T "article" }} {{ end }}
|
{{ .Count }} {{ if gt .Count 1 }} {{ T "articles" }} {{ else }} {{ T "article" }} {{ end }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<a href="{{ (path.Join .Page.RelPermalink) | relURL }}">{{ .Name | markdownify }}</a>
|
<a href="{{ (path.Join .Page.RelPermalink) | relLangURL }}">{{ .Name | markdownify }}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<p class="text-body-secondary mt-5">{{ $year }}</p>
|
<p class="text-body-secondary mt-5">{{ $year }}</p>
|
||||||
{{ $.Scratch.Set "lastYear" $year }}
|
{{ $.Scratch.Set "lastYear" $year }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<a href="{{ .Permalink | relURL }}">{{ if .Draft }}{{ T "draft" | upper }}: {{end}}{{ .Title | markdownify }}</a>
|
<a href="{{ (path.Join .Page.RelPermalink) | relLangURL }}">{{ if .Draft }}{{ T "draft" | upper }}: {{end}}{{ .Title | markdownify }}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
15
netlify.toml
15
netlify.toml
@@ -24,15 +24,20 @@
|
|||||||
X-XSS-Protection = "1; mode=block"
|
X-XSS-Protection = "1; mode=block"
|
||||||
Content-Security-Policy = """\
|
Content-Security-Policy = """\
|
||||||
default-src 'self'; \
|
default-src 'self'; \
|
||||||
|
child-src 'self' app.netlify.com; \
|
||||||
script-src 'self' \
|
script-src 'self' \
|
||||||
https://utteranc.es/client.js; \
|
app.netlify.com netlify-cdp-loader.netlify.app \
|
||||||
style-src 'self' https://utteranc.es https://fonts.googleapis.com https://www.youtube.com; \
|
https://utteranc.es/client.js https://*.google-analytics.com https://*.googletagmanager.com; \
|
||||||
|
style-src 'self' \
|
||||||
|
netlify.app https://utteranc.es https://fonts.googleapis.com https://www.youtube.com; \
|
||||||
object-src 'none'; \
|
object-src 'none'; \
|
||||||
base-uri 'self'; \
|
base-uri 'self'; \
|
||||||
connect-src 'self'; \
|
connect-src 'self'
|
||||||
|
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
|
||||||
font-src 'self' https://fonts.gstatic.com; \
|
font-src 'self' https://fonts.gstatic.com; \
|
||||||
frame-src 'self' https://utteranc.es https://www.youtube-nocookie.com https://www.youtube.com; \
|
frame-src 'self' https://utteranc.es https://www.youtube-nocookie.com https://www.youtube.com \
|
||||||
img-src 'self' https://i.vimeocdn.com https://i.ytimg.com; \
|
app.netlify.com; \
|
||||||
|
img-src 'self' https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com; \
|
||||||
manifest-src 'self'; \
|
manifest-src 'self'; \
|
||||||
media-src 'self' \
|
media-src 'self' \
|
||||||
"""
|
"""
|
||||||
|
928
package-lock.json
generated
928
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@gethinode/hinode",
|
"name": "@gethinode/hinode",
|
||||||
"version": "0.12.0-alpha3",
|
"version": "0.14.4",
|
||||||
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
|
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"hugo",
|
"hugo",
|
||||||
@@ -57,20 +57,20 @@
|
|||||||
"bootstrap": "^5.3.0-alpha3",
|
"bootstrap": "^5.3.0-alpha3",
|
||||||
"cssnano": "^6.0.0",
|
"cssnano": "^6.0.0",
|
||||||
"cssnano-preset-advanced": "^6.0.0",
|
"cssnano-preset-advanced": "^6.0.0",
|
||||||
"eslint": "^8.37.0",
|
"eslint": "^8.39.0",
|
||||||
"eslint-config-standard": "^17.0.0",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.27.5",
|
||||||
"eslint-plugin-n": "^15.7.0",
|
"eslint-plugin-n": "^15.7.0",
|
||||||
"eslint-plugin-promise": "^6.1.1",
|
"eslint-plugin-promise": "^6.1.1",
|
||||||
"flexsearch": "^0.7.31",
|
"flexsearch": "^0.7.31",
|
||||||
"hugo-bin": "^0.102.0",
|
"hugo-bin": "^0.103.0",
|
||||||
"markdownlint-cli2": "^0.7.0",
|
"markdownlint-cli2": "^0.7.0",
|
||||||
"postcss-cli": "^10.1.0",
|
"postcss-cli": "^10.1.0",
|
||||||
"purgecss-whitelister": "^2.4.0",
|
"purgecss-whitelister": "^2.4.0",
|
||||||
"rimraf": "^5.0.0",
|
"rimraf": "^5.0.0",
|
||||||
"shx": "^0.3.4",
|
"shx": "^0.3.4",
|
||||||
"stylelint": "^15.4.0",
|
"stylelint": "^15.6.0",
|
||||||
"stylelint-config-standard-scss": "^8.0.0"
|
"stylelint-config-standard-scss": "^9.0.0"
|
||||||
},
|
},
|
||||||
"hugo-bin": {
|
"hugo-bin": {
|
||||||
"buildTags": "extended"
|
"buildTags": "extended"
|
||||||
|
3
static/js/alias.js
Normal file
3
static/js/alias.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
const alias = document.querySelector("link[rel='canonical']").getAttribute('href')
|
||||||
|
const params = window.location.search + window.location.hash
|
||||||
|
window.location = alias + params
|
Reference in New Issue
Block a user