From: Danilo M. Date: Tue, 21 Apr 2026 20:56:01 +0000 (+0200) Subject: feat: Add reusable tag cloud partial with A11y and dark/light mode support X-Git-Tag: release_22042026-1342~33 X-Git-Url: https://git.danix.xyz/?a=commitdiff_plain;h=88d46796cb84e81e1c502ccdf02ea22890e511d5;p=danix.xyz-2.git feat: Add reusable tag cloud partial with A11y and dark/light mode support - Create tag-cloud.html partial with flexible dict interface: * showCount (bool): Toggle count badges * wrapInWidget (bool): Sidebar widget wrapper with .sidebar-widget class * maxTags (int): Limit shown tags (used for sidebar: 15 max) * headingLevel (h2|h3): Configurable heading element - Implement visual tier scaling by frequency (3 tiers): * low: 0.75rem, 0.75 opacity — uncommon tags * medium: 0.875rem, 0.88 opacity — moderate frequency * high: 1rem, 1 opacity, accent border — popular tags - Add .tag-cloud and .tag-tier-* CSS classes (main.css): * Uses CSS variables (--accent, --border, --text-dim) for dark/light compatibility * Focus ring matches site standard (outline-offset: 2px) * Hover state: accent border + subtle bg tint * prefers-reduced-motion: transitions disabled - Integrate in 3 locations: * Homepage (layouts/index.html): Full cloud with counts * Article sidebar (layouts/partials/sidebar.html): Compact widget, 15 max, no counts * 404 pages (404.en.html, 404.it.html): Full cloud between recent articles and nav - A11y implementation: *
landmark (non-sidebar mode) *
{{ end }} diff --git a/themes/danix-xyz-hacker/layouts/partials/sidebar.html b/themes/danix-xyz-hacker/layouts/partials/sidebar.html index dc263e6..a2225f1 100644 --- a/themes/danix-xyz-hacker/layouts/partials/sidebar.html +++ b/themes/danix-xyz-hacker/layouts/partials/sidebar.html @@ -46,4 +46,9 @@ {{ end }} {{ end }} + + + + + {{ partial "tag-cloud.html" (dict "page" . "showCount" false "wrapInWidget" true "maxTags" 15) }} diff --git a/themes/danix-xyz-hacker/layouts/partials/tag-cloud.html b/themes/danix-xyz-hacker/layouts/partials/tag-cloud.html new file mode 100644 index 0000000..0d59e3c --- /dev/null +++ b/themes/danix-xyz-hacker/layouts/partials/tag-cloud.html @@ -0,0 +1,85 @@ +{{/* tag-cloud.html + Reusable tag cloud partial for homepage, sidebar, and 404 pages. + + Params (dict): + page Page required — calling page context (provides .Site.Taxonomies.tags, .Lang) + showCount bool optional — show post count per tag (default true) + heading string optional — heading text override (default: i18n "tagCloud") + headingLevel string optional — h2|h3|p for non-widget mode (default "h2") + wrapInWidget bool optional — wrap in .sidebar-widget for sidebar placement (default false) + maxTags int optional — max tags to show, 0 = all (default 0) +*/}} + +{{- $page := .page -}} +{{- $showCount := .showCount | default true -}} +{{- $heading := .heading | default (i18n "tagCloud") -}} +{{- $headingLevel := .headingLevel | default "h2" -}} +{{- $wrapInWidget := .wrapInWidget | default false -}} +{{- $maxTags := .maxTags | default 0 -}} + +{{- $tags := $page.Site.Taxonomies.tags -}} + +{{/* Early exit if no tags */}} +{{- if $tags -}} + +{{/* Compute max count for tier thresholds */}} +{{- $maxCount := 0 -}} +{{- range $tags -}} + {{- if gt .Count $maxCount -}}{{- $maxCount = .Count -}}{{- end -}} +{{- end -}} + +{{/* Tier thresholds (integer division) */}} +{{- $tierMedThreshold := div $maxCount 3 -}} +{{- $tierHighThreshold := mul (div $maxCount 3) 2 -}} + +{{/* Ordered tag list (descending by count) */}} +{{- $orderedTags := $tags.ByCount -}} +{{- if gt $maxTags 0 -}} + {{- $orderedTags = first $maxTags $orderedTags -}} +{{- end -}} + +{{/* Render based on placement mode */}} +{{- if $wrapInWidget -}} +