Merge branch 'main' into main

This commit is contained in:
Emruz Hossain 2025-01-14 05:59:57 +06:00 committed by GitHub
commit 3988262f16
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
58 changed files with 3194 additions and 1128 deletions

View file

@ -8,12 +8,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout to latest commit - name: Checkout to latest commit
uses: actions/checkout@v4.1.5 uses: actions/checkout@v4.2.2
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: "15.x" node-version: "20.x"
- name: Run autoprefixer - name: Run autoprefixer
run: | run: |
@ -21,7 +21,7 @@ jobs:
npm run autoprefixer npm run autoprefixer
- name: Create Pull Request - name: Create Pull Request
uses: peter-evans/create-pull-request@v6 uses: peter-evans/create-pull-request@v7
with: with:
branch: autoprefixer branch: autoprefixer
branch-suffix: timestamp branch-suffix: timestamp

View file

@ -39,7 +39,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4.1.5 uses: actions/checkout@v4.2.2
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL

16
.github/workflows/enforce-lablel.yml vendored Normal file
View file

@ -0,0 +1,16 @@
name: Label Enforcer
# Run action on pull request creation, reopening, or label changes
on:
pull_request:
types: [opened, reopened, labeled, unlabeled]
jobs:
# Ensure that PR has desired labels
enforce-label:
runs-on: ubuntu-latest
steps:
- uses: yogevbd/enforce-label-action@2.2.2
with:
REQUIRED_LABELS_ANY: "automerge,breaking-change,bug-fix,enhancement,feature,translation"
REQUIRED_LABELS_ANY_DESCRIPTION: "The PR must have at least one these labels: ['automerge','breaking-change','bug-fix','enhancement','feature','translation']"

View file

@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
# checkout to the commit that has been pushed # checkout to the commit that has been pushed
- uses: actions/checkout@v4.1.5 - uses: actions/checkout@v4.2.2
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v4
@ -35,7 +35,7 @@ jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4.1.5 - uses: actions/checkout@v4.2.2
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v4
@ -73,20 +73,11 @@ jobs:
timeout: 5 timeout: 5
urls: "${{ steps.preview.outputs.url }},${{ steps.preview.outputs.url }}/posts/,${{ steps.preview.outputs.url }}/posts/markdown-sample/,${{ steps.preview.outputs.url }}/posts/shortcodes/" urls: "${{ steps.preview.outputs.url }},${{ steps.preview.outputs.url }}/posts/,${{ steps.preview.outputs.url }}/posts/markdown-sample/,${{ steps.preview.outputs.url }}/posts/shortcodes/"
# Ensure that PR has desired labels
enforce-label:
runs-on: ubuntu-latest
steps:
- uses: yogevbd/enforce-label-action@2.2.2
with:
REQUIRED_LABELS_ANY: "automerge,breaking-change,bug-fix,enhancement,feature,translation"
REQUIRED_LABELS_ANY_DESCRIPTION: "The PR must have at least one these labels: ['automerge','breaking-change','bug-fix','enhancement','feature','translation']"
# Check for any broken links # Check for any broken links
markdown-link-check: markdown-link-check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
# checkout to latest commit # checkout to latest commit
- uses: actions/checkout@v4.1.5 - uses: actions/checkout@v4.2.2
# run markdown linter # run markdown linter
- uses: gaurav-nelson/github-action-markdown-link-check@1.0.15 - uses: gaurav-nelson/github-action-markdown-link-check@1.0.15

View file

