Compare commits

...

176 Commits

Author SHA1 Message Date
Mark Dumay
f35c66c0ae Merge pull request #371 from gethinode/markdumay-patch-2
Update tested nodejs versions
2023-07-30 15:00:39 +02:00
Mark Dumay
f479764542 Update tested nodejs versions 2023-07-30 14:53:42 +02:00
Mark Dumay
ab7cc04821 Merge pull request #370 from gethinode/markdumay-patch-1
Update tested nodejs versions
2023-07-30 14:53:06 +02:00
Mark Dumay
833e438a23 Update tested nodejs versions 2023-07-30 14:44:02 +02:00
Mark Dumay
9d829b6d94 Merge pull request #368 from gethinode/link
Improve support for managed links
2023-07-30 14:38:33 +02:00
Mark Dumay
0f42fae2c4 Merge branch 'main' into link 2023-07-30 14:29:21 +02:00
mark
a2f7749aa2 Bump package version 2023-07-30 14:28:24 +02:00
mark
ba87ccd4a5 Set cue and tab to false by default 2023-07-30 14:19:04 +02:00
mark
1c68399313 Rename icon to cue 2023-07-30 14:18:25 +02:00
mark
30714ef6da Support class arg 2023-07-30 14:17:21 +02:00
mark
1ef92a0928 Adjust margin when using badges 2023-07-30 14:15:35 +02:00
mark
8331a6ce7c Sync button shortcode with partial 2023-07-30 12:05:05 +02:00
mark
fd34766ffb Add support for tab and cue args 2023-07-30 12:04:22 +02:00
mark
78573f8e51 Fix text and icon alignment 2023-07-30 12:03:40 +02:00
mark
4a0cc8bc88 Rename icon to cue 2023-07-30 12:02:38 +02:00
mark
8fd6f2af4e Support external links config 2023-07-29 14:00:26 +02:00
mark
0191e14a69 Add link shortcode and partial 2023-07-29 13:35:25 +02:00
github-actions[bot]
1f8fb26278 Merge pull request #367 from gethinode/dependabot/npm_and_yarn/eslint-plugin-import-2.28.0
Bump eslint-plugin-import from 2.27.5 to 2.28.0
2023-07-28 14:08:06 +00:00
dependabot[bot]
50548237c6 Bump eslint-plugin-import from 2.27.5 to 2.28.0
Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.27.5 to 2.28.0.
- [Release notes](https://github.com/import-js/eslint-plugin-import/releases)
- [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md)
- [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.27.5...v2.28.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-import
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-28 14:04:01 +00:00
mark
7f35cf45ef Fix navbar aria ID 2023-07-28 12:42:56 +02:00
Mark Dumay
528f84c8c6 Merge pull request #366 from gethinode/develop
Add typed alerts
2023-07-28 12:21:35 +02:00
Mark Dumay
33ab75ed84 Merge branch 'main' into develop 2023-07-28 12:01:30 +02:00
mark
3010136585 Bump package version 2023-07-28 12:00:45 +02:00
Mark Dumay
676a28c322 Merge pull request #365 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2023-07-28 12:00:04 +02:00
mark
a04ec4d73e Support typed alerts 2023-07-28 11:59:33 +02:00
markdumay
fcc93788a9 fix: update Hugo module dependencies 2023-07-28 06:38:30 +00:00
mark
f949a785a1 Fix upgrade command 2023-07-26 17:53:23 +02:00
Mark Dumay
becba931bc Merge pull request #364 from gethinode/develop
Fix sharing links
2023-07-26 17:49:23 +02:00
Mark Dumay
03e3c5b3ee Merge branch 'main' into develop 2023-07-26 17:41:40 +02:00
mark
311aa3b957 Bump package release 2023-07-26 17:40:56 +02:00
mark
62db3eb9db Fix sharing links 2023-07-26 17:40:24 +02:00
Mark Dumay
56ea9eec47 Merge pull request #363 from gethinode/develop
Add canonifyAssetsURLs option
2023-07-26 17:31:55 +02:00
mark
b845e210b7 Add canonifyAssetsURLs option 2023-07-26 17:13:53 +02:00
Mark Dumay
e8bba05213 Merge pull request #362 from gethinode/main
Sync with main
2023-07-26 15:19:14 +02:00
Mark Dumay
74d0d625c6 Merge pull request #361 from gethinode/permalink
Use relative permalinks by default
2023-07-26 15:04:36 +02:00
mark
9d98a3568c Bump package release 2023-07-26 14:58:01 +02:00
Mark Dumay
dc55571f7a Merge pull request #360 from gethinode/main
Sync with main
2023-07-26 14:55:57 +02:00
Mark Dumay
b7ab9d5690 Merge pull request #359 from gethinode/develop
Refinement
2023-07-26 14:49:44 +02:00
mark
5d20be19a8 Update path for color script 2023-07-26 14:43:15 +02:00
mark
ecae077e2d Use relative permalinks by default 2023-07-26 14:41:55 +02:00
Mark Dumay
132c316ff0 Merge branch 'main' into develop 2023-07-26 14:38:08 +02:00
mark
a3b9081b4d Bump package version 2023-07-26 14:03:25 +02:00
mark
8a689a95de Bump dependencies 2023-07-26 14:02:44 +02:00
mark
9bd04a5b2a Fix complement error for undefined core modules 2023-07-26 09:19:30 +02:00
mark
8dc884f846 Add npm install command 2023-07-26 09:02:31 +02:00
Mark Dumay
4cb558440b Merge pull request #357 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2023-07-24 20:01:52 +02:00
mark
0d78918aa4 Set dark mode to disabled by default 2023-07-24 17:18:23 +02:00
mark
ba7ab907ef Fix behavior of critical scripts 2023-07-24 17:18:06 +02:00
markdumay
af557ac054 fix: update Hugo module dependencies 2023-07-23 03:15:51 +00:00
Mark Dumay
9ada0eee80 Merge pull request #355 from gethinode/develop
Fix behavior in default state
2023-07-22 14:57:41 +02:00
Mark Dumay
ae3e20b596 Merge branch 'main' into develop 2023-07-22 14:46:19 +02:00
mark
c49e6f14c1 Bump package version 2023-07-22 14:45:17 +02:00
mark
b4f6b1aa3d Move bootstrap mod check to base template 2023-07-22 14:44:46 +02:00
mark
962549f2ae Allow undefined main menu 2023-07-22 13:13:40 +02:00
Mark Dumay
28601323c4 Update README.md 2023-07-22 07:52:46 +02:00
Mark Dumay
a11ee72174 Merge pull request #354 from gethinode/develop
Bump package version
2023-07-22 06:31:01 +02:00
Mark Dumay
8e91440261 Merge branch 'main' into develop 2023-07-22 06:21:36 +02:00
mark
19879c4ecc Bump package version 2023-07-22 06:21:01 +02:00
Mark Dumay
810dfef311 Merge pull request #353 from gethinode/develop
Fix overflow of syntax highlight
2023-07-22 06:19:56 +02:00
Mark Dumay
c42fcefa73 Merge branch 'main' into develop 2023-07-22 06:12:58 +02:00
mark
a3c417e378 Fix overflow of syntax highlight 2023-07-22 06:10:11 +02:00
Mark Dumay
2bee381906 Merge pull request #352 from gethinode/develop
Enable filename-only in file and docs shortcode
2023-07-21 16:15:34 +02:00
Mark Dumay
244a3f7496 Merge branch 'main' into develop 2023-07-21 16:08:16 +02:00
mark
563b526cea Bump package release 2023-07-21 16:07:09 +02:00
mark
fa7fad67b5 Add full arg to shortcode 2023-07-21 16:06:32 +02:00
Mark Dumay
966906778d Merge pull request #350 from gethinode/develop
Clean-up after modules
2023-07-21 15:48:58 +02:00
mark
135128a5f9 Promote to v0.16 release 2023-07-21 15:27:07 +02:00
Mark Dumay
25663974ce Merge branch 'main' into develop 2023-07-21 15:11:26 +02:00
mark
af5643f98f fix #336 2023-07-21 14:59:18 +02:00
mark
743126d9b9 Remove obsolete files now part of mod-fontawesome 2023-07-21 14:51:27 +02:00
mark
b0187e3a75 Bump dependencies 2023-07-21 14:50:56 +02:00
mark
c7613ab7a8 Add force-check if file exists 2023-07-21 14:47:59 +02:00
mark
2a6a119762 Fix docs typo 2023-07-21 14:47:44 +02:00
mark
b556f4f4ec feat: add file shortcode 2023-07-21 14:47:29 +02:00
mark
9fa95da778 Add katex to safelist for css purge 2023-07-21 11:30:57 +02:00
Mark Dumay
3a07b36447 Merge pull request #349 from gethinode/develop
Improve default mounts
2023-07-21 10:06:53 +02:00
mark
ca5ed02bf9 Bump package release 2023-07-21 09:59:34 +02:00
Mark Dumay
d19321af56 Merge branch 'main' into develop 2023-07-21 09:57:27 +02:00
mark
142e21d792 Adjust default mounts 2023-07-21 09:56:21 +02:00
mark
4c00655584 Add JS and SCSS debugging option 2023-07-21 09:45:21 +02:00
mark
38a2b9ff72 Improve syntax color 2023-07-21 09:32:53 +02:00
mark
efe8837eb3 Add leaflet to purge CSS safelist 2023-07-21 08:55:01 +02:00
mark
130e95ace5 Update mod-flexsearch 2023-07-21 08:38:12 +02:00
mark
e6e38ac7c3 Show I18n warnings when running prod server 2023-07-21 08:37:54 +02:00
mark
3c0a6079af Update purge script to use modules 2023-07-21 08:37:15 +02:00
Mark Dumay
4ae09056d3 Merge pull request #348 from gethinode/develop
Fix project icon
2023-07-21 06:12:32 +02:00
mark
c20f367894 Bump package release 2023-07-21 06:06:29 +02:00
Mark Dumay
4e41b5d233 Merge pull request #347 from gethinode/main
Sync with main
2023-07-21 06:02:32 +02:00
Mark Dumay
b78e9bd154 Merge pull request #346 from gethinode/leaflet
Add KaTeX support
2023-07-21 05:57:42 +02:00
mark
5caaeae073 Add KaTeX example 2023-07-21 05:51:56 +02:00
mark
df99d74a30 Fix linting issues 2023-07-21 05:51:45 +02:00
Mark Dumay
976c541b03 Merge branch 'main' into leaflet 2023-07-21 05:44:25 +02:00
mark
853a2f0ddd Update katex module 2023-07-21 05:42:34 +02:00
mark
e7b6216e4e Change create:syntax command to logical order 2023-07-21 05:42:21 +02:00
mark
5f3e3fca43 Clear local _vendor dir before vendor command 2023-07-21 05:41:45 +02:00
mark
3e2340a14a Add command to clean mod cache 2023-07-21 05:40:50 +02:00
mark
52f9dc5016 Add katex module 2023-07-21 04:59:10 +02:00
mark
542bf1103e Add KaTeX example 2023-07-20 17:14:09 +02:00
mark
04d1d24c7b Add skipTemplate feature 2023-07-20 17:13:46 +02:00
mark
398028858e Schedule daily Hugo module upgrade 2023-07-20 16:30:07 +02:00
mark
8658d02264 Add comments 2023-07-20 16:29:41 +02:00
github-actions[bot]
6adb066773 Merge pull request #345 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.111.4
Bump hugo-bin from 0.111.3 to 0.111.4
2023-07-20 13:57:30 +00:00
dependabot[bot]
b68a632b63 Bump hugo-bin from 0.111.3 to 0.111.4
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.111.3 to 0.111.4.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.111.3...v0.111.4)

---
updated-dependencies:
- dependency-name: hugo-bin
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-20 13:52:49 +00:00
github-actions[bot]
20d9de6c0f Merge pull request #344 from gethinode/dependabot/npm_and_yarn/stylelint-15.10.2
Bump stylelint from 15.10.1 to 15.10.2
2023-07-19 13:36:29 +00:00
dependabot[bot]
51a26c4be8 Bump stylelint from 15.10.1 to 15.10.2
Bumps [stylelint](https://github.com/stylelint/stylelint) from 15.10.1 to 15.10.2.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/15.10.1...15.10.2)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 13:31:00 +00:00
Mark Dumay
ef136b33da Merge pull request #342 from gethinode/leaflet
Add support for core and optional modules
2023-07-17 17:03:57 +02:00
mark
04262c00d2 Fix variable injection 2023-07-17 16:55:16 +02:00
mark
bc17718fb8 Fix navbar-offset var 2023-07-17 16:52:55 +02:00
mark
bd277e420c Add data directive to img-src 2023-07-17 16:43:47 +02:00
mark
69e196f8c2 Allow tile.openstreetmap.org as img-src 2023-07-17 16:35:01 +02:00
Mark Dumay
6663d8de58 Merge branch 'main' into leaflet 2023-07-17 15:42:32 +02:00
github-actions[bot]
99d457a091 Merge pull request #343 from gethinode/dependabot/npm_and_yarn/eslint-8.45.0
Bump eslint from 8.44.0 to 8.45.0
2023-07-17 13:30:54 +00:00
dependabot[bot]
4b1a72d1c0 Bump eslint from 8.44.0 to 8.45.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.44.0 to 8.45.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.44.0...v8.45.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 13:25:06 +00:00
Mark Dumay
02875e731f Merge branch 'main' into leaflet 2023-07-17 15:15:21 +02:00
mark
50664248ca Bump package release 2023-07-17 15:13:58 +02:00
mark
b3491cdadb Refactor bundling code 2023-07-17 15:07:52 +02:00
mark
fe822cccaf Improve handling of modules 2023-07-17 15:07:50 +02:00
mark
c0bcb96275 Add Hinode theme badge 2023-07-17 15:01:13 +02:00
mark
cb09aba813 Add mod vendor to scripts 2023-07-17 15:01:00 +02:00
mark
fac6581dc9 Add core modules 2023-07-17 15:00:36 +02:00
mark
3ef2392913 Exclude _vendor from Git repo 2023-07-17 14:53:30 +02:00
mark
8531bf988f Use search code from mod-flexsearch 2023-07-17 11:57:49 +02:00
github-actions[bot]
bb2d3e7eeb Merge pull request #341 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.111.3
Bump hugo-bin from 0.111.2 to 0.111.3
2023-07-14 13:42:20 +00:00
dependabot[bot]
7892bd6afe Bump hugo-bin from 0.111.2 to 0.111.3
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.111.2 to 0.111.3.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.111.2...v0.111.3)

---
updated-dependencies:
- dependency-name: hugo-bin
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-14 13:39:11 +00:00
mark
733b8b6dc8 Support core and optional stylesheets 2023-07-11 16:50:47 +02:00
mark
b5fb0d3ea8 Support optional stylesheets 2023-07-11 16:50:26 +02:00
mark
31e3fdc534 Move fonts from stylesheet.html to head.html 2023-07-11 16:49:38 +02:00
mark
641f2ee1d1 Add optional folder 2023-07-11 16:47:36 +02:00
mark
951f595d29 Adjust CSP to support openstreetmap 2023-07-11 16:46:56 +02:00
mark
cab4338b23 Add debug statements 2023-07-11 16:46:30 +02:00
mark
0921b1467e Add initial Hugo modules 2023-07-11 16:45:52 +02:00
mark
23a1f2fed9 Remove obsolete Font Awesome import statements 2023-07-11 16:45:16 +02:00
mark
1acc1a5264 Enable leaflet module 2023-07-11 16:44:50 +02:00
mark
3c60c2c512 Add js support for optional modules 2023-07-11 16:41:36 +02:00
mark
9d3ac01de2 Add initial modules 2023-07-11 16:40:12 +02:00
mark
09973c5a23 Add module support 2023-07-11 16:39:55 +02:00
github-actions[bot]
2ed01bb499 Merge pull request #338 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.111.2
Bump hugo-bin from 0.111.1 to 0.111.2
2023-07-10 13:31:02 +00:00
dependabot[bot]
bca302323a Bump hugo-bin from 0.111.1 to 0.111.2
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.111.1 to 0.111.2.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.111.1...v0.111.2)

