109 lines
4.8 KiB
Text
109 lines
4.8 KiB
Text
|
|
#!/usr/bin/env nu
|
||
|
|
# Change the site font by updating all CSS config files and rebuilding.
|
||
|
|
#
|
||
|
|
# Usage:
|
||
|
|
# nu scripts/build/change-font.nu Literata serif
|
||
|
|
# nu scripts/build/change-font.nu Inter sans-serif
|
||
|
|
# nu scripts/build/change-font.nu "Source Serif 4" serif
|
||
|
|
# nu scripts/build/change-font.nu --list
|
||
|
|
|
||
|
|
def main [
|
||
|
|
font?: string, # Font family name (e.g. "Literata", "Inter")
|
||
|
|
category?: string = "serif", # Font category: serif | sans-serif | monospace
|
||
|
|
--list(-l), # List Google Fonts popular options
|
||
|
|
--no-rebuild(-n), # Skip pnpm css:build
|
||
|
|
] {
|
||
|
|
if $list {
|
||
|
|
print "Popular Google Fonts:"
|
||
|
|
print " Serif: Literata | Merriweather | Lora | Playfair Display | Source Serif 4"
|
||
|
|
print " Sans-serif: Inter | Roboto | Open Sans | Nunito | DM Sans | Outfit"
|
||
|
|
print " Monospace: JetBrains Mono | Fira Code | Source Code Pro"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
let font_name = $font | default ""
|
||
|
|
if ($font_name | is-empty) {
|
||
|
|
error make { msg: "Font name required. Run with --list to see options." }
|
||
|
|
}
|
||
|
|
|
||
|
|
let valid_categories = ["serif", "sans-serif", "monospace"]
|
||
|
|
if not ($category in $valid_categories) {
|
||
|
|
error make { msg: $"Category must be one of: ($valid_categories | str join ', ')" }
|
||
|
|
}
|
||
|
|
|
||
|
|
# Build fallback stack based on category
|
||
|
|
let fallback = match $category {
|
||
|
|
"serif" => "ui-serif, Georgia, Cambria, 'Times New Roman', serif",
|
||
|
|
"sans-serif" => "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif",
|
||
|
|
"monospace" => "ui-monospace, 'Cascadia Code', 'SF Mono', Consolas, monospace",
|
||
|
|
_ => "ui-serif, Georgia, serif",
|
||
|
|
}
|
||
|
|
|
||
|
|
let font_stack = $"'($font_name)', ($fallback)"
|
||
|
|
|
||
|
|
# Derive the camelCase key for presetWebFonts from the font name
|
||
|
|
# "Source Serif 4" → "sourceSerif4", "JetBrains Mono" → "jetbrainsMono"
|
||
|
|
let font_key = $font_name
|
||
|
|
| str downcase
|
||
|
|
| str replace --all " " "-"
|
||
|
|
| split row "-"
|
||
|
|
| enumerate
|
||
|
|
| each { |it|
|
||
|
|
if $it.index == 0 {
|
||
|
|
$it.item
|
||
|
|
} else {
|
||
|
|
$it.item | str capitalize
|
||
|
|
}
|
||
|
|
}
|
||
|
|
| str join ""
|
||
|
|
|
||
|
|
print $"Changing site font to: ($font_name) \(($category)\)"
|
||
|
|
|
||
|
|
# ─── 1. design-system.css ──────────────────────────────────────────────
|
||
|
|
let ds_path = "works-pv/cache/assets/styles/design-system.css"
|
||
|
|
let ds_content = open $ds_path
|
||
|
|
let ds_new = $ds_content | str replace --regex "--font-sans:.*;" $"--font-sans: ($font_stack);"
|
||
|
|
$ds_new | save --force $ds_path
|
||
|
|
print $" ✓ Updated ($ds_path)"
|
||
|
|
|
||
|
|
# ─── 2. theme-default.css ──────────────────────────────────────────────
|
||
|
|
let theme_path = "works-pv/cache/assets/styles/theme-default.css"
|
||
|
|
let theme_content = open $theme_path
|
||
|
|
let theme_new = $theme_content | str replace --regex "--font-family-sans:.*;" $"--font-family-sans: ($font_stack);"
|
||
|
|
$theme_new | save --force $theme_path
|
||
|
|
print $" ✓ Updated ($theme_path)"
|
||
|
|
|
||
|
|
# ─── 3. uno.config.ts ─ presetWebFonts entry ───────────────────────────
|
||
|
|
let uno_path = "uno.config.ts"
|
||
|
|
let uno_content = open $uno_path
|
||
|
|
|
||
|
|
# Replace the entire fonts block inside presetWebFonts({ ... })
|
||
|
|
let fonts_block = $" ($font_key): [\n \{\n name: \"($font_name)\",\n weights: [\"300\", \"400\", \"500\", \"600\", \"700\"],\n italic: true,\n \},\n ],"
|
||
|
|
|
||
|
|
let uno_fonts = $uno_content
|
||
|
|
| str replace --regex '(?s)provider: "google",\s*fonts: \{[^}]*(?:\{[^}]*\}[^}]*)?\},' $"provider: \"google\",\n fonts: \{\n($fonts_block)\n \},"
|
||
|
|
|
||
|
|
# Replace the body font-family in preflights
|
||
|
|
let uno_body = $uno_fonts
|
||
|
|
| str replace --regex "font-family: '[^']+',.*serif;" $"font-family: ($font_stack);"
|
||
|
|
|
||
|
|
$uno_body | save --force $uno_path
|
||
|
|
print $" ✓ Updated ($uno_path)"
|
||
|
|
|
||
|
|
# ─── 4. Rebuild CSS ────────────────────────────────────────────────────
|
||
|
|
if not $no_rebuild {
|
||
|
|
print " ↻ Rebuilding CSS..."
|
||
|
|
let result = do { pnpm run css:build } | complete
|
||
|
|
if $result.exit_code == 0 {
|
||
|
|
print " ✓ CSS rebuilt"
|
||
|
|
} else {
|
||
|
|
print $" ✗ CSS build failed:\n($result.stderr)"
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
print " ⚠ Skipped CSS rebuild (--no-rebuild)"
|
||
|
|
}
|
||
|
|
|
||
|
|
print $"\nFont changed to: ($font_name)"
|
||
|
|
print "Restart the dev server or run `cargo leptos watch` to see changes."
|
||
|
|
}
|