Files
George Cushen a955161dbb fix(spacing): connect section spacing to design token system
Wire .hbb-section to var(--hb-spacing-section) instead of hardcoded 6rem,
enabling hugoblox.layout.spacing (compact/comfortable/spacious) to take effect.

- Default to "spacious" (6rem) to preserve existing visual layouts
- Per-section override via design.spacing.padding still works (inline > class)
- Remove dead design.spacing frontmatter field from all templates
- Set correct layout.spacing token in each template's params.yaml

Closes #3314
2026-04-08 18:19:15 +01:00

166 lines
8.4 KiB
HTML

{{/*
HugoBlox Theme Engine: Get theme configuration (v2)
Returns a dict with:
- mode: 'light' | 'dark' | 'system'
- light: Light theme pack name (default: "default")
- dark: Dark theme pack name (default: "default")
- colors: Global color overrides { primary, secondary, neutral }
- colors_light: Light-mode specific color overrides
- colors_dark: Dark-mode specific color overrides
- surfaces: Semantic surface colors { background, foreground, header, footer }
- typography: { font, size }
- layout: { radius, spacing }
*/}}
{{/* v2 structure */}}
{{ $hb := site.Params.hugoblox | default dict }}
{{ $hb_theme := $hb.theme | default dict }}
{{/* ═══════════════════════════════════════════════════════════════════════════
MODE (light/dark/system)
═══════════════════════════════════════════════════════════════════════════ */}}
{{ $mode := $hb_theme.mode | default "system" }}
{{/* ═══════════════════════════════════════════════════════════════════════════
THEME PACK SELECTION (light/dark)
Pack can be:
- String: "default" (applies to both)
- Object: { light: "latte", dark: "americano" }
═══════════════════════════════════════════════════════════════════════════ */}}
{{ $light_pack := "default" }}
{{ $dark_pack := "default" }}
{{ $pack := $hb_theme.pack | default "default" }}
{{ if reflect.IsMap $pack }}
{{ $light_pack = $pack.light | default "default" }}
{{ $dark_pack = $pack.dark | default "default" }}
{{ else }}
{{/* Single string applies to both */}}
{{ $light_pack = $pack }}
{{ $dark_pack = $pack }}
{{ end }}
{{/* ═══════════════════════════════════════════════════════════════════════════
COLOR OVERRIDES
═══════════════════════════════════════════════════════════════════════════ */}}
{{ $colors := $hb_theme.colors | default dict }}
{{ $colors_light := $hb_theme.colors_light | default dict }}
{{ $colors_dark := $hb_theme.colors_dark | default dict }}
{{/* ═══════════════════════════════════════════════════════════════════════════
SEMANTIC SURFACE COLORS
═══════════════════════════════════════════════════════════════════════════ */}}
{{ $surfaces := $hb_theme.surfaces | default dict }}
{{/* ═══════════════════════════════════════════════════════════════════════════
TYPOGRAPHY
Font packs are loaded from data/fonts/ and provide:
- families: { heading, body, code, nav }
- weights: { heading, body, code, nav } (arrays)
- sizes: { base, sm, lg }
- leading: { heading, body, code }
- tracking: { heading, body, caps }
Legacy support: typography.font (sans/serif/native) maps to pack names
═══════════════════════════════════════════════════════════════════════════ */}}
{{ $hb_typography := $hb.typography | default dict }}
{{/* Resolve font pack name */}}
{{ $font_pack_name := $hb_typography.pack | default "modern" }}
{{/* Load the font pack */}}
{{ $font_pack := partial "functions/load_font_pack" $font_pack_name }}
{{/* Resolve families — inline overrides take priority */}}
{{ $pack_families := $font_pack.families | default dict }}
{{ $inline_families := $hb_typography.families | default dict }}
{{ $families := dict
"heading" ($inline_families.heading | default $pack_families.heading | default "Inter")
"body" ($inline_families.body | default $pack_families.body | default "Inter")
"code" ($inline_families.code | default $pack_families.code | default "JetBrains Mono")
"nav" ($inline_families.nav | default $pack_families.nav | default "")
}}
{{/* Resolve weights — inline overrides take priority */}}
{{ $pack_weights := $font_pack.weights | default dict }}
{{ $inline_weights := $hb_typography.weights | default dict }}
{{ $weights := dict
"heading" ($inline_weights.heading | default $pack_weights.heading | default (slice 700))
"body" ($inline_weights.body | default $pack_weights.body | default (slice 400))
"code" ($inline_weights.code | default $pack_weights.code | default (slice 400))
"nav" ($inline_weights.nav | default $pack_weights.nav | default (slice))
}}
{{/* Resolve sizes — inline overrides take priority */}}
{{ $pack_sizes := $font_pack.sizes | default dict }}
{{ $inline_sizes := $hb_typography.sizes | default dict }}
{{ $sizes := dict
"base" ($inline_sizes.base | default $pack_sizes.base | default "1rem")
"sm" ($inline_sizes.sm | default $pack_sizes.sm | default "0.875rem")
"lg" ($inline_sizes.lg | default $pack_sizes.lg | default "1.125rem")
}}
{{/* Resolve leading (line-height) */}}
{{ $pack_leading := $font_pack.leading | default dict }}
{{ $inline_leading := $hb_typography.leading | default dict }}
{{ $leading := dict
"heading" ($inline_leading.heading | default $pack_leading.heading | default 1.2)
"body" ($inline_leading.body | default $pack_leading.body | default 1.6)
"code" ($inline_leading.code | default $pack_leading.code | default 1.5)
}}
{{/* Resolve tracking (letter-spacing) */}}
{{ $pack_tracking := $font_pack.tracking | default dict }}
{{ $inline_tracking := $hb_typography.tracking | default dict }}
{{ $tracking := dict
"heading" ($inline_tracking.heading | default $pack_tracking.heading | default "-0.02em")
"body" ($inline_tracking.body | default $pack_tracking.body | default "0")
"caps" ($inline_tracking.caps | default $pack_tracking.caps | default "0.05em")
}}
{{/* Resolve variable font flags */}}
{{ $pack_variable := $font_pack.variable | default dict }}
{{ $inline_variable := $hb_typography.variable | default dict }}
{{ $variable := dict
"heading" ($inline_variable.heading | default $pack_variable.heading | default false)
"body" ($inline_variable.body | default $pack_variable.body | default false)
"code" ($inline_variable.code | default $pack_variable.code | default false)
"nav" ($inline_variable.nav | default $pack_variable.nav | default false)
}}
{{ $typography := dict
"pack" $font_pack_name
"style" ($font_pack.meta.style | default "sans")
"families" $families
"weights" $weights
"variable" $variable
"sizes" $sizes
"leading" $leading
"tracking" $tracking
}}
{{/* ═══════════════════════════════════════════════════════════════════════════
LAYOUT TOKENS
═══════════════════════════════════════════════════════════════════════════ */}}
{{ $hb_layout := $hb.layout | default dict }}
{{ $layout := dict
"radius" ($hb_layout.radius | default "md")
"spacing" ($hb_layout.spacing | default "spacious")
}}
{{/* Return theme config dict */}}
{{ return dict
"mode" $mode
"light" $light_pack
"dark" $dark_pack
"colors" $colors
"colors_light" $colors_light
"colors_dark" $colors_dark
"surfaces" $surfaces
"typography" $typography
"layout" $layout
}}