Files
readest/apps/readest-app/src/styles/themes.ts
T
2024-12-27 11:33:38 +01:00

112 lines
3.7 KiB
TypeScript

import tinycolor from 'tinycolor2';
import { stubTranslation as _ } from '../utils/misc';
type BaseColor = {
bg: string;
fg: string;
primary: string;
};
const generateLightPalette = ({ bg, fg, primary }: BaseColor) => {
return {
'base-100': bg, // Main background
'base-200': tinycolor(bg).darken(5).toHexString(), // Slightly darker
'base-300': tinycolor(bg).darken(15).toHexString(), // More darker
'base-content': fg, // Main text color
neutral: tinycolor(bg).darken(15).desaturate(20).toHexString(), // Muted neutral
'neutral-content': tinycolor(fg).lighten(20).desaturate(20).toHexString(), // Slightly lighter text
primary: primary,
secondary: tinycolor(primary).lighten(20).toHexString(), // Lighter secondary
accent: tinycolor(primary).analogous()[1]!.toHexString(), // Analogous accent
};
};
const generateDarkPalette = ({ bg, fg, primary }: BaseColor) => {
return {
'base-100': bg, // Main background
'base-200': tinycolor(bg).lighten(5).toHexString(), // Slightly lighter
'base-300': tinycolor(bg).lighten(15).toHexString(), // More lighter
'base-content': fg, // Main text color
neutral: tinycolor(bg).lighten(15).desaturate(20).toHexString(), // Muted neutral
'neutral-content': tinycolor(fg).darken(20).desaturate(20).toHexString(), // Darkened text
primary: primary,
secondary: tinycolor(primary).darken(20).toHexString(), // Darker secondary
accent: tinycolor(primary).triad()[1]!.toHexString(), // Triad accent
};
};
export const themes = [
{
name: 'default',
label: _('Default'),
colors: {
light: generateLightPalette({ fg: '#171717', bg: '#ffffff', primary: '#0066cc' }),
dark: generateDarkPalette({ fg: '#e0e0e0', bg: '#222222', primary: '#77bbee' }),
},
},
{
name: 'gray',
label: _('Gray'),
colors: {
light: generateLightPalette({ fg: '#222222', bg: '#e0e0e0', primary: '#4488cc' }),
dark: generateDarkPalette({ fg: '#c6c6c6', bg: '#444444', primary: '#88ccee' }),
},
},
{
name: 'sepia',
label: _('Sepia'),
colors: {
light: generateLightPalette({ fg: '#5b4636', bg: '#f1e8d0', primary: '#008b8b' }),
dark: generateDarkPalette({ fg: '#ffd595', bg: '#342e25', primary: '#48d1cc' }),
},
},
{
name: 'grass',
label: _('Grass'),
colors: {
light: generateLightPalette({ fg: '#232c16', bg: '#d7dbbd', primary: '#177b4d' }),
dark: generateDarkPalette({ fg: '#d8deba', bg: '#333627', primary: '#a6d608' }),
},
},
{
name: 'cherry',
label: _('Cherry'),
colors: {
light: generateLightPalette({ fg: '#4e1609', bg: '#f0d1d5', primary: '#de3838' }),
dark: generateDarkPalette({ fg: '#e5c4c8', bg: '#462f32', primary: '#ff646e' }),
},
},
{
name: 'sky',
label: _('Sky'),
colors: {
light: generateLightPalette({ fg: '#262d48', bg: '#cedef5', primary: '#2d53e5' }),
dark: generateDarkPalette({ fg: '#babee1', bg: '#282e47', primary: '#ff646e' }),
},
},
{
name: 'solarized',
label: _('Solarized'),
colors: {
light: generateLightPalette({ fg: '#586e75', bg: '#fdf6e3', primary: '#268bd2' }),
dark: generateDarkPalette({ fg: '#93a1a1', bg: '#002b36', primary: '#268bd2' }),
},
},
{
name: 'gruvbox',
label: _('Gruvbox'),
colors: {
light: generateLightPalette({ fg: '#3c3836', bg: '#fbf1c7', primary: '#076678' }),
dark: generateDarkPalette({ fg: '#ebdbb2', bg: '#282828', primary: '#83a598' }),
},
},
{
name: 'nord',
label: _('Nord'),
colors: {
light: generateLightPalette({ fg: '#2e3440', bg: '#eceff4', primary: '#5e81ac' }),
dark: generateDarkPalette({ fg: '#d8dee9', bg: '#2e3440', primary: '#88c0d0' }),
},
},
];