Merge branch 'main' of github.com:maiani/toha

This commit is contained in:
Andrea Maiani 2024-12-09 10:49:31 +01:00
commit 82b08ccd5e
53 changed files with 3093 additions and 1069 deletions

View file

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

View file

@ -39,7 +39,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4.1.7
uses: actions/checkout@v4.2.2
# Initializes the CodeQL tools for scanning.
- 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
steps:
# checkout to the commit that has been pushed
- uses: actions/checkout@v4.1.7
- uses: actions/checkout@v4.2.2
- name: Setup Node
uses: actions/setup-node@v4
@ -35,7 +35,7 @@ jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.7
- uses: actions/checkout@v4.2.2
- name: Setup Node
uses: actions/setup-node@v4
@ -73,20 +73,11 @@ jobs:
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/"
# 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
markdown-link-check:
runs-on: ubuntu-latest
steps:
# checkout to latest commit
- uses: actions/checkout@v4.1.7
- uses: actions/checkout@v4.2.2
# run markdown linter
- uses: gaurav-nelson/github-action-markdown-link-check@1.0.15

View file

@ -56,6 +56,7 @@ For more details about the features please visit [here](https://toha-guides.netl
- Deutsch
- Español
- 简体中文
- 繁體中文
- हिन्दी
- Italiano
- 日本語
@ -63,6 +64,7 @@ For more details about the features please visit [here](https://toha-guides.netl
- русский
- suomi
- Tiếng Việt
- Azerbaijan
- Turkish
- Arabic (العربية)
- Português Europeu
@ -91,7 +93,7 @@ Here are few screenshots from the [example site](https://hugo-toha.github.io).
## 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)
- Node version v18.x or later and npm 8.x or later.

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')
}
if (process.env.FEATURE_THEME === '1') {
import('./theme')
}
if (process.env.FEATURE_FLOWCHART === '1') {
import('./flowchart')
}
@ -25,3 +29,7 @@ if (process.env.FEATURE_MATH === '1') {
if (process.env.FEATURE_EMBEDPDF === '1') {
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 = {
shouldSort: true,
includeMatches: true,
threshold: 0.0,
threshold: 0.1,
tokenize: true,
location: 0,
distance: 100,

View file

@ -4,4 +4,5 @@ import './sidebar'
import './education'
import './achievements'
import './projects'
import './skills'
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'] {
.btn-dark {
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;
}
}
.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;
border: 1px solid get-light-color('bg-primary');
@include transition();
.card-img-top {
transform: scale(1.2);
object-fit: cover;
@include transition();
}
}
.card-head {
@ -17,12 +22,17 @@
overflow: hidden;
}
.card-title {
font-size: large;
}
.card-body {
text-align: justify;
text-align: left;
}
.card-img-top {
object-fit: cover;
-o-object-fit: cover;
object-fit: cover;
@include transition();
}
@ -61,7 +71,8 @@
&:focus {
.card-img-top {
transform: scale(1.2);
object-fit: cover;
-o-object-fit: cover;
object-fit: cover;
@include transition();
}
}

View file

@ -8,7 +8,8 @@ a {
&:hover,
&: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');
@include transition();
}
@ -66,7 +67,8 @@ html[data-theme='dark'] {
&:hover,
&: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');
}
}

View file

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

View file

@ -12,7 +12,7 @@ strong {
p {
color: get-light-color('text-color');
text-align: justify;
text-align: left;
text-justify: inter-word;
}

View file

@ -1,6 +1,6 @@
// 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 page, then it is a single 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 page, then it is a single page.*/
body.kind-section,
body.kind-term,
body.kind-page {

View file

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

View file

@ -13,7 +13,8 @@
@include transition();
&:hover {
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();
}
}
@ -79,7 +80,8 @@ html[data-theme='dark'] {
a {
color: get-dark-color('muted-text-color');
&: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');
&:focus {
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 {
to { -webkit-transform: rotate(360deg); }
}
@-webkit-keyframes spin {
to { -webkit-transform: rotate(360deg); }
}
}

View file

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

View file

@ -5,6 +5,6 @@ go 1.21
replace github.com/hugo-toha/toha/v4 => ../
require (
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240510202502-b4192719c87f // indirect
github.com/hugo-toha/toha/v4 v4.5.0 // indirect
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,2 +1,2 @@
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240510202502-b4192719c87f h1:EpJlxR6ruHtcBIHLVlmfgpoPGAjpAvopGq8h1wscEwY=
github.com/hugo-toha/hugo-toha.github.io v0.0.0-20240510202502-b4192719c87f/go.mod h1:0gXAIE/H9B3kwsNvyqXXP0gTLCzi/DKwoIOz8Bb9j9c=
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-20241018183051-dd13c36f46b4/go.mod h1:3N7k1DSQGy5Zn5IVp5nQ3QJ/VWh5dSxXO6stUS7txrg=

View file

@ -22,7 +22,7 @@ module:
mounts:
- source: static/files
target: static/files
- source: ./node_modules/flag-icon-css/flags
- source: ./node_modules/flag-icons/flags
target: static/flags
- source: ./node_modules/@fontsource/mulish/files
target: static/files
@ -93,7 +93,20 @@ params:
# Enable dark theme
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
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
portfolio:
@ -179,7 +192,11 @@ params:
# scheme: https
# instance: umami.example.com
# id: <your umami site id>
# # Statcounter
# statcounter:
# project: 1234567890
# invisible: 1
# security: deadbeef
# Enable Support
support:
enable: false
@ -274,7 +291,11 @@ params:
plyr:
# options doc: https://github.com/sampotts/plyr#options
# fullscreen: true
# Enables copy code button
copyCodeButton:
enable: true
# Enable reading time support in post cards and in post pages
readingTime:
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",
"feather-icons": "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",
"highlight.js": "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"
}
},
"dependencies": {},
"devDependencies": {
"@fontsource/mulish": "4.5.13",
"@fortawesome/fontawesome-free": "^6.2.0",
"autoprefixer": "^10.4.13",
"@fortawesome/fontawesome-free": "^6.6.0",
"autoprefixer": "^10.4.20",
"bootstrap": "^5.3.3",
"eslint": "^8.31.0",
"eslint-config-prettier": "^8.6.0",
@ -45,19 +44,19 @@
"eslint-plugin-promise": "^6.1.1",
"feather-icons": "^4.29.1",
"filterizr": "^2.2.4",
"flag-icon-css": "^4.1.7",
"flag-icons": "^7.2.3",
"fuse.js": "^6.6.2",
"highlight.js": "^11.6.0",
"imagesloaded": "^5.0.0",
"include-media": "^1.4.10",
"ityped": "^1.0.3",
"katex": "^0.16.10",
"katex": "^0.16.11",
"mark.js": "^8.11.1",
"mermaid": "^9.2.1",
"mermaid": "^11.4.1",
"plyr": "^3.7.2",
"popper.js": "^1.16.1",
"postcss": "^8.4.31",
"postcss-cli": "^8.3.1"
"postcss": "^8.4.41",
"postcss-cli": "^11.0.0"
},
"name": "exampleSite",
"version": "0.1.0"

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:
hugoVersion:
min: "0.122.0"
min: "0.128.0"
extended: true
mounts:
- source: content
@ -17,7 +17,7 @@ module:
target: i18n
- source: archetypes
target: archetypes
- source: ../../node_modules/flag-icon-css/flags
- source: ../../node_modules/flag-icons/flags
target: static/flags
- source: ../../node_modules/@fontsource/mulish/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"
[comments_by]
other = "Kommentare Unterstützt von"
other = "Kommentare unterstützt von"
[read]
other = "Lesen"
@ -124,3 +124,7 @@ other = "Haftungshinweis"
[search]
other = "Suche"
[minute]
one = "Minute"
other = "Minuten"

View file

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

View file

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

View file

@ -11,17 +11,11 @@
<!--================= add analytics if enabled =========================-->
{{- partial "analytics.html" . -}}
<script>
theme = localStorage.getItem('darkmode:color-scheme') || 'system';
if (theme == 'system') {
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
}
document.documentElement.setAttribute('data-theme', theme);
{{ with resources.Get "scripts/core/theme-scheme.js" | fingerprint }}
<script integrity="{{.Data.Integrity}}">
{{ .Content | safeJS }}
</script>
{{ end }}
</head>
<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" }}
<meta name="description" content="{{ if .Description }}{{ .Description }}{{ else }}{{ .Title }}{{ end }}" />
{{ with .Params.relcanonical }}
<link rel="canonical" href="{{ . | relLangURL }}" itemprop="url" />
{{ end }}
{{ end }}
{{ define "navbar" }}
@ -45,7 +48,7 @@
{{ else }}
<div style="margin-bottom: 80px;"></div>
{{ end }}
<div class="title">
<h1>{{ .Page.Title }}</h1>
</div>

View file

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

View file

@ -4,9 +4,7 @@
{{ with .services }}
<!-- Google Analytics -->
{{ with .google }}
{{ $privacyConfig:= dict (slice "Site" "Config" "Privacy" "GoogleAnalytics") $.Site.Config.Privacy.GoogleAnalytics }}
{{ $analyticsConfig := dict (slice "Site" "Config" "Services" "GoogleAnalytics" "ID") .id }}
{{ template "_internal/google_analytics.html" (merge $privacyConfig $analyticsConfig) }}
{{ partial "google_analytics.html" . }}
{{ end }}
<!-- Counter.dev -->
@ -57,6 +55,25 @@
<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>
<noscript>
<div class="statcounter"><a title="web counter" href="https://statcounter.com/" target="_blank"><img
class="statcounter" src="https://c.statcounter.com/{{ .project }}/0/{{ .security }}/{{ .invisible }}/"
alt="web counter" referrerPolicy="no-referrer-when-downgrade"></a></div>
<!-- End of Statcounter Code -->
</noscript>
<!-- End Statcounter analytics -->
{{ end }}
{{ end }}
{{ end }}
{{ end }}

View file

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

View file

@ -4,34 +4,48 @@
>
<div class="card mt-1">
<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 }}>
<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 }}
<a href="{{ if .repo }}{{ .repo }}{{ else if .url }}{{ .url }}{{ else }}javascript:void(0){{ end }}" {{ if or .repo .url }}target="_blank" rel="noopener"{{ end }}>
{{ if .image }}
<div class="card-head">
{{ $imageImage:= resources.Get .image}}
{{ if $imageImage }}
{{/* svg don't support "Fit" operation */}}
{{ if ne $imageImage.MediaType.SubType "svg" }}
{{ $imageImage = $imageImage.Fit "1000x1000" }}
{{ end }}
<h5 class="card-title mb-0">{{ .name }}</h5>
</div>
<div class="sub-title">
<span>{{ .role }}</span>
<span>{{ .timeline }}</span>
<img class="card-img-top" src="{{ $imageImage.RelPermalink }}" alt="{{ .name }}" />
{{ end }}
</div>
{{ end }}
<div class="card-header">
<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>
</a>

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 }}>
<div class="card">
<div class="card-head d-flex">
@ -18,7 +20,7 @@
<h5 class="card-title">{{ .name }}</h5>
{{ end }}
</div>
<div class="card-body">
<div class="card-body text-justify pt-1 pb-1">
<p class="card-text">{{ .summary | markdownify }}</p>
</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
# name: bar
# The `darkMode` feature
darkmode:
# [Deprecated] The `darkMode` feature
# 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
# 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:
* `FEATURE_ANALYTICS=1`
* `FEATURE_ANALYTICS_GOOGLE=1`
* `FEATURE_DARKMODE=1`
* `FEATURE_THEME=1`
In JS, you can use it like this:

