mirror of
https://github.com/gethinode/hinode.git
synced 2025-10-07 10:04:22 +00:00
Compare commits
127 Commits
v0.15.0-be
...
0.16.0-alp
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ef136b33da | ||
![]() |
04262c00d2 | ||
![]() |
bc17718fb8 | ||
![]() |
bd277e420c | ||
![]() |
69e196f8c2 | ||
![]() |
6663d8de58 | ||
![]() |
99d457a091 | ||
![]() |
4b1a72d1c0 | ||
![]() |
02875e731f | ||
![]() |
50664248ca | ||
![]() |
b3491cdadb | ||
![]() |
fe822cccaf | ||
![]() |
c0bcb96275 | ||
![]() |
cb09aba813 | ||
![]() |
fac6581dc9 | ||
![]() |
3ef2392913 | ||
![]() |
8531bf988f | ||
![]() |
bb2d3e7eeb | ||
![]() |
7892bd6afe | ||
![]() |
733b8b6dc8 | ||
![]() |
b5fb0d3ea8 | ||
![]() |
31e3fdc534 | ||
![]() |
641f2ee1d1 | ||
![]() |
951f595d29 | ||
![]() |
cab4338b23 | ||
![]() |
0921b1467e | ||
![]() |
23a1f2fed9 | ||
![]() |
1acc1a5264 | ||
![]() |
3c60c2c512 | ||
![]() |
9d3ac01de2 | ||
![]() |
09973c5a23 | ||
![]() |
2ed01bb499 | ||
![]() |
bca302323a | ||
![]() |
ac0152640b | ||
![]() |
5e15eb5dae | ||
![]() |
c1515325a8 | ||
![]() |
6fbec8dbac | ||
![]() |
6e20600893 | ||
![]() |
de7fb8927f | ||
![]() |
c14e45ac49 | ||
![]() |
32fd291194 | ||
![]() |
b45d0155ea | ||
![]() |
8c4e11b99f | ||
![]() |
00818cb91f | ||
![]() |
b3469d277c | ||
![]() |
3627059227 | ||
![]() |
4f92886b21 | ||
![]() |
0c2f951b81 | ||
![]() |
300efb780c | ||
![]() |
42a4fc4618 | ||
![]() |
683ffff1b2 | ||
![]() |
7738c06b6c | ||
![]() |
9aca661574 | ||
![]() |
3d5440fa3d | ||
![]() |
4854d238b7 | ||
![]() |
898764eb12 | ||
![]() |
40e66bba8a | ||
![]() |
a543db250f | ||
![]() |
8d6b34716f | ||
![]() |
ea89e1c8b5 | ||
![]() |
fb6d47c33e | ||
![]() |
dc71f43faf | ||
![]() |
78df40873f | ||
![]() |
43f996acc3 | ||
![]() |
dd51fbd542 | ||
![]() |
49df936f3b | ||
![]() |
b6643f12dd | ||
![]() |
2de996242a | ||
![]() |
3b8611ebd0 | ||
![]() |
3274c7453e | ||
![]() |
ff622c8080 | ||
![]() |
455e77b3e9 | ||
![]() |
22c85f7997 | ||
![]() |
d8799fabb5 | ||
![]() |
8ae01a2ce1 | ||
![]() |
d9d3054f22 | ||
![]() |
0bf25f7acd | ||
![]() |
d5c228d43c | ||
![]() |
96886e20d7 | ||
![]() |
171259fb29 | ||
![]() |
a706936849 | ||
![]() |
f538f3b772 | ||
![]() |
a848fccec8 | ||
![]() |
69352dd60a | ||
![]() |
e1c8641d41 | ||
![]() |
deb8dfb3cb | ||
![]() |
0dcd3f02c9 | ||
![]() |
d3105436a3 | ||
![]() |
38c982f7f4 | ||
![]() |
9c19327e19 | ||
![]() |
a9f2d56dd6 | ||
![]() |
434e02e7f5 | ||
![]() |
7e44d71ecb | ||
![]() |
be8c6d539b | ||
![]() |
3db2b1f734 | ||
![]() |
6802524aac | ||
![]() |
71cdad17d3 | ||
![]() |
626b82a619 | ||
![]() |
fbb60a0622 | ||
![]() |
a0684a8a49 | ||
![]() |
55516602e5 | ||
![]() |
fcab852216 | ||
![]() |
cb714201bc | ||
![]() |
c8de62f46b | ||
![]() |
53ab00357e | ||
![]() |
0cc246a79a | ||
![]() |
21541b9f80 | ||
![]() |
e3d4339730 | ||
![]() |
710efd0caa | ||
![]() |
493ff64be0 | ||
![]() |
f2e35074c2 | ||
![]() |
7597710980 | ||
![]() |
c44340ef9e | ||
![]() |
8dfe0cb9d4 | ||
![]() |
fdb8287951 | ||
![]() |
f4f9b7c754 | ||
![]() |
4bb5ba728a | ||
![]() |
bdb8c43fb9 | ||
![]() |
63e51006ed | ||
![]() |
37b623e48c | ||
![]() |
27019594ca | ||
![]() |
d4ee11b7a5 | ||
![]() |
009314943b | ||
![]() |
826b5f58d8 | ||
![]() |
f6fb80d690 | ||
![]() |
8ed98bc5b4 | ||
![]() |
0cc3775370 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
/_vendor
|
||||||
/public
|
/public
|
||||||
resources/
|
resources/
|
||||||
node_modules/
|
node_modules/
|
||||||
|
20
README.md
20
README.md
@@ -9,25 +9,31 @@
|
|||||||
<!-- Badges -->
|
<!-- Badges -->
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://gohugo.io" alt="Hugo website">
|
<a href="https://gohugo.io" alt="Hugo website">
|
||||||
<img src="https://img.shields.io/badge/generator-hugo-brightgreen" />
|
<img src="https://img.shields.io/badge/generator-hugo-brightgreen">
|
||||||
|
</a>
|
||||||
|
<a href="https://gethinode.com" alt="Hinode theme">
|
||||||
|
<img src="https://img.shields.io/badge/theme-hinode-blue">
|
||||||
|
</a>
|
||||||
|
<a href="https://www.npmjs.com/package/%40gethinode/hinode" alt="npm package">
|
||||||
|
<img src="https://img.shields.io/npm/v/%40gethinode/hinode">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://app.netlify.com/sites/gethinode-demo/deploys" alt="Netlify Status">
|
<a href="https://app.netlify.com/sites/gethinode-demo/deploys" alt="Netlify Status">
|
||||||
<img src="https://img.shields.io/netlify/0ad42e3e-fdfa-4d37-8e26-58badd429a67" />
|
<img src="https://img.shields.io/netlify/0ad42e3e-fdfa-4d37-8e26-58badd429a67">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://stats.uptimerobot.com/xyGVYhLJmV" alt="UptimeRobot Status">
|
<a href="https://stats.uptimerobot.com/xyGVYhLJmV" alt="UptimeRobot Status">
|
||||||
<img src="https://img.shields.io/uptimerobot/status/m791334689-73d9dfc82030f4f955b2d6bb" />
|
<img src="https://img.shields.io/uptimerobot/status/m791334689-73d9dfc82030f4f955b2d6bb">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/gethinode/hinode/commits/main" alt="Last commit">
|
<a href="https://github.com/gethinode/hinode/commits/main" alt="Last commit">
|
||||||
<img src="https://img.shields.io/github/last-commit/gethinode/hinode.svg" />
|
<img src="https://img.shields.io/github/last-commit/gethinode/hinode.svg">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/gethinode/hinode/issues" alt="Issues">
|
<a href="https://github.com/gethinode/hinode/issues" alt="Issues">
|
||||||
<img src="https://img.shields.io/github/issues/gethinode/hinode.svg" />
|
<img src="https://img.shields.io/github/issues/gethinode/hinode.svg">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/gethinode/hinode/pulls" alt="Pulls">
|
<a href="https://github.com/gethinode/hinode/pulls" alt="Pulls">
|
||||||
<img src="https://img.shields.io/github/issues-pr-raw/gethinode/hinode.svg" />
|
<img src="https://img.shields.io/github/issues-pr-raw/gethinode/hinode.svg">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/gethinode/hinode/blob/main/LICENSE" alt="License">
|
<a href="https://github.com/gethinode/hinode/blob/main/LICENSE" alt="License">
|
||||||
<img src="https://img.shields.io/github/license/gethinode/hinode" />
|
<img src="https://img.shields.io/github/license/gethinode/hinode">
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
BIN
assets/img/puzzle.jpg
Normal file
BIN
assets/img/puzzle.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 152 KiB |
14
assets/js/alert.js
Normal file
14
assets/js/alert.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
const alert = document.getElementById('page-alert')
|
||||||
|
const closeBtn = document.getElementById('page-alert-btn-close')
|
||||||
|
if (alert !== null && closeBtn !== null) {
|
||||||
|
const version = alert.getAttribute('data-page-alert-version') || 'unknown'
|
||||||
|
const hideAlert = sessionStorage.getItem(`page-alert-${version}`) !== null
|
||||||
|
if (hideAlert) {
|
||||||
|
alert.classList.add('d-none')
|
||||||
|
}
|
||||||
|
|
||||||
|
closeBtn.addEventListener('click', () => {
|
||||||
|
sessionStorage.setItem(`page-alert-${version}`, 'seen')
|
||||||
|
alert.classList.add('d-none')
|
||||||
|
})
|
||||||
|
}
|
@@ -1,164 +0,0 @@
|
|||||||
{{- $search := default true site.Params.navigation.search -}}
|
|
||||||
{{- if $search -}}
|
|
||||||
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"]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
|
||||||
Source:
|
|
||||||
- https://github.com/nextapps-de/flexsearch#index-documents-field-search
|
|
||||||
- https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
|
|
||||||
*/
|
|
||||||
function initIndex() {
|
|
||||||
// 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;
|
|
||||||
// pages without a title (such as browserconfig.xml) are excluded
|
|
||||||
{{ $list := where (where site.AllPages "Kind" "in" "page") "Title" "!=" "" }}
|
|
||||||
{{ $len := (len $list) -}}
|
|
||||||
|
|
||||||
index.add(
|
|
||||||
{{ range $index, $element := $list -}}
|
|
||||||
{
|
|
||||||
id: {{ $index }},
|
|
||||||
tag: "{{ .Lang }}",
|
|
||||||
href: "{{ .RelPermalink }}",
|
|
||||||
title: {{ .Title | jsonify }},
|
|
||||||
{{ with .Description -}}
|
|
||||||
description: {{ . | jsonify }},
|
|
||||||
{{ else -}}
|
|
||||||
description: {{ .Summary | plainify | jsonify }},
|
|
||||||
{{ end -}}
|
|
||||||
content: {{ .Plain | jsonify }}
|
|
||||||
})
|
|
||||||
{{ if ne (add $index 1) $len -}}
|
|
||||||
.add(
|
|
||||||
{{ end -}}
|
|
||||||
{{ end -}}
|
|
||||||
;
|
|
||||||
|
|
||||||
search.addEventListener('input', showResults, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideSuggestions(e) {
|
|
||||||
var isClickInsideElement = suggestions.contains(e.target);
|
|
||||||
|
|
||||||
if (!isClickInsideElement) {
|
|
||||||
suggestions.classList.add('d-none');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
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 -}}
|
|
0
assets/js/optional/.gitkeep
Normal file
0
assets/js/optional/.gitkeep
Normal file
@@ -5,64 +5,16 @@
|
|||||||
@import "common/variables.scss";
|
@import "common/variables.scss";
|
||||||
@import "common/icons.scss";
|
@import "common/icons.scss";
|
||||||
|
|
||||||
// Import Bootstrap banner and functions
|
{{ if not (in site.Params.modules.core "bootstrap") }}
|
||||||
@import "bootstrap/scss/mixins/banner";
|
{{ errorf "Bootstrap is a required module, please add it to 'modules.core' in your site parameters" }}
|
||||||
@include bsBanner("");
|
{{ end }}
|
||||||
@import "bootstrap/scss/functions";
|
|
||||||
|
|
||||||
// Import Bootstrap configuration
|
@import "bootstrap.scss";
|
||||||
@import "bootstrap/scss/variables";
|
|
||||||
@import "bootstrap/scss/variables-dark.scss";
|
|
||||||
@import "bootstrap/scss/maps";
|
|
||||||
@import "bootstrap/scss/mixins";
|
|
||||||
@import "bootstrap/scss/utilities";
|
|
||||||
|
|
||||||
// Import Bootstrap layout & components
|
|
||||||
@import "bootstrap/scss/root";
|
|
||||||
@import "bootstrap/scss/reboot";
|
|
||||||
@import "bootstrap/scss/type";
|
|
||||||
@import "bootstrap/scss/images";
|
|
||||||
@import "bootstrap/scss/containers";
|
|
||||||
@import "bootstrap/scss/grid";
|
|
||||||
@import "bootstrap/scss/tables";
|
|
||||||
@import "bootstrap/scss/forms";
|
|
||||||
@import "bootstrap/scss/buttons";
|
|
||||||
@import "bootstrap/scss/transitions";
|
|
||||||
@import "bootstrap/scss/dropdown";
|
|
||||||
@import "bootstrap/scss/button-group";
|
|
||||||
@import "bootstrap/scss/nav";
|
|
||||||
@import "bootstrap/scss/navbar";
|
|
||||||
@import "bootstrap/scss/card";
|
|
||||||
@import "bootstrap/scss/accordion";
|
|
||||||
@import "bootstrap/scss/breadcrumb";
|
|
||||||
@import "bootstrap/scss/pagination";
|
|
||||||
@import "bootstrap/scss/badge";
|
|
||||||
@import "bootstrap/scss/alert";
|
|
||||||
@import "bootstrap/scss/progress";
|
|
||||||
@import "bootstrap/scss/list-group";
|
|
||||||
@import "bootstrap/scss/close";
|
|
||||||
@import "bootstrap/scss/toasts";
|
|
||||||
@import "bootstrap/scss/modal";
|
|
||||||
@import "bootstrap/scss/tooltip";
|
|
||||||
@import "bootstrap/scss/popover";
|
|
||||||
@import "bootstrap/scss/carousel";
|
|
||||||
@import "bootstrap/scss/spinners";
|
|
||||||
@import "bootstrap/scss/offcanvas";
|
|
||||||
@import "bootstrap/scss/placeholders";
|
|
||||||
|
|
||||||
// Import Bootstrap helpers
|
|
||||||
@import "bootstrap/scss/helpers";
|
|
||||||
|
|
||||||
// Import Font Awesome
|
|
||||||
// scss-docs-start awesome
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/fontawesome";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/regular";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/solid";
|
|
||||||
@import "@fortawesome/fontawesome-free/scss/brands";
|
|
||||||
// scss-docs-end awesome
|
|
||||||
|
|
||||||
// Import Hinode theme styles
|
// Import Hinode theme styles
|
||||||
|
@import "components/alert.scss";
|
||||||
@import "components/blockquote.scss";
|
@import "components/blockquote.scss";
|
||||||
|
@import "components/breadcrumb.scss";
|
||||||
@import "components/buttons.scss";
|
@import "components/buttons.scss";
|
||||||
@import "components/card.scss";
|
@import "components/card.scss";
|
||||||
@import "components/carousel.scss";
|
@import "components/carousel.scss";
|
||||||
@@ -74,9 +26,9 @@
|
|||||||
@import "components/pagination.scss";
|
@import "components/pagination.scss";
|
||||||
@import "components/persona.scss";
|
@import "components/persona.scss";
|
||||||
@import "components/popover.scss";
|
@import "components/popover.scss";
|
||||||
@import "components/search.scss";
|
|
||||||
@import "components/sidebar.scss";
|
@import "components/sidebar.scss";
|
||||||
@import "components/syntax.scss";
|
@import "components/syntax.scss";
|
||||||
|
@import "components/timeline.scss";
|
||||||
@import "components/toc.scss";
|
@import "components/toc.scss";
|
||||||
@import "components/vimeo.scss";
|
@import "components/vimeo.scss";
|
||||||
@import "common/animation.scss";
|
@import "common/animation.scss";
|
||||||
@@ -100,4 +52,4 @@
|
|||||||
@import "theme/theme.scss";
|
@import "theme/theme.scss";
|
||||||
|
|
||||||
// Import Bootstrap utilities API
|
// Import Bootstrap utilities API
|
||||||
@import "bootstrap/scss/utilities/api";
|
@import "modules/bootstrap/utilities/api";
|
||||||
|
3
assets/scss/components/_alert.scss
Normal file
3
assets/scss/components/_alert.scss
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.alert-no-decoration {
|
||||||
|
--bs-alert-border-radius: none;
|
||||||
|
}
|
6
assets/scss/components/_breadcrumb.scss
Normal file
6
assets/scss/components/_breadcrumb.scss
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
// scss-docs-start breadcrumb
|
||||||
|
.breadcrumb {
|
||||||
|
padding-top: 0.3 * $navbar-offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// scss-docs-end breadcrumb
|
@@ -1,117 +0,0 @@
|
|||||||
// Adapted from https://github.com/h-enk/doks
|
|
||||||
|
|
||||||
@include media-breakpoint-up(md) {
|
|
||||||
.search {
|
|
||||||
max-width: 20rem;
|
|
||||||
margin-top: 0.125rem;
|
|
||||||
margin-bottom: 0.125rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control.is-search {
|
|
||||||
padding-right: 4rem;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
background: var(--bs-tertiary-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control.is-search:focus {
|
|
||||||
border: 1px solid $primary;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search::after {
|
|
||||||
position: absolute;
|
|
||||||
top: 0.4625rem;
|
|
||||||
right: 0.5375rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 1.5rem;
|
|
||||||
padding-right: 0.3125rem;
|
|
||||||
padding-left: 0.3125rem;
|
|
||||||
font-size: $font-size-base * 0.75;
|
|
||||||
color: var(--bs-secondary-color);
|
|
||||||
content: "Ctrl + /";
|
|
||||||
border: 1px solid var(--bs-border-color);
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-form {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
margin-top: 0.5rem;
|
|
||||||
width: calc(100vw - 3rem);
|
|
||||||
z-index: $zindex-dropdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions a,
|
|
||||||
.suggestion__no-results {
|
|
||||||
padding: 0.75rem;
|
|
||||||
margin: 0 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions a {
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions a:focus {
|
|
||||||
background-color: var(--bs-tertiary-bg);
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions div:not(:first-child) {
|
|
||||||
border-top: 1px dashed var(--bs-border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions div:first-child {
|
|
||||||
margin-top: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions div:last-child {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions a:hover {
|
|
||||||
background-color: var(--bs-tertiary-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions span {
|
|
||||||
display: flex;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suggestion__title {
|
|
||||||
font-weight: $headings-font-weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suggestion__description,
|
|
||||||
.suggestion__no-results {
|
|
||||||
color: var(--bs-secondary-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
#suggestions {
|
|
||||||
width: 31.125rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#suggestions a {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suggestion__title {
|
|
||||||
width: 9rem;
|
|
||||||
padding-right: 1rem;
|
|
||||||
border-right: 1px solid var(--bs-border-color);
|
|
||||||
display: inline-block;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.suggestion__description {
|
|
||||||
width: 19rem;
|
|
||||||
padding-left: 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,5 +1,5 @@
|
|||||||
// stylelint-disable annotation-no-unknown
|
// stylelint-disable annotation-no-unknown
|
||||||
@import "syntax-light";
|
@import "components/syntax-light";
|
||||||
|
|
||||||
.bg,
|
.bg,
|
||||||
.chroma,
|
.chroma,
|
||||||
@@ -13,12 +13,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.preview-background {
|
.preview-background {
|
||||||
background-color: var(--bs-secondary-bg) if($enable-important-utilities, !important, null);
|
background-color: var(--bs-dark-bg-subtle) if($enable-important-utilities, !important, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@if $enable-dark-mode {
|
@if $enable-dark-mode {
|
||||||
[data-bs-theme="dark"] {
|
[data-bs-theme="dark"] {
|
||||||
@import "syntax-dark"; // stylelint-disable-line no-invalid-position-at-import-rule
|
@import "components/syntax-dark"; // stylelint-disable-line no-invalid-position-at-import-rule
|
||||||
|
|
||||||
.bg,
|
.bg,
|
||||||
.chroma,
|
.chroma,
|
||||||
|
165
assets/scss/components/_timeline.scss
Normal file
165
assets/scss/components/_timeline.scss
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
// scss-docs-start timeline
|
||||||
|
$connector-radius: 0.8rem;
|
||||||
|
$semi-circle-radius: 8rem;
|
||||||
|
$semi-circle-border: 0.2rem;
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--timeline-highlight: var(--bs-primary);
|
||||||
|
--timeline-icon-radius: #{$semi-circle-radius};
|
||||||
|
--timeline-offset: 50%;
|
||||||
|
--timeline-connector-bg: var(--bs-body-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@each $state in map-keys($theme-colors) {
|
||||||
|
.timeline-#{$state} {
|
||||||
|
--timeline-highlight: var(--#{$prefix}#{$state});
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-bg-#{$state} {
|
||||||
|
--timeline-connector-bg: var(--#{$prefix}#{$state}-bg-subtle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// scss-docs-end timeline
|
||||||
|
|
||||||
|
.timeline, .timeline-sm {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-sm {
|
||||||
|
--timeline-icon-radius: calc(#{$semi-circle-radius} / 2);
|
||||||
|
--timeline-offset: 25%
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline::before, .timeline-sm::before {
|
||||||
|
content: "";
|
||||||
|
width: 2 * $semi-circle-border;
|
||||||
|
margin: 0 auto;
|
||||||
|
background: var(--bs-body-color);
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-sm::before {
|
||||||
|
margin: 0 calc(var(--timeline-offset) - #{$semi-circle-border});
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-start, .timeline-semi-circle-end {
|
||||||
|
width: var(--timeline-icon-radius);
|
||||||
|
height: var(--timeline-icon-radius);
|
||||||
|
border-radius: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-start {
|
||||||
|
left: -$semi-circle-border;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-end {
|
||||||
|
left: $semi-circle-border;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-start::before {
|
||||||
|
content: "";
|
||||||
|
width: var(--timeline-icon-radius);
|
||||||
|
height: var(--timeline-icon-radius);
|
||||||
|
border-radius: 100%;
|
||||||
|
border: $semi-circle-border solid;
|
||||||
|
position: absolute;
|
||||||
|
border-color: transparent var(--timeline-highlight) var(--timeline-highlight) var(--timeline-highlight);
|
||||||
|
transform: rotate(-90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-start::after {
|
||||||
|
content: "";
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: var(--timeline-icon-radius);
|
||||||
|
height: var(--timeline-icon-radius);
|
||||||
|
border-radius: 100%;
|
||||||
|
border: $semi-circle-border solid;
|
||||||
|
position: absolute;
|
||||||
|
border-color: var(--timeline-highlight) var(--timeline-highlight) var(--timeline-highlight) transparent;
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-end::before {
|
||||||
|
content: "";
|
||||||
|
width: var(--timeline-icon-radius);
|
||||||
|
height: var(--timeline-icon-radius);
|
||||||
|
border-radius: 100%;
|
||||||
|
border: $semi-circle-border solid;
|
||||||
|
position: absolute;
|
||||||
|
border-color: transparent var(--timeline-highlight) var(--timeline-highlight) var(--timeline-highlight);
|
||||||
|
transform: rotate(-225deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-semi-circle-end::after {
|
||||||
|
content: "";
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: var(--timeline-icon-radius);
|
||||||
|
height: var(--timeline-icon-radius);
|
||||||
|
border-radius: 100%;
|
||||||
|
border: $semi-circle-border solid;
|
||||||
|
position: absolute;
|
||||||
|
border-color: var(--timeline-highlight) var(--timeline-highlight) var(--timeline-highlight) transparent;
|
||||||
|
transform: rotate(-180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-description-text-start {
|
||||||
|
border-bottom: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
margin-right: 2 * $connector-radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-description-text-end {
|
||||||
|
border-bottom: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
margin-left: 2 * $connector-radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-panel-start, .timeline-panel-end, .timeline-connector-start, .timeline-connector-end {
|
||||||
|
top: calc(var(--timeline-icon-radius) / 2);
|
||||||
|
position: relative;
|
||||||
|
width: calc(var(--timeline-icon-radius) / 2);
|
||||||
|
height: calc($semi-circle-border + var(--timeline-icon-radius) / 2);
|
||||||
|
border: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
border-bottom: none;
|
||||||
|
border-right: none;
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-panel-start {
|
||||||
|
top: 50%;
|
||||||
|
right: 50%;
|
||||||
|
position: absolute;
|
||||||
|
width: calc(var(--timeline-icon-radius) * 2);
|
||||||
|
width: 2 * $connector-radius;
|
||||||
|
height: 50%;
|
||||||
|
border-top: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
border-left: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-panel-end {
|
||||||
|
top: 50%;
|
||||||
|
position: absolute;
|
||||||
|
width: calc(var(--timeline-icon-radius) * 2);
|
||||||
|
width: 2 * $connector-radius;
|
||||||
|
height: 50%;
|
||||||
|
border-top: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
border-right: $semi-circle-border solid var(--timeline-highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-dot::after {
|
||||||
|
display: inline-block;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: var(--timeline-offset);
|
||||||
|
margin: (-$connector-radius) 0 0 (-$connector-radius);
|
||||||
|
width: 2 * $connector-radius;
|
||||||
|
height: 2 * $connector-radius;
|
||||||
|
border-radius: 100%;
|
||||||
|
border: ($semi-circle-border * 1.5) solid var(--timeline-connector-bg);
|
||||||
|
color: var(--timeline-highlight);
|
||||||
|
background: var(--timeline-highlight);
|
||||||
|
}
|
@@ -85,7 +85,7 @@ home = ["HTML", "RSS", "REDIR"]
|
|||||||
[module]
|
[module]
|
||||||
[module.hugoVersion]
|
[module.hugoVersion]
|
||||||
extended = true
|
extended = true
|
||||||
min = "0.81.0"
|
min = "0.110.0"
|
||||||
max = ""
|
max = ""
|
||||||
[[module.mounts]]
|
[[module.mounts]]
|
||||||
source = "assets"
|
source = "assets"
|
||||||
@@ -96,16 +96,13 @@ home = ["HTML", "RSS", "REDIR"]
|
|||||||
[[module.mounts]]
|
[[module.mounts]]
|
||||||
source = "static/fonts"
|
source = "static/fonts"
|
||||||
target = "static/fonts"
|
target = "static/fonts"
|
||||||
# toml-docs-start javascript
|
# toml-docs-start modules
|
||||||
[[module.mounts]]
|
[[module.imports]]
|
||||||
source = "node_modules/bootstrap/dist/js"
|
path = "github.com/gethinode/mod-bootstrap"
|
||||||
target = "assets/js/vendor/bootstrap"
|
[[module.imports]]
|
||||||
includeFiles = "*.bundle.js"
|
path = "github.com/gethinode/mod-flexsearch"
|
||||||
[[module.mounts]]
|
[[module.imports]]
|
||||||
source = "node_modules/flexsearch/dist"
|
path = "github.com/gethinode/mod-fontawesome"
|
||||||
target = "assets/js/vendor/flexsearch"
|
[[module.imports]]
|
||||||
includeFiles = "*.bundle.js"
|
path = "github.com/gethinode/mod-leaflet"
|
||||||
# toml-docs-end javascript
|
# toml-docs-end modules
|
||||||
[[module.mounts]]
|
|
||||||
source = "node_modules/@fortawesome/fontawesome-free/webfonts"
|
|
||||||
target = "static/fonts"
|
|
@@ -6,12 +6,18 @@
|
|||||||
modes = ["light", "dark"]
|
modes = ["light", "dark"]
|
||||||
# toml-docs-end main
|
# toml-docs-end main
|
||||||
|
|
||||||
|
# toml-docs-start modules
|
||||||
|
[modules]
|
||||||
|
core = ["bootstrap", "flexsearch", "fontawesome"]
|
||||||
|
optional = ["leaflet"]
|
||||||
|
excludeSCSS = ["bootstrap"]
|
||||||
|
# toml-docs-end modules
|
||||||
|
|
||||||
# toml-docs-start docs
|
# toml-docs-start docs
|
||||||
[docs]
|
[docs]
|
||||||
version = "0.8"
|
|
||||||
basePath = ""
|
|
||||||
github = "https://github.com/gethinode/hinode"
|
github = "https://github.com/gethinode/hinode"
|
||||||
release = "https://github.com/gethinode/hinode/releases/tag/"
|
release = "https://github.com/gethinode/hinode/releases/tag/"
|
||||||
|
checkVersion = false
|
||||||
# toml-docs-end docs
|
# toml-docs-end docs
|
||||||
|
|
||||||
# toml-docs-start home
|
# toml-docs-start home
|
||||||
@@ -31,7 +37,7 @@
|
|||||||
fixed = true
|
fixed = true
|
||||||
offset = "3.8em"
|
offset = "3.8em"
|
||||||
search = true
|
search = true
|
||||||
breadcrumb = false
|
breadcrumb = true
|
||||||
toc = true
|
toc = true
|
||||||
sidebar = true
|
sidebar = true
|
||||||
# toml-docs-end navigation
|
# toml-docs-end navigation
|
||||||
|
@@ -16,7 +16,7 @@ for = '/**'
|
|||||||
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
|
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 https://*.google-analytics.com https://*.googletagmanager.com; \
|
img-src 'self' data: https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
|
||||||
manifest-src 'self'; \
|
manifest-src 'self'; \
|
||||||
media-src 'self' \
|
media-src 'self' \
|
||||||
"""
|
"""
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
canonifyURLs = false
|
|
@@ -2,7 +2,7 @@
|
|||||||
title: About
|
title: About
|
||||||
description: Hinode is a clean documentation and blog theme for your Hugo site based on Bootstrap 5.
|
description: Hinode is a clean documentation and blog theme for your Hugo site based on Bootstrap 5.
|
||||||
date: 2022-04-11
|
date: 2022-04-11
|
||||||
updated: 2023-02-11
|
updated: 2023-06-26
|
||||||
showComments: false
|
showComments: false
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -35,8 +35,8 @@ Additional features include:
|
|||||||
* Switching between light mode and dark mode
|
* Switching between light mode and dark mode
|
||||||
* Support for multiple languages
|
* Support for multiple languages
|
||||||
* Reusable Bootstrap components through configurable shortcodes and partials
|
* Reusable Bootstrap components through configurable shortcodes and partials
|
||||||
|
* Versioned documentation, including sidebar navigation and version switcher
|
||||||
* Embedded comments through light-weight integration with GitHub via [utteranc.es]({{< param "links.utterances" >}})
|
* Embedded comments through light-weight integration with GitHub via [utteranc.es]({{< param "links.utterances" >}})
|
||||||
* Integrated sidebar navigation for content-heavy sections, such as documentation pages
|
|
||||||
* Reponsive image handling for multiple screen sizes and resolutions
|
* Reponsive image handling for multiple screen sizes and resolutions
|
||||||
* Optimized search results, scoring 100 points for SEO on [PageSpeed Insights]({{< param "links.pagespeed" >}})
|
* Optimized search results, scoring 100 points for SEO on [PageSpeed Insights]({{< param "links.pagespeed" >}})
|
||||||
* Secure by default, scoring A+ on [Mozilla Observatory test]({{< param "links.observatory" >}})
|
* Secure by default, scoring A+ on [Mozilla Observatory test]({{< param "links.observatory" >}})
|
||||||
|
@@ -127,7 +127,7 @@ As an example, the following shortcode displays a button that, when clicked, tri
|
|||||||
Trigger panel
|
Trigger panel
|
||||||
{{</* /button */>}}
|
{{</* /button */>}}
|
||||||
|
|
||||||
{{</* collapse id="collapse-1" class="p-3 border rounded" */>}}
|
{{</* collapse id="collapse-1" class="p-3 border rounded bg-primary-subtle" */>}}
|
||||||
Some placeholder content for the collapse component. This panel is <i>hidden by default</i> but
|
Some placeholder content for the collapse component. This panel is <i>hidden by default</i> but
|
||||||
revealed when the user activates the relevant trigger.
|
revealed when the user activates the relevant trigger.
|
||||||
{{</* /collapse */>}}
|
{{</* /collapse */>}}
|
||||||
@@ -245,6 +245,16 @@ Loading...
|
|||||||
{{< /example>}}
|
{{< /example>}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
|
## Timeline
|
||||||
|
|
||||||
|
As an example, the following shortcode displays a timeline with the file `data/timeline-en.yml` as data.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD037 -->
|
||||||
|
{{< example lang="hugo" >}}
|
||||||
|
{{</* timeline data="timeline-en" background="dark" */>}}
|
||||||
|
{{< /example >}}
|
||||||
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
## Toast
|
## Toast
|
||||||
|
|
||||||
As an example, the following shortcode displays a button that, when clicked, triggers the toast message.
|
As an example, the following shortcode displays a button that, when clicked, triggers the toast message.
|
||||||
|
23
content/en/blog/components.md
Normal file
23
content/en/blog/components.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
author: Mark Dumay
|
||||||
|
title: Components
|
||||||
|
date: 2023-07-10
|
||||||
|
description: Use shortcodes to add predefined components powered by external libraries.
|
||||||
|
tags: ["bootstrap", "shortcode"]
|
||||||
|
thumbnail: img/puzzle.jpg
|
||||||
|
photoCredits: <a href="https://unsplash.com/@ryoji__iwata">Ryoji Iwata</a>
|
||||||
|
photoSource: <a href="https://unsplash.com/photos/5siQcvSxCP8">Unsplash</a>
|
||||||
|
modules: ["leaflet"]
|
||||||
|
---
|
||||||
|
|
||||||
|
Hinode provides several shortcodes on top of the common [Bootstrap elements]({{< relref "bootstrap-elements" >}}). Refer to the [official documentation]({{< param "links.hinode_docs" >}}) for more details.
|
||||||
|
|
||||||
|
## Map
|
||||||
|
|
||||||
|
As an example, the following shortcode displays an interactive map of the city of Amsterdam.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD037 -->
|
||||||
|
{{< example lang="hugo" >}}
|
||||||
|
{{</* map lat=52.377 long=4.90 zoom=13 popup="Amsterdam Central Station" popup-lat=52.378062 popup-long=4.900562 */>}}
|
||||||
|
{{< /example >}}
|
||||||
|
<!-- markdownlint-enable MD037 -->
|
@@ -3,6 +3,7 @@ slug: over-mij
|
|||||||
title: Over mij
|
title: Over mij
|
||||||
description: Een blog en documentatie thema voor Hugo gebaseerd op Bootstrap 5.
|
description: Een blog en documentatie thema voor Hugo gebaseerd op Bootstrap 5.
|
||||||
date: 2023-02-17
|
date: 2023-02-17
|
||||||
|
updated: 2023-06-26
|
||||||
showComments: false
|
showComments: false
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -36,8 +37,8 @@ Overige functies:
|
|||||||
* Omschakelen tussen donkere en lichte modus
|
* Omschakelen tussen donkere en lichte modus
|
||||||
* Ondersteuning voor meerdere talen
|
* Ondersteuning voor meerdere talen
|
||||||
* Herbruikbare Bootstrap componenten via shortcodes en partials
|
* Herbruikbare Bootstrap componenten via shortcodes en partials
|
||||||
|
* Versiebeheer van documentatiepagina's, inclusief secundaire navigatie en selectie van versies
|
||||||
* Integreren van commentaar via [utteranc.es]({{< param "links.utterances" >}})
|
* Integreren van commentaar via [utteranc.es]({{< param "links.utterances" >}})
|
||||||
* Secundaire navigatie voor bijvoorbeeld documentatie
|
|
||||||
* Optimalisering van foto's voor meerdere schermafmetingen en resoluties
|
* Optimalisering van foto's voor meerdere schermafmetingen en resoluties
|
||||||
* Optimale zoekresultaten, met 100 punten voor SEO volgens [PageSpeed Insights]({{< param "links.pagespeed" >}})
|
* Optimale zoekresultaten, met 100 punten voor SEO volgens [PageSpeed Insights]({{< param "links.pagespeed" >}})
|
||||||
* Veilige communicatie, met een score van A+ volgens [Mozilla Observatory]({{< param "links.observatory" >}})
|
* Veilige communicatie, met een score van A+ volgens [Mozilla Observatory]({{< param "links.observatory" >}})
|
||||||
|
@@ -246,6 +246,16 @@ Loading...
|
|||||||
{{< /example>}}
|
{{< /example>}}
|
||||||
<!-- markdownlint-enable MD037 -->
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
|
## Timeline
|
||||||
|
|
||||||
|
De volgende shortcode toont een tijdslijn met het bestand `data/timeline-nl.yml` als input.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD037 -->
|
||||||
|
{{< example lang="hugo" >}}
|
||||||
|
{{</* timeline data="timeline-nl" */>}}
|
||||||
|
{{< /example >}}
|
||||||
|
<!-- markdownlint-enable MD037 -->
|
||||||
|
|
||||||
## Toast
|
## Toast
|
||||||
|
|
||||||
De volgende shortcode toont een knop die een bericht laat verschijnen op het scherm.
|
De volgende shortcode toont een knop die een bericht laat verschijnen op het scherm.
|
||||||
|
23
content/nl/blog/components.md
Normal file
23
content/nl/blog/components.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
author: Mark Dumay
|
||||||
|
title: Componenten
|
||||||
|
slug: componenten
|
||||||
|
date: 2023-07-10
|
||||||
|
description: Gebruik shortcodes om voorgedefiniëerde componenten toe te voegen die gebruikmaken van externe libraries.
|
||||||
|
tags: ["bootstrap", "shortcode"]
|
||||||
|
thumbnail: img/puzzle.jpg
|
||||||
|
photoCredits: <a href="https://unsplash.com/@ryoji__iwata">Ryoji Iwata</a>
|
||||||
|
photoSource: <a href="https://unsplash.com/photos/5siQcvSxCP8">Unsplash</a>
|
||||||
|
---
|
||||||
|
|
||||||
|
Hinode biedt meerdere shortcodes aan bovenop de gebruikelijke [Bootstrap elementen]({{< relref "bootstrap-elements" >}}). Zie de [officiële documentatie]({{< param "links.hinode_docs" >}}) voor meer details.
|
||||||
|
|
||||||
|
## Map
|
||||||
|
|
||||||
|
De volgende shortcode toont een interactieve kaart van Amsterdam.
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD037 -->
|
||||||
|
{{< example lang="hugo" >}}
|
||||||
|
{{</* map lat=52.377 long=4.90 zoom=13 popup="Amsterdam CS" popup-lat=52.378062 popup-long=4.900562 */>}}
|
||||||
|
{{< /example >}}
|
||||||
|
<!-- markdownlint-enable MD037 -->
|
35
data/timeline-en.yml
Normal file
35
data/timeline-en.yml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# This file holds all menu entries for the docs sidebar
|
||||||
|
|
||||||
|
- title: Product launch
|
||||||
|
icon: fas rocket
|
||||||
|
color: primary
|
||||||
|
date: 2023-07-01
|
||||||
|
url: https://github.com/gethinode/hinode/releases/tag/v0.15.2
|
||||||
|
content:
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
||||||
|
|
||||||
|
- title: I18N support
|
||||||
|
icon: fas globe
|
||||||
|
color: success
|
||||||
|
date: 2023-05-06
|
||||||
|
url: v0.14.0
|
||||||
|
content:
|
||||||
|
Lorem ipsum dolor sit amet.
|
||||||
|
|
||||||
|
- title: New feature
|
||||||
|
icon: fas house
|
||||||
|
color: warning
|
||||||
|
date: 2023-02-04
|
||||||
|
url: v0.8.1
|
||||||
|
content:
|
||||||
|
Cupiditate ducimus officiis quod!
|
||||||
|
|
||||||
|
- title: Beta release
|
||||||
|
icon: fas heart
|
||||||
|
color: info
|
||||||
|
date: 2022-11-30
|
||||||
|
# url: v0.1
|
||||||
|
content:
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
35
data/timeline-nl.yml
Normal file
35
data/timeline-nl.yml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# This file holds all menu entries for the docs sidebar
|
||||||
|
|
||||||
|
- title: Productlancering
|
||||||
|
icon: fas rocket
|
||||||
|
color: primary
|
||||||
|
date: 2023-07-01
|
||||||
|
url: https://github.com/gethinode/hinode/releases/tag/v0.15.2
|
||||||
|
content:
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
||||||
|
|
||||||
|
- title: Internationalisering
|
||||||
|
icon: fas globe
|
||||||
|
color: success
|
||||||
|
date: 2023-05-06
|
||||||
|
url: v0.14.0
|
||||||
|
content:
|
||||||
|
Lorem ipsum dolor sit amet.
|
||||||
|
|
||||||
|
- title: Nieuwe functie
|
||||||
|
icon: fas house
|
||||||
|
color: warning
|
||||||
|
date: 2023-02-04
|
||||||
|
url: v0.8.1
|
||||||
|
content:
|
||||||
|
Cupiditate ducimus officiis quod!
|
||||||
|
|
||||||
|
- title: Beta release
|
||||||
|
icon: fas heart
|
||||||
|
color: info
|
||||||
|
date: 2022-11-30
|
||||||
|
# url: v0.1
|
||||||
|
content:
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate ducimus officiis quod! Aperiam eveniet nam nostrum odit quasi ullam voluptatum.
|
10
go.mod
Normal file
10
go.mod
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
module github.com/gethinode/hinode
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gethinode/mod-bootstrap v1.1.0 // indirect
|
||||||
|
github.com/gethinode/mod-flexsearch v1.1.0 // indirect
|
||||||
|
github.com/gethinode/mod-fontawesome v1.2.0 // indirect
|
||||||
|
github.com/gethinode/mod-leaflet v0.3.1 // indirect
|
||||||
|
)
|
18
go.sum
Normal file
18
go.sum
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
github.com/gethinode/mod-bootstrap v1.0.1 h1:NDZar+UEL42YHCvzzO+jVgqkZU5INA12BpjX3y6U4I4=
|
||||||
|
github.com/gethinode/mod-bootstrap v1.0.1/go.mod h1:DcpPc2cNaXUPGEvhD7npuEEPA7573NvakTlrwFbyjr8=
|
||||||
|
github.com/gethinode/mod-bootstrap v1.1.0 h1:BbalsW8kmFhv+J+dcc41TGcjIlM/p69AB0h0oGhAXIU=
|
||||||
|
github.com/gethinode/mod-bootstrap v1.1.0/go.mod h1:DcpPc2cNaXUPGEvhD7npuEEPA7573NvakTlrwFbyjr8=
|
||||||
|
github.com/gethinode/mod-flexsearch v1.0.1 h1:FJkRsUzSnQTXl3MWCigT4E6vfff870UWTnkGqaDGIhA=
|
||||||
|
github.com/gethinode/mod-flexsearch v1.0.1/go.mod h1:TXbGbWsvmhBdsTzRt887mcpFfr4ORpzG3+h/l4W3YM4=
|
||||||
|
github.com/gethinode/mod-flexsearch v1.1.0 h1:7BCMyQDlYlskNXuazt8Jg/jg9WREexu2xVkYqThkAX4=
|
||||||
|
github.com/gethinode/mod-flexsearch v1.1.0/go.mod h1:TXbGbWsvmhBdsTzRt887mcpFfr4ORpzG3+h/l4W3YM4=
|
||||||
|
github.com/gethinode/mod-fontawesome v1.0.2 h1:ZSK6D20/w4y5GnfYfTBB58uHD0ChIfkpKfRGwioS9rg=
|
||||||
|
github.com/gethinode/mod-fontawesome v1.0.2/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
|
||||||
|
github.com/gethinode/mod-fontawesome v1.1.0 h1:rsDzUI+3ZlS/do2ff3ne8/z3KwHeysmuA+WsXlumXXk=
|
||||||
|
github.com/gethinode/mod-fontawesome v1.1.0/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
|
||||||
|
github.com/gethinode/mod-fontawesome v1.2.0 h1:2nWYEjpUKu6IJ6kOh2WDlDUqRQ/dUGw6mJWIdMTA3O0=
|
||||||
|
github.com/gethinode/mod-fontawesome v1.2.0/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
|
||||||
|
github.com/gethinode/mod-leaflet v0.2.3 h1:QQI4h+IH0jZ7fx4q0um2YIEiYBoW3OAfW8qHzbRCDPk=
|
||||||
|
github.com/gethinode/mod-leaflet v0.2.3/go.mod h1:uGggt87x4Fw7wBoJpSiUvNkYg+s/Ujne7klAX2rxMRk=
|
||||||
|
github.com/gethinode/mod-leaflet v0.3.1 h1:H5MaOa+BB1KuVw7abTqfIn/SNzzRsAyx/WQoSe+2Ykc=
|
||||||
|
github.com/gethinode/mod-leaflet v0.3.1/go.mod h1:uGggt87x4Fw7wBoJpSiUvNkYg+s/Ujne7klAX2rxMRk=
|
@@ -91,8 +91,10 @@
|
|||||||
translation: "Code"
|
translation: "Code"
|
||||||
- id: latest
|
- id: latest
|
||||||
translation: "latest"
|
translation: "latest"
|
||||||
- id: allVersions
|
- id: allVersions
|
||||||
translation: "All versions"
|
translation: "All versions"
|
||||||
|
- id: newerVersionAlert
|
||||||
|
translation: "There is a newer version of {{ . }}!"
|
||||||
|
|
||||||
# 404 page
|
# 404 page
|
||||||
- id: pageNotFound
|
- id: pageNotFound
|
||||||
|
@@ -83,6 +83,8 @@
|
|||||||
translation: "meest recente"
|
translation: "meest recente"
|
||||||
- id: allVersions
|
- id: allVersions
|
||||||
translation: "Alle versies"
|
translation: "Alle versies"
|
||||||
|
- id: newerVersionAlert
|
||||||
|
translation: "Er is een nieuwere versie van {{ . }}!"
|
||||||
|
|
||||||
# 404 page
|
# 404 page
|
||||||
- id: pageNotFound
|
- id: pageNotFound
|
||||||
|
@@ -3,6 +3,15 @@
|
|||||||
{{- $.Scratch.Set "version" $version -}}
|
{{- $.Scratch.Set "version" $version -}}
|
||||||
{{ with partial "utilities/GetMenu" (dict "page" . "version" $version) }}{{ $.Scratch.Set "sidebar" . }}{{ end }}
|
{{ with partial "utilities/GetMenu" (dict "page" . "version" $version) }}{{ $.Scratch.Set "sidebar" . }}{{ end }}
|
||||||
|
|
||||||
|
{{- if and site.Params.docs.checkVersion $version -}}
|
||||||
|
{{- if ne $version "latest" -}}
|
||||||
|
{{- if partial "utilities/IsOlder" (dict "current" $version) -}}
|
||||||
|
{{- $.Scratch.Set "pageAlertMsg" (T "newerVersionAlert" site.Title) -}}
|
||||||
|
{{- $.Scratch.Set "pageAlertURL" (or site.Params.docs.latestURL site.baseURL) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="{{ .Site.Language.Lang }}" class="no-js">
|
<html lang="{{ .Site.Language.Lang }}" class="no-js">
|
||||||
<head>
|
<head>
|
||||||
@@ -70,6 +79,12 @@
|
|||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{- partial "footer/toast-container.html" . -}}
|
{{- partial "footer/toast-container.html" . -}}
|
||||||
{{- partialCached "footer/scripts.html" (dict "header" false "page" .) }}
|
{{- partialCached "footer/scripts.html" (dict "header" false "page" . "core" true) }}
|
||||||
|
{{- $modules := site.Params.modules.optional | intersect .Params.modules -}}
|
||||||
|
{{- range $index, $mod := $modules -}}
|
||||||
|
{{- $filename := printf "js/%s.bundle.js" $mod -}}
|
||||||
|
{{- $match := printf "js/modules/%s/**.js" $mod -}}
|
||||||
|
{{- partial "footer/scripts.html" (dict "filename" $filename "match" $match "header" false "page" .) }}
|
||||||
|
{{- end -}}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -181,110 +181,113 @@
|
|||||||
{{- if eq $color "black" }}{{ $theme = "dark" }}{{ end -}}
|
{{- if eq $color "black" }}{{ $theme = "dark" }}{{ end -}}
|
||||||
{{- if eq $color "white" }}{{ $theme = "light" }}{{ 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-fluid {{ if $fixed }}fixed-top{{ end }} p-0"{{ with $theme }} data-bs-theme="{{ . }}"{{ end }}>
|
||||||
<div class="container-xxl p-0">
|
{{- partial "assets/page-alert.html" (dict "page" $page) -}}
|
||||||
<!-- Insert sidebar toggler when applicable -->
|
<nav class="navbar navbar-expand-{{ $size }} {{ with $color }}bg-{{ . }}{{ end }} p-4"{{ with $theme }} data-bs-theme="{{ . }}"{{ end }}>
|
||||||
<div class="d-flex">
|
<div class="container-xxl p-0">
|
||||||
{{- if $page.Scratch.Get "sidebar" -}}
|
<!-- Insert sidebar toggler when applicable -->
|
||||||
<button class="navbar-toggler fw-30 collapsed p-0 mx-auto" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvass-sidebar" aria-controls="offcanvass-sidebar" aria-label="{{ T "toggleSidebar" }}">
|
<div class="d-flex">
|
||||||
{{- partial "assets/icon.html" (dict "icon" "fas ellipsis") -}}
|
{{- if $page.Scratch.Get "sidebar" -}}
|
||||||
|
<button class="navbar-toggler fw-30 collapsed p-0 mx-auto" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvass-sidebar" aria-controls="offcanvass-sidebar" aria-label="{{ T "toggleSidebar" }}">
|
||||||
|
{{- partial "assets/icon.html" (dict "icon" "fas ellipsis") -}}
|
||||||
|
</button>
|
||||||
|
{{- else -}}
|
||||||
|
<!-- Insert invisible sidebar toggler to center logo correctly on smaller screens -->
|
||||||
|
<button class="navbar-toggler fw-30 collapsed p-0 mx-auto invisible" type="button">
|
||||||
|
{{- partial "assets/icon.html" (dict "icon" "fas ellipsis") -}}
|
||||||
|
</button>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Insert the brand logo or name -->
|
||||||
|
<a class="navbar-brand mx-auto" href="{{ site.Home.RelPermalink }}">
|
||||||
|
{{- if $logo -}}
|
||||||
|
<img src="{{ $logo }}" alt="{{ $title }} logo" height="30">
|
||||||
|
{{- else -}}
|
||||||
|
<span class="fw-bold">{{ $title }}</span>
|
||||||
|
{{- end -}}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Insert main navigation toggler -->
|
||||||
|
<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="#{{ $id }}"
|
||||||
|
aria-controls="{{ $id }}" aria-expanded="false" aria-label="{{ T "toggleMainNav" }}">
|
||||||
|
<span class="toggler-icon top-bar emphasis"></span>
|
||||||
|
<span class="toggler-icon middle-bar emphasis"></span>
|
||||||
|
<span class="toggler-icon bottom-bar emphasis"></span>
|
||||||
</button>
|
</button>
|
||||||
{{- else -}}
|
</div>
|
||||||
<!-- Insert invisible sidebar toggler to center logo correctly on smaller screens -->
|
|
||||||
<button class="navbar-toggler fw-30 collapsed p-0 mx-auto invisible" type="button">
|
<div class="navbar-collapse collapse" id="{{ $id }}">
|
||||||
{{- partial "assets/icon.html" (dict "icon" "fas ellipsis") -}}
|
<!-- Insert search input -->
|
||||||
</button>
|
{{- if $search }}{{ partial "assets/search-input.html" -}}{{ end -}}
|
||||||
{{- end -}}
|
|
||||||
</div>
|
<!-- Render top-menu items (maximum depth of 2) -->
|
||||||
|
<ul class="navbar-nav ms-auto">
|
||||||
<!-- Insert the brand logo or name -->
|
{{- range $menu := $menus -}}
|
||||||
<a class="navbar-brand mx-auto" href="{{ site.Home.RelPermalink }}">
|
<li class="nav-item{{ if .HasChildren }} dropdown{{ end }}">
|
||||||
{{- if $logo -}}
|
{{- partial "assets/navbar-item.html" (dict "menu" $menu "page" $page) -}}
|
||||||
<img src="{{ $logo }}" alt="{{ $title }} logo" height="30">
|
{{- if .HasChildren -}}
|
||||||
{{- else -}}
|
<ul class="dropdown-menu dropdown-menu-end">
|
||||||
<span class="fw-bold">{{ $title }}</span>
|
{{- range .Children -}}
|
||||||
{{- end -}}
|
{{- partial "assets/navbar-item.html" (dict "menu" . "parent" $menu "page" $page) -}}
|
||||||
</a>
|
{{- end -}}
|
||||||
|
</ul>
|
||||||
<!-- Insert main navigation toggler -->
|
{{- end -}}
|
||||||
<div class="d-flex fw-30">
|
</li>
|
||||||
<button id="main-nav-toggler" class="navbar-toggler collapsed p-0" type="button" data-bs-toggle="collapse" data-bs-target="#{{ $id }}"
|
{{- end -}}
|
||||||
aria-controls="{{ $id }}" aria-expanded="false" aria-label="{{ T "toggleMainNav" }}">
|
|
||||||
<span class="toggler-icon top-bar emphasis"></span>
|
<!-- Insert divider if applicable -->
|
||||||
<span class="toggler-icon middle-bar emphasis"></span>
|
{{- if or $enableLanguage $enableVersions -}}
|
||||||
<span class="toggler-icon bottom-bar emphasis"></span>
|
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
|
||||||
</button>
|
<div class="vr d-none d-md-flex h-100 mx-md-2"></div>
|
||||||
</div>
|
</li>
|
||||||
|
<li><hr class="dropdown-divider-bg"></li>
|
||||||
<div class="navbar-collapse collapse" id="{{ $id }}">
|
{{- end -}}
|
||||||
<!-- Insert search input -->
|
|
||||||
{{- if $search }}{{ partial "assets/search-input.html" -}}{{ end -}}
|
<!-- Insert language switcher if applicable -->
|
||||||
|
{{- if $enableLanguage -}}
|
||||||
<!-- Render top-menu items (maximum depth of 2) -->
|
{{- $currentLang := $page.Language.Lang -}}
|
||||||
<ul class="navbar-nav ms-auto">
|
<li class="nav-item dropdown">
|
||||||
{{- range $menu := $menus -}}
|
<a class="nav-link dropdown-toggle d-{{ $size }}-none" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
<li class="nav-item{{ if .HasChildren }} dropdown{{ end }}">
|
{{- partial "assets/icon.html" (dict "icon" "fas globe") }} {{ T "languageSwitcherLabel" }}
|
||||||
{{- partial "assets/navbar-item.html" (dict "menu" $menu "page" $page) -}}
|
</a>
|
||||||
{{- if .HasChildren -}}
|
<a class="nav-link dropdown-toggle d-none d-{{ $size }}-block" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
<ul class="dropdown-menu dropdown-menu-end">
|
{{- partial "assets/icon.html" (dict "icon" "fas globe") }}
|
||||||
{{- range .Children -}}
|
</a>
|
||||||
{{- partial "assets/navbar-item.html" (dict "menu" . "parent" $menu "page" $page) -}}
|
<ul class="dropdown-menu dropdown-menu-end ">
|
||||||
|
{{- if $page.IsTranslated -}}
|
||||||
|
{{- range $page.AllTranslations -}}
|
||||||
|
<li><a class="dropdown-item {{ if eq .Language.Lang $currentLang }}active{{ end }}" href="{{ .Permalink }}">{{ .Language.LanguageName }}</a></li>
|
||||||
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- range site.Languages -}}
|
||||||
|
<li><a class="dropdown-item" href="/{{ .Lang }}">{{ default .Lang .LanguageName }}</a></li>
|
||||||
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
</ul>
|
</ul>
|
||||||
{{- end -}}
|
</li>
|
||||||
</li>
|
{{- end -}}
|
||||||
{{- end -}}
|
|
||||||
|
<!-- Insert version switcher -->
|
||||||
<!-- Insert divider if applicable -->
|
{{- if $enableVersions -}}
|
||||||
{{- if or $enableLanguage $enableVersions -}}
|
{{- partial "partials/navbar-versions.html" (dict "page" $page "size" $size "collapsed" true ) -}}
|
||||||
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
|
{{- partial "partials/navbar-versions.html" (dict "page" $page "size" $size "collapsed" false) -}}
|
||||||
<div class="vr d-none d-md-flex h-100 mx-md-2"></div>
|
{{- end -}}
|
||||||
</li>
|
|
||||||
<li><hr class="dropdown-divider-bg"></li>
|
<!-- Insert color mode switcher -->
|
||||||
{{- end -}}
|
{{- if $enableDarkMode -}}
|
||||||
|
<!-- Insert divider -->
|
||||||
<!-- Insert language switcher if applicable -->
|
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
|
||||||
{{- if $enableLanguage -}}
|
<div class="vr d-none d-md-flex h-100 mx-md-2"></div>
|
||||||
{{- $currentLang := $page.Language.Lang -}}
|
</li>
|
||||||
<li class="nav-item dropdown">
|
<li><hr class="dropdown-divider-bg"></li>
|
||||||
<a class="nav-link dropdown-toggle d-{{ $size }}-none" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
{{- partial "assets/icon.html" (dict "icon" "fas globe") }} {{ T "languageSwitcherLabel" }}
|
{{- partial "partials/navbar-mode.html" (dict "size" $size "collapsed" true) -}}
|
||||||
</a>
|
{{- partial "partials/navbar-mode.html" (dict "size" $size "collapsed" false) -}}
|
||||||
<a class="nav-link dropdown-toggle d-none d-{{ $size }}-block" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
{{- end -}}
|
||||||
{{- partial "assets/icon.html" (dict "icon" "fas globe") }}
|
</ul>
|
||||||
</a>
|
</div>
|
||||||
<ul class="dropdown-menu dropdown-menu-end ">
|
|
||||||
{{- if $page.IsTranslated -}}
|
|
||||||
{{- range $page.AllTranslations -}}
|
|
||||||
<li><a class="dropdown-item {{ if eq .Language.Lang $currentLang }}active{{ end }}" href="{{ .Permalink }}">{{ .Language.LanguageName }}</a></li>
|
|
||||||
{{- end -}}
|
|
||||||
{{- else -}}
|
|
||||||
{{- range site.Languages -}}
|
|
||||||
<li><a class="dropdown-item" href="/{{ .Lang }}">{{ default .Lang .LanguageName }}</a></li>
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
<!-- Insert version switcher -->
|
|
||||||
{{- if $enableVersions -}}
|
|
||||||
{{- partial "partials/navbar-versions.html" (dict "page" $page "size" $size "collapsed" true ) -}}
|
|
||||||
{{- partial "partials/navbar-versions.html" (dict "page" $page "size" $size "collapsed" false) -}}
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
<!-- Insert color mode switcher -->
|
|
||||||
{{- if $enableDarkMode -}}
|
|
||||||
<!-- Insert divider -->
|
|
||||||
<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>
|
|
||||||
</li>
|
|
||||||
<li><hr class="dropdown-divider-bg"></li>
|
|
||||||
|
|
||||||
{{- partial "partials/navbar-mode.html" (dict "size" $size "collapsed" true) -}}
|
|
||||||
{{- partial "partials/navbar-mode.html" (dict "size" $size "collapsed" false) -}}
|
|
||||||
{{- end -}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</nav>
|
||||||
</nav>
|
</div>
|
||||||
|
15
layouts/partials/assets/page-alert.html
Normal file
15
layouts/partials/assets/page-alert.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{{- $page := .page -}}
|
||||||
|
{{- if not $page -}}
|
||||||
|
{{- errorf "partial [assets/page-alert.html] - Missing value for param 'page'" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $pageAlertMsg := $page.Scratch.Get "pageAlertMsg" -}}
|
||||||
|
{{- $pageAlertURL := $page.Scratch.Get "pageAlertURL" -}}
|
||||||
|
{{- $version := $page.Scratch.Get "version" -}}
|
||||||
|
|
||||||
|
{{- if $pageAlertMsg -}}
|
||||||
|
<div id="page-alert" class="alert alert-primary alert-no-decoration fade show d-flex align-items-center small m-0 py-1" data-page-alert-version="{{ $version }}">
|
||||||
|
<a href="{{ with $pageAlertURL }}{{ . }}{{ else }}#!{{ end }}" class="text-decoration-none flex-grow-1 text-center">{{ $pageAlertMsg }}</a>
|
||||||
|
<button id="page-alert-btn-close" type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
@@ -1,6 +0,0 @@
|
|||||||
<div class="d-flex ms-md-3">
|
|
||||||
<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">
|
|
||||||
<div id="suggestions" class="shadow bg-body rounded d-none" data-no-results="{{ T "ui_no_results" }}"></div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
@@ -1,28 +1,27 @@
|
|||||||
{{ $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 }}
|
{{- $header := .header -}}
|
||||||
|
{{- $core := .core | default false -}}
|
||||||
|
|
||||||
{{ $files := slice -}}
|
{{- $modules := "" -}}
|
||||||
{{ range $index, $file := resources.Match $match -}}
|
{{ if $core }}
|
||||||
{{ $files = $files | append $file -}}
|
{{- $modules = site.Params.modules.core -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $bundle := partial "utilities/bundle" (dict "match" $match "filename" $filename "modules" $modules "basepath" "js/modules" "all" true) -}}
|
||||||
|
{{- $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 -}}
|
||||||
|
<script src="{{ $js.Permalink }}"></script>
|
||||||
|
{{ else -}}
|
||||||
|
{{ $js = $js | minify | fingerprint -}}
|
||||||
|
<script src="{{ $js.Permalink }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"></script>
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|
||||||
{{ if gt (len $files) 0 }}
|
|
||||||
{{ $bundle := $files | resources.Concat $filename -}}
|
|
||||||
{{ $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 -}}
|
|
||||||
<script src="{{ $js.Permalink }}"></script>
|
|
||||||
{{ else -}}
|
|
||||||
{{ $js = $js | minify | fingerprint -}}
|
|
||||||
<script src="{{ $js.Permalink }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"></script>
|
|
||||||
{{ end -}}
|
|
||||||
{{ end -}}
|
|
@@ -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 | relLangURL }}" target="_blank" rel="noopener noreferrer" aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
|
<a href="{{ .URL }}" 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 -}}
|
||||||
|
@@ -3,7 +3,18 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
{{ hugo.Generator}}
|
{{ hugo.Generator}}
|
||||||
{{ partial "head/stylesheet.html" . -}}
|
{{ partial "head/stylesheet.html" -}}
|
||||||
|
{{- $modules := site.Params.modules.optional | intersect .Page.Params.modules -}}
|
||||||
|
{{- range $index, $mod := $modules -}}
|
||||||
|
{{- $source := printf "scss/%s.scss" $mod -}}
|
||||||
|
{{- $target := printf "css/%s.css" $mod -}}
|
||||||
|
{{- partial "head/stylesheet.html" (dict "source" $source "target" $target "core" false "page" .) }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if hasPrefix (lower .Site.Params.style.themeFontPath) "http" -}}
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link rel="stylesheet" href="{{ .Site.Params.style.themeFontPath | default "https://fonts.googleapis.com/css2?family=Inter:wght@200;300;600&display=swap" }}">
|
||||||
|
{{- end -}}
|
||||||
{{ partial "head/seo.html" . }}
|
{{ partial "head/seo.html" . }}
|
||||||
{{ partialCached "head/favicon.html" . -}}
|
{{ partialCached "head/favicon.html" . -}}
|
||||||
{{ if gt (len .Site.Languages) 1}}
|
{{ if gt (len .Site.Languages) 1}}
|
||||||
|
@@ -1,30 +1,52 @@
|
|||||||
|
{{- $source := .source | default "scss/app.scss" -}}
|
||||||
|
{{- $target := .target | default "css/main.css" -}}
|
||||||
|
{{- $page := .page -}}
|
||||||
|
{{- $core := .core | default true -}}
|
||||||
|
|
||||||
|
{{- $modules := "" -}}
|
||||||
|
{{ if $core }}
|
||||||
|
{{- if reflect.IsSlice site.Params.modules.excludeSCSS -}}
|
||||||
|
{{- $modules = complement site.Params.modules.excludeSCSS site.Params.modules.core -}}
|
||||||
|
{{ else }}
|
||||||
|
{{- $modules = site.Params.modules.core -}}
|
||||||
|
{{ end }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
{{- $navbarOffset := "0em" -}}
|
{{- $navbarOffset := "0em" -}}
|
||||||
{{- if .Site.Params.navigation.fixed }}{{ $navbarOffset = site.Params.navigation.offset | default "4em" }}{{ end }}
|
{{- if site.Params.navigation.fixed }}{{ $navbarOffset = site.Params.navigation.offset | default "4em" }}{{ end }}
|
||||||
{{- $vars := dict
|
{{- $vars := dict
|
||||||
"theme-font" (default "Inter" .Site.Params.style.themeFont)
|
"theme-font" (default "Inter" site.Params.style.themeFont)
|
||||||
"primary" (default "#007bff" .Site.Params.style.primary)
|
"primary" (default "#007bff" site.Params.style.primary)
|
||||||
"secondary" (default "#6c757d" .Site.Params.style.secondary)
|
"secondary" (default "#6c757d" site.Params.style.secondary)
|
||||||
"success" (default "#198754" .Site.Params.style.success)
|
"success" (default "#198754" site.Params.style.success)
|
||||||
"info" (default "#0dcaf0" .Site.Params.style.info)
|
"info" (default "#0dcaf0" site.Params.style.info)
|
||||||
"warning" (default "#ffc107" .Site.Params.style.warning)
|
"warning" (default "#ffc107" site.Params.style.warning)
|
||||||
"danger" (default "#dc3545" .Site.Params.style.danger)
|
"danger" (default "#dc3545" site.Params.style.danger)
|
||||||
"light" (default "#f8f9fa" .Site.Params.style.light)
|
"light" (default "#f8f9fa" site.Params.style.light)
|
||||||
"dark" (default "#212529" .Site.Params.style.dark)
|
"dark" (default "#212529" site.Params.style.dark)
|
||||||
"navbar-offset" $navbarOffset
|
"navbar-offset" $navbarOffset
|
||||||
"enable-dark-mode" (printf "%t" ((default true .Site.Params.main.enableDarkMode)))
|
"enable-dark-mode" (printf "%t" ((default true site.Params.main.enableDarkMode)))
|
||||||
"import-fonts" (printf "%t" (not (hasPrefix (lower .Site.Params.style.themeFontPath) "http")))
|
"import-fonts" (printf "%t" (not (hasPrefix (lower site.Params.style.themeFontPath) "http")))
|
||||||
-}}
|
-}}
|
||||||
|
|
||||||
{{- $options := (dict "transpiler" "libsass" "targetPath" "css/main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -}}
|
<!-- TODO: remove debug statement -->
|
||||||
{{/*- $options := (dict "transpiler" "dartsass" "targetPath" "css/main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -*/}}
|
{{ $match := "scss/**.scss" }}
|
||||||
{{- if hugo.IsProduction -}}
|
{{ $files := sort (resources.Match $match) "Key" "asc" }}
|
||||||
{{- $options = merge $options (dict "outputStyle" "compressed") -}}
|
{{ warnf "Processing pattern: %s" $match}}
|
||||||
{{- else -}}
|
{{- range $index, $file := $files -}}
|
||||||
{{- $options = merge $options (dict "outputStyle" "expanded") -}}
|
{{/*- warnf " - Processing file: %s" $file.Key */}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $css := resources.Get "scss/app.scss" | resources.ExecuteAsTemplate "style.app.scss" . | toCSS $options -}}
|
|
||||||
{{- partial "head/icons.html" (dict "css" $css) -}}
|
{{- $options := (dict "transpiler" "libsass" "targetPath" $target "enableSourceMap" (not hugo.IsProduction) "vars" $vars) -}}
|
||||||
{{- if .Site.Params.style.purge -}}
|
{{- $bundle := partial "utilities/bundle" (dict "match" $source "filename" (printf "scss/bundle-%d.scss" now.UnixNano) "modules" $modules "basepath" "scss") -}}
|
||||||
|
{{/* warnf "Bundle: %s" $bundle.Content */}}
|
||||||
|
|
||||||
|
{{- $css := $bundle | resources.ExecuteAsTemplate $target . | toCSS $options -}}
|
||||||
|
|
||||||
|
{{ if $core }}
|
||||||
|
{{- partial "head/icons.html" (dict "css" $css) -}}
|
||||||
|
{{ end }}
|
||||||
|
{{- if site.Params.style.purge -}}
|
||||||
{{- $post_options := dict "config" "config" -}}
|
{{- $post_options := dict "config" "config" -}}
|
||||||
{{- $css = $css | resources.PostCSS $post_options -}}
|
{{- $css = $css | resources.PostCSS $post_options -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
@@ -34,9 +56,4 @@
|
|||||||
{{- 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">
|
||||||
{{- end -}}
|
|
||||||
{{- if hasPrefix (lower .Site.Params.style.themeFontPath) "http" -}}
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
||||||
<link rel="stylesheet" href="{{ .Site.Params.style.themeFontPath | default "https://fonts.googleapis.com/css2?family=Inter:wght@200;300;600&display=swap" }}">
|
|
||||||
{{- end -}}
|
{{- end -}}
|
@@ -7,28 +7,32 @@
|
|||||||
{{- $base := .base -}}
|
{{- $base := .base -}}
|
||||||
{{- $version := "" -}}
|
{{- $version := "" -}}
|
||||||
|
|
||||||
{{- $docsPath := strings.TrimPrefix "/" site.Params.docs.contentPath -}}
|
{{- if and site.Params.docs.releases site.Params.docs.contentPath -}}
|
||||||
{{- if and $page.File (strings.HasPrefix $page.File.Dir $docsPath) -}}
|
{{- $docsPath := strings.TrimPrefix "/" site.Params.docs.contentPath -}}
|
||||||
{{- $currentPath := strings.TrimPrefix $docsPath $page.File.Dir -}}
|
{{- if and $page.File (strings.HasPrefix $page.File.Dir $docsPath) -}}
|
||||||
{{- $currentVersion := index (split $currentPath "/") 0 -}}
|
{{- $currentPath := strings.TrimPrefix $docsPath $page.File.Dir -}}
|
||||||
{{- $versionPath := path.Join site.Params.docs.contentPath $currentVersion -}}
|
{{- $currentVersion := index (split $currentPath "/") 0 -}}
|
||||||
|
{{- $versionPath := path.Join site.Params.docs.contentPath $currentVersion -}}
|
||||||
|
|
||||||
{{- $list := site.Params.docs.releases -}}
|
{{- $list := site.Params.docs.releases -}}
|
||||||
{{- range $index, $item := $list -}}
|
{{- range $index, $item := $list -}}
|
||||||
{{- $url := strings.TrimSuffix "/" $item.url -}}
|
{{- $url := strings.TrimSuffix "/" $item.url -}}
|
||||||
{{- if eq $url $versionPath -}}
|
{{- if eq $url $versionPath -}}
|
||||||
{{- if $base }}{{ $version = path.Base $item.url }}{{ else }}{{ $version = $item.label }}{{ end -}}
|
{{- if $base }}{{ $version = path.Base $item.url }}{{ else }}{{ $version = $item.label }}{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
{{- if not $version -}}
|
{{- if not $version -}}
|
||||||
{{- $list := site.Params.docs.releases -}}
|
{{- $list := site.Params.docs.releases -}}
|
||||||
{{- range $item := $list -}}
|
{{- range $item := $list -}}
|
||||||
{{- if $item.latest -}}
|
{{- if $item.latest -}}
|
||||||
{{- if $base }}{{ $version = path.Base $item.url }}{{ else }}{{ $version = $item.label }}{{ end -}}
|
{{- if $base }}{{ $version = path.Base $item.url }}{{ else }}{{ $version = $item.label }}{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $version = site.Params.docs.version -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- return $version -}}
|
{{- return $version -}}
|
32
layouts/partials/utilities/IsOlder.html
Normal file
32
layouts/partials/utilities/IsOlder.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!--
|
||||||
|
Returns true if the current version is older than the latest version defined in the docs section of the site
|
||||||
|
parameters. The verification supports semver patterns MAJOR.MINOR.PATCH with an optional suffix.
|
||||||
|
|
||||||
|
Original code by solus on https://discourse.gohugo.io/t/sorting-semantic-version-numbers/40838/6.
|
||||||
|
-->
|
||||||
|
|
||||||
|
{{ $current := .current }}
|
||||||
|
{{ $latest := site.Params.docs.latest }}
|
||||||
|
|
||||||
|
{{- define "partials/padZeroPrefix.html" -}}
|
||||||
|
{{- $padSize := 6 }}
|
||||||
|
{{- $paddedString := replaceRE "(\\d+)" (print (strings.Repeat (sub $padSize 1) "0") "$1") . }}
|
||||||
|
{{- $trimmedString := replaceRE (print "0+(\\d{" $padSize "})") "$1" $paddedString }}
|
||||||
|
{{- return $trimmedString }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "partials/trimZeroPrefix.html" -}}
|
||||||
|
{{- return replaceRE "0+(\\d+)" "$1" . }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $isOlder := false -}}
|
||||||
|
|
||||||
|
{{- if and $current $latest }}
|
||||||
|
{{- $versions := slice $current $latest }}
|
||||||
|
{{- $paddedVersions := apply $versions "partial" "padZeroPrefix" "." }}
|
||||||
|
{{- $sortedVersions := (sort $paddedVersions "value" "desc") }}
|
||||||
|
{{- $sortedVersions = apply $sortedVersions "partial" "trimZeroPrefix" "." }}
|
||||||
|
{{ $isOlder = ne (index $sortedVersions 0) $current }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- return $isOlder -}}
|
16
layouts/partials/utilities/URLJoin.html
Normal file
16
layouts/partials/utilities/URLJoin.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{{- $base := .base -}}
|
||||||
|
{{- if not $base }}
|
||||||
|
{{- errorf "partial [assets/utilities/URLJoin.html] - Expected param 'base'" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $path := .path -}}
|
||||||
|
{{- if not $path }}
|
||||||
|
{{- errorf "partial [assets/utilities/URLJoin.html] - Expected param 'path'" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $url := $path -}}
|
||||||
|
{{- if not (hasPrefix $path "http") -}}
|
||||||
|
{{- $url = printf "%s/%s" (strings.TrimSuffix "/" $base) $path -}}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- return $url -}}
|
64
layouts/partials/utilities/bundle.html
Normal file
64
layouts/partials/utilities/bundle.html
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
{{- $match := .match -}}
|
||||||
|
{{- $filename := .filename -}}
|
||||||
|
{{- if not (or $match $filename) -}}
|
||||||
|
{{- errorf "partial [assets/bundle.html] - Expected match and filename" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $order := .order | default "asc"}}
|
||||||
|
{{- $supportedOrder := slice "asc" "desc" -}}
|
||||||
|
{{- if not (in $supportedOrder $order) -}}
|
||||||
|
{{- errorf "partial [assets/bundle.html] - Invalid value for param 'order': %s" $order -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $modules := .modules -}}
|
||||||
|
{{- $all := .all }}
|
||||||
|
{{- $basepath := strings.TrimSuffix "/" .basepath -}}
|
||||||
|
{{- $ext := trim (path.Ext (trim $match "{}")) "." -}}
|
||||||
|
{{- if not $ext -}}
|
||||||
|
{{- errorf "partial [assets/bundle.html] - Cannot derive file extension of match pattern: %s" $match -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $modules -}}
|
||||||
|
{{- $match = trim $match "{}" -}}
|
||||||
|
{{- $matches := slice $match -}}
|
||||||
|
{{- range $index, $mod := $modules -}}
|
||||||
|
{{- if $all }}
|
||||||
|
{{- $matches = $matches | append (printf "%s/%s/**.%s" $basepath $mod $ext) -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $matches = $matches | append (printf "%s/%s.%s" $basepath $mod $ext) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $match = printf "{%s}" (delimit $matches ",") }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<!-- TODO: concat by module, then sorted by filename -->
|
||||||
|
|
||||||
|
{{ $matches := resources.Match $match }}
|
||||||
|
{{ $files := slice }}
|
||||||
|
{{ range $index, $file := $matches }}
|
||||||
|
{{ $add := (dict "name" (strings.TrimSuffix (printf ".%s" $ext) $file.Name) "resource" $file ) }}
|
||||||
|
{{ $files = $files | append $add }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $sorted := slice }}
|
||||||
|
{{ $files = sort $files "name" }}
|
||||||
|
{{- range $index, $file := $files -}}
|
||||||
|
{{ $sorted = $sorted | append $file.resource }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<!-- TODO: remove temp debug statement -->
|
||||||
|
{{ warnf "Processing pattern: %s" $match}}
|
||||||
|
{{- range $index, $file := $sorted -}}
|
||||||
|
{{- warnf " - Processing file: %s" $file }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/* warnf "FILES: %s" $sorted */}}
|
||||||
|
|
||||||
|
{{ $bundle := "" }}
|
||||||
|
{{ if gt (len $sorted) 0 }}
|
||||||
|
{{ $bundle = $sorted | resources.Concat $filename -}}
|
||||||
|
{{ else }}
|
||||||
|
{{ $bundle = resources.FromString $filename "" }}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
|
{{- return $bundle -}}
|
@@ -58,7 +58,7 @@
|
|||||||
<div class="pb-3">
|
<div class="pb-3">
|
||||||
{{- partial "assets/button.html" (dict
|
{{- partial "assets/button.html" (dict
|
||||||
"title" $title
|
"title" $title
|
||||||
"href" (printf "%s/%s" (strings.TrimSuffix "/" site.Params.docs.release) $version)
|
"href" (partial "partials/utilities/URLJoin.html" (dict "base" site.Params.docs.release "path" $version))
|
||||||
"size" "sm"
|
"size" "sm"
|
||||||
"color" $color
|
"color" $color
|
||||||
"outline" "true"
|
"outline" "true"
|
||||||
|
101
layouts/shortcodes/timeline.html
Normal file
101
layouts/shortcodes/timeline.html
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<!-- Inspired by the timeline snippet from Siddharth Panchal at https://bootsnipp.com/snippets/Q0ppE -->
|
||||||
|
{{ $error := false }}
|
||||||
|
|
||||||
|
{{- $data := .Get "data" -}}
|
||||||
|
{{ if not $data -}}
|
||||||
|
{{ errorf "Missing param 'data': %s" .Position -}}
|
||||||
|
{{ $error = true }}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
|
{{ $entries := index site.Data $data }}
|
||||||
|
{{ if not $entries -}}
|
||||||
|
{{ errorf "Invalid timeline data '%s': %s" $data .Position -}}
|
||||||
|
{{ $error = true }}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
|
{{ $background := "" -}}
|
||||||
|
{{ with .Get "background" }}{{ $background = . }}{{ end -}}
|
||||||
|
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" -}}
|
||||||
|
{{ if and $background (not (in $supportedColors $background)) -}}
|
||||||
|
{{ errorf "Invalid value for param 'background': %s" .Position -}}
|
||||||
|
{{ $error = true -}}
|
||||||
|
{{ end -}}
|
||||||
|
|
||||||
|
<!-- Inline partial to render icon -->
|
||||||
|
{{- define "partials/timeline-icon.html" -}}
|
||||||
|
{{- $col := default 6 .col -}}
|
||||||
|
{{- $icon := .icon -}}
|
||||||
|
{{- $direction := .direction -}}
|
||||||
|
<div class="col-{{ $col }} d-flex justify-content-{{ $direction }} align-items-center">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div class="d-flex timeline-semi-circle-{{ $direction }} fa-wrapper align-items-center justify-content-center">
|
||||||
|
{{ partial "assets/icon.html" (dict "icon" (printf "%s fa-fluid" $icon)) }}
|
||||||
|
</div>
|
||||||
|
<div class="timeline-connector-{{ $direction }} {{ if eq $direction "start" }} order-first{{ end }}"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<!-- Inline partial to render icon -->
|
||||||
|
{{- define "partials/timeline-panel.html" -}}
|
||||||
|
{{- $col := default 6 .col -}}
|
||||||
|
{{- $content := .content -}}
|
||||||
|
{{- $color := .color -}}
|
||||||
|
{{- $title := .title -}}
|
||||||
|
{{- $badge := .badge -}}
|
||||||
|
{{- $url := .url -}}
|
||||||
|
{{- $date := .date -}}
|
||||||
|
{{- if and $url (not (hasPrefix $url "http")) -}}
|
||||||
|
{{- $url = partial "partials/utilities/URLJoin.html" (dict "base" site.Params.docs.release "path" $url) }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $direction := .direction -}}
|
||||||
|
|
||||||
|
<div class="col-{{ $col }} d-flex align-items-center">
|
||||||
|
<div class="d-flex h-100 w-100">
|
||||||
|
<div class="timeline-panel-{{ $direction }}"></div>
|
||||||
|
<div class="timeline-description-text-{{ $direction }} p-3 w-100">
|
||||||
|
<div>
|
||||||
|
{{ with $url }}
|
||||||
|
<a class="fs-5 fw-bold text-uppercase link-{{ $color }} text-break align-middle" href="{{ . }}">{{ $title }}</a>
|
||||||
|
<span class="badge rounded-pill text-bg-{{ $color }} ms-1">{{ if $badge }}<a class="link-bg-{{ $color }}" href="{{ . }}">{{ $badge }}</a>{{ end }}</span>
|
||||||
|
{{ else}}
|
||||||
|
<span class="fs-5 fw-bold text-uppercase text-{{ $color }} text-break align-middle">{{ $title }}</span>
|
||||||
|
<span class="badge rounded-pill text-bg-{{ $color }} ms-1">{{ if $badge }}{{ $badge }}{{ end }}</span>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ if $date }}
|
||||||
|
{{ $datestr := (partial "utilities/date.html" (dict "date" $date "format" "long")) -}}
|
||||||
|
<p class="mb-0"><small class="text-body-secondary text-uppercase">{{ $datestr -}}</small></p>
|
||||||
|
{{ end }}
|
||||||
|
<p class="mt-3 mb-0">{{ $content | markdownify }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<!-- Render default timeline -->
|
||||||
|
<div class="container p-0 d-none d-md-block mb-5 {{ with $background }} timeline-bg-{{ . }}{{ end }}">
|
||||||
|
{{ range $index, $item := $entries }}
|
||||||
|
<div class="row timeline timeline-{{ $item.color }} timeline-dot g-0 ">
|
||||||
|
{{ if eq (mod $index 2) 1 }}
|
||||||
|
{{ partial "partials/timeline-panel.html" (dict "content" $item.content "color" $item.color "title" $item.title "badge" $item.badge "date" $item.date "url" $item.url "direction" "start") }}
|
||||||
|
{{ partial "partials/timeline-icon.html" (dict "icon" $item.icon "direction" "start") }}
|
||||||
|
{{ else }}
|
||||||
|
{{ partial "partials/timeline-icon.html" (dict "icon" $item.icon "direction" "end") }}
|
||||||
|
{{ partial "partials/timeline-panel.html" (dict "content" $item.content "color" $item.color "title" $item.title "badge" $item.badge "date" $item.date "url" $item.url "direction" "end") }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
<div class="row timeline g-0 p-3"> </div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Render timeline for smaller devices -->
|
||||||
|
<div class="container p-0 d-block d-md-none {{ with $background }} timeline-bg-{{ . }}{{ end }}">
|
||||||
|
{{ range $index, $item := $entries }}
|
||||||
|
<div class="row timeline-sm timeline-{{ $item.color }} timeline-dot g-0">
|
||||||
|
{{ partial "partials/timeline-icon.html" (dict "icon" $item.icon "direction" "end" "col" 3) }}
|
||||||
|
{{ partial "partials/timeline-panel.html" (dict "content" $item.content "color" $item.color "title" $item.title "badge" $item.badge "date" $item.date "url" $item.url "direction" "end" "col" 9) }}
|
||||||
|
</div>
|
||||||
|
<div class="row timeline-sm g-0 p-3"> </div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
12
netlify.toml
12
netlify.toml
@@ -4,8 +4,8 @@
|
|||||||
functions = "functions"
|
functions = "functions"
|
||||||
|
|
||||||
[build.environment]
|
[build.environment]
|
||||||
NODE_VERSION = "18.13.0"
|
NODE_VERSION = "18.16.1"
|
||||||
NPM_VERSION = "8.19.3"
|
NPM_VERSION = "9.5.1"
|
||||||
|
|
||||||
[context.production]
|
[context.production]
|
||||||
command = "npm run build"
|
command = "npm run build"
|
||||||
@@ -26,18 +26,18 @@
|
|||||||
default-src 'self'; \
|
default-src 'self'; \
|
||||||
child-src 'self' app.netlify.com; \
|
child-src 'self' app.netlify.com; \
|
||||||
script-src 'self' \
|
script-src 'self' \
|
||||||
app.netlify.com netlify-cdp-loader.netlify.app \
|
https://*.netlify.app app.netlify.com netlify-cdp-loader.netlify.app \
|
||||||
https://utteranc.es/client.js https://*.google-analytics.com https://*.googletagmanager.com; \
|
https://utteranc.es/client.js https://*.google-analytics.com https://*.googletagmanager.com; \
|
||||||
style-src 'self' \
|
style-src 'self' \
|
||||||
netlify.app https://utteranc.es https://fonts.googleapis.com https://www.youtube.com; \
|
https://*.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; \
|
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
|
||||||
font-src 'self' https://fonts.gstatic.com; \
|
font-src 'self' https://*.netlify.app 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 \
|
||||||
app.netlify.com; \
|
app.netlify.com; \
|
||||||
img-src 'self' https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com; \
|
img-src 'self' data: https://*.netlify.app https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
|
||||||
manifest-src 'self'; \
|
manifest-src 'self'; \
|
||||||
media-src 'self' \
|
media-src 'self' \
|
||||||
"""
|
"""
|
||||||
|
1302
package-lock.json
generated
1302
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@gethinode/hinode",
|
"name": "@gethinode/hinode",
|
||||||
"version": "0.15.0-beta3",
|
"version": "0.16.0-alpha",
|
||||||
"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",
|
||||||
@@ -8,7 +8,8 @@
|
|||||||
"bootstrap",
|
"bootstrap",
|
||||||
"responsive",
|
"responsive",
|
||||||
"front-end",
|
"front-end",
|
||||||
"blog"
|
"blog",
|
||||||
|
"documentation"
|
||||||
],
|
],
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
@@ -16,7 +17,7 @@
|
|||||||
"registry": "https://registry.npmjs.org/"
|
"registry": "https://registry.npmjs.org/"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prestart": "npm run clean",
|
"prestart": "npm run clean && npm run mod:vendor",
|
||||||
"start": "hugo server --bind=0.0.0.0 --disableFastRender",
|
"start": "hugo server --bind=0.0.0.0 --disableFastRender",
|
||||||
"start:prod": "hugo server --bind=0.0.0.0 --disableFastRender -e production",
|
"start:prod": "hugo server --bind=0.0.0.0 --disableFastRender -e production",
|
||||||
"prebuild": "npm run clean",
|
"prebuild": "npm run clean",
|
||||||
@@ -30,6 +31,10 @@
|
|||||||
"lint:styles": "stylelint \"assets/scss/**/*.{css,sass,scss,sss,less}\"",
|
"lint:styles": "stylelint \"assets/scss/**/*.{css,sass,scss,sss,less}\"",
|
||||||
"lint:markdown": "markdownlint-cli2 \"*.md\" \"content/**/*.md\"",
|
"lint:markdown": "markdownlint-cli2 \"*.md\" \"content/**/*.md\"",
|
||||||
"lint:markdown-fix": "markdownlint-cli2-fix \"*.md\" \"content/**/*.md\"",
|
"lint:markdown-fix": "markdownlint-cli2-fix \"*.md\" \"content/**/*.md\"",
|
||||||
|
"mod:init": "hugo mod init github.com/gethinode/hinode",
|
||||||
|
"mod:update": "hugo mod get -u ./... && npm run -s mod:vendor && npm run -s mod:tidy",
|
||||||
|
"mod:tidy": "hugo mod tidy",
|
||||||
|
"mod:vendor": "hugo mod vendor",
|
||||||
"test": "npm run -s lint",
|
"test": "npm run -s lint",
|
||||||
"env": "hugo env",
|
"env": "hugo env",
|
||||||
"precheck": "npm version",
|
"precheck": "npm version",
|
||||||
@@ -53,7 +58,6 @@
|
|||||||
"@fortawesome/fontawesome-free": "^6.4.0",
|
"@fortawesome/fontawesome-free": "^6.4.0",
|
||||||
"@fullhuman/postcss-purgecss": "^5.0.0",
|
"@fullhuman/postcss-purgecss": "^5.0.0",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.14",
|
||||||
"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.39.0",
|
"eslint": "^8.39.0",
|
||||||
@@ -61,15 +65,14 @@
|
|||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.27.5",
|
||||||
"eslint-plugin-n": "^16.0.0",
|
"eslint-plugin-n": "^16.0.0",
|
||||||
"eslint-plugin-promise": "^6.1.1",
|
"eslint-plugin-promise": "^6.1.1",
|
||||||
"flexsearch": "^0.7.31",
|
"hugo-bin": "^0.111.0",
|
||||||
"hugo-bin": "^0.108.0",
|
|
||||||
"markdownlint-cli2": "^0.8.1",
|
"markdownlint-cli2": "^0.8.1",
|
||||||
"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.6.0",
|
"stylelint": "^15.6.0",
|
||||||
"stylelint-config-standard-scss": "^9.0.0"
|
"stylelint-config-standard-scss": "^10.0.0"
|
||||||
},
|
},
|
||||||
"hugo-bin": {
|
"hugo-bin": {
|
||||||
"buildTags": "extended"
|
"buildTags": "extended"
|
||||||
|
@@ -5,8 +5,8 @@ description = "A clean documentation and blog theme for your Hugo site based on
|
|||||||
homepage = "https://gethinode.com"
|
homepage = "https://gethinode.com"
|
||||||
demosite = "https://demo.gethinode.com"
|
demosite = "https://demo.gethinode.com"
|
||||||
tags = ["blog", "documentation", "minimal", "modern", "customizable", "search", "bootstrap"]
|
tags = ["blog", "documentation", "minimal", "modern", "customizable", "search", "bootstrap"]
|
||||||
features = ["security aware", "fast by default", "seo-ready", "development tools", "bootstrap framework", "netlify-ready", "full text search", "page layouts"]
|
features = ["security aware", "fast by default", "seo-ready", "development tools", "bootstrap framework", "netlify-ready", "full text search", "page layouts", "versioned documentation"]
|
||||||
min_version = "0.109.0"
|
min_version = "0.110.0"
|
||||||
|
|
||||||
[author]
|
[author]
|
||||||
name = "Mark Dumay"
|
name = "Mark Dumay"
|
||||||
|
Reference in New Issue
Block a user