@ -38,6 +38,7 @@ A [Hugo](https://gohugo.io/) theme for a personal portfolio with minimalist desi
- counter.dev - counter.dev
- Google Analytics - Google Analytics
- Matomo/Piwik - Matomo/Piwik
- [Umami](https://umami.is/)
- Comment Support - Comment Support
- [Disqus](https://disqus.com/) - [Disqus](https://disqus.com/)
- [Valine](https://valine.js.org/) - [Valine](https://valine.js.org/)
@ -55,6 +56,7 @@ For more details about the features please visit [here](https://toha-guides.netl
- Deutsch - Deutsch
- Español - Español
- 简体中文 - 简体中文
- 繁體中文
- हिन्दी - हिन्दी
- Italiano - Italiano
- 日本語 - 日本語
@ -62,6 +64,7 @@ For more details about the features please visit [here](https://toha-guides.netl
- русский - русский
- suomi - suomi
- Tiếng Việt - Tiếng Việt
- Azerbaijan
- Turkish - Turkish
- Arabic (العربية) - Arabic (العربية)
- Português Europeu - Português Europeu
@ -90,7 +93,7 @@ Here are few screenshots from the [example site](https://hugo-toha.github.io).
## Requirements ## Requirements
- Hugo Version 0.118.0 (extended) or higher - Hugo Version 0.128.0 (extended) or higher
- Go language 1.18 or higher (require for hugo modules) - Go language 1.18 or higher (require for hugo modules)
- Node version v18.x or later and npm 8.x or later. - Node version v18.x or later and npm 8.x or later.
@ -110,7 +113,7 @@ hugo mod init github.com/<your username>/<your repo name>
##### 2. Add this theme as your module dependency ##### 2. Add this theme as your module dependency
Now, in your `config.yaml` file, add a `module` section. Now, in your `hugo.yaml` file, add a `module` section.
```yaml ```yaml
# Use Hugo modules to add theme # Use Hugo modules to add theme
@ -119,7 +122,7 @@ module:
- path: github.com/hugo-toha/toha/v4 - path: github.com/hugo-toha/toha/v4
``` ```
Check this sample [config.yaml](https://github.com/hugo-toha/hugo-toha.github.io/blob/main/config.yaml) for further reference. Check this sample [hugo.yaml](https://github.com/hugo-toha/hugo-toha.github.io/blob/main/hugo.yaml) for further reference.
##### 3. Update your module ##### 3. Update your module
@ -206,7 +209,7 @@ $ npm install
$ hugo server -w $ hugo server -w
``` ```
Now, you can make change in the theme and they will be reflected immediately on the running site. If you need to change any configuration, you can do that in the `config.yaml` file inside `exampleSite` folder. If you need to add any content or data, you can create the respective folder inside `exampleSite` directory and add your desired content or data there. Now, you can make change in the theme and they will be reflected immediately on the running site. If you need to change any configuration, you can do that in the `hugo.yaml` file inside `exampleSite` folder. If you need to add any content or data, you can create the respective folder inside `exampleSite` directory and add your desired content or data there.
#### Running the forked theme against your own site #### Running the forked theme against your own site

View file

@ -0,0 +1,9 @@
let theme = localStorage.getItem('theme-scheme') || localStorage.getItem('darkmode:color-scheme') || 'light'
if (theme === 'system') {
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark'
} else {
theme = 'light'
}
}
document.documentElement.setAttribute('data-theme', theme)

View file

@ -0,0 +1,22 @@
addCopyButtons(navigator.clipboard)
function addCopyButtons(clipboard) {
document.querySelectorAll('pre > code').forEach(function (codeBlock) {
const button = document.createElement('button')
button.title = "Copy"
button.className = 'copy-code-button btn btn-sm'
button.innerHTML = "<i class='fa-regular fa-copy'></i>"
button.addEventListener('click', function () {
clipboard.writeText(codeBlock.innerText)
})
const pre = codeBlock.parentNode
if (pre.parentNode.classList.contains('highlight')) {
const highlight = pre.parentNode
highlight.parentNode.insertBefore(button, highlight)
} else {
pre.parentNode.insertBefore(button, pre)
}
})
}

View file

@ -0,0 +1 @@
import './copyCode'

View file

@ -10,6 +10,10 @@ if (process.env.FEATURE_DARKMODE === '1') {
import('./darkmode') import('./darkmode')
} }
if (process.env.FEATURE_THEME === '1') {
import('./theme')
}
if (process.env.FEATURE_FLOWCHART === '1') { if (process.env.FEATURE_FLOWCHART === '1') {
import('./flowchart') import('./flowchart')
} }
@ -25,3 +29,7 @@ if (process.env.FEATURE_MATH === '1') {
if (process.env.FEATURE_EMBEDPDF === '1') { if (process.env.FEATURE_EMBEDPDF === '1') {
import('./embedpdf') import('./embedpdf')
} }
if (process.env.FEATURE_COPYCODEBUTTON === '1') {
import('./copyCode')
}

View file

@ -0,0 +1,88 @@
import * as params from '@params';
const PERSISTENCE_KEY = 'theme-scheme'
const themeOptions = params.theme || {}
const THEME_DARK = typeof themeOptions.dark === 'undefined' ? true : themeOptions.dark;
const THEME_LIGHT = typeof themeOptions.light === 'undefined' ? true : themeOptions.light;
const THEME_DEFAULT = typeof themeOptions.default === 'undefined' ? "system" : themeOptions.default;
window.addEventListener('load', async () => {
const menu = document.getElementById('themeMenu')
const $icon = document.getElementById('navbar-theme-icon-svg')
if (menu == null || $icon == null) return
const btns = menu.getElementsByTagName('a')
const iconMap = Array.from(btns).reduce((map, btn) => {
const $img = btn.getElementsByTagName('img')[0]
map[btn.dataset.scheme] = $img.src
return map
}, {})
function checkScheme(scheme) {
if (THEME_LIGHT === false) return "dark"
if (THEME_DARK === false) return "light"
return scheme
}
function loadScheme() {
return localStorage.getItem(PERSISTENCE_KEY) || loadDefaultScheme()
}
function loadDefaultScheme() {
return THEME_DEFAULT || "system"
}
function saveScheme(scheme) {
localStorage.setItem(PERSISTENCE_KEY, scheme)
}
function getPreferredColorScheme() {
const isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches;
return isDarkMode ? "dark" : "light";
}
function setScheme(newScheme) {
let theme = newScheme
if (newScheme === 'system') {
theme = getPreferredColorScheme()
}
// set data-theme attribute on html tag
document.querySelector("html").dataset.theme = theme;
// update icon
$icon.src = iconMap[newScheme]
// save preference to local storage
saveScheme(newScheme)
setImages(theme)
}
const checkedScheme = checkScheme(loadScheme())
setScheme(checkedScheme)
Array.from(menu.getElementsByTagName('a')).forEach((btn) => {
btn.addEventListener('click', () => {
const { scheme } = btn.dataset
setScheme(scheme)
})
})
})
function setImages(newScheme) {
const els = Array.from(document.getElementsByClassName('logo-holder'));
for (const el of els) {
const light = el.querySelector('.light-logo');
const dark = el.querySelector('.dark-logo');
if (newScheme === "dark" && dark !== null) {
if (light !== null) light.style.display = 'none'
dark.style.display = 'inline'
}
else {
if (light !== null) light.style.display = 'inline'
if (dark !== null) dark.style.display = 'none'
}
}
}

View file

@ -7,7 +7,7 @@ window.addEventListener('DOMContentLoaded', () => {
const fuseOptions = { const fuseOptions = {
shouldSort: true, shouldSort: true,
includeMatches: true, includeMatches: true,
threshold: 0.0, threshold: 0.1,
tokenize: true, tokenize: true,
location: 0, location: 0,
distance: 100, distance: 100,

View file

@ -4,4 +4,5 @@ import './sidebar'
import './education' import './education'
import './achievements' import './achievements'
import './projects' import './projects'
import './skills'
import './publications' import './publications'

View file

@ -0,0 +1,15 @@
import Filterizr from 'filterizr'
document.addEventListener('DOMContentLoaded', () => {
// ================== Skill cards =====================
// setup skill filter buttons
const skillCardHolder = document.getElementById('skill-card-holder')
if (skillCardHolder != null && skillCardHolder.children.length !== 0) {
// eslint-disable-next-line no-new
new Filterizr('.filtr-skills', {
layout: 'sameWidth',
controlsSelector: '.skill-filtr-control'
})
}
})

View file

@ -102,6 +102,40 @@
} }
} }
.copy-code-button {
float: right;
margin-top: 0.5em;
margin-left: -2.6em;
margin-right: 3em;
background-color: get-light-color('text-color') !important;
color: get-light-color('inverse-text-color') !important;
padding: 0.25rem 0.5rem;
line-height: 1.5;
border-radius: 0.2rem;
border: none;
&:hover,
&:focus {
background-color: get-light-color('accent-color') !important;
color: get-light-color('text-over-accent-color') !important;
@include transition();
}
&:focus {
&::before {
content: 'Copied!';
position: absolute;
padding: 0.3em;
border-radius: 0.2em;
margin-left: -5em;
margin-top: -0.2em;
background-color: get-light-color('accent-color') !important;
color: get-light-color('text-over-accent-color') !important;
@include transition();
}
}
}
html[data-theme='dark'] { html[data-theme='dark'] {
.btn-dark { .btn-dark {
background-color: get-dark-color('accent-color') !important; background-color: get-dark-color('accent-color') !important;
@ -169,4 +203,15 @@ html[data-theme='dark'] {
background-color: get-dark-color('hover-over-accent-color') !important; background-color: get-dark-color('hover-over-accent-color') !important;
} }
} }
.copy-code-button {
background-color: get-dark-color('bg-primary') !important;
color: get-dark-color('muted-text-color') !important;
&:hover,
&:focus,
&::before {
background-color: get-dark-color('accent-color') !important;
color: get-dark-color('text-over-accent-color') !important;
}
}
} }

View file

@ -9,6 +9,11 @@
box-shadow: $box-shadow; box-shadow: $box-shadow;
border: 1px solid get-light-color('bg-primary'); border: 1px solid get-light-color('bg-primary');
@include transition(); @include transition();
.card-img-top {
transform: scale(1.2);
object-fit: cover;
@include transition();
}
} }
.card-head { .card-head {
@ -17,12 +22,17 @@
overflow: hidden; overflow: hidden;
} }
.card-title {
font-size: large;
}
.card-body { .card-body {
text-align: justify; text-align: left;
} }
.card-img-top { .card-img-top {
object-fit: cover; -o-object-fit: cover;
object-fit: cover;
@include transition(); @include transition();
} }
@ -61,7 +71,8 @@
&:focus { &:focus {
.card-img-top { .card-img-top {
transform: scale(1.2); transform: scale(1.2);
object-fit: cover; -o-object-fit: cover;
object-fit: cover;
@include transition(); @include transition();
} }
} }

View file

@ -8,7 +8,8 @@ a {
&:hover, &:hover,
&:focus { &:focus {
text-decoration: get-light-color('hover-over-accent-color') underline; -webkit-text-decoration: get-light-color('hover-over-accent-color') underline;
text-decoration: get-light-color('hover-over-accent-color') underline;
color: get-light-color('hover-over-accent-color'); color: get-light-color('hover-over-accent-color');
@include transition(); @include transition();
} }
@ -66,7 +67,8 @@ html[data-theme='dark'] {
&:hover, &:hover,
&:focus { &:focus {
text-decoration: get-dark-color('hover-over-accent-color') underline; -webkit-text-decoration: get-dark-color('hover-over-accent-color') underline;
text-decoration: get-dark-color('hover-over-accent-color') underline;
color: get-dark-color('hover-over-accent-color'); color: get-dark-color('hover-over-accent-color');
} }
} }

View file

@ -96,6 +96,10 @@ html[data-theme='dark'] {
} }
} }
.gist { .gist {
&::-moz-selection{
background: get-dark-color('text-color');
color: get-dark-color('inverse-text-color');
}
&::selection{ &::selection{
background: get-dark-color('text-color'); background: get-dark-color('text-color');
color: get-dark-color('inverse-text-color'); color: get-dark-color('inverse-text-color');

View file

@ -12,7 +12,7 @@ strong {
p { p {
color: get-light-color('text-color'); color: get-light-color('text-color');
text-align: justify; text-align: left;
text-justify: inter-word; text-justify: inter-word;
} }
@ -72,7 +72,8 @@ html[data-theme='dark'] {
h2, h2,
h3, h3,
h4, h4,
h5 { h5,
h6 {
color: get-dark-color('heading-color'); color: get-dark-color('heading-color');
} }

View file

@ -1,6 +1,6 @@
// in Hugo, Page kind can be either "section" or "page". /* in Hugo, Page kind can be either "section" or "page".*/
// if it is section, then it's a page with a list of items, for example /posts /* if it is section, then it's a page with a list of items, for example /posts*/
// if it is page, then it is a single page. /* if it is page, then it is a single page.*/
body.kind-section, body.kind-section,
body.kind-term, body.kind-term,
body.kind-page { body.kind-page {

View file

@ -53,7 +53,6 @@ body {
ol > ol, ol > ol,
li > ol, li > ol,
li > ul { li > ul {
-webkit-padding-start: 1rem;
padding-inline-start: 1rem; padding-inline-start: 1rem;
} }
} }

View file

@ -229,6 +229,11 @@ html[data-theme='dark'] {
border-left: 2px solid get-dark-color('accent-color'); border-left: 2px solid get-dark-color('accent-color');
} }
} }
.custom-section {
.custom-content {
color: get-dark-color('text-color');
}
}
} }
} }
} }