---
updated-dependencies:
- dependency-name: hugo-bin
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 13:27:44 +00:00
mark
ac0152640b Fix typo 2023-07-10 12:04:41 +02:00
mark
5e15eb5dae Remove indentation of code example 2023-07-10 12:03:24 +02:00
mark
c1515325a8 Add components blog post 2023-07-10 12:01:47 +02:00
github-actions[bot]
6fbec8dbac Merge pull request #335 from gethinode/dependabot/npm_and_yarn/stylelint-15.10.1
Bump stylelint from 15.10.0 to 15.10.1
2023-07-06 13:16:43 +00:00
dependabot[bot]
6e20600893 Bump stylelint from 15.10.0 to 15.10.1
Bumps [stylelint](https://github.com/stylelint/stylelint) from 15.10.0 to 15.10.1.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/15.10.0...15.10.1)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-06 13:13:10 +00:00
github-actions[bot]
de7fb8927f Merge pull request #332 from gethinode/dependabot/npm_and_yarn/stylelint-15.10.0
Bump stylelint from 15.9.0 to 15.10.0
2023-07-05 13:44:39 +00:00
dependabot[bot]
c14e45ac49 Bump stylelint from 15.9.0 to 15.10.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 15.9.0 to 15.10.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/15.9.0...15.10.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-05 13:41:17 +00:00
github-actions[bot]
32fd291194 Merge pull request #330 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.111.1
Bump hugo-bin from 0.111.0 to 0.111.1
2023-07-04 13:42:22 +00:00
dependabot[bot]
b45d0155ea Bump hugo-bin from 0.111.0 to 0.111.1
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.111.0 to 0.111.1.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.111.0...v0.111.1)

---
updated-dependencies:
- dependency-name: hugo-bin
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-04 13:38:22 +00:00
mark
0530b2ea1e Sync project icon with English version 2023-07-04 11:33:07 +02:00
Mark Dumay
8678741f72 Merge pull request #329 from gethinode/main
Sync with main
2023-07-04 11:13:13 +02:00
Mark Dumay
8c4e11b99f Merge pull request #328 from gethinode/timeline
Fix incorrectly joined URLs
2023-07-04 09:42:51 +02:00
Mark Dumay
00818cb91f Merge branch 'main' into timeline 2023-07-04 09:35:27 +02:00
mark
b3469d277c Bump package release 2023-07-04 09:34:41 +02:00
mark
3627059227 Refactor code to join URL 2023-07-04 09:34:13 +02:00
mark
4f92886b21 Fix joining of URL 2023-07-04 09:33:59 +02:00
mark
0c2f951b81 Adjust formatting 2023-07-04 09:06:15 +02:00
mark
300efb780c Fix link behavior for non-urls 2023-07-04 09:05:49 +02:00
Mark Dumay
42a4fc4618 Merge pull request #327 from gethinode/timeline
Enhance timeline component
2023-07-04 07:05:56 +02:00
Mark Dumay
683ffff1b2 Merge branch 'main' into timeline 2023-07-04 06:40:56 +02:00
mark
7738c06b6c Bump package release 2023-07-04 06:32:28 +02:00
mark
9aca661574 Change preview background color to dark subtle 2023-07-04 06:32:06 +02:00
mark
3d5440fa3d Add background color support 2023-07-04 06:31:33 +02:00
mark
4854d238b7 Add support for badges 2023-07-04 05:40:19 +02:00
github-actions[bot]
898764eb12 Merge pull request #325 from gethinode/dependabot/npm_and_yarn/eslint-8.44.0
Bump eslint from 8.43.0 to 8.44.0
2023-07-03 13:55:10 +00:00
dependabot[bot]
40e66bba8a Bump eslint from 8.43.0 to 8.44.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.43.0 to 8.44.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.43.0...v8.44.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-03 13:51:42 +00:00
Mark Dumay
a543db250f Merge pull request #324 from gethinode/timeline
Add timeline shortcode
2023-07-03 13:41:46 +02:00
mark
8d6b34716f Fix var typo 2023-07-03 13:33:26 +02:00
Mark Dumay
ea89e1c8b5 Merge branch 'main' into timeline 2023-07-03 13:20:57 +02:00
mark
fb6d47c33e Bump package release 2023-07-03 13:18:04 +02:00
mark
dc71f43faf Remove temp blog post 2023-07-03 13:16:07 +02:00
mark
78df40873f Fix highlight color of panels with limited text 2023-07-03 13:14:40 +02:00
mark
43f996acc3 Add internataional timeline examples 2023-07-03 13:14:12 +02:00
mark
dd51fbd542 Add support for smaller screens 2023-07-03 13:02:43 +02:00
mark
49df936f3b Refactor panel code 2023-07-03 11:08:12 +02:00
mark
b6643f12dd Refactor icon code 2023-07-03 10:59:39 +02:00
mark
2de996242a Add scss docs tags 2023-07-03 10:46:52 +02:00
mark
3b8611ebd0 Add initial timeline component 2023-07-03 07:25:47 +02:00
70 changed files with 2305 additions and 1114 deletions

View File

@@ -1,5 +1,5 @@
assets/js/critical/color.js
assets/js/analytics.js assets/js/analytics.js
assets/js/color.js
assets/js/flexsearch.js assets/js/flexsearch.js
assets/js/vendor assets/js/vendor
node_modules node_modules

View File

