Compare commits

...

25 Commits

Author SHA1 Message Date
Mark Dumay
6661434c35 Merge pull request #671 from gethinode/validation
Improve argument validation and documentation
2023-12-24 14:57:51 +01:00
Mark Dumay
aee6b3a32d Merge branch 'main' into validation 2023-12-24 14:50:16 +01:00
mark
4b0cc260cb Bump package release 2023-12-24 14:48:24 +01:00
mark
7611315941 Remove redundant comments 2023-12-24 14:47:47 +01:00
mark
3b1f71a601 Update build stats 2023-12-24 14:47:20 +01:00
mark
fead3555fc Support release info 2023-12-24 14:47:01 +01:00
mark
cd3f99fc90 Fix aria label 2023-12-24 14:27:21 +01:00
mark
a2e6855117 Refactor required args check 2023-12-24 14:27:04 +01:00
mark
1e4cd3a5da Handle empty args 2023-12-24 14:26:51 +01:00
Mark Dumay
865898ac4f Merge pull request #670 from gethinode/validation
Refactor argument validation and documentation
2023-12-24 12:03:50 +01:00
Mark Dumay
44ace26cde Merge branch 'main' into validation 2023-12-24 11:55:17 +01:00
mark
d0350c7672 Bump package release 2023-12-24 11:54:25 +01:00
mark
943a115ef0 Update build stats 2023-12-24 11:53:19 +01:00
mark
745322b3fe Add args shortcode to render structured arguments 2023-12-24 11:53:10 +01:00
mark
90ea2cb760 Refactor card args validation 2023-12-24 11:52:18 +01:00
Mark Dumay
2d6c3c7d64 Merge pull request #667 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2023-12-22 06:51:30 +01:00
markdumay
4401c49c54 fix: update Hugo module dependencies 2023-12-22 05:46:02 +00:00
github-actions[bot]
fa3bfa7008 Merge pull request #665 from gethinode/dependabot/npm_and_yarn/eslint-plugin-n-16.5.0
Bump eslint-plugin-n from 16.4.0 to 16.5.0
2023-12-20 13:58:37 +00:00
dependabot[bot]
14c2ddc725 Bump eslint-plugin-n from 16.4.0 to 16.5.0
Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 16.4.0 to 16.5.0.
- [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases)
- [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/16.4.0...16.5.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-20 13:52:36 +00:00
Mark Dumay
1e55dc8f65 Merge pull request #664 from uvham521/feature/chinese-support
Add Chinese translation files
2023-12-19 14:09:32 +01:00
uvham521
78980dde3f Add Chinese translation files 2023-12-19 11:59:48 +00:00
github-actions[bot]
3a770b6f40 Merge pull request #662 from gethinode/dependabot/npm_and_yarn/eslint-8.56.0
Bump eslint from 8.55.0 to 8.56.0
2023-12-18 13:25:07 +00:00
dependabot[bot]
b271adef3f Bump eslint from 8.55.0 to 8.56.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.55.0 to 8.56.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.55.0...v8.56.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 13:19:12 +00:00
Mark Dumay
639c9770b8 Merge pull request #661 from gethinode/hugo-mod-dependencies
Update Hugo module dependencies
2023-12-17 06:34:31 +01:00
markdumay
e6b29666ad fix: update Hugo module dependencies 2023-12-17 03:16:31 +00:00
19 changed files with 760 additions and 201 deletions

174
data/structures/card.yml Normal file
View File

@@ -0,0 +1,174 @@
comment: >-
Displays a Bootstrap card. Either specify a valid path, or set the arguments
title, href, header, description, and thumbnail individually. The latter
arguments override any page attributes.
arguments:
title:
type: string
optional: true
comment: >-
Title of the card.
path:
type: path
optional: true
comment: >-
Path of the page, override with other parameters.
href:
type: url
optional: true
comment: >-
Address for the button or hyperlink.
group: partial
class:
type: string
optional: true
parent: merge
comment: >-
Class attribute of the card element, e.g. “w-50”.
color:
type: select
optional: true
parent: cascade
comment: >-
Theme color of the card. By default, no color is specified.
options:
values:
- primary
- secondary
- success
- danger
- warning
- info
- light
- dark
- white
- black
- body
- body-tertiary
padding:
type: select
optional: true
default: auto
parent: cascade
comment: >-
Padding of the content.
options:
values:
- "0"
- "1"
- "2"
- "3"
- "4"
- "5"
- "auto"
gutter:
type: select
optional: true
default: "0"
parent: cascade
comment: >-
Gutter between columns in a group.
options:
values:
- "0"
- "1"
- "2"
- "3"
- "4"
- "5"
header:
type: select
optional: true
default: full
parent: cascade
comment: >-
Header components of the card, displayed in small caps.
options:
values:
- full
- publication
- tags
- none
footer:
type: select
optional: true
default: none
parent: cascade
comment: >-
Footer components of the card, displayed in small caps.
options:
values:
- full
- publication
- tags
- none
description:
type:
- string
- template.HTML
optional: true
comment: >-
Description of the card.
group: partial
loading:
type: select
optional: true
default: eager
comment: >-
Loading behavior of the image. The loading of lazily loaded images is
deferred until the image is within scrolling range of the viewport. This
should reduce the initial loading time of the website. It is recommended
to lazily load only those images that are below the page fold.
options:
values:
- lazy
- eager
group: partial
thumbnail:
type: path
optional: true
comment: >-
Thumbnail image url, displayed on top or the left of the card.
ratio:
type: select
optional: true
comment: >-
Ratio of the thumbnail image, defaults to "16x9" (stacked orientation)
or "1x1" (horizontal orientation).
options:
values:
- 1x1
- 3x2
- 4x3
- 16x9
- 21x9
group: partial
alt:
type: string
optional: true
release: v0.19.0
comment: >-
Alternate text for the thumbnail, uses "title" by default.
icon:
type: string
optional: true
comment: >-
Font Awesome icon, displayed on top or the left of the card.
orientation:
type: select
optional: true
default: stacked
parent: cascade
comment: >-
Placement of the thumbnail or icon.
options:
values:
- stacked
- horizontal
- horizontal-sm
- none
body:
optional: true
comment: >-
Description of the card.
group: shortcode

View File

@@ -40,6 +40,8 @@ github.com/gethinode/mod-fontawesome v1.5.1 h1:C7goQY4HrEua/lpjC++laydNKBuYo1+30
github.com/gethinode/mod-fontawesome v1.5.1/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-fontawesome v1.6.1 h1:iqOgDGdw7Bs4hnzjF/8JsUn10omyKQZTglLqNenT1K0=
github.com/gethinode/mod-fontawesome v1.6.1/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-fontawesome v1.7.3 h1:YzRCYSasVRIcImVmTJYjqNJ+KmyNWfm/bMgtM0slvzs=
github.com/gethinode/mod-fontawesome v1.7.3/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-katex v1.0.1/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-katex v1.0.2 h1:pIG4n3qLl/IVe7BEiwn+GL8r5lOCtF6FDxlcrPKdAXk=
github.com/gethinode/mod-katex v1.0.2/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
@@ -47,6 +49,8 @@ github.com/gethinode/mod-katex v1.0.3 h1:fvlUWqcUQqv2zRNM2kfmJ6GhXA816Tl1nfVrUkm
github.com/gethinode/mod-katex v1.0.3/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-katex v1.0.4 h1:NozgWPFnHhx1W+E9DnwMTRpvxPbdqdANEtwp9N3/mj8=
github.com/gethinode/mod-katex v1.0.4/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
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 v0.3.4 h1:oY+YQ0JiJuhFQNrk9XgFdg0NMsTUQPXNfnILp4ia4r4=
github.com/gethinode/mod-leaflet v0.3.4/go.mod h1:uGggt87x4Fw7wBoJpSiUvNkYg+s/Ujne7klAX2rxMRk=
github.com/gethinode/mod-leaflet v0.3.5 h1:69Bv/6zRXhbcTzo7TMr58h3ry47srHRpM1k81LrLbYU=

View File

@@ -38,8 +38,14 @@
"sub",
"sup",
"svg",
"table",
"tbody",
"td",
"th",
"thead",
"time",
"title",
"tr",
"ul",
"use"
],
@@ -308,6 +314,7 @@
"pb-4",
"pb-5",
"pb-md-0",
"pe-1",
"pe-3",
"position-absolute",
"position-fixed",
@@ -358,6 +365,8 @@
"syntax-highlight",
"tab-content",
"tab-pane",
"table",
"table-responsive",
"tag-link",
"text-bg-body",
"text-bg-body-tertiary",

