Compare commits

...

163 Commits

Author SHA1 Message Date
Mark Dumay
6bf687dbf8 Merge pull request #1213 from gethinode/develop
Support integration of critical modules and scripts by category
2024-09-24 15:51:45 +02:00
Mark Dumay
e656ec9f33 Merge branch 'main' into develop 2024-09-24 15:44:11 +02:00
github-actions[bot]
d522fb07d5 Merge pull request #1211 from gethinode/dependabot/npm_and_yarn/neostandard-0.11.6
Bump neostandard from 0.11.5 to 0.11.6
2024-09-24 13:43:51 +00:00
Mark Dumay
39d98b2b6c Merge branch 'main' into develop 2024-09-24 15:39:20 +02:00
dependabot[bot]
6dfab4aa5f Bump neostandard from 0.11.5 to 0.11.6
Bumps [neostandard](https://github.com/neostandard/neostandard) from 0.11.5 to 0.11.6.
- [Release notes](https://github.com/neostandard/neostandard/releases)
- [Changelog](https://github.com/neostandard/neostandard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/neostandard/neostandard/compare/v0.11.5...v0.11.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-24 13:38:05 +00:00
github-actions[bot]
c5bdae6466 Merge pull request #1212 from gethinode/dependabot/npm_and_yarn/eslint-9.11.1
Bump eslint from 9.11.0 to 9.11.1
2024-09-24 13:36:52 +00:00
Mark Dumay
f79267a39e Merge branch 'main' into develop 2024-09-24 15:35:31 +02:00
Mark Dumay
ea05749f0e Match package version with releases 2024-09-24 15:34:48 +02:00
Mark Dumay
2dd027028c Update eslint safelist 2024-09-24 15:33:30 +02:00
Mark Dumay
3a4b1c8670 Include cookie settings in example site's footer 2024-09-24 15:32:39 +02:00
Mark Dumay
e2b92c9519 Remove redundant space 2024-09-24 15:32:23 +02:00
Mark Dumay
1defbd32f9 Update build stats 2024-09-24 15:32:09 +02:00
Mark Dumay
edd303bab1 Disable js debugging 2024-09-24 15:32:01 +02:00
dependabot[bot]
43041f42fc Bump eslint from 9.11.0 to 9.11.1
Bumps [eslint](https://github.com/eslint/eslint) from 9.11.0 to 9.11.1.
- [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/v9.11.0...v9.11.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-24 13:31:47 +00:00
Mark Dumay
250bfc33e6 Include external CookieYes script in example site 2024-09-24 15:31:42 +02:00
Mark Dumay
b7d4af7c0a Update to CookieYes v2 2024-09-24 15:31:13 +02:00
Mark Dumay
631d952923 Move critical scripts to functional category 2024-09-24 15:30:39 +02:00
Mark Dumay
744dd361f0 Support integration of critical modules and scripts by category 2024-09-24 15:30:16 +02:00
github-actions[bot]
719b5893d7 Merge pull request #1208 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.131.3
Bump hugo-bin from 0.131.2 to 0.131.3
2024-09-23 13:43:11 +00:00
dependabot[bot]
228f6f29dc Bump hugo-bin from 0.131.2 to 0.131.3
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.131.2 to 0.131.3.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.131.2...v0.131.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 13:37:31 +00:00
github-actions[bot]
3ea24f7e7f Merge pull request #1207 from gethinode/dependabot/npm_and_yarn/eslint-9.11.0
Bump eslint from 9.10.0 to 9.11.0
2024-09-23 13:36:16 +00:00
dependabot[bot]
418069773f Bump eslint from 9.10.0 to 9.11.0
Bumps [eslint](https://github.com/eslint/eslint) from 9.10.0 to 9.11.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/v9.10.0...v9.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 13:30:54 +00:00
Mark Dumay
0791000f10 Merge pull request #1206 from gethinode/develop
Adjust CookieYes integration
2024-09-22 12:30:02 +02:00
Mark Dumay
cee94a9664 Merge branch 'main' into develop 2024-09-22 12:01:32 +02:00
Mark Dumay
d42a6c4150 Adjust CookieYes integration 2024-09-22 12:00:36 +02:00
Mark Dumay
73160b0cfe Bump package release 2024-09-20 17:26:00 +02:00
Mark Dumay
2d5225e205 Fix reference to undefined getLocalStorage in navbar 2024-09-20 17:25:19 +02:00
Mark Dumay
d7e9f05588 Merge pull request #1203 from gethinode/develop
Add support for functional scripts to be included in the page header
2024-09-20 17:15:00 +02:00
Mark Dumay
f936bdd117 Merge branch 'main' into develop 2024-09-20 17:08:40 +02:00
Mark Dumay
fc05a338c7 Bump package release 2024-09-20 17:07:33 +02:00
Mark Dumay
367e2f78d3 Update js lint config 2024-09-20 17:06:27 +02:00
Mark Dumay
6af1df3862 Enable support for critical / functional scripts 2024-09-20 17:05:27 +02:00
Mark Dumay
a1c124cb38 Include cookieyes in Hinode demo site 2024-09-20 17:04:56 +02:00
Mark Dumay
07b1a0d0ce Categorize critical scripts as functional scripts 2024-09-20 17:04:11 +02:00
Mark Dumay
a3f215c211 Merge pull request #1201 from gethinode/develop
Test cky integration
2024-09-20 08:57:23 +02:00
Mark Dumay
c31fdae5e4 Test cky integration 2024-09-20 08:52:10 +02:00
Mark Dumay
c208bc8946 Merge branch 'main' into develop 2024-09-20 07:16:50 +02:00
Mark Dumay
6c285b203d Test cky integration 2024-09-20 07:16:23 +02:00
Mark Dumay
a867458f4b Merge pull request #1200 from gethinode/develop
Test cky integration
2024-09-20 07:02:40 +02:00
Mark Dumay
973fbf6637 Merge branch 'main' into develop 2024-09-20 06:57:02 +02:00
Mark Dumay
367f209c73 Test cky integration 2024-09-20 06:56:36 +02:00
Mark Dumay
06f384a206 Merge pull request #1199 from gethinode/develop
Test cky integration
2024-09-20 06:43:47 +02:00
Mark Dumay
2ce4001fa8 Merge branch 'main' into develop 2024-09-20 06:34:48 +02:00
Mark Dumay
fe2e3ba5f4 Test cky integration 2024-09-20 06:30:19 +02:00
Mark Dumay
0830e0da77 Merge pull request #1198 from gethinode/develop
Add cookie APIs
2024-09-19 05:53:47 +02:00
Mark Dumay
195f0b192f Merge branch 'main' into develop 2024-09-19 05:48:50 +02:00
Mark Dumay
f98d2000e3 Merge pull request #1197 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2024-09-19 05:48:22 +02:00
Mark Dumay
54f49944cc Add cookie APIs 2024-09-19 05:47:32 +02:00
markdumay
7525ecddc2 fix: update Hugo module dependencies 2024-09-19 03:07:20 +00:00
Mark Dumay
09ab64c361 Shift script documentation to docs site 2024-09-18 09:07:49 +02:00
Mark Dumay
2b3f87b885 Merge pull request #1196 from gethinode/develop
Prepare for consent-enabled script bundling
2024-09-17 19:06:27 +02:00
Mark Dumay
213bb31133 Merge branch 'main' into develop 2024-09-17 18:59:42 +02:00
Mark Dumay
b0130d9f7d Support bundling of scripts by category 2024-09-17 18:57:50 +02:00
Mark Dumay
07a3be644c Remove support for deprecated module configuration keys 2024-09-17 18:55:53 +02:00
Mark Dumay
262bc47260 Shift Google Analytics to separate module 2024-09-17 16:46:37 +02:00
Mark Dumay
51553a05f0 Merge pull request #1195 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2024-09-17 08:55:39 +02:00
markdumay
bd06ee211b fix: update Hugo module dependencies 2024-09-17 03:06:18 +00:00
Mark Dumay
cc8e889825 Merge pull request #1194 from gethinode/develop
Suppress anchor links for empty headings
2024-09-15 10:59:41 +02:00
Mark Dumay
a6144122b2 Merge branch 'main' into develop 2024-09-15 08:40:39 +02:00
Mark Dumay
853e0c818f Bump package release 2024-09-15 08:40:01 +02:00
Mark Dumay
1c5fb55d89 Suppress anchor links for empty headings 2024-09-15 08:39:29 +02:00
Mark Dumay
d48fb1a300 Merge pull request #1191 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2024-09-15 06:57:36 +02:00
Mark Dumay
f2aa9d2661 Merge branch 'main' into hugo-mod-dependencies 2024-09-15 06:39:15 +02:00
Mark Dumay
d721e1cfc2 Merge pull request #1193 from gethinode/develop
Add nofollow to external links
2024-09-15 06:28:41 +02:00
Mark Dumay
7f7bf2152c Merge branch 'main' into develop 2024-09-15 06:21:02 +02:00
Mark Dumay
a9543de1e7 Add nofollow to external links 2024-09-15 06:20:23 +02:00
Mark Dumay
39e4073837 Merge pull request #1192 from gethinode/develop
Support configuration of meta title and meta description
2024-09-15 06:19:11 +02:00
Mark Dumay
d2782349d5 Reset meta data of example page 2024-09-15 06:12:38 +02:00
Mark Dumay
fe97815460 Merge branch 'main' into develop 2024-09-15 06:09:56 +02:00
Mark Dumay
7bcaa69d5b Support configuration of meta title and meta description 2024-09-15 06:09:09 +02:00
markdumay
30ae3f6b3c fix: update Hugo module dependencies 2024-09-15 03:10:46 +00:00
github-actions[bot]
6540e11fa9 Merge pull request #1189 from gethinode/dependabot/npm_and_yarn/neostandard-0.11.5
Bump neostandard from 0.11.4 to 0.11.5
2024-09-12 13:43:46 +00:00
dependabot[bot]
14f2145239 Bump neostandard from 0.11.4 to 0.11.5
Bumps [neostandard](https://github.com/neostandard/neostandard) from 0.11.4 to 0.11.5.
- [Release notes](https://github.com/neostandard/neostandard/releases)
- [Changelog](https://github.com/neostandard/neostandard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/neostandard/neostandard/compare/v0.11.4...v0.11.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-12 13:38:34 +00:00
Mark Dumay
856a0aed08 Merge pull request #1188 from gethinode/develop
Fix bootstrap form validation when purging styles
2024-09-12 07:13:56 +02:00
Mark Dumay
5c6b91f1ce Merge branch 'main' into develop 2024-09-12 07:07:31 +02:00
Mark Dumay
152b8ca060 Bump package release 2024-09-12 07:06:42 +02:00
Mark Dumay
0f8870fed0 Fix bootstrap form validation when purging styles
See #1184
2024-09-12 07:06:10 +02:00
Mark Dumay
742ae6784b Merge pull request #1187 from gethinode/develop
Refine hugo caching
2024-09-12 06:57:22 +02:00
Mark Dumay
ce4c8c0a7c Merge branch 'main' into develop 2024-09-12 06:42:13 +02:00
Mark Dumay
40de449fed Refine hugo caching 2024-09-12 06:41:35 +02:00
Mark Dumay
4c27864248 Improve code layout 2024-09-12 06:41:03 +02:00
Mark Dumay
3efb2b7451 Merge pull request #1186 from gethinode/develop
Improve handling of Cloudinary image paths
2024-09-12 06:36:51 +02:00
Mark Dumay
721e222849 Merge branch 'main' into develop 2024-09-12 06:30:49 +02:00
Mark Dumay
77b9d62d76 Improve handling of Cloudinary image paths
You can reference an image on Cloudinary by using the account name, relative directory, and file name. However, you can reference the image by optionally adding the API path (e.g. "image/upload", "video/upload") directly after the account name. Hinode now parses both types of paths correctly.
2024-09-12 06:29:54 +02:00
github-actions[bot]
efe3c947c2 Merge pull request #1183 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.131.2
Bump hugo-bin from 0.131.1 to 0.131.2
2024-09-10 13:24:12 +00:00
dependabot[bot]
beee2e40e0 Bump hugo-bin from 0.131.1 to 0.131.2
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.131.1 to 0.131.2.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.131.1...v0.131.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-10 13:19:12 +00:00
Mark Dumay
895d606175 Merge pull request #1182 from gethinode/develop
Bump Netlify build environment
2024-09-10 09:36:02 +02:00
Mark Dumay
9a17df96f3 Merge branch 'main' into develop 2024-09-10 07:17:05 +02:00
Mark Dumay
d2e1a1678a Bump Netlify build environment 2024-09-10 07:16:39 +02:00
Mark Dumay
d8451e2699 Merge pull request #1181 from gethinode/develop
Fix deprecation warning
2024-09-10 07:15:09 +02:00
Mark Dumay
f98ab74905 Merge branch 'main' into develop 2024-09-10 07:09:30 +02:00
Mark Dumay
6e453ea2ab Fix deprecation warning 2024-09-10 07:09:05 +02:00
Mark Dumay
d6ca890c80 Merge pull request #1180 from gethinode/develop
Improve handling of unsupported alert types
2024-09-10 07:07:51 +02:00
Mark Dumay
46aecfe65a Merge branch 'main' into develop 2024-09-10 06:58:26 +02:00
Mark Dumay
496c07ff7e Improve handling of unsupported alert types 2024-09-10 06:55:56 +02:00
github-actions[bot]
3a63f4fad7 Merge pull request #1179 from gethinode/dependabot/npm_and_yarn/eslint-9.10.0
Bump eslint from 9.9.1 to 9.10.0
2024-09-09 13:24:05 +00:00
dependabot[bot]
bbf99507d6 Bump eslint from 9.9.1 to 9.10.0
Bumps [eslint](https://github.com/eslint/eslint) from 9.9.1 to 9.10.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/v9.9.1...v9.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 13:18:22 +00:00
Mark Dumay
2a92cfd155 Merge pull request #1175 from gethinode/develop
Fix thumbnail init
2024-09-08 13:46:21 +02:00
Mark Dumay
31a5377cf4 Merge branch 'main' into develop 2024-09-08 13:40:46 +02:00
Mark Dumay
633a33796c Fix thumbnail init 2024-09-08 13:40:26 +02:00
Mark Dumay
9b224317bb Fix thumbnail used in seo metadata 2024-09-08 13:33:13 +02:00
Mark Dumay
a410fcaa19 Merge pull request #1174 from gethinode/develop
Make core elements compatible with Hugo < v0.112.0
2024-09-08 12:18:52 +02:00
Mark Dumay
a6b2ddd2f9 Merge branch 'main' into develop 2024-09-08 12:12:57 +02:00
Mark Dumay
2e4a3660cc Make core elements compatible with Hugo < v0.112.0 2024-09-08 12:12:28 +02:00
Mark Dumay
2b0620b2d9 Merge pull request #1173 from gethinode/develop
Fix linting issues
2024-09-08 12:04:43 +02:00
Mark Dumay
98fc43cf7d Merge branch 'main' into develop 2024-09-08 11:58:49 +02:00
Mark Dumay
de1101c7ec Fix linting issues 2024-09-08 11:55:49 +02:00
Mark Dumay
c42f3bb27b Merge pull request #1171 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2024-09-08 11:52:24 +02:00
Mark Dumay
267007b7e8 Merge branch 'main' into hugo-mod-dependencies 2024-09-08 11:46:59 +02:00
Mark Dumay
77288da0de Merge pull request #1172 from gethinode/develop
Improve code layout
2024-09-08 11:43:01 +02:00
Mark Dumay
1764ccd9f4 Merge branch 'main' into develop 2024-09-08 11:37:38 +02:00
Mark Dumay
14f8c27eca Improve code layout 2024-09-08 11:37:16 +02:00
markdumay
884b7b323d fix: update Hugo module dependencies 2024-09-08 03:07:03 +00:00
github-actions[bot]
a0795b35db Merge pull request #1167 from gethinode/dependabot/npm_and_yarn/markdownlint-cli2-0.14.0
Bump markdownlint-cli2 from 0.13.0 to 0.14.0
2024-09-07 14:02:31 +00:00
Mark Dumay
0db4e4c32a Merge branch 'main' into dependabot/npm_and_yarn/markdownlint-cli2-0.14.0 2024-09-07 15:58:37 +02:00
Mark Dumay
71a084943c Merge pull request #1170 from gethinode/develop
Fix linting issue
2024-09-07 15:58:27 +02:00
Mark Dumay
6bad597805 Merge branch 'main' into develop 2024-09-07 15:52:08 +02:00
Mark Dumay
b11aefd592 Fix linting issue 2024-09-07 15:51:32 +02:00
Mark Dumay
f280f6402b Merge branch 'main' into dependabot/npm_and_yarn/markdownlint-cli2-0.14.0 2024-09-07 15:47:40 +02:00
Mark Dumay
157b3da43e Merge pull request #1169 from gethinode/develop
Fix linting issue
2024-09-07 15:47:25 +02:00
Mark Dumay
5de693297f Merge branch 'main' into develop 2024-09-07 15:40:25 +02:00
Mark Dumay
65633ca62c Fix linting issue 2024-09-07 15:39:54 +02:00
dependabot[bot]
81589efb00 Bump markdownlint-cli2 from 0.13.0 to 0.14.0
Bumps [markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2) from 0.13.0 to 0.14.0.
- [Changelog](https://github.com/DavidAnson/markdownlint-cli2/blob/main/CHANGELOG.md)
- [Commits](https://github.com/DavidAnson/markdownlint-cli2/compare/v0.13.0...v0.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-07 13:38:18 +00:00
Mark Dumay
1d50bb5ed2 Merge pull request #1168 from gethinode/develop
Make video partial compatible with Hugo < v0.112.0
2024-09-07 15:37:08 +02:00
Mark Dumay
b5a19fa7d6 Refine video path 2024-09-07 15:29:50 +02:00
Mark Dumay
fc76bac8b0 Merge branch 'main' into develop 2024-09-07 13:43:49 +02:00
Mark Dumay
f671c31130 Make video partial compatible with Hugo < v0.112.0 2024-09-07 13:43:01 +02:00
github-actions[bot]
cdb84e8f21 Merge pull request #1166 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.131.1
Bump hugo-bin from 0.131.0 to 0.131.1
2024-09-06 13:48:38 +00:00
dependabot[bot]
121625515a Bump hugo-bin from 0.131.0 to 0.131.1
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.131.0 to 0.131.1.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.131.0...v0.131.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-06 13:43:21 +00:00
Mark Dumay
60b6e1c960 Merge pull request #1160 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2024-09-05 19:45:31 +02:00
Mark Dumay
6628e9f879 Merge branch 'main' into hugo-mod-dependencies 2024-09-05 19:36:37 +02:00
Mark Dumay
a3178e06af Merge pull request #1163 from gethinode/develop
Migrate to neostandard eslint
2024-09-05 19:35:38 +02:00
Mark Dumay
fc86946cff Merge branch 'main' into develop 2024-09-05 19:24:59 +02:00
Mark Dumay
e440386999 Migrate to neostandard eslint
See #1143
2024-09-05 19:20:34 +02:00
Mark Dumay
01c864bd64 Merge branch 'main' into hugo-mod-dependencies 2024-09-05 18:13:04 +02:00
github-actions[bot]
16cc468cf1 Merge pull request #1162 from gethinode/dependabot/npm_and_yarn/cssnano-7.0.6
Bump cssnano from 7.0.5 to 7.0.6
2024-09-05 13:52:10 +00:00
dependabot[bot]
1147c8fff6 Bump cssnano from 7.0.5 to 7.0.6
Bumps [cssnano](https://github.com/cssnano/cssnano) from 7.0.5 to 7.0.6.
- [Release notes](https://github.com/cssnano/cssnano/releases)
- [Commits](https://github.com/cssnano/cssnano/compare/cssnano@7.0.5...cssnano@7.0.6)

---
updated-dependencies:
- dependency-name: cssnano
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 13:46:27 +00:00
github-actions[bot]
6b0fd9e244 Merge pull request #1161 from gethinode/dependabot/npm_and_yarn/cssnano-preset-advanced-7.0.6
Bump cssnano-preset-advanced from 7.0.5 to 7.0.6
2024-09-05 13:45:18 +00:00
dependabot[bot]
05bb9417b0 Bump cssnano-preset-advanced from 7.0.5 to 7.0.6
Bumps [cssnano-preset-advanced](https://github.com/cssnano/cssnano) from 7.0.5 to 7.0.6.
- [Release notes](https://github.com/cssnano/cssnano/releases)
- [Commits](https://github.com/cssnano/cssnano/compare/cssnano-preset-advanced@7.0.5...cssnano-preset-advanced@7.0.6)

---
updated-dependencies:
- dependency-name: cssnano-preset-advanced
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 13:40:18 +00:00
markdumay
03fc50852a fix: update Hugo module dependencies 2024-09-05 03:06:20 +00:00
Mark Dumay
4de91bb7f2 Merge pull request #1159 from gethinode/develop
Enhance styling options of cards and card groups
2024-09-04 16:11:13 +02:00
Mark Dumay
96b9a3b38d Merge branch 'main' into develop 2024-09-04 16:03:24 +02:00
Mark Dumay
da52d6e596 Bump package release 2024-09-04 16:01:57 +02:00
Mark Dumay
b369e34f32 Extend styling options of card groups 2024-09-04 16:01:46 +02:00
Mark Dumay
e456061d19 Extend configuration of card body 2024-09-04 15:59:38 +02:00
Mark Dumay
a87de9c37c Add overlay support to card 2024-09-04 15:58:48 +02:00
Mark Dumay
6283970443 Merge pull request #1158 from gethinode/develop
Fix deprecation warnings
2024-09-04 14:43:06 +02:00
Mark Dumay
200ca109b1 Merge branch 'main' into develop 2024-09-04 14:36:00 +02:00
Mark Dumay
acded37e83 Use css.PostCSS instead of deprecated resources.PostCSS 2024-09-04 14:35:21 +02:00
Mark Dumay
782a40e1e8 Use pagerSize instead of deprecated pagination key 2024-09-04 14:35:16 +02:00
Mark Dumay
7b2bb803b3 Merge pull request #1157 from gethinode/develop
Support table render hook
2024-09-04 14:25:44 +02:00
Mark Dumay
0e0561b081 Merge branch 'main' into develop 2024-09-04 14:18:14 +02:00
Mark Dumay
e3cf2e1337 Support table render hook
Fixes #1156
2024-09-04 14:17:45 +02:00
github-actions[bot]
c18316250b Merge pull request #1153 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.131.0
Bump hugo-bin from 0.130.1 to 0.131.0
2024-09-04 07:09:54 +00:00
Mark Dumay
29a8666d7d Merge branch 'main' into dependabot/npm_and_yarn/hugo-bin-0.131.0 2024-09-04 08:06:53 +02:00
Mark Dumay
431125e46c Merge pull request #1155 from gethinode/develop
Support type hstring.HTML introduced in Hugo v0.134.0
2024-09-04 08:06:41 +02:00
Mark Dumay
dae6541185 Merge branch 'main' into develop 2024-09-04 07:56:38 +02:00
Mark Dumay
41d0edb6c1 Support type hstring.HTML introduced in Hugo v0.134.0 2024-09-04 07:55:45 +02:00
Mark Dumay
5d9d11c388 Merge pull request #1154 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2024-09-04 07:52:26 +02:00
markdumay
3b26c04bdd fix: update Hugo module dependencies 2024-09-04 03:05:46 +00:00
dependabot[bot]
01d41ae38e Bump hugo-bin from 0.130.1 to 0.131.0
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.130.1 to 0.131.0.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.130.1...v0.131.0)

---
updated-dependencies:
- dependency-name: hugo-bin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-03 13:53:26 +00:00
github-actions[bot]
22d5859432 Merge pull request #1152 from gethinode/dependabot/npm_and_yarn/eslint-plugin-import-2.30.0
Bump eslint-plugin-import from 2.29.1 to 2.30.0
2024-09-03 13:52:15 +00:00
dependabot[bot]
551b185dd9 Bump eslint-plugin-import from 2.29.1 to 2.30.0
Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.29.1 to 2.30.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.29.1...v2.30.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>
2024-09-03 13:47:25 +00:00
73 changed files with 2313 additions and 1346 deletions

View File

@@ -1,8 +0,0 @@
assets/js/critical/languageSelector.js
assets/js/critical/color.js
assets/js/analytics.js
assets/js/flexsearch.js
assets/js/navbar.js
assets/js/sharing.js
assets/js/vendor
node_modules

View File

@@ -123,7 +123,7 @@ Hinode is inspired by the following themes:
## Donate
<!-- markdownlint-disable MD033 -->
<a href="https://www.buymeacoffee.com/markdumay" target="_blank" rel="noopener noreferrer"><img src="https://cdn.buymeacoffee.com/buttons/lato-orange.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;"></a>
<a href="https://www.buymeacoffee.com/markdumay" target="_blank" rel="noopener noreferrer nofollow"><img src="https://cdn.buymeacoffee.com/buttons/lato-orange.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;"></a>
<!-- markdownlint-enable MD033 -->
## License

View File

@@ -1,14 +1,15 @@
/* eslint-disable no-undef */
const alert = document.getElementById('page-alert')
const closeBtn = document.getElementById('page-alert-btn-close')
if (alert !== null && closeBtn !== null) {
const version = alert.getAttribute('data-page-alert-version') || 'unknown'
const hideAlert = sessionStorage.getItem(`page-alert-${version}`) !== null
const hideAlert = getSessionStorage(`page-alert-${version}`, null, 'functional') !== null
if (hideAlert) {
alert.classList.add('d-none')
}
closeBtn.addEventListener('click', () => {
sessionStorage.setItem(`page-alert-${version}`, 'seen')
setSessionStorage(`page-alert-${version}`, 'seen', 'functional')
alert.classList.add('d-none')
})
}

View File

@@ -1,21 +0,0 @@
// Adapted from https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/google_analytics.html
{{ if and (not hugo.IsServer) (not site.Config.Privacy.GoogleAnalytics.Disable) }}
{{ with site.Config.Services.GoogleAnalytics.ID }}
{{ if strings.HasPrefix (lower .) "ua-" }}
{{ warnf "Google Analytics 4 (GA4) replaced Google Universal Analytics (UA) effective 1 July 2023. See https://support.google.com/analytics/answer/11583528. Create a GA4 property and data stream, then replace the Google Analytics ID in your site configuration with the new value." }}
{{ else }}
var doNotTrack = false;
if ({{ site.Config.Privacy.GoogleAnalytics.RespectDoNotTrack }}) {
var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
var doNotTrack = (dnt == "1" || dnt == "yes");
}
if (!doNotTrack) {
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ . }}');
}
{{ end }}
{{ end }}
{{ end }}

View File

@@ -0,0 +1,33 @@
/* eslint-disable no-undef, no-unused-vars */
function hasConsent (category) {
// TODO: placeholder function
return true
}
function getLocalStorage (key, def, category) {
if (hasConsent(category)) {
return localStorage.getItem(key)
} else {
return def
}
}
function setLocalStorage (key, val, category) {
if (hasConsent(category)) {
localStorage.setItem(key, val)
}
}
function getSessionStorage (key, def, category) {
if (hasConsent(category)) {
return sessionStorage.getItem(key)
} else {
return def
}
}
function setSessionStorage (key, val, category) {
if (hasConsent(category)) {
sessionStorage.setItem(key, val)
}
}

View File

@@ -11,8 +11,8 @@
const supportedThemes = ['auto', 'dark', 'light'];
// retrieves the currently stored theme from local storage (cookie)
const storedTheme = localStorage.getItem('theme')
// retrieves the currently stored theme from local storage
const storedTheme = getLocalStorage('theme', 'auto', 'functional')
// retrieves the theme preferred by the client, defaults to light
function getPreferredTheme() {
@@ -25,7 +25,7 @@
return storedTheme
} else {
const preference = getPreferredTheme()
localStorage.setItem('theme', preference)
setLocalStorage('theme', preference, 'functional')
return preference
}
}
@@ -35,7 +35,7 @@
if (!supportedThemes.includes(theme)) {
theme = 'auto'
}
localStorage.setItem('theme', theme)
setLocalStorage('theme', theme, 'functional')
if (theme === 'auto') {
document.documentElement.setAttribute('data-bs-theme', (getPreferredTheme()))

View File

@@ -4,14 +4,14 @@
(() => {
'use strict'
// Function to get the selected language from localStorage
// Function to get the selected language from local storage
function getLanguage () {
return localStorage.getItem('selectedLanguage')
return getLocalStorage('selectedLanguage', document.documentElement.lang, 'functional')
}
// Function to set the selected language in localStorage
// Function to set the selected language in local storage
function setLanguage (language) {
localStorage.setItem('selectedLanguage', language)
setLocalStorage('selectedLanguage', language, 'functional')
}
// Function to apply the selected language to the website

View File

@@ -7,8 +7,13 @@ const colorsBG = ['body', 'secondary', 'tertiary']
function updateNavbar () {
if (window.scrollY > 75) {
navbar.classList.add('nav-active')
const storedTheme = localStorage.getItem('theme')
navbar.setAttribute('data-bs-theme', storedTheme)
let storedTheme
if (typeof getLocalStorage === "function") {
storedTheme = getLocalStorage('theme', null, 'functional')
}
if (storedTheme) {
navbar.setAttribute('data-bs-theme', storedTheme)
}
} else {
navbar.classList.remove('nav-active')
const defaultTheme = navbar.getAttribute('data-bs-overlay')

View File

@@ -1,7 +1,6 @@
# toml-docs-start main
title = "Hinode"
copyright = "Copyright © 2024 Mark Dumay."
paginate = 9
enableGitInfo = true
# toml-docs-end main
@@ -49,6 +48,9 @@ home = ["HTML", "RSS", "REDIR"]
[taxonomies]
tag = 'tags'
[pagination]
pagerSize = 9
[privacy]
[privacy.vimeo]
disabled = false
@@ -95,7 +97,7 @@ home = ["HTML", "RSS", "REDIR"]
[module]
[module.hugoVersion]
extended = true
min = "0.132.0"
min = "0.134.0"
max = ""
[[module.mounts]]
source = "archetypes"
@@ -128,6 +130,8 @@ home = ["HTML", "RSS", "REDIR"]
path = "github.com/gethinode/mod-flexsearch/v2"
[[module.imports]]
path = "github.com/gethinode/mod-fontawesome"
[[module.imports]]
path = "github.com/gethinode/mod-google-analytics"
[[module.imports]]
path = "github.com/gethinode/mod-katex"
[[module.imports]]

View File

@@ -11,5 +11,5 @@
title = "Follow me"
caption = "I work on everything coding and tweet developer memes"
[en.params.footer]
# license = "Licensed under Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer'>CC BY-NC-SA 4.0</a>)."
# license = "Licensed under Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer nofollow'>CC BY-NC-SA 4.0</a>)."
# toml-docs-end lang-param

View File

@@ -10,7 +10,7 @@ const purgecss = require('@fullhuman/postcss-purgecss')({
return [...(els.tags || []), ...(els.classes || []), ...(els.ids || [])]
},
dynamicAttributes: ['data-bs-theme'],
safelist: [
safelist: ['was-validated',
...whitelister([
'./assets/scss/components/_clipboard.scss',
'./assets/scss/components/_command.scss',

View File

@@ -96,12 +96,14 @@ arguments:
screens.
wrapper:
type: string
default: p-0
optional: true
comment: >-
Class attributes of the wrapper element, e.g. `p-4 px-xxl-0`.
responsive:
type: bool
optional: true
default: true
comment: >-
Flag indicating if the number of columns should be responsive, defaults to
`true`.
@@ -132,5 +134,33 @@ arguments:
hook:
type: string
optional: true
default: assets/card.html
comment: Render hook for the card partial.
group: partial
bento:
type: bool
optional: true
default: false
comment: >-
Trigger to use a bento-style layout instead of default grid layout.
release: v0.27.0
valign:
type: select
optional: true
comment: >-
Defines the vertical card alignment, only applicable in bento layout.
release: v0.27.0
options:
values:
- start
- center
- end
styles:
type:
- '[]map[string]interface {}'
optional: true
comment: >-
Styles to apply to the individual cards. Supported elements are `ratio`,
`orientation`, `portrait`, and `width`. The styles are rotated when the
amount of cards exceeds the available amount of styles.
release: v0.27.0

View File

@@ -101,6 +101,7 @@ arguments:
options:
values:
- full
- title
- none
footer:
type: select
@@ -227,6 +228,7 @@ arguments:
- stacked
- horizontal
- horizontal-sm
- overlay
- none
subtle:
type: bool

View File

@@ -112,7 +112,8 @@ arguments:
title:
type:
- string
- 'hstring.RenderedString'
- hstring.RenderedString
- hstring.HTML
optional: true
comment: Alternate text of the image.
caption:

View File

@@ -72,6 +72,7 @@ arguments:
- string
- template.HTML
- hstring.RenderedString
- hstring.HTML
optional: true
group: partial
comment: Link description.

View File

@@ -0,0 +1,46 @@
comment: >-
Includes a reference to a local or external JavaScript file. Hinode uses the
template defined in `layouts/partials/templates/script.html` to generate the
link to a (bundled) JavaScript file. It includes context such as the state,
category, and integrity. For example, you can adapt this template to implement
cookie consent management.
arguments:
link:
type: string
optional: false
comment: >-
Location of the script source, either an URL for an external script or a
(relative) path for a local script.
state:
type: select
optional: true
comment: >-
Defines the loading behavior of the script bundle. By default, scripts are
loaded immediately. Use `async` to process the script in the background.
Use `defer` to load the script in relative order when the DOM is fully
built.
options:
values:
- async
- defer
- immediate
category:
type: select
optional: true
default: other
comment: >-
Assigns the script to a category that can be used for cookie consent
management.
options:
values:
- necessary
- functional
- analytics
- performance
- advertisement
- other
integrity:
type: string
optional: true
comment: >-
Cryptographic hash of the script to enable Subresource Integrity (SRI).

View File

@@ -8,62 +8,17 @@ arguments:
- '*hugolib.pageForShortcode'
optional: false
comment: Context of the current page.
core:
type: bool
default: false
optional: true
comment: >-
Trigger to include all core files in the script bundle. Core bundles are
loaded asynchronously in each page of the site.
filename:
type: string
default: js/main.bundle.js
optional: true
comment: >-
Path of the target bundle file, relative to the site root.
match:
type: string
default: {js/*.js,js/vendor/**.js}
optional: true
comment: >-
Regular expression that defines the pattern of source files to be included
in the bundle. The pattern is relative to the project's `asset` folder.
header:
type: bool
default: false
comment: >-
Trigger to consider the script as loaded in the page header. When enabled,
it includes a script to load Google Analytics adjacent to any bundle
input.
localize:
type: bool
default: false
optional: true
comment: >-
Triggers the creation of a language-specific bundle file. The language
code is appended as suffix to the base name. For example, the English
version of `js/main.bundle.js` becomes `js/main.bundle.en.js`.
skipTemplate:
type: bool
default: false
optional: true
comment: >-
Script source input can contain Go Template magic. As such, Hinode
processes all input files with `resources.ExecuteAsTemplate`. However,
certain input files may be incompatible. Set `skipTemplate` to true to
skip template processing.
state:
type:
type: select
default: core
optional: true
default: async
comment: >-
Defines the loading behavior of the script bundle. By default, scripts are
processed in the background and loaded when ready (`async`). Set the state
to `immediate` to load the script immediately (such as critical scripts).
Use 'defer' to load the script in relative order when the DOM is fully
built.
options:
values:
- async
- defer
- immediate
Type of script bundle. Critical scripts are included in the page header
and are loaded immediately. Core scripts are bundled by category and are
loaded asynchronously. Optional scripts are loaded individually on the
pages that require them. They use the synchronization method as defined
in their containing module.
values:
- critical
- core
- optional

14
eslint.config.js Normal file
View File

@@ -0,0 +1,14 @@
'use strict'
module.exports = require('neostandard')({
ignores: [
'assets/js/critical/functional/languageSelector.js',
'assets/js/critical/functional/color.js',
'assets/js/analytics.js',
'assets/js/flexsearch.js',
'assets/js/navbar.js',
'assets/js/sharing.js',
'assets/js/vendor',
'node_modules',
]
})

View File

@@ -1,7 +1,6 @@
resourcedir = '../resources/'
title = "Hinode"
copyright = "Copyright © 2024 Mark Dumay."
paginate = 9
enableGitInfo = true
# additional settings
@@ -39,6 +38,9 @@ home = ["HTML", "RSS", "REDIR"]
[taxonomies]
tag = 'tags'
[pagination]
pagerSize = 9
[privacy]
[privacy.vimeo]
disabled = false
@@ -85,5 +87,25 @@ home = ["HTML", "RSS", "REDIR"]
[module]
# Build and serve using local hinode clone declared in the named Hugo workspace:
workspace = "hinode.work"
[[module.imports]]
path = "github.com/gethinode/mod-cookieyes/v2"
[[module.imports]]
path = "github.com/gethinode/hinode"
[[module.imports]]
path = "github.com/gethinode/mod-bootstrap"
[[module.imports]]
path = "github.com/gethinode/mod-flexsearch/v2"
[[module.imports]]
path = "github.com/gethinode/mod-fontawesome"
[[module.imports]]
path = "github.com/gethinode/mod-google-analytics"
[[module.imports]]
path = "github.com/gethinode/mod-katex"
[[module.imports]]
path = "github.com/gethinode/mod-leaflet"
[[module.imports]]
path = "github.com/gethinode/mod-lottie"
[[module.imports]]
path = "github.com/gethinode/mod-simple-datatables"
[[module.imports]]
path = "github.com/gethinode/mod-utils/v2"

View File

@@ -11,7 +11,7 @@ tagline = "A Hugo Theme"
title = "Follow me"
caption = "I work on everything coding and tweet developer memes"
[en.params.footer]
# license = "Licensed under Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer'>CC BY-NC-SA 4.0</a>)."
# license = "Licensed under Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer nofollow'>CC BY-NC-SA 4.0</a>)."
# toml-docs-end lang-param
[en.params.sections.blog]
reference = "More Posts"
@@ -30,7 +30,7 @@ tagline = "Een Hugo Thema"
title = "Volg mij"
caption = "Ik doe aan programmeren en tweet memes"
[nl.params.footer]
# license = "Gelicenseerd onder Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer'>CC BY-NC-SA 4.0</a>)."
# license = "Gelicenseerd onder Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer nofollow'>CC BY-NC-SA 4.0</a>)."
[nl.params.sections.blog]
reference = "Meer artikelen"
[nl.params.sections.projects]
@@ -49,7 +49,7 @@ tagline = "Un thème Hugo"
title = "Suivez-moi"
caption = "Je code et je tweet des mèmes de développeurs."
[fr.params.footer]
# license = "Gelicenseerd onder Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer'>CC BY-NC-SA 4.0</a>)."
# license = "Gelicenseerd onder Creative Commons (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/' class='link-secondary' target='_blank' rel='noopener noreferrer nofollow'>CC BY-NC-SA 4.0</a>)."
[fr.params.sections.blog]
reference = "Plus d'articles"
[fr.params.sections.projects]

View File

@@ -191,3 +191,7 @@
observatory = "https://observatory.mozilla.org/analyze/demo.gethinode.com"
pagespeed = "https://pagespeed.web.dev/report?url=https%3A%2F%2Fdemo.gethinode.com%2F"
hinode = "https://gethinode.com"
[modules.cookieyes]
# local = true
url = "https://cdn-cookieyes.com/client_data/a54b5553f349dd13bd225f8e/script.js"

View File

@@ -7,15 +7,15 @@ for = '/**'
X-XSS-Protection = "1; mode=block"
Content-Security-Policy = """\
default-src 'self'; \
script-src 'self' https://*.google-analytics.com https://*.googletagmanager.com; \
style-src 'self' https://fonts.googleapis.com https://www.youtube.com; \
script-src 'self' cdn-cookieyes.com https://*.google-analytics.com https://*.googletagmanager.com; \
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.youtube.com; \
object-src 'none'; \
base-uri 'self'; \
connect-src 'self'
connect-src 'self' *.cookieyes.com cdn-cookieyes.com \
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
font-src 'self' https://fonts.gstatic.com; \
frame-src 'self' https://player.cloudinary.com https://player.vimeo.com https://www.youtube-nocookie.com https://www.youtube.com; \
img-src 'self' data: https://*.imgix.net https://*.imagekit.io https://*.cloudinary.com https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
img-src 'self' data: cdn-cookieyes.com https://*.imgix.net https://*.imagekit.io https://*.cloudinary.com https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
manifest-src 'self'; \
media-src 'self' \
"""

View File

@@ -10,7 +10,7 @@ const purgecss = require('@fullhuman/postcss-purgecss')({
return [...(els.tags || []), ...(els.classes || []), ...(els.ids || [])]
},
dynamicAttributes: ['data-bs-theme'],
safelist: [
safelist: ['was-validated',
...whitelister([
'./_vendor/github.com/gethinode/hinode/assets/scss/components/_clipboard.scss',
'./_vendor/github.com/gethinode/hinode/assets/scss/components/_command.scss',

View File

@@ -418,7 +418,7 @@ As an example, the following shortcode displays superscript text.
As an example, the following shortcode displays a responsive table.
<!-- markdownlint-disable MD037 -->
<!-- markdownlint-disable MD037 MD058 -->
{{< example lang="markdown" >}}
{{</* table */>}}
| # | Heading | Heading | Heading | Heading | Heading | Heading | Heading | Heading | Heading |
@@ -428,7 +428,7 @@ As an example, the following shortcode displays a responsive table.
| 3. | cell | cel | cel | cel | cel | cel | cel | cel | cel |
{{</* /table */>}}
{{< /example >}}
<!-- markdownlint-enable MD037 -->
<!-- markdownlint-enable MD037 MD058 -->
## Timeline

View File

@@ -29,7 +29,7 @@ As an example, the following shortcode shows an animation that plays on hover.
As an example, the following shortcode displays a responsive table that uses advanced controls.
<!-- markdownlint-disable MD037 -->
<!-- markdownlint-disable MD037 MD058 -->
{{< example lang="markdown" >}}
{{</* table sortable="true" paging="true" searchable="true" */>}}
| # | Heading |

View File

@@ -14,7 +14,7 @@ As an example, the following shortcode displays an image with rounded corners an
<!-- markdownlint-disable MD037 -->
{{< example lang="hugo" >}}
{{</* image src="https://res.cloudinary.com/demo/image/upload/dog.webp"
{{</* image src="https://res.cloudinary.com/demo/dog.webp"
ratio="21x9" caption="Cloudinary image" class="rounded" plain=true */>}}
{{< /example >}}
<!-- markdownlint-enable MD037 -->

View File

@@ -2,3 +2,6 @@ module github.com/gethinode/hinode/exampleSite
go 1.19
require (
github.com/gethinode/mod-cookieyes/v2 v2.0.3 // indirect
)

View File

@@ -1,14 +1,5 @@
github.com/gethinode/hinode v0.22.5 h1:zpjSDgWQVbq4BjPduxwexQB18gawFeinzPkaRRTs2Tg=
github.com/gethinode/hinode v0.22.5/go.mod h1:hsskrlBRnTbpCjrDtGbK8C1VYGML7ezHtCDGDiYL2mQ=
github.com/gethinode/mod-bootstrap v1.2.2 h1:Q8E04OKWr9owk7nhQ/NBukUgSFhsECxZsOLEaf5oeiQ=
github.com/gethinode/mod-bootstrap v1.2.2/go.mod h1:DcpPc2cNaXUPGEvhD7npuEEPA7573NvakTlrwFbyjr8=
github.com/gethinode/mod-flexsearch v1.9.0 h1:AE+w7QeZTxh36JNTG+CASDLxaqlCZKn+EUD6ulnPGak=
github.com/gethinode/mod-flexsearch v1.9.0/go.mod h1:L8hrnpupx27cez2ObMX8gWnhbW6qss4HGH1Ea4UaBRQ=
github.com/gethinode/mod-fontawesome v1.8.1 h1:iyvULrpaGizQoI5Vl9WjFYcMGWefdyG90NGK2UKax+k=
github.com/gethinode/mod-fontawesome v1.8.1/go.mod h1:xBKsZH3WJtMOItZVlp9SbO51uaBy6IbvUZSKpNu3b6Y=
github.com/gethinode/mod-katex v1.0.5 h1:AVhcTINYory0ygChQERf8PcyJkbT1oqhmLRF6ESnWOY=
github.com/gethinode/mod-katex v1.0.5/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-leaflet v1.0.0 h1:HdnWafOGkkK1hYGfqLYF3pp9dAFS/caxlzML9sO1rCc=
github.com/gethinode/mod-leaflet v1.0.0/go.mod h1:Ei0x9WiL7Dbi4JeG6yI1CE63bT1QJ8sKi67Jea1wFSE=
github.com/gethinode/mod-lottie v1.4.3 h1:IKZO8a4yQyPKUwZ6POsZRIH/B++yEzXDe5HxrFF79KA=
github.com/gethinode/mod-lottie v1.4.3/go.mod h1:nt4wLnDFIhjBGRMuQJJ2bH80VREpbcsBUsdO6uWXjLs=
github.com/gethinode/mod-cookieyes v1.0.0 h1:KTkK67uugji9pzYJJalvNhdECHgG1DzPtyeaYL0Xm/0=
github.com/gethinode/mod-cookieyes v1.0.0/go.mod h1:VrBUKm5apop6KIb+R8eRqvlf3AAPnv5aMajL0RorIjY=
github.com/gethinode/mod-cookieyes v1.0.2 h1:WL9sjpYKjkV+jRKIrm6H82UpthQjFksvKGptW6HD/QU=
github.com/gethinode/mod-cookieyes v1.0.2/go.mod h1:VrBUKm5apop6KIb+R8eRqvlf3AAPnv5aMajL0RorIjY=
github.com/gethinode/mod-cookieyes/v2 v2.0.3/go.mod h1:tULb7D7CoTycGUyL7ryqHJKaX11XuL2SN+XwP7/DI0Y=

View File

@@ -1,18 +1,6 @@
github.com/airbnb/lottie-web v5.12.2+incompatible h1:Ldogtlhiucf7mMsgisyxSBY0qunV44+lpa9Icy2KoQc=
github.com/airbnb/lottie-web v5.12.2+incompatible/go.mod h1:nTss557UK9FGnp8QYlCMO29tjUHwbdAHG/DprbGfHGE=
github.com/gethinode/hinode v0.22.5 h1:zpjSDgWQVbq4BjPduxwexQB18gawFeinzPkaRRTs2Tg=
github.com/gethinode/hinode v0.22.5/go.mod h1:hsskrlBRnTbpCjrDtGbK8C1VYGML7ezHtCDGDiYL2mQ=
github.com/gethinode/mod-flexsearch v1.8.1 h1:xwPvmmxd8Tdyxp8/rnd9KRGqIDtZs/YwAQJ1i9oQMiM=
github.com/gethinode/mod-flexsearch v1.8.1/go.mod h1:L8hrnpupx27cez2ObMX8gWnhbW6qss4HGH1Ea4UaBRQ=
github.com/gethinode/mod-fontawesome v1.8.0 h1:YEuCmvCdzcemF1eFK35Wnp1asKKO3/xbxGArnjq6PRY=
github.com/gethinode/mod-fontawesome v1.8.0/go.mod h1:uvuC2YL8mdXNp6NRzFOu4TWsHvtY9AZ8YxJkF23/M/8=
github.com/gethinode/mod-leaflet v0.4.0 h1:Xc6c1UTf4m1saQLFfFWT5sEpwj25xVGuS8csGC82UUI=
github.com/gethinode/mod-leaflet v0.4.0/go.mod h1:yr+bUKAstifdB16mbYh69OayAmgPOlNUubAmVn5eL2M=
github.com/gethinode/mod-lottie v1.4.1 h1:RzCjYsxFPqyBsYAcdPeUP0rvF+hD9eEl7NrxuaRiKQQ=
github.com/gethinode/mod-lottie v1.4.1/go.mod h1:QjKlEmYbekrNGwa9EdFlPcXxwWWcraJUQ6xIL+syA60=
github.com/gethinode/mod-utils v1.0.2 h1:0b3i+/bBHY1Td9N6khDbL1nf3d5HGc4QzI4BbEWHoU4=
github.com/gethinode/mod-utils v1.0.2/go.mod h1:ONJm3pHCq7nvaPNjusLZNCeCbhOhSBH4HVKHwK1FdYE=
github.com/nextapps-de/flexsearch v0.0.0-20240108021025-afd75f742f22 h1:re7L8FxbXQpnX8BgzkdUnDpsUmloGNyLmiy2ZCln8pg=
github.com/nextapps-de/flexsearch v0.0.0-20240108021025-afd75f742f22/go.mod h1:5GdMfPAXzbA2gXBqTjC6l27kioSYzHlqDMh0+wyx7sU=
github.com/twbs/bootstrap v5.3.2+incompatible h1:tuiO5acc6xnZUR77Sbi5aKWXxjYxbmsSbJwYrhAKoQQ=
github.com/twbs/bootstrap v5.3.2+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0=
github.com/gethinode/mod-cookieyes v1.0.2 h1:WL9sjpYKjkV+jRKIrm6H82UpthQjFksvKGptW6HD/QU=
github.com/gethinode/mod-cookieyes v1.0.2/go.mod h1:VrBUKm5apop6KIb+R8eRqvlf3AAPnv5aMajL0RorIjY=
github.com/gethinode/mod-cookieyes/v2 v2.0.3 h1:o5PAAOjx8baRcSkhTAQuZ+hX9cK8oWjeC3sYxt1DT2c=
github.com/gethinode/mod-cookieyes/v2 v2.0.3/go.mod h1:tULb7D7CoTycGUyL7ryqHJKaX11XuL2SN+XwP7/DI0Y=

View File

@@ -142,6 +142,7 @@
"carousel-item",
"checkbox",
"chroma",
"cky-banner-element",
"col",
"col-10",
"col-12",

View File

@@ -0,0 +1,80 @@
{{- /* Set version-aware sidebar menu */ -}}
{{- $version := partial "utilities/GetVersion.html" (dict "page" . "base" true) -}}
{{- $.Scratch.Set "version" $version -}}
{{ with partial "utilities/GetMenu" (dict "page" . "version" $version) }}{{ $.Scratch.Set "sidebar" . }}{{ end }}
{{- /* Validate if current version is latest */ -}}
{{- if and site.Params.docs.checkVersion $version -}}
{{- if ne $version "latest" -}}
{{- if partial "utilities/IsOlder" (dict "current" $version) -}}
{{- $.Scratch.Set "pageAlertMsg" (T "newerVersionAlert" site.Title) -}}
{{- $.Scratch.Set "pageAlertURL" (or site.Params.docs.latestURL site.baseURL) -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- /* Initialize module configuration */ -}}
{{- $modules := partialCached "utilities/InitModules.html" . -}}
{{- $.Scratch.Set "modules" $modules -}}
{{- $fullCover := or (or (and .IsHome .Site.Params.home.fullCover) .Page.Params.fullCover) .Site.Params.main.footerBelowFold }}
{{- $.Scratch.Set "fullCover" $fullCover -}}
{{- /* Define section headings */ -}}
{{- $loading := "" -}}
{{- if $fullCover }}{{ $loading = .Site.Params.main.loading }}{{ end -}}
{{ $sections := partial "utilities/GetSections.html" (dict "page" . "loading" $loading) }}
{{- $.Scratch.Set "sections" $sections -}}
{{- /* Define main breakpoint */ -}}
{{- $.Scratch.Set "breakpoint" (partialCached "utilities/GetBreakpoint.html" .) }}
{{- /* Define base URL */ -}}
{{ $lang := site.LanguageCode | default site.Language.Lang }}
{{ $.Scratch.Set "baseURL" (strings.TrimSuffix (printf "%s/" $lang) site.Home.RelPermalink) }}
<!doctype html>
<html lang="{{ .Site.Language.Lang }}" class="no-js">
<head>
{{- partial "footer/scripts.html" (dict "page" . "type" "critical") -}}
{{ block "head" . }}{{ end -}}
</head>
<body>
<div class="d-flex flex-column min-vh-100">
<div class="d-flex flex-column {{ if $fullCover }} fullscreen{{ end }}{{ if .IsHome }} {{ .Site.Params.home.style }}{{ end }}">
{{- partial "assets/navbar.html" (dict
"page" .
"fixed" site.Params.navigation.fixed
"overlay" site.Params.navigation.overlay
"overlayMode" site.Params.navigation.overlayMode
"color" site.Params.navigation.color
"style" (default "light" site.Params.navigation.style)
"size" (default "md" site.Params.navigation.size))
-}}
<div class="main-content">
{{ block "featured" . }}{{ end -}}
</div>
{{ if .Site.Params.main.footerBelowFold }}
{{ block "main" . }}{{ end -}}
{{ end }}
</div>
{{ if not .Site.Params.main.footerBelowFold }}
{{ block "main" . }}{{ end -}}
{{- partial "footer/social.html" . -}}
{{- partial "footer/footer.html" . -}}
{{ end }}
</div>
{{ if .Site.Params.main.footerBelowFold }}
{{- partial "footer/social.html" . -}}
{{- partial "footer/footer.html" . -}}
{{ end }}
{{- partial "footer/toast-container.html" . -}}
{{- partial "assets/symbols.html" . -}}
{{- partialCached "footer/scripts.html" (dict "page" .) -}}
{{- partial "footer/scripts.html" (dict "page" . "type" "optional") -}}
</body>
</html>

7
go.mod
View File

@@ -7,11 +7,12 @@ require (
github.com/gethinode/mod-bootstrap v1.3.1 // indirect
github.com/gethinode/mod-flexsearch/v2 v2.0.1 // indirect
github.com/gethinode/mod-fontawesome v1.10.0 // indirect
github.com/gethinode/mod-google-analytics v1.0.3 // indirect
github.com/gethinode/mod-katex v1.1.2 // indirect
github.com/gethinode/mod-leaflet v1.1.1 // indirect
github.com/gethinode/mod-lottie v1.5.7 // indirect
github.com/gethinode/mod-simple-datatables v1.0.8 // indirect
github.com/gethinode/mod-utils/v2 v2.5.0 // indirect
github.com/gethinode/mod-lottie v1.5.10 // indirect
github.com/gethinode/mod-simple-datatables v1.0.13 // indirect
github.com/gethinode/mod-utils/v2 v2.8.1 // indirect
github.com/nextapps-de/flexsearch v0.0.0-20240501124520-961c3ae84a87 // indirect
github.com/twbs/bootstrap v5.3.3+incompatible // indirect
)

32
go.sum
View File

@@ -118,6 +118,14 @@ github.com/gethinode/mod-fontawesome v1.9.1 h1:cQk84vriqffM4fuUUoM9j3SSD+3ppeW2j
github.com/gethinode/mod-fontawesome v1.9.1/go.mod h1:xBKsZH3WJtMOItZVlp9SbO51uaBy6IbvUZSKpNu3b6Y=
github.com/gethinode/mod-fontawesome v1.10.0 h1:Izs2AKc+YVBa1TywcH54OKLTNCUMXRoFIqOs+n0FgOo=
github.com/gethinode/mod-fontawesome v1.10.0/go.mod h1:xBKsZH3WJtMOItZVlp9SbO51uaBy6IbvUZSKpNu3b6Y=
github.com/gethinode/mod-google-analytics v1.0.0 h1:fly42RQ69bdyJe8WFefsBIo7WMIXkd3wZn32kyAr4h4=
github.com/gethinode/mod-google-analytics v1.0.0/go.mod h1:dl628cFozpCvoIMCiV7ujzQipjxcm3eatXrSfLPWNII=
github.com/gethinode/mod-google-analytics v1.0.1 h1:zbmOdnAhhFCA7qWw7fnR46biWhqW2r06sIaTWyhB5R0=
github.com/gethinode/mod-google-analytics v1.0.1/go.mod h1:dl628cFozpCvoIMCiV7ujzQipjxcm3eatXrSfLPWNII=
github.com/gethinode/mod-google-analytics v1.0.2 h1:ljrAYdAPqiQg6rdnL6Je8zLK6mhlXoTGJ/vGtIUpX+w=
github.com/gethinode/mod-google-analytics v1.0.2/go.mod h1:dl628cFozpCvoIMCiV7ujzQipjxcm3eatXrSfLPWNII=
github.com/gethinode/mod-google-analytics v1.0.3 h1:QUm4AeBR6D9cLx26F6Cy5qQvQe/19c2wTJAqxmCfAq4=
github.com/gethinode/mod-google-analytics v1.0.3/go.mod h1:dl628cFozpCvoIMCiV7ujzQipjxcm3eatXrSfLPWNII=
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=
@@ -204,6 +212,12 @@ github.com/gethinode/mod-lottie v1.5.6 h1:dxz5nmD0XXEt/DAOc1s5fIPynj5bhzDL32EEwL
github.com/gethinode/mod-lottie v1.5.6/go.mod h1:VTvBxD8VokICwnEqM0VUZFZHBYxLf4/grDFQyEh1DL0=
github.com/gethinode/mod-lottie v1.5.7 h1:hcf04kmKv7xrI2byxtgHwkScYIHfP9aquInHNZP+qbk=
github.com/gethinode/mod-lottie v1.5.7/go.mod h1:rhWg+MSSnWmqHKNEViE/9/78RjQD6uWWFASgjvFjgyo=
github.com/gethinode/mod-lottie v1.5.8 h1:glg5HcjOBkFt5MoF7p24NN+RzctExPQUDXvdhPx9u6I=
github.com/gethinode/mod-lottie v1.5.8/go.mod h1:Z/FlAcCJWYI1Z9tQnL0yRN4lqhyZl9CqYpfJUPVDaGc=
github.com/gethinode/mod-lottie v1.5.9 h1:1MFsq8pO7s4RXu1sA0z75xdp63FPdJ6ar9OhEieDSj8=
github.com/gethinode/mod-lottie v1.5.9/go.mod h1:TA1rPRwSilT5mXUakNSVlXNrgTpE87mUOB/fdunAdA0=
github.com/gethinode/mod-lottie v1.5.10 h1:tYFgk74T9zWy2FRkfkRI+8QVQy6lnuABnTeWQ8nUX5w=
github.com/gethinode/mod-lottie v1.5.10/go.mod h1:L7NpvCAm04R59GSAAm/UFoDCs/6UtrIC5zQEjgQSr4k=
github.com/gethinode/mod-simple-datatables v1.0.0 h1:Dj4WGw12OkaimwkCpLn5Jhmd49dvNJW9O2P/W9F+HlQ=
github.com/gethinode/mod-simple-datatables v1.0.0/go.mod h1:K8T7fIdb8pMOB+OSW4A5lz5IW99+HyzcTgx764fvOGw=
github.com/gethinode/mod-simple-datatables v1.0.2 h1:zhqxHet3iLQWYCBbGROALpOY9zQlptMycFkz1Tto5bA=
@@ -218,6 +232,14 @@ github.com/gethinode/mod-simple-datatables v1.0.7 h1:pfxWhgmn/njJcynNIDnUyeOBW0t
github.com/gethinode/mod-simple-datatables v1.0.7/go.mod h1:Y7AzIYAWpzDKLvH96eqBA/Gs3jompWCgxadLuoKZ/rc=
github.com/gethinode/mod-simple-datatables v1.0.8 h1:J8hA+SXdTLaRNZwN70ZEyADn+VgNoAaxVDMXsMPTZBg=
github.com/gethinode/mod-simple-datatables v1.0.8/go.mod h1:RsTHWAt1J9/m7kzhYNSJB7CDyk+8DrG+46/aFrP6KJw=
github.com/gethinode/mod-simple-datatables v1.0.9 h1:8OnpY/axFkgxJ598DHW4nDtxsCYmgTakAG4ZC2wRS3A=
github.com/gethinode/mod-simple-datatables v1.0.9/go.mod h1:rgQWdDZ6lTR9+08dGY1zBDLZI/UneKPufakAK20+lmI=
github.com/gethinode/mod-simple-datatables v1.0.10 h1:/nYy4oCgooUJhTBgLdQzMnJEjolkD+dp2nkfLNT9Klg=
github.com/gethinode/mod-simple-datatables v1.0.10/go.mod h1:rgQWdDZ6lTR9+08dGY1zBDLZI/UneKPufakAK20+lmI=
github.com/gethinode/mod-simple-datatables v1.0.12 h1:myyVp1ctQA6j+5UTWcDwQmy8ipXdjs8T+qpTpRPBPII=
github.com/gethinode/mod-simple-datatables v1.0.12/go.mod h1:QuH7wz1igohzCgL76xI1960mFxPPrqgvGtLwR/0cFyQ=
github.com/gethinode/mod-simple-datatables v1.0.13 h1:3GTn46Zh56SFzCUP7CUSrmp/ZoiaVG19q4xdObSx6Pc=
github.com/gethinode/mod-simple-datatables v1.0.13/go.mod h1:a2qIdYegX5gBubGbspuHv/2UA/8O89oUG/U5hd7jLK8=
github.com/gethinode/mod-utils v1.0.0 h1:cqHm2xS5uDiJzRm1KfHaNbq6uMVDKLhQa8/BuTZ1nhY=
github.com/gethinode/mod-utils v1.0.0/go.mod h1:ONJm3pHCq7nvaPNjusLZNCeCbhOhSBH4HVKHwK1FdYE=
github.com/gethinode/mod-utils v1.0.1 h1:jhZGlGFHHL1f5HXbBMXfiZ2gCz4TVafAzjnRPTIBSEE=
@@ -268,6 +290,16 @@ github.com/gethinode/mod-utils/v2 v2.4.0 h1:mmG4hWaeA4krAg933pibH+TrjFmPHkAi/DUb
github.com/gethinode/mod-utils/v2 v2.4.0/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/gethinode/mod-utils/v2 v2.5.0 h1:9QboNU9KTpmJDS9JBjxavbknLVBJilocqo5KhC2FdME=
github.com/gethinode/mod-utils/v2 v2.5.0/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/gethinode/mod-utils/v2 v2.5.2 h1:URGTpJo0dN4/oF2yL6o2d2pkcSlG1F0hgIF9UqpIs/E=
github.com/gethinode/mod-utils/v2 v2.5.2/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/gethinode/mod-utils/v2 v2.6.0 h1:r7l/E6fbPZHnjFyJY4T/xzekd7Xp3czNVCMgKoKR8wc=
github.com/gethinode/mod-utils/v2 v2.6.0/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/gethinode/mod-utils/v2 v2.7.0 h1:5CKygjsc7X4dFtb90ihWyDVvUp2iqoJE8C7M+jeWYus=
github.com/gethinode/mod-utils/v2 v2.7.0/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/gethinode/mod-utils/v2 v2.8.0 h1:BdB+onItuO29g5ZLEz/HEwq9c4xBEM4GGqQc3kQ++js=
github.com/gethinode/mod-utils/v2 v2.8.0/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/gethinode/mod-utils/v2 v2.8.1 h1:u7sFbgJ5sBEMYC/GwcMRyjRAd5NxTjBnbld5b0V5n98=
github.com/gethinode/mod-utils/v2 v2.8.1/go.mod h1:GTYeknoLujNjfDxI+V9Dcug26CYJSTJ0B/U2dagw9oY=
github.com/nextapps-de/flexsearch v0.0.0-20230711092928-1243fd883ec3 h1:H/qVR5O4BXjRjD+5PZB+r4ug2BSJ2Of4RtwOntd+OKo=
github.com/nextapps-de/flexsearch v0.0.0-20230711092928-1243fd883ec3/go.mod h1:5GdMfPAXzbA2gXBqTjC6l27kioSYzHlqDMh0+wyx7sU=
github.com/nextapps-de/flexsearch v0.0.0-20240108021025-afd75f742f22 h1:re7L8FxbXQpnX8BgzkdUnDpsUmloGNyLmiy2ZCln8pg=

View File

@@ -16,7 +16,6 @@
"link",
"meta",
"nav",
"noscript",
"ol",
"p",
"path",
@@ -39,7 +38,6 @@
"bg-body",
"bg-opacity-10",
"bg-primary",
"border-0",
"bottom-0",
"bottom-bar",
"breadcrumb",
@@ -47,19 +45,10 @@
"btn",
"btn-close",
"btn-primary",
"btn-social",
"card",
"card-body",
"card-body-link",
"card-text",
"card-title",
"card-zoom",
"checkbox",
"col",
"col-12",
"col-6",
"col-lg-2",
"col-lg-8",
"col-md-2",
"col-md-3",
"col-md-4",
@@ -72,9 +61,7 @@
"container-xxl",
"d-flex",
"d-inline",
"d-lg-block",
"d-md-block",
"d-md-none",
"d-none",
"display-1",
"display-4",
@@ -86,17 +73,12 @@
"fa-book-open",
"fa-ellipsis",
"fa-face-frown",
"fa-facebook",
"fa-fw",
"fa-github",
"fa-link",
"fa-linkedin",
"fa-medium",
"fa-moon",
"fa-share-nodes",
"fa-sun",
"fa-whatsapp",
"fa-x-twitter",
"fab",
"fas",
"fixed-top",
@@ -106,13 +88,8 @@
"form-control",
"fs-3",
"fs-5",
"fs-6",
"fs-lg-5",
"fw-30",
"fw-bold",
"g-4",
"gap-1",
"h-100",
"hstack",
"img-fluid",
"img-wrap",
@@ -122,14 +99,10 @@
"justify-content-end",
"justify-content-start",
"label",
"lead",
"link-bg-footer",
"link-secondary",
"main-content",
"main-nav-toggler",
"mb-3",
"mb-5",
"mb-lg-5",
"me-auto",
"middle-bar",
"min-vh-100",
@@ -137,11 +110,12 @@
"ms-auto",
"ms-md-3",
"mt-3",
"mt-4",
"mt-5",
"mt-md-0",
"mx-auto",
"mx-md-0",
"my-auto",
"my-md-0",
"my-md-auto",
"nav-item",
"nav-link",
@@ -164,7 +138,6 @@
"p-3",
"p-4",
"pb-4",
"pb-5",
"pb-md-0",
"position-fixed",
"position-relative",
@@ -179,59 +152,40 @@
"row",
"row-cols-1",
"row-cols-2",
"row-cols-lg-3",
"row-cols-md-2",
"row-cols-md-3",
"row-cols-sm-2",
"row-cols-sm-3",
"search",
"search-input",
"search-suggestions",
"shadow",
"sidebar-overflow",
"sticky-top",
"stretched-link",
"svg-inline--fa",
"text-body-secondary",
"text-center",
"text-decoration-none",
"text-end",
"text-muted",
"text-secondary",
"text-sm-start",
"text-start",
"text-uppercase",
"toast",
"toast-body",
"toast-container",
"toast-header",
"toc",
"toc-sidebar",
"toggler-icon",
"top-bar"
],
"ids": [
"blogs",
"btn-webshare",
"fa-face-frown",
"fab-facebook",
"fab-github",
"fab-linkedin",
"fab-medium",
"fab-whatsapp",
"fab-x-twitter",
"fas-book-open",
"fas-ellipsis",
"fas-link",
"fas-moon",
"fas-share-nodes",
"fas-sun",
"navbar-0-collapse",
"navbar-mode",
"navbar-mode-checkbox",
"toast-container",
"toast-copied-code-message",
"toast-message-email-4"
"toast-copied-code-message"
]
}
}

View File

@@ -9,10 +9,18 @@
}}
{{ if eq .Type "alert" }}
<blockquote class="blockquote-alert blockquote-alert-{{ .AlertType }}">
{{ $alert := .AlertType }}
{{ $icon := (index $icons $alert) }}
<blockquote class="blockquote-alert blockquote-alert-{{ $alert }}">
<p class="blockquote-alert-heading">
{{ partial "assets/icon.html" (dict "icon" (printf "%s fa-fw" (index $icons .AlertType))) }}
{{ or (i18n .AlertType) (title .AlertType) }}
{{ with $icon }}
{{ partial "assets/icon.html" (dict "icon" (printf "%s fa-fw" .)) }}
{{ or (i18n $alert) (title $alert) }}
{{ else }}
{{ title $alert }}
{{ warnf "Unsupported alert type: '%s'. See %s" $alert $.Position }}
{{ end }}
</p>
{{ trim .Text "\n\r" | safeHTML }}
</blockquote>

View File

@@ -1,5 +1,12 @@
{{ if site.Params.navigation.anchor }}
<h{{ .Level }} id="{{ .Anchor | safeURL }}" class="heading">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}" aria-labelledby="{{ .Anchor | safeURL }}">{{- partial "assets/icon.html" (dict "icon" "fas link anchor") }}</a></h{{ .Level }}>
{{ $text := trim .Text " \n\r" }}
{{ if and site.Params.navigation.anchor $text }}
<h{{ .Level }} id="{{ .Anchor | safeURL }}" class="heading">
{{- .Text | safeHTML -}}
<a href="#{{ .Anchor | safeURL }}" aria-labelledby="{{ .Anchor | safeURL }}">
{{- partial "assets/icon.html" (dict "icon" "fas link anchor") }}
</a>
</h{{ .Level }}>
{{ else }}
<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }}</h{{ .Level }}>
{{ end }}

View File

@@ -0,0 +1,40 @@
{{/* Adapted from https://gohugo.io/render-hooks/tables/ */}}
<!-- Ensure presence of `.table` class attribute to trigger Bootstrap styling -->
{{ $attr := .Attributes }}
{{ $class := split $attr.class " " }}
{{ if not (in $class "table") }}
{{ $attr = merge $attr (dict "class" (trim (delimit ($class | append "table") " ") " ")) }}
{{ end }}
{{ $align := dict "left" "start" "center" "center" "right" "end" }}
<table
{{- range $k, $v := $attr }}
{{- if $v }}
{{- printf " %s=%q" $k $v | safeHTMLAttr }}
{{- end }}
{{- end }}>
<thead>
{{- range .THead }}
<tr>
{{- range . }}
<th {{ with .Alignment }}class="text-{{ index $align . }}"{{ end }}>
{{- .Text -}}
</th>
{{- end }}
</tr>
{{- end }}
</thead>
<tbody>
{{- range .TBody }}
<tr>
{{- range . }}
<td {{ with .Alignment }}class="text-{{ index $align . }}"{{ end }}>
{{- .Text -}}
</td>
{{- end }}
</tr>
{{- end }}
</tbody>
</table>

View File

@@ -14,7 +14,7 @@
{{- end -}}
{{- /* Initialize module configuration */ -}}
{{- $modules := partial "utilities/InitModules.html" (dict "page" .) -}}
{{- $modules := partialCached "utilities/InitModules.html" . -}}
{{- $.Scratch.Set "modules" $modules -}}
{{- $fullCover := or (or (and .IsHome .Site.Params.home.fullCover) .Page.Params.fullCover) .Site.Params.main.footerBelowFold }}
@@ -27,7 +27,7 @@
{{- $.Scratch.Set "sections" $sections -}}
{{- /* Define main breakpoint */ -}}
{{- $.Scratch.Set "breakpoint" (partial "utilities/GetBreakpoint.html") }}
{{- $.Scratch.Set "breakpoint" (partialCached "utilities/GetBreakpoint.html" .) }}
{{- /* Define base URL */ -}}
{{ $lang := site.LanguageCode | default site.Language.Lang }}
@@ -36,7 +36,8 @@
<!doctype html>
<html lang="{{ .Site.Language.Lang }}" class="no-js">
<head>
{{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "header" true "page" .) -}}
{{- partial "footer/scripts.html" (dict "page" . "type" "critical") -}}
{{- partial "footer/scripts.html" (dict "page" . "type" "functional") -}}
{{ block "head" . }}{{ end -}}
</head>
@@ -74,7 +75,7 @@
{{- partial "footer/toast-container.html" . -}}
{{- partial "assets/symbols.html" . -}}
{{- partialCached "footer/scripts.html" (dict "header" false "page" . "core" true) }}
{{- partial "footer/optional-scripts.html" . -}}
{{- partialCached "footer/scripts.html" (dict "page" .) -}}
{{- partial "footer/scripts.html" (dict "page" . "type" "optional") -}}
</body>
</html>

View File

@@ -8,7 +8,8 @@
<meta charset="utf-8">
<noscript><meta http-equiv="refresh" content="0; url={{ .Permalink }}"></noscript>
{{ if site.Params.main.enableLanguageSelectionStorage }}
{{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "header" true "page" page) -}}
{{- partial "footer/scripts.html" (dict "page" page "type" "critical") -}}
{{- partial "footer/scripts.html" (dict "page" page "type" "functional") -}}
{{ else }}
<script src='{{ partial "utilities/GetStaticURL" (dict "url" "js/alias.js") }}'></script>
{{ end }}

View File

@@ -39,13 +39,22 @@
{{ $element := "" }}
<!-- Split path between upload dir and sub dir -->
{{ $newdir := urls.JoinPath (index (split $dir "upload") 0) "upload" }}
{{ $file = urls.JoinPath (index (split $dir "upload") 1) $file }}
{{ $dir = $newdir }}
{{ $dir = path.Clean (trim .dir "/") }}
{{ $api := "image/upload" }}
<!-- Define the account, optional API segment, and directory -->
{{ $elements := split $dir "/" }}
{{ $account := index $elements 0 }}
{{ $operation := "" }}
{{ if and (in (slice "image" "video") (index $elements 1)) (eq (index $elements 2) "upload") }}
{{ $api = delimit (slice | append (index $elements 1) | append (index $elements 2)) "/" }}
{{ $dir = delimit (after 3 $elements) "/" }}
{{ else }}
{{ $dir = delimit (after 1 $elements) "/" }}
{{ end }}
<!-- Generate image URL -->
{{ if not $error }}
{{ $operation := "" }}
{{ if $format }}
{{ $operation = printf "%s,h_%d,w_%d" $transform $height $width }}
{{ $file = printf "%s.%s" (strings.TrimSuffix (path.Ext $file) $file) $format }}
@@ -55,7 +64,7 @@
{{ with $anchor }}
{{ $operation = printf "%s,g_%s" $operation . }}
{{ end }}
{{- $element = urls.JoinPath (slice "https://" $host $dir $operation $file) -}}
{{- $element = partial "utilities/URLJoin.html" (dict "elements" (slice "https://" $host $account $api $operation $dir $file)) -}}
{{ end }}
{{ return $element }}

View File

@@ -23,9 +23,9 @@
{{ $anchor := .anchor | default "" }}
{{ $element := "" }}
{{ $absoluteURL := .absoluteURL }}
{{ $url := urls.JoinPath $dir $file }}
{{ $url := partial "utilities/URLJoin.html" (dict "elements" (slice $dir $file)) }}
{{ if $host }}
{{ $url = urls.JoinPath "https://" $host $url }}
{{ $url = partial "utilities/URLJoin.html" (dict "elements" (slice "https://" $host $url)) }}
{{ end }}
<!-- Initialize image if needed, do not raise additional warnings -->

View File

@@ -22,9 +22,9 @@
{{ with $container }}{{ $dir = strings.TrimPrefix (printf "/%s" .) $dir }}{{ end }}
{{ if ne $host "ik.imagekit.io" }}
{{ $element = urls.JoinPath (slice "https://ik.imagekit.io" $account $dir $file) }}
{{ $element = partial "utilities/URLJoin.html" (dict "elements" (slice "https://ik.imagekit.io" $account $dir $file)) }}
{{ else }}
{{ $element = urls.JoinPath (slice "https://" $host $dir $file) }}
{{ $element = partial "utilities/URLJoin.html" (dict "elements" (slice "https://" $host $dir $file)) }}
{{ end }}
{{ return $element }}

View File

@@ -46,7 +46,7 @@
<!-- Split path between end point and image path -->
{{ $newdir := printf "/%s" (index (split $dir "/") 1) }}
{{ $file = urls.JoinPath (strings.TrimPrefix $newdir $dir) $file }}
{{ $file = partial "utilities/URLJoin.html" (dict "elements" (slice (strings.TrimPrefix $newdir $dir) $file)) }}
{{ $dir = $newdir }}
<!-- Generate image URL -->
@@ -60,7 +60,7 @@
{{ with $anchor }}
{{ $operation = printf "%s,fo-%s" $operation . }}
{{ end }}
{{- $element = urls.JoinPath (slice "https://" $host $dir $operation $file) -}}
{{- $element = partial "utilities/URLJoin.html" (dict "elements" (slice "https://" $host $dir $operation $file)) -}}
{{ end }}
{{ return $element }}

View File

@@ -55,7 +55,7 @@
{{ with $anchor }}
{{ $operation = printf "%s&crop=%s" $operation . }}
{{ end }}
{{- $element = printf "%s?%s" (urls.JoinPath (slice "https://" $host $dir $file)) $operation -}}
{{- $element = printf "%s?%s" (partial "utilities/URLJoin.html" (dict "elements" (slice "https://" $host $dir $file))) $operation -}}
{{ end }}
{{ return $element }}

View File

@@ -64,7 +64,7 @@
{{- if $isExternal -}}
{{- if $tab -}}
{{- $target = "_blank" -}}
{{- $rel = "noopener noreferrer" -}}
{{- $rel = "noopener noreferrer nofollow" -}}
{{- end -}}
{{- if and $title $cue -}}

View File

@@ -4,73 +4,75 @@
Visit gethinode.com/license for more details.
-->
<!-- Validate arguments -->
{{ if partial "utilities/IsInvalidArgs.html" (dict "structure" "card-group" "child" "card" "args" .) }}
{{- errorf "partial [assets/card-group.html] - Invalid arguments" -}}
{{ end }}
<!-- Initialize arguments and default values -->
{{- $page := .page -}}
{{- $breakpoint := partial "utilities/GetBreakpoint.html" -}}
{{ $pages := .list }}
{{ $cards := .cards }}
{{- $paginate := .paginate | default false -}}
{{- $moreURL := .href -}}
{{- $moreTitle := .hrefTitle -}}
{{- $gutter := .gutter | default 4 -}}
{{- $separator := .separator | default false -}}
{{- $class := .class -}}
{{- $color := .color -}}
{{- $padding := .padding -}}
{{- $header := .header -}}
{{- $body := .body -}}
{{- $footer := .footer -}}
{{- $orientation := .orientation -}}
{{- $ratio := .ratio -}}
{{- $portrait := .portrait | default false -}}
{{- $wrapper := .wrapper | default "p-0" -}}
{{- $style := .style -}}
{{- $align := .align -}}
{{- $subtle := .subtle }}
{{- $loading := .loading -}}
{{- $button := .button -}}
{{- $buttonLabel := .buttonLabel -}}
{{- $buttonType := .buttonType -}}
{{- $iconRounded := .iconRounded }}
{{- $scroll := .scroll | default false }}
{{- $spacer := .spacer | default false }}
{{- $hook := .hook | default "assets/card.html" }}
{{- $cols := string .cols | default "3" -}}
<!-- Override arguments -->
{{ $isPages := in (slice "page.Pages" "resource.Resources") (printf "%T" $pages) }}
{{ $paginator := "" }}
{{ if and $isPages $paginate }}
{{ with .pagination }}
{{ $paginator = $page.Paginate $pages . }}
{{ else }}
{{ $paginator = $page.Paginate $pages }}
<!-- Define inline partials -->
{{ define "partials/assets/style.html" }}
{{ $style := "" }}
{{ if gt (len .styles) 0 }}
{{ $def := index .styles (mod .index (len .styles)) }}
{{ $style = index $def .key }}
{{ end }}
{{ $pages = first $paginator.PageSize (after (mul (sub $paginator.PageNumber 1) $paginator.PageSize) $pages) }}
{{ return ($style | default .default ) }}
{{ end }}
<!-- Initialize arguments -->
{{ $args := partial "utilities/InitArgs.html" (dict "structure" "card-group" "child" "card" "args" .) }}
{{ if $args.err }}
{{ partial "utilities/LogErr.html" (dict
"partial" "assets/card-group.html"
"msg" "Invalid arguments"
"details" $args.errmsg
"file" page.File
)}}
{{ end }}
<!-- Initialize local variables -->
{{ $list := $args.list }}
{{- $class := $args.class -}}
{{- $orientation := $args.orientation -}}
{{ $cardWrapper := "" }}
{{ if $scroll }}
{{ $cardWrapper = printf "card-block card-block-%d" (int $cols) }}
{{- $breakpoint := partial "utilities/GetBreakpoint.html" -}}
{{ $colsMap := dict
"auto" ""
"1" "row-cols-1"
"2" (printf "row-cols-1 row-cols-%s-1 row-cols-%s-2" $breakpoint.prev $breakpoint.current)
"3" (printf "row-cols-1 row-cols-%s-2 row-cols-%s-3" $breakpoint.prev $breakpoint.current)
"4" (printf "row-cols-1 row-cols-%s-2 row-cols-%s-4" $breakpoint.prev $breakpoint.current)
"5" (printf "row-cols-1 row-cols-%s-3 row-cols-%s-5" $breakpoint.prev $breakpoint.current)
}}
{{ $sizesMap := dict
"auto" "100vw"
"1" "100vw"
"2" (printf "(min-width: %s) 50vw, 100vw" $breakpoint.currentSize)
"3" (printf "(min-width: %s) 33.3vw, (min-width: %s) 50vw, 100vw" $breakpoint.currentSize $breakpoint.prevSize)
"4" (printf "(min-width: %s) 25vw, (min-width: %s) 50vw, 100vw" $breakpoint.currentSize $breakpoint.prevSize)
"5" (printf "(min-width: %s) 20vw, (min-width: %s) 33.3vw, 100vw" $breakpoint.currentSize $breakpoint.prevSize)
}}
<!-- Apply optional pagination -->
{{ $isPages := in (slice "page.Pages" "resource.Resources") (printf "%T" $list) }}
{{ $paginator := "" }}
{{ if and $isPages $args.paginate }}
{{ with $args.pagination }}
{{ $paginator = $args.page.Paginate $list . }}
{{ else }}
{{ $paginator = $args.page.Paginate $list }}
{{ end }}
{{ $list = first $paginator.PagerSize (after (mul (sub $paginator.PageNumber 1) $paginator.PagerSize) $list) }}
{{ end }}
{{ if not $spacer }}{{ $class = printf "%s h-100" $class }}{{ end }}
{{ $list := slice }}
<!-- Initialize list elements -->
{{ $elements := slice }}
{{ if $isPages }}
{{ range $index, $element := $pages }}
{{ range $index, $element := $list }}
{{ $params := dict }}
<!-- regular page -->
{{- if and $element.RelPermalink $element.File -}}
{{- $params = merge $params (dict "path" $element.File.Path) -}}
<!-- headless page -->
{{- else -}}
{{- $thumbnail := (or (and (reflect.IsMap $element.Params.Thumbnail) $element.Params.Thumbnail.url) $element.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $element.Params.Thumbnail }}{{ $thumbnail = $element.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $element.Params.Thumbnail }}{{ end }}
{{- $anchor := (or (and (reflect.IsMap $element.Params.Thumbnail) $element.Params.Thumbnail.anchor) "") -}}
{{- $params = merge $params (dict
"title" $element.Title
@@ -82,102 +84,95 @@
) -}}
{{- end -}}
{{- $list = $list | append $params }}
{{- $elements = $elements | append $params }}
{{ end }}
{{ else if $pages }}
{{ $list = $list | append $pages }}
{{ else if $list }}
{{ $elements = $elements | append $list }}
{{ end }}
{{- $count := len $list -}}
<!-- Limit list to max elements -->
{{- $count := len $elements -}}
{{- $max := $count -}}
{{- $max = math.Min (.max | default $count) $count -}}
{{- $responsive := .responsive | default true -}}
{{- $sizes := "100vw" }}
{{- $colGrid := "" -}}
{{ if not $scroll }}
{{ $colGrid = printf "row-cols-%s" $cols }}
{{- if eq $cols "1" }}
{{ $colGrid = "row-cols-1" -}}
{{- else if eq $cols "2" }}
{{ if $responsive }}
{{ $colGrid = printf "row-cols-1 row-cols-%s-1 row-cols-%s-2" $breakpoint.prev $breakpoint.current }}
{{ end -}}
{{ $sizes = printf "(min-width: %s) 50vw, 100vw" $breakpoint.currentSize }}
{{- else if eq $cols "3" }}
{{ if $responsive }}
{{ $colGrid = printf "row-cols-1 row-cols-%s-2 row-cols-%s-3" $breakpoint.prev $breakpoint.current }}
{{ end -}}
{{ $sizes = printf "(min-width: %s) 33.3vw, (min-width: %s) 50vw, 100vw" $breakpoint.currentSize $breakpoint.prevSize }}
{{- else if eq $cols "4" }}
{{ if $responsive }}
{{ $colGrid = printf "row-cols-1 row-cols-%s-2 row-cols-%s-4" $breakpoint.prev $breakpoint.current }}
{{ end -}}
{{ $sizes = printf "(min-width: %s) 25vw, (min-width: %s) 50vw, 100vw" $breakpoint.currentSize $breakpoint.prevSize }}
{{- else if eq $cols "5" }}
{{ if $responsive }}
{{ $colGrid = printf "row-cols-1 row-cols-%s-3 row-cols-%s-5" $breakpoint.prev $breakpoint.current }}
{{ end -}}
{{ $sizes = printf "(min-width: %s) 20vw, (min-width: %s) 33.3vw, 100vw" $breakpoint.currentSize $breakpoint.prevSize }}
{{ end -}}
{{ else }}
{{ if in (slice "2" "3" "4" "5") $cols }}
{{ $sizes = replace (printf "%.1fvw" (div 100.0 (int $cols))) ".0" "" }}
{{ end }}
{{ end }}
{{- if not $paginate -}}
{{- $list = first $max $list -}}
{{- $max = math.Min ($args.max | default $count) $count -}}
{{- if not $args.paginate -}}
{{- $elements = first $max $elements -}}
{{- end -}}
{{- if and (eq $cols "1") (eq $orientation "horizontal") }}{{ $orientation = "horizontal-sm" }}{{ end -}}
{{/* Initialize grid and layout */}}
{{- $sizes := "100vw" }}
{{- $colGrid := "" -}}
{{ if not $args.scroll }}
{{ $colGrid = index $colsMap $args.cols }}
{{ if $args.responsive }}{{ $sizes = index $sizesMap $args.cols }}{{ end }}
{{ else }}
{{ if in (slice "2" "3" "4" "5") $args.cols }}
{{ $sizes = replace (printf "%.1fvw" (div 100.0 (int $args.cols))) ".0" "" }}
{{ end }}
{{ end }}
{{- if and (eq $args.cols "1") (eq $orientation "horizontal") }}{{ $orientation = "horizontal-sm" }}{{ end -}}
{{ if not $args.spacer }}
{{ $class = printf "%s h-100" $class }}
{{ end }}
<!-- Main code -->
<div class="container-fluid {{ $wrapper }} {{ if $scroll }}card-container-wrapper{{ end }}">
<div class="row g-{{ $gutter }} {{ if $scroll }}d-flex flex-row flex-nowrap card-container scrollbar-horizontal pb-4 w-100 {{ end }} {{ $colGrid }}">
{{ range $index, $element := $list }}
{{- $params := (dict
"class" (printf " %s" $class)
"color" $color
"footer" $footer
"body" $body
"header" $header
"loading" $loading
"sizes" $sizes
"orientation" $orientation
"padding" $padding
"ratio" $ratio
"portrait" $portrait
"subtle" $subtle
"style" $style
"align" $align
"button" $button
"buttonLabel" $buttonLabel
"buttonType" $buttonType
"iconRounded" $iconRounded
) -}}
{{- $params = merge $element $params }}
<div class="{{ $args.wrapper }}">
<div class="container-fluid {{ if $args.scroll }}card-container-wrapper{{ end }} p-0">
<div class="row g-{{ $args.gutter }} {{ if $args.scroll }}d-flex flex-row flex-nowrap card-container scrollbar-horizontal pb-4 w-100 {{ end }}
{{ if $args.bento }}{{ with $args.valign }}align-items-{{ . }}{{ end }}{{ else }}{{ $colGrid }}{{ end }}">
{{ range $index, $element := $elements }}
{{- $params := (dict
"class" (printf " %s" $class)
"color" $args.color
"footer" $args.footer
"body" $args.body
"header" $args.header
"loading" $args.loading
"sizes" $sizes
"orientation" (partial "assets/style.html" (dict "styles" $args.styles "index" $index "key" "orientation" "default" $orientation))
"padding" $args.padding
"ratio" (partial "assets/style.html" (dict "styles" $args.styles "index" $index "key" "ratio" "default" $args.ratio))
"portrait" (partial "assets/style.html" (dict "styles" $args.styles "index" $index "key" "portrait" "default" $args.portrait))
"subtle" $args.subtle
"style" $args.style
"align" $args.align
"button" $args.button
"buttonLabel" $args.buttonLabel
"buttonType" $args.buttonType
"iconRounded" $args.iconRounded
) -}}
{{- $params = merge $element $params }}
<div class="{{ with $cardWrapper }}{{ . }}{{ else }}col{{ end }}">
{{ if $spacer }}<div class="spacer"></div>{{ end }}
{{- partial $hook $params -}}
</div>
{{- if and (lt $index (sub $max 1)) $separator -}}
<div class="col d-block d-sm-none">
<hr>
{{ if $args.scroll }}
{{ $width := (partial "assets/style.html" (dict "styles" $args.styles "index" $index "key" "width" "default" "3")) }}
{{ $size := $args.cols }}
{{ if and (gt $args.cols 1) (eq $width "6") }}{{ $size = sub (int $args.cols) 1 }}{{ end }}
{{ $cardWrapper = printf "card-block card-block-%d" (int $size) }}
{{ end }}
<!--add col-$width -->
<div class="{{ with $cardWrapper }}{{ . }}{{ else }}col{{ end }}">
{{ if $args.spacer }}<div class="spacer"></div>{{ end }}
{{- partial $args.hook $params -}}
</div>
{{- if and (lt $index (sub $max 1)) $args.separator -}}
<div class="col d-block d-sm-none">
<hr>
</div>
{{- end -}}
{{- end -}}
{{- end -}}
{{ if $cards }}{{- print $cards | safeHTML }}{{ end }}
{{ if $args.cards }}{{- print $args.cards | safeHTML }}{{ end }}
</div>
</div>
{{ if $paginator }}
{{- if gt $paginator.TotalPages 1 -}}
<div class="pt-3">{{ partial "assets/pagination.html" (dict "page" $page "format" "terse") }}</div>
<div class="pt-3">{{ partial "assets/pagination.html" (dict "page" $args.page "format" "terse") }}</div>
{{- end -}}
{{ else }}
{{ if and (gt $count $max) $moreTitle }}
<a class="btn btn-outline-primary mt-4" href="{{ $moreURL| safeURL }}" role="button">{{ $moreTitle }}</a>
{{ if and (gt $count $max) $args.hrefTitle }}
<a class="btn btn-outline-primary mt-4" href="{{ $args.href| safeURL }}" role="button">{{ $args.hrefTitle }}</a>
{{ end }}
{{ end }}
</div>

View File

@@ -64,7 +64,9 @@
{{- if not $title }}{{ $title = .Title }}{{ end -}}
{{- if not $href }}{{ $href = .RelPermalink }}{{ end -}}
{{- if not $description }}{{ $description = partial "utilities/GetDescription.html" (dict "page" .) }}{{ end -}}
{{- if and (not $thumbnail) (not $icon) }}{{ $thumbnail = (or (and (reflect.IsMap .Params.Thumbnail) .Params.Thumbnail.url) .Params.Thumbnail) }}{{ end -}}
{{- if and (not $thumbnail) (not $icon) }}
{{ if reflect.IsMap .Params.Thumbnail }}{{ $thumbnail = .Params.Thumbnail.url }}{{ else }}{{ $thumbnail = .Params.Thumbnail }}{{ end }}
{{ end -}}
{{ if not $ratio }}
{{- if and (reflect.IsMap .Params.Thumbnail) .Params.Thumbnail.ratio }}{{ $ratio = .Params.Thumbnail.ratio }}{{ end -}}
{{ end }}
@@ -80,7 +82,8 @@
{{ end }}
{{- if eq $orientation "none" }}{{ $thumbnail = "" }}{{ $icon = "" }}{{ end -}}
{{- if eq $body "none" }}{{ $description = "" }}{{ end -}}
{{- if eq $body "title" }}{{ $description = "" }}{{ end -}}
{{- if eq $body "none" }}{{ $title = "" }}{{ $description = "" }}{{ end -}}
<!-- Inline partial to render the card's body -->
{{- define "partials/card-body.html" -}}
@@ -216,6 +219,7 @@
</div>
{{- else -}}
<!-- Render stacked / default card -->
{{ $overlay := eq $orientation "overlay" }}
<div class="card {{ $colorStyle }} {{ $class }} text-{{ $align }}">
{{- if $thumbnail -}}
{{- partial $hook (dict "url" $thumbnail "ratio" (or $ratio "16x9") "portrait" $portrait "anchor" $anchor "sizes" $sizes "wrapper" "card-img-wrap" "class" "card-img-top card-img-bg" "title" (or $alt $title) "loading" $loading) -}}
@@ -229,7 +233,8 @@
{{ end }}
</div>
{{- end -}}
<div class="card-body d-flex flex-column p-{{ $padding }}">
<div class="card-body d-flex flex-column p-{{ $padding }} {{ if $overlay }}card-img-overlay card-overlay-gradient p-4{{ end }}" {{ if $overlay }}data-bs-theme="dark"{{ end }}>
{{ if $overlay }}<div class="flex-grow-1"></div>{{ end }}
{{ if $page }}{{- partial "card-caption.html" (dict "page" $page "keywords" $header "color" $color) -}}{{ end }}
{{- partial "card-body.html" (dict "title" $title "href" $href "color" $color "description" $description) -}}
{{ if $page }}{{- partial "card-caption.html" (dict "page" $page "keywords" $footer "color" $color) -}}{{ end }}

View File

@@ -38,7 +38,7 @@
{{- if $tab -}}
{{- $target = "_blank" -}}
{{- $rel = "noopener noreferrer" -}}
{{- $rel = "noopener noreferrer nofollow" -}}
{{- end -}}
{{- if $cue -}}
@@ -67,9 +67,9 @@
{{- errorf "partial [assets/link.html] - Cannot find page or asset: '%s' at '%s'" $destination $page.File.Path -}}
{{- $error = true -}}
{{ else if $isPageRes }}
{{ $destination = urls.JoinPath "/" (strings.TrimPrefix "/content" $pageContext) $destination }}
{{ $destination = partial "utilities/URLJoin.html" (dict "elements" (slice "/" (strings.TrimPrefix "/content" $pageContext) $destination)) }}
{{ else if $isStatic }}
{{ $destination = urls.JoinPath "/" $destination }}
{{ $destination = partial "utilities/URLJoin.html" (dict "base" "/" "path" $destination) }}
{{ end }}
{{- with $anchor }}{{ $destination = printf "%s#%s" (strings.TrimSuffix "/" $destination) . -}}{{ end -}}
{{ end }}

View File

@@ -47,7 +47,8 @@
<div class="d-none d-md-block p-0">
{{- range $index, $item := $list -}}
{{- $odd := eq (mod $index 2) 1 -}}
{{- $thumbnail := (or (and (reflect.IsMap $item.Params.Thumbnail) $item.Params.Thumbnail.url) $item.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $item.Params.Thumbnail }}{{ $thumbnail = $item.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $item.Params.Thumbnail }}{{ end }}
<div class="container ratio-section d-flex flex-column">
<div class="row pt-5 pb-5 align-items-center flex-fill row-cols-2">
<div class="col-6{{ if $odd }} order-last{{ end }}">
@@ -69,7 +70,8 @@
<div class="d-md-none">
{{- range $index, $item := $list -}}
{{- $odd := eq (mod $index 2) 1 -}}
{{- $thumbnail := (or (and (reflect.IsMap $item.Params.Thumbnail) $item.Params.Thumbnail.url) $item.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $item.Params.Thumbnail }}{{ $thumbnail = $item.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $item.Params.Thumbnail }}{{ end }}
<div class="container d-flex flex-column">
<div class="row pt-5 pb-5 align-items-center flex-fill row-cols-2">
<div class="col-12 text-center">

View File

@@ -66,7 +66,8 @@
{{ $header := $item.Title }}
{{ $body := $item.Content }}
{{ $show := eq $index 0}}
{{- $thumbnail := (or (and (reflect.IsMap $item.Params.Thumbnail) $item.Params.Thumbnail.url) $item.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $item.Params.Thumbnail }}{{ $thumbnail = $item.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $item.Params.Thumbnail }}{{ end }}
<div class="tab-pane{{ if $show }} active{{ end }}" id="nav-{{ $id }}-{{ $index }}" role="tabpanel" aria-labelledby="{{ $id }}-btn-{{ $index }}" tabindex="0">
{{- if eq $pane "persona" -}}
{{- partial "assets/persona.html" (dict

View File

@@ -25,7 +25,7 @@
{{ if or (strings.HasPrefix $menu.PageRef "http") (strings.HasPrefix $menu.URL "http") }}
{{ $menuURL = or $menu.PageRef $menu.URL }}
{{ else if (or $menu.PageRef $menu.URL) }}
{{- $menuURL = urls.JoinPath $baseURL ((or $menu.PageRef $menu.URL) | relLangURL) -}}
{{- $menuURL = partial "utilities/URLJoin.html" (dict "base" $baseURL "path" ((or $menu.PageRef $menu.URL) | relLangURL)) -}}
{{ end }}
{{- $pageURL := $page.RelPermalink -}}
{{- $isActive := or (and (hasPrefix $pageURL $menuURL) (ne $menuURL ("/" | relLangURL))) (eq $pageURL $menuURL) -}}
@@ -42,7 +42,7 @@
{{- if $isExternal }}
{{- if $tab -}}
{{ $externalHref = "target=\"_blank\" rel=\"noopener noreferrer\"" }}
{{ $externalHref = "target=\"_blank\" rel=\"noopener noreferrer nofollow\"" }}
{{- end -}}
{{- if $cue -}}

View File

@@ -51,7 +51,7 @@
{{- end -}}
{{ if $item.url }}
<li>
{{- $url := (urls.JoinPath $baseURL $item.url) | relLangURL -}}
{{- $url := partial "utilities/URLJoin.html" (dict "base" $baseURL "path" $item.url) | relLangURL -}}
<a class="pe-5 dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}{{ if $active }} active{{ end }}{{ if $disabled }} disabled{{ end }}" href="{{ $url }}">{{ $item.label }}
{{ if $item.latest }}&nbsp;({{ T "latest" }}){{ end }}
{{ if $active }}
@@ -67,7 +67,7 @@
{{- if site.Params.docs.overview -}}
{{ if gt (len $list) 0 }}<li><hr class="dropdown-divider"></li>{{ end }}
<li>
{{- $url := (urls.JoinPath $baseURL site.Params.docs.overview) | relLangURL -}}
{{- $url := partial "utilities/URLJoin.html" (dict "base" $baseURL "path" site.Params.docs.overview) | relLangURL -}}
<a class="dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}" href="{{ $url }}">{{ T "allVersions" }}</a>
</li>
{{- end -}}
@@ -142,9 +142,9 @@
{{- end -}}
{{- end -}}
{{ if $logo }}{{ $logo = urls.JoinPath $baseURL $logo }}{{ end }}
{{ if $logoLight }}{{ $logoLight = urls.JoinPath $baseURL $logoLight }}{{ end }}
{{ if $logoDark }}{{ $logoDark = urls.JoinPath $baseURL $logoDark }}{{ end }}
{{ if $logo }}{{ $logo = partial "utilities/URLJoin.html" (dict "base" $baseURL "path" $logo) }}{{ end }}
{{ if $logoLight }}{{ $logoLight = partial "utilities/URLJoin.html" (dict "base" $baseURL "path" $logoLight) }}{{ end }}
{{ if $logoDark }}{{ $logoDark = partial "utilities/URLJoin.html" (dict "base" $baseURL "path" $logoDark) }}{{ end }}
{{- $title := site.Title -}}
{{- if .title -}}
@@ -276,7 +276,7 @@
{{- end -}}
{{- else -}}
{{- range site.Languages -}}
<li><a class="dropdown-item" href="{{ urls.JoinPath $baseURL .Lang }}" hreflang="{{.Lang}}">{{ default .Lang .LanguageName }}</a></li>
<li><a class="dropdown-item" href="{{ partial "utilities/URLJoin.html" (dict "base" $baseURL "path" .Lang) }}" hreflang="{{.Lang}}">{{ default .Lang .LanguageName }}</a></li>
{{- end -}}
{{- end -}}
</ul>

View File

@@ -32,7 +32,9 @@
{{- if not $title }}{{ $title = .Title }}{{ end -}}
{{- if not $href }}{{ $href = .RelPermalink }}{{ end -}}
{{- if not $content }}{{ $content = .Content }}{{ end -}}
{{- if not $thumbnail }}{{ $thumbnail = (or (and (reflect.IsMap .Params.Thumbnail) .Params.Thumbnail.url) .Params.Thumbnail) }}{{ end -}}
{{- if not $thumbnail }}
{{ if reflect.IsMap .Params.Thumbnail }}{{ $thumbnail = .Params.Thumbnail.url }}{{ else }}{{ $thumbnail = .Params.Thumbnail }}{{ end }}
{{ end -}}
{{- end -}}
{{- $class := .class -}}
@@ -43,7 +45,7 @@
{{- $rel := "" -}}
{{- if and $isExternal $tab -}}
{{- $target = "_blank" -}}
{{- $rel = "noopener noreferrer" -}}
{{- $rel = "noopener noreferrer nofollow" -}}
{{- end -}}
<!-- Inline partial to render the card's body -->

View File

@@ -143,7 +143,7 @@
<div class="container-fluid {{ with $background }} bg-{{ . }}{{ end }} p-0">
<div class="container-xxl {{ $wrapper }}">
{{- partial "assets/section-header.html" (dict "title" $title "description" $description "content" $content) -}}
{{- partial "assets/section-header.html" (dict "title" $title "description" $description "content" $content) -}}
{{ if eq $layout "card" }}
{{- $partial = "assets/card-group.html" -}}
{{- $params = merge $params (dict

View File

@@ -26,7 +26,7 @@
{{- $group := .group -}}
{{- $data := .menu -}}
{{- $doc_slug := urls.JoinPath $baseURL ($group.title | urlize) -}}
{{- $doc_slug := partial "utilities/URLJoin.html" (dict "base" $baseURL "path" ($group.title | urlize)) -}}
{{- $href := or $group.link $doc_slug -}}
{{- $collapsed := strings.HasPrefix $page.RelPermalink $href -}}
@@ -78,10 +78,10 @@
{{ if hasPrefix . "http" }}
{{ $href = . }}
{{ else }}
{{- $href = urls.JoinPath $baseURL . -}}
{{- $href = partial "utilities/URLJoin.html" (dict "base" $baseURL "path" .) -}}
{{ end }}
{{ else }}
{{- $href = urls.JoinPath $baseURL ($title | urlize) -}}
{{- $href = partial "utilities/URLJoin.html" (dict "base" $baseURL "path" ($title | urlize)) -}}
{{ end }}
{{- $active := eq (strings.TrimSuffix "/" $page.RelPermalink) (strings.TrimSuffix "/" $href) -}}
@@ -122,7 +122,7 @@
{{- $sectionBreak := false -}}
{{- $level := 0 -}}
{{ $baseURL := $page.Scratch.Get "baseURL" | default "/" -}}
{{ $baseURL = urls.JoinPath "/" (strings.TrimPrefix $baseURL (urls.JoinPath $section $version | relLangURL)) }}
{{ $baseURL = partial "utilities/URLJoin.html" (dict "elements" (slice "/" (strings.TrimPrefix $baseURL (urls.JoinPath $section $version | relLangURL)))) }}
<ul class="list-unstyled ps-0">
{{- range $index, $item := $data -}}

View File

@@ -24,19 +24,17 @@
{{- $class := delimit $main " " -}}
{{ if or $sortable $paging $searchable }}{{ $class = trim (printf "%s data-table" $class) " " }}{{ end }}
{{- $input := $input | $page.RenderString }}
{{- $input = replace $input "style=\"text-align:left\"" "class=\"text-start\"" -}}
{{- $input = replace $input "style=\"text-align:center\"" "class=\"text-center\"" -}}
{{- $input = replace $input "style=\"text-align:right\"" "class=\"text-end\"" -}}
{{ $regex := `<table\s*class="(.+?)"` }}
{{ $current := (index (index (findRESubmatch $regex $input) 0) 1) }}
{{ $target := delimit (((split $current " ") | append "table" | append $class) | uniq) " " }}
{{ $attributes := "" }}
{{ if $sortable }}{{ $attributes = printf "%s data-table-sortable=true" $attributes }}{{ end }}
{{ if $paging }}{{ $attributes = printf "%s data-table-paging=true" $attributes }}{{ end }}
{{ if $searchable }}{{ $attributes = printf "%s data-table-searchable=true" $attributes }}{{ end }}
{{- $old := "<table>" -}}
{{- $new := printf "<table class=\"table %s\" %s>" $class (trim $attributes " ") -}}
{{ $input := replace $input $old $new -}}
{{- $new := printf `<table class="%s" %s` $target (trim $attributes " ") -}}
{{ $input := replaceRE $regex $new $input 1 -}}
{{- with $responsive }}<div class="{{ delimit . " " }}">{{ end -}}
{{ $input | safeHTML }}
{{- with $responsive }}</div>{{ end -}}

View File

@@ -58,12 +58,12 @@
{{ end }}
{{ $origin := $position }}
{{ if not $origin }}{{ with $page.File }}{{ $origin = .Path}}{{ end }}{{ end }}
{{ if not $origin }}{{ with $page.File }}{{ $origin = .Path }}{{ end }}{{ end }}
<!-- Main code -->
{{ if not $error -}}
{{ if eq $host "youtube" }}
{{- $host := cond $pc.PrivacyEnhanced "www.youtube-nocookie.com" "www.youtube.com" -}}
{{- $host := cond $pc.PrivacyEnhanced "www.youtube-nocookie.com" "www.youtube.com" -}}
{{ $url := printf "https://%s/embed/%s?origin=%s" $host $id $page.Site.BaseURL }}
{{ $api := printf "https://www.youtube.com/oembed?format=json&url=%s" (printf "https://www.youtube.com/watch?v=%s" $id) }}
{{ $padding := "56.25%" }}
@@ -95,7 +95,6 @@
{{ $padding := "56.25%" }}
{{- $dnt := cond $pc.EnableDNT 1 0 -}}
{{- $source := urls.JoinPath "https://vimeo.com" $id -}}
{{- $query := querify "url" $url "dnt" $dnt -}}
{{- $api := printf "https://vimeo.com/api/oembed.json?%s" $query -}}
{{- with resources.GetRemote $api -}}
@@ -123,10 +122,10 @@
{{ with $params }}{{ $url = print $url . }}{{ end }}
{{ $padding := "56.25%" }}
{{ $thumbnail := urls.JoinPath (path.Dir $id) (printf "%s.jpg" (path.BaseName $id)) }}
{{ $thumbnail := partial "utilities/URLJoin.html" (dict "base" (path.Dir $id) "path" (printf "%s.jpg" (path.BaseName $id))) }}
{{ $metadata := partial "assets/helpers/image-dimension.html" (dict
"page" $page
"url" (printf "https://res.cloudinary.com/%s/video/upload/%s" $account $thumbnail)
"url" (printf "https://res.cloudinary.com/%s/video/upload/%s" $account (path.Clean $thumbnail))
"ratio" $ratio
"imageset" false
) }}

View File

@@ -3,7 +3,8 @@
<small>
{{- $copyright := printf "%s © %s %s %s." (T "copyright") (dateFormat "2006" now) .Site.Title (T "rights") }}
{{ cond (gt (len .Site.Copyright) 0) .Site.Copyright $copyright }}
{{ .Site.Params.footer.license | safeHTML }}
{{ .Site.Params.footer.license | safeHTML }} |
<a class="cky-banner-element link-bg-footer">{{ T "cookieSettings" }}</a> |
{{ if .Site.Params.main.endorse }}
{{ $link := partial "assets/link.html" (dict "destination" (index site.Params.links "hinode") "text" "Hinode" "class" "link-bg-footer" "page" .Page) }}
{{ T "poweredBy" $link | safeHTML }}

View File

@@ -1,46 +0,0 @@
{{ $page_modules := slice }}
{{ if reflect.IsMap .Params.modules }}
{{ $page_modules = .Params.modules }}
{{ else }}
{{ $page_modules = $page_modules | append .Params.modules }}
{{ end }}
{{ with .Scratch.Get "dependencies" }}{{ $page_modules = append $page_modules . | uniq }}{{ end }}
{{ $config := page.Scratch.Get "modules" }}
{{ if not $config }}
{{ errorf "partial [footer/optional-scripts.html] - Cannot initialize module configuration" }}
{{ end }}
{{- $modules := $config.optional | intersect $page_modules -}}
{{- range $index, $mod := $modules -}}
{{- $filename := printf "js/%s.bundle.js" $mod -}}
{{- $match := printf "js/modules/%s/**.js" $mod -}}
{{- $skipTemplate := false -}}
{{- if reflect.IsSlice $config.disableTemplate -}}
{{- if in $config.disableTemplate $mod}}
{{- $skipTemplate = true -}}
{{- end -}}
{{- end -}}
{{ $state := "" }}
{{- with (index $config.modules $mod) -}}
{{- with index . "state" }}{{ $state = . }}{{ end -}}
{{- end -}}
{{ $localize := false }}
{{- if reflect.IsSlice $config.localize -}}
{{- if in $config.localize $mod}}
{{- $localize = true -}}
{{- end -}}
{{- end -}}
{{- partial "footer/scripts.html" (dict
"filename" $filename
"match" $match
"header" false
"skipTemplate" $skipTemplate
"state" $state
"localize" $localize
"page" page
) }}
{{- end -}}

View File

@@ -6,72 +6,170 @@
{{ $error := false }}
<!-- Validate arguments -->
{{ if partial "utilities/IsInvalidArgs.html" (dict "structure" "scripts" "args" . "group" "partial") }}
{{- errorf "partial [footer/scripts.html] - Invalid arguments" -}}
{{ $error = true }}
<!-- Define inline partials -->
{{ define "partials/match.html" }}
{{ $result := "" }}
{{ $matches := slice }}
{{ if gt (len .modules) 0 }}
{{ range .modules }}
{{ $matches = $matches | append (printf "js/modules/%s/**.js" .) }}
{{ end }}
{{ $result = printf "{%s}" (delimit $matches ",") }}
{{ end }}
{{ return $result }}
{{ end }}
{{ define "partials/bundle-script.html" }}
{{ $page := .page }}
{{ $match := .match }}
{{ $destination := .destination }}
{{ $cat := .cat }}
{{ $localize := .localize }}
{{ $modules := .modules }}
{{ $skipTemplate := .skipTemplate }}
{{ $absoluteURL := .absoluteURL }}
{{ $state := cond (ne .state "immediate") .state "" }}
{{ if and $cat (ne $cat "other") }}
{{ $destination = path.Join (path.Dir $destination) (printf "%s-%s%s" (path.BaseName $destination) $cat (path.Ext $destination)) }}
{{ end }}
{{ if $localize }}
{{ $destination = path.Join (path.Dir $destination) (printf "%s.%s%s" (path.BaseName $destination) $page.Language.Lang (path.Ext $destination)) }}
{{ end }}
{{- $bundle := partial "utilities/bundle.html" (dict
"match" $match
"filename" $destination
"modules" $modules
"basepath" "js/modules"
"all" true
"debugging" site.Params.debugging.showJS
) -}}
{{- $js := $bundle -}}
{{- if not $skipTemplate -}}
{{- $js = $bundle | resources.ExecuteAsTemplate $destination $page -}}
{{- end -}}
{{- if gt (len $js.Content) 0 -}}
{{ $integrity := "" }}
{{- if hugo.IsProduction -}}
{{ $js = $js | minify | fingerprint -}}
{{ $integrity = $js.Data.Integrity }}
{{ end -}}
{{ partial "templates/script.html" (dict "link" (cond $absoluteURL $js.Permalink $js.RelPermalink) "category" $cat "state" $state "integrity" $integrity) }}
{{ end -}}
{{ end }}
<!-- Initialize arguments -->
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $filename := .filename | default "js/main.bundle.js" -}}
{{- $match := .match | default "{js/*.js,js/vendor/**.js}" -}}
{{- $page := .page -}}
{{- $header := .header -}}
{{- $core := .core | default false -}}
{{- $skipTemplate := .skipTemplate | default false -}}
{{- $localize := .localize | default false }}
{{- $state := .state | default "async" -}}
{{- if or $header (eq $state "immediate") }}{{ $state = "" }}{{ end -}}
{{- $modules := "" -}}
{{ if $core }}
{{ $config := $page.Scratch.Get "modules" }}
{{ if not $config }}
{{ errorf "partial [footer/scripts.html] - Cannot initialize module configuration" }}
{{ end }}
{{- $modules = $config.core -}}
{{- if reflect.IsSlice $config.localize -}}
{{- range $index, $mod := $modules -}}
{{- if in $config.localize $mod}}
{{- $localize = true -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{ if $localize }}
{{ $filename = path.Join (path.Dir $filename) (printf "%s.%s%s" (path.BaseName $filename) $page.Language.Lang (path.Ext $filename)) }}
{{ $args := partial "utilities/InitArgs.html" (dict "structure" "scripts" "args" .) }}
{{ if $args.err }}
{{ partial "utilities/LogErr.html" (dict
"partial" "footer/scripts.html"
"msg" "Invalid arguments"
"details" $args.errmsg
"file" page.File
)}}
{{ end }}
<!-- Initialize local arguments -->
{{ $patterns := dict
"other" "js/critical/*.js"
"functional" "js/critical/functional/**.js"
"analytics" "js/critical/analytics/**.js"
"performance" "js/critical/performance/**.js"
"advertisement" "js/critical/advertisement/**.js"
"core" "{js/*.js,js/vendor/**.js}"
}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{ $state := "immediate" }}
{{ $config := $args.page.Scratch.Get "modules" }}
{{ $page_modules := slice }}
{{ if reflect.IsMap $args.page.Params.modules }}
{{ $page_modules = $args.page.Params.modules }}
{{ else }}
{{ $page_modules = $page_modules | append $args.page.Params.modules }}
{{ end }}
{{ with $args.page.Scratch.Get "dependencies" }}{{ $page_modules = append $page_modules . | uniq }}{{ end }}
{{- $categories := dict "other" slice -}}
{{ $modules := slice }}
{{ if eq $args.type "critical" }}
{{- $modules = $config.critical -}}
{{ $categories = merge $categories (dict "functional" slice "analytics" slice "performance" slice "advertisement" slice) }}
{{ else if eq $args.type "core" }}
{{- $modules = $config.core -}}
{{ else if eq $args.type "optional" }}
{{- $modules = $config.optional | intersect $page_modules -}}
{{ end }}
{{ range $cat, $val := $config.categories }}
{{ $categories = merge $categories (dict $cat (intersect $val $modules)) }}
{{ end }}
{{ $localize := false }}
{{ if gt (intersect (or $config.localize slice) $modules | len) 0 }}{{ $localize = true }}{{ end }}
{{ $skipTemplate := false }}
{{ if gt (intersect (or $config.skipTemplate slice) $modules | len) 0 }}{{ $skipTemplate = true }}{{ end }}
<!-- Main code -->
{{- $bundle := partial "utilities/bundle" (dict
"match" $match
"filename" $filename
"modules" $modules
"basepath" "js/modules"
"all" true
"debugging" site.Params.debugging.showJS
) -}}
{{- $js := $bundle -}}
{{- if not $skipTemplate -}}
{{- $js = $bundle | resources.ExecuteAsTemplate $filename $page -}}
{{- end -}}
{{ if not $error }}
<!-- include external scripts first -->
{{ range $mod, $cfg := $config.modules }}
{{ if eq (index $cfg "integration") $args.type }}
{{ if or (index $cfg "local") (not hugo.IsServer) }}
{{ with index $cfg "url" }}
{{ partial "templates/script.html" (dict "link" . "category" (index $cfg "category") "state" (index $cfg "state")) }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{- if and (not hugo.IsServer) $header -}}
{{- $pc := site.Config.Privacy.GoogleAnalytics -}}
{{- if and (not $pc.Disable) (hasPrefix site.Config.Services.GoogleAnalytics.ID "G-") }}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.Config.Services.GoogleAnalytics.ID }}"></script>
{{- end }}
{{- end -}}
<!-- Bundle the critical and core scripts by category -->
{{ if ne $args.type "optional" }}
{{ range $cat, $val := $categories }}
{{ if or (gt ($val | len) 0) (eq $args.type "critical") }}
{{ $match := "" }}
{{ if eq $args.type "critical" }}
{{ $match = index $patterns $cat }}
{{ else if eq $cat "other" }}
{{ $match = index $patterns $args.type }}
{{ end }}
{{- if gt (len $js.Content) 0 -}}
{{- if not hugo.IsProduction -}}
<script src="{{ if $absoluteURL }}{{ $js.Permalink }}{{ else }}{{ $js.RelPermalink }}{{ end }}"{{ with $state }} {{ . | safeHTMLAttr }}{{ end }}></script>
{{ else -}}
{{ $js = $js | minify | fingerprint -}}
<script src="{{ if $absoluteURL }}{{ $js.Permalink }}{{ else }}{{ $js.RelPermalink }}{{ end }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"{{ with $state}} {{ . | safeHTMLAttr }}{{ end }}></script>
{{ end -}}
{{ end -}}
{{ partial "partials/bundle-script.html" (dict
"page" $args.page
"match" $match
"destination" (printf "js/%s.bundle.js" $args.type)
"cat" $cat
"modules" $val
"localize" $localize
"skipTemplate" $skipTemplate
"absoluteURL" $absoluteURL
"state" (cond (eq $args.type "critical") "immediate" "async")
)}}
{{ end }}
{{ end }}
{{ else }}
<!-- Bundle the optional scripts by module name and category -->
{{ range $cat, $val := $categories }}
{{ range $val }}
{{ $modconfig := index $config.modules . }}
{{ partial "partials/bundle-script.html" (dict
"page" $args.page
"destination" (printf "js/%s.js" .)
"cat" $cat
"modules" (slice .)
"localize" $modconfig.localize
"skipTemplate" $modconfig.disabletemplate
"absoluteURL" $absoluteURL
"state" $modconfig.state
)}}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

View File

@@ -20,7 +20,7 @@
</div>
<div class="col col-6 text-sm-start">
{{ range .Site.Menus.social -}}
<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">
<a href="{{ .URL }}" {{ if $tab }} target="_blank" rel="noopener noreferrer nofollow"{{ end }} aria-label="{{ .Name | safeHTML }}" class="text-decoration-none link-secondary d-inline p-2">
{{ if hasPrefix .Pre "<i" }}
{{ .Pre | safeHTML }}
{{ else }}

View File

@@ -1,19 +1,25 @@
<!-- TODO: replace scratch with dict -->
<!-- Adapted from doks -->
{{ with .Title -}}
{{ with .Params.meta.title }}
{{ $.Scratch.Set "title" . -}}
{{ else -}}
{{ $.Scratch.Set "title" .Site.Title -}}
{{ end -}}
{{ else }}
{{ with .Title -}}
{{ $.Scratch.Set "title" . -}}
{{ else -}}
{{ $.Scratch.Set "title" .Site.Title -}}
{{ end -}}
{{ end }}
{{ $description := or (partial "utilities/GetDescription.html" (dict "page" .)) .Site.Params.main.description }}
{{ $description := or (partial "utilities/GetDescription.html" (dict "page" . "meta" true)) .Site.Params.main.description }}
{{ if gt (strings.RuneCount $description) 150 }}
{{ $description = print (substr $description 0 150) "..." }}
{{ end }}
{{ $.Scratch.Set "description" $description -}}
{{- $thumbnail := (or (and (reflect.IsMap .Params.Thumbnail) .Params.Thumbnail.url) .Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap .Params.Thumbnail }}{{ $thumbnail = .Params.Thumbnail.url }}{{ else }}{{ $thumbnail = .Params.Thumbnail }}{{ end }}
{{ if $thumbnail -}}
{{ $imgURL := index (partial "assets/helpers/image-dimension.html" (dict "url" $thumbnail "width" 1280 "height" 640 "page" .)) "target" }}
{{ $.Scratch.Set "thumbnail" ($imgURL | absURL) -}}

View File

@@ -63,7 +63,7 @@
-}}
{{- $options := (dict "transpiler" $transpiler "targetPath" $target "enableSourceMap" (not hugo.IsProduction) "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) -}}
{{- $bundle := partial "utilities/bundle.html" (dict "match" $source "filename" (printf "scss/bundle-%d.scss" now.UnixNano) "modules" $modules "basepath" "scss" "debugging" site.Params.debugging.showSCSS) -}}
{{- if gt ($bundle.Content | len) 0 }}
{{- $css := $bundle | resources.ExecuteAsTemplate $target . | toCSS $options -}}
@@ -73,7 +73,7 @@
{{ end }}
{{- if site.Params.style.purge -}}
{{- $post_options := dict "config" "config" "noMap" hugo.IsProduction -}}
{{- $css = $css | resources.PostCSS $post_options -}}
{{- $css = $css | css.PostCSS $post_options -}}
{{- end -}}
{{- if not hugo.IsProduction -}}

View File

@@ -61,7 +61,8 @@
{{ partial "assets/icon.html" (dict "icon" "mode" $mode $icon "wrapper" "col-6 mx-auto text-center")}}
{{ end }}
{{ else }}
{{- $thumbnail := (or (and (reflect.IsMap $page.Params.Thumbnail) $page.Params.Thumbnail.url) $page.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $page.Params.Thumbnail }}{{ $thumbnail = $page.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $page.Params.Thumbnail }}{{ end }}
{{- if $thumbnail }}
{{ partial "assets/image.html" (dict "url" $thumbnail "ratio" "16x9" "sizes" $sizes "wrapper" $style "class" "rounded" "title" $page.Site.Title "priority" "high") }}
{{ end }}

View File

@@ -0,0 +1,26 @@
<!--
Copyright © 2024 The Hinode Team / Mark Dumay. All rights reserved.
Use of this source code is governed by The MIT License (MIT) that can be found in the LICENSE file.
Visit gethinode.com/license for more details.
-->
<!-- Initialize arguments -->
{{ $args := partial "utilities/InitArgs.html" (dict "structure" "script" "args" .) }}
{{ if $args.err }}
{{ partial "utilities/LogErr.html" (dict
"partial" "templates/script.html"
"msg" "Invalid arguments"
"details" $args.errmsg
"file" page.File
)}}
{{ end }}
<!-- Initialize local arguments -->
{{ $category := cond (ne $args.category "other") $args.category "" }}
<!-- Main code -->
<script src="{{ $args.link }}"
{{- with $category }} data-category="{{ . }}"{{ end -}}
{{- with $args.integrity }}integrity="{{ . }}" crossorigin="anonymous"{{ end }}
{{- with $args.state }} {{ . | safeHTMLAttr }}{{ end -}}>
</script>

View File

@@ -12,7 +12,8 @@
{{ $illustration = partial "assets/icon.html" (dict "icon" "mode" $mode $icon "wrapper" "mx-auto text-center")}}
{{ end }}
{{ else }}
{{- $thumbnail := (or (and (reflect.IsMap $item.Params.Thumbnail) $item.Params.Thumbnail.url) $item.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $item.Params.Thumbnail }}{{ $thumbnail = $item.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $item.Params.Thumbnail }}{{ end }}
{{- if $thumbnail }}
{{ $illustration = partial "assets/image.html" (dict "url" $thumbnail "ratio" "16x9" "wrapper" $style "inner" "rounded" "title" $item.Site.Title) }}
{{ end }}

View File

@@ -46,7 +46,8 @@
{{- with index . "title" }}{{ $title = or . $title }}{{ end -}}
{{- end -}}
{{- $thumbnail := (or (and (reflect.IsMap $sectionPage.Params.Thumbnail) $sectionPage.Params.Thumbnail.url) $sectionPage.Params.Thumbnail) -}}
{{- $thumbnail := "" -}}
{{ if reflect.IsMap $sectionPage.Params.Thumbnail }}{{ $thumbnail = $sectionPage.Params.Thumbnail.url }}{{ else }}{{ $thumbnail = $sectionPage.Params.Thumbnail }}{{ end }}
{{- $icon := $sectionPage.Params.Icon -}}
{{- $content := "" -}}
{{ if not $sectionPage.IsSection }}{{ $content = $sectionPage.Content }}{{ end -}}

View File

@@ -1,28 +1,18 @@
{{ $page := .page }}
{{ $critical := slice }}
{{ $core := slice }}
{{ $optional := slice }}
{{ $excludeSCSS := slice }}
{{ $disableTemplate := slice }}
{{ $localize := slice }}
{{ $category := dict }}
{{ $modules := dict }}
{{ range $key, $mod := $page.Site.Params.modules }}
{{ if eq $key "core" }}
{{ warnf "DEPRECATED: module parameter `core` has been deprecated in release v0.24.0" }}
{{ $core = $core | append $mod }}
{{ else if eq $key "optional" }}
{{ warnf "DEPRECATED: module parameter `optional` has been deprecated in release v0.24.0" }}
{{ $optional = $optional | append $mod }}
{{ else if eq $key "excludescss" }}
{{ warnf "DEPRECATED: module parameter `excludeSCSS` has been deprecated in release v0.24.0" }}
{{ $excludeSCSS = $excludeSCSS | append $mod }}
{{ else if eq $key "disabletemplate" }}
{{ warnf "DEPRECATED: module parameter `disableTemplate` has been deprecated in release v0.24.0" }}
{{ $disableTemplate = $disableTemplate | append $mod }}
{{ else if reflect.IsMap $mod }}
{{ range $key, $mod := .Site.Params.modules }}
{{ if reflect.IsMap $mod }}
{{ $integration := index $mod "integration" }}
{{ if eq $integration "core" }}
{{ if eq $integration "critical" }}
{{ $critical = $critical | append $key }}
{{ else if eq $integration "core" }}
{{ $core = $core | append $key }}
{{ else if eq $integration "optional" }}
{{ $optional = $optional | append $key }}
@@ -42,6 +32,12 @@
{{ $localize = $localize | append $key }}
{{ end }}
{{ $categoryKey := "other" }}
{{ with (index $mod "category") }}{{ $categoryKey = . }}{{ end }}
{{ $cat := index $category $categoryKey | default slice }}
{{ $cat = $cat | append $key}}
{{ $category = merge $category (dict $categoryKey $cat) }}
{{ $modules = merge $modules (dict $key $mod) }}
{{ else }}
{{ warnf "Unsupported module parameter: %s" $key }}
@@ -50,14 +46,16 @@
{{ $modules := dict
"modules" $modules
"critical" $critical
"core" $core
"optional" $optional
"excludeSCSS" $excludeSCSS
"disableTemplate" $disableTemplate
"localize" $localize
"categories" $category
}}
{{- if and $page.IsPage (not (in $core "bootstrap")) -}}
{{- if and .IsPage (not (in $core "bootstrap")) -}}
{{- errorf "Bootstrap is a required module, please add it to 'modules.core' in your site parameters" -}}
{{- end -}}

View File

@@ -30,20 +30,21 @@
{{ end }}
<!-- Main code -->
{{ if or $sortable $paging $searchable }}{{ $class = trim (printf "%s data-table" $class) " " }}{{ end }}
{{ if or $sortable $paging $searchable }}{{ $class = trim (printf "%s data-table" $class) " " }}{{ end }}
{{- $input := .Inner | .Page.RenderString }}
{{- $input = replace $input "style=\"text-align:left\"" "class=\"text-start\"" -}}
{{- $input = replace $input "style=\"text-align:center\"" "class=\"text-center\"" -}}
{{- $input = replace $input "style=\"text-align:right\"" "class=\"text-end\"" -}}
{{ $regex := `<table\s*class="(.+?)"` }}
{{ $current := (index (index (findRESubmatch $regex $input) 0) 1) }}
{{ $target := delimit (((split $current " ") | append "table" | append $class) | uniq) " " }}
{{ $attributes := "" }}
{{ if $sortable }}{{ $attributes = printf "%s data-table-sortable=true" $attributes }}{{ end }}
{{ if $paging }}{{ $attributes = printf "%s data-table-paging=true" $attributes }}{{ end }}
{{ if $searchable }}{{ $attributes = printf "%s data-table-searchable=true" $attributes }}{{ end }}
{{- $old := "<table>" -}}
{{- $new := printf "<table class=\"table %s\" %s>" $class (trim $attributes " ") -}}
{{ $input := replace $input $old $new -}}
{{- $new := printf `<table class="%s" %s` $target (trim $attributes " ") -}}
{{ $input := replaceRE $regex $new $input 1 -}}
{{ if not $error }}
{{ if eq $breakpoint "none" }}
{{ $input | safeHTML }}

View File

@@ -4,12 +4,12 @@
command = "npm run build:example"
[build.environment]
DART_SASS_VERSION = "1.77.5"
HUGO_VERSION = "0.131.0"
DART_SASS_VERSION = "1.78.0"
HUGO_VERSION = "0.134.1"
HUGO_ENV = "production"
HUGO_ENABLEGITINFO = "true"
NODE_VERSION = "20.16.0"
NPM_VERSION = "10.8.1"
NODE_VERSION = "20.17.0"
NPM_VERSION = "10.8.2"
# toml-docs-end netlify
[[headers]]
@@ -21,19 +21,19 @@
Content-Security-Policy = """\
default-src 'self'; \
child-src 'self' app.netlify.com; \
script-src 'self' \
script-src 'self' cdn-cookieyes.com \
https://*.netlify.app app.netlify.com netlify-cdp-loader.netlify.app \
https://*.google-analytics.com https://*.googletagmanager.com; \
style-src 'self' \
style-src 'self' 'unsafe-inline' \
https://*.netlify.app https://fonts.googleapis.com https://www.youtube.com; \
object-src 'none'; \
base-uri 'self'; \
connect-src 'self'
connect-src 'self' *.cookieyes.com cdn-cookieyes.com \
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
font-src 'self' https://*.netlify.app https://fonts.gstatic.com; \
frame-src 'self' https://player.cloudinary.com https://player.vimeo.com https://www.youtube-nocookie.com https://www.youtube.com \
app.netlify.com; \
img-src 'self' data: https://*.imgix.net https://*.imagekit.io https://*.cloudinary.com https://*.netlify.app https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
img-src 'self' data: cdn-cookieyes.com https://*.imgix.net https://*.imagekit.io https://*.cloudinary.com 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'; \
media-src 'self' \
"""

2258
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "@gethinode/hinode",
"version": "0.26.6",
"version": "0.27.0-beta",
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
"keywords": [
"hugo",
@@ -69,19 +69,16 @@
"dependencies": {
"@fullhuman/postcss-purgecss": "^6.0.0",
"autoprefixer": "^10.4.20",
"cssnano": "^7.0.5",
"cssnano-preset-advanced": "^7.0.5",
"hugo-bin": "0.130.1",
"cssnano": "^7.0.6",
"cssnano-preset-advanced": "^7.0.6",
"hugo-bin": "0.131.3",
"purgecss-whitelister": "^2.4.0"
},
"devDependencies": {
"@gethinode/netlify-plugin-dartsass": "^0.3.0",
"eslint": "^8.57.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-promise": "^6.6.0",
"markdownlint-cli2": "^0.13.0",
"eslint": "^9.11.1",
"markdownlint-cli2": "^0.14.0",
"neostandard": "^0.11.6",
"netlify-plugin-hugo-cache-resources": "^0.2.1",
"npm-run-all": "^4.1.5",
"postcss-cli": "^11.0.0",

View File

@@ -6,7 +6,7 @@ homepage = "https://gethinode.com"
demosite = "https://demo.gethinode.com"
tags = ["blog", "documentation", "minimal", "modern", "customizable", "search", "bootstrap"]
features = ["security aware", "fast by default", "seo-ready", "development tools", "bootstrap framework", "netlify-ready", "full text search", "page layouts", "versioned documentation"]
min_version = "0.132.0"
min_version = "0.134.0"
[author]
name = "Mark Dumay"