diff --git a/hdyc-svelte/src/app.css b/hdyc-svelte/src/app.css index dbd1aae..2acd1f0 100644 --- a/hdyc-svelte/src/app.css +++ b/hdyc-svelte/src/app.css @@ -10,7 +10,7 @@ font-family: 'Inter'; font-style: normal; font-weight: 500; - font-display: swap; + font-display: optional; src: url('/fonts/inter/Inter-Medium.woff2') format('woff2'); } @@ -18,7 +18,7 @@ font-family: 'Inter'; font-style: normal; font-weight: 600; - font-display: swap; + font-display: optional; src: url('/fonts/inter/Inter-SemiBold.woff2') format('woff2'); } @@ -26,7 +26,7 @@ font-family: 'Inter'; font-style: normal; font-weight: 700; - font-display: swap; + font-display: optional; src: url('/fonts/inter/Inter-Bold.woff2') format('woff2'); } @@ -42,7 +42,7 @@ font-family: 'JetBrains Mono'; font-style: normal; font-weight: 400; - font-display: swap; + font-display: optional; src: url('/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2') format('woff2'); } @@ -50,7 +50,7 @@ font-family: 'JetBrains Mono'; font-style: normal; font-weight: 500; - font-display: swap; + font-display: optional; src: url('/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2') format('woff2'); } @@ -58,7 +58,7 @@ font-family: 'JetBrains Mono'; font-style: normal; font-weight: 600; - font-display: swap; + font-display: optional; src: url('/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2') format('woff2'); } diff --git a/hdyc-svelte/src/lib/components/QuickDefinitionCard.svelte b/hdyc-svelte/src/lib/components/QuickDefinitionCard.svelte index c5536c1..26308f9 100644 --- a/hdyc-svelte/src/lib/components/QuickDefinitionCard.svelte +++ b/hdyc-svelte/src/lib/components/QuickDefinitionCard.svelte @@ -1,6 +1,6 @@
diff --git a/hdyc-svelte/src/lib/data/unitDefinitions.ts b/hdyc-svelte/src/lib/data/unitDefinitions.ts index dce7e5f..77a4699 100644 --- a/hdyc-svelte/src/lib/data/unitDefinitions.ts +++ b/hdyc-svelte/src/lib/data/unitDefinitions.ts @@ -1,4 +1,4 @@ -import { calculators } from './calculators'; +import { loadCalculators, type CalculatorDef } from './calculatorLoader'; const domainDefinitions: Record = { length: { @@ -97,7 +97,6 @@ const normalizeLabel = (label?: string): string | undefined => { return alias ?? trimmed; }; -const definitions: Record> = {}; const categoryPriority = [...Object.keys(domainDefinitions)]; const buildDefinition = (label: string, categoryKey: string): string => { @@ -107,17 +106,36 @@ const buildDefinition = (label: string, categoryKey: string): string => { return `${label} ${description}`; }; -calculators.forEach(calc => { - const { category, labels } = calc; - Object.values(labels).forEach(label => { - const normalized = normalizeLabel(label); - if (!normalized) return; - const bucket = definitions[normalized] || {}; - const text = buildDefinition(normalized, category); - bucket[category] = text; - definitions[normalized] = bucket; +// Lazily built definitions cache +let definitions: Record> | null = null; +let buildPromise: Promise | null = null; + +async function ensureBuilt(): Promise>> { + if (definitions) return definitions; + if (buildPromise) { + await buildPromise; + return definitions!; + } + + buildPromise = loadCalculators().then(calculators => { + const defs: Record> = {}; + calculators.forEach(calc => { + const { category, labels } = calc; + Object.values(labels).forEach(label => { + const normalized = normalizeLabel(label); + if (!normalized) return; + const bucket = defs[normalized] || {}; + const text = buildDefinition(normalized, category); + bucket[category] = text; + defs[normalized] = bucket; + }); + }); + definitions = defs; }); -}); + + await buildPromise; + return definitions!; +} const findByPriority = (entries: Record, preferred?: string): string | undefined => { if (!entries) return undefined; @@ -129,11 +147,10 @@ const findByPriority = (entries: Record, preferred?: string): st return fallback.length ? fallback[0] : undefined; }; -export function getDefinition(label: string, category?: string): string | undefined { +export async function getDefinition(label: string, category?: string): Promise { const normalized = normalizeLabel(label); if (!normalized) return undefined; - const entries = definitions[normalized]; + const defs = await ensureBuilt(); + const entries = defs[normalized]; return findByPriority(entries, category); } - -export const unitDefinitions = definitions; diff --git a/hdyc-svelte/src/lib/palettes.ts b/hdyc-svelte/src/lib/palettes.ts new file mode 100644 index 0000000..98d1c13 --- /dev/null +++ b/hdyc-svelte/src/lib/palettes.ts @@ -0,0 +1,244 @@ +export type ThemeMode = 'light' | 'dark'; +export type PaletteVar = + | 'bg' + | 'bg-elevated' + | 'sidebar-bg' + | 'card-bg' + | 'input-bg' + | 'hover-bg' + | 'border' + | 'text' + | 'text-muted' + | 'accent' + | 'accent-dark' + | 'accent-glow' + | 'accent-gradient' + | 'header-bg'; + +export type PaletteTheme = Record; + +export type Palette = { + slug: string; + label: string; + light: PaletteTheme; + dark: PaletteTheme; +}; + +export const palettes: Palette[] = [ + { + slug: 'classic', + label: 'Classic', + light: { + bg: '#f8fafc', + 'bg-elevated': '#ffffff', + 'sidebar-bg': '#ffffff', + 'card-bg': '#ffffff', + 'input-bg': 'rgba(15, 23, 42, 0.04)', + 'hover-bg': 'rgba(15, 23, 42, 0.08)', + border: 'rgba(15, 23, 42, 0.12)', + text: '#0f172a', + 'text-muted': '#475569', + accent: '#10b981', + 'accent-dark': '#059669', + 'accent-glow': 'rgba(16, 185, 129, 0.15)', + 'accent-gradient': 'linear-gradient(135deg, #10b981, #06b6d4)', + 'header-bg': 'rgba(255, 255, 255, 0.95)', + }, + dark: { + bg: '#0c0f14', + 'bg-elevated': '#12161e', + 'sidebar-bg': '#10141b', + 'card-bg': 'rgba(18, 22, 30, 0.85)', + 'input-bg': 'rgba(255, 255, 255, 0.04)', + 'hover-bg': 'rgba(255, 255, 255, 0.06)', + border: 'rgba(255, 255, 255, 0.08)', + text: '#e8ecf4', + 'text-muted': '#7b8498', + accent: '#10b981', + 'accent-dark': '#059669', + 'accent-glow': 'rgba(16, 185, 129, 0.15)', + 'accent-gradient': 'linear-gradient(135deg, #10b981, #06b6d4)', + 'header-bg': 'rgba(12, 15, 20, 0.85)', + }, + }, + { + slug: 'emerald', + label: 'Emerald', + light: { + 'bg': '#f6fbf9', + 'bg-elevated': '#ffffff', + 'sidebar-bg': '#ffffff', + 'card-bg': '#ffffff', + 'input-bg': '#ecf7f1', + 'hover-bg': '#d5f0df', + 'border': 'rgba(4, 120, 87, 0.25)', + 'text': '#0b2c1f', + 'text-muted': '#4a6b5c', + 'accent': '#047857', + 'accent-dark': '#065f46', + 'accent-glow': 'rgba(4, 120, 87, 0.2)', + 'accent-gradient': 'linear-gradient(135deg, #047857, #0ea5e9)', + 'header-bg': 'rgba(255, 255, 255, 0.95)', + }, + dark: { + 'bg': '#0b1313', + 'bg-elevated': 'rgba(4, 20, 15, 0.85)', + 'sidebar-bg': '#08110f', + 'card-bg': 'rgba(6, 19, 13, 0.75)', + 'input-bg': 'rgba(16, 185, 129, 0.08)', + 'hover-bg': 'rgba(16, 185, 129, 0.12)', + 'border': 'rgba(16, 185, 129, 0.35)', + 'text': '#e9fcea', + 'text-muted': '#9fdac4', + 'accent': '#10b981', + 'accent-dark': '#059669', + 'accent-glow': 'rgba(16, 185, 129, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #10b981, #0ea5e9)', + 'header-bg': 'rgba(12, 15, 20, 0.85)', + }, + }, + { + slug: 'sunset', + label: 'Sunset', + light: { + 'bg': '#fff8f2', + 'bg-elevated': '#ffffff', + 'sidebar-bg': '#ffffff', + 'card-bg': '#fff4ef', + 'input-bg': '#ffe3d8', + 'hover-bg': '#ffd3bf', + 'border': 'rgba(249, 115, 22, 0.25)', + 'text': '#3d1b0b', + 'text-muted': '#7a4a37', + 'accent': '#f97316', + 'accent-dark': '#c2410c', + 'accent-glow': 'rgba(249, 115, 22, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #f97316, #ec4899)', + 'header-bg': 'rgba(255, 255, 255, 0.96)', + }, + dark: { + 'bg': '#0f0505', + 'bg-elevated': 'rgba(15, 5, 5, 0.85)', + 'sidebar-bg': '#0c0404', + 'card-bg': 'rgba(19, 6, 6, 0.7)', + 'input-bg': 'rgba(251, 113, 133, 0.08)', + 'hover-bg': 'rgba(251, 113, 133, 0.14)', + 'border': 'rgba(251, 113, 133, 0.35)', + 'text': '#ffe7e0', + 'text-muted': '#f9a6aa', + 'accent': '#fb7185', + 'accent-dark': '#be123c', + 'accent-glow': 'rgba(251, 113, 133, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #fb7185, #f97316)', + 'header-bg': 'rgba(12, 8, 6, 0.85)', + }, + }, + { + slug: 'ocean', + label: 'Ocean', + light: { + 'bg': '#f4fbff', + 'bg-elevated': '#ffffff', + 'sidebar-bg': '#ffffff', + 'card-bg': '#f0f7ff', + 'input-bg': '#dcefff', + 'hover-bg': '#cae8ff', + 'border': 'rgba(14, 165, 233, 0.25)', + 'text': '#06274e', + 'text-muted': '#4d6993', + 'accent': '#0ea5e9', + 'accent-dark': '#0369a1', + 'accent-glow': 'rgba(14, 165, 233, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #0ea5e9, #4753ff)', + 'header-bg': 'rgba(255, 255, 255, 0.95)', + }, + dark: { + 'bg': '#030b12', + 'bg-elevated': 'rgba(2, 9, 20, 0.85)', + 'sidebar-bg': '#050c16', + 'card-bg': 'rgba(3, 13, 26, 0.75)', + 'input-bg': 'rgba(14, 165, 233, 0.08)', + 'hover-bg': 'rgba(14, 165, 233, 0.15)', + 'border': 'rgba(14, 165, 233, 0.4)', + 'text': '#e6f6ff', + 'text-muted': '#a1c4e8', + 'accent': '#38bdf8', + 'accent-dark': '#0369a1', + 'accent-glow': 'rgba(14, 165, 233, 0.35)', + 'accent-gradient': 'linear-gradient(135deg, #38bdf8, #0f172a)', + 'header-bg': 'rgba(6, 15, 30, 0.85)', + }, + }, + { + slug: 'orchid', + label: 'Orchid', + light: { + 'bg': '#fdf6ff', + 'bg-elevated': '#ffffff', + 'sidebar-bg': '#ffffff', + 'card-bg': '#fdf2ff', + 'input-bg': '#f5e4ff', + 'hover-bg': '#e9d4ff', + 'border': 'rgba(168, 85, 247, 0.25)', + 'text': '#2c0a3a', + 'text-muted': '#6a5277', + 'accent': '#a855f7', + 'accent-dark': '#6d28d9', + 'accent-glow': 'rgba(168, 85, 247, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #c084fc, #a855f7)', + 'header-bg': 'rgba(255, 255, 255, 0.97)', + }, + dark: { + 'bg': '#0c0215', + 'bg-elevated': 'rgba(10, 3, 30, 0.85)', + 'sidebar-bg': '#090118', + 'card-bg': 'rgba(12, 2, 25, 0.75)', + 'input-bg': 'rgba(168, 85, 247, 0.08)', + 'hover-bg': 'rgba(168, 85, 247, 0.16)', + 'border': 'rgba(168, 85, 247, 0.35)', + 'text': '#f5e6ff', + 'text-muted': '#c5a3e8', + 'accent': '#d946ef', + 'accent-dark': '#831843', + 'accent-glow': 'rgba(217, 70, 239, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #d946ef, #fb7185)', + 'header-bg': 'rgba(13, 6, 23, 0.95)', + }, + }, + { + slug: 'citrus', + label: 'Citrus', + light: { + 'bg': '#fffdf5', + 'bg-elevated': '#ffffff', + 'sidebar-bg': '#ffffff', + 'card-bg': '#fffaf0', + 'input-bg': '#fff4d8', + 'hover-bg': '#ffeec1', + 'border': 'rgba(250, 204, 21, 0.25)', + 'text': '#1f1505', + 'text-muted': '#5b4a1e', + 'accent': '#fbbf24', + 'accent-dark': '#c2410c', + 'accent-glow': 'rgba(250, 204, 21, 0.3)', + 'accent-gradient': 'linear-gradient(135deg, #fbbf24, #d97706)', + 'header-bg': 'rgba(255, 255, 255, 0.98)', + }, + dark: { + 'bg': '#1a1203', + 'bg-elevated': 'rgba(26, 18, 3, 0.9)', + 'sidebar-bg': '#130e02', + 'card-bg': 'rgba(26, 18, 3, 0.75)', + 'input-bg': 'rgba(250, 204, 21, 0.08)', + 'hover-bg': 'rgba(250, 204, 21, 0.14)', + 'border': 'rgba(250, 204, 21, 0.35)', + 'text': '#fff8e7', + 'text-muted': '#f6dea1', + 'accent': '#fbbf24', + 'accent-dark': '#b45309', + 'accent-glow': 'rgba(250, 204, 21, 0.25)', + 'accent-gradient': 'linear-gradient(135deg, #fbbf24, #f97316)', + 'header-bg': 'rgba(15, 9, 2, 0.9)', + }, + }, +]; diff --git a/hdyc-svelte/src/routes/+layout.svelte b/hdyc-svelte/src/routes/+layout.svelte index 3648dd5..f2be89f 100644 --- a/hdyc-svelte/src/routes/+layout.svelte +++ b/hdyc-svelte/src/routes/+layout.svelte @@ -7,251 +7,8 @@ import '../app.css'; import Sidebar from '$lib/components/Sidebar.svelte'; import SearchBar from '$lib/components/SearchBar.svelte'; + import { palettes, type ThemeMode, type Palette } from '$lib/palettes'; - type ThemeMode = 'light' | 'dark'; - type PaletteVar = - | 'bg' - | 'bg-elevated' - | 'sidebar-bg' - | 'card-bg' - | 'input-bg' - | 'hover-bg' - | 'border' - | 'text' - | 'text-muted' - | 'accent' - | 'accent-dark' - | 'accent-glow' - | 'accent-gradient' - | 'header-bg'; - - type PaletteTheme = Record; - - type Palette = { - slug: string; - label: string; - light: PaletteTheme; - dark: PaletteTheme; - }; - - const palettes: Palette[] = [ - { - slug: 'classic', - label: 'Classic', - light: { - bg: '#f8fafc', - 'bg-elevated': '#ffffff', - 'sidebar-bg': '#ffffff', - 'card-bg': '#ffffff', - 'input-bg': 'rgba(15, 23, 42, 0.04)', - 'hover-bg': 'rgba(15, 23, 42, 0.08)', - border: 'rgba(15, 23, 42, 0.12)', - text: '#0f172a', - 'text-muted': '#475569', - accent: '#10b981', - 'accent-dark': '#059669', - 'accent-glow': 'rgba(16, 185, 129, 0.15)', - 'accent-gradient': 'linear-gradient(135deg, #10b981, #06b6d4)', - 'header-bg': 'rgba(255, 255, 255, 0.95)', - }, - dark: { - bg: '#0c0f14', - 'bg-elevated': '#12161e', - 'sidebar-bg': '#10141b', - 'card-bg': 'rgba(18, 22, 30, 0.85)', - 'input-bg': 'rgba(255, 255, 255, 0.04)', - 'hover-bg': 'rgba(255, 255, 255, 0.06)', - border: 'rgba(255, 255, 255, 0.08)', - text: '#e8ecf4', - 'text-muted': '#7b8498', - accent: '#10b981', - 'accent-dark': '#059669', - 'accent-glow': 'rgba(16, 185, 129, 0.15)', - 'accent-gradient': 'linear-gradient(135deg, #10b981, #06b6d4)', - 'header-bg': 'rgba(12, 15, 20, 0.85)', - }, - }, - { - slug: 'emerald', - label: 'Emerald', - light: { - 'bg': '#f6fbf9', - 'bg-elevated': '#ffffff', - 'sidebar-bg': '#ffffff', - 'card-bg': '#ffffff', - 'input-bg': '#ecf7f1', - 'hover-bg': '#d5f0df', - 'border': 'rgba(4, 120, 87, 0.25)', - 'text': '#0b2c1f', - 'text-muted': '#4a6b5c', - 'accent': '#047857', - 'accent-dark': '#065f46', - 'accent-glow': 'rgba(4, 120, 87, 0.2)', - 'accent-gradient': 'linear-gradient(135deg, #047857, #0ea5e9)', - 'header-bg': 'rgba(255, 255, 255, 0.95)', - }, - dark: { - 'bg': '#0b1313', - 'bg-elevated': 'rgba(4, 20, 15, 0.85)', - 'sidebar-bg': '#08110f', - 'card-bg': 'rgba(6, 19, 13, 0.75)', - 'input-bg': 'rgba(16, 185, 129, 0.08)', - 'hover-bg': 'rgba(16, 185, 129, 0.12)', - 'border': 'rgba(16, 185, 129, 0.35)', - 'text': '#e9fcea', - 'text-muted': '#9fdac4', - 'accent': '#10b981', - 'accent-dark': '#059669', - 'accent-glow': 'rgba(16, 185, 129, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #10b981, #0ea5e9)', - 'header-bg': 'rgba(12, 15, 20, 0.85)', - }, - }, - { - slug: 'sunset', - label: 'Sunset', - light: { - 'bg': '#fff8f2', - 'bg-elevated': '#ffffff', - 'sidebar-bg': '#ffffff', - 'card-bg': '#fff4ef', - 'input-bg': '#ffe3d8', - 'hover-bg': '#ffd3bf', - 'border': 'rgba(249, 115, 22, 0.25)', - 'text': '#3d1b0b', - 'text-muted': '#7a4a37', - 'accent': '#f97316', - 'accent-dark': '#c2410c', - 'accent-glow': 'rgba(249, 115, 22, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #f97316, #ec4899)', - 'header-bg': 'rgba(255, 255, 255, 0.96)', - }, - dark: { - 'bg': '#0f0505', - 'bg-elevated': 'rgba(15, 5, 5, 0.85)', - 'sidebar-bg': '#0c0404', - 'card-bg': 'rgba(19, 6, 6, 0.7)', - 'input-bg': 'rgba(251, 113, 133, 0.08)', - 'hover-bg': 'rgba(251, 113, 133, 0.14)', - 'border': 'rgba(251, 113, 133, 0.35)', - 'text': '#ffe7e0', - 'text-muted': '#f9a6aa', - 'accent': '#fb7185', - 'accent-dark': '#be123c', - 'accent-glow': 'rgba(251, 113, 133, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #fb7185, #f97316)', - 'header-bg': 'rgba(12, 8, 6, 0.85)', - }, - }, - { - slug: 'ocean', - label: 'Ocean', - light: { - 'bg': '#f4fbff', - 'bg-elevated': '#ffffff', - 'sidebar-bg': '#ffffff', - 'card-bg': '#f0f7ff', - 'input-bg': '#dcefff', - 'hover-bg': '#cae8ff', - 'border': 'rgba(14, 165, 233, 0.25)', - 'text': '#06274e', - 'text-muted': '#4d6993', - 'accent': '#0ea5e9', - 'accent-dark': '#0369a1', - 'accent-glow': 'rgba(14, 165, 233, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #0ea5e9, #4753ff)', - 'header-bg': 'rgba(255, 255, 255, 0.95)', - }, - dark: { - 'bg': '#030b12', - 'bg-elevated': 'rgba(2, 9, 20, 0.85)', - 'sidebar-bg': '#050c16', - 'card-bg': 'rgba(3, 13, 26, 0.75)', - 'input-bg': 'rgba(14, 165, 233, 0.08)', - 'hover-bg': 'rgba(14, 165, 233, 0.15)', - 'border': 'rgba(14, 165, 233, 0.4)', - 'text': '#e6f6ff', - 'text-muted': '#a1c4e8', - 'accent': '#38bdf8', - 'accent-dark': '#0369a1', - 'accent-glow': 'rgba(14, 165, 233, 0.35)', - 'accent-gradient': 'linear-gradient(135deg, #38bdf8, #0f172a)', - 'header-bg': 'rgba(6, 15, 30, 0.85)', - }, - }, - { - slug: 'orchid', - label: 'Orchid', - light: { - 'bg': '#fdf6ff', - 'bg-elevated': '#ffffff', - 'sidebar-bg': '#ffffff', - 'card-bg': '#fdf2ff', - 'input-bg': '#f5e4ff', - 'hover-bg': '#e9d4ff', - 'border': 'rgba(168, 85, 247, 0.25)', - 'text': '#2c0a3a', - 'text-muted': '#6a5277', - 'accent': '#a855f7', - 'accent-dark': '#6d28d9', - 'accent-glow': 'rgba(168, 85, 247, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #c084fc, #a855f7)', - 'header-bg': 'rgba(255, 255, 255, 0.97)', - }, - dark: { - 'bg': '#0c0215', - 'bg-elevated': 'rgba(10, 3, 30, 0.85)', - 'sidebar-bg': '#090118', - 'card-bg': 'rgba(12, 2, 25, 0.75)', - 'input-bg': 'rgba(168, 85, 247, 0.08)', - 'hover-bg': 'rgba(168, 85, 247, 0.16)', - 'border': 'rgba(168, 85, 247, 0.35)', - 'text': '#f5e6ff', - 'text-muted': '#c5a3e8', - 'accent': '#d946ef', - 'accent-dark': '#831843', - 'accent-glow': 'rgba(217, 70, 239, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #d946ef, #fb7185)', - 'header-bg': 'rgba(13, 6, 23, 0.95)', - }, - }, - { - slug: 'citrus', - label: 'Citrus', - light: { - 'bg': '#fffdf5', - 'bg-elevated': '#ffffff', - 'sidebar-bg': '#ffffff', - 'card-bg': '#fffaf0', - 'input-bg': '#fff4d8', - 'hover-bg': '#ffeec1', - 'border': 'rgba(250, 204, 21, 0.25)', - 'text': '#1f1505', - 'text-muted': '#5b4a1e', - 'accent': '#fbbf24', - 'accent-dark': '#c2410c', - 'accent-glow': 'rgba(250, 204, 21, 0.3)', - 'accent-gradient': 'linear-gradient(135deg, #fbbf24, #d97706)', - 'header-bg': 'rgba(255, 255, 255, 0.98)', - }, - dark: { - 'bg': '#1a1203', - 'bg-elevated': 'rgba(26, 18, 3, 0.9)', - 'sidebar-bg': '#130e02', - 'card-bg': 'rgba(26, 18, 3, 0.75)', - 'input-bg': 'rgba(250, 204, 21, 0.08)', - 'hover-bg': 'rgba(250, 204, 21, 0.14)', - 'border': 'rgba(250, 204, 21, 0.35)', - 'text': '#fff8e7', - 'text-muted': '#f6dea1', - 'accent': '#fbbf24', - 'accent-dark': '#b45309', - 'accent-glow': 'rgba(250, 204, 21, 0.25)', - 'accent-gradient': 'linear-gradient(135deg, #fbbf24, #f97316)', - 'header-bg': 'rgba(15, 9, 2, 0.9)', - }, - }, - ]; const matomoContainerSrc = 'https://matomo.howdoyouconvert.com/js/container_B3r877Kn.js'; type WindowWithAnalytics = Window & {