4
go.mod
View File

@@ -6,8 +6,8 @@ require (
github.com/airbnb/lottie-web v5.12.2+incompatible // indirect
github.com/gethinode/mod-bootstrap v1.2.2 // indirect
github.com/gethinode/mod-flexsearch v1.7.1 // indirect
github.com/gethinode/mod-fontawesome v1.6.1 // indirect
github.com/gethinode/mod-katex v1.0.4 // indirect
github.com/gethinode/mod-fontawesome v1.7.3 // indirect
github.com/gethinode/mod-katex v1.0.5 // indirect
github.com/gethinode/mod-leaflet v0.3.5 // indirect
github.com/gethinode/mod-lottie v1.3.0 // indirect
github.com/nextapps-de/flexsearch v0.0.0-20230711092928-1243fd883ec3 // indirect

4
go.sum
View File

@@ -70,6 +70,8 @@ github.com/gethinode/mod-fontawesome v1.5.1 h1:C7goQY4HrEua/lpjC++laydNKBuYo1+30
github.com/gethinode/mod-fontawesome v1.5.1/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-fontawesome v1.6.1 h1:iqOgDGdw7Bs4hnzjF/8JsUn10omyKQZTglLqNenT1K0=
github.com/gethinode/mod-fontawesome v1.6.1/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-fontawesome v1.7.3 h1:YzRCYSasVRIcImVmTJYjqNJ+KmyNWfm/bMgtM0slvzs=
github.com/gethinode/mod-fontawesome v1.7.3/go.mod h1:Ki1qkWEOiF0hQpCgWeZRw+HkpL6nd1DxKFptU0O2feI=
github.com/gethinode/mod-katex v1.0.0 h1:me/3dIIZBkfk1mRIFt8QiAGYwYDoSG5bc2hHRtIutFc=
github.com/gethinode/mod-katex v1.0.0/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-katex v1.0.1 h1:809QUztxmKgMNchU+v03iMO7Ma+ISc3ZzhXYauc21rs=
@@ -80,6 +82,8 @@ github.com/gethinode/mod-katex v1.0.3 h1:fvlUWqcUQqv2zRNM2kfmJ6GhXA816Tl1nfVrUkm
github.com/gethinode/mod-katex v1.0.3/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
github.com/gethinode/mod-katex v1.0.4 h1:NozgWPFnHhx1W+E9DnwMTRpvxPbdqdANEtwp9N3/mj8=
github.com/gethinode/mod-katex v1.0.4/go.mod h1:byAfpI3wuqNJIooTGVEGc1cjBhhCy4+CcK1H6495MYg=
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 v0.2.3 h1:QQI4h+IH0jZ7fx4q0um2YIEiYBoW3OAfW8qHzbRCDPk=
github.com/gethinode/mod-leaflet v0.2.3/go.mod h1:uGggt87x4Fw7wBoJpSiUvNkYg+s/Ujne7klAX2rxMRk=
github.com/gethinode/mod-leaflet v0.3.1 h1:H5MaOa+BB1KuVw7abTqfIn/SNzzRsAyx/WQoSe+2Ykc=

View File

@@ -133,3 +133,17 @@
translation: "Show"
- id: comments
translation: "Comments"
# Arguments
- id: name
translation: "Name"
- id: type
translation: "Type"
- id: required
translation: "Required"
- id: default
translation: "Default"
- id: comment
translation: "Comment"
- id: supportedValues
translation: "Supported values"

View File

@@ -131,3 +131,18 @@
translation: "Tonen"
- id: comments
translation: "Reacties"
# Arguments
- id: name
translation: "Naam"
- id: type
translation: "Type"
- id: required
translation: "Verplicht"
- id: default
translation: "Standaardwaarde"
- id: comment
translation: "Toelichting"
- id: supportedValues
translation: "Toegestane waarden"

135
i18n/zh-hans.yaml Normal file
View File

@@ -0,0 +1,135 @@
# Single pages
- id: postedOnDate
translation: "发布于 {{ . }}"
- id: lastModified
translation: "最后修改于 {{ . }}"
- id: read
translation: "阅读"
- id: minutesShort
translation: "分钟"
- id: words
translation: "字"
- id: photoFull
translation: "照片由 %s 于 %s 拍摄"
- id: photoShort
translation: "照片由 {{ . }} 拍摄"
- id: photoOn
translation: "于"
- id: draft
translation: "草稿"
# List pages
- id: article
translation: "文章"
- id: articles
translation: "文章"
- id: more
translation: "更多 {{ . }}"
- id: emptyList
translation: "没有找到文章"
- id: emptyTags
translation: "没有找到标签"
# Languages
- id: lang_de
translation: "German"
- id: lang_en
translation: "English"
- id: lang_nl
translation: "Dutch"
- id: lang_fr
translation: "French"
# Sharing
- id: shareLink
translation: "分享至 {{ . }}"
- id: shareSystem
translation: "系统"
- id: copyToClipboard
translation: "复制到剪贴板"
- id: copiedToClipboard
translation: "已复制到剪贴板"
- id: link
translation: "链接"
- id: code
translation: "代码"
- id: download
translation: "下载文章"
# Pagination
- id: paginationNav
translation: "页面导航"
- id: paginationPrevious
translation: "上一页"
- id: paginationNext
translation: "下一页"
- id: paginationFirst
translation: "第一页"
- id: paginationLast
translation: "最后一页"
# Navigation
- id: colorMode
translation: "切换主题"
- id: colorLight
translation: "亮色"
- id: colorDark
translation: "暗色"
- id: colorAuto
translation: "自动"
- id: toggleMainNav
translation: "切换主导航"
- id: home
translation: "首页"
- id: languageSwitcherLabel
translation: "语言"
- id: close
translation: "关闭"
# Table of contents
- id: toc
translation: "本页目录"
- id: seeAlso
translation: "参见"
- id: sectionMenu
translation: "选择一个主题"
# Sidebar
- id: toggleSidebar
translation: "切换侧边栏导航"
# Feature
- id: addedFeature
translation: "新增于 {{ . }}"
- id: deprecatedFeature
translation: "已弃用于 {{ . }}"
# Versioning
- id: latest
translation: "最新"
- id: allVersions
translation: "所有版本"
- id: newerVersionAlert
translation: "有一个更新版本的 {{ . }}!"
# 404 page
- id: pageNotFound
translation: "您访问的页面不存在或发生了其他错误。请返回我们的{{ . }}。"
- id: pageNotFoundTitle
translation: "页面未找到"
- id: pageNotFoundHome
translation: "首页"
# Footer
- id: copyright
translation: "Copyright"
- id: rights
translation: "版权所有"
- id: poweredBy
translation: "由 {{ . }} 提供支持。"
# Comments
- id: show
translation: "显示"
- id: comments
translation: "评论"

135
i18n/zh-hant.yaml Normal file
View File

@@ -0,0 +1,135 @@
# Single pages
- id: postedOnDate
translation: "發佈於 {{ . }}"
- id: lastModified
translation: "最後修改於 {{ . }}"
- id: read
translation: "閱讀"
- id: minutesShort
translation: "分鐘"
- id: words
translation: "字"
- id: photoFull
translation: "照片由 %s 於 %s 拍攝"
- id: photoShort
translation: "照片由 {{ . }} 拍攝"
- id: photoOn
translation: "於"
- id: draft
translation: "草稿"
# List pages
- id: article
translation: "文章"
- id: articles
translation: "文章"
- id: more
translation: "更多 {{ . }}"
- id: emptyList
translation: "沒有找到文章"
- id: emptyTags
translation: "沒有找到標籤"
# Languages
- id: lang_de
translation: "German"
- id: lang_en
translation: "English"
- id: lang_nl
translation: "Dutch"
- id: lang_fr
translation: "French"
# Sharing
- id: shareLink
translation: "分享至 {{ . }}"
- id: shareSystem
translation: "系統"
- id: copyToClipboard
translation: "複製到剪貼板"
- id: copiedToClipboard
translation: "已複製到剪貼板"
- id: link
translation: "連結"
- id: code
translation: "程式碼"
- id: download
translation: "下載文章"
# Pagination
- id: paginationNav
translation: "頁面導航"
- id: paginationPrevious
translation: "上一頁"
- id: paginationNext
translation: "下一頁"
- id: paginationFirst
translation: "第一頁"
- id: paginationLast
translation: "最後一頁"
# Navigation
- id: colorMode
translation: "切換主題"
- id: colorLight
translation: "亮色"
- id: colorDark
translation: "暗色"
- id: colorAuto
translation: "自動"
- id: toggleMainNav
translation: "切換主導航"
- id: home
translation: "首頁"
- id: languageSwitcherLabel
translation: "語言"
- id: close
translation: "關閉"
# Table of contents
- id: toc
translation: "本頁目錄"
- id: seeAlso
translation: "參見"
- id: sectionMenu
translation: "選擇一個主題"
# Sidebar
- id: toggleSidebar
translation: "切換側邊欄導航"
# Feature
- id: addedFeature
translation: "新增於 {{ . }}"
- id: deprecatedFeature
translation: "已棄用於 {{ . }}"
# Versioning
- id: latest
translation: "最新"
- id: allVersions
translation: "所有版本"
- id: newerVersionAlert
translation: "有一個更新版本的 {{ . }}!"
# 404 page
- id: pageNotFound
translation: "您訪問的頁面不存在或發生了其他錯誤。請返回我們的{{ . }}。"
- id: pageNotFoundTitle
translation: "頁面未找到"
- id: pageNotFoundHome
translation: "首頁"
# Footer
- id: copyright
translation: "Copyright"
- id: rights
translation: "版權所有"
- id: poweredBy
translation: "由 {{ . }} 提供支持。"
# Comments
- id: show
translation: "顯示"
- id: comments
translation: "評論"

View File

@@ -67,7 +67,7 @@
{{- with .badge }}{{ $badge = . }}{{ end -}}
{{- $label := "" -}}
{{- with .label }}{{ $label = . }}{{ end -}}
{{- if .label }}{{ $label = .label }}{{ else }}{{ $label = $title }}{{ end -}}
{{- $tooltip := "" -}}
{{- if not (strings.HasSuffix $state "active") -}}
@@ -143,7 +143,8 @@
{{- $attributes := .attributes -}}
<a aria-label="{{ (or $label $title) | safeHTML }}" {{ if ne $state "disabled" }}{{ with $href }}href="{{ . }}"{{ end }}{{ end -}}
<a aria-label="{{ (or $label $title) | safeHTML }}"
{{ if ne $state "disabled" }}{{ with $href }}href="{{ . }}"{{ end }}{{ end -}}
{{- with $id }} id="{{ . }}"{{ end -}}
{{- with $target }} target="{{ . }}"{{ end }}{{ with $rel }} rel="{{ . }}"{{ end -}}
{{- with $toast }} data-toast-target="{{ $toast }}"{{ end -}}

View File

@@ -1,31 +1,49 @@
<!--
Displays a Bootstrap card. Either specify a valid path, or set the arguments title, href, header, description, and
thumbnail individually. The latter arguments override any page attributes.
The shortcode supports the following arguments:
"path" Optional path of the page, override with other parameters.
"title" Required title of the card.
"href" Optional address for the button or hyperlink.
"class" Optional class attribute of the card element, e.g. “w-50”.
"color": Optional theme color of the card, either "primary", "secondary", "success", "danger",
"warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". By default, no
color is specified.
"padding": Optional padding of the content, either "0", "1", "2", "3", "4", "5", or "auto" (default).
"gutter" Gutter between columns in a group, either "0" (default), "1", "2", "3", "4", or "5".
"header" Optional header components of the card, displayed in small caps. Supported values are "full"
(default), "publication", "tags", and "none".
"footer" Optional footer components of the card, displayed in small caps. Supported values are "full",
"publication", "tags", and "none" (default).
"description" Optional description of the card.
"thumbnail" Optional thumbnail image url, displayed on top or the left of the card.
"ratio" Optional ratio of the thumbnail image, defaults to "16x9" (stacked orientation) or "1x1" (horizontal
orientation).
"alt" Optional alternate text for the thumbnail, uses "title" by default.
"icon" Optional Font Awesome icon, displayed on top or the left of the card.
"orientation" Optional placecement of the thumbnail or icon, either "stacked" (default), "horizontal",
"horizontal-sm" or "none".
Copyright © 2023 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.
-->
<!-- Validate and initialize arguments -->
{{ if partial "utilities/IsInvalidArgs.html" (dict "structure" "card" "args" .) }}
{{- errorf "partial [assets/card.html] - Invalid arguments" -}}
{{ end }}
<!-- Initialize arguments and default values -->
{{- $alt := .alt -}}
{{- $class := .class -}}
{{- $color := .color -}}
{{- $description := .description -}}
{{- $footer := .footer | default "none" -}}
{{- $gutter := .gutter | default "0" -}}
{{- $header := .header | default "full" -}}
{{- $href := .href -}}
{{- $icon := .icon -}}
{{- $loading := .loading -}}
{{- $orientation := .orientation | default "stacked" -}}
{{- $padding := .padding | default "auto" -}}
{{- $ratio := .ratio -}}
{{- $thumbnail := .thumbnail -}}
{{- $title := .title -}}
<!-- Override arguments -->
{{- $page := "" }}
{{- if .path }}
{{- $page = site.GetPage .path }}
{{- if not $page }}
{{- errorf "partial [assets/card.html] - Cannot find page: %s" .path -}}
{{- end }}
{{- end }}
{{- with $page -}}
{{- if not $title }}{{ $title = .Title }}{{ end -}}
{{- if not $href }}{{ $href = .RelPermalink }}{{ end -}}
{{- if not $description }}{{ $description = partial "utilities/GetDescription.html" . }}{{ end -}}
{{- if not $thumbnail }}{{ $thumbnail = (or (and (reflect.IsMap .Params.Thumbnail) .Params.Thumbnail.url) .Params.Thumbnail) }}{{ end -}}
{{- if not $icon }}{{ $icon = .Params.icon }}{{ end -}}
{{- end -}}
{{- if eq $orientation "none" }}{{ $thumbnail = "" }}{{ $icon = "" }}{{ end -}}
<!-- Inline partial to render the card's body -->
{{- define "partials/card-body.html" -}}
{{- $title := .title -}}
@@ -77,85 +95,11 @@
</small></p>
{{- end -}}
{{- $page := "" }}
{{- if .path }}
{{- $page = site.GetPage .path }}
{{- if not $page }}
{{- errorf "partial [assets/card.html] - Cannot find page: %s" .path -}}
{{- end }}
{{- end }}
{{- $title := .title -}}
{{- $alt := .alt -}}
{{- $href := .href -}}
{{- $description := .description -}}
{{- $thumbnail := .thumbnail -}}
{{- $ratio := .ratio -}}
{{- $icon := .icon -}}
{{- $color := "" -}}
{{- with .color }}{{ $color = . }}{{ end -}}
{{- if $color -}}
{{- $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
{{- if not (in $supportedColors $color) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'color': %s" $color -}}
{{- end -}}
{{- end -}}
{{- $header := "full" -}}
{{- with .header }}{{ $header = . }}{{ end -}}
{{- $supportedKeywords := slice "full" "publication" "tags" "none" -}}
{{- if not (in $supportedKeywords $header) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'header': %s" $header -}}
{{- end -}}
{{- $footer := "none" -}}
{{- with .footer }}{{ $footer = . }}{{ end -}}
{{- if not (in $supportedKeywords $footer) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'footer': %s" $footer -}}
{{- end -}}
{{- with $page -}}
{{- if not $title }}{{ $title = .Title }}{{ end -}}
{{- if not $href }}{{ $href = .RelPermalink }}{{ end -}}
{{- if not $description }}{{ $description = partial "utilities/GetDescription.html" . }}{{ end -}}
{{- if not $thumbnail }}{{ $thumbnail = (or (and (reflect.IsMap .Params.Thumbnail) .Params.Thumbnail.url) .Params.Thumbnail) }}{{ end -}}
{{- if not $icon }}{{ $icon = .Params.icon }}{{ end -}}
{{- end -}}
{{- $class := .class -}}
{{- $padding := "auto" -}}
{{- with .padding }}{{ $padding = . }}{{ end -}}
{{- $supportedPaddings := slice "0" "1" "2" "3" "4" "5" "auto" -}}
{{- if not (in $supportedPaddings $padding) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'padding': %s" $padding -}}
{{- end -}}
{{- $gutter := .gutter | default "0" -}}
{{ $supportedGutters:= slice "0" "1" "2" "3" "4" "5" -}}
{{ if not (in $supportedGutters $gutter) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'gutter': %s" $gutter -}}
{{ end -}}
{{- $orientation := "stacked" -}}
{{- with .orientation }}{{ $orientation = . }}{{ end -}}
{{- $supportedOrientations := slice "stacked" "horizontal" "horizontal-sm" "none" -}}
{{- if not (in $supportedOrientations $orientation) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'orientation': %s" $orientation -}}
{{- end -}}
{{- if eq $orientation "none" }}{{ $thumbnail = "" }}{{ $icon = "" }}{{ end -}}
{{- $loading := .loading -}}
{{- $validSettings := slice "lazy" "eager" -}}
{{- if $loading -}}
{{ if not (in $validSettings $loading) -}}
{{- errorf "partial [assets/card.html] - Invalid value for param 'loading': %s" $loading -}}
{{ end -}}
{{- end -}}
<!-- Main code -->
{{ if ne $gutter "0" }}<div class="g-{{ $gutter }}">{{ end }}
{{- if hasPrefix $orientation "horizontal" -}}
<!-- Render horizontal card -->
<div class="card {{ with $color }}bg-{{ . }} text-bg-{{ . }}{{ end }} {{ $class }}">
<div class="row g-0 row-cols-1 h-100">
<div class="col-4{{ if eq $orientation "horizontal-sm" }} col-md-2{{ end }}">
@@ -179,6 +123,7 @@
</div>
</div>
{{- else -}}
<!-- Render stacked / default card -->
<div class="card {{ with $color }}bg-{{ . }} text-bg-{{ . }}{{ end }} {{ $class }}">
{{- if $thumbnail -}}
{{- partial "assets/image.html" (dict "url" $thumbnail "ratio" (or $ratio "16x9") "outerClass" "card-img-wrap" "innerClass" "card-img-top" "title" (or $alt $title) "loading" $loading) -}}
@@ -194,4 +139,5 @@
</div>
</div>
{{- end -}}
{{ if ne $gutter "0" }}</div>{{ end }}

View File

@@ -0,0 +1,25 @@
{{ $page := .page }}
{{ $input := .input }}
{{ $args := .args }}
{{- $responsiveVals := slice "table-responsive" "table-responsive-none" "table-responsive-sm" "table-responsive-md" "table-responsive-lg" "table-responsive-xl" "table-responsive-xxl" -}}
{{- $responsive := intersect $args $responsiveVals -}}
{{- $main := complement $responsive $args -}}
{{- if in $responsive "table-responsive-none" -}}
{{- $responsive = "" -}}
{{- else if not $responsive -}}
{{ $responsive = (slice "table-responsive") -}}
{{- 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\"" -}}
{{- $class := delimit $main " " -}}
{{- $old := "<table>" -}}
{{- $new := printf "<table class=\"table %s\">" $class -}}
{{ $input := replace $input $old $new -}}
{{- with $responsive }}<div class="{{ delimit . " " }}">{{ end -}}
{{ $input | safeHTML }}
{{- with $responsive }}</div>{{ end -}}

View File

@@ -0,0 +1,76 @@
<!--
Copyright © 2023 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.
-->
{{ $error := false }}
{{ $aliases := dict "path" "string" "select" "string" "url" "string" }}
{{ $structure := .structure }}
{{ if not $structure }}
{{- errorf "partial [utilities/ValidateArgs.html] - Missing value for param 'structure'" -}}
{{ $error = true }}
{{ end }}
{{ $args := .args | default slice }}
{{ $definitions := (index site.Data.structures $structure).arguments }}
{{ if not $definitions }}
{{- errorf "partial [utilities/ValidateArgs.html] - Missing definitions: %s" $structure -}}
{{ $error = true }}
{{ end }}
{{ if not $error }}
{{ range $key, $val := $args }}
{{ $def := index $definitions $key }}
{{ if and (not $val) $def.default }}{{ $val = $def.default }}{{ end }}
{{/* validate type */}}
{{ $expected := slice | append $def.type }}
{{ $extra := slice }}
{{ range $expected }}
{{ $alias := index $aliases . }}
{{ if $alias }}{{ $extra = $extra | append $alias }}{{ end }}
{{ end }}
{{ if $extra }}{{ $expected = $expected | append $extra }}{{ end }}
{{ $actual := printf "%T" $val }}
{{ if $val }}
{{ if not (in $expected $actual ) }}
{{ warnf "[%s] argument '%s': expected type '%s', got '%s'" $structure $key (delimit $expected ", ") $actual }}
{{ $error = true }}
{{ end }}
{{ end }}
{{/* validate permitted values */}}
{{ if and $def.options.values (eq $actual "select") }}
{{ if and (not $def.optional) (not (in $def.options.values $val)) }}
{{ warnf "[%s] argument '%s': unexpected value '%s'" $structure $key $val }}
{{ $error = true }}
{{ end }}
{{ else if and $def.options.min (in (slice "int" "float" "float64") $actual) }}
{{ if lt $val $def.options.min }}
{{ warnf "[%s] argument '%s': value '%s' out of range [$d, $d]" $structure $key $val $def.options.min $def.options.max}}
{{ $error = true }}
{{ end }}
{{ else if and $def.options.max (in (slice "int" "float" "float64") $actual) }}
{{ if (gt $val $def.options.max) }}
{{ warnf "[%s] argument '%s': value '%s' out of range [$d, $d]" $structure $key $val $def.options.min $def.options.max}}
{{ $error = true }}
{{ end }}
{{ end }}
{{ end }}
{{/* validate required arguments */}}
{{ range $key, $val := $definitions }}
{{ if not $val.optional }}
{{ if not (in $args $key )}}
{{ warnf "[%s] argument '%s': expected value" $structure $key }}
{{ $error = true }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ return $error }}

View File

@@ -0,0 +1,68 @@
{{ $error := false }}
{{ $structure := "" }}
{{- if .IsNamedParams }}{{ $structure = .Get "structure" }}{{ else }}{{ $structure = .Get 0 }}{{ end }}
{{ if not $structure }}
{{- errorf "Invalid or missing value for param 'structure': %s" .Position -}}
{{ $error = true }}
{{ end }}
{{ $definitions := (index site.Data.structures $structure).arguments }}
{{ if not $definitions }}
{{- errorf "Cannot find data structure '%s': %s" $structure .Position -}}
{{ $error = true }}
{{ end }}
{{ $group := "" }}
{{- if .IsNamedParams }}{{ $group = .Get "group" }}{{ else }}{{ $group = .Get 1 }}{{ end }}
{{ if not $error }}
{{ $table := printf "| %s | %s | %s | %s | %s |\n| --- | --- | --- | --- | --- |"
(T "name") (T "type") (T "required") (T "default") (T "comment")
}}
{{ range $key, $val := $definitions }}
{{ $skip := false }}
{{ $groups := slice | append $val.group }}
{{ if and $group $val.group }}
{{ $skip = not (in $groups $group )}}
{{ end }}
{{ if not $skip }}
{{ $type := $val.type }}
{{ if reflect.IsSlice $val.type }}{{ $type = delimit $val.type ", " }}{{ end }}
{{ $required := "" }}
{{ if not $val.optional }}{{ $required = "yes" }}{{ end }}
{{ $comment := $val.comment }}
{{ if $val.deprecated }}
{{ $comment = printf `{{< release version="%s" short="true" size="sm" inline="true" state="deprecated" >}} %s` $val.deprecated $comment }}
{{ end }}
{{ if $val.release }}
{{ $comment = printf `{{< release version="%s" short="true" size="sm" inline="true" >}} %s` $val.release $comment }}
{{ end }}
{{ $min := "" }}
{{ $max := "" }}
{{ if and $val.options.values (eq $type "select") }}
{{ $comment = printf "%s %s: [%s]." $comment (T "supportedValues") (delimit $val.options.values ", ") }}
{{ else if $val.options.min (in (slice "int" "float" "float64") $type) }}
{{ $min = $val.options.min }}
{{ else if $val.options.max (in (slice "int" "float" "float64") $type) }}
{{ $max = $val.options.max }}
{{ end }}
{{ if and $min $max }}
{{ $comment = printf "%s %s: [%d, %d]." $comment (T "supportedValues") $min $max }}
{{ else if $min }}
{{ $comment = printf "%s %s: >=%d." $comment (T "supportedValues") $min }}
{{ else if $max }}
{{ $comment = printf "%s %s: <=%d." $comment (T "supportedValues") $max }}
{{ end }}
{{ $table = printf "%s\n| %s | %s | %s | %s | %s |" $table $key $type $required (or $val.default "") $comment }}
{{ end }}
{{ end }}
{{ partial "assets/table.html" (dict "page" .Page "input" $table "args" slice) }}
{{ end }}

View File

@@ -1,28 +1,34 @@
<!--
Displays a Bootstrap card that links to a page. Any inner text is used as description. The shortcode supports the
following arguments:
"path" Optional path of the page. If omitted, specify the title, icon, thumbnail, and body as needed.
"title" Optional title of the card.
"class" Optional class attribute of the card element, e.g. “w-50”.
"color" Optional theme color of the card, either "primary", "secondary", "success", "danger",
"warning", "info", "light", "dark", "white", "black", "body", or "body-tertiary". By default, no
color is specified.
"padding" Optional padding of the content, either "0", "1", "2", "3", "4", "5", or "auto" (default).
"gutter" Gutter between columns in a group, either "0" (default), "1", "2", "3", "4", or "5".
"header" Optional header components of the card, displayed in small caps. Supported values are "full"
(default), "publication", "tags", and "none".
"footer" Optional footer components of the card, displayed in small caps. Supported values are "full",
"publication", "tags", and "none" (default).
"orientation" Optional placecement of the thumbnail, either "stacked" (default), "horizontal", or "none".
"thumbnail" Optional thumbnail image url, displayed on top or the left of the card.
"alt" Optional alternate text for the thumbnail, uses "title" by default.
"icon" Optional Font Awesome icon, displayed on top or the left of the card.
Copyright © 2023 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.
-->
{{ $error := false }}
{{ $path := or (.Get "path") "" }}
{{ $page := .Page }}
<!-- Validate and initialize arguments -->
{{ if partial "utilities/IsInvalidArgs.html" (dict "structure" "card" "args" .Params) }}
{{ errorf "Invalid arguments: %s" .Position -}}
{{ $error = true }}
{{ end }}
<!-- Initialize arguments and default values -->
{{- $alt := .Get "alt" -}}
{{- $class := partial "utilities/GetArgParent" (dict "page" . "arg" "class" "merge" true) -}}
{{- $color := partial "utilities/GetArgParent" (dict "page" . "arg" "color") -}}
{{- $description := trim .Inner " \r\n" | .Page.RenderString | safeHTML -}}
{{- $footer := partial "utilities/GetArgParent" (dict "page" . "arg" "footer") | default "none" -}}
{{- $gutter := partial "utilities/GetArgParent" (dict "page" . "arg" "gutter") | default "0" -}}
{{- $header := partial "utilities/GetArgParent" (dict "page" . "arg" "header") | default "full" -}}
{{- $icon := .Get "icon" -}}
{{- $orientation := partial "utilities/GetArgParent" (dict "page" . "arg" "orientation") | default "stacked" -}}
{{- $padding := partial "utilities/GetArgParent" (dict "page" . "arg" "padding") | default "auto" -}}
{{- $page := .Page -}}
{{- $path := .Get "path" -}}
{{- $thumbnail := .Get "thumbnail" -}}
{{- $title := .Get "title" -}}
<!-- Override arguments -->
{{ if $path }}
{{ $page = $.Site.GetPage $path }}
{{ if not $page }}
@@ -31,67 +37,13 @@
{{ end }}
{{ end }}
{{- $class := partial "utilities/GetArg" (dict "page" . "arg" "class" "merge" true) -}}
{{- $color := partial "utilities/GetArg" (dict "page" . "arg" "color") -}}
{{ if $color }}
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" "body-tertiary" -}}
{{ if not (in $supportedColors $color) -}}
{{ errorf "Invalid value for param 'color': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{ end -}}
{{- $header := partial "utilities/GetArg" (dict "page" . "arg" "header") | default "full" -}}
{{ $supportedKeywords := slice "full" "publication" "tags" "none" -}}
{{ if not (in $supportedKeywords $header) -}}
{{ errorf "Invalid value for param 'header': %s" .Position -}}
{{ end -}}
{{- $footer := partial "utilities/GetArg" (dict "page" . "arg" "footer") | default "none" -}}
{{ if not (in $supportedKeywords $footer) -}}
{{ errorf "Invalid value for param 'footer': %s" .Position -}}
{{ end -}}
{{- $padding := partial "utilities/GetArg" (dict "page" . "arg" "padding") | default "auto" -}}
{{ $supportedPaddings := slice "0" "1" "2" "3" "4" "5" "auto" -}}
{{ if not (in $supportedPaddings $padding) -}}
{{ errorf "Invalid value for param 'padding': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{- $gutter := partial "utilities/GetArg" (dict "page" . "arg" "gutter") | default "0" -}}
{{ $supportedGutters:= slice "0" "1" "2" "3" "4" "5" -}}
{{ if not (in $supportedGutters $gutter) -}}
{{ errorf "Invalid value for param 'gutter': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{- $orientation := partial "utilities/GetArg" (dict "page" . "arg" "orientation") | default "stacked" -}}
{{ $supportedOrientations := slice "stacked" "horizontal" "none" -}}
{{ if not (in $supportedOrientations $orientation) -}}
{{ errorf "Invalid value for param 'orientation': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{- $layout := partial "utilities/GetArg" (dict "page" . "arg" "layout") | default "rich" -}}
{{ $supportedLayouts := slice "rich" "minimal" -}}
{{ if not (in $supportedLayouts $layout) -}}
{{ errorf "Invalid value for param 'layout': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{ $description := trim .Inner " \r\n" | .Page.RenderString | safeHTML }}
{{ $title := .Get "title" | default "" -}}
{{ $alt := .Get "alt" | default "" -}}
{{ $icon := .Get "icon" | default "" -}}
{{ $thumbnail := .Get "thumbnail" | default "" -}}
{{ if .Parent }}
{{ $class = (printf "h-100 %s" $class) }}
{{ end }}
<!-- Main code -->
{{ if not $error -}}
<!-- Render card -->
{{- $output := partial "assets/card.html" (dict
"path" $path
"title" $title
@@ -108,6 +60,7 @@
"alt" $alt
) -}}
<!-- Pass output to parent or current stream -->
{{ with .Parent }}
{{ $current := .Scratch.Get "inner" }}
{{ if $current }}

View File

@@ -15,8 +15,8 @@
{{- $src := .Get "src" | default "" -}}
{{- if $src -}}
{{- $caption := .Get "caption" | default "" -}}
{{- $ratio := partial "utilities/GetArg" (dict "page" . "arg" "ratio") -}}
{{- $portrait := partial "utilities/GetArg" (dict "page" . "arg" "portrait") | default false -}}
{{- $ratio := partial "utilities/GetArgParent" (dict "page" . "arg" "ratio") -}}
{{- $portrait := partial "utilities/GetArgParent" (dict "page" . "arg" "portrait") | default false -}}
{{- $active := eq .Ordinal 0 -}}
{{- $output := partial "assets/carousel-item" (dict
"page" .Page

28
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@gethinode/hinode",
"version": "0.21.11",
"version": "0.22.0-alpha2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@gethinode/hinode",
"version": "0.21.11",
"version": "0.22.0-alpha2",
"license": "MIT",
"devDependencies": {
"@fullhuman/postcss-purgecss": "^5.0.0",
@@ -15,10 +15,10 @@
"autoprefixer": "^10.4.16",
"cssnano": "^6.0.2",
"cssnano-preset-advanced": "^6.0.2",
"eslint": "^8.55.0",
"eslint": "^8.56.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.4.0",
"eslint-plugin-n": "^16.5.0",
"eslint-plugin-promise": "^6.1.1",
"hugo-bin": "^0.117.1",
"markdownlint-cli2": "^0.11.0",
@@ -383,9 +383,9 @@
"dev": true
},
"node_modules/@eslint/js": {
"version": "8.55.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
"integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
"version": "8.56.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -2743,15 +2743,15 @@
}
},
"node_modules/eslint": {
"version": "8.55.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
"integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
"version": "8.56.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.55.0",
"@eslint/js": "8.56.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@@ -2975,9 +2975,9 @@
"dev": true
},
"node_modules/eslint-plugin-n": {
"version": "16.4.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.4.0.tgz",
"integrity": "sha512-IkqJjGoWYGskVaJA7WQuN8PINIxc0N/Pk/jLeYT4ees6Fo5lAhpwGsYek6gS9tCUxgDC4zJ+OwY2bY/6/9OMKQ==",
"version": "16.5.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@gethinode/hinode",
"version": "0.21.11",
"version": "0.22.0-alpha2",
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
"keywords": [
"hugo",
@@ -73,10 +73,10 @@
"autoprefixer": "^10.4.16",
"cssnano": "^6.0.2",
"cssnano-preset-advanced": "^6.0.2",
"eslint": "^8.55.0",
"eslint": "^8.56.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.4.0",
"eslint-plugin-n": "^16.5.0",
"eslint-plugin-promise": "^6.1.1",
"hugo-bin": "^0.117.1",
"markdownlint-cli2": "^0.11.0",