@@ -12,7 +12,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-latest] os: [macos-latest, windows-latest, ubuntu-latest]
node-version: [14.x, 16.x, 18.x] node-version: [16.x, 18.x, 20.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x, 16.x, 18.x] node-version: [16.x, 18.x, 20.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps: steps:

37
.github/workflows/update.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: Update Hugo Dependencies
on:
workflow_dispatch:
schedule:
- cron: '0 3 * * *' # run daily at 03:00 AM
permissions:
pull-requests: write
jobs:
update-dep:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: "lts/*"
- name: Install dependencies
run: npm ci
- name: Update Hugo module dependencies
run: npm run mod:update
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.HUGO_MOD_PR }}
commit-message: 'fix: update Hugo module dependencies'
branch: hugo-mod-dependencies
delete-branch: true
title: 'Update Hugo module dependencies'
body: >
This PR is auto-generated by
[create-pull-request](https://github.com/peter-evans/create-pull-request).
labels: dependencies

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
/_vendor
/public /public
resources/ resources/
node_modules/ node_modules/

View File

@@ -11,6 +11,9 @@
<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>
<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"> <a href="https://www.npmjs.com/package/%40gethinode/hinode" alt="npm package">
<img src="https://img.shields.io/npm/v/%40gethinode/hinode"> <img src="https://img.shields.io/npm/v/%40gethinode/hinode">
</a> </a>
@@ -53,10 +56,11 @@
- [PageSpeed Insights][pagespeed] - [PageSpeed Insights][pagespeed]
- [Mozilla Observatory][observatory] - [Mozilla Observatory][observatory]
Hinode is a clean documentation and blog theme for [Hugo][hugo], an open-source static site generator. Based on the [Bootstrap 5][bootstrap] framework, the rendered site is fast, secure, and responsive. Hinode uses [FlexSearch][flexsearch] to enable full text search across your site. Finally, the theme uses [Node Package Manager][npm] to automate the build process and to keep track of dependencies. Hinode is a clean documentation and blog theme for [Hugo][hugo], an open-source static site generator. Based on the [Bootstrap 5][bootstrap] framework, the rendered site is fast, secure, and responsive. Hinode uses [FlexSearch][flexsearch] to enable full text search across your site. Finally, the theme supports [Node Package Manager][npm] to automate the build process and to keep track of dependencies.
Additional features include: Additional features include:
- Flexible configuration of Hugo modules
- 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

BIN
assets/img/puzzle.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

View File

@@ -1,3 +1,5 @@
{{- if site.Params.main.enableDarkMode -}}
/*! /*!
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 The Bootstrap Authors
@@ -68,3 +70,5 @@
}) })
}) })
})() })()
{{- end -}}

View File

@@ -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 -}}

View File

View File

@@ -5,61 +5,8 @@
@import "common/variables.scss"; @import "common/variables.scss";
@import "common/icons.scss"; @import "common/icons.scss";
// Import Bootstrap banner and functions // Import Bootstrap configuration (mounted by core Bootstrap module)
@import "bootstrap/scss/mixins/banner"; @import "bootstrap.scss";
@include bsBanner("");
@import "bootstrap/scss/functions";
// Import Bootstrap configuration
@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/alert.scss";
@@ -76,9 +23,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";
@@ -101,5 +48,5 @@
// Import theme placeholder // Import theme placeholder
@import "theme/theme.scss"; @import "theme/theme.scss";
// Import Bootstrap utilities API // Import Bootstrap utilities API (mounted by core Bootstrap module)
@import "bootstrap/scss/utilities/api"; @import "modules/bootstrap/utilities/api";

View File

@@ -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;
}
}

View File

@@ -6,9 +6,9 @@
/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } /* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } /* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } /* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
/* LineHighlight */ .chroma .hl { background-color: #ffffcc } /* LineHighlight */ .chroma .hl { background-color: #b8b800 }
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #64686c } /* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #64686c }
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #6e7681 } /* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #6e7681 }
/* Line */ .chroma .line { display: flex; } /* Line */ .chroma .line { display: flex; }
/* Keyword */ .chroma .k { color: #ff7b72 } /* Keyword */ .chroma .k { color: #ff7b72 }
/* KeywordConstant */ .chroma .kc { color: #79c0ff } /* KeywordConstant */ .chroma .kc { color: #79c0ff }

View File

@@ -7,8 +7,8 @@
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } /* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } /* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
/* LineHighlight */ .chroma .hl { background-color: #ffffcc } /* LineHighlight */ .chroma .hl { background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } /* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } /* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* Line */ .chroma .line { display: flex; } /* Line */ .chroma .line { display: flex; }
/* Keyword */ .chroma .k { color: #000000; font-weight: bold } /* Keyword */ .chroma .k { color: #000000; font-weight: bold }
/* KeywordConstant */ .chroma .kc { color: #000000; font-weight: bold } /* KeywordConstant */ .chroma .kc { color: #000000; font-weight: bold }

View File

@@ -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,
@@ -10,15 +10,16 @@
.syntax-highlight { .syntax-highlight {
background-color: var(--bs-light) if($enable-important-utilities, !important, null); background-color: var(--bs-light) if($enable-important-utilities, !important, null);
overflow-x: auto;
} }
.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,
@@ -29,6 +30,7 @@
.syntax-highlight { .syntax-highlight {
background-color: var(--bs-tertiary-bg) if($enable-important-utilities, !important, null); background-color: var(--bs-tertiary-bg) if($enable-important-utilities, !important, null);
overflow-x: auto;
} }
.bg, .bg,

View 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);
}

View File

@@ -87,25 +87,33 @@ home = ["HTML", "RSS", "REDIR"]
extended = true extended = true
min = "0.110.0" min = "0.110.0"
max = "" max = ""
[[module.mounts]]
source = "archetypes"
target = "archetypes"
[[module.mounts]] [[module.mounts]]
source = "assets" source = "assets"
target = "assets" target = "assets"
[[module.mounts]]
source = "i18n"
target = "i18n"
[[module.mounts]]
source = "layouts"
target = "layouts"
[[module.mounts]] [[module.mounts]]
source = "static" source = "static"
target = "static" target = "static"
[[module.mounts]] [[module.mounts]]
source = "static/fonts" source = "netlify.toml"
target = "static/fonts" target = "assets/config/netlify.toml"
# 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-katex"
# toml-docs-end javascript [[module.imports]]
[[module.mounts]] path = "github.com/gethinode/mod-leaflet"
source = "node_modules/@fortawesome/fontawesome-free/webfonts" # toml-docs-end modules
target = "static/fonts"

View File

@@ -4,8 +4,26 @@
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."
enableDarkMode = true enableDarkMode = true
modes = ["light", "dark"] modes = ["light", "dark"]
canonifyAssetsURLs = false
[main.externalLinks]
cue = false
tab = false
# toml-docs-end main # toml-docs-end main
# toml-docs-start modules
[modules]
core = ["bootstrap", "flexsearch", "fontawesome"]
optional = ["leaflet", "katex"]
excludeSCSS = ["bootstrap"]
disableTemplate = ["katex"]
# toml-docs-end modules
# toml-docs-start debugging
[debugging]
showJS = false
showSCSS = false
# toml-docs-end debugging
# toml-docs-start docs # toml-docs-start docs
[docs] [docs]
github = "https://github.com/gethinode/hinode" github = "https://github.com/gethinode/hinode"

View File

@@ -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' \
""" """

View File

@@ -21,12 +21,15 @@ const purgecss = require('@fullhuman/postcss-purgecss')({
'./assets/scss/components/_syntax-light.scss', './assets/scss/components/_syntax-light.scss',
'./assets/scss/theme/fonts.scss', './assets/scss/theme/fonts.scss',
'./assets/scss/theme/theme.scss', './assets/scss/theme/theme.scss',
'./node_modules/bootstrap/scss/_carousel.scss', './_vendor/github.com/gethinode/mod-flexsearch/assets/scss/modules/flexsearch/flexsearch.scss',
'./node_modules/bootstrap/scss/_dropdown.scss', './_vendor/github.com/gethinode/mod-katex/dist/katex.scss',
'./node_modules/bootstrap/scss/_reboot.scss', './_vendor/github.com/gethinode/mod-leaflet/dist/leaflet.scss',
'./node_modules/bootstrap/scss/_tooltip.scss', './_vendor/github.com/twbs/bootstrap/scss/_carousel.scss',
'./node_modules/bootstrap/scss/_transitions.scss', './_vendor/github.com/twbs/bootstrap/scss/_dropdown.scss',
'./node_modules/bootstrap/scss/_utilities.scss' './_vendor/github.com/twbs/bootstrap/scss/_reboot.scss',
'./_vendor/github.com/twbs/bootstrap/scss/_tooltip.scss',
'./_vendor/github.com/twbs/bootstrap/scss/_transitions.scss',
'./_vendor/github.com/twbs/bootstrap/scss/_utilities.scss'
]) ])
] ]
}) })

View File

@@ -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.

View File

