1- import { QuartzConfig } from "./quartz/cfg" ;
2- import * as Plugin from "./quartz/plugins" ;
1+ import { QuartzConfig } from "./quartz/cfg"
2+ import * as Plugin from "./quartz/plugins"
3+
4+ type ThemeColors = {
5+ light : string
6+ lightgray : string
7+ gray : string
8+ darkgray : string
9+ dark : string
10+ secondary : string
11+ tertiary : string
12+ highlight : string
13+ }
14+
15+ type Themes = {
16+ lightMode : ThemeColors
17+ darkMode : ThemeColors
18+ }
19+
20+ function hslToHex ( h : number , s : number , l : number ) : string {
21+ l /= 100
22+ const a = ( s * Math . min ( l , 1 - l ) ) / 100
23+ const f = ( n : number ) => {
24+ const k = ( n + h / 30 ) % 12
25+ const color = l - a * Math . max ( Math . min ( k - 3 , 9 - k , 1 ) , - 1 )
26+ return Math . round ( 255 * color )
27+ . toString ( 16 )
28+ . padStart ( 2 , "0" )
29+ }
30+ return `#${ f ( 0 ) } ${ f ( 8 ) } ${ f ( 4 ) } `
31+ }
32+
33+ function hslToRgba ( h : number , s : number , l : number , a : number ) : string {
34+ l /= 100
35+ const a_s = ( s * Math . min ( l , 1 - l ) ) / 100
36+ const f = ( n : number ) => {
37+ const k = ( n + h / 30 ) % 12
38+ const color = l - a_s * Math . max ( Math . min ( k - 3 , 9 - k , 1 ) , - 1 )
39+ return Math . round ( 255 * color )
40+ }
41+ const r = f ( 0 )
42+ const g = f ( 8 )
43+ const b = f ( 4 )
44+ return `rgba(${ r } , ${ g } , ${ b } , ${ a } )`
45+ }
46+
47+ function generateTheme ( baseHue : number , baseSaturation : number , baseLightness : number ) : Themes {
48+ const lightMode : ThemeColors = {
49+ light : hslToHex ( baseHue , baseSaturation , baseLightness + 80 ) ,
50+ lightgray : hslToHex ( baseHue , baseSaturation , baseLightness + 50 ) ,
51+ gray : hslToHex ( baseHue , baseSaturation , baseLightness + 20 ) ,
52+ darkgray : hslToHex ( baseHue , baseSaturation , baseLightness - 30 ) ,
53+ dark : hslToHex ( baseHue , baseSaturation , baseLightness - 50 ) ,
54+ secondary : hslToHex ( ( baseHue + 30 ) % 360 , baseSaturation , baseLightness ) ,
55+ tertiary : hslToHex ( ( baseHue + 60 ) % 360 , baseSaturation , baseLightness ) ,
56+ highlight : hslToRgba ( baseHue , baseSaturation , baseLightness , 0.15 ) ,
57+ }
58+
59+ const darkMode : ThemeColors = {
60+ light : hslToHex ( baseHue , baseSaturation , baseLightness - 80 ) ,
61+ lightgray : hslToHex ( baseHue , baseSaturation , baseLightness - 50 ) ,
62+ gray : hslToHex ( baseHue , baseSaturation , baseLightness - 20 ) ,
63+ darkgray : hslToHex ( baseHue , baseSaturation , baseLightness + 30 ) ,
64+ dark : hslToHex ( baseHue , baseSaturation , baseLightness + 50 ) ,
65+ secondary : hslToHex ( ( baseHue + 210 ) % 360 , baseSaturation , baseLightness ) ,
66+ tertiary : hslToHex ( ( baseHue + 60 ) % 360 , baseSaturation , baseLightness ) ,
67+ highlight : hslToRgba ( baseHue , baseSaturation , baseLightness , 0.15 ) ,
68+ }
69+
70+ return { lightMode, darkMode }
71+ }
372
473/**
574 * Quartz 4.0 Configuration
@@ -26,28 +95,12 @@ const config: QuartzConfig = {
2695 body : "Source Sans Pro" ,
2796 code : "IBM Plex Mono" ,
2897 } ,
29- colors : {
30- lightMode : {
31- light : "#faf8f8" ,
32- lightgray : "#e5e5e5" ,
33- gray : "#b8b8b8" ,
34- darkgray : "#4e4e4e" ,
35- dark : "#2b2b2b" ,
36- secondary : "#284b63" ,
37- tertiary : "#84a59d" ,
38- highlight : "rgba(143, 159, 169, 0.15)" ,
39- } ,
40- darkMode : {
41- light : "#161618" ,
42- lightgray : "#393639" ,
43- gray : "#646464" ,
44- darkgray : "#d4d4d4" ,
45- dark : "#ebebec" ,
46- secondary : "#7b97aa" ,
47- tertiary : "#84a59d" ,
48- highlight : "rgba(143, 159, 169, 0.15)" ,
49- } ,
50- } ,
98+ colors : generateTheme (
99+ // 210, // blue
100+ 20 , // blue
101+ 50 , // 50%
102+ 50 , // 50%
103+ ) ,
51104 } ,
52105 } ,
53106 plugins : {
0 commit comments