11import { useState , useEffect } from 'react' ;
22import { useTheme } from '@plannotator/ui/components/ThemeProvider' ;
33
4- export const SHIKI_THEME_MAP : Record < string , { dark : string ; light : string } > = {
5- 'andromeeda' : { dark : 'andromeeda' , light : 'andromeeda' } ,
6- 'aurora-x' : { dark : 'aurora-x' , light : 'aurora-x' } ,
7- 'ayu-dark' : { dark : 'ayu-dark' , light : 'ayu-dark' } ,
4+ export const SHIKI_THEME_MAP : Record < string , { dark : string | null ; light : string | null } > = {
5+ 'andromeeda' : { dark : 'andromeeda' , light : null } ,
6+ 'aurora-x' : { dark : 'aurora-x' , light : null } ,
7+ 'ayu-dark' : { dark : 'ayu-dark' , light : null } ,
88 'catppuccin' : { dark : 'catppuccin-mocha' , light : 'catppuccin-latte' } ,
99 'dark-plus' : { dark : 'dark-plus' , light : 'light-plus' } ,
10- 'dracula' : { dark : 'dracula' , light : 'dracula' } ,
10+ 'dracula' : { dark : 'dracula' , light : null } ,
1111 'everforest' : { dark : 'everforest-dark' , light : 'everforest-light' } ,
1212 'everforest-hard' : { dark : 'everforest-dark' , light : 'everforest-light' } ,
1313 'everforest-soft' : { dark : 'everforest-dark' , light : 'everforest-light' } ,
1414 'github' : { dark : 'github-dark' , light : 'github-light' } ,
1515 'gruvbox' : { dark : 'gruvbox-dark-medium' , light : 'gruvbox-light-medium' } ,
16- 'houston' : { dark : 'houston' , light : 'houston' } ,
17- 'kanagawa-dragon' : { dark : 'kanagawa-dragon' , light : 'kanagawa-dragon' } ,
18- 'kanagawa-lotus' : { dark : 'kanagawa-lotus' , light : 'kanagawa-lotus' } ,
19- 'kanagawa-wave' : { dark : 'kanagawa-wave' , light : 'kanagawa-wave' } ,
20- 'laserwave' : { dark : 'laserwave' , light : 'laserwave' } ,
16+ 'houston' : { dark : 'houston' , light : null } ,
17+ 'kanagawa-dragon' : { dark : 'kanagawa-dragon' , light : null } ,
18+ 'kanagawa-lotus' : { dark : null , light : 'kanagawa-lotus' } ,
19+ 'kanagawa-wave' : { dark : 'kanagawa-wave' , light : null } ,
20+ 'laserwave' : { dark : 'laserwave' , light : null } ,
2121 'material' : { dark : 'material-theme' , light : 'material-theme-lighter' } ,
2222 'min' : { dark : 'min-dark' , light : 'min-light' } ,
23- 'monokai-pro' : { dark : 'monokai' , light : 'monokai' } ,
24- 'night-owl' : { dark : 'night-owl' , light : 'night-owl' } ,
25- 'nord' : { dark : 'nord' , light : 'nord' } ,
26- 'one-dark-pro' : { dark : 'one-dark-pro' , light : 'one-dark-pro' } ,
27- 'one-light' : { dark : 'one-light' , light : 'one-light' } ,
28- 'plastic' : { dark : 'plastic' , light : 'plastic' } ,
29- 'poimandres' : { dark : 'poimandres' , light : 'poimandres' } ,
30- 'red' : { dark : 'red' , light : 'red' } ,
23+ 'monokai-pro' : { dark : 'monokai' , light : null } ,
24+ 'night-owl' : { dark : 'night-owl' , light : null } ,
25+ 'nord' : { dark : 'nord' , light : null } ,
26+ 'one-dark-pro' : { dark : 'one-dark-pro' , light : null } ,
27+ 'one-light' : { dark : null , light : 'one-light' } ,
28+ 'plastic' : { dark : 'plastic' , light : null } ,
29+ 'poimandres' : { dark : 'poimandres' , light : null } ,
30+ 'red' : { dark : 'red' , light : null } ,
3131 'rose-pine' : { dark : 'rose-pine' , light : 'rose-pine-dawn' } ,
3232 'slack' : { dark : 'slack-dark' , light : 'slack-ochin' } ,
33- 'snazzy-light' : { dark : 'snazzy-light' , light : 'snazzy-light' } ,
33+ 'snazzy-light' : { dark : null , light : 'snazzy-light' } ,
3434 'solarized' : { dark : 'solarized-dark' , light : 'solarized-light' } ,
35- 'synthwave-84' : { dark : 'synthwave-84' , light : 'synthwave-84' } ,
36- 'tokyo-night' : { dark : 'tokyo-night' , light : 'tokyo-night' } ,
37- 'vesper' : { dark : 'vesper' , light : 'vesper' } ,
35+ 'synthwave-84' : { dark : 'synthwave-84' , light : null } ,
36+ 'tokyo-night' : { dark : 'tokyo-night' , light : null } ,
37+ 'vesper' : { dark : 'vesper' , light : null } ,
3838 'vitesse' : { dark : 'vitesse-dark' , light : 'vitesse-light' } ,
39- 'vitesse-black' : { dark : 'vitesse-black' , light : 'vitesse-black' } ,
39+ 'vitesse-black' : { dark : 'vitesse-black' , light : null } ,
4040} ;
4141
42+ export function resolveSyntaxTheme ( colorTheme : string , mode : 'dark' | 'light' ) : { dark : string ; light : string } | undefined {
43+ const map = SHIKI_THEME_MAP [ colorTheme ] ;
44+ if ( ! map || ! map [ mode ] ) return undefined ;
45+ return { dark : map . dark || 'pierre-dark' , light : map . light || 'pierre-light' } ;
46+ }
47+
4248export interface PierreTheme {
4349 type : 'dark' | 'light' ;
4450 css : string ;
@@ -55,8 +61,8 @@ export function usePierreTheme(options?: { fontFamily?: string; fontSize?: strin
5561 const styles = getComputedStyle ( document . documentElement ) ;
5662 const bg = styles . getPropertyValue ( '--background' ) . trim ( ) ;
5763 const fg = styles . getPropertyValue ( '--foreground' ) . trim ( ) ;
58- if ( ! bg || ! fg ) return { type : resolvedMode ?? 'dark' , css : '' , syntaxTheme : SHIKI_THEME_MAP [ colorTheme ] } ;
59- return { type : resolvedMode ?? 'dark' , syntaxTheme : SHIKI_THEME_MAP [ colorTheme ] , css : `
64+ if ( ! bg || ! fg ) return { type : resolvedMode ?? 'dark' , css : '' , syntaxTheme : resolveSyntaxTheme ( colorTheme , resolvedMode ?? 'dark' ) } ;
65+ return { type : resolvedMode ?? 'dark' , syntaxTheme : resolveSyntaxTheme ( colorTheme , resolvedMode ?? 'dark' ) , css : `
6066 :host, [data-diff], [data-file], [data-diffs-header], [data-error-wrapper], [data-virtualizer-buffer] {
6167 --diffs-bg: ${ bg } !important; --diffs-fg: ${ fg } !important;
6268 --diffs-dark-bg: ${ bg } ; --diffs-light-bg: ${ bg } ; --diffs-dark: ${ fg } ; --diffs-light: ${ fg } ;
@@ -82,7 +88,7 @@ export function usePierreTheme(options?: { fontFamily?: string; fontSize?: strin
8288
8389 setPierreTheme ( {
8490 type : resolvedMode ,
85- syntaxTheme : SHIKI_THEME_MAP [ colorTheme ] ,
91+ syntaxTheme : resolveSyntaxTheme ( colorTheme , resolvedMode ) ,
8692 css : `
8793 :host, [data-diff], [data-file], [data-diffs-header], [data-error-wrapper], [data-virtualizer-buffer] {
8894 --diffs-bg: ${ bg } !important;
0 commit comments