View file

@ -13,7 +13,8 @@
@include transition(); @include transition();
&:hover { &:hover {
margin-left: 5px; margin-left: 5px;
text-decoration: get-light-color('muted-text-color') underline; -webkit-text-decoration: get-light-color('muted-text-color') underline;
text-decoration: get-light-color('muted-text-color') underline;
@include transition(); @include transition();
} }
} }
@ -79,7 +80,8 @@ html[data-theme='dark'] {
a { a {
color: get-dark-color('muted-text-color'); color: get-dark-color('muted-text-color');
&:hover { &:hover {
text-decoration: get-dark-color('muted-text-color') underline; -webkit-text-decoration: get-dark-color('muted-text-color') underline;
text-decoration: get-dark-color('muted-text-color') underline;
} }
} }
@ -95,6 +97,10 @@ html[data-theme='dark'] {
background-color: get-dark-color('bg-primary'); background-color: get-dark-color('bg-primary');
&:focus { &:focus {
background-color: get-dark-color('bg-secondary'); background-color: get-dark-color('bg-secondary');
color: get-dark-color('text-color');
}
&::placeholder {
color: get-dark-color('muted-text-color');
} }
} }

View file

@ -42,7 +42,4 @@
@keyframes spin { @keyframes spin {
to { -webkit-transform: rotate(360deg); } to { -webkit-transform: rotate(360deg); }
} }
@-webkit-keyframes spin {
to { -webkit-transform: rotate(360deg); }
}
} }

View file

@ -24,6 +24,14 @@
float: right !important; float: right !important;
} }
} }
a[href] {
text-decoration: underline; /* Underline only when href is present */
}
a:not([href]) {
text-decoration: none; /* No underline when href is absent */
}
} }
.card-body { .card-body {

View file

@ -1,6 +1,6 @@
flags: flags:
styles: styles:
- flag-icon-css/css/flag-icons - flag-icons/css/flag-icons
videoplayer: videoplayer:
services: services:

View file

@ -1,10 +1,10 @@
module github.com/hugo-toha/toha/exampleSite module github.com/hugo-toha/toha/exampleSite
go 1.19 go 1.21
require (
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240319164719-d8a7e99b594d // indirect
github.com/hugo-toha/toha/v4 v4.4.0 // indirect
)
replace github.com/hugo-toha/toha/v4 => ../ replace github.com/hugo-toha/toha/v4 => ../
require (
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20241018183051-dd13c36f46b4 // indirect
github.com/hugo-toha/toha/v4 v4.7.0 // indirect
)

View file

@ -1,4 +1,2 @@
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240319164719-d8a7e99b594d h1:TWNaAG2e1EZDvtl64fjyriR/qc8m7qaKnN13DgKzkFk= github.com/hugo-toha/hugo-toha.github.io v0.0.0-20241018183051-dd13c36f46b4 h1:Yc5SJ5NJx1xu3YO2gQZPeADXqhGdJgUGWiDxgEDuUrQ=
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240319164719-d8a7e99b594d/go.mod h1:BRsZS1LeIc+eSM2OWSOeXDNeZUNRcTlJtw1bL874AfQ= github.com/hugo-toha/hugo-toha.github.io v0.0.0-20241018183051-dd13c36f46b4/go.mod h1:3N7k1DSQGy5Zn5IVp5nQ3QJ/VWh5dSxXO6stUS7txrg=
github.com/hugo-toha/toha/v4 v4.4.0 h1:RdRpjfsPgE+VXb/m3Rl+1n86pVZTrplsDvtXYK3wNh0=
github.com/hugo-toha/toha/v4 v4.4.0/go.mod h1:p/K34lqlqmhzfPd4cx66od7sjlROBqhMxG30mJz+aKQ=

View file

@ -22,7 +22,7 @@ module:
mounts: mounts:
- source: static/files - source: static/files
target: static/files target: static/files
- source: ./node_modules/flag-icon-css/flags - source: ./node_modules/flag-icons/flags
target: static/flags target: static/flags
- source: ./node_modules/@fontsource/mulish/files - source: ./node_modules/@fontsource/mulish/files
target: static/files target: static/files
@ -93,7 +93,20 @@ params:
# Enable dark theme # Enable dark theme
darkMode: darkMode:
# [Deprecated] Enable dark theme
# This is a deprecated setting, but has not been removed to maintain backward compatibility
# If `theme` is set, the `darkMode` setting will be discarded.
# darkMode:
# enable: true
# Configure theme color settings
theme:
enable: true enable: true
services:
light: true # enable light theme. default "true"
dark: true # enable dark theme. default "true"
default: system # can be either light, dark or system. default "system"
# Enable and configure portfolio # Enable and configure portfolio
portfolio: portfolio:
@ -174,7 +187,16 @@ params:
# matomo: # matomo:
# instance: matomo.example.com # instance: matomo.example.com
# siteId: 1 # Or any other number # siteId: 1 # Or any other number
# # Umami
# umami:
# scheme: https
# instance: umami.example.com
# id: <your umami site id>
# # Statcounter
# statcounter:
# project: 1234567890
# invisible: 1
# security: deadbeef
# Enable Support # Enable Support
support: support:
enable: false enable: false
@ -269,7 +291,11 @@ params:
plyr: plyr:
# options doc: https://github.com/sampotts/plyr#options # options doc: https://github.com/sampotts/plyr#options
# fullscreen: true # fullscreen: true
# Enables copy code button
copyCodeButton:
enable: true
# Enable reading time support in post cards and in post pages # Enable reading time support in post cards and in post pages
readingTime: readingTime:
enable: true enable: true

File diff suppressed because it is too large Load diff

View file

@ -15,7 +15,7 @@
"eslint-plugin-promise": "github.com/hugo-toha/toha/v4", "eslint-plugin-promise": "github.com/hugo-toha/toha/v4",
"feather-icons": "github.com/hugo-toha/toha/v4", "feather-icons": "github.com/hugo-toha/toha/v4",
"filterizr": "github.com/hugo-toha/toha/v4", "filterizr": "github.com/hugo-toha/toha/v4",
"flag-icon-css": "github.com/hugo-toha/toha/v4", "flag-icons": "github.com/hugo-toha/toha/v4",
"fuse.js": "github.com/hugo-toha/toha/v4", "fuse.js": "github.com/hugo-toha/toha/v4",
"highlight.js": "github.com/hugo-toha/toha/v4", "highlight.js": "github.com/hugo-toha/toha/v4",
"imagesloaded": "github.com/hugo-toha/toha/v4", "imagesloaded": "github.com/hugo-toha/toha/v4",
@ -30,11 +30,10 @@
"postcss-cli": "github.com/hugo-toha/toha/v4" "postcss-cli": "github.com/hugo-toha/toha/v4"
} }
}, },
"dependencies": {},
"devDependencies": { "devDependencies": {
"@fontsource/mulish": "4.5.13", "@fontsource/mulish": "4.5.13",
"@fortawesome/fontawesome-free": "^6.2.0", "@fortawesome/fontawesome-free": "^6.6.0",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.20",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"eslint": "^8.31.0", "eslint": "^8.31.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
@ -45,19 +44,19 @@
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-promise": "^6.1.1",
"feather-icons": "^4.29.1", "feather-icons": "^4.29.1",
"filterizr": "^2.2.4", "filterizr": "^2.2.4",
"flag-icon-css": "^4.1.7", "flag-icons": "^7.2.3",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"highlight.js": "^11.6.0", "highlight.js": "^11.6.0",
"imagesloaded": "^5.0.0", "imagesloaded": "^5.0.0",
"include-media": "^1.4.10", "include-media": "^1.4.10",
"ityped": "^1.0.3", "ityped": "^1.0.3",
"katex": "^0.16.10", "katex": "^0.16.11",
"mark.js": "^8.11.1", "mark.js": "^8.11.1",
"mermaid": "^9.2.1", "mermaid": "^11.4.1",
"plyr": "^3.7.2", "plyr": "^3.7.2",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",
"postcss": "^8.4.21", "postcss": "^8.4.41",
"postcss-cli": "^8.3.1" "postcss-cli": "^11.0.0"
}, },
"name": "exampleSite", "name": "exampleSite",
"version": "0.1.0" "version": "0.1.0"