View file

@ -7,5 +7,5 @@
{{- $scss := $template | resources.ExecuteAsTemplate "styles/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 }}" />

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">
{{ if ne site.Params.features.flags.enable false }}
{{ $countryCode := partial "helpers/country-code.html" . }}
<span class="flag-icon flag-icon-{{$countryCode}}"></span>
<span class="fi fi-{{$countryCode}}"></span>
{{ end }}
{{ site.Language.LanguageName }}
</a>
<div class="dropdown-menu" aria-labelledby="languageSelector">
{{ 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 }}
{{ $countryCode := partial "helpers/country-code.html" . }}
<span class="flag-icon flag-icon-{{$countryCode}}"></span>
<span class="fi fi-{{$countryCode}}"></span>
{{ end }}
{{ .Language.LanguageName }}
</a>

View file

@ -141,7 +141,7 @@
{{ if .IsTranslated }}
{{ partial "navigators/lang-selector.html" . }}
{{ end }}
{{ if site.Params.features.darkMode.enable }}
{{ if or site.Params.features.darkMode.enable site.Params.features.theme.enable }}
{{ partial "navigators/theme-selector.html" . }}
{{ end }}
</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">
<a class="nav-link dropdown-toggle" href="#" id="themeSelector" role="button"
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">
</a>
<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">
<img class="theme-icon" src="{{ "icons/sun-svgrepo-com.svg" | relURL }}" width=20 alt="Light Theme">
</a>
{{ end }}
{{ if $darkEnabled }}
<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">
</a>
{{ end }}
{{ if and $lightEnabled $darkEnabled }}
<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">
</a>
{{ end }}
</div>
</li>

View file

@ -3,7 +3,7 @@
{{ $sectionID = .section.id }}
{{ 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) }}
<h1 class="text-center">
<span id="{{ $sectionID }}"></span>{{ .section.name }}</h1>
@ -11,11 +11,25 @@
<h1 class="text-center" style="display: none">
<span id="{{ $sectionID }}"></span>{{ .section.name }}</h1>
{{ end }}
<div class="container d-flex-block">
<div class="row" id="primary-skills">
{{ range .skills }}
{{ partial "cards/skill.html" . }}
{{ if .section.filter }}
<div class="container ms-auto text-center">
<div class="btn-group flex-wrap" role="group" id="skill-filter-buttons">
{{ range .buttons }}
<button type="button" class="btn btn-dark skill-filtr-control" data-filter="{{ .filter }}">
{{ .name }}
</button>
{{ end }}
</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>

View file

@ -5,34 +5,34 @@ publish = "exampleSite/public"
[context.production.environment]
HUGO_ENABLEGITINFO = "true"
HUGO_ENV = "production"
HUGO_VERSION = "0.126.2"
NODE_VERSION = "v20.11.1"
NPM_VERSION = "10.5.0"
HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.8.3"
[context.split1]
command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify --enableGitInfo"
[context.split1.environment]
HUGO_ENV = "production"
HUGO_VERSION = "0.124.0"
NODE_VERSION = "v20.11.1"
NPM_VERSION = "10.5.0"
HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.8.3"
[context.deploy-preview]
command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL"
[context.deploy-preview.environment]
HUGO_VERSION = "0.126.2"
NODE_VERSION = "v20.11.1"
NPM_VERSION = "10.5.0"
HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.8.3"
[context.branch-deploy]
command = "cd exampleSite && hugo mod tidy && hugo mod npm pack && npm install && hugo --gc --minify -b $DEPLOY_PRIME_URL"
[context.branch-deploy.environment]
HUGO_VERSION = "0.126.2"
NODE_VERSION = "v20.11.1"
NPM_VERSION = "10.5.0"
HUGO_VERSION = "0.133.1"
NODE_VERSION = "v20.17.0"
NPM_VERSION = "10.8.3"
[context.next.environment]
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",
"devDependencies": {
"autoprefixer": "^10.4.13",
"autoprefixer": "^10.4.20",
"eslint": "^8.31.0",
"eslint-config-prettier": "^8.6.0",
"eslint-config-standard": "^17.0.0",
@ -27,18 +27,18 @@
"eslint-plugin-n": "^15.6.0",
"eslint-plugin-no-jquery": "^2.7.0",
"eslint-plugin-promise": "^6.1.1",
"postcss": "^8.4.31",
"postcss-cli": "^8.3.1",
"postcss": "^8.4.41",
"postcss-cli": "^11.0.0",
"@fontsource/mulish": "4.5.13",
"@fortawesome/fontawesome-free": "^6.2.0",
"@fortawesome/fontawesome-free": "^6.6.0",
"bootstrap": "^5.3.3",
"filterizr": "^2.2.4",
"flag-icon-css": "^4.1.7",
"flag-icons": "^7.2.3",
"fuse.js": "^6.6.2",
"highlight.js": "^11.6.0",
"imagesloaded": "^5.0.0",
"ityped": "^1.0.3",
"katex": "^0.16.10",
"katex": "^0.16.11",
"mark.js": "^8.11.1",
"mermaid": "^9.2.1",
"plyr": "^3.7.2",

View file

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

View file

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