| | |
| | | export interface ColorScheme { |
| | | light: string, |
| | | lightgray: string, |
| | | gray: string, |
| | | darkgray: string, |
| | | dark: string, |
| | | secondary: string, |
| | | tertiary: string, |
| | | light: string |
| | | lightgray: string |
| | | gray: string |
| | | darkgray: string |
| | | dark: string |
| | | secondary: string |
| | | tertiary: string |
| | | highlight: string |
| | | } |
| | | |
| | | export interface Theme { |
| | | typography: { |
| | | header: string, |
| | | body: string, |
| | | header: string |
| | | body: string |
| | | code: string |
| | | }, |
| | | } |
| | | colors: { |
| | | lightMode: ColorScheme, |
| | | lightMode: ColorScheme |
| | | darkMode: ColorScheme |
| | | } |
| | | } |
| | | |
| | | const DEFAULT_SANS_SERIF = |
| | | '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif' |
| | | const DEFAULT_MONO = "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace" |
| | | export function googleFontHref(theme: Theme) { |
| | | const { code, header, body } = theme.typography |
| | | return `https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap` |
| | | } |
| | | |
| | | export function templateThemeStyles(theme: Theme, stylesheet: string) { |
| | | return ` |
| | | :root { |
| | | export function joinStyles(theme: Theme, ...stylesheet: string[]) { |
| | | return `:root { |
| | | --light: ${theme.colors.lightMode.light}; |
| | | --lightgray: ${theme.colors.lightMode.lightgray}; |
| | | --gray: ${theme.colors.lightMode.gray}; |
| | |
| | | --tertiary: ${theme.colors.lightMode.tertiary}; |
| | | --highlight: ${theme.colors.lightMode.highlight}; |
| | | |
| | | --headerFont: ${theme.typography.header}; |
| | | --bodyFont: ${theme.typography.body}; |
| | | --codeFont: ${theme.typography.code}; |
| | | --headerFont: ${theme.typography.header}, ${DEFAULT_SANS_SERIF}; |
| | | --bodyFont: ${theme.typography.body}, ${DEFAULT_SANS_SERIF}; |
| | | --codeFont: ${theme.typography.code}, ${DEFAULT_MONO}; |
| | | } |
| | | |
| | | :root[saved-theme="dark"] { |
| | |
| | | --highlight: ${theme.colors.darkMode.highlight}; |
| | | } |
| | | |
| | | ${stylesheet} |
| | | ` |
| | | ${stylesheet.join("\n\n")}` |
| | | } |