Merge pull request #273 from nunocoracao/dev

🔖 New Release v2.15.0
This commit is contained in:
Nuno Coração 2022-11-24 21:34:14 +00:00 committed by GitHub
commit 551b5812d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 298 additions and 44 deletions

View file

@ -2,4 +2,4 @@
[module.hugoVersion] [module.hugoVersion]
extended = true extended = true
min = "0.87.0 " min = "0.87.0 "
max = "0.106.0" max = "0.107.0"

View file

@ -45,6 +45,7 @@ enableCodeCopy = true
showHero = true showHero = true
heroStyle = "basic" # valid options: basic, big, background heroStyle = "basic" # valid options: basic, big, background
layoutBackgroundBlur = false # only used when heroStyle equals background layoutBackgroundBlur = false # only used when heroStyle equals background
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
showBreadcrumbs = true showBreadcrumbs = true
showDraftLabel = true showDraftLabel = true
showEdit = true showEdit = true
@ -65,6 +66,7 @@ enableCodeCopy = true
[list] [list]
#showHero = true #showHero = true
#heroStyle = "background" # valid options: basic, big, background #heroStyle = "background" # valid options: basic, big, background
#layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
showBreadcrumbs = false showBreadcrumbs = false
showSummary = false showSummary = false
#showViews = true #showViews = true

View file

@ -35,7 +35,10 @@
url = "http://tee.pub/lic/qwSlWVBL5zc" url = "http://tee.pub/lic/qwSlWVBL5zc"
weight = 50 weight = 50
#[[main]]
# name = "Test"
# pageRef = "pagTest"
# weight = 1000
[[main]] [[main]]
identifier = "twitter" identifier = "twitter"

View file

@ -65,6 +65,7 @@ mainSections = ["docs"]
[list] [list]
showHero = true showHero = true
heroStyle = "background" # valid options: basic, big, background heroStyle = "background" # valid options: basic, big, background
layoutBackgroundHeaderSpace = false
showBreadcrumbs = false showBreadcrumbs = false
showSummary = false showSummary = false
showViews = true showViews = true

View file

