mirror of
https://github.com/tiennm99/HugoBlox-kit.git
synced 2026-10-12 16:15:12 +00:00
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
166 lines
8.4 KiB
HTML
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
|
|
}}
|