@@ -0,0 +1,36 @@
---
author: Mark Dumay
title: Components
date: 2023-07-21
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: ["katex", "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.
## Formula (KaTeX)
As an example, the following markdown renders two formulas using the KaTeX typesetting library.
{{< example lang="markdown" >}}
This is an inline $-b \pm \sqrt{b^2 - 4ac} \over 2a$ formula
This is not an inline formula:
$$x = a_0 + \frac{1}{a_1 + \frac{1}{a_2 + \frac{1}{a_3 + a_4}}}$$
$$\forall x \in X, \quad \exists y \leq \epsilon$$
{{< /example >}}
## 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 -->

View File

@@ -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.

View File

@@ -0,0 +1,37 @@
---
author: Mark Dumay
title: Componenten
slug: componenten
date: 2023-07-21
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>
modules: ["katex", "leaflet"]
---
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.
## Formule (KaTeX)
De volgende markdown code genereert twee wiskundige formules met behulp van KaTeX.
{{< example lang="markdown" >}}
Dit is een inline $-b \pm \sqrt{b^2 - 4ac} \over 2a$ formule
Dit is geen inline formule:
$$x = a_0 + \frac{1}{a_1 + \frac{1}{a_2 + \frac{1}{a_3 + a_4}}}$$
$$\forall x \in X, \quad \exists y \leq \epsilon$$
{{< /example >}}
## 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 -->

View File

@@ -6,9 +6,7 @@ url: "projecten/ander-project"
date: 2021-07-15 date: 2021-07-15
description: "Een ander project." description: "Een ander project."
tags: ["javascript", "golang"] tags: ["javascript", "golang"]
thumbnail: img/coffee.jpg # https://picsum.photos/id/1060/5598/3732 icon: fas rocket
photoCredits: <a href="https://unsplash.com/@kfred">Karl Fredrickson</a>
photoSource: <a href="https://unsplash.com/photos/TYIzeCiZ_60">Unsplash</a>
--- ---
Vivamus iaculis metus sed magna porta tincidunt. Aliquam molestie eget orci eu elementum. Integer pellentesque dolor sit amet suscipit maximus. Duis consequat, massa vitae volutpat rhoncus, erat augue venenatis velit, a auctor leo nulla nec turpis. Nunc ut libero sapien. Vivamus aliquam ultrices vestibulum. Sed sit amet vestibulum dolor, ut vehicula diam. Sed felis purus, feugiat vitae vulputate quis, sodales vitae dui. Pellentesque volutpat fringilla sapien varius condimentum. Integer odio massa, pharetra at bibendum vitae, aliquam nec erat. Vivamus iaculis metus sed magna porta tincidunt. Aliquam molestie eget orci eu elementum. Integer pellentesque dolor sit amet suscipit maximus. Duis consequat, massa vitae volutpat rhoncus, erat augue venenatis velit, a auctor leo nulla nec turpis. Nunc ut libero sapien. Vivamus aliquam ultrices vestibulum. Sed sit amet vestibulum dolor, ut vehicula diam. Sed felis purus, feugiat vitae vulputate quis, sodales vitae dui. Pellentesque volutpat fringilla sapien varius condimentum. Integer odio massa, pharetra at bibendum vitae, aliquam nec erat.

View File

@@ -6,9 +6,7 @@ url: "projecten/voorbeeldproject"
date: 2021-07-15 date: 2021-07-15
description: "Een voorbeeldproject." description: "Een voorbeeldproject."
tags: ["html", "css"] tags: ["html", "css"]
thumbnail: img/laptop.jpg # https://picsum.photos/id/0/5616/3744 icon: fab docker
photoCredits: <a href="https://unsplash.com/@alejandroescamilla">Alejandro Escamilla</a>
photoSource: <a href="https://unsplash.com/photos/yC-Yzbqy7PY">Unsplash</a>
--- ---
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

35
data/timeline-en.yml Normal file
View 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
View 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.

11
go.mod Normal file
View File

@@ -0,0 +1,11 @@
module github.com/gethinode/hinode
go 1.19
require (
github.com/gethinode/mod-bootstrap v1.1.1 // indirect
github.com/gethinode/mod-flexsearch v1.1.4 // indirect
github.com/gethinode/mod-fontawesome v1.2.1 // indirect
github.com/gethinode/mod-katex v1.0.2 // indirect
github.com/gethinode/mod-leaflet v0.3.3 // indirect
)

38
go.sum Normal file
View File

@@ -0,0 +1,38 @@
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-bootstrap v1.1.1 h1:Tx4M5hGVOFrEaxnUONDAm6N9xuRi5UphKlT7F26HujU=
github.com/gethinode/mod-bootstrap v1.1.1/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-flexsearch v1.1.1 h1:zHypfKR/rWPAwqNXvo09Pp3vGqU4w3r7d2VtMudIzkI=
github.com/gethinode/mod-flexsearch v1.1.1/go.mod h1:TXbGbWsvmhBdsTzRt887mcpFfr4ORpzG3+h/l4W3YM4=
github.com/gethinode/mod-flexsearch v1.1.2 h1:vA/jHxLq9xxkYGS9cmAoLNIkEBW+iLVCcQ8qKyEa+R4=
github.com/gethinode/mod-flexsearch v1.1.2/go.mod h1:TXbGbWsvmhBdsTzRt887mcpFfr4ORpzG3+h/l4W3YM4=
github.com/gethinode/mod-flexsearch v1.1.3 h1:lzmSvnJL6ABjp03avYzSvJJ7hw01CpHap1JGUbDIELg=
github.com/gethinode/mod-flexsearch v1.1.3/go.mod h1:TXbGbWsvmhBdsTzRt887mcpFfr4ORpzG3+h/l4W3YM4=
github.com/gethinode/mod-flexsearch v1.1.4 h1:dJvwBxYlLe/VGlctLn8k89STJ5toATIjNnXIlNeanOY=
github.com/gethinode/mod-flexsearch v1.1.4/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-fontawesome v1.2.1 h1:k7z5ZRsNxCohZjlZm8jVAzmTPk17c6xMYBAjAXHs13I=
github.com/gethinode/mod-fontawesome v1.2.1/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-katex v1.0.0 h1:me/3dIIZBkfk1mRIFt8QiAGYwYDoSG5bc2hHRtIutFc=
github.com/gethinode/mod-katex v1.0.0/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-katex v1.0.1 h1:809QUztxmKgMNchU+v03iMO7Ma+ISc3ZzhXYauc21rs=
github.com/gethinode/mod-katex v1.0.1/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-katex v1.0.2 h1:pIG4n3qLl/IVe7BEiwn+GL8r5lOCtF6FDxlcrPKdAXk=
github.com/gethinode/mod-katex v1.0.2/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
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=
github.com/gethinode/mod-leaflet v0.3.3 h1:isnjja6VRFvVWBatYSouh46TXSJg2C4/E2BQTrQw+yI=
github.com/gethinode/mod-leaflet v0.3.3/go.mod h1:uGggt87x4Fw7wBoJpSiUvNkYg+s/Ujne7klAX2rxMRk=

View File

@@ -37,6 +37,8 @@
translation: "Wörter" translation: "Wörter"
- id: copyright - id: copyright
translation: "Copyright" translation: "Copyright"
- id: rights
translation: "Alle Rechte vorbehalten"
- id: photoBy - id: photoBy
translation: "Foto von" translation: "Foto von"
- id: photoOn - id: photoOn

View File

@@ -45,6 +45,8 @@
translation: "words" translation: "words"
- id: copyright - id: copyright
translation: "Copyright" translation: "Copyright"
- id: rights
translation: "All rights reserved"
- id: photoBy - id: photoBy
translation: "Photo by" translation: "Photo by"
- id: photoOn - id: photoOn
@@ -138,7 +140,7 @@
- id: show - id: show
translation: "Show" translation: "Show"
- id: comments - id: comments
translation: "comments" translation: "Comments"
# Related posts # Related posts
- id: seeAlso - id: seeAlso

View File

@@ -37,6 +37,8 @@
translation: "woorden" translation: "woorden"
- id: copyright - id: copyright
translation: "Copyright" translation: "Copyright"
- id: rights
translation: "Alle rechten voorbehouden"
- id: photoBy - id: photoBy
translation: "Foto van" translation: "Foto van"
- id: photoOn - id: photoOn
@@ -129,7 +131,7 @@
- id: show - id: show
translation: "Tonen" translation: "Tonen"
- id: comments - id: comments
translation: "commentaar" translation: "Reacties"
# Related posts # Related posts
- id: seeAlso - id: seeAlso

View File

@@ -12,6 +12,10 @@
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{- if and .IsPage (not (in .Site.Params.modules.core "bootstrap")) -}}
{{- errorf "Bootstrap is a required module, please add it to 'modules.core' in your site parameters" -}}
{{- end -}}
<!doctype html> <!doctype html>
<html lang="{{ .Site.Language.Lang }}" class="no-js"> <html lang="{{ .Site.Language.Lang }}" class="no-js">
<head> <head>
@@ -19,9 +23,7 @@
</head> </head>
<body> <body>
{{- if site.Params.main.enableDarkMode -}} {{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "header" true "page" .) -}}
{{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "header" true "page" .) -}}
{{- end -}}
<div class="d-flex flex-column min-vh-100{{ if and .IsHome .Site.Params.home.style }} {{ .Site.Params.home.style }}{{ end }}"> <div class="d-flex flex-column min-vh-100{{ if and .IsHome .Site.Params.home.style }} {{ .Site.Params.home.style }}{{ end }}">
<div class="{{ if .Site.Params.navigation.fixed }}mb-4{{ end }}"> <div class="{{ if .Site.Params.navigation.fixed }}mb-4{{ end }}">
{{- partial "assets/navbar.html" (dict {{- partial "assets/navbar.html" (dict
@@ -79,6 +81,19 @@
{{ 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 -}}
{{- $skipTemplate := false -}}
{{- if reflect.IsSlice site.Params.modules.disableTemplate -}}
{{- if in site.Params.modules.disableTemplate $mod}}
{{- $skipTemplate = true -}}
{{- end -}}
{{- end -}}
{{- partial "footer/scripts.html" (dict "filename" $filename "match" $match "header" false "skipTemplate" $skipTemplate "page" .) }}
{{- end -}}
</body> </body>
</html> </html>

View File

@@ -67,7 +67,7 @@
{{ with .NextInSection -}} {{ with .NextInSection -}}
{{ $next := . -}} {{ $next := . -}}
{{ with .OutputFormats.Get "html" -}} {{ with .OutputFormats.Get "html" -}}
<a class="next" href="{{ $next.Permalink }}"><i class="fas fa-arrow-left"></i> {{ $next.Title }}</a> <a class="next" href="{{ $next.RelPermalink }}"><i class="fas fa-arrow-left"></i> {{ $next.Title }}</a>
{{- end -}} {{- end -}}
{{ end -}} {{ end -}}
</div> </div>
@@ -75,7 +75,7 @@
{{ with .PrevInSection -}} {{ with .PrevInSection -}}
{{ $prev := . -}} {{ $prev := . -}}
{{ with .OutputFormats.Get "html" -}} {{ with .OutputFormats.Get "html" -}}
<a class="previous" href="{{ $prev.Permalink }}">{{ $prev.Title }} <i class="fas fa-arrow-right"></i></a> <a class="previous" href="{{ $prev.RelPermalink }}">{{ $prev.Title }} <i class="fas fa-arrow-right"></i></a>
{{- end -}} {{- end -}}
{{ end -}} {{ end -}}
</div> </div>

View File

@@ -7,10 +7,10 @@
{{ $square150 := .Resize "150x150 CatmullRom" }} {{ $square150 := .Resize "150x150 CatmullRom" }}
{{ $wide310 := .Fill "310x150 CatmullRom" }} {{ $wide310 := .Fill "310x150 CatmullRom" }}
{{ $square310 := .Resize "310x310 CatmullRom" }} {{ $square310 := .Resize "310x310 CatmullRom" }}
<square70x70logo src="{{ $square70.Permalink }}" /> <square70x70logo src="{{ $square70.RelPermalink }}" />
<square150x150logo src="{{ $square150.Permalink }}" /> <square150x150logo src="{{ $square150.RelPermalink }}" />
<wide310x150logo src="{{ $wide310.Permalink }}" /> <wide310x150logo src="{{ $wide310.RelPermalink }}" />
<square310x310logo src="{{ $square310.Permalink }}" /> <square310x310logo src="{{ $square310.RelPermalink }}" />
{{ end }} {{ end }}
<TileColor>#000000</TileColor> <TileColor>#000000</TileColor>
</tile> </tile>

View File

@@ -3,7 +3,7 @@
{{- range $index, $item := .Page.Ancestors.Reverse -}} {{- range $index, $item := .Page.Ancestors.Reverse -}}
{{- $title := .Title -}} {{- $title := .Title -}}
{{- if .IsHome }}{{ $title = T "home" }}{{ end -}} {{- if .IsHome }}{{ $title = T "home" }}{{ end -}}
{{- $address := or .Permalink (.Params.Redirect | absLangURL) -}} {{- $address := or .RelPermalink (.Params.Redirect | relLangURL) -}}
{{ if $address }} {{ if $address }}
<li class="breadcrumb-item"><a href="{{ $address }}">{{ $title }}</a></li> <li class="breadcrumb-item"><a href="{{ $address }}">{{ $title }}</a></li>
{{ else }} {{ else }}

View File

@@ -22,6 +22,10 @@
"between", "around", or "evenly". "between", "around", or "evenly".
"toast" Optional id of the toast to display when the button is clicked. "toast" Optional id of the toast to display when the button is clicked.
"clipboard" Optional text to be copied to the clipboard when the button is clicked. "clipboard" Optional text to be copied to the clipboard when the button is clicked.
"cue" Optional flag to indicate if an external link should show a visual cue, defaults to setting
"main.externalLinks.cue" in the site's parameters.
"tab" Optional flag to indicate if an external link should open in a new tab, defaults to setting
"main.externalLinks.tab" in the site's parameters.
--> -->
{{- $title := trim .title " \r\n" -}} {{- $title := trim .title " \r\n" -}}
@@ -95,6 +99,7 @@
{{- end -}} {{- end -}}
{{- $class := .class }} {{- $class := .class }}
{{ with $badge }}{{ $class = printf "%s me-3" $class }}{{ end }}
{{- $order := "last" -}} {{- $order := "last" -}}
{{- with .order }}{{ $order = . }}{{ end -}} {{- with .order }}{{ $order = . }}{{ end -}}
@@ -113,8 +118,27 @@
{{- $toast := .toast -}} {{- $toast := .toast -}}
{{- $clipboard := .clipboard -}} {{- $clipboard := .clipboard -}}
{{- $cue := .cue | default site.Params.main.externalLinks.cue -}}
{{- $tab := .tab | default site.Params.main.externalLinks.tab -}}
{{- $isExternal := ne (urls.Parse (absURL $href)).Host (urls.Parse site.BaseURL).Host -}}
{{- $target := "" -}}
{{- $rel := "" -}}
{{- if $isExternal -}}
{{- if $tab -}}
{{- $target = "_blank" -}}
{{- $rel = "noopener noreferrer" -}}
{{- end -}}
{{- if and $title $cue -}}
{{ $suffix := partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}
{{- $title = printf "%s %s" $title $suffix | safeHTML -}}
{{- end -}}
{{- end -}}
<a aria-label="{{ $title }}" {{ if ne $state "disabled" }}{{ with $href }}href="{{ . }}"{{ end }}{{ end }} <a aria-label="{{ $title }}" {{ if ne $state "disabled" }}{{ with $href }}href="{{ . }}"{{ end }}{{ end }}
{{ with $id }}id="{{ . }}"{{ end }} {{ with $id }}id="{{ . }}"{{ end }}
{{ with $target }}target="{{ . }}"{{ end }}{{ with $rel }} rel="{{ . }}"{{ end }}
{{ with $toast }}data-toast-target="{{ $toast }}"{{ end }} {{ with $toast }}data-toast-target="{{ $toast }}"{{ end }}
{{ with $clipboard }}data-clipboard="{{ $clipboard }}"{{ end }} {{ with $clipboard }}data-clipboard="{{ $clipboard }}"{{ end }}
{{ if eq $type "button" }}class="btn btn-{{ if $outline }}outline-{{ end }}{{ $color }} {{ if ne $size "md"}}btn-{{ $size }}{{ end }} position-relative {{ if in (slice "disabled" "active") $state }}{{ $state }}{{ end }} {{ $class }}" {{ if eq $type "button" }}class="btn btn-{{ if $outline }}outline-{{ end }}{{ $color }} {{ if ne $size "md"}}btn-{{ $size }}{{ end }} position-relative {{ if in (slice "disabled" "active") $state }}{{ $state }}{{ end }} {{ $class }}"
@@ -127,8 +151,8 @@
> >
<div class="d-flex justify-content-{{ $justify }}"> <div class="d-flex justify-content-{{ $justify }}">
<div>{{ $title }}</div> <div class="my-auto">{{ $title }}</div>
{{- with $icon }}<div class="align-self-center{{ if eq $order "first" }} order-first pe-1{{ else }} ps-1{{ end }}">{{ partial "assets/icon.html" (dict "icon" $icon) }}</div>{{ end }} {{- with $icon }}<div class="align-self-center{{ if $title }}{{ if eq $order "first" }} order-first pe-1{{ else }} ps-1{{ end }}{{ end }}">{{ partial "assets/icon.html" (dict "icon" $icon) }}</div>{{ end }}
</div> </div>
{{- with $badge }} {{- with $badge }}

View File

@@ -107,12 +107,12 @@
"orientation" $orientation "orientation" $orientation
) -}} ) -}}
{{- if $element.Permalink -}} {{- if $element.RelPermalink -}}
{{- $params = merge $params (dict "path" $element.File.Path) -}} {{- $params = merge $params (dict "path" $element.File.Path) -}}
{{- else -}} {{- else -}}
{{- $params = merge $params (dict {{- $params = merge $params (dict
"title" $element.Title "title" $element.Title
"href" $element.Permalink "href" $element.RelPermalink
"description" (or $element.Description $element.Content) "description" (or $element.Description $element.Content)
"thumbnail" $element.Params.thumbnail "thumbnail" $element.Params.thumbnail
"icon" $element.Params.icon "icon" $element.Params.icon

View File

@@ -111,7 +111,7 @@
{{- with $page -}} {{- with $page -}}
{{- if not $title }}{{ $title = .Title }}{{ end -}} {{- if not $title }}{{ $title = .Title }}{{ end -}}
{{- if not $href }}{{ $href = .Permalink }}{{ end -}} {{- if not $href }}{{ $href = .RelPermalink }}{{ end -}}
{{- if not $description }}{{ $description = .Description }}{{ end -}} {{- if not $description }}{{ $description = .Description }}{{ end -}}
{{- if not $thumbnail }}{{ $thumbnail = .Params.thumbnail }}{{ end -}} {{- if not $thumbnail }}{{ $thumbnail = .Params.thumbnail }}{{ end -}}
{{- if not $icon }}{{ $icon = .Params.icon }}{{ end -}} {{- if not $icon }}{{ $icon = .Params.icon }}{{ end -}}

View File

@@ -1,6 +1,6 @@
{{- $params := .Site.Params.comments -}} {{- $params := .Site.Params.comments -}}
{{- with $params -}} {{- with $params -}}
<h2>Comments</h2> <h2>{{ T "comments" }}</h2>
<script src="https://utteranc.es/client.js" <script src="https://utteranc.es/client.js"
repo="{{ $params.repo }}" repo="{{ $params.repo }}"
issue-term="{{ default "pathname" $params.issueTerm }}" issue-term="{{ default "pathname" $params.issueTerm }}"

View File

@@ -1,16 +0,0 @@
{{- $icon := .icon -}}
{{- if not $icon -}}
{{- errorf "partial [assets/icon.html] - Expected value for param 'icon'" -}}
{{- end -}}
{{- $icon_class := split $icon " " -}}
{{- $attr := delimit (after 1 $icon_class) " " -}}
{{- if eq (index $icon_class 0) "fas" -}}
<i class="fa-solid fa-{{ $attr}}"></i>
{{- else if eq (index $icon_class 0) "fab" -}}
<i class="fa-brands fa-{{ $attr }}"></i>
{{- else if eq (index $icon_class 0) "fa" -}}
<i class="fa-regular fa-{{ $attr }}"></i>
{{- else -}}
{{- errorf "partial [assets/icon.html] - Unrecognized icon class: %s" $icon_class -}}
{{- end -}}

View File

@@ -15,6 +15,7 @@
--> -->
{{- $validRatios := slice "1x1" "4x3" "16x9" "21x9" -}} {{- $validRatios := slice "1x1" "4x3" "16x9" "21x9" -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $ratio := .ratio -}} {{- $ratio := .ratio -}}
{{- $url := .url -}} {{- $url := .url -}}
{{- $mode := false -}} {{- $mode := false -}}
@@ -68,6 +69,7 @@
<!-- Generate a image set of type webp --> <!-- Generate a image set of type webp -->
{{- define "partials/image-scaled.html " -}} {{- define "partials/image-scaled.html " -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $img := .img -}} {{- $img := .img -}}
{{- $ratio := .ratio -}} {{- $ratio := .ratio -}}
{{- $imgset := "" -}} {{- $imgset := "" -}}
@@ -98,7 +100,11 @@
{{- $scaled = $img.Fit (printf "%s webp" $dim) -}} {{- $scaled = $img.Fit (printf "%s webp" $dim) -}}
{{- end -}} {{- end -}}
{{- $scaled = $scaled | resources.Copy (replace $img.RelPermalink $clean (printf "-%s.webp" $dim)) -}} {{- $scaled = $scaled | resources.Copy (replace $img.RelPermalink $clean (printf "-%s.webp" $dim)) -}}
{{- $imgset = printf "%s, %s %sw" $imgset $scaled.Permalink (index $widths $index) -}} {{- if $absoluteURL -}}
{{- $imgset = printf "%s, %s %sw" $imgset $scaled.Permalink (index $widths $index) -}}
{{- else -}}
{{- $imgset = printf "%s, %s %sw" $imgset $scaled.RelPermalink (index $widths $index) -}}
{{- end -}}
{{- end -}} {{- end -}}
{{- $imgset = strings.TrimPrefix ", " $imgset -}} {{- $imgset = strings.TrimPrefix ", " $imgset -}}
{{- end -}} {{- end -}}
@@ -108,6 +114,7 @@
<!-- Define the img with optional caption --> <!-- Define the img with optional caption -->
{{- define "partials/image-definition.html" -}} {{- define "partials/image-definition.html" -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $ratio := .ratio -}} {{- $ratio := .ratio -}}
{{- $url := .url -}} {{- $url := .url -}}
{{- $outerClass := .outerClass -}} {{- $outerClass := .outerClass -}}
@@ -125,7 +132,11 @@
{{- $img := partial "utilities/GetImage.html" (dict "url" $url) -}} {{- $img := partial "utilities/GetImage.html" (dict "url" $url) -}}
{{- if $img -}} {{- if $img -}}
{{- $fallback := partial "partials/image-default.html" (dict "img" $img "ratio" $ratio) -}} {{- $fallback := partial "partials/image-default.html" (dict "img" $img "ratio" $ratio) -}}
{{- $fallbackURL = $fallback.RelPermalink -}} {{- if $absoluteURL -}}
{{- $fallbackURL = $fallback.Permalink -}}
{{- else -}}
{{- $fallbackURL = $fallback.RelPermalink -}}
{{- end -}}
{{- $imgset = partial "partials/image-scaled.html " (dict "img" $img "ratio" $ratio) -}} {{- $imgset = partial "partials/image-scaled.html " (dict "img" $img "ratio" $ratio) -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
@@ -145,7 +156,7 @@
srcset="{{ . }}" srcset="{{ . }}"
sizes="100vw" sizes="100vw"
{{- end }} {{- end }}
src="{{ absURL $fallbackURL }}" src="{{ $fallbackURL }}"
alt="{{ $title }}"> alt="{{ $title }}">
</div> </div>
{{- if $caption -}} {{- if $caption -}}

View File

@@ -9,12 +9,24 @@
{{- $isActive := hasPrefix $pageURL $menuURL -}} {{- $isActive := hasPrefix $pageURL $menuURL -}}
{{- $isAlias := $menu.Params.alias -}} {{- $isAlias := $menu.Params.alias -}}
{{- $isIcon := $menu.Params.icon -}} {{- $isIcon := $menu.Params.icon -}}
{{- $cue := .cue | default site.Params.main.externalLinks.cue -}}
{{- $tab := .tab | default site.Params.main.externalLinks.tab -}}
{{- $url := urls.Parse $menuURL -}} {{- $url := urls.Parse $menuURL -}}
{{- $baseURL := urls.Parse $.Site.Params.Baseurl -}} {{- $baseURL := urls.Parse $.Site.Params.Baseurl -}}
{{- $isExternal := ne $url.Host $baseURL.Host -}} {{- $isExternal := ne $url.Host $baseURL.Host -}}
{{- $externalHref := "" }} {{- $externalHref := "" }}
{{- if $isExternal }}{{ $externalHref = "target=\"_blank\" rel=\"noopener noreferrer\"" }}{{ end -}} {{- $suffix := "" }}
{{- if $isExternal }}
{{- if $tab -}}
{{ $externalHref = "target=\"_blank\" rel=\"noopener noreferrer\"" }}
{{- end -}}
{{- if $cue -}}
{{ $suffix = partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}
{{- end -}}
{{ end -}}
{{- $mainNav := urlize (lower $menu.Name) -}} {{- $mainNav := urlize (lower $menu.Name) -}}
{{- $childNav := "" -}} {{- $childNav := "" -}}
@@ -44,5 +56,5 @@
{{- with $menu.Pre }}{{ . }}{{ end -}} {{- with $menu.Pre }}{{ . }}{{ end -}}
<span {{ if $isActive }} class="active"{{ end }}>{{ if not $isIcon }}{{ $menu.Name }}{{ end }}</span> <span {{ if $isActive }} class="active"{{ end }}>{{ if not $isIcon }}{{ $menu.Name }}{{ end }}</span>
{{- with $menu.Post }}{{ . }}{{ end -}} {{- with $menu.Post }}{{ . }}{{ end -}}
{{- if and $isExternal (not $isIcon)}} {{ partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}{{ end -}} {{- if not $isIcon }} {{ $suffix }}{{ end -}}
</a> </a>

View File

@@ -21,11 +21,11 @@
{{- $collapsed := .collapsed -}} {{- $collapsed := .collapsed -}}
<li class="nav-item dropdown {{ if $collapsed }}d-{{ $size }}-none{{ else }}d-none d-{{ $size }}-block{{ end }}"> <li class="nav-item dropdown {{ if $collapsed }}d-{{ $size }}-none{{ else }}d-none d-{{ $size }}-block{{ end }}">
<a class="nav-link dropdown-toggle" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false" id="navbar-color-theme"> <a class="nav-link dropdown-toggle" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false" id="navbar-color-theme{{ if $collapsed }}-collapsed{{ end }}">
{{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon-active") }} {{ if $collapsed }} {{ T "colorMode" }} {{ end }} {{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon-active") }} {{ if $collapsed }} {{ T "colorMode" }} {{ end }}
<span class="d-md-none"></span> <span class="d-md-none"></span>
</a> </a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar-color-theme"> <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar-color-theme{{ if $collapsed }}-collapsed{{ end }}">
<li> <li>
<a class="dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}" data-bs-theme-value="light" href="#!"> <a class="dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}" data-bs-theme-value="light" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon") }} {{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon") }}
@@ -93,6 +93,7 @@
</li> </li>
{{- end -}} {{- end -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $supportedFlags := slice "true" "false" -}} {{- $supportedFlags := slice "true" "false" -}}
{{- $id := printf "navbar-collapse-%d" 0 -}} {{- $id := printf "navbar-collapse-%d" 0 -}}
@@ -105,11 +106,14 @@
{{- errorf "partial [assets/navbar.html] - Missing value for param 'page'" -}} {{- errorf "partial [assets/navbar.html] - Missing value for param 'page'" -}}
{{- end -}} {{- end -}}
{{- $menuName := "main" }} {{- $defaultMenu := "main" }}
{{- with .menus }}{{ $menuName = .}}{{ end -}} {{- $menuName := $defaultMenu }}
{{- with .menus }}{{ $menuName = . }}{{ end -}}
{{- $menus := index site.Menus $menuName -}} {{- $menus := index site.Menus $menuName -}}
{{- if or (ne (printf "%T" $menus) "navigation.Menu") (ne (index $menus 0).Menu $menuName) -}} {{- if or (ne (printf "%T" $menus) "navigation.Menu") (ne (index $menus 0).Menu $menuName) -}}
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'menus': %s" $menuName -}} {{- if ne $menuName $defaultMenu }}
{{- errorf "partial [assets/navbar.html] - Invalid value for param 'menus': %s" $menuName -}}
{{- end -}}
{{- end -}} {{- end -}}
{{- $size := "md" -}} {{- $size := "md" -}}
@@ -147,7 +151,7 @@
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{- $enableDarkMode := default true site.Params.main.enableDarkMode -}} {{- $enableDarkMode := default false site.Params.main.enableDarkMode -}}
{{- with .mode -}} {{- with .mode -}}
{{- $darkModeParam := . -}} {{- $darkModeParam := . -}}
{{- if in $supportedFlags $darkModeParam -}} {{- if in $supportedFlags $darkModeParam -}}
@@ -202,7 +206,7 @@
<!-- Insert the brand logo or name --> <!-- Insert the brand logo or name -->
<a class="navbar-brand mx-auto" href="{{ site.Home.RelPermalink }}"> <a class="navbar-brand mx-auto" href="{{ site.Home.RelPermalink }}">
{{- if $logo -}} {{- if $logo -}}
<img src="{{ $logo }}" alt="{{ $title }} logo" height="30"> <img src="{{if $absoluteURL }}{{ absURL $logo }}{{ else }}{{ $logo }}{{ end }}" alt="{{ $title }} logo" height="30">
{{- else -}} {{- else -}}
<span class="fw-bold">{{ $title }}</span> <span class="fw-bold">{{ $title }}</span>
{{- end -}} {{- end -}}
@@ -238,7 +242,7 @@
{{- end -}} {{- end -}}
<!-- Insert divider if applicable --> <!-- Insert divider if applicable -->
{{- if or $enableLanguage $enableVersions -}} {{- if and $menus (or $enableLanguage $enableVersions) -}}
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block"> <li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
<div class="vr d-none d-md-flex h-100 mx-md-2"></div> <div class="vr d-none d-md-flex h-100 mx-md-2"></div>
</li> </li>
@@ -258,7 +262,7 @@
<ul class="dropdown-menu dropdown-menu-end "> <ul class="dropdown-menu dropdown-menu-end ">
{{- if $page.IsTranslated -}} {{- if $page.IsTranslated -}}
{{- range $page.AllTranslations -}} {{- range $page.AllTranslations -}}
<li><a class="dropdown-item {{ if eq .Language.Lang $currentLang }}active{{ end }}" href="{{ .Permalink }}">{{ .Language.LanguageName }}</a></li> <li><a class="dropdown-item {{ if eq .Language.Lang $currentLang }}active{{ end }}" href="{{ .RelPermalink }}">{{ .Language.LanguageName }}</a></li>
{{- end -}} {{- end -}}
{{- else -}} {{- else -}}
{{- range site.Languages -}} {{- range site.Languages -}}

View File

@@ -49,7 +49,7 @@
{{- with $page -}} {{- with $page -}}
{{- if not $title }}{{ $title = .Title }}{{ end -}} {{- if not $title }}{{ $title = .Title }}{{ end -}}
{{- if not $href }}{{ $href = .Permalink }}{{ end -}} {{- if not $href }}{{ $href = .RelPermalink }}{{ end -}}
{{- if not $content }}{{ $content = .Content }}{{ end -}} {{- if not $content }}{{ $content = .Content }}{{ end -}}
{{- if not $thumbnail }}{{ $thumbnail = .Params.thumbnail }}{{ end -}} {{- if not $thumbnail }}{{ $thumbnail = .Params.thumbnail }}{{ end -}}
{{- end -}} {{- end -}}

View File

@@ -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>

View File

@@ -1,7 +1,7 @@
<footer class="container-fluid text-center p-3"> <footer class="container-fluid text-center p-3">
<div class="container-xxl text-center"> <div class="container-xxl text-center">
<small class="text-secondary"> <small class="text-secondary">
{{- $copyright := printf "%s © %s %s All rights reserved." (i18n "copyright") (dateFormat "2006" now) .Site.Title }} {{- $copyright := printf "%s © %s %s %s." (T "copyright") (dateFormat "2006" now) .Site.Title (T "rights") }}
{{ cond (gt (len .Site.Copyright) 0) .Site.Copyright $copyright }} {{ cond (gt (len .Site.Copyright) 0) .Site.Copyright $copyright }}
{{ .Site.Params.footer.license | safeHTML }} {{ .Site.Params.footer.license | safeHTML }}
</small> </small>

View File

@@ -1,28 +1,34 @@
{{ $filename := .filename | default "js/main.bundle.js" -}} {{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{ $match := .match | default "{js/*.js,js/vendor/**.js}" }} {{- $filename := .filename | default "js/main.bundle.js" -}}
{{ $page := .page }} {{- $match := .match | default "{js/*.js,js/vendor/**.js}" -}}
{{ $header := .header }} {{- $page := .page -}}
{{- $header := .header -}}
{{- $core := .core | default false -}}
{{- $skipTemplate := .skipTemplate | default false -}}
{{ $files := slice -}} {{- $modules := "" -}}
{{ range $index, $file := resources.Match $match -}} {{ if $core }}
{{ $files = $files | append $file -}} {{- $modules = site.Params.modules.core -}}
{{ end -}} {{- end -}}
{{ if gt (len $files) 0 }} {{- $bundle := partial "utilities/bundle" (dict "match" $match "filename" $filename "modules" $modules "basepath" "js/modules" "all" true "debugging" site.Params.debugging.showJS) -}}
{{ $bundle := $files | resources.Concat $filename -}} {{- $js := $bundle -}}
{{ $js := $bundle | resources.ExecuteAsTemplate $filename $page -}} {{- if not $skipTemplate -}}
{{- $js = $bundle | resources.ExecuteAsTemplate $filename $page -}}
{{- end -}}
{{- if and (not site.IsServer) $header -}} {{- if and (not site.IsServer) $header -}}
{{- $pc := site.Config.Privacy.GoogleAnalytics -}} {{- $pc := site.Config.Privacy.GoogleAnalytics -}}
{{- if and (not $pc.Disable) (hasPrefix site.GoogleAnalytics "G-") }} {{- if and (not $pc.Disable) (hasPrefix site.GoogleAnalytics "G-") }}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.GoogleAnalytics }}"></script> <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.GoogleAnalytics }}"></script>
{{- end }} {{- end }}
{{- end -}} {{- end -}}
{{- if gt (len $js.Content) 0 -}}
{{- if not hugo.IsProduction -}} {{- if not hugo.IsProduction -}}
<script src="{{ $js.Permalink }}"></script> <script src="{{ if $absoluteURL }}{{ $js.Permalink }}{{ else }}{{ $js.RelPermalink }}{{ end }}"></script>
{{ else -}} {{ else -}}
{{ $js = $js | minify | fingerprint -}} {{ $js = $js | minify | fingerprint -}}
<script src="{{ $js.Permalink }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"></script> <script src="{{ if $absoluteURL }}{{ $js.Permalink }}{{ else }}{{ $js.RelPermalink }}{{ end }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"></script>
{{ end -}} {{ end -}}
{{ end -}} {{ end -}}

View File

@@ -1,3 +1,4 @@
{{- $tab := site.Params.main.externalLinks.tab -}}
<div class="container-fluid"> <div class="container-fluid">
<div class="row row-cols-1 row-cols-sm-4 bg-primary p-3 bg-opacity-{{ .Site.Params.style.themeOpacity | default "25" | safeHTML }} align-items-center"> <div class="row row-cols-1 row-cols-sm-4 bg-primary p-3 bg-opacity-{{ .Site.Params.style.themeOpacity | default "25" | safeHTML }} align-items-center">
<div class="col col-md-2 d-none d-md-block"></div> <div class="col col-md-2 d-none d-md-block"></div>
@@ -7,7 +8,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 }}" target="_blank" rel="noopener noreferrer" aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2"> <a href="{{ .URL }}" {{ if $tab }} target="_blank" rel="noopener noreferrer"{{ end }} aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
{{ .Pre | safeHTML }} {{ .Pre | safeHTML }}
</a> </a>
{{ end -}} {{ end -}}

View File

@@ -1,10 +1,11 @@
<!-- Source: https://davelage.com/posts/hugo-favicons/ --> <!-- Source: https://davelage.com/posts/hugo-favicons/ -->
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{ if .Site.Params.favicon.logo -}} {{ if .Site.Params.favicon.logo -}}
{{ $favicon := resources.Get .Site.Params.favicon.logo -}} {{ $favicon := resources.Get .Site.Params.favicon.logo -}}
{{ range $i := .Site.Params.favicon.sizes -}} {{ range $i := .Site.Params.favicon.sizes -}}
{{ $image := $favicon.Resize (printf "%dx%d CatmullRom" $i $i) -}} {{ $image := $favicon.Resize (printf "%dx%d CatmullRom" $i $i) -}}
<link rel="icon" type="image/png" sizes="{{$i}}x{{$i}}" href="{{ $image.Permalink }}"> <link rel="icon" type="image/png" sizes="{{$i}}x{{$i}}" href="{{ if $absoluteURL }}{{ $image.Permalink }}{{ else }}{{ $image.RelPermalink }}{{ end }}">
{{ end -}} {{ end -}}
{{ $image := $favicon.Resize "180x CatmullRom" -}} {{ $image := $favicon.Resize "180x CatmullRom" -}}
<link rel="apple-touch-icon" sizes="180x180" href="{{ $image.Permalink }}"> <link rel="apple-touch-icon" sizes="180x180" href="{{ if $absoluteURL }}{{ $image.Permalink }}{{ else }}{{ $image.RelPermalink }}{{ end }}">
{{ end -}} {{ end -}}

View File

@@ -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}}

