Compare commits

...

23 Commits

Author SHA1 Message Date
Mark Dumay
f5dafb50a8 Merge pull request #206 from gethinode/develop
Bump release version
2023-04-10 14:44:06 +02:00
mark
671cd1f0f2 Bump release version 2023-04-10 14:43:38 +02:00
Mark Dumay
e15052db22 Merge pull request #205 from gethinode/develop
Navbar
2023-04-10 14:42:38 +02:00
mark
6be2bb28f8 Fix #204 2023-04-10 14:16:45 +02:00
mark
31e4161258 Apply small drop shadow for expanded navbar 2023-04-10 14:16:20 +02:00
mark
44d018fa7c Fix invalid value 2023-04-10 14:15:32 +02:00
mark
3a49d0ca73 Adjust divider for collapsed and regular navbar 2023-04-10 14:14:45 +02:00
mark
c5ac3bbd3c Fix indent 2023-04-10 14:10:28 +02:00
Mark Dumay
6fe0df9466 Merge pull request #203 from gethinode/develop
Navbar
2023-04-09 15:20:59 +02:00
mark
2fc134503c Bump release version 2023-04-09 15:14:11 +02:00
mark
f11e98367b Change navbar size 2023-04-09 15:13:31 +02:00
mark
0ad4875ee2 Improve mode selector behavior 2023-04-09 15:13:11 +02:00
mark
a227a01407 Hide language label unless collapsed 2023-04-09 15:12:37 +02:00
mark
a8c8546c23 Add mode param 2023-04-09 15:11:20 +02:00
mark
0aa2a0427b Add mode param 2023-04-09 15:10:27 +02:00
mark
3047f8e937 Support multiple selectors 2023-04-09 15:10:01 +02:00
Mark Dumay
d144bd328c Merge pull request #202 from gethinode/develop
Color mode
2023-04-08 09:09:13 +02:00
mark
8815642bea Bump release version 2023-04-08 08:57:30 +02:00
mark
cb862374fd FIx icon path 2023-04-08 08:56:45 +02:00
mark
60265ce7e8 Fix #200 2023-04-08 08:54:25 +02:00
Mark Dumay
eec1c0954a Update bug_report.md
Add Hinode version
2023-04-07 18:44:14 +02:00
mark
8aa0556298 Move stylesheet to folder 2023-04-06 17:49:53 +02:00
mark
c92c1686cd Remove redundant suffix from main js bundle 2023-04-06 17:29:43 +02:00
15 changed files with 158 additions and 90 deletions

View File

@@ -27,8 +27,9 @@ If applicable, add a copy of Hugo's log messages.
If applicable, add screenshots to help explain your problem.
**Environment (please complete the following information):**
- Host OS: [e.g. macOS Ventura 13.0]
- Node version: [e.g. node v18.10.0]
- Hinode version: [e.g. v0.11.3]
- Host OS: [e.g. macOS Ventura 13.3]
- Node version: [e.g. node v18.15.0]
- Hugo version: [e.g. hugo v0.109.0-47b12b83e636224e5e601813ff3e6790c191e371+extended darwin/amd64 BuildDate=2022-12-23T10:38:11Z VendorInfo=gohugoio]
- Browser: [e.g. Google Chrome Version 108.0.5359.124 (Official Build) (arm64)]

View File

@@ -4,8 +4,6 @@
* Licensed under the Creative Commons Attribution 3.0 Unported License.
*/
{{ if site.Params.main.enableDarkMode }}
(() => {
'use strict'
@@ -30,17 +28,24 @@
setTheme(getPreferredTheme())
const showActiveTheme = theme => {
const activeSelector = document.querySelector('.theme-icon-active')
const activeButton = document.querySelector(`[data-bs-theme-value="${theme}"]`)
const activeIcon = activeButton.querySelector('i')
const activeSelectors = document.querySelectorAll('.theme-icon-active')
const activeButtons = document.querySelectorAll(`[data-bs-theme-value="${theme}"]`)
if (activeButtons.length > 0) {
const activeIcon = activeButtons[0].querySelector('i')
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
element.classList.remove('active')
})
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
element.classList.remove('active')
})
activeSelector.className = activeIcon.className
activeSelector.className = activeSelector.className.replace('theme-icon', 'theme-icon-active')
activeButton.classList.add('active')
for (let i = 0; i < activeSelectors.length; ++i) {
activeSelectors[i].className = activeIcon.className
activeSelectors[i].className = activeSelectors[i].className.replace('theme-icon', 'theme-icon-active')
}
for (let i = 0; i < activeButtons.length; ++i) {
activeButtons[i].classList.add('active')
}
}
}
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
@@ -63,5 +68,3 @@
})
})
})()
{{ end }}