@ -161,6 +161,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `article.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each article page. | | `article.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each article page. |
| `article.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`. | | `article.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`. |
| `article.layoutBackgroundBlur` | `false` | Makes the background image in the background article heroStyle blur with the scroll | | `article.layoutBackgroundBlur` | `false` | Makes the background image in the background article heroStyle blur with the scroll |
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `article.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the article header. | | `article.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the article header. |
| `article.showDraftLabel` | `true` | Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`. | | `article.showDraftLabel` | `true` | Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`. |
| `article.showEdit` | `false` | Whether or not the link to edit the article content should be displayed. | | `article.showEdit` | `false` | Whether or not the link to edit the article content should be displayed. |
@ -180,6 +181,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `list.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each list page. | | `list.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each list page. |
| `list.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`. | | `list.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`. |
| `list.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the header on list pages. | | `list.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the header on list pages. |
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on list pages. | | `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on list pages. |
| `list.showSummary` | `false` | Whether or not article summaries are displayed on list pages. If a summary is not provided in the [front matter]({{< ref "front-matter" >}}), one will be auto generated using the `summaryLength` parameter in the [site configuration](#site-configuration). | | `list.showSummary` | `false` | Whether or not article summaries are displayed on list pages. If a summary is not provided in the [front matter]({{< ref "front-matter" >}}), one will be auto generated using the `summaryLength` parameter in the [site configuration](#site-configuration). |
| `list.showViews` | `false` | Whether or not list views are displayed. This requires firebase integrations to be enabled, look below. | | `list.showViews` | `false` | Whether or not list views are displayed. This requires firebase integrations to be enabled, look below. |

View file

@ -50,4 +50,5 @@ Front matter parameter default values are inherited from the theme's [base confi
|`series_order`|_Not set_|Number of the article within the series.| |`series_order`|_Not set_|Number of the article within the series.|
|`summary`|Auto generated using `summaryLength` (see [site configuration]({{< ref "configuration#site-configuration" >}}))|When `showSummary` is enabled, this is the Markdown string to be used as the summary for this article.| |`summary`|Auto generated using `summaryLength` (see [site configuration]({{< ref "configuration#site-configuration" >}}))|When `showSummary` is enabled, this is the Markdown string to be used as the summary for this article.|
|`xml`|`true` unless excluded by `sitemap.excludedKinds`|Whether or not this article is included in the generated `/sitemap.xml` file.| |`xml`|`true` unless excluded by `sitemap.excludedKinds`|Whether or not this article is included in the generated `/sitemap.xml` file.|
|`layoutBackgroundHeaderSpace`|`true`|Add space between the header and the body.|
<!-- prettier-ignore-end --> <!-- prettier-ignore-end -->

View file

@ -0,0 +1,19 @@
---
title: "TEST"
date: 2022-06-13T20:55:37+01:00
draft: true
showDate : false
showDateUpdated : false
showHeadingAnchors : false
showPagination : false
showReadingTime : false
showTableOfContents : true
showTaxonomies : false
showWordCount : false
showSummary : false
sharingLinks : false
cardView: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -0,0 +1,7 @@
---
title: "Charts"
date: 2019-03-06
summary: "Blowfish includes Chart.js for powerful charts and data visualisations."
tags: ["chart", "sample", "graph", "shortcodes"]
showDate: false
---

View file

@ -1,5 +1,6 @@
{{ define "main" }} {{ define "main" }}
{{ .Scratch.Set "scope" "list" }}
{{ if .Site.Params.list.showHero | default false }} {{ if .Site.Params.list.showHero | default false }}
{{ $heroStyle := print "partials/hero/" .Site.Params.list.heroStyle ".html" }} {{ $heroStyle := print "partials/hero/" .Site.Params.list.heroStyle ".html" }}
{{ if templates.Exists $heroStyle }} {{ if templates.Exists $heroStyle }}
@ -226,7 +227,6 @@
{{ end }} {{ end }}
{{ end }} {{ end }}
</section> </section>
{{ partial "pagination.html" . }}
{{ end }} {{ end }}
{{ else }} {{ else }}
@ -236,4 +236,8 @@
</p> </p>
</section> </section>
{{ end }} {{ end }}
{{ partial "pagination.html" . }}
{{ end }} {{ end }}

View file

@ -1,4 +1,6 @@
{{ define "main" }} {{ define "main" }}
{{ .Scratch.Set "scope" "single" }}
<article> <article>
{{ if .Params.showHero | default (.Site.Params.article.showHero | default false) }} {{ if .Params.showHero | default (.Site.Params.article.showHero | default false) }}
{{ $heroStyle := print "partials/hero/" .Site.Params.article.heroStyle ".html" }} {{ $heroStyle := print "partials/hero/" .Site.Params.article.heroStyle ".html" }}

View file

@ -2,9 +2,16 @@
{{- $featured := $images.GetMatch "*feature*" -}} {{- $featured := $images.GetMatch "*feature*" -}}
{{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}} {{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}}
{{- if not $featured }}{{ with .Site.Params.defaultBackgroundImage }}{{ $featured = resources.Get . }}{{ end }}{{ end -}} {{- if not $featured }}{{ with .Site.Params.defaultBackgroundImage }}{{ $featured = resources.Get . }}{{ end }}{{ end -}}
{{ $isParentList := eq (.Scratch.Get "scope") "list" }}
{{ $shouldAddHeaderSpace := $.Params.layoutBackgroundHeaderSpace | default (or
(and ($.Site.Params.article.layoutBackgroundHeaderSpace | default true) (not $isParentList))
(and ($.Site.Params.list.layoutBackgroundHeaderSpace | default true) ($isParentList))
) }}
{{- with $featured -}} {{- with $featured -}}
{{ with .Resize "1200x" }} {{ with .Resize "1200x" }}
{{ if $shouldAddHeaderSpace | default true}}
<div id="hero" class="h-[150px] md:h-[200px]"></div> <div id="hero" class="h-[150px] md:h-[200px]"></div>
{{ end }}
<div class="fixed inset-x-0 top-0 h-[800px] single_hero_background nozoom" <div class="fixed inset-x-0 top-0 h-[800px] single_hero_background nozoom"
style="background-image:url({{ .RelPermalink }});"> style="background-image:url({{ .RelPermalink }});">
<div class="absolute inset-0 bg-gradient-to-t from-neutral dark:from-neutral-800 to-transparent mix-blend-normal"> <div class="absolute inset-0 bg-gradient-to-t from-neutral dark:from-neutral-800 to-transparent mix-blend-normal">

View file

@ -1,39 +1,49 @@
{{ $paginator := .Paginator }} {{- if gt .Paginator.TotalPages 1 -}}
{{ if gt $paginator.TotalPages 1 }} <ul class="flex flex-row mt-8 justify-center">
<ul class="flex flex-row mt-8"> {{- .Scratch.Set "paginator.ellipsed" false -}}
{{ if $paginator.HasPrev }} {{ if $.Paginator.HasPrev }}
<li> <li>
<a <a
href="{{ $paginator.Prev.URL }}" href="{{ $.Paginator.Prev.URL }}"
class="mx-1 block min-w-[1.8rem] rounded text-center hover:bg-primary-600 hover:text-neutral" class="mx-1 block min-w-[1.8rem] rounded text-center hover:bg-primary-600 hover:text-neutral"
rel="prev" rel="prev"
> >&larr;</a>
&larr; </li>
</a>
</li>
{{ end }} {{ end }}
{{ range $paginator.Pagers }} {{- range $.Paginator.Pagers -}}
<li> {{- $right := sub .TotalPages .PageNumber -}}
<a {{- $showNumber := or (le .PageNumber 1) (eq $right 0) -}}
href="{{ .URL }}" {{- $showNumber := or $showNumber (and (gt .PageNumber (sub $.Paginator.PageNumber 3)) (lt .PageNumber (add $.Paginator.PageNumber 3))) -}}
class="{{ if eq . $paginator }} {{- if $showNumber -}}
bg-primary-200 dark:bg-primary-400 dark:text-neutral-800 {{- $.Scratch.Set "paginator.ellipsed" false -}}
{{ end }} mx-1 block min-w-[1.8rem] rounded text-center hover:bg-primary-600 hover:text-neutral" {{- $.Scratch.Set "paginator.shouldEllipse" false -}}
> {{- else -}}
{{ .PageNumber }} {{- $.Scratch.Set "paginator.shouldEllipse" (not ($.Scratch.Get "paginator.ellipsed") ) -}}
</a> {{- $.Scratch.Set "paginator.ellipsed" true -}}
{{- end -}}
{{- if $showNumber -}}
<li>
<a
href="{{ .URL }}"
class="{{ if eq . $.Paginator }}
bg-primary-200 dark:bg-primary-400 dark:text-neutral-800
{{ end }} mx-1 block min-w-[1.8rem] rounded text-center hover:bg-primary-600 hover:text-neutral"
>{{ .PageNumber }}</a>
</li> </li>
{{ end }} {{- else if ($.Scratch.Get "paginator.shouldEllipse") -}}
{{ if $paginator.HasNext }} <li class="page-item ">
<li> <span class="page-link" aria-hidden="true">&hellip;</span>
<a </li>
href="{{ $paginator.Next.URL }}" {{- end -}}
{{- end -}}
{{ if $.Paginator.HasNext }}
<li>
<a
href="{{ $.Paginator.Next.URL }}"
class="mx-1 block min-w-[1.8rem] rounded text-center hover:bg-primary-600 hover:text-neutral" class="mx-1 block min-w-[1.8rem] rounded text-center hover:bg-primary-600 hover:text-neutral"
rel="next" rel="next"
> >&rarr;</a>
&rarr; </li>
</a>
</li>
{{ end }} {{ end }}
</ul> </ul>
{{ end }} {{- end -}}

14
package-lock.json generated
View file

@ -21,7 +21,7 @@
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"katex": "^0.16.3", "katex": "^0.16.3",
"mermaid": "^9.2.2", "mermaid": "^9.2.2",
"prettier": "^2.7.1", "prettier": "^2.8.0",
"prettier-plugin-go-template": "^0.0.13", "prettier-plugin-go-template": "^0.0.13",
"prettier-plugin-tailwindcss": "^0.1.13", "prettier-plugin-tailwindcss": "^0.1.13",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
@ -1673,9 +1673,9 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "2.7.1", "version": "2.8.0",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz",
"integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==",
"dev": true, "dev": true,
"bin": { "bin": {
"prettier": "bin-prettier.js" "prettier": "bin-prettier.js"
@ -3300,9 +3300,9 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
}, },
"prettier": { "prettier": {
"version": "2.7.1", "version": "2.8.0",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz",
"integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==",
"dev": true "dev": true
}, },
"prettier-plugin-go-template": { "prettier-plugin-go-template": {

View file

@ -1,6 +1,6 @@
{ {
"name": "hugo-blowfish-theme", "name": "hugo-blowfish-theme",
"version": "2.14.1", "version": "2.15.0",
"description": "Blowfish theme for Hugo", "description": "Blowfish theme for Hugo",
"scripts": { "scripts": {
"fullinstall": "npm run preinstall && npm install && npm run postinstall", "fullinstall": "npm run preinstall && npm install && npm run postinstall",
@ -39,7 +39,7 @@
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"katex": "^0.16.3", "katex": "^0.16.3",
"mermaid": "^9.2.2", "mermaid": "^9.2.2",
"prettier": "^2.7.1", "prettier": "^2.8.0",
"prettier-plugin-go-template": "^0.0.13", "prettier-plugin-go-template": "^0.0.13",
"prettier-plugin-tailwindcss": "^0.1.13", "prettier-plugin-tailwindcss": "^0.1.13",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",