2
go.mod
View file

@ -1,3 +1,3 @@
module github.com/hugo-toha/toha/v4 module github.com/hugo-toha/toha/v4
go 1.19 go 1.21

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240730212302-83b19f7bd3b7 h1:RRonNzaf6/Ou9PqfXeKiRywkd+9KY7SVgfGBQXqXshM=
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240730212302-83b19f7bd3b7/go.mod h1:yWw1t3trnfzv4t1lA9zh5pSsI0+kqqyg58ir8/kt6zk=

View file

@ -1,6 +1,6 @@
module: module:
hugoVersion: hugoVersion:
min: "0.118.0" min: "0.128.0"
extended: true extended: true
mounts: mounts:
- source: content - source: content
@ -17,7 +17,7 @@ module:
target: i18n target: i18n
- source: archetypes - source: archetypes
target: archetypes target: archetypes
- source: ../../node_modules/flag-icon-css/flags - source: ../../node_modules/flag-icons/flags
target: static/flags target: static/flags
- source: ../../node_modules/@fontsource/mulish/files - source: ../../node_modules/@fontsource/mulish/files
target: static/files target: static/files

130
i18n/az.toml Normal file
View file

@ -0,0 +1,130 @@
# More documentation here: https://github.com/nicksnyder/go-i18n
[home]
other = "Əsas Səhifə"
[posts]
other = "Yazılar"
[toc_heading]
other = "Məzmun Cədvəli"
[tags]
other = "Etiketlər"
[categories]
other = "Kateqoriyalar"
[at]
other = ","
[resume]
other = "CV"
[navigation]
other = "Menyu"
[contact_me]
other = "Əlaqə:"
[email]
other = "E-Poçt"
[phone]
other = "Telefon"
[newsletter_text]
other = "Yeni məzmunlardan xəbərdar olmaq üçün E-Poçt ünvanınızı daxil edin."
[newsletter_input_placeholder]
other = "E-Poçt ünvanını daxil edin."
[newsletter_warning]
other = "E-Poçt ünvanınızı daxil etsəniz, bu veb saytın xəbər bülletenini almağı qəbul etmiş olursunuz."
[submit]
other = "Təsdiqlə"
[hugoAttributionText]
other = ""
[prev]
other = "Əvvəlki"
[next]
other = "Sonraki"
[share_on]
other = "Paylaş"
[improve_this_page]
other = "Bu səhifəyə töhfə verin"
[out_of]
other = "/"
[publications]
other = "Akademik Nəşrlər"
[taken_courses]
other = "Keçirilmiş Kurslar"
[course_name]
other = "Kursun Adı"
[total_credit]
other = "Ümumi Kredit"
[obtained_credit]
other = "Qazandırılmış Kredit"
[extracurricular_activities]
other = "Kursdankənar Fəaliyyətlər"
[show_more]
other = "Daha Çox Göstər"
[show_less]
other = "Gizlət"
[responsibilities]
other = "Məsuliyyətlər:"
[present]
other = "Hal-hazırda"
[comments_javascript]
other = "Görmək üçün xahiş edirəm JavaScript-i aktiv edin"
[comments_by]
other = "Şərh edən"
[read]
other = "Oxu"
[project_star]
other = "Ulduz"
[project_details]
other = "Təfərrüatlar"
[err_404]
other = "Axtardığınız səhifə tapılmadı."
[more]
other = "Daha Çox"
[view_certificate]
other = "Sertifikatı Görüntülə"
[notes]
other = "Qeydlər"
[disclaimer_text]
other = "Məsuliyyət İnkarı"
[search]
other = "Axtar"
[minute]
one = "dəqiqə"
other = "dəqiqə"

View file

@ -96,7 +96,7 @@ other = "heute"
other = "Bitte aktiviere JavaScript um die Kommentare zu sehen" other = "Bitte aktiviere JavaScript um die Kommentare zu sehen"
[comments_by] [comments_by]
other = "Kommentare Unterstützt von" other = "Kommentare unterstützt von"
[read] [read]
other = "Lesen" other = "Lesen"
@ -124,3 +124,7 @@ other = "Haftungshinweis"
[search] [search]
other = "Suche" other = "Suche"
[minute]
one = "Minute"
other = "Minuten"

View file

@ -93,16 +93,16 @@ other = "Sorumluluklar:"
other = "Halen" other = "Halen"
[comments_javascript] [comments_javascript]
other = "Görüntüleyebilmek için lüften Javascript etkinleştirin" other = "Görüntüleyebilmek için lüften JavaScript etkinleştirin"
[comments_by] [comments_by]
other = "comments powered by" other = "Yorum sağlayıcı"
[read] [read]
other = "Oku" other = "Oku"
[project_star] [project_star]
other = "Star" other = "Yıldız"
[project_details] [project_details]
other = "Detaylar" other = "Detaylar"
@ -124,3 +124,7 @@ other = "Yükümlülük Bildirisi"
[search] [search]
other = "Ara" other = "Ara"
[minute]
one = "dakika"
other = "dakika"

View file

@ -124,3 +124,7 @@ other = "免责声明"
[search] [search]
other = "搜索" other = "搜索"
[minute]
one = "分钟"
other = "分钟"

View file