View File

@@ -81,7 +81,7 @@ Source:
// https://discourse.gohugo.io/t/range-length-or-last-element/3803/2
// Note: uses .Site.AllPages as .Site.RegularPages only returns content for the current language
// pages without a title (such as browserconfig.xml) are excluded
{{ $list := where (where .Site.AllPages "Kind" "in" "page") "Title" "!=" "" }}
{{ $list := where (where site.AllPages "Kind" "in" "page") "Title" "!=" "" }}
{{ $len := (len $list) -}}
index.add(

View File

@@ -1,5 +1,6 @@
const navbar = document.querySelector('.navbar')
const toggler = document.getElementById('main-nav-toggler')
const modeSelectors = document.querySelectorAll('.switch-mode-collapsed')
// set the navbar background color to opaque when scrolling past a breakpoint
window.onscroll = () => {
@@ -14,3 +15,10 @@ window.onscroll = () => {
toggler.onclick = () => {
navbar.classList.toggle('navbar-expanded')
}
// invoke the navbar toggler for each mode switcher to collapse the main menu afterwards
for (let i = 0; i < modeSelectors.length; ++i) {
modeSelectors[i].onclick = () => {
toggler.click()
}
}

View File

@@ -1,25 +1,25 @@
// scss-docs-start icons
$form-check-input-checked-bg-image: url("icons/form-check-input-checked-bg-image.svg") !default;
$form-check-radio-checked-bg-image: url("icons/form-check-radio-checked-bg-image.svg") !default;
$form-check-input-indeterminate-bg-image: url("icons/form-check-input-indeterminate-bg-image.svg") !default;
$form-switch-bg-image: url("icons/form-switch-bg-image.svg") !default;
$form-switch-bg-image-dark: url("icons/form-switch-bg-image-dark.svg") !default;
$form-switch-focus-bg-image: url("icons/form-switch-focus-bg-image.svg") !default;
$form-switch-checked-bg-image: url("icons/form-switch-checked-bg-image.svg") !default;
$form-select-indicator: url("icons/form-select-indicator.svg") !default;
$form-select-indicator-dark: url("icons/form-select-indicator-dark.svg") !default;
$form-feedback-icon-valid: url("icons/form-feedback-icon-valid.svg") !default;
$form-feedback-icon-invalid: url("icons/form-feedback-icon-invalid.svg") !default;
$navbar-light-toggler-icon-bg: url("icons/navbar-light-toggler-icon-bg.svg") !default;
$navbar-dark-toggler-icon-bg: url("icons/navbar-dark-toggler-icon-bg.svg") !default;
$accordion-button-icon: url("icons/accordion-button-icon.svg") !default;
$accordion-button-icon-dark: url("icons/accordion-button-icon-dark.svg") !default;
$accordion-button-active-icon: url("icons/accordion-button-active-icon.svg") !default;
$accordion-button-active-icon-dark: url("icons/accordion-button-active-icon-dark.svg") !default;
$carousel-control-prev-icon-bg: url("icons/carousel-control-prev-icon-bg.svg") !default;
$carousel-control-next-icon-bg: url("icons/carousel-control-next-icon-bg.svg") !default;
$btn-close-bg: url("icons/btn-close-bg.svg") !default;
$btn-toggle: url("icons/btn-toggle.svg") !default;
$btn-toggle-dark: url("icons/btn-toggle-dark.svg") !default;
$form-check-input-checked-bg-image: url("/icons/form-check-input-checked-bg-image.svg") !default;
$form-check-radio-checked-bg-image: url("/icons/form-check-radio-checked-bg-image.svg") !default;
$form-check-input-indeterminate-bg-image: url("/icons/form-check-input-indeterminate-bg-image.svg") !default;
$form-switch-bg-image: url("/icons/form-switch-bg-image.svg") !default;
$form-switch-bg-image-dark: url("/icons/form-switch-bg-image-dark.svg") !default;
$form-switch-focus-bg-image: url("/icons/form-switch-focus-bg-image.svg") !default;
$form-switch-checked-bg-image: url("/icons/form-switch-checked-bg-image.svg") !default;
$form-select-indicator: url("/icons/form-select-indicator.svg") !default;
$form-select-indicator-dark: url("/icons/form-select-indicator-dark.svg") !default;
$form-feedback-icon-valid: url("/icons/form-feedback-icon-valid.svg") !default;
$form-feedback-icon-invalid: url("/icons/form-feedback-icon-invalid.svg") !default;
$navbar-light-toggler-icon-bg: url("/icons/navbar-light-toggler-icon-bg.svg") !default;
$navbar-dark-toggler-icon-bg: url("/icons/navbar-dark-toggler-icon-bg.svg") !default;
$accordion-button-icon: url("/icons/accordion-button-icon.svg") !default;
$accordion-button-icon-dark: url("/icons/accordion-button-icon-dark.svg") !default;
$accordion-button-active-icon: url("/icons/accordion-button-active-icon.svg") !default;
$accordion-button-active-icon-dark: url("/icons/accordion-button-active-icon-dark.svg") !default;
$carousel-control-prev-icon-bg: url("/icons/carousel-control-prev-icon-bg.svg") !default;
$carousel-control-next-icon-bg: url("/icons/carousel-control-next-icon-bg.svg") !default;
$btn-close-bg: url("/icons/btn-close-bg.svg") !default;
$btn-toggle: url("/icons/btn-toggle.svg") !default;
$btn-toggle-dark: url("/icons/btn-toggle-dark.svg") !default;
// scss-docs-end icons

View File

@@ -4,13 +4,17 @@
.navbar {
transition: 0.5s ease-in-out;
background-color: none;
background-color: transparent;
}
.nav-active, .navbar-expanded {
background-color: var(--bs-body-bg);
}
.navbar-expanded {
box-shadow: $box-shadow-sm;
}
/* Remove border from toggler */
.navbar-toggler {
border: 0 if($enable-important-utilities, !important, null);

View File

@@ -198,7 +198,7 @@ As an example, the following shortcode displays a light navigation header.
<!-- markdownlint-disable MD037 -->
{{< example lang="hugo" >}}
{{</* navbar path="about" color="primary" size="sm" search="false" menus="sample" title="Brand" */>}}
{{</* navbar path="about" color="primary" size="md" search="false" menus="sample" title="Brand" */>}}
{{< /example >}}
<!-- markdownlint-enable MD037 -->

View File

@@ -198,7 +198,7 @@ De volgende shortcode toont een navigatiemenu.
<!-- markdownlint-disable MD037 -->
{{< example lang="hugo" >}}
{{</* navbar path="about" color="primary" size="sm" search="false" menus="sample" title="Brand" */>}}
{{</* navbar path="about" color="primary" size="md" search="false" menus="sample" title="Brand" */>}}
{{< /example >}}
<!-- markdownlint-enable MD037 -->

View File

@@ -3,12 +3,15 @@
{{ $.Scratch.Set "version" (site.Param (printf "%s.version" .Section)) }}
<!doctype html>
<html lang="{{ .Site.Language.Lang }}" class="no-js" data-bs-theme="dark">
<html lang="{{ .Site.Language.Lang }}" class="no-js">
<head>
{{ block "head" . }}{{ end -}}
</head>
<body>
{{- if site.Params.main.enableDarkMode -}}
{{- partial "footer/scripts.html" (dict "filename" "js/critical.bundle.js" "match" "js/critical/**.js" "page" .) -}}
{{- end -}}
<div class="d-flex flex-column min-vh-100{{ if and .IsHome .Site.Params.home.style }} {{ .Site.Params.home.style }}{{ end }}">
<div class="{{ if .Site.Params.navigation.fixed }}mb-4{{ end }}">
{{- partial "assets/navbar.html" (dict
@@ -54,6 +57,6 @@
{{- partial "footer/footer.html" . -}}
{{ end -}}
{{- partialCached "footer/scripts.html" . -}}
{{- partialCached "footer/scripts.html" (dict "page" .) }}
</body>
</html>

View File

@@ -6,12 +6,47 @@
"fixed" Optional flag to indicate the navbar should stick to the top, defaults to false.
"color" Optional background color of the navbar, either "primary", "secondary", "success",
"danger", "warning", "info", "light", "dark", "white" or "black". The default color is none.
"mode" Optional flag to include a color mode switcher, default is "true" (if dark mode is enabled).
"search" Optional flag to include a search input, default is "true".
"logo" Optional address of the logo image, defaults to the parameter "logo" set in the "main" section of
the site's parameter configuration.
"title" Optional brand title, displayed when the logo is not set. Defaults to the site's title.
-->
<!-- Inline partial to render the color mode switcher -->
{{- define "partials/navbar-mode.html" -}}
{{- $id := .id -}}
{{- $size := .size -}}
{{- $collapsed := .collapsed -}}
<li class="nav-item dropdown {{ if $collapsed }}d-{{ $size }}-none{{ else }}d-none d-{{ $size }}-block{{ end }}">
<a class="nav-link dropdown-toggle" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false" id="navbar-color-theme">
{{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon-active") }} {{ if $collapsed }} {{ T "colorMode" }} {{ end }}
<span class="d-md-none"></span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar-color-theme">
<li>
<a class="dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}" data-bs-theme-value="light" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon") }}
{{ T "colorLight" }}
</a>
</li>
<li>
<a class="dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}" data-bs-theme-value="dark" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas moon theme-icon") }}
{{ T "colorDark" }}
</a>
</li>
<li>
<a class="dropdown-item{{ if $collapsed }} switch-mode-collapsed{{ end }}" data-bs-theme-value="auto" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas circle-half-stroke theme-icon" ) }}
{{ T "colorAuto" }}
</a>
</li>
</ul>
</li>
{{- end -}}
{{- $supportedFlags := slice "true" "false" -}}
{{- $id := 0 -}}
@@ -65,6 +100,15 @@
{{- end -}}
{{- $enableDarkMode := default true site.Params.main.enableDarkMode -}}
{{- with .mode -}}
{{- $darkModeParam := . -}}
{{- if in $supportedFlags $darkModeParam -}}
{{- if eq $darkModeParam "true" }}{{ $enableDarkMode = site.Params.main.enableDarkMode }}{{ else }}{{ $enableDarkMode = false }}{{ end -}}
{{- else -}}
{{- errorf "Invalid value for param 'darkMode': %s" $darkModeParam -}}
{{- end -}}
{{- end -}}
{{- $enableLanguage := or $page.IsTranslated site.IsMultiLingual -}}
{{- $logo := site.Params.navigation.logo -}}
@@ -138,7 +182,7 @@
<li><a class="dropdown-item {{ if $child_active }}active{{ end }}" href="{{ .URL }}">{{ .Name }}</a></li>
{{- end -}}
</ul>
</li>
</li>
{{- else -}}
<li class="nav-item">
{{- $external := ne $url.Host $baseurl.Host -}}
@@ -155,18 +199,22 @@
{{- if or $enableLanguage $enableDarkMode -}}
<li class="nav-item py-2 py-md-1 col-12 col-md-auto">
<li class="nav-item py-2 py-md-1 col-12 col-md-auto d-none d-{{ $size }}-block">
<div class="vr d-none d-md-flex h-100 mx-md-2"></div>
</li>
<li><hr class="dropdown-divider-bg"></li>
{{- end -}}
<!-- Insert language switcher if applicable -->
{{- if $enableLanguage -}}
{{- $currentLang := $page.Language.Lang -}}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<a class="nav-link dropdown-toggle d-{{ $size }}-none" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{- partial "assets/icon.html" (dict "icon" "fas globe") }} {{ T "languageSwitcherLabel" }}
</a>
<a class="nav-link dropdown-toggle d-none d-{{ $size }}-block" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{- partial "assets/icon.html" (dict "icon" "fas globe") }}
</a>
<ul class="dropdown-menu dropdown-menu-end ">
{{- if $page.IsTranslated -}}
{{- range $page.AllTranslations -}}
@@ -183,32 +231,8 @@
<!-- Insert color mode switcher -->
{{- if $enableDarkMode -}}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#!" role="button" data-bs-toggle="dropdown" aria-expanded="false" id="navbar-color-theme">
{{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon-active") }}
<span class="d-md-none"></span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar-color-theme">
<li>
<a class="dropdown-item" data-bs-theme-value="light" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas sun theme-icon") }}
{{ T "colorLight" }}
</a>
</li>
<li>
<a class="dropdown-item" data-bs-theme-value="dark" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas moon theme-icon") }}
{{ T "colorDark" }}
</a>
</li>
<li>
<a class="dropdown-item" data-bs-theme-value="auto" href="#!">
{{- partial "assets/icon.html" (dict "icon" "fas circle-half-stroke theme-icon" ) }}
{{ T "colorAuto" }}
</a>
</li>
</ul>
</li>
{{- partial "partials/navbar-mode.html" (dict "id" $id "size" $size "collapsed" true) -}}
{{- partial "partials/navbar-mode.html" (dict "id" $id "size" $size "collapsed" false) -}}
{{- end -}}
</ul>
</div>

View File

@@ -1,15 +1,20 @@
{{ $filename := "js/main.bundle.js" -}}
{{ if hugo.IsProduction }}{{ $filename = "js/main.bundle.min.js" }}{{ end -}}
{{ $filename := .filename | default "js/main.bundle.js" -}}
{{ $match := .match | default "{js/*.js,js/vendor/**.js}" }}
{{ $page := .page }}
{{ $files := slice -}}
{{ range $index, $file := resources.Match "js/**.js" -}}
{{ range $index, $file := resources.Match $match -}}
{{ $files = $files | append $file -}}
{{ end -}}
{{ $bundle := $files | resources.Concat $filename -}}
{{ $js := $bundle | resources.ExecuteAsTemplate $filename . -}}
{{- if not hugo.IsProduction -}}
<script src="{{ $js.RelPermalink }}"></script>
{{ else -}}
{{ $js = $js | minify | fingerprint -}}
<script src="{{ $js.RelPermalink }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"></script>
{{ if gt (len $files) 0 }}
{{ $bundle := $files | resources.Concat $filename -}}
{{ $js := $bundle | resources.ExecuteAsTemplate $filename $page -}}
{{- if not hugo.IsProduction -}}
<script src="{{ $js.RelPermalink }}"></script>
{{ else -}}
{{ $js = $js | minify | fingerprint -}}
<script src="{{ $js.RelPermalink }}" integrity="{{ $js.Data.Integrity }}" crossorigin="anonymous"></script>
{{ end -}}
{{ end -}}

View File

@@ -15,8 +15,8 @@
"import-fonts" (printf "%t" (not (hasPrefix (lower .Site.Params.style.themeFontPath) "http")))
-}}
{{- $options := (dict "transpiler" "libsass" "targetPath" "main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -}}
{{/*- $options := (dict "transpiler" "dartsass" "targetPath" "main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -*/}}
{{- $options := (dict "transpiler" "libsass" "targetPath" "css/main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -}}
{{/*- $options := (dict "transpiler" "dartsass" "targetPath" "css/main.css" "enableSourceMap" (not hugo.IsProduction) "includePaths" (slice "node_modules") "vars" $vars) -*/}}
{{- if hugo.IsProduction -}}
{{- $options = merge $options (dict "outputStyle" "compressed") -}}
{{- else -}}

View File

@@ -8,12 +8,15 @@
"style" Optional style of the navbar, either "light" (default) or "dark".
"color" Optional background color of the navbar, either "primary", "secondary", "success",
"danger", "warning", "info", "light", "dark", "white" or "black". The default color is none.
"mode" Optional flag to include a color mode switcher, default is "true" (if dark mode is enabled).
"search" Optional flag to include a search input, default is "true".
"logo" Optional address of the logo image.
"title" Optional brand title, displayed when the logo is not set.
-->
{{ $error := false }}
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" -}}
{{ $supportedFlags := slice "true" "false" -}}
{{ $id := add .Ordinal 1 }}
@@ -49,7 +52,6 @@
{{ $color := "" -}}
{{ with .Get "color" }}
{{ $color = . }}
{{ $supportedColors := slice "primary" "secondary" "success" "danger" "warning" "info" "light" "dark" "white" "black" "body" -}}
{{ if not (in $supportedColors $color) -}}
{{ errorf "Invalid value for param 'color': %s" $color -}}
{{ $error = true -}}
@@ -58,12 +60,18 @@
{{ $searchParam := "true" -}}
{{ with .Get "search" }}{{ $searchParam = . }}{{ end -}}
{{ $supportedFlags := slice "true" "false" -}}
{{ if not (in $supportedFlags $searchParam) -}}
{{ errorf "Invalid value for param 'search': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{ $modeParam := "true" -}}
{{ with .Get "mode" }}{{ $modeParam = . }}{{ end -}}
{{ if not (in $supportedFlags $modeParam) -}}
{{ errorf "Invalid value for param 'mode': %s" .Position -}}
{{ $error = true -}}
{{ end -}}
{{ $logo := "" -}}
{{ with .Get "logo" }}{{ $logo = . }}{{ end -}}
@@ -71,5 +79,17 @@
{{ with .Get "title" }}{{ $title = . }}{{ end -}}
{{ if not $error -}}
{{- partial "assets/navbar.html" (dict "id" $id "page" $page "size" $size "style" $style "color" $color "search" $searchParam "menus" $menus "logo" $logo "title" $title) -}}
{{- partial "assets/navbar.html" (dict
"id" $id
"page" $page
"size" $size
"style" $style
"color" $color
"search" $searchParam
"mode" $modeParam
"menus" $menus
"logo" $logo
"title" $title
)
-}}
{{ end -}}

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@gethinode/hinode",
"version": "0.11.4",
"version": "0.11.7",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@gethinode/hinode",
"version": "0.11.4",
"version": "0.11.7",
"license": "MIT",
"devDependencies": {
"@fortawesome/fontawesome-free": "^6.4.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@gethinode/hinode",
"version": "0.11.4",
"version": "0.11.7",
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
"keywords": [
"hugo",