categories: "Categories"
tag: "Tag"
tags: "Tags"
+tagCloud: "Explore Topics"
+exploreTopics: "Browse by topic"
relatedPosts: "Related articles"
noRelated: "No related articles."
postCount:
categories: "Categorie"
tag: "Tag"
tags: "Tag"
+tagCloud: "Esplora gli argomenti"
+exploreTopics: "Sfoglia per argomento"
relatedPosts: "Articoli correlati"
noRelated: "Nessun articolo correlato."
postCount:
margin-bottom: 1.5rem;
}
+ /* =====================
+ Tag Cloud Component
+ ===================== */
+
+ .tag-cloud {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ align-items: baseline;
+ }
+
+ .tag-cloud-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.375rem;
+ padding: 0.25rem 0.625rem;
+ border: 1px solid var(--border);
+ border-radius: 0.25rem;
+ font-family: var(--font-mono, 'JetBrains Mono', monospace);
+ font-size: 0.75rem;
+ color: var(--text-dim);
+ text-decoration: none;
+ transition: border-color 150ms ease-out, color 150ms ease-out, background-color 150ms ease-out;
+ white-space: nowrap;
+ line-height: 1.4;
+ }
+
+ .tag-cloud-link:hover {
+ border-color: rgba(var(--accent-rgb), 0.5);
+ color: var(--accent);
+ background-color: rgba(var(--accent-rgb), 0.06);
+ }
+
+ .tag-cloud-link:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+ border-radius: 0.25rem;
+ }
+
+ .tag-tier-low {
+ font-size: 0.75rem;
+ opacity: 0.75;
+ }
+
+ .tag-tier-medium {
+ font-size: 0.875rem;
+ opacity: 0.88;
+ }
+
+ .tag-tier-high {
+ font-size: 1rem;
+ opacity: 1;
+ border-color: rgba(var(--accent-rgb), 0.3);
+ color: var(--text);
+ }
+
+ .tag-cloud-count {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 0.375rem;
+ border-radius: 9999px;
+ font-size: 0.65em;
+ font-weight: 600;
+ background-color: rgba(var(--accent-rgb), 0.12);
+ color: var(--accent);
+ line-height: 1.6;
+ min-width: 1.2em;
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .tag-cloud-link {
+ transition: none;
+ }
+ }
+
.share-grid {
display: grid;
grid-template-columns: repeat(3, 50px);
margin-bottom: 1.5rem;
}
+/* =====================
+ Tag Cloud Component
+ ===================== */
+
+.tag-cloud {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ align-items: baseline;
+}
+
+.tag-cloud-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.375rem;
+ padding: 0.25rem 0.625rem;
+ border: 1px solid var(--border);
+ border-radius: 0.25rem;
+ font-family: var(--font-mono, 'JetBrains Mono', monospace);
+ font-size: 0.75rem;
+ color: var(--text-dim);
+ text-decoration: none;
+ transition: border-color 150ms ease-out, color 150ms ease-out, background-color 150ms ease-out;
+ white-space: nowrap;
+ line-height: 1.4;
+}
+
+.tag-cloud-link:hover {
+ border-color: rgba(var(--accent-rgb), 0.5);
+ color: var(--accent);
+ background-color: rgba(var(--accent-rgb), 0.06);
+}
+
+.tag-cloud-link:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+ border-radius: 0.25rem;
+}
+
+.tag-cloud-count {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 0.375rem;
+ border-radius: 9999px;
+ font-size: 0.65em;
+ font-weight: 600;
+ background-color: rgba(var(--accent-rgb), 0.12);
+ color: var(--accent);
+ line-height: 1.6;
+ min-width: 1.2em;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .tag-cloud-link {
+ transition: none;
+ }
+}
+
.share-grid {
display: grid;
grid-template-columns: repeat(3, 50px);
</div>
</div>
+ <!-- Explore Topics -->
+ <div class="mb-12 text-left">
+ {{ partial "tag-cloud.html" (dict "page" . "showCount" true "wrapInWidget" false "headingLevel" "h3") }}
+ </div>
+
<!-- Navigation Links -->
<div class="space-y-4 flex flex-col items-center mb-12">
<a href="/" class="btn btn-primary">
</div>
</div>
+ <!-- Explore Topics -->
+ <div class="mb-12 text-left">
+ {{ partial "tag-cloud.html" (dict "page" . "showCount" true "wrapInWidget" false "headingLevel" "h3") }}
+ </div>
+
<!-- Navigation Links -->
<div class="space-y-4 flex flex-col items-center mb-12">
<a href="/it/" class="btn btn-primary">
{{ i18n "contact" }}
</a>
</div>
+
+ <!-- Tag Cloud Section -->
+ <div class="mt-16 pt-8 border-t border-border">
+ {{ partial "tag-cloud.html" (dict "page" . "showCount" true "wrapInWidget" false "headingLevel" "h2") }}
+ </div>
</div>
</section>
{{ end }}
{{ end }}
</div>
{{ end }}
+
+ <hr class="sidebar-hr">
+
+ <!-- Tag Cloud Widget -->
+ {{ partial "tag-cloud.html" (dict "page" . "showCount" false "wrapInWidget" true "maxTags" 15) }}
</aside>
--- /dev/null
+{{/* 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 -}}
+<div class="sidebar-widget">
+ <p class="sidebar-widget-label"># {{ i18n "tags" }}</p>
+ <nav aria-label="{{ i18n "exploreTopics" }}">
+ <div class="tag-cloud">
+{{- else -}}
+<section aria-labelledby="tag-cloud-heading">
+ <{{ $headingLevel }} id="tag-cloud-heading" class="text-lg font-semibold text-accent mb-4">
+ {{ $heading }}
+ </{{ $headingLevel }}>
+ <nav aria-label="{{ i18n "exploreTopics" }}">
+ <div class="tag-cloud">
+{{- end -}}
+
+ {{- range $orderedTags -}}
+ {{- $count := .Count -}}
+ {{- $tier := "low" -}}
+ {{- if gt $count $tierHighThreshold -}}
+ {{- $tier = "high" -}}
+ {{- else if gt $count $tierMedThreshold -}}
+ {{- $tier = "medium" -}}
+ {{- end -}}
+ <a
+ href="{{ .Page.RelPermalink }}"
+ class="tag-cloud-link tag-tier-{{ $tier }}"
+ aria-label="{{ .Name }}{{- if $showCount }} ({{ i18n "postCount" $count }}){{- end -}}"
+ >
+ {{- .Name -}}
+ {{- if $showCount -}}
+ <span class="tag-cloud-count" aria-hidden="true">{{ $count }}</span>
+ {{- end -}}
+ </a>
+ {{- end -}}
+
+ </div>
+ </nav>
+
+{{- if $wrapInWidget -}}
+</div>
+{{- else -}}
+</section>
+{{- end -}}
+
+{{- end -}}{{/* end if $tags */}}