@ -9,10 +9,10 @@ other = "文章"
other = "目錄" other = "目錄"
[tags] [tags]
other = "标签" other = "標籤"
[categories] [categories]
other = "类别" other = "類別"
[at] [at]
other = "at" other = "at"
@ -42,7 +42,7 @@ other = "在此輸入您的電子郵件地址"
other = "輸入您的電子郵件地址,即表示您同意接受本網站的最新消息" other = "輸入您的電子郵件地址,即表示您同意接受本網站的最新消息"
[submit] [submit]
other = "提交" other = "送出"
[hugoAttributionText] [hugoAttributionText]
other = "Powered by" other = "Powered by"
@ -63,10 +63,10 @@ other = "改善此頁面"
other = "/" other = "/"
[publications] [publications]
other = "出版" other = "著作"
[taken_courses] [taken_courses]
other = "修習課程" other = "修課內容"
[course_name] [course_name]
other = "課程名稱" other = "課程名稱"
@ -123,4 +123,8 @@ other = "筆記"
other = "免責聲明" other = "免責聲明"
[search] [search]
other = "搜索" other = "搜尋"
[minute]
one = "分鐘"
other = "分鐘"

View file

@ -11,17 +11,11 @@
<!--================= add analytics if enabled =========================--> <!--================= add analytics if enabled =========================-->
{{- partial "analytics.html" . -}} {{- partial "analytics.html" . -}}
<script> {{ with resources.Get "scripts/core/theme-scheme.js" | fingerprint }}
theme = localStorage.getItem('darkmode:color-scheme') || 'system'; <script integrity="{{.Data.Integrity}}">
if (theme == 'system') { {{ .Content | safeJS }}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
}
document.documentElement.setAttribute('data-theme', theme);
</script> </script>
{{ end }}
</head> </head>
<body class="type-{{ .Page.Type }} kind-{{ .Page.Kind }}" data-bs-spy="scroll" data-bs-target="#TableOfContents" data-bs-offset="80"> <body class="type-{{ .Page.Type }} kind-{{ .Page.Kind }}" data-bs-spy="scroll" data-bs-target="#TableOfContents" data-bs-offset="80">

View file

@ -1,5 +1,8 @@
{{ define "header" }} {{ define "header" }}
<meta name="description" content="{{ if .Description }}{{ .Description }}{{ else }}{{ .Title }}{{ end }}" /> <meta name="description" content="{{ if .Description }}{{ .Description }}{{ else }}{{ .Title }}{{ end }}" />
{{ with .Params.relcanonical }}
<link rel="canonical" href="{{ . | relLangURL }}" itemprop="url" />
{{ end }}
{{ end }} {{ end }}
{{ define "navbar" }} {{ define "navbar" }}
@ -45,7 +48,7 @@
{{ else }} {{ else }}
<div style="margin-bottom: 80px;"></div> <div style="margin-bottom: 80px;"></div>
{{ end }} {{ end }}
<div class="title"> <div class="title">
<h1>{{ .Page.Title }}</h1> <h1>{{ .Page.Title }}</h1>
</div> </div>

View file

@ -17,17 +17,11 @@
<!--================= add analytics if enabled =========================--> <!--================= add analytics if enabled =========================-->
{{- partial "analytics.html" . -}} {{- partial "analytics.html" . -}}
<script> {{ with resources.Get "scripts/core/theme-scheme.js" | fingerprint }}
theme = localStorage.getItem('darkmode:color-scheme') || 'system'; <script integrity="{{.Data.Integrity}}">
if (theme == 'system') { {{ .Content | safeJS }}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
}
document.documentElement.setAttribute('data-theme', theme);
</script> </script>
{{ end }}
</head> </head>
<body data-bs-spy="scroll" data-bs-target="#top-navbar" data-bs-offset="100"> <body data-bs-spy="scroll" data-bs-target="#top-navbar" data-bs-offset="100">

View file

@ -2,55 +2,78 @@
{{ with site.Params.features.analytics }} {{ with site.Params.features.analytics }}
{{ if or .enable .enabled }} {{ if or .enable .enabled }}
{{ with .services }} {{ with .services }}
<!-- Google Analytics --> <!-- Google Analytics -->
{{ with .google }} {{ with .google }}
{{ $privacyConfig:= dict (slice "Site" "Config" "Privacy" "GoogleAnalytics") $.Site.Config.Privacy.GoogleAnalytics }} {{ partial "google_analytics.html" . }}
{{ $analyticsConfig := dict (slice "Site" "Config" "Services" "GoogleAnalytics" "ID") .id }} {{ end }}
{{ template "_internal/google_analytics.html" (merge $privacyConfig $analyticsConfig) }}
{{ end }}
<!-- Counter.dev --> <!-- Counter.dev -->
{{ with .counterDev }} {{ with .counterDev }}
<script src="https://cdn.counter.dev/script.js" <script src="https://cdn.counter.dev/script.js"
data-id="{{ .id }}" data-id="{{ .id }}"
data-utcoffset="1" data-utcoffset="1"
></script> ></script>
{{ end }} {{ end }}
<!-- GoatCounter --> <!-- GoatCounter -->
{{ with .goatCounter }} {{ with .goatCounter }}
{{ with .code }} {{ with .code }}
<script data-goatcounter="https://{{ . }}.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script> <script data-goatcounter="https://{{ . }}.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
{{ else }} {{ else }}
<script data-goatcounter="https://{{ .instance }}/count" async src="https://{{ .instance }}/count.js"></script> <script data-goatcounter="https://{{ .instance }}/count" async src="https://{{ .instance }}/count.js"></script>
{{ end }} {{ end }}
{{ end }} {{ end }}
<!-- Piwik/Matomo --> <!-- Piwik/Matomo -->
{{ with .matomo }} {{ with .matomo }}
<!-- Matomo --> <!-- Matomo -->
<script> <script>
var _paq = window._paq = window._paq || []; var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']); _paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']); _paq.push(['enableLinkTracking']);
(function() { (function() {
var u="//{{ .instance }}/"; var u="//{{ .instance }}/";
_paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '{{ .siteId }}']); _paq.push(['setSiteId', '{{ .siteId }}']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})(); })();
</script>
{{ end }}
{{ with .cloudflare }}
<!-- Cloudflare Web Analytics -->
<script defer src='https://static.cloudflareinsights.com/beacon.min.js'
data-cf-beacon='{"token": "{{ .token }}"}'
></script>
<!-- End Cloudflare Web Analytics -->
{{ end }}
{{ with .umami }}
<!-- Umami analytics -->
<script defer src='{{ or .scheme "https" }}://{{ or .instance "analytics.eu.umami.is" }}/script.js' data-website-id="{{ .id }}"></script>
<!-- End Umami analytics -->
{{end}}
{{ with .statcounter }}
<!-- Statcounter analytics -->
<script type="text/javascript" src="https://www.statcounter.com/counter/counter.js" async></script>
<script type="text/javascript">
var sc_project = {{ .project }};
var sc_invisible = {{ .invisible }};
var sc_security = "{{ .security }}";
var scJsHost = (("https:" == document.location.protocol) ?
"https://www.statcounter.com/js/" : "https://www.statcounter.com/js/");
</script> </script>
{{ end }} <noscript>
<div class="statcounter"><a title="web counter" href="https://statcounter.com/" target="_blank"><img
{{ with .cloudflare }} class="statcounter" src="https://c.statcounter.com/{{ .project }}/0/{{ .security }}/{{ .invisible }}/"
<!-- Cloudflare Web Analytics --> alt="web counter" referrerPolicy="no-referrer-when-downgrade"></a></div>
<script defer src='https://static.cloudflareinsights.com/beacon.min.js' <!-- End of Statcounter Code -->
data-cf-beacon='{"token": "{{ .token }}"}' </noscript>
></script> <!-- End Statcounter analytics -->
<!-- End Cloudflare Web Analytics --> {{ end }}
{{ end }}
{{ end }} {{ end }}
{{ end }} {{ end }}
{{ end }} {{ end }}

