@@ -3,32 +3,82 @@ import { Button, LookupField } from "cx/widgets";
33
44import "../../icons/lucide" ;
55import { m , ThemeEditorModel } from "./model" ;
6- import { defaultCategories , presets } from "./data" ;
6+ import {
7+ presets ,
8+ roundingOptions ,
9+ densityOptions ,
10+ fontOptions ,
11+ themeToCategories ,
12+ } from "./data" ;
713import { Sidebar } from "./Sidebar" ;
814import { VariableEditor } from "./VariableEditor" ;
915import { Preview } from "./Preview" ;
1016
1117class ThemeEditorController extends Controller < ThemeEditorModel > {
1218 onInit ( ) {
13- this . store . init ( m . categories , defaultCategories ) ;
14- this . store . init ( m . activeCategory , "primary" ) ;
15- this . store . init ( m . presetName , "dark-blue" ) ;
19+ this . store . init ( m . activeCategory , "colors" ) ;
20+ this . store . init ( m . presetName , "default" ) ;
21+
22+ this . addTrigger (
23+ "theme-change" ,
24+ [ m . presetName , m . rounding , m . density , m . font ] ,
25+ ( presetName , rounding , density , font ) => {
26+ const preset = presets . find ( ( p ) => p . id === presetName ) ;
27+ const roundingTweak = rounding
28+ ? roundingOptions . find ( ( r ) => r . id === rounding )
29+ : null ;
30+ const densityTweak = density
31+ ? densityOptions . find ( ( d ) => d . id === density )
32+ : null ;
33+ const fontTweak = font ? fontOptions . find ( ( f ) => f . id === font ) : null ;
34+ if ( preset ) {
35+ const theme = {
36+ ...preset . theme ,
37+ ...roundingTweak ?. tweak ,
38+ ...densityTweak ?. tweak ,
39+ ...fontTweak ?. tweak ,
40+ } ;
41+ this . store . set ( m . categories , themeToCategories ( theme ) ) ;
42+ }
43+ } ,
44+ true ,
45+ ) ;
1646 }
1747
1848 copyToClipboard ( ) {
1949 const categories = this . store . get ( m . categories ) ;
2050 let css = ":root {\n" ;
2151 for ( const cat of categories ) {
2252 for ( const v of cat . variables ) {
23- css += ` ${ v . name } : ${ v . value } ;\n` ;
53+ css += ` ${ v . key } : ${ v . value } ;\n` ;
2454 }
2555 }
2656 css += "}\n" ;
2757 navigator . clipboard . writeText ( css ) ;
2858 }
2959
3060 reset ( ) {
31- this . store . set ( m . categories , defaultCategories ) ;
61+ const presetName = this . store . get ( m . presetName ) ;
62+ const rounding = this . store . get ( m . rounding ) ;
63+ const density = this . store . get ( m . density ) ;
64+ const font = this . store . get ( m . font ) ;
65+ const preset = presets . find ( ( p ) => p . id === presetName ) ;
66+ const roundingTweak = rounding
67+ ? roundingOptions . find ( ( r ) => r . id === rounding )
68+ : null ;
69+ const densityTweak = density
70+ ? densityOptions . find ( ( d ) => d . id === density )
71+ : null ;
72+ const fontTweak = font ? fontOptions . find ( ( f ) => f . id === font ) : null ;
73+ if ( preset ) {
74+ const theme = {
75+ ...preset . theme ,
76+ ...roundingTweak ?. tweak ,
77+ ...densityTweak ?. tweak ,
78+ ...fontTweak ?. tweak ,
79+ } ;
80+ this . store . set ( m . categories , themeToCategories ( theme ) ) ;
81+ }
3282 }
3383}
3484
@@ -41,11 +91,42 @@ export default (
4191 < div class = "border-b border-border bg-card" >
4292 < div class = "container mx-auto flex items-center gap-4 px-4 py-3" >
4393 < span class = "text-sm text-muted-foreground" > Preset:</ span >
44- < LookupField value = { m . presetName } options = { presets } style = "width: 180px;" />
94+ < LookupField
95+ value = { m . presetName }
96+ options = { presets }
97+ required
98+ style = "width: 140px;"
99+ />
100+ < span class = "text-sm text-muted-foreground" > Rounding:</ span >
101+ < LookupField
102+ value = { m . rounding }
103+ options = { roundingOptions }
104+ placeholder = "Use default"
105+ style = "width: 140px;"
106+ />
107+ < span class = "text-sm text-muted-foreground" > Density:</ span >
108+ < LookupField
109+ value = { m . density }
110+ options = { densityOptions }
111+ placeholder = "Use default"
112+ style = "width: 140px;"
113+ />
114+ < span class = "text-sm text-muted-foreground" > Font:</ span >
115+ < LookupField
116+ value = { m . font }
117+ options = { fontOptions }
118+ placeholder = "Use default"
119+ style = "width: 140px;"
120+ />
45121 < div class = "flex-1" />
46122 < Button icon = "refresh" text = "Reset" onClick = "reset" mod = "hollow" />
47123 < Button icon = "download" text = "Download" mod = "hollow" />
48- < Button icon = "copy" text = "Copy to Clipboard" onClick = "copyToClipboard" mod = "primary" />
124+ < Button
125+ icon = "copy"
126+ text = "Copy to Clipboard"
127+ onClick = "copyToClipboard"
128+ mod = "primary"
129+ />
49130 </ div >
50131 </ div >
51132
0 commit comments