View File

@@ -11,7 +11,7 @@
Variable names are converted from kebab case to snake case to make them compatible with Hugo's variable naming Variable names are converted from kebab case to snake case to make them compatible with Hugo's variable naming
convention. For example, the css variable '--accordion-icon-active-color' is available as convention. For example, the css variable '--accordion-icon-active-color' is available as
''.accordion_icon_active_color' within the Hugo template. The processed svg files are published to the "icons" '.accordion_icon_active_color' within the Hugo template. The processed svg files are published to the "icons"
folder. folder.
The partial supports the following arguments: The partial supports the following arguments:

View File

@@ -1,42 +1,51 @@
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $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 (or site.Params.modules.core slice) -}}
{{ 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) -}} {{- $options := (dict "transpiler" "libsass" "targetPath" $target "enableSourceMap" (not hugo.IsProduction) "vars" $vars) -}}
{{/*- $options := (dict "transpiler" "dartsass" "targetPath" "css/main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -*/}} {{- $bundle := partial "utilities/bundle" (dict "match" $source "filename" (printf "scss/bundle-%d.scss" now.UnixNano) "modules" $modules "basepath" "scss" "debugging" site.Params.debugging.showSCSS) -}}
{{- if hugo.IsProduction -}}
{{- $options = merge $options (dict "outputStyle" "compressed") -}} {{- $css := $bundle | resources.ExecuteAsTemplate $target . | toCSS $options -}}
{{- else -}}
{{- $options = merge $options (dict "outputStyle" "expanded") -}} {{ if $core }}
{{- end -}} {{- partial "head/icons.html" (dict "css" $css) -}}
{{- $css := resources.Get "scss/app.scss" | resources.ExecuteAsTemplate "style.app.scss" . | toCSS $options -}} {{ end }}
{{- partial "head/icons.html" (dict "css" $css) -}} {{- if site.Params.style.purge -}}
{{- 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 -}}
{{- if not hugo.IsProduction -}} {{- if not hugo.IsProduction -}}
<link rel="stylesheet" href="{{ $css.Permalink }}"> <link rel="stylesheet" href="{{ if $absoluteURL }}{{ $css.Permalink }}{{ else }}{{ $css.RelPermalink }}{{ end }}">
{{- 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="{{ if $absoluteURL }}{{ $css.Permalink }}{{ else }}{{ $css.RelPermalink }}{{ end }}" 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 -}}