View file

@ -8,7 +8,7 @@
<div class="card-body"> <div class="card-body">
<a href="{{ .RelPermalink | relLangURL }}" class="post-card-link"> <a href="{{ .RelPermalink | relLangURL }}" class="post-card-link">
<h5 class="card-title">{{ .Title }}</h5> <h5 class="card-title">{{ .Title }}</h5>
<p class="card-text post-summary">{{ .Summary }}</p> <p class="card-text post-summary">{{ .Summary | plainify }}</p>
</a> </a>
{{ if and site.Params.features.tags.enable site.Params.features.tags.on_card }} {{ if and site.Params.features.tags.enable site.Params.features.tags.on_card }}
{{ partial "misc/tags.html" .Params.tags }} {{ partial "misc/tags.html" .Params.tags }}

View file

@ -4,34 +4,48 @@
> >
<div class="card mt-1"> <div class="card mt-1">
<div class="card"> <div class="card">
<a class="card-header" href="{{ if .repo }}{{ .repo }}{{ else if .url }}{{ .url }}{{ else }}javascript:void(0){{ end }}" {{ if or .repo .url }}target="_blank" rel="noopener"{{ end }}> <a href="{{ if .repo }}{{ .repo }}{{ else if .url }}{{ .url }}{{ else }}javascript:void(0){{ end }}" {{ if or .repo .url }}target="_blank" rel="noopener"{{ end }}>
<div> {{ if .image }}
<div class="d-flex"> <div class="card-head">
{{ if .logo }} {{ $imageImage:= resources.Get .image}}
{{ if $imageImage }}
{{ if eq (len (findRE ".*/.*" .logo) ) 0 }} {{/* svg don't support "Fit" operation */}}
{{ if ne $imageImage.MediaType.SubType "svg" }}
<i style="padding-right: 0.25em" class="{{.logo}} h4"></i> {{ $imageImage = $imageImage.Fit "1000x1000" }}
{{ else }}
{{ $logoImage:= resources.Get .logo}}
{{ if $logoImage }}
{{/* svg don't support "Fit" operation */}}
{{ if ne $logoImage.MediaType.SubType "svg" }}
{{ $logoImage = $logoImage.Fit "24x24" }}
{{ end }}
<img class="card-img-xs" src="{{ $logoImage.RelPermalink }}" alt="{{ .name }}" />
{{ end }}
{{ end }}
{{ end }} {{ end }}
<img class="card-img-top" src="{{ $imageImage.RelPermalink }}" alt="{{ .name }}" />
<h5 class="card-title mb-0">{{ .name }}</h5> {{ end }}
</div> </div>
<div class="sub-title"> {{ end }}
<span>{{ .role }}</span> <div class="card-header">
<span>{{ .timeline }}</span> <div>
<div class="d-flex">
{{ if .logo }}
{{ if eq (len (findRE ".*/.*" .logo) ) 0 }}
<i style="padding-right: 0.25em" class="{{.logo}} h4"></i>
{{ else }}
{{ $logoImage:= resources.Get .logo}}
{{ if $logoImage }}
{{/* svg don't support "Fit" operation */}}
{{ if ne $logoImage.MediaType.SubType "svg" }}
{{ $logoImage = $logoImage.Fit "24x24" }}
{{ end }}
<img class="card-img-xs" src="{{ $logoImage.RelPermalink }}" alt="{{ .name }}" />
{{ end }}
{{ end }}
{{ end }}
<h5 class="card-title mb-0">{{ .name }}</h5>
</div>
<div class="sub-title">
<span>{{ .role }}</span>
<span>{{ .timeline }}</span>
</div>
</div> </div>
</div> </div>
</a> </a>

View file

@ -11,12 +11,22 @@
<div class="card-header"> <div class="card-header">
<h5 class="card-title mb-0">{{ .title }}</h5> <h5 class="card-title mb-0">{{ .title }}</h5>
<div class="sub-title"> <div class="sub-title">
<span><a class="" href="{{.publishedIn.url}}">{{ .publishedIn.name }}</a></span> <span>
{{ if .publishedIn.url }}
<a class="" href="{{.publishedIn.url}}">{{ .publishedIn.name }}</a>
{{ else }}
<a class="">{{ .publishedIn.name }}</a>
{{ end }}
</span>
<span class="ms-2">{{ .publishedIn.date }}</span> <span class="ms-2">{{ .publishedIn.date }}</span>
</div> </div>
<div class="authors"> <div class="authors">
{{ range $index,$author:= .authors }} {{ range $index,$author:= .authors }}
{{if .url}}
<span class="me-2"><a class="" href="{{.url}}">{{ .name }}</a></span> <span class="me-2"><a class="" href="{{.url}}">{{ .name }}</a></span>
{{ else }}
<span class="me-2"><a class="">{{ .name }}</a></span>
{{ end }}
{{ end }} {{ end }}
</div> </div>
</div> </div>
@ -31,9 +41,11 @@
</span> </span>
{{ end }} {{ end }}
</div> </div>
{{ if .paper.url }}
<div class="details-btn"> <div class="details-btn">
<a class="btn btn-outline-info ms-1 ps-2 mb-2" href="{{ .paper.url }}" target="_blank" rel="noopener" role="button">{{ i18n "project_details"}}</a> <a class="btn btn-outline-info ms-1 ps-2 mb-2" href="{{ .paper.url }}" target="_blank" rel="noopener" role="button">{{ i18n "project_details"}}</a>
</div> </div>
{{ end }}
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,4 +1,6 @@
<div class="col-xs-12 col-sm-6 col-lg-4 pt-2"> <div class="col-xs-12 col-sm-6 col-lg-4 pt-2 filtr-item"
data-category='all, {{ with .categories }}{{ delimit . ","}}{{ end }}'
>
<a class="text-decoration-none" {{ if .url }}href="{{ .url }}" title="{{ .name }}" target="_blank" rel="noopener"{{ end }}> <a class="text-decoration-none" {{ if .url }}href="{{ .url }}" title="{{ .name }}" target="_blank" rel="noopener"{{ end }}>
<div class="card"> <div class="card">
<div class="card-head d-flex"> <div class="card-head d-flex">
@ -18,7 +20,7 @@
<h5 class="card-title">{{ .name }}</h5> <h5 class="card-title">{{ .name }}</h5>
{{ end }} {{ end }}
</div> </div>
<div class="card-body"> <div class="card-body text-justify pt-1 pb-1">
<p class="card-text">{{ .summary | markdownify }}</p> <p class="card-text">{{ .summary | markdownify }}</p>
</div> </div>
</div> </div>

View file

