From 78b872fcf0cd7b73d335a6208d2bd381897a4e33 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:11:28 +0200 Subject: feat: desktop nav submenu for nested menu items (CSS hover + focus-within) --- layouts/partials/header.html | 50 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/layouts/partials/header.html b/layouts/partials/header.html index 603f779..8ee657c 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -16,13 +16,49 @@ {{ range .Site.Menus.main }} {{ $menuPath := strings.TrimSuffix "/" .URL }} {{ $isActive := eq $menuPath $currentPath }} - - {{ i18n .Name }} - + {{ $isExternal := .Params.external }} + {{ if .HasChildren }} + {{/* CSS-only hover/focus popup. No ARIA menu roles: we do not + implement arrow-key menu semantics, so claiming role="menu" + would lie to AT. focus-within gives keyboard reveal; the + parent stays a plain navigable link. */}} +
+ + {{ i18n .Name }} + + + + +
+ {{ else }} + + {{ if $isExternal }}{{ .Name }}{{ else }}{{ i18n .Name }}{{ end }} + + {{ end }} {{ end }} -- cgit v1.2.3 From 1520f2065a67a14eaef56233b337fe4c02622b03 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:13:04 +0200 Subject: feat: slackware project single layout with project-header partial --- layouts/partials/project-header.html | 46 ++++++++++++++++++++++++++++++++++++ layouts/slackware/single.html | 17 +++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 layouts/partials/project-header.html create mode 100644 layouts/slackware/single.html diff --git a/layouts/partials/project-header.html b/layouts/partials/project-header.html new file mode 100644 index 0000000..c727458 --- /dev/null +++ b/layouts/partials/project-header.html @@ -0,0 +1,46 @@ +{{ $status := .Params.status | default "active" }} +{{/* status -> theme-aware bg/text var pair (all defined in main.css) */}} +{{ $bgVar := "--type-tech" }}{{ $txtVar := "--type-tech-text" }} +{{ if eq $status "maintained" }}{{ $bgVar = "--type-quote" }}{{ $txtVar = "--type-quote-text" }}{{ end }} +{{ if eq $status "wip" }}{{ $bgVar = "--type-life" }}{{ $txtVar = "--type-life-text" }}{{ end }} +{{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} + +{{ $imageURL := "" }} +{{ if .Params.image }} + {{ $res := .Resources.GetMatch .Params.image }} + {{ if $res }}{{ $imageURL = $res.RelPermalink }}{{ else }}{{ $imageURL = .Params.image }}{{ end }} +{{ end }} + +
+ {{ if $imageURL }} + {{ .Title }} + {{ end }} + +
+

{{ .Title }}

+ + {{ i18n (printf "status-%s" $status) }} + +
+ + {{ with .Params.tagline }} +

{{ . }}

+ {{ end }} + +
+ {{ with .Params.repo_url }} + + {{ i18n "viewRepo" }} + + {{ i18n "opensInNewTab" }} + + {{ end }} + {{ with .Params.tags }} +
    + {{ range . }} +
  • {{ . }}
  • + {{ end }} +
+ {{ end }} +
+
diff --git a/layouts/slackware/single.html b/layouts/slackware/single.html new file mode 100644 index 0000000..e1178c7 --- /dev/null +++ b/layouts/slackware/single.html @@ -0,0 +1,17 @@ +{{ define "main" }} +
+
+ {{ partial "breadcrumb.html" . }} + + {{ partial "project-header.html" . }} + +
+ {{ .Content }} +
+ +
+ {{ partial "social-share.html" (dict "page" . "mode" "inline") }} +
+
+
+{{ end }} -- cgit v1.2.3 From 5c03ea3fbe199c44505d1150b92a37bd09bca66c Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:14:30 +0200 Subject: feat: indented submenu children in mobile overlay --- layouts/partials/hamburger-menu.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/layouts/partials/hamburger-menu.html b/layouts/partials/hamburger-menu.html index 55bb2a6..248b172 100644 --- a/layouts/partials/hamburger-menu.html +++ b/layouts/partials/hamburger-menu.html @@ -42,6 +42,21 @@ {{ if $isExternal }}{{ .Name }}{{ else }}{{ i18n .Name }}{{ end }} {{ if $isExternal }}{{ i18n "opensInNewTab" }}{{ end }} + {{ if .HasChildren }} +
+ {{ range .Children }} + {{ $childExternal := .Params.external }} + + {{ if $childExternal }}{{ .Name }}{{ else }}{{ i18n .Name }}{{ end }} + + {{ end }} +
+ {{ end }} {{ end }} -- cgit v1.2.3 From 4e26aabccc2432b4670e874017f55261506d59bb Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:16:10 +0200 Subject: feat: slackware hub list layout with project rows --- layouts/partials/project-row.html | 65 +++++++++++++++++++++++++++++++++++++++ layouts/slackware/list.html | 28 +++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 layouts/partials/project-row.html create mode 100644 layouts/slackware/list.html diff --git a/layouts/partials/project-row.html b/layouts/partials/project-row.html new file mode 100644 index 0000000..82a3481 --- /dev/null +++ b/layouts/partials/project-row.html @@ -0,0 +1,65 @@ +{{ $p := .page }} +{{ $reverse := eq (mod .index 2) 1 }} + +{{ $status := $p.Params.status | default "active" }} +{{/* status -> theme-aware bg/text var pair (all defined in main.css) */}} +{{ $bgVar := "--type-tech" }}{{ $txtVar := "--type-tech-text" }} +{{ if eq $status "maintained" }}{{ $bgVar = "--type-quote" }}{{ $txtVar = "--type-quote-text" }}{{ end }} +{{ if eq $status "wip" }}{{ $bgVar = "--type-life" }}{{ $txtVar = "--type-life-text" }}{{ end }} +{{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} + +{{ $imageURL := "" }} +{{ if $p.Params.image }} + {{ $res := $p.Resources.GetMatch $p.Params.image }} + {{ if $res }}{{ $imageURL = $res.RelPermalink }}{{ else }}{{ $imageURL = $p.Params.image }}{{ end }} +{{ end }} +{{ $glyph := substr (upper $p.Title) 0 2 }} + + diff --git a/layouts/slackware/list.html b/layouts/slackware/list.html new file mode 100644 index 0000000..e385f89 --- /dev/null +++ b/layouts/slackware/list.html @@ -0,0 +1,28 @@ +{{ define "main" }} +
+
+ {{ partial "breadcrumb.html" . }} + +
+

+ {{ i18n "slackwareTitle" }} +

+

+ {{ i18n "slackwareSubtitle" }} +

+
+ + {{ with .Content }} +
+ {{ . }} +
+ {{ end }} + +
+ {{ range $index, $p := .Pages }} + {{ partial "project-row.html" (dict "page" $p "index" $index) }} + {{ end }} +
+
+
+{{ end }} -- cgit v1.2.3 From 1cdafc24e5efe9a0042c53306ae80d9127126aa4 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:17:23 +0200 Subject: feat: include slackware projects in search index --- layouts/index.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/layouts/index.json b/layouts/index.json index e17e31e..891641a 100644 --- a/layouts/index.json +++ b/layouts/index.json @@ -1,5 +1,6 @@ {{- $articles := where .Site.RegularPages "Section" "articles" -}} -{{- $articles = $articles.ByDate.Reverse -}} +{{- $projects := where .Site.RegularPages "Section" "slackware" -}} +{{- $articles = ($articles | append $projects).ByDate.Reverse -}} [ {{- range $index, $article := $articles -}} { -- cgit v1.2.3 From 93cee5f1d37a685d1133d737cc9057bfdf3ee31c Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:19:32 +0200 Subject: build: recompile CSS for slackware section --- assets/css/main.min.css | 120 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/assets/css/main.min.css b/assets/css/main.min.css index 2d09220..0278dc9 100644 --- a/assets/css/main.min.css +++ b/assets/css/main.min.css @@ -1648,6 +1648,21 @@ button, /* Legacy type-* classes for compatibility (with badge styling) */ +.type-tech { + color: var(--type-tech); + background-color: rgba(168, 85, 247, 0.1); +} + +.type-life { + color: var(--type-life); + background-color: rgba(245, 158, 11, 0.1); +} + +.type-quote { + color: var(--type-quote); + background-color: rgba(0, 255, 136, 0.1); +} + /* Card component */ .card { @@ -2328,6 +2343,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { left: 0px; } +.left-1\/2 { + left: 50%; +} + .left-3 { left: 0.75rem; } @@ -2360,6 +2379,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { top: 1rem; } +.top-full { + top: 100%; +} + .z-10 { z-index: 10; } @@ -2409,6 +2432,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { margin-bottom: 0.25rem; } +.mb-10 { + margin-bottom: 2.5rem; +} + .mb-12 { margin-bottom: 3rem; } @@ -2535,6 +2562,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { height: 0.25rem; } +.h-24 { + height: 6rem; +} + .h-3 { height: 0.75rem; } @@ -2563,6 +2594,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { height: auto; } +.h-full { + height: 100%; +} + .h-screen { height: 100vh; } @@ -2575,6 +2610,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { max-height: 24rem; } +.min-h-\[10rem\] { + min-height: 10rem; +} + .min-h-\[calc\(100vh-200px\)\] { min-height: calc(100vh - 200px); } @@ -2591,6 +2630,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { width: 5rem; } +.w-24 { + width: 6rem; +} + .w-3 { width: 0.75rem; } @@ -2623,6 +2666,11 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { min-width: 0px; } +.min-w-max { + min-width: -moz-max-content; + min-width: max-content; +} + .max-w-2xl { max-width: 42rem; } @@ -2667,6 +2715,11 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { flex-shrink: 0; } +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + .translate-x-0 { --tw-translate-x: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); @@ -2705,6 +2758,12 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { cursor: pointer; } +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + .resize-none { resize: none; } @@ -2725,10 +2784,18 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { flex-wrap: wrap; } +.items-start { + align-items: flex-start; +} + .items-center { align-items: center; } +.items-stretch { + align-items: stretch; +} + .justify-center { justify-content: center; } @@ -2757,6 +2824,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { gap: 1rem; } +.gap-6 { + gap: 1.5rem; +} + .gap-8 { gap: 2rem; } @@ -2934,6 +3005,11 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { background-color: var(--surface); } +.object-contain { + -o-object-fit: contain; + object-fit: contain; +} + .object-cover { -o-object-fit: cover; object-fit: cover; @@ -3037,6 +3113,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { padding-left: 0.75rem; } +.pl-4 { + padding-left: 1rem; +} + .pl-6 { padding-left: 1.5rem; } @@ -3049,6 +3129,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { padding-top: 0.5rem; } +.pt-3 { + padding-top: 0.75rem; +} + .pt-6 { padding-top: 1.5rem; } @@ -3102,6 +3186,11 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { line-height: 1; } +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + .text-lg { font-size: 1.125rem; line-height: 1.75rem; @@ -3230,6 +3319,12 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { opacity: 0.75; } +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + .shadow-xl { --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); @@ -5037,6 +5132,11 @@ html.theme-light .hero-name { line-height: 2.25rem; } +.hover\:-translate-y-1:hover { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + .hover\:bg-surface:hover { background-color: var(--surface); } @@ -5158,6 +5258,14 @@ html.theme-light .hero-name { opacity: 0.5; } +.group:focus-within .group-focus-within\:flex { + display: flex; +} + +.group:hover .group-hover\:flex { + display: flex; +} + .group:hover .group-hover\:scale-105 { --tw-scale-x: 1.05; --tw-scale-y: 1.05; @@ -5207,6 +5315,10 @@ html.theme-light .hero-name { height: 12rem; } + .md\:w-1\/3 { + width: 33.333333%; + } + .md\:w-48 { width: 12rem; } @@ -5219,6 +5331,14 @@ html.theme-light .hero-name { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .md\:flex-row { + flex-direction: row; + } + + .md\:flex-row-reverse { + flex-direction: row-reverse; + } + .md\:gap-6 { gap: 1.5rem; } -- cgit v1.2.3 From 383c4f7a7c64450dcb993ec1db3a63b87b93836d Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:31:46 +0200 Subject: fix: submenu as expanding second row inside header glass Replace floating dropdown box with a full-width centered second row that expands the existing frosted header panel on hover/focus. Project pages in the submenu fall back to page title when no menu name is set. Same label fallback applied to mobile overlay children. --- assets/css/main.min.css | 44 ++++---------------- layouts/partials/hamburger-menu.html | 12 +++++- layouts/partials/header.html | 81 ++++++++++++++++++++++-------------- 3 files changed, 68 insertions(+), 69 deletions(-) diff --git a/assets/css/main.min.css b/assets/css/main.min.css index 0278dc9..44735f9 100644 --- a/assets/css/main.min.css +++ b/assets/css/main.min.css @@ -2343,10 +2343,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { left: 0px; } -.left-1\/2 { - left: 50%; -} - .left-3 { left: 0.75rem; } @@ -2379,10 +2375,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { top: 1rem; } -.top-full { - top: 100%; -} - .z-10 { z-index: 10; } @@ -2666,11 +2658,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { min-width: 0px; } -.min-w-max { - min-width: -moz-max-content; - min-width: max-content; -} - .max-w-2xl { max-width: 42rem; } @@ -2715,11 +2702,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { flex-shrink: 0; } -.-translate-x-1\/2 { - --tw-translate-x: -50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - .translate-x-0 { --tw-translate-x: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); @@ -3129,10 +3111,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { padding-top: 0.5rem; } -.pt-3 { - padding-top: 0.75rem; -} - .pt-6 { padding-top: 1.5rem; } @@ -3319,12 +3297,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { opacity: 0.75; } -.shadow-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - .shadow-xl { --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); @@ -5258,14 +5230,6 @@ html.theme-light .hero-name { opacity: 0.5; } -.group:focus-within .group-focus-within\:flex { - display: flex; -} - -.group:hover .group-hover\:flex { - display: flex; -} - .group:hover .group-hover\:scale-105 { --tw-scale-x: 1.05; --tw-scale-y: 1.05; @@ -5362,6 +5326,14 @@ html.theme-light .hero-name { font-size: 6rem; line-height: 1; } + + .group\/header:focus-within .md\:group-focus-within\/header\:flex { + display: flex; + } + + .group\/header:hover .md\:group-hover\/header\:flex { + display: flex; + } } @media (prefers-color-scheme: dark) { diff --git a/layouts/partials/hamburger-menu.html b/layouts/partials/hamburger-menu.html index 248b172..0280ecb 100644 --- a/layouts/partials/hamburger-menu.html +++ b/layouts/partials/hamburger-menu.html @@ -46,13 +46,23 @@
{{ range .Children }} {{ $childExternal := .Params.external }} + {{ $label := "" }} + {{ if $childExternal }} + {{ $label = .Name }} + {{ else if and .Name (i18n .Name) }} + {{ $label = i18n .Name }} + {{ else if .Page }} + {{ $label = .Page.LinkTitle }} + {{ else }} + {{ $label = .Name }} + {{ end }} - {{ if $childExternal }}{{ .Name }}{{ else }}{{ i18n .Name }}{{ end }} + {{ $label }} {{ end }}
diff --git a/layouts/partials/header.html b/layouts/partials/header.html index 8ee657c..4ef817e 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -1,4 +1,4 @@ -
+
). + No ARIA menu roles: CSS-only hover/focus, not an arrow-key menu; + group-focus-within on the header gives keyboard reveal. */}} + + {{ i18n .Name }} + + {{ else }} + + {{ range .Site.Menus.main }} + {{ if .HasChildren }} + + {{ end }} + {{ end }} + {{ partial "hamburger-menu.html" . }}
-- cgit v1.2.3 From 13a8ee5f0a0db661fadc3f5f02b07b52e270a86d Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:37:32 +0200 Subject: fix: widen slackware hub + project to max-w-7xl matching repository --- layouts/slackware/list.html | 2 +- layouts/slackware/single.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/layouts/slackware/list.html b/layouts/slackware/list.html index e385f89..ac89356 100644 --- a/layouts/slackware/list.html +++ b/layouts/slackware/list.html @@ -1,5 +1,5 @@ {{ define "main" }} -
+
{{ partial "breadcrumb.html" . }} diff --git a/layouts/slackware/single.html b/layouts/slackware/single.html index e1178c7..6efb3e2 100644 --- a/layouts/slackware/single.html +++ b/layouts/slackware/single.html @@ -1,5 +1,5 @@ {{ define "main" }} -
+
{{ partial "breadcrumb.html" . }} -- cgit v1.2.3 From 43edbdb66bc6c8e80deb1b67b688acba21286534 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:42:58 +0200 Subject: fix: status badge color (safeCSS) + right-align badge and tags Hugo escaped the CSS-var style to ZgotmplZ, so badge colors never applied; build the style string through safeCSS instead. active=green now. On the project page, right-align the status badge with the title and push tags to the right, matching the list-view layout. --- layouts/partials/project-header.html | 16 +++++++++------- layouts/partials/project-row.html | 10 ++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/layouts/partials/project-header.html b/layouts/partials/project-header.html index c727458..f153a26 100644 --- a/layouts/partials/project-header.html +++ b/layouts/partials/project-header.html @@ -1,9 +1,11 @@ {{ $status := .Params.status | default "active" }} -{{/* status -> theme-aware bg/text var pair (all defined in main.css) */}} -{{ $bgVar := "--type-tech" }}{{ $txtVar := "--type-tech-text" }} -{{ if eq $status "maintained" }}{{ $bgVar = "--type-quote" }}{{ $txtVar = "--type-quote-text" }}{{ end }} +{{/* status -> theme-aware bg/text var pair (all defined in main.css). + active=green, maintained=blue, wip=amber, archived=muted. */}} +{{ $bgVar := "--type-quote" }}{{ $txtVar := "--type-quote-text" }} +{{ if eq $status "maintained" }}{{ $bgVar = "--type-link" }}{{ $txtVar = "--type-link-text" }}{{ end }} {{ if eq $status "wip" }}{{ $bgVar = "--type-life" }}{{ $txtVar = "--type-life-text" }}{{ end }} {{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} +{{ $badgeStyle := printf "background-color: var(%s); color: var(%s);" $bgVar $txtVar | safeCSS }} {{ $imageURL := "" }} {{ if .Params.image }} @@ -16,9 +18,9 @@ {{ .Title }} {{ end }} -
+

{{ .Title }}

- + {{ i18n (printf "status-%s" $status) }}
@@ -27,7 +29,7 @@

{{ . }}

{{ end }} -
+
{{ with .Params.repo_url }} {{ i18n "viewRepo" }} @@ -36,7 +38,7 @@ {{ end }} {{ with .Params.tags }} -
    +
      {{ range . }}
    • {{ . }}
    • {{ end }} diff --git a/layouts/partials/project-row.html b/layouts/partials/project-row.html index 82a3481..89662ee 100644 --- a/layouts/partials/project-row.html +++ b/layouts/partials/project-row.html @@ -2,11 +2,13 @@ {{ $reverse := eq (mod .index 2) 1 }} {{ $status := $p.Params.status | default "active" }} -{{/* status -> theme-aware bg/text var pair (all defined in main.css) */}} -{{ $bgVar := "--type-tech" }}{{ $txtVar := "--type-tech-text" }} -{{ if eq $status "maintained" }}{{ $bgVar = "--type-quote" }}{{ $txtVar = "--type-quote-text" }}{{ end }} +{{/* status -> theme-aware bg/text var pair (all defined in main.css). + active=green, maintained=blue, wip=amber, archived=muted. */}} +{{ $bgVar := "--type-quote" }}{{ $txtVar := "--type-quote-text" }} +{{ if eq $status "maintained" }}{{ $bgVar = "--type-link" }}{{ $txtVar = "--type-link-text" }}{{ end }} {{ if eq $status "wip" }}{{ $bgVar = "--type-life" }}{{ $txtVar = "--type-life-text" }}{{ end }} {{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} +{{ $badgeStyle := printf "background-color: var(%s); color: var(%s);" $bgVar $txtVar | safeCSS }} {{ $imageURL := "" }} {{ if $p.Params.image }} @@ -31,7 +33,7 @@

      {{ $p.Title }}

      - + {{ i18n (printf "status-%s" $status) }}
-- cgit v1.2.3 From f5e6e6ecb2fa0dee24b701e53daebaac677687f3 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:55:30 +0200 Subject: feat: infer thumbnail.* (2:3 row) and header.* (wide banner) page resources Row uses a thumbnail.* page resource; project page shows a full-width header.* banner above the title instead of a small inline logo. Both inferred by filename from the project bundle, no front-matter needed (image param kept as thumbnail fallback). --- layouts/partials/project-header.html | 11 ++++------- layouts/partials/project-row.html | 7 ++++++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/layouts/partials/project-header.html b/layouts/partials/project-header.html index f153a26..17fe7db 100644 --- a/layouts/partials/project-header.html +++ b/layouts/partials/project-header.html @@ -7,15 +7,12 @@ {{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} {{ $badgeStyle := printf "background-color: var(%s); color: var(%s);" $bgVar $txtVar | safeCSS }} -{{ $imageURL := "" }} -{{ if .Params.image }} - {{ $res := .Resources.GetMatch .Params.image }} - {{ if $res }}{{ $imageURL = $res.RelPermalink }}{{ else }}{{ $imageURL = .Params.image }}{{ end }} -{{ end }} +{{/* Full-width banner: page resource named header.* in the project bundle. */}} +{{ $headerImg := .Resources.GetMatch "header.*" }}
- {{ if $imageURL }} - {{ .Title }} + {{ with $headerImg }} + {{ end }}
diff --git a/layouts/partials/project-row.html b/layouts/partials/project-row.html index 89662ee..5a65f35 100644 --- a/layouts/partials/project-row.html +++ b/layouts/partials/project-row.html @@ -10,8 +10,13 @@ {{ if eq $status "archived" }}{{ $bgVar = "--text-dim" }}{{ $txtVar = "--bg" }}{{ end }} {{ $badgeStyle := printf "background-color: var(%s); color: var(%s);" $bgVar $txtVar | safeCSS }} +{{/* Row thumbnail (2:3): page resource named thumbnail.* in the project + bundle; fall back to an `image` param, else a mono-glyph block. */}} {{ $imageURL := "" }} -{{ if $p.Params.image }} +{{ $thumb := $p.Resources.GetMatch "thumbnail.*" }} +{{ if $thumb }} + {{ $imageURL = $thumb.RelPermalink }} +{{ else if $p.Params.image }} {{ $res := $p.Resources.GetMatch $p.Params.image }} {{ if $res }}{{ $imageURL = $res.RelPermalink }}{{ else }}{{ $imageURL = $p.Params.image }}{{ end }} {{ end }} -- cgit v1.2.3 From 9244ad0666c4859569801508348fa83c6e4648f4 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 26 Jun 2026 17:57:30 +0200 Subject: fix: row thumbnail cell is 3:2 landscape, holds its own aspect ratio Was stretching to body height via items-stretch; give the image cell aspect-[3/2] and self-start so a 3:2 thumbnail displays at its intended ratio instead of being cropped to the row height. --- assets/css/main.min.css | 43 +++++++++++++++++++-------------------- layouts/partials/project-row.html | 2 +- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/assets/css/main.min.css b/assets/css/main.min.css index 44735f9..048b8e7 100644 --- a/assets/css/main.min.css +++ b/assets/css/main.min.css @@ -1648,11 +1648,6 @@ button, /* Legacy type-* classes for compatibility (with badge styling) */ -.type-tech { - color: var(--type-tech); - background-color: rgba(168, 85, 247, 0.1); -} - .type-life { color: var(--type-life); background-color: rgba(245, 158, 11, 0.1); @@ -1663,6 +1658,11 @@ button, background-color: rgba(0, 255, 136, 0.1); } +.type-link { + color: var(--type-link); + background-color: rgba(56, 189, 248, 0.1); +} + /* Card component */ .card { @@ -2460,6 +2460,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { margin-left: 0.5rem; } +.ml-auto { + margin-left: auto; +} + .mt-0\.5 { margin-top: 0.125rem; } @@ -2546,6 +2550,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { display: none; } +.aspect-\[3\/2\] { + aspect-ratio: 3/2; +} + .aspect-video { aspect-ratio: 16 / 9; } @@ -2554,10 +2562,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { height: 0.25rem; } -.h-24 { - height: 6rem; -} - .h-3 { height: 0.75rem; } @@ -2602,10 +2606,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { max-height: 24rem; } -.min-h-\[10rem\] { - min-height: 10rem; -} - .min-h-\[calc\(100vh-200px\)\] { min-height: calc(100vh - 200px); } @@ -2622,10 +2622,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { width: 5rem; } -.w-24 { - width: 6rem; -} - .w-3 { width: 0.75rem; } @@ -2856,6 +2852,10 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); } +.self-start { + align-self: flex-start; +} + .overflow-hidden { overflow: hidden; } @@ -2987,11 +2987,6 @@ article.border.border-border\/30.rounded-lg.overflow-hidden.group.menu-overlay { background-color: var(--surface); } -.object-contain { - -o-object-fit: contain; - object-fit: contain; -} - .object-cover { -o-object-fit: cover; object-fit: cover; @@ -5279,6 +5274,10 @@ html.theme-light .hero-name { height: 12rem; } + .md\:h-64 { + height: 16rem; + } + .md\:w-1\/3 { width: 33.333333%; } diff --git a/layouts/partials/project-row.html b/layouts/partials/project-row.html index 5a65f35..7a1e209 100644 --- a/layouts/partials/project-row.html +++ b/layouts/partials/project-row.html @@ -24,7 +24,7 @@