View 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 -}}

View File

@@ -0,0 +1,67 @@
{{- $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 -}}
{{- $debugging := .debugging | default false -}}
{{- 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 -}}
{{- if $debugging -}}
{{ warnf "Processing pattern: %s" $match}}
{{- range $index, $file := $sorted -}}
{{- warnf " - Processing file: %s" $file }}
{{- end -}}
{{- end -}}
{{/* warnf "FILES: %s" $sorted */}}
{{ $bundle := "" }}
{{ if gt (len $sorted) 0 }}
{{ $bundle = $sorted | resources.Concat $filename -}}
{{ else }}
{{ $bundle = resources.FromString $filename "" }}
{{ end -}}
{{- return $bundle -}}

View File

@@ -0,0 +1,43 @@
{{ $destination := .destination }}
{{- if not $destination -}}
{{- errorf "partial [utilities/link.html] - Missing param 'destination'" -}}
{{- end -}}
{{- $target := "" -}}
{{- $rel := "" -}}
{{- $case := .case | default true }}
{{- $cue := .cue | default site.Params.main.externalLinks.cue -}}
{{- $tab := .tab | default site.Params.main.externalLinks.tab -}}
{{- $isExternal := ne (urls.Parse (absURL $destination)).Host (urls.Parse site.BaseURL).Host -}}
{{ $text := .text }}
{{- if not $text -}}
{{ if $isExternal }}
{{ $text = (urls.Parse (absURL $destination)).Host }}
{{ else }}
{{ $target := site.GetPage $destination }}
{{ if not $target }}
{{- errorf "partial [utilities/link.html] - Cannot find page: %s" $destination -}}
{{ else }}
{{ $text = $target.Title }}
{{ if not $case }}{{ $text = lower $text }}{{ end }}
{{ $destination = $target.RelPermalink }}
{{ end }}
{{ end }}
{{- end -}}
{{- if $isExternal -}}
{{- if $tab -}}
{{- $target = "_blank" -}}
{{- $rel = "noopener noreferrer" -}}
{{- end -}}
{{- if $cue -}}
{{ $suffix := partial "assets/icon.html" (dict "icon" "fas up-right-from-square fa-2xs") }}
{{- $text = printf "%s %s" $text $suffix | safeHTML -}}
{{- end -}}
{{ else }}
{{ $destination = relLangURL $destination }}
{{- end -}}
<a href="{{ $destination | safeURL }}"{{ with $target }} target="{{ . }}"{{ end }}{{ with $rel }} rel="{{ . }}"{{ end }}>{{ $text }}</a>