@ -0,0 +1,22 @@
{{ if site.Params.features.analytics.enabled }}
{{- with site.Params.features.analytics.services.google.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 }}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ . }}"></script>
<script>
var doNotTrack = false;
if ({{ site.Params.features.analytics.services.google.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', '{{ . }}');
}
</script>
{{- end }}
{{- end }}
{{- end -}}

View file

@ -69,15 +69,26 @@ params:
# id: foo # id: foo
# name: bar # name: bar
# The `darkMode` feature # [Deprecated] The `darkMode` feature
darkmode: # This is a deprecated setting, but has not been removed to maintain backward compatibility
# If `theme` is set, the `darkMode` setting will be discarded.
darkMode:
enable: true enable: true
# The `theme` feature
theme:
enable: true
services:
light: true # enable light theme. default "true"
dark: true # enable dark theme. default "true"
default: system # can be either light, dark or system. default "system"
This helper will convert the above config into the following env vars: This helper will convert the above config into the following env vars:
* `FEATURE_ANALYTICS=1` * `FEATURE_ANALYTICS=1`
* `FEATURE_ANALYTICS_GOOGLE=1` * `FEATURE_ANALYTICS_GOOGLE=1`
* `FEATURE_DARKMODE=1` * `FEATURE_DARKMODE=1`
* `FEATURE_THEME=1`
In JS, you can use it like this: In JS, you can use it like this:

View file

@ -7,5 +7,5 @@
{{- $scss := $template | resources.ExecuteAsTemplate "styles/application.scss" . -}} {{- $scss := $template | resources.ExecuteAsTemplate "styles/application.scss" . -}}
{{/* Bundle application.scss */}} {{/* Bundle application.scss */}}
{{- $bundle := $scss | resources.ToCSS $options | fingerprint -}} {{- $bundle := $scss | css.Sass $options | fingerprint -}}
<link rel="stylesheet" href="{{ $bundle.RelPermalink }}" integrity="{{ $bundle.Data.Integrity }}" /> <link rel="stylesheet" href="{{ $bundle.RelPermalink }}" integrity="{{ $bundle.Data.Integrity }}" />

View file

@ -6,16 +6,16 @@
<a class="nav-link dropdown-toggle" href="#" id="languageSelector" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="nav-link dropdown-toggle" href="#" id="languageSelector" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ if ne site.Params.features.flags.enable false }} {{ if ne site.Params.features.flags.enable false }}
{{ $countryCode := partial "helpers/country-code.html" . }} {{ $countryCode := partial "helpers/country-code.html" . }}
<span class="flag-icon flag-icon-{{$countryCode}}"></span> <span class="fi fi-{{$countryCode}}"></span>
{{ end }} {{ end }}
{{ site.Language.LanguageName }} {{ site.Language.LanguageName }}
</a> </a>
<div class="dropdown-menu" aria-labelledby="languageSelector"> <div class="dropdown-menu" aria-labelledby="languageSelector">
{{ range site.Home.AllTranslations }} {{ range site.Home.AllTranslations }}
<a class="dropdown-item nav-link languages-item" href="{{ path.Join "/" (cond (eq .Language.Lang $.Sites.First.Language.Lang) "" .Language.Lang) $pageURL }}"> <a class="dropdown-item nav-link languages-item" href="{{ path.Join "/" (cond (eq .Language.Lang $.Sites.Default.Language.Lang) "" .Language.Lang) $pageURL }}">
{{ if ne site.Params.features.flags.enable false }} {{ if ne site.Params.features.flags.enable false }}
{{ $countryCode := partial "helpers/country-code.html" . }} {{ $countryCode := partial "helpers/country-code.html" . }}
<span class="flag-icon flag-icon-{{$countryCode}}"></span> <span class="fi fi-{{$countryCode}}"></span>
{{ end }} {{ end }}
{{ .Language.LanguageName }} {{ .Language.LanguageName }}
</a> </a>

View file

@ -1,6 +1,8 @@
{{/* variables for enabling/disabling various features */}} {{/* variables for enabling/disabling various features */}}
{{ $blogEnabled := site.Params.features.blog.enable | default false }} {{ $blogEnabled := site.Params.features.blog.enable | default false }}
{{ $blogTitle := site.Params.features.blog.title | default (i18n "posts") }}
{{ $notesEnabled := site.Params.features.notes.enable | default false }} {{ $notesEnabled := site.Params.features.notes.enable | default false }}
{{ $notesTitle := site.Params.features.notes.title | default (i18n "notes") }}
{{ $maxVisibleSections := site.Params.topNavbar.maxVisibleSections | default 5 }} {{ $maxVisibleSections := site.Params.topNavbar.maxVisibleSections | default 5 }}
{{/* keep backward compatibility for blog post */}} {{/* keep backward compatibility for blog post */}}
@ -121,12 +123,12 @@
{{ end }} {{ end }}
{{ if $blogEnabled }} {{ if $blogEnabled }}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" id="blog-link" href="{{ path.Join (site.BaseURL | relLangURL) "posts" }}">{{ i18n "posts" }}</a> <a class="nav-link" id="blog-link" href="{{ path.Join (site.BaseURL | relLangURL) "posts" }}">{{ $blogTitle }}</a>
</li> </li>
{{ end }} {{ end }}
{{ if $notesEnabled }} {{ if $notesEnabled }}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" id="note-link" href="{{ path.Join (site.BaseURL | relLangURL) "notes" }}">{{ i18n "notes" }}</a> <a class="nav-link" id="note-link" href="{{ path.Join (site.BaseURL | relLangURL) "notes" }}">{{ $notesTitle }}</a>
</li> </li>
{{ end }} {{ end }}
{{ range $customMenus }} {{ range $customMenus }}
@ -139,7 +141,7 @@
{{ if .IsTranslated }} {{ if .IsTranslated }}
{{ partial "navigators/lang-selector.html" . }} {{ partial "navigators/lang-selector.html" . }}
{{ end }} {{ end }}
{{ if site.Params.features.darkMode.enable }} {{ if or site.Params.features.darkMode.enable site.Params.features.theme.enable }}
{{ partial "navigators/theme-selector.html" . }} {{ partial "navigators/theme-selector.html" . }}
{{ end }} {{ end }}
</ul> </ul>

View file

@ -1,17 +1,31 @@
{{/* variables for enabling/disabling various features */}}
{{ $darkEnabled := true }}
{{ $lightEnabled := true }}
{{ if site.Params.features.theme.enable }}
{{ $darkEnabled = site.Params.features.theme.services.dark | default true }}
{{ $lightEnabled = site.Params.features.theme.services.light | default true }}
{{ end }}
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="themeSelector" role="button" <a class="nav-link dropdown-toggle" href="#" id="themeSelector" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img id="navbar-theme-icon-svg" class="theme-icon" src="{{ "icons/moon-svgrepo-com.svg" | relURL }}" width=20 alt="Dark Theme"> <img id="navbar-theme-icon-svg" class="theme-icon" src="{{ "icons/moon-svgrepo-com.svg" | relURL }}" width=20 alt="Dark Theme">
</a> </a>
<div id="themeMenu" class="dropdown-menu dropdown-menu-icons-only" aria-labelledby="themeSelector"> <div id="themeMenu" class="dropdown-menu dropdown-menu-icons-only" aria-labelledby="themeSelector">
{{ if $lightEnabled }}
<a class="dropdown-item nav-link" href="#" data-scheme="light"> <a class="dropdown-item nav-link" href="#" data-scheme="light">
<img class="theme-icon" src="{{ "icons/sun-svgrepo-com.svg" | relURL }}" width=20 alt="Light Theme"> <img class="theme-icon" src="{{ "icons/sun-svgrepo-com.svg" | relURL }}" width=20 alt="Light Theme">
</a> </a>
{{ end }}
{{ if $darkEnabled }}
<a class="dropdown-item nav-link" href="#" data-scheme="dark"> <a class="dropdown-item nav-link" href="#" data-scheme="dark">
<img class="theme-icon" src="{{ "icons/moon-svgrepo-com.svg" | relURL }}" width=20 alt="Dark Theme"> <img class="theme-icon" src="{{ "icons/moon-svgrepo-com.svg" | relURL }}" width=20 alt="Dark Theme">
</a> </a>
{{ end }}
{{ if and $lightEnabled $darkEnabled }}
<a class="dropdown-item nav-link" href="#" data-scheme="system"> <a class="dropdown-item nav-link" href="#" data-scheme="system">
<img class="theme-icon" src="{{ "icons/computer-svgrepo-com.svg" | relURL }}" width=20 alt="System Theme"> <img class="theme-icon" src="{{ "icons/computer-svgrepo-com.svg" | relURL }}" width=20 alt="System Theme">
</a> </a>
{{ end }}
</div> </div>
</li> </li>

