@@ -3,70 +3,46 @@ import {
33 type ThemeSideConfig ,
44 THEME_EDITOR_STORAGE_KEY ,
55 LEGACY_DARK_PALETTE_KEY ,
6- THEME_PRESETS ,
76 defaultThemeEditorState ,
7+ normalizeThemeEditorState ,
8+ normalizeThemeSide ,
89} from './editorTypes.js'
910import { darkPresetSeed } from './presetSeeds.js'
1011
11- const KNOWN_PRESETS = new Set < string > ( THEME_PRESETS )
12-
13- function normalizePresetId ( raw : string ) : string {
14- const p = raw === 'forest' ? 'everforest' : raw
15- return KNOWN_PRESETS . has ( p ) ? p : 'custom'
16- }
17-
18- export function normalizeSide ( partial : Partial < ThemeSideConfig > | undefined , fallback : ThemeSideConfig ) : ThemeSideConfig {
19- if ( ! partial || typeof partial !== 'object' ) return { ...fallback }
20- const presetRaw = typeof partial . preset === 'string' ? partial . preset : fallback . preset
21- return {
22- preset : normalizePresetId ( presetRaw ) ,
23- accent : typeof partial . accent === 'string' ? partial . accent : fallback . accent ,
24- background : typeof partial . background === 'string' ? partial . background : fallback . background ,
25- foreground : typeof partial . foreground === 'string' ? partial . foreground : fallback . foreground ,
26- uiFont : typeof partial . uiFont === 'string' ? partial . uiFont : fallback . uiFont ,
27- codeFont : typeof partial . codeFont === 'string' ? partial . codeFont : fallback . codeFont ,
28- translucentChrome : typeof partial . translucentChrome === 'boolean' ? partial . translucentChrome : fallback . translucentChrome ,
29- contrast : typeof partial . contrast === 'number' && Number . isFinite ( partial . contrast )
30- ? Math . max ( 0 , Math . min ( 100 , Math . round ( partial . contrast ) ) )
31- : fallback . contrast ,
32- }
33- }
34-
35- export function normalizeThemeEditorState ( raw : unknown ) : ThemeEditorStateV1 | null {
36- if ( ! raw || typeof raw !== 'object' ) return null
37- const o = raw as Record < string , unknown >
38- if ( o [ 'v' ] !== 1 ) return null
39- const base = defaultThemeEditorState ( )
40- return {
41- v : 1 ,
42- light : normalizeSide ( o [ 'light' ] as Partial < ThemeSideConfig > , base . light ) ,
43- dark : normalizeSide ( o [ 'dark' ] as Partial < ThemeSideConfig > , base . dark ) ,
44- }
45- }
46-
4712/** Merge loose import (e.g. partial JSON) onto current state. */
4813export function mergeThemeImportLoose ( raw : unknown , current : ThemeEditorStateV1 ) : ThemeEditorStateV1 | null {
4914 if ( ! raw || typeof raw !== 'object' ) return null
5015 const o = raw as Record < string , unknown >
5116 const next : ThemeEditorStateV1 = {
5217 v : 1 ,
53- light : normalizeSide ( ( o [ 'light' ] as Partial < ThemeSideConfig > ) ?? { } , current . light ) ,
54- dark : normalizeSide ( ( o [ 'dark' ] as Partial < ThemeSideConfig > ) ?? { } , current . dark ) ,
18+ light : normalizeThemeSide ( ( o [ 'light' ] as Partial < ThemeSideConfig > ) ?? { } , current . light ) ,
19+ dark : normalizeThemeSide ( ( o [ 'dark' ] as Partial < ThemeSideConfig > ) ?? { } , current . dark ) ,
5520 }
5621 return next
5722}
5823
5924export async function loadThemeEditorState ( ) : Promise < ThemeEditorStateV1 > {
6025 try {
61- const raw = window . localStorage . getItem ( THEME_EDITOR_STORAGE_KEY )
62- if ( raw ) {
63- const parsed = normalizeThemeEditorState ( JSON . parse ( raw ) )
26+ const stored = await window . spool ?. getThemeEditorState ?. ( )
27+ if ( stored ) {
28+ const parsed = normalizeThemeEditorState ( stored )
6429 if ( parsed ) return parsed
6530 }
31+
32+ const rawLocal = window . localStorage . getItem ( THEME_EDITOR_STORAGE_KEY )
33+ if ( rawLocal ) {
34+ const parsed = normalizeThemeEditorState ( JSON . parse ( rawLocal ) )
35+ if ( parsed ) {
36+ await window . spool ?. setThemeEditorState ?.( parsed )
37+ return parsed
38+ }
39+ }
40+
6641 const next = defaultThemeEditorState ( )
6742 const legacy = window . localStorage . getItem ( LEGACY_DARK_PALETTE_KEY )
6843 if ( legacy === 'forest' ) {
6944 next . dark = darkPresetSeed ( 'everforest' , next . dark )
45+ await window . spool ?. setThemeEditorState ?.( next )
7046 }
7147 return next
7248 } catch {
@@ -76,4 +52,5 @@ export async function loadThemeEditorState(): Promise<ThemeEditorStateV1> {
7652
7753export async function saveThemeEditorState ( state : ThemeEditorStateV1 ) : Promise < void > {
7854 window . localStorage . setItem ( THEME_EDITOR_STORAGE_KEY , JSON . stringify ( state ) )
55+ await window . spool ?. setThemeEditorState ?.( state )
7956}
0 commit comments