View File

@@ -4,10 +4,27 @@
"warning", "info", "light", "dark", "white" or "black". "warning", "info", "light", "dark", "white" or "black".
"dismissible" Optional flag to indicate the alert is dismissible, defaults to false. "dismissible" Optional flag to indicate the alert is dismissible, defaults to false.
"icon" Optional class and name of a Font Awesome icon to include. "icon" Optional class and name of a Font Awesome icon to include.
"type" Optional type of the alert, either "danger" or "info". Generates an alert with related color and
icon.
--> -->
{{- $error := false -}} {{- $error := false -}}
{{ $color := "primary" -}} {{ $color := "primary" -}}
{{ $icon := "" }}
{{ $type := "" -}}
{{ with .Get "type" }}{{ $type = . }}{{ end -}}
{{ $supportedTypes := slice "danger" "info" -}}
{{ if $type }}
{{ if not (in $supportedTypes $type) -}}
{{ errorf "Invalid value for param 'type': %s" .Position -}}
{{ $error = true -}}
{{ else }}
{{ $color = $type }}
{{ if eq $type "danger" }}{{ $icon = "fas triangle-exclamation" }}{{ else }}{{ $icon = "fa lightbulb" }}{{ end }}
{{ end -}}
{{ end -}}
{{ with .Get "color" }}{{ $color = . }}{{ end -}} {{ with .Get "color" }}{{ $color = . }}{{ end -}}
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" -}} {{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" -}}
{{ if not (in $supportedColors $color) -}} {{ if not (in $supportedColors $color) -}}
@@ -15,9 +32,9 @@
{{ $error = true -}} {{ $error = true -}}
{{ end -}} {{ end -}}
{{ $icon := "" }} {{ with .Get "icon" }}{{ $icon = . }}{{ end }}
{{ with .Get "icon" }} {{ with $icon }}
{{ $icon = partial "assets/icon.html" (dict "icon" (printf "%s fa-2x fa-pull-left" .)) }} {{ $icon = partial "assets/icon.html" (dict "icon" (printf "%s fa-2x fa-fw" .)) }}
{{ end }} {{ end }}
{{ $dismissibleParam := "false" -}} {{ $dismissibleParam := "false" -}}
@@ -32,9 +49,11 @@
{{ end -}} {{ end -}}
{{- if not $error -}} {{- if not $error -}}
<div class="alert alert-{{ $color }} {{ if $dismissible }}alert-dismissible fade show{{ end }}" role="alert"> <div class="d-flex alert alert-{{ $color }} {{ if $dismissible }}alert-dismissible fade show{{ end }}" role="alert">
{{ with $icon }}{{ . }}{{ end }} {{ with $icon }}<div class="pt-1 pe-2">{{ . }}</div>{{ end }}
{{ trim .Inner " \r\n" | markdownify | safeHTML -}} <div class="flex-grow-1 my-auto">
{{ if $dismissible }}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>{{ end }} {{ trim .Inner " \r\n" | markdownify | safeHTML -}}
{{ if $dismissible }}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>{{ end }}
</div>
</div> </div>
{{- end -}} {{- end -}}

View File

@@ -12,17 +12,29 @@
"aria-label" Optional label for the badge. "aria-label" Optional label for the badge.
"tooltip" Optional text to display in a tooltip. Cannot be used together with collapse. Ignored for active/ "tooltip" Optional text to display in a tooltip. Cannot be used together with collapse. Ignored for active/
inactive buttons. inactive buttons.
"collapse" Optional panel to collapse. Cannot be used together with tooltip. Ignored for active/inactive buttons. "collapse" Optional panel to collapse. Cannot be used together with tooltip. Ignored for active/inactive
buttons.
"placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right". "placement" Optional position of the tooltip: "top" (default), "bottom", "left", or "right".
"class" Optional class attribute of the button element, e.g. “p-5”.
"icon" Font Awesome icon class attribute, required unless button title is set. An example value is
"fas sort".
"order" Optional order of the icon, either "first" or "last" (default).
"justify" Optional justification of the button title and icon, either "start", "end", "center" (default),
"between", "around", or "evenly".
"toast" Optional id of the toast to display when the button is clicked. "toast" Optional id of the toast to display when the button is clicked.
"cue" Optional flag to indicate if an external link should show a visual cue, defaults to setting
"main.externalLinks.cue" in the site's parameters.
"tab" Optional flag to indicate if an external link should open in a new tab, defaults to setting
"main.externalLinks.tab" in the site's parameters.
--> -->
{{ $error := false }} {{ $error := false }}
{{ $type := "button" -}} {{ $type := "button" -}}
{{- $icon := .Get "icon" }}
{{ $title := trim .Inner " \r\n" -}} {{ $title := trim .Inner " \r\n" -}}
{{ if not $title -}} {{ if not (or $title $icon) -}}
{{ errorf "Missing inner element text: %s" .Position -}} {{ errorf "Missing icon or inner element text: %s" .Position -}}
{{ $error = true }} {{ $error = true }}
{{ end -}} {{ end -}}
@@ -69,6 +81,7 @@
{{ if $relref }} {{ if $relref }}
{{ $href = relref . $relref }} {{ $href = relref . $relref }}
{{ end }} {{ end }}
{{ $class := .Get "class" -}}
{{ $placement := "top" -}} {{ $placement := "top" -}}
{{ with .Get "placement" }}{{ $placement = . }}{{ end -}} {{ with .Get "placement" }}{{ $placement = . }}{{ end -}}
@@ -80,6 +93,25 @@
{{- $toast := .Get "toast" -}} {{- $toast := .Get "toast" -}}
{{- $order := "last" -}}
{{- with .Get "order" }}{{ $order = . }}{{ end -}}
{{- $supportedOrders := slice "first" "last" -}}
{{- if not (in $supportedOrders $order) -}}
{{ errorf "Invalid value for param 'order': %s" .Position -}}
{{ $error = true }}
{{- end -}}
{{- $justify := "center" -}}
{{- with .Get "justify" }}{{ $justify = . }}{{ end -}}
{{- $supportedJustify := slice "start" "end" "center" "between" "around" "evenly" -}}
{{- if not (in $supportedJustify $justify) -}}
{{ errorf "Invalid value for param 'justify': %s" .Position -}}
{{ $error = true }}
{{- end -}}
{{- $cue := .Get "cue" | default site.Params.main.externalLinks.cue -}}
{{- $tab := .Get "tab" | default site.Params.main.externalLinks.tab -}}
{{ if not $error }} {{ if not $error }}
{{- partial "assets/button.html" (dict {{- partial "assets/button.html" (dict
"type" $type "type" $type
@@ -94,7 +126,13 @@
"href" $href "href" $href
"id" $id "id" $id
"state" $state "state" $state
"class" $class
"placement" $placement "placement" $placement
"icon" $icon
"order" $order
"justify" $justify
"cue" $cue
"tab" $tab
"toast" $toast) "toast" $toast)
-}} -}}
{{ end }} {{ end }}