View file

@ -3,7 +3,7 @@
{{ $sectionID = .section.id }} {{ $sectionID = .section.id }}
{{ end }} {{ end }}
<div class="container-fluid anchor pb-5 skills-section"> <div class="container-fluid anchor pb-5 skills-section" id="{{ $sectionID }}">
{{ if not (.section.hideTitle) }} {{ if not (.section.hideTitle) }}
<h1 class="text-center"> <h1 class="text-center">
<span id="{{ $sectionID }}"></span>{{ .section.name }}</h1> <span id="{{ $sectionID }}"></span>{{ .section.name }}</h1>
@ -11,11 +11,25 @@
<h1 class="text-center" style="display: none"> <h1 class="text-center" style="display: none">
<span id="{{ $sectionID }}"></span>{{ .section.name }}</h1> <span id="{{ $sectionID }}"></span>{{ .section.name }}</h1>
{{ end }} {{ end }}
<div class="container d-flex-block"> {{ if .section.filter }}
<div class="row" id="primary-skills"> <div class="container ms-auto text-center">
{{ range .skills }} <div class="btn-group flex-wrap" role="group" id="skill-filter-buttons">
{{ partial "cards/skill.html" . }} {{ range .buttons }}
<button type="button" class="btn btn-dark skill-filtr-control" data-filter="{{ .filter }}">
{{ .name }}
</button>
{{ end }} {{ end }}
</div> </div>
</div> </div>
<div class="container d-flex-block filtr-skills">
<div class="row" id="skill-card-holder" style="margin-left:unset">
{{ else }}
<div class="container d-flex-block">
<div class="row" id="primary-skills">
{{ end }}
{{ range .skills }}
{{ partial "cards/skill.html" . }}
{{ end }}
</div>
</div>
</div> </div>

View file

@ -5,34 +5,34 @@ publish = "exampleSite/public"
[context.production.environment] [context.production.environment]
HUGO_ENABLEGITINFO = "true" HUGO_ENABLEGITINFO = "true"
HUGO_ENV = "production" HUGO_ENV = "production"
HUGO_VERSION = "0.124.0" HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.11.1" NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.5.0" NPM_VERSION = "10.8.3"
[context.split1] [context.split1]
command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify --enableGitInfo" command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify --enableGitInfo"
[context.split1.environment] [context.split1.environment]
HUGO_ENV = "production" HUGO_ENV = "production"
HUGO_VERSION = "0.124.0" HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.11.1" NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.5.0" NPM_VERSION = "10.8.3"
[context.deploy-preview] [context.deploy-preview]
command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL" command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL"
[context.deploy-preview.environment] [context.deploy-preview.environment]
HUGO_VERSION = "0.124.0" HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.11.1" NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.5.0" NPM_VERSION = "10.8.3"
[context.branch-deploy] [context.branch-deploy]
command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify -b $DEPLOY_PRIME_URL" command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify -b $DEPLOY_PRIME_URL"
[context.branch-deploy.environment] [context.branch-deploy.environment]
HUGO_VERSION = "0.124.0" HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.11.1" NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.5.0" NPM_VERSION = "10.8.3"
[context.next.environment] [context.next.environment]
HUGO_ENABLEGITINFO = "true" HUGO_ENABLEGITINFO = "true"

2049
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -19,7 +19,7 @@
}, },
"homepage": "https://github.com/hugo-toha/toha#readme", "homepage": "https://github.com/hugo-toha/toha#readme",
"devDependencies": { "devDependencies": {
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.20",
"eslint": "^8.31.0", "eslint": "^8.31.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
"eslint-config-standard": "^17.0.0", "eslint-config-standard": "^17.0.0",
@ -27,18 +27,18 @@
"eslint-plugin-n": "^15.6.0", "eslint-plugin-n": "^15.6.0",
"eslint-plugin-no-jquery": "^2.7.0", "eslint-plugin-no-jquery": "^2.7.0",
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-promise": "^6.1.1",
"postcss": "^8.4.31", "postcss": "^8.4.41",
"postcss-cli": "^8.3.1", "postcss-cli": "^11.0.0",
"@fontsource/mulish": "4.5.13", "@fontsource/mulish": "4.5.13",
"@fortawesome/fontawesome-free": "^6.2.0", "@fortawesome/fontawesome-free": "^6.6.0",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"filterizr": "^2.2.4", "filterizr": "^2.2.4",
"flag-icon-css": "^4.1.7", "flag-icons": "^7.2.3",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"highlight.js": "^11.6.0", "highlight.js": "^11.6.0",
"imagesloaded": "^5.0.0", "imagesloaded": "^5.0.0",
"ityped": "^1.0.3", "ityped": "^1.0.3",
"katex": "^0.16.10", "katex": "^0.16.11",
"mark.js": "^8.11.1", "mark.js": "^8.11.1",
"mermaid": "^9.2.1", "mermaid": "^9.2.1",
"plyr": "^3.7.2", "plyr": "^3.7.2",

View file

@ -19,7 +19,7 @@
"eslint-plugin-promise": "project", "eslint-plugin-promise": "project",
"feather-icons": "project", "feather-icons": "project",
"filterizr": "project", "filterizr": "project",
"flag-icon-css": "project", "flag-icons": "project",
"fuse.js": "project", "fuse.js": "project",
"highlight.js": "project", "highlight.js": "project",
"imagesloaded": "project", "imagesloaded": "project",
@ -38,8 +38,8 @@
"description": "A [Hugo](https://gohugo.io/) theme for a personal portfolio with minimalist design and responsiveness.", "description": "A [Hugo](https://gohugo.io/) theme for a personal portfolio with minimalist design and responsiveness.",
"devDependencies": { "devDependencies": {
"@fontsource/mulish": "4.5.13", "@fontsource/mulish": "4.5.13",
"@fortawesome/fontawesome-free": "^6.2.0", "@fortawesome/fontawesome-free": "^6.6.0",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.20",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"eslint": "^8.31.0", "eslint": "^8.31.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
@ -50,19 +50,19 @@
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-promise": "^6.1.1",
"feather-icons": "^4.29.1", "feather-icons": "^4.29.1",
"filterizr": "^2.2.4", "filterizr": "^2.2.4",
"flag-icon-css": "^4.1.7", "flag-icons": "^7.2.3",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"highlight.js": "^11.6.0", "highlight.js": "^11.6.0",
"imagesloaded": "^5.0.0", "imagesloaded": "^5.0.0",
"include-media": "^1.4.10", "include-media": "^1.4.10",
"ityped": "^1.0.3", "ityped": "^1.0.3",
"katex": "^0.16.10", "katex": "^0.16.11",
"mark.js": "^8.11.1", "mark.js": "^8.11.1",
"mermaid": "^9.2.1", "mermaid": "^9.2.1",
"plyr": "^3.7.2", "plyr": "^3.7.2",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",
"postcss": "^8.4.31", "postcss": "^8.4.41",
"postcss-cli": "^8.3.1" "postcss-cli": "^11.0.0"
}, },
"homepage": "https://github.com/hugo-toha/toha#readme", "homepage": "https://github.com/hugo-toha/toha#readme",
"license": "MIT", "license": "MIT",

View file

@ -44,4 +44,4 @@ features = [
[module] [module]
[module.hugoVersion] [module.hugoVersion]
extended = true extended = true
min = "0.118.0" min = "0.128.0"