View File

@@ -44,13 +44,23 @@
{{ errorf "Invalid value for param 'show': %s" $showParam -}} {{ errorf "Invalid value for param 'show': %s" $showParam -}}
{{ end -}} {{ end -}}
{{ $fullParam := "true" -}}
{{ $full := true -}}
{{ with .Get "full" }}{{ $fullParam = . }}{{ end -}}
{{ if in $supportedFlags $fullParam -}}
{{ if eq $fullParam "true" }}{{ $full = true }}{{ else }}{{ $full = false }}{{ end -}}
{{ else -}}
{{ errorf "Invalid value for param 'full': %s" $fullParam -}}
{{ end -}}
{{- /* If any parameters are missing, print an error and exit */ -}} {{- /* If any parameters are missing, print an error and exit */ -}}
{{- if or (not $name) (not $file) -}} {{- if or (not $name) (not $file) -}}
{{- errorf "%s: %q: Missing required parameters! Got: name=%q file=%q!" .Position .Name $name $file -}} {{- errorf "%s: %q: Missing required parameters! Got: name=%q file=%q!" .Position .Name $name $file -}}
{{- else -}} {{- else -}}
{{- $regex := printf `%s((?:.|\n)*)%s` $capture_start $capture_end -}} {{- /* Force-check if the file exists */ -}}
{{ $tmp := os.Stat $file }}
{{- $regex := printf `%s((?:.|\n)*)%s` $capture_start $capture_end -}}
{{- $match := findRE $regex (readFile $file) -}} {{- $match := findRE $regex (readFile $file) -}}
{{- $match = index $match 0 -}} {{- $match = index $match 0 -}}
@@ -70,7 +80,7 @@
data-bs-target=".multi-{{ $id }}" data-bs-target=".multi-{{ $id }}"
aria-expanded="false" aria-expanded="false"
aria-controls="body-{{ $id }} footer-{{ $id }}"> aria-controls="body-{{ $id }} footer-{{ $id }}">
<small>{{ strings.TrimPrefix $basePath $file }}</small> <small>{{ if $full }}{{ strings.TrimPrefix $basePath $file }}{{ else }}{{ path.Base $file }}{{ end }}</small>
</a> </a>
</li> </li>
</ul> </ul>

View File

@@ -1,5 +0,0 @@
{{- if not (.Get 0) -}}
{{- errorf "Expected icon name: %s" .Position -}}
{{- else -}}
{{- partial "assets/icon.html" (dict "icon" (printf "fa %s" (delimit .Params " "))) }}
{{- end -}}

View File

@@ -1,5 +0,0 @@
{{- if not (.Get 0) -}}
{{- errorf "Expected icon name: %s" .Position -}}
{{- else -}}
{{- partial "assets/icon.html" (dict "icon" (printf "fab %s" (delimit .Params " "))) }}
{{- end -}}

View File

@@ -1,5 +0,0 @@
{{- if not (.Get 0) -}}
{{- errorf "Expected icon name: %s" .Position -}}
{{- else -}}
{{- partial "assets/icon.html" (dict "icon" (printf "fas %s" (delimit .Params " "))) }}
{{- end -}}

View File

@@ -0,0 +1,68 @@
{{- /*
Source: https://github.com/twbs/bootstrap/blob/main/site/layouts/shortcodes/scss-docs.html
Usage: `file path="path/to/filename" lang="lang" show="true" full="true"`
Prints the full content of any given file supported by the Chroma syntax highlighter.
*/ -}}
{{- $basePath := .Site.Params.docs.basePath -}}
{{- $file := .Get "path" }}
{{- if hasPrefix $file "./" -}}
{{- $file = path.Clean $file -}}
{{- else -}}
{{- $file = path.Join $basePath (path.Clean $file) -}}
{{- end -}}
{{- $extension := strings.TrimLeft "." (path.Ext $file) }}
{{- $lang := .Get "lang" | default $extension -}}
{{- $id := printf "docs-collapse-%d" .Ordinal -}}
{{ $supportedFlags := slice "true" "false" -}}
{{ $showParam := "true" -}}
{{ $show := true -}}
{{ with .Get "show" }}{{ $showParam = . }}{{ end -}}
{{ if in $supportedFlags $showParam -}}
{{ if eq $showParam "true" }}{{ $show = true }}{{ else }}{{ $show = false }}{{ end -}}
{{ else -}}
{{ errorf "Invalid value for param 'show': %s" $showParam -}}
{{ end -}}
{{ $fullParam := "true" -}}
{{ $full := true -}}
{{ with .Get "full" }}{{ $fullParam = . }}{{ end -}}
{{ if in $supportedFlags $fullParam -}}
{{ if eq $fullParam "true" }}{{ $full = true }}{{ else }}{{ $full = false }}{{ end -}}
{{ else -}}
{{ errorf "Invalid value for param 'full': %s" $fullParam -}}
{{ end -}}
{{- /* If any parameters are missing, print an error and exit */ -}}
{{- if not $file -}}
{{- errorf "%s: %q: Missing required parameters! Got: path=%q!" .Position .Name $file -}}
{{- else -}}
{{- /* Force-check if the file exists */ -}}
{{ $tmp := os.Stat $file }}
{{- $content := readFile $file -}}
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link active font-monospace"
href="#body-{{ $id }}"
aria-current="page"
data-bs-toggle="collapse"
data-bs-target=".multi-{{ $id }}"
aria-expanded="false"
aria-controls="body-{{ $id }} footer-{{ $id }}">
<small>{{ if $full }}{{ strings.TrimPrefix $basePath $file }}{{ else }}{{ path.Base $file }}{{ end }}</small>
</a>
</li>
</ul>
<div class="border-start border-end border-bottom mb-3">
<div class="collapse multi-{{ $id }}{{ if $show }} show{{ end }} syntax-highlight" id="body-{{ $id }}">
{{- highlight (trim $content "\r\n") $lang "" -}}
</div>
<div class="collapse multi-{{ $id }}{{ if not $show }} show{{ end }} p-3" id="footer-{{ $id }}"><i>...</i></div>
</div>
{{- end -}}

View File

@@ -0,0 +1,55 @@
<!--
Generates a link for a given named link or url. The shortcode supports a single unnamed parameter, or various named
parameters. The unnamed parameter is recognized as a named link if it does not contain any "/", otherwise it is
treated as a url. Any inner text is rendered as the link title, otherwise it uses the host name (for external links)
or page name (for internal links). The shortcode supports the following named arguments:
"name" Optional name of the link maintained in the "links" section of the site's parameters. If omitted,
the "url" argument should be provided instead.
"url" Optional url of the link, including the scheme ("http" or "https"). If omitted, the "name" argument
should be provided instead.
"cue" Optional flag to indicate if an external link should show a visual cue, defaults to setting
"main.externalLinks.cue" in the site's parameters.
"tab" Optional flag to indicate if an external link should open in a new tab, defaults to setting
"main.externalLinks.tab" in the site's parameters.
"case" Optional flag to indicate if the retrieved title (e.g. no inner text is provided) of an internal
link should use its original case, defaults to true. If false, the title is set to lower case.
-->
{{- $error := false -}}
{{ $name := "" }}
{{ $url := "" }}
{{ $case := true }}
{{ $cue := site.Params.main.externalLinks.cue }}
{{ $tab := site.Params.main.externalLinks.tab }}
{{ if .IsNamedParams }}
{{ $name = .Get "name" }}
{{ $url = .Get "url" }}
{{ $cue = .Get "cue" | default site.Params.main.externalLinks.cue }}
{{ $tab = .Get "tab" | default site.Params.main.externalLinks.tab }}
{{ $case = .Get "case" | default true }}
{{ else if strings.Contains (.Get 0) "/" }}
{{ $url = .Get 0 }}
{{ else }}
{{ $name = .Get 0 }}
{{ end }}
{{ if not (or $name $url) }}
{{ errorf "Expected param 'name' or 'url': %s" .Position -}}
{{ $error = true -}}
{{ end }}
{{ if $name }}
{{ $url = index site.Params.links $name }}
{{ if not $url }}
{{ errorf "Cannot find link '%s': %s" $name .Position -}}
{{ $error = true -}}
{{ end }}
{{ end }}
{{ $text := trim .Inner " \r\n" | markdownify | safeHTML }}
{{- if not $error -}}
{{ partial "utilities/link.html" (dict "destination" $url "text" $text "cue" $cue "tab" $tab "case" $case) }}
{{- end -}}

View File

@@ -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"

View 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>

View File

@@ -37,7 +37,7 @@
font-src 'self' https://*.netlify.app 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://*.netlify.app 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' \
""" """

1760
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "@gethinode/hinode", "name": "@gethinode/hinode",
"version": "0.15.2", "version": "0.16.8",
"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",
@@ -17,10 +17,10 @@
"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 --printI18nWarnings -e production",
"prebuild": "npm run clean", "prebuild": "npm run clean && npm run -s mod:install",
"build": "hugo --gc --minify", "build": "hugo --gc --minify",
"build:debug": "hugo -e debug --debug", "build:debug": "hugo -e debug --debug",
"build:preview": "npm run build -D -F", "build:preview": "npm run build -D -F",
@@ -31,14 +31,20 @@
"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:clean": "hugo mod clean",
"mod:install": "hugo mod get ./... && npm run -s mod:vendor && npm run -s mod:tidy",
"mod:update": "hugo mod get -u ./... && npm run -s mod:vendor && npm run -s mod:tidy",
"mod:tidy": "hugo mod tidy",
"mod:vendor": "rimraf _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",
"check": "hugo version", "check": "hugo version",
"create:syntax": "npm run -s create:syntax-light & npm run -s create:syntax-dark && npm run -s update:syntax-dark",
"create:syntax-light": "hugo gen chromastyles --style=github > ./assets/scss/components/_syntax-light.scss", "create:syntax-light": "hugo gen chromastyles --style=github > ./assets/scss/components/_syntax-light.scss",
"create:syntax-dark": "hugo gen chromastyles --style=github-dark > ./assets/scss/components/_syntax-dark.scss", "create:syntax-dark": "hugo gen chromastyles --style=github-dark > ./assets/scss/components/_syntax-dark.scss",
"create:syntax": "npm run -s create:syntax-light & npm run -s create:syntax-dark", "update:syntax-dark": "replace-in-files --string=\"#ffffcc\" --replacement=\"#b8b800\" ./assets/scss/components/_syntax-dark.scss",
"upgrade": "npx npm-check-updates -u" "upgrade": "npx npm-check-updates -u && npm run -s mod:update"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -54,7 +60,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",
"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",
@@ -62,11 +67,11 @@
"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.111.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",
"replace-in-files-cli": "^2.2.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",