detached 08a0a9d

Add separate GTK UI font setting

commit
08a0a9d478e8378205426ab6b84f7bbb92667afd
author
brice · · 2026-05-17 05:58 UTC
parent
7bebba6
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
18 files · +364 -296
M internal/application/dto/webui_config.go +1 -0
@@ -70,6 +70,7 @@ type WebUIAppearanceConfig struct {
7070 SansFont string `json:"sans_font"`
7171 SerifFont string `json:"serif_font"`
7272 MonospaceFont string `json:"monospace_font"`
73+ GtkFont string `json:"gtk_font"`
7374 DefaultFontSize int `json:"default_font_size"`
7475 ColorScheme string `json:"color_scheme"`
7576 LightPalette ColorPalette `json:"light_palette"`
@@ -70,6 +70,7 @@ type WebUIAppearanceConfig struct {
70 SansFont string `json:"sans_font"`70 SansFont string `json:"sans_font"`
71 SerifFont string `json:"serif_font"`71 SerifFont string `json:"serif_font"`
72 MonospaceFont string `json:"monospace_font"`72 MonospaceFont string `json:"monospace_font"`
73+ GtkFont string `json:"gtk_font"`
73 DefaultFontSize int `json:"default_font_size"`74 DefaultFontSize int `json:"default_font_size"`
74 ColorScheme string `json:"color_scheme"`75 ColorScheme string `json:"color_scheme"`
75 LightPalette ColorPalette `json:"light_palette"`76 LightPalette ColorPalette `json:"light_palette"`
M internal/application/usecase/save_webui_config.go +2 -0
@@ -55,6 +55,7 @@ func normalizeWebUIConfig(cfg dto.WebUIConfig) dto.WebUIConfig {
5555 cfg.Appearance.SansFont = strings.TrimSpace(cfg.Appearance.SansFont)
5656 cfg.Appearance.SerifFont = strings.TrimSpace(cfg.Appearance.SerifFont)
5757 cfg.Appearance.MonospaceFont = strings.TrimSpace(cfg.Appearance.MonospaceFont)
58+ cfg.Appearance.GtkFont = strings.TrimSpace(cfg.Appearance.GtkFont)
5859 cfg.Appearance.ColorScheme = strings.TrimSpace(cfg.Appearance.ColorScheme)
5960 cfg.DefaultSearchEngine = strings.TrimSpace(cfg.DefaultSearchEngine)
6061 if len(cfg.SearchShortcuts) > 0 {
@@ -86,6 +87,7 @@ func validateWebUIConfig(cfg dto.WebUIConfig) error {
8687 errs = append(errs, validation.ValidateFontFamily("appearance.sans_font", cfg.Appearance.SansFont)...)
8788 errs = append(errs, validation.ValidateFontFamily("appearance.serif_font", cfg.Appearance.SerifFont)...)
8889 errs = append(errs, validation.ValidateFontFamily("appearance.monospace_font", cfg.Appearance.MonospaceFont)...)
90+ errs = append(errs, validation.ValidateFontFamily("appearance.gtk_font", cfg.Appearance.GtkFont)...)
8991
9092 for _, err := range validation.ValidateShortcutURL(cfg.DefaultSearchEngine) {
9193 errs = append(errs, fmt.Sprintf("default_search_engine: %s", err))
@@ -55,6 +55,7 @@ func normalizeWebUIConfig(cfg dto.WebUIConfig) dto.WebUIConfig {
55 cfg.Appearance.SansFont = strings.TrimSpace(cfg.Appearance.SansFont)55 cfg.Appearance.SansFont = strings.TrimSpace(cfg.Appearance.SansFont)
56 cfg.Appearance.SerifFont = strings.TrimSpace(cfg.Appearance.SerifFont)56 cfg.Appearance.SerifFont = strings.TrimSpace(cfg.Appearance.SerifFont)
57 cfg.Appearance.MonospaceFont = strings.TrimSpace(cfg.Appearance.MonospaceFont)57 cfg.Appearance.MonospaceFont = strings.TrimSpace(cfg.Appearance.MonospaceFont)
58+ cfg.Appearance.GtkFont = strings.TrimSpace(cfg.Appearance.GtkFont)
58 cfg.Appearance.ColorScheme = strings.TrimSpace(cfg.Appearance.ColorScheme)59 cfg.Appearance.ColorScheme = strings.TrimSpace(cfg.Appearance.ColorScheme)
59 cfg.DefaultSearchEngine = strings.TrimSpace(cfg.DefaultSearchEngine)60 cfg.DefaultSearchEngine = strings.TrimSpace(cfg.DefaultSearchEngine)
60 if len(cfg.SearchShortcuts) > 0 {61 if len(cfg.SearchShortcuts) > 0 {
@@ -86,6 +87,7 @@ func validateWebUIConfig(cfg dto.WebUIConfig) error {
86 errs = append(errs, validation.ValidateFontFamily("appearance.sans_font", cfg.Appearance.SansFont)...)87 errs = append(errs, validation.ValidateFontFamily("appearance.sans_font", cfg.Appearance.SansFont)...)
87 errs = append(errs, validation.ValidateFontFamily("appearance.serif_font", cfg.Appearance.SerifFont)...)88 errs = append(errs, validation.ValidateFontFamily("appearance.serif_font", cfg.Appearance.SerifFont)...)
88 errs = append(errs, validation.ValidateFontFamily("appearance.monospace_font", cfg.Appearance.MonospaceFont)...)89 errs = append(errs, validation.ValidateFontFamily("appearance.monospace_font", cfg.Appearance.MonospaceFont)...)
90+ errs = append(errs, validation.ValidateFontFamily("appearance.gtk_font", cfg.Appearance.GtkFont)...)
89 91
90 for _, err := range validation.ValidateShortcutURL(cfg.DefaultSearchEngine) {92 for _, err := range validation.ValidateShortcutURL(cfg.DefaultSearchEngine) {
91 errs = append(errs, fmt.Sprintf("default_search_engine: %s", err))93 errs = append(errs, fmt.Sprintf("default_search_engine: %s", err))
M internal/application/usecase/save_webui_config_test.go +1 -0
@@ -112,6 +112,7 @@ func validWebUIConfig() dto.WebUIConfig {
112112 SansFont: "Inter",
113113 SerifFont: "Georgia",
114114 MonospaceFont: "JetBrains Mono",
115+ GtkFont: "Adwaita Sans",
115116 DefaultFontSize: 16,
116117 ColorScheme: "prefer-dark",
117118 LightPalette: palette,
@@ -112,6 +112,7 @@ func validWebUIConfig() dto.WebUIConfig {
112 SansFont: "Inter",112 SansFont: "Inter",
113 SerifFont: "Georgia",113 SerifFont: "Georgia",
114 MonospaceFont: "JetBrains Mono",114 MonospaceFont: "JetBrains Mono",
115+ GtkFont: "Adwaita Sans",
115 DefaultFontSize: 16,116 DefaultFontSize: 16,
116 ColorScheme: "prefer-dark",117 ColorScheme: "prefer-dark",
117 LightPalette: palette,118 LightPalette: palette,
M internal/domain/entity/config_types.go +1 -0
@@ -9,6 +9,7 @@ type AppearanceConfig struct {
99 SansFont string `mapstructure:"sans_font" yaml:"sans_font" toml:"sans_font" json:"sans_font"`
1010 SerifFont string `mapstructure:"serif_font" yaml:"serif_font" toml:"serif_font" json:"serif_font"`
1111 MonospaceFont string `mapstructure:"monospace_font" yaml:"monospace_font" toml:"monospace_font" json:"monospace_font"`
12+ GtkFont string `mapstructure:"gtk_font" yaml:"gtk_font" toml:"gtk_font" json:"gtk_font"`
1213 DefaultFontSize int `mapstructure:"default_font_size" yaml:"default_font_size" toml:"default_font_size" json:"default_font_size"`
1314 LightPalette ColorPalette `mapstructure:"light_palette" yaml:"light_palette" toml:"light_palette" json:"light_palette"`
1415 DarkPalette ColorPalette `mapstructure:"dark_palette" yaml:"dark_palette" toml:"dark_palette" json:"dark_palette"`
@@ -9,6 +9,7 @@ type AppearanceConfig struct {
9 SansFont string `mapstructure:"sans_font" yaml:"sans_font" toml:"sans_font" json:"sans_font"`9 SansFont string `mapstructure:"sans_font" yaml:"sans_font" toml:"sans_font" json:"sans_font"`
10 SerifFont string `mapstructure:"serif_font" yaml:"serif_font" toml:"serif_font" json:"serif_font"`10 SerifFont string `mapstructure:"serif_font" yaml:"serif_font" toml:"serif_font" json:"serif_font"`
11 MonospaceFont string `mapstructure:"monospace_font" yaml:"monospace_font" toml:"monospace_font" json:"monospace_font"`11 MonospaceFont string `mapstructure:"monospace_font" yaml:"monospace_font" toml:"monospace_font" json:"monospace_font"`
12+ GtkFont string `mapstructure:"gtk_font" yaml:"gtk_font" toml:"gtk_font" json:"gtk_font"`
12 DefaultFontSize int `mapstructure:"default_font_size" yaml:"default_font_size" toml:"default_font_size" json:"default_font_size"`13 DefaultFontSize int `mapstructure:"default_font_size" yaml:"default_font_size" toml:"default_font_size" json:"default_font_size"`
13 LightPalette ColorPalette `mapstructure:"light_palette" yaml:"light_palette" toml:"light_palette" json:"light_palette"`14 LightPalette ColorPalette `mapstructure:"light_palette" yaml:"light_palette" toml:"light_palette" json:"light_palette"`
14 DarkPalette ColorPalette `mapstructure:"dark_palette" yaml:"dark_palette" toml:"dark_palette" json:"dark_palette"`15 DarkPalette ColorPalette `mapstructure:"dark_palette" yaml:"dark_palette" toml:"dark_palette" json:"dark_palette"`
M internal/infrastructure/config/defaults.go +1 -0
@@ -136,6 +136,7 @@ func DefaultConfig() *Config {
136136 SansFont: "Fira Sans",
137137 SerifFont: "Fira Sans",
138138 MonospaceFont: "Fira Code",
139+ GtkFont: "Adwaita Sans",
139140 DefaultFontSize: defaultFontSize,
140141 LightPalette: ColorPalette{
141142 Background: "#fafafa",
@@ -136,6 +136,7 @@ func DefaultConfig() *Config {
136 SansFont: "Fira Sans",136 SansFont: "Fira Sans",
137 SerifFont: "Fira Sans",137 SerifFont: "Fira Sans",
138 MonospaceFont: "Fira Code",138 MonospaceFont: "Fira Code",
139+ GtkFont: "Adwaita Sans",
139 DefaultFontSize: defaultFontSize,140 DefaultFontSize: defaultFontSize,
140 LightPalette: ColorPalette{141 LightPalette: ColorPalette{
141 Background: "#fafafa",142 Background: "#fafafa",
M internal/infrastructure/config/loader.go +1 -0
@@ -584,6 +584,7 @@ func (m *Manager) setAppearanceDefaults(defaults *Config) {
584584 m.viper.SetDefault("appearance.sans_font", defaults.Appearance.SansFont)
585585 m.viper.SetDefault("appearance.serif_font", defaults.Appearance.SerifFont)
586586 m.viper.SetDefault("appearance.monospace_font", defaults.Appearance.MonospaceFont)
587+ m.viper.SetDefault("appearance.gtk_font", defaults.Appearance.GtkFont)
587588 m.viper.SetDefault("appearance.default_font_size", defaults.Appearance.DefaultFontSize)
588589 m.viper.SetDefault("appearance.light_palette", defaults.Appearance.LightPalette)
589590 m.viper.SetDefault("appearance.dark_palette", defaults.Appearance.DarkPalette)
@@ -584,6 +584,7 @@ func (m *Manager) setAppearanceDefaults(defaults *Config) {
584 m.viper.SetDefault("appearance.sans_font", defaults.Appearance.SansFont)584 m.viper.SetDefault("appearance.sans_font", defaults.Appearance.SansFont)
585 m.viper.SetDefault("appearance.serif_font", defaults.Appearance.SerifFont)585 m.viper.SetDefault("appearance.serif_font", defaults.Appearance.SerifFont)
586 m.viper.SetDefault("appearance.monospace_font", defaults.Appearance.MonospaceFont)586 m.viper.SetDefault("appearance.monospace_font", defaults.Appearance.MonospaceFont)
587+ m.viper.SetDefault("appearance.gtk_font", defaults.Appearance.GtkFont)
587 m.viper.SetDefault("appearance.default_font_size", defaults.Appearance.DefaultFontSize)588 m.viper.SetDefault("appearance.default_font_size", defaults.Appearance.DefaultFontSize)
588 m.viper.SetDefault("appearance.light_palette", defaults.Appearance.LightPalette)589 m.viper.SetDefault("appearance.light_palette", defaults.Appearance.LightPalette)
589 m.viper.SetDefault("appearance.dark_palette", defaults.Appearance.DarkPalette)590 m.viper.SetDefault("appearance.dark_palette", defaults.Appearance.DarkPalette)
M internal/infrastructure/config/schema_provider.go +7 -0
@@ -138,6 +138,13 @@ func (*SchemaProvider) getAppearanceKeys(defaults *Config) []entity.ConfigKeyInf
138138 Description: "Monospace font family for code",
139139 Section: SectionAppearance,
140140 },
141+ {
142+ Key: "appearance.gtk_font",
143+ Type: "string",
144+ Default: defaults.Appearance.GtkFont,
145+ Description: "Native GTK UI font family for app chrome",
146+ Section: SectionAppearance,
147+ },
141148 {
142149 Key: "default_webpage_zoom",
143150 Type: "float64",
@@ -138,6 +138,13 @@ func (*SchemaProvider) getAppearanceKeys(defaults *Config) []entity.ConfigKeyInf
138 Description: "Monospace font family for code",138 Description: "Monospace font family for code",
139 Section: SectionAppearance,139 Section: SectionAppearance,
140 },140 },
141+ {
142+ Key: "appearance.gtk_font",
143+ Type: "string",
144+ Default: defaults.Appearance.GtkFont,
145+ Description: "Native GTK UI font family for app chrome",
146+ Section: SectionAppearance,
147+ },
141 {148 {
142 Key: "default_webpage_zoom",149 Key: "default_webpage_zoom",
143 Type: "float64",150 Type: "float64",
M internal/infrastructure/config/validation.go +1 -0
@@ -72,6 +72,7 @@ func validateAppearance(config *Config) []string {
7272 }
7373 validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.sans_font", config.Appearance.SansFont)...)
7474 validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.serif_font", config.Appearance.SerifFont)...)
75+ validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.gtk_font", config.Appearance.GtkFont)...)
7576 validationErrors = append(
7677 validationErrors,
7778 domainvalidation.ValidateFontFamily("appearance.monospace_font", config.Appearance.MonospaceFont)...,
@@ -72,6 +72,7 @@ func validateAppearance(config *Config) []string {
72 }72 }
73 validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.sans_font", config.Appearance.SansFont)...)73 validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.sans_font", config.Appearance.SansFont)...)
74 validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.serif_font", config.Appearance.SerifFont)...)74 validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.serif_font", config.Appearance.SerifFont)...)
75+ validationErrors = append(validationErrors, domainvalidation.ValidateFontFamily("appearance.gtk_font", config.Appearance.GtkFont)...)
75 validationErrors = append(76 validationErrors = append(
76 validationErrors,77 validationErrors,
77 domainvalidation.ValidateFontFamily("appearance.monospace_font", config.Appearance.MonospaceFont)...,78 domainvalidation.ValidateFontFamily("appearance.monospace_font", config.Appearance.MonospaceFont)...,
M internal/infrastructure/config/webui_gateway.go +1 -0
@@ -43,6 +43,7 @@ func (g *WebUIConfigGateway) SaveWebUIConfig(ctx context.Context, cfg dto.WebUIC
4343 current.Appearance.SansFont = cfg.Appearance.SansFont
4444 current.Appearance.SerifFont = cfg.Appearance.SerifFont
4545 current.Appearance.MonospaceFont = cfg.Appearance.MonospaceFont
46+ current.Appearance.GtkFont = cfg.Appearance.GtkFont
4647 current.Appearance.DefaultFontSize = cfg.Appearance.DefaultFontSize
4748 current.Appearance.ColorScheme = cfg.Appearance.ColorScheme
4849 current.Appearance.LightPalette = ColorPalette{
@@ -43,6 +43,7 @@ func (g *WebUIConfigGateway) SaveWebUIConfig(ctx context.Context, cfg dto.WebUIC
43 current.Appearance.SansFont = cfg.Appearance.SansFont43 current.Appearance.SansFont = cfg.Appearance.SansFont
44 current.Appearance.SerifFont = cfg.Appearance.SerifFont44 current.Appearance.SerifFont = cfg.Appearance.SerifFont
45 current.Appearance.MonospaceFont = cfg.Appearance.MonospaceFont45 current.Appearance.MonospaceFont = cfg.Appearance.MonospaceFont
46+ current.Appearance.GtkFont = cfg.Appearance.GtkFont
46 current.Appearance.DefaultFontSize = cfg.Appearance.DefaultFontSize47 current.Appearance.DefaultFontSize = cfg.Appearance.DefaultFontSize
47 current.Appearance.ColorScheme = cfg.Appearance.ColorScheme48 current.Appearance.ColorScheme = cfg.Appearance.ColorScheme
48 current.Appearance.LightPalette = ColorPalette{49 current.Appearance.LightPalette = ColorPalette{
M internal/infrastructure/config/webui_payload.go +1 -0
@@ -53,6 +53,7 @@ func buildSystemviewAppearancePayload(appearance AppearanceConfig) dto.WebUIAppe
5353 SansFont: appearance.SansFont,
5454 SerifFont: appearance.SerifFont,
5555 MonospaceFont: appearance.MonospaceFont,
56+ GtkFont: appearance.GtkFont,
5657 DefaultFontSize: appearance.DefaultFontSize,
5758 ColorScheme: appearance.ColorScheme,
5859 LightPalette: buildSystemviewPalettePayload(appearance.LightPalette, defaults.LightPalette),
@@ -53,6 +53,7 @@ func buildSystemviewAppearancePayload(appearance AppearanceConfig) dto.WebUIAppe
53 SansFont: appearance.SansFont,53 SansFont: appearance.SansFont,
54 SerifFont: appearance.SerifFont,54 SerifFont: appearance.SerifFont,
55 MonospaceFont: appearance.MonospaceFont,55 MonospaceFont: appearance.MonospaceFont,
56+ GtkFont: appearance.GtkFont,
56 DefaultFontSize: appearance.DefaultFontSize,57 DefaultFontSize: appearance.DefaultFontSize,
57 ColorScheme: appearance.ColorScheme,58 ColorScheme: appearance.ColorScheme,
58 LightPalette: buildSystemviewPalettePayload(appearance.LightPalette, defaults.LightPalette),59 LightPalette: buildSystemviewPalettePayload(appearance.LightPalette, defaults.LightPalette),
M internal/ui/systemviews/config.templ +1 -0
@@ -31,6 +31,7 @@ templ AppearanceForm(config dto.SystemviewConfigPayload) {
3131 <label><span>Sans font</span><input name="sans_font" type="text" value={ config.Appearance.SansFont } required/></label>
3232 <label><span>Serif font</span><input name="serif_font" type="text" value={ config.Appearance.SerifFont } required/></label>
3333 <label><span>Monospace font</span><input name="monospace_font" type="text" value={ config.Appearance.MonospaceFont } required/></label>
34+ <label><span>GTK UI font</span><input name="gtk_font" type="text" value={ config.Appearance.GtkFont } required/></label>
3435 <label><span>Default font size</span><input name="default_font_size" type="number" min="1" max="72" value={ formatConfigInt(config.Appearance.DefaultFontSize) } required/></label>
3536 <label><span>UI scale</span><input name="default_ui_scale" type="number" min="0.5" max="3" step="0.05" value={ formatConfigFloat(config.DefaultUIScale) } required/></label>
3637 <label><span>Color scheme</span><select name="color_scheme">
@@ -31,6 +31,7 @@ templ AppearanceForm(config dto.SystemviewConfigPayload) {
31 <label><span>Sans font</span><input name="sans_font" type="text" value={ config.Appearance.SansFont } required/></label>31 <label><span>Sans font</span><input name="sans_font" type="text" value={ config.Appearance.SansFont } required/></label>
32 <label><span>Serif font</span><input name="serif_font" type="text" value={ config.Appearance.SerifFont } required/></label>32 <label><span>Serif font</span><input name="serif_font" type="text" value={ config.Appearance.SerifFont } required/></label>
33 <label><span>Monospace font</span><input name="monospace_font" type="text" value={ config.Appearance.MonospaceFont } required/></label>33 <label><span>Monospace font</span><input name="monospace_font" type="text" value={ config.Appearance.MonospaceFont } required/></label>
34+ <label><span>GTK UI font</span><input name="gtk_font" type="text" value={ config.Appearance.GtkFont } required/></label>
34 <label><span>Default font size</span><input name="default_font_size" type="number" min="1" max="72" value={ formatConfigInt(config.Appearance.DefaultFontSize) } required/></label>35 <label><span>Default font size</span><input name="default_font_size" type="number" min="1" max="72" value={ formatConfigInt(config.Appearance.DefaultFontSize) } required/></label>
35 <label><span>UI scale</span><input name="default_ui_scale" type="number" min="0.5" max="3" step="0.05" value={ formatConfigFloat(config.DefaultUIScale) } required/></label>36 <label><span>UI scale</span><input name="default_ui_scale" type="number" min="0.5" max="3" step="0.05" value={ formatConfigFloat(config.DefaultUIScale) } required/></label>
36 <label><span>Color scheme</span><select name="color_scheme">37 <label><span>Color scheme</span><select name="color_scheme">
M internal/ui/systemviews/config_actions.go +1 -0
@@ -99,6 +99,7 @@ func (a *App) saveAppearanceConfig(ctx context.Context, data map[string]string)
9999 cfg.Appearance.SansFont = strings.TrimSpace(data["sans_font"])
100100 cfg.Appearance.SerifFont = strings.TrimSpace(data["serif_font"])
101101 cfg.Appearance.MonospaceFont = strings.TrimSpace(data["monospace_font"])
102+ cfg.Appearance.GtkFont = strings.TrimSpace(data["gtk_font"])
102103 cfg.Appearance.DefaultFontSize = fontSize
103104 cfg.Appearance.ColorScheme = strings.TrimSpace(data["color_scheme"])
104105 cfg.Appearance.LightPalette = paletteFromForm(data, "light")
@@ -99,6 +99,7 @@ func (a *App) saveAppearanceConfig(ctx context.Context, data map[string]string)
99 cfg.Appearance.SansFont = strings.TrimSpace(data["sans_font"])99 cfg.Appearance.SansFont = strings.TrimSpace(data["sans_font"])
100 cfg.Appearance.SerifFont = strings.TrimSpace(data["serif_font"])100 cfg.Appearance.SerifFont = strings.TrimSpace(data["serif_font"])
101 cfg.Appearance.MonospaceFont = strings.TrimSpace(data["monospace_font"])101 cfg.Appearance.MonospaceFont = strings.TrimSpace(data["monospace_font"])
102+ cfg.Appearance.GtkFont = strings.TrimSpace(data["gtk_font"])
102 cfg.Appearance.DefaultFontSize = fontSize103 cfg.Appearance.DefaultFontSize = fontSize
103 cfg.Appearance.ColorScheme = strings.TrimSpace(data["color_scheme"])104 cfg.Appearance.ColorScheme = strings.TrimSpace(data["color_scheme"])
104 cfg.Appearance.LightPalette = paletteFromForm(data, "light")105 cfg.Appearance.LightPalette = paletteFromForm(data, "light")
M internal/ui/systemviews/config_templ.go +304 -291
@@ -189,11 +189,11 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
189189 return templ_7745c5c3_Err
190190 }
191191 var templ_7745c5c3_Var8 string
192- templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(config.Appearance.SansFont)
192+ templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.SansFont)
193193 if templ_7745c5c3_Err != nil {
194194 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 31, Col: 101}
195195 }
196- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
196+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8)
197197 if templ_7745c5c3_Err != nil {
198198 return templ_7745c5c3_Err
199199 }
@@ -202,11 +202,11 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
202202 return templ_7745c5c3_Err
203203 }
204204 var templ_7745c5c3_Var9 string
205- templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(config.Appearance.SerifFont)
205+ templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.SerifFont)
206206 if templ_7745c5c3_Err != nil {
207207 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 32, Col: 104}
208208 }
209- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
209+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9)
210210 if templ_7745c5c3_Err != nil {
211211 return templ_7745c5c3_Err
212212 }
@@ -215,71 +215,84 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
215215 return templ_7745c5c3_Err
216216 }
217217 var templ_7745c5c3_Var10 string
218- templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(config.Appearance.MonospaceFont)
218+ templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.MonospaceFont)
219219 if templ_7745c5c3_Err != nil {
220220 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 33, Col: 116}
221221 }
222- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
222+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var10)
223223 if templ_7745c5c3_Err != nil {
224224 return templ_7745c5c3_Err
225225 }
226- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\" required></label> <label><span>Default font size</span><input name=\"default_font_size\" type=\"number\" min=\"1\" max=\"72\" value=\"")
226+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\" required></label> <label><span>GTK UI font</span><input name=\"gtk_font\" type=\"text\" value=\"")
227227 if templ_7745c5c3_Err != nil {
228228 return templ_7745c5c3_Err
229229 }
230230 var templ_7745c5c3_Var11 string
231- templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Appearance.DefaultFontSize))
231+ templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.GtkFont)
232232 if templ_7745c5c3_Err != nil {
233- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 34, Col: 160}
233+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 34, Col: 101}
234234 }
235- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
235+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11)
236236 if templ_7745c5c3_Err != nil {
237237 return templ_7745c5c3_Err
238238 }
239- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" required></label> <label><span>UI scale</span><input name=\"default_ui_scale\" type=\"number\" min=\"0.5\" max=\"3\" step=\"0.05\" value=\"")
239+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" required></label> <label><span>Default font size</span><input name=\"default_font_size\" type=\"number\" min=\"1\" max=\"72\" value=\"")
240240 if templ_7745c5c3_Err != nil {
241241 return templ_7745c5c3_Err
242242 }
243243 var templ_7745c5c3_Var12 string
244- templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigFloat(config.DefaultUIScale))
244+ templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Appearance.DefaultFontSize))
245245 if templ_7745c5c3_Err != nil {
246- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 35, Col: 153}
246+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 35, Col: 160}
247247 }
248- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
248+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var12)
249249 if templ_7745c5c3_Err != nil {
250250 return templ_7745c5c3_Err
251251 }
252- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\" required></label> <label><span>Color scheme</span><select name=\"color_scheme\"><option value=\"default\"")
252+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\" required></label> <label><span>UI scale</span><input name=\"default_ui_scale\" type=\"number\" min=\"0.5\" max=\"3\" step=\"0.05\" value=\"")
253+ if templ_7745c5c3_Err != nil {
254+ return templ_7745c5c3_Err
255+ }
256+ var templ_7745c5c3_Var13 string
257+ templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigFloat(config.DefaultUIScale))
258+ if templ_7745c5c3_Err != nil {
259+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 36, Col: 153}
260+ }
261+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13)
262+ if templ_7745c5c3_Err != nil {
263+ return templ_7745c5c3_Err
264+ }
265+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "\" required></label> <label><span>Color scheme</span><select name=\"color_scheme\"><option value=\"default\"")
253266 if templ_7745c5c3_Err != nil {
254267 return templ_7745c5c3_Err
255268 }
256269 if colorSchemeSelected(config.Appearance.ColorScheme, "default") {
257- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, " selected")
270+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, " selected")
258271 if templ_7745c5c3_Err != nil {
259272 return templ_7745c5c3_Err
260273 }
261274 }
262- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, ">System default</option> <option value=\"prefer-light\"")
275+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, ">System default</option> <option value=\"prefer-light\"")
263276 if templ_7745c5c3_Err != nil {
264277 return templ_7745c5c3_Err
265278 }
266279 if colorSchemeSelected(config.Appearance.ColorScheme, "prefer-light") {
267- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, " selected")
280+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, " selected")
268281 if templ_7745c5c3_Err != nil {
269282 return templ_7745c5c3_Err
270283 }
271284 }
272- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, ">Prefer light</option> <option value=\"prefer-dark\"")
285+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, ">Prefer light</option> <option value=\"prefer-dark\"")
273286 if templ_7745c5c3_Err != nil {
274287 return templ_7745c5c3_Err
275288 }
276289 if colorSchemeSelected(config.Appearance.ColorScheme, "prefer-dark") {
277- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, " selected")
290+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, " selected")
278291 if templ_7745c5c3_Err != nil {
279292 return templ_7745c5c3_Err
280293 }
281294 }
282- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, ">Prefer dark</option></select></label>")
295+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, ">Prefer dark</option></select></label>")
283296 if templ_7745c5c3_Err != nil {
284297 return templ_7745c5c3_Err
285298 }
@@ -291,7 +304,7 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
291304 if templ_7745c5c3_Err != nil {
292305 return templ_7745c5c3_Err
293306 }
294- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<div class=\"sv-button-row sv-form-actions\"><button class=\"sv-button\" type=\"submit\">")
307+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<div class=\"sv-button-row sv-form-actions\"><button class=\"sv-button\" type=\"submit\">")
295308 if templ_7745c5c3_Err != nil {
296309 return templ_7745c5c3_Err
297310 }
@@ -299,7 +312,7 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
299312 if templ_7745c5c3_Err != nil {
300313 return templ_7745c5c3_Err
301314 }
302- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.appearance.reset\" data-sv-confirm=\"Reset appearance settings to defaults?\">")
315+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.appearance.reset\" data-sv-confirm=\"Reset appearance settings to defaults?\">")
303316 if templ_7745c5c3_Err != nil {
304317 return templ_7745c5c3_Err
305318 }
@@ -307,7 +320,7 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
307320 if templ_7745c5c3_Err != nil {
308321 return templ_7745c5c3_Err
309322 }
310- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</button></div></form>")
323+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</button></div></form>")
311324 if templ_7745c5c3_Err != nil {
312325 return templ_7745c5c3_Err
313326 }
@@ -331,207 +344,207 @@ func PaletteFields(title string, prefix string, palette dto.ColorPalette) templ.
331344 }()
332345 }
333346 ctx = templ.InitializeContext(ctx)
334- templ_7745c5c3_Var13 := templ.GetChildren(ctx)
335- if templ_7745c5c3_Var13 == nil {
336- templ_7745c5c3_Var13 = templ.NopComponent
347+ templ_7745c5c3_Var14 := templ.GetChildren(ctx)
348+ if templ_7745c5c3_Var14 == nil {
349+ templ_7745c5c3_Var14 = templ.NopComponent
337350 }
338351 ctx = templ.ClearChildren(ctx)
339- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<fieldset class=\"sv-fieldset\"><legend>")
340- if templ_7745c5c3_Err != nil {
341- return templ_7745c5c3_Err
342- }
343- var templ_7745c5c3_Var14 string
344- templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(title)
345- if templ_7745c5c3_Err != nil {
346- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 52, Col: 17}
347- }
348- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
349- if templ_7745c5c3_Err != nil {
350- return templ_7745c5c3_Err
351- }
352- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</legend> <label><span>Background</span><input name=\"")
352+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<fieldset class=\"sv-fieldset\"><legend>")
353353 if templ_7745c5c3_Err != nil {
354354 return templ_7745c5c3_Err
355355 }
356356 var templ_7745c5c3_Var15 string
357- templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_background")
357+ templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(title)
358358 if templ_7745c5c3_Err != nil {
359- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 53, Col: 68}
359+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 53, Col: 17}
360360 }
361361 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
362362 if templ_7745c5c3_Err != nil {
363363 return templ_7745c5c3_Err
364364 }
365- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "\" type=\"text\" value=\"")
365+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</legend> <label><span>Background</span><input name=\"")
366366 if templ_7745c5c3_Err != nil {
367367 return templ_7745c5c3_Err
368368 }
369369 var templ_7745c5c3_Var16 string
370- templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Background)
370+ templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_background")
371371 if templ_7745c5c3_Err != nil {
372- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 53, Col: 109}
372+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 68}
373373 }
374- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
374+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)
375375 if templ_7745c5c3_Err != nil {
376376 return templ_7745c5c3_Err
377377 }
378- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\" required></label> <label><span>Surface</span><input name=\"")
378+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\" type=\"text\" value=\"")
379379 if templ_7745c5c3_Err != nil {
380380 return templ_7745c5c3_Err
381381 }
382382 var templ_7745c5c3_Var17 string
383- templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_surface")
383+ templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Background)
384384 if templ_7745c5c3_Err != nil {
385- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 62}
385+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 109}
386386 }
387- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
387+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var17)
388388 if templ_7745c5c3_Err != nil {
389389 return templ_7745c5c3_Err
390390 }
391- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" type=\"text\" value=\"")
391+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" required></label> <label><span>Surface</span><input name=\"")
392392 if templ_7745c5c3_Err != nil {
393393 return templ_7745c5c3_Err
394394 }
395395 var templ_7745c5c3_Var18 string
396- templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Surface)
396+ templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_surface")
397397 if templ_7745c5c3_Err != nil {
398- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 100}
398+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 62}
399399 }
400- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
400+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var18)
401401 if templ_7745c5c3_Err != nil {
402402 return templ_7745c5c3_Err
403403 }
404- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\" required></label> <label><span>Surface variant</span><input name=\"")
404+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\" type=\"text\" value=\"")
405405 if templ_7745c5c3_Err != nil {
406406 return templ_7745c5c3_Err
407407 }
408408 var templ_7745c5c3_Var19 string
409- templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_surface_variant")
409+ templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Surface)
410410 if templ_7745c5c3_Err != nil {
411- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 78}
411+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 100}
412412 }
413- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
413+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var19)
414414 if templ_7745c5c3_Err != nil {
415415 return templ_7745c5c3_Err
416416 }
417- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\" type=\"text\" value=\"")
417+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\" required></label> <label><span>Surface variant</span><input name=\"")
418418 if templ_7745c5c3_Err != nil {
419419 return templ_7745c5c3_Err
420420 }
421421 var templ_7745c5c3_Var20 string
422- templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(palette.SurfaceVariant)
422+ templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_surface_variant")
423423 if templ_7745c5c3_Err != nil {
424- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 123}
424+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 78}
425425 }
426- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
426+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var20)
427427 if templ_7745c5c3_Err != nil {
428428 return templ_7745c5c3_Err
429429 }
430- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "\" required></label> <label><span>Text</span><input name=\"")
430+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "\" type=\"text\" value=\"")
431431 if templ_7745c5c3_Err != nil {
432432 return templ_7745c5c3_Err
433433 }
434434 var templ_7745c5c3_Var21 string
435- templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_text")
435+ templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.SurfaceVariant)
436436 if templ_7745c5c3_Err != nil {
437- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 56}
437+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 123}
438438 }
439- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
439+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var21)
440440 if templ_7745c5c3_Err != nil {
441441 return templ_7745c5c3_Err
442442 }
443- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\" type=\"text\" value=\"")
443+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\" required></label> <label><span>Text</span><input name=\"")
444444 if templ_7745c5c3_Err != nil {
445445 return templ_7745c5c3_Err
446446 }
447447 var templ_7745c5c3_Var22 string
448- templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Text)
448+ templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_text")
449449 if templ_7745c5c3_Err != nil {
450- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 91}
450+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 56}
451451 }
452- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
452+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22)
453453 if templ_7745c5c3_Err != nil {
454454 return templ_7745c5c3_Err
455455 }
456- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "\" required></label> <label><span>Muted</span><input name=\"")
456+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "\" type=\"text\" value=\"")
457457 if templ_7745c5c3_Err != nil {
458458 return templ_7745c5c3_Err
459459 }
460460 var templ_7745c5c3_Var23 string
461- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_muted")
461+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Text)
462462 if templ_7745c5c3_Err != nil {
463- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 58}
463+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 91}
464464 }
465- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
465+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var23)
466466 if templ_7745c5c3_Err != nil {
467467 return templ_7745c5c3_Err
468468 }
469- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\" type=\"text\" value=\"")
469+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\" required></label> <label><span>Muted</span><input name=\"")
470470 if templ_7745c5c3_Err != nil {
471471 return templ_7745c5c3_Err
472472 }
473473 var templ_7745c5c3_Var24 string
474- templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Muted)
474+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_muted")
475475 if templ_7745c5c3_Err != nil {
476- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 94}
476+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 58}
477477 }
478- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
478+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var24)
479479 if templ_7745c5c3_Err != nil {
480480 return templ_7745c5c3_Err
481481 }
482- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\" required></label> <label><span>Accent</span><input name=\"")
482+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\" type=\"text\" value=\"")
483483 if templ_7745c5c3_Err != nil {
484484 return templ_7745c5c3_Err
485485 }
486486 var templ_7745c5c3_Var25 string
487- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_accent")
487+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Muted)
488488 if templ_7745c5c3_Err != nil {
489- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 60}
489+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 94}
490490 }
491- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
491+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var25)
492492 if templ_7745c5c3_Err != nil {
493493 return templ_7745c5c3_Err
494494 }
495- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "\" type=\"text\" value=\"")
495+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "\" required></label> <label><span>Accent</span><input name=\"")
496496 if templ_7745c5c3_Err != nil {
497497 return templ_7745c5c3_Err
498498 }
499499 var templ_7745c5c3_Var26 string
500- templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Accent)
500+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_accent")
501501 if templ_7745c5c3_Err != nil {
502- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 97}
502+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 60}
503503 }
504- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
504+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var26)
505505 if templ_7745c5c3_Err != nil {
506506 return templ_7745c5c3_Err
507507 }
508- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "\" required></label> <label><span>Border</span><input name=\"")
508+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "\" type=\"text\" value=\"")
509509 if templ_7745c5c3_Err != nil {
510510 return templ_7745c5c3_Err
511511 }
512512 var templ_7745c5c3_Var27 string
513- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_border")
513+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Accent)
514514 if templ_7745c5c3_Err != nil {
515- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 60}
515+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 97}
516516 }
517- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
517+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var27)
518518 if templ_7745c5c3_Err != nil {
519519 return templ_7745c5c3_Err
520520 }
521- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\" type=\"text\" value=\"")
521+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\" required></label> <label><span>Border</span><input name=\"")
522522 if templ_7745c5c3_Err != nil {
523523 return templ_7745c5c3_Err
524524 }
525525 var templ_7745c5c3_Var28 string
526- templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Border)
526+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_border")
527527 if templ_7745c5c3_Err != nil {
528- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 97}
528+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 60, Col: 60}
529+ }
530+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var28)
531+ if templ_7745c5c3_Err != nil {
532+ return templ_7745c5c3_Err
533+ }
534+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\" type=\"text\" value=\"")
535+ if templ_7745c5c3_Err != nil {
536+ return templ_7745c5c3_Err
537+ }
538+ var templ_7745c5c3_Var29 string
539+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Border)
540+ if templ_7745c5c3_Err != nil {
541+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 60, Col: 97}
529542 }
530- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
543+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var29)
531544 if templ_7745c5c3_Err != nil {
532545 return templ_7745c5c3_Err
533546 }
534- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\" required></label></fieldset>")
547+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "\" required></label></fieldset>")
535548 if templ_7745c5c3_Err != nil {
536549 return templ_7745c5c3_Err
537550 }
@@ -555,25 +568,25 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
555568 }()
556569 }
557570 ctx = templ.InitializeContext(ctx)
558- templ_7745c5c3_Var29 := templ.GetChildren(ctx)
559- if templ_7745c5c3_Var29 == nil {
560- templ_7745c5c3_Var29 = templ.NopComponent
571+ templ_7745c5c3_Var30 := templ.GetChildren(ctx)
572+ if templ_7745c5c3_Var30 == nil {
573+ templ_7745c5c3_Var30 = templ.NopComponent
561574 }
562575 ctx = templ.ClearChildren(ctx)
563- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<form class=\"sv-card-form\" data-sv-action=\"config.search.save\"><label><span>Default search engine</span><input name=\"default_search_engine\" type=\"text\" value=\"")
576+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<form class=\"sv-card-form\" data-sv-action=\"config.search.save\"><label><span>Default search engine</span><input name=\"default_search_engine\" type=\"text\" value=\"")
564577 if templ_7745c5c3_Err != nil {
565578 return templ_7745c5c3_Err
566579 }
567- var templ_7745c5c3_Var30 string
568- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(config.DefaultSearchEngine)
580+ var templ_7745c5c3_Var31 string
581+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.DefaultSearchEngine)
569582 if templ_7745c5c3_Err != nil {
570- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 65, Col: 125}
583+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 66, Col: 125}
571584 }
572- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
585+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var31)
573586 if templ_7745c5c3_Err != nil {
574587 return templ_7745c5c3_Err
575588 }
576- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "\" placeholder=\"https://duckduckgo.com/?q=%s\" required></label> <button class=\"sv-button\" type=\"submit\">")
589+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "\" placeholder=\"https://duckduckgo.com/?q=%s\" required></label> <button class=\"sv-button\" type=\"submit\">")
577590 if templ_7745c5c3_Err != nil {
578591 return templ_7745c5c3_Err
579592 }
@@ -581,7 +594,7 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
581594 if templ_7745c5c3_Err != nil {
582595 return templ_7745c5c3_Err
583596 }
584- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</button></form><div class=\"sv-group\"><div class=\"sv-group-header\"><h4>Search shortcuts</h4></div><p class=\"sv-meta\">Shortcut URLs must include the %s placeholder for the search query.</p><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.create\"><label><span>Key</span><input name=\"key\" type=\"text\" placeholder=\"ddg\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" placeholder=\"https://duckduckgo.com/?q=%s\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" placeholder=\"DuckDuckGo\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
597+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</button></form><div class=\"sv-group\"><div class=\"sv-group-header\"><h4>Search shortcuts</h4></div><p class=\"sv-meta\">Shortcut URLs must include the %s placeholder for the search query.</p><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.create\"><label><span>Key</span><input name=\"key\" type=\"text\" placeholder=\"ddg\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" placeholder=\"https://duckduckgo.com/?q=%s\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" placeholder=\"DuckDuckGo\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
585598 if templ_7745c5c3_Err != nil {
586599 return templ_7745c5c3_Err
587600 }
@@ -589,7 +602,7 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
589602 if templ_7745c5c3_Err != nil {
590603 return templ_7745c5c3_Err
591604 }
592- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</button></form>")
605+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</button></form>")
593606 if templ_7745c5c3_Err != nil {
594607 return templ_7745c5c3_Err
595608 }
@@ -600,7 +613,7 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
600613 return templ_7745c5c3_Err
601614 }
602615 } else {
603- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<ul class=\"sv-list\">")
616+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<ul class=\"sv-list\">")
604617 if templ_7745c5c3_Err != nil {
605618 return templ_7745c5c3_Err
606619 }
@@ -610,12 +623,12 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
610623 return templ_7745c5c3_Err
611624 }
612625 }
613- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</ul>")
626+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</ul>")
614627 if templ_7745c5c3_Err != nil {
615628 return templ_7745c5c3_Err
616629 }
617630 }
618- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</div>")
631+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</div>")
619632 if templ_7745c5c3_Err != nil {
620633 return templ_7745c5c3_Err
621634 }
@@ -639,64 +652,64 @@ func SearchShortcutItem(shortcut searchShortcutRow) templ.Component {
639652 }()
640653 }
641654 ctx = templ.InitializeContext(ctx)
642- templ_7745c5c3_Var31 := templ.GetChildren(ctx)
643- if templ_7745c5c3_Var31 == nil {
644- templ_7745c5c3_Var31 = templ.NopComponent
655+ templ_7745c5c3_Var32 := templ.GetChildren(ctx)
656+ if templ_7745c5c3_Var32 == nil {
657+ templ_7745c5c3_Var32 = templ.NopComponent
645658 }
646659 ctx = templ.ClearChildren(ctx)
647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<li class=\"sv-list-row\"><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.update\"><input type=\"hidden\" name=\"key\" value=\"")
660+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<li class=\"sv-list-row\"><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.update\"><input type=\"hidden\" name=\"key\" value=\"")
648661 if templ_7745c5c3_Err != nil {
649662 return templ_7745c5c3_Err
650663 }
651- var templ_7745c5c3_Var32 string
652- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Key)
664+ var templ_7745c5c3_Var33 string
665+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Key)
653666 if templ_7745c5c3_Err != nil {
654- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 93, Col: 55}
667+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 94, Col: 55}
655668 }
656- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
669+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
657670 if templ_7745c5c3_Err != nil {
658671 return templ_7745c5c3_Err
659672 }
660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "\"> <label><span>Key</span><input name=\"new_key\" type=\"text\" value=\"")
673+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\"> <label><span>Key</span><input name=\"new_key\" type=\"text\" value=\"")
661674 if templ_7745c5c3_Err != nil {
662675 return templ_7745c5c3_Err
663676 }
664- var templ_7745c5c3_Var33 string
665- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Key)
677+ var templ_7745c5c3_Var34 string
678+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Key)
666679 if templ_7745c5c3_Err != nil {
667- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 94, Col: 80}
680+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 95, Col: 80}
668681 }
669- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
682+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34)
670683 if templ_7745c5c3_Err != nil {
671684 return templ_7745c5c3_Err
672685 }
673- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" value=\"")
686+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" value=\"")
674687 if templ_7745c5c3_Err != nil {
675688 return templ_7745c5c3_Err
676689 }
677- var templ_7745c5c3_Var34 string
678- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.URL)
690+ var templ_7745c5c3_Var35 string
691+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.URL)
679692 if templ_7745c5c3_Err != nil {
680- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 95, Col: 76}
693+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 96, Col: 76}
681694 }
682- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
695+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)
683696 if templ_7745c5c3_Err != nil {
684697 return templ_7745c5c3_Err
685698 }
686- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" value=\"")
699+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" value=\"")
687700 if templ_7745c5c3_Err != nil {
688701 return templ_7745c5c3_Err
689702 }
690- var templ_7745c5c3_Var35 string
691- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Description)
703+ var templ_7745c5c3_Var36 string
704+ templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Description)
692705 if templ_7745c5c3_Err != nil {
693- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 96, Col: 100}
706+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 97, Col: 100}
694707 }
695- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
708+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36)
696709 if templ_7745c5c3_Err != nil {
697710 return templ_7745c5c3_Err
698711 }
699- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
712+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
700713 if templ_7745c5c3_Err != nil {
701714 return templ_7745c5c3_Err
702715 }
@@ -704,33 +717,33 @@ func SearchShortcutItem(shortcut searchShortcutRow) templ.Component {
704717 if templ_7745c5c3_Err != nil {
705718 return templ_7745c5c3_Err
706719 }
707- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</button> <button class=\"sv-button sv-button-secondary sv-button-danger sv-button-icon-only\" type=\"button\" data-sv-action=\"config.searchShortcut.delete\" data-key=\"")
720+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</button> <button class=\"sv-button sv-button-secondary sv-button-danger sv-button-icon-only\" type=\"button\" data-sv-action=\"config.searchShortcut.delete\" data-key=\"")
708721 if templ_7745c5c3_Err != nil {
709722 return templ_7745c5c3_Err
710723 }
711- var templ_7745c5c3_Var36 string
712- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Key)
724+ var templ_7745c5c3_Var37 string
725+ templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Key)
713726 if templ_7745c5c3_Err != nil {
714- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 98, Col: 169}
727+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 99, Col: 169}
715728 }
716- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
729+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37)
717730 if templ_7745c5c3_Err != nil {
718731 return templ_7745c5c3_Err
719732 }
720- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\" data-sv-confirm=\"Delete this search shortcut?\" aria-label=\"")
733+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\" data-sv-confirm=\"Delete this search shortcut?\" aria-label=\"")
721734 if templ_7745c5c3_Err != nil {
722735 return templ_7745c5c3_Err
723736 }
724- var templ_7745c5c3_Var37 string
725- templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs("Delete search shortcut " + shortcut.Key)
737+ var templ_7745c5c3_Var38 string
738+ templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.ResolveAttributeValue("Delete search shortcut " + shortcut.Key)
726739 if templ_7745c5c3_Err != nil {
727- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 98, Col: 272}
740+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 99, Col: 272}
728741 }
729- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
742+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var38)
730743 if templ_7745c5c3_Err != nil {
731744 return templ_7745c5c3_Err
732745 }
733- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\">")
746+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\">")
734747 if templ_7745c5c3_Err != nil {
735748 return templ_7745c5c3_Err
736749 }
@@ -738,7 +751,7 @@ func SearchShortcutItem(shortcut searchShortcutRow) templ.Component {
738751 if templ_7745c5c3_Err != nil {
739752 return templ_7745c5c3_Err
740753 }
741- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</button></form></li>")
754+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</button></form></li>")
742755 if templ_7745c5c3_Err != nil {
743756 return templ_7745c5c3_Err
744757 }
@@ -762,178 +775,178 @@ func PerformanceSettings(config dto.SystemviewConfigPayload) templ.Component {
762775 }()
763776 }
764777 ctx = templ.InitializeContext(ctx)
765- templ_7745c5c3_Var38 := templ.GetChildren(ctx)
766- if templ_7745c5c3_Var38 == nil {
767- templ_7745c5c3_Var38 = templ.NopComponent
778+ templ_7745c5c3_Var39 := templ.GetChildren(ctx)
779+ if templ_7745c5c3_Var39 == nil {
780+ templ_7745c5c3_Var39 = templ.NopComponent
768781 }
769782 ctx = templ.ClearChildren(ctx)
770783 customProfile := performanceProfileSelected(config.Performance.Profile, "custom")
771- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<form class=\"sv-card-form sv-config-form\" data-sv-action=\"config.performance.save\" data-sv-performance-form><label><span>Profile</span><select name=\"profile\" data-sv-performance-profile><option value=\"default\"")
784+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "<form class=\"sv-card-form sv-config-form\" data-sv-action=\"config.performance.save\" data-sv-performance-form><label><span>Profile</span><select name=\"profile\" data-sv-performance-profile><option value=\"default\"")
772785 if templ_7745c5c3_Err != nil {
773786 return templ_7745c5c3_Err
774787 }
775788 if performanceProfileSelected(config.Performance.Profile, "default") {
776- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, " selected")
789+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, " selected")
777790 if templ_7745c5c3_Err != nil {
778791 return templ_7745c5c3_Err
779792 }
780793 }
781- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, ">Default</option> <option value=\"balanced\"")
794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, ">Default</option> <option value=\"balanced\"")
782795 if templ_7745c5c3_Err != nil {
783796 return templ_7745c5c3_Err
784797 }
785798 if performanceProfileSelected(config.Performance.Profile, "balanced") {
786- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, " selected")
799+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, " selected")
787800 if templ_7745c5c3_Err != nil {
788801 return templ_7745c5c3_Err
789802 }
790803 }
791- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, ">Balanced</option> <option value=\"lite\"")
804+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, ">Balanced</option> <option value=\"lite\"")
792805 if templ_7745c5c3_Err != nil {
793806 return templ_7745c5c3_Err
794807 }
795808 if performanceProfileSelected(config.Performance.Profile, "lite") {
796- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, " selected")
809+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, " selected")
797810 if templ_7745c5c3_Err != nil {
798811 return templ_7745c5c3_Err
799812 }
800813 }
801- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, ">Lite</option> <option value=\"max\"")
814+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, ">Lite</option> <option value=\"max\"")
802815 if templ_7745c5c3_Err != nil {
803816 return templ_7745c5c3_Err
804817 }
805818 if performanceProfileSelected(config.Performance.Profile, "max") {
806- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, " selected")
819+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, " selected")
807820 if templ_7745c5c3_Err != nil {
808821 return templ_7745c5c3_Err
809822 }
810823 }
811- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, ">Max</option> <option value=\"custom\"")
824+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, ">Max</option> <option value=\"custom\"")
812825 if templ_7745c5c3_Err != nil {
813826 return templ_7745c5c3_Err
814827 }
815828 if performanceProfileSelected(config.Performance.Profile, "custom") {
816- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, " selected")
829+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, " selected")
817830 if templ_7745c5c3_Err != nil {
818831 return templ_7745c5c3_Err
819832 }
820833 }
821- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, ">Custom</option></select></label><p class=\"sv-meta\">Choose Custom to edit individual performance values.</p><label><span>Skia CPU threads</span><input name=\"skia_cpu_threads\" type=\"number\" min=\"0\" max=\"8\" value=\"")
834+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, ">Custom</option></select></label><p class=\"sv-meta\">Choose Custom to edit individual performance values.</p><label><span>Skia CPU threads</span><input name=\"skia_cpu_threads\" type=\"number\" min=\"0\" max=\"8\" value=\"")
822835 if templ_7745c5c3_Err != nil {
823836 return templ_7745c5c3_Err
824837 }
825- var templ_7745c5c3_Var39 string
826- templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.SkiaCPUThreads))
838+ var templ_7745c5c3_Var40 string
839+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.SkiaCPUThreads))
827840 if templ_7745c5c3_Err != nil {
828- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 114, Col: 164}
841+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 115, Col: 164}
829842 }
830- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
843+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40)
831844 if templ_7745c5c3_Err != nil {
832845 return templ_7745c5c3_Err
833846 }
834- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\"")
847+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "\"")
835848 if templ_7745c5c3_Err != nil {
836849 return templ_7745c5c3_Err
837850 }
838851 if !customProfile {
839- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, " disabled")
852+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, " disabled")
840853 if templ_7745c5c3_Err != nil {
841854 return templ_7745c5c3_Err
842855 }
843856 }
844- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, " data-sv-performance-custom></label> <label><span>Skia GPU threads</span><input name=\"skia_gpu_threads\" type=\"number\" min=\"-1\" max=\"8\" value=\"")
857+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, " data-sv-performance-custom></label> <label><span>Skia GPU threads</span><input name=\"skia_gpu_threads\" type=\"number\" min=\"-1\" max=\"8\" value=\"")
845858 if templ_7745c5c3_Err != nil {
846859 return templ_7745c5c3_Err
847860 }
848- var templ_7745c5c3_Var40 string
849- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.SkiaGPUThreads))
861+ var templ_7745c5c3_Var41 string
862+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.SkiaGPUThreads))
850863 if templ_7745c5c3_Err != nil {
851- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 115, Col: 165}
864+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 116, Col: 165}
852865 }
853- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
866+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var41)
854867 if templ_7745c5c3_Err != nil {
855868 return templ_7745c5c3_Err
856869 }
857- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "\"")
870+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "\"")
858871 if templ_7745c5c3_Err != nil {
859872 return templ_7745c5c3_Err
860873 }
861874 if !customProfile {
862- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, " disabled")
875+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, " disabled")
863876 if templ_7745c5c3_Err != nil {
864877 return templ_7745c5c3_Err
865878 }
866879 }
867- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, " data-sv-performance-custom></label> <label><span>Web process memory MB</span><input name=\"web_process_memory_mb\" type=\"number\" min=\"0\" max=\"16384\" value=\"")
880+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, " data-sv-performance-custom></label> <label><span>Web process memory MB</span><input name=\"web_process_memory_mb\" type=\"number\" min=\"0\" max=\"16384\" value=\"")
868881 if templ_7745c5c3_Err != nil {
869882 return templ_7745c5c3_Err
870883 }
871- var templ_7745c5c3_Var41 string
872- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.WebProcessMemoryMB))
884+ var templ_7745c5c3_Var42 string
885+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.WebProcessMemoryMB))
873886 if templ_7745c5c3_Err != nil {
874- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 116, Col: 182}
887+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 117, Col: 182}
875888 }
876- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
889+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var42)
877890 if templ_7745c5c3_Err != nil {
878891 return templ_7745c5c3_Err
879892 }
880- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\"")
893+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "\"")
881894 if templ_7745c5c3_Err != nil {
882895 return templ_7745c5c3_Err
883896 }
884897 if !customProfile {
885- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, " disabled")
898+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, " disabled")
886899 if templ_7745c5c3_Err != nil {
887900 return templ_7745c5c3_Err
888901 }
889902 }
890- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, " data-sv-performance-custom></label> <label><span>Network process memory MB</span><input name=\"network_process_memory_mb\" type=\"number\" min=\"0\" max=\"4096\" value=\"")
903+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, " data-sv-performance-custom></label> <label><span>Network process memory MB</span><input name=\"network_process_memory_mb\" type=\"number\" min=\"0\" max=\"4096\" value=\"")
891904 if templ_7745c5c3_Err != nil {
892905 return templ_7745c5c3_Err
893906 }
894- var templ_7745c5c3_Var42 string
895- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.NetworkProcessMemoryMB))
907+ var templ_7745c5c3_Var43 string
908+ templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.NetworkProcessMemoryMB))
896909 if templ_7745c5c3_Err != nil {
897- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 117, Col: 193}
910+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 118, Col: 193}
898911 }
899- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
912+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var43)
900913 if templ_7745c5c3_Err != nil {
901914 return templ_7745c5c3_Err
902915 }
903- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "\"")
916+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "\"")
904917 if templ_7745c5c3_Err != nil {
905918 return templ_7745c5c3_Err
906919 }
907920 if !customProfile {
908- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, " disabled")
921+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, " disabled")
909922 if templ_7745c5c3_Err != nil {
910923 return templ_7745c5c3_Err
911924 }
912925 }
913- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, " data-sv-performance-custom></label> <label><span>WebView pool prewarm</span><input name=\"webview_pool_prewarm\" type=\"number\" min=\"0\" max=\"20\" value=\"")
926+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, " data-sv-performance-custom></label> <label><span>WebView pool prewarm</span><input name=\"webview_pool_prewarm\" type=\"number\" min=\"0\" max=\"20\" value=\"")
914927 if templ_7745c5c3_Err != nil {
915928 return templ_7745c5c3_Err
916929 }
917- var templ_7745c5c3_Var43 string
918- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.WebViewPoolPrewarm))
930+ var templ_7745c5c3_Var44 string
931+ templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.WebViewPoolPrewarm))
919932 if templ_7745c5c3_Err != nil {
920- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 118, Col: 177}
933+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 119, Col: 177}
921934 }
922- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
935+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var44)
923936 if templ_7745c5c3_Err != nil {
924937 return templ_7745c5c3_Err
925938 }
926- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "\"")
939+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "\"")
927940 if templ_7745c5c3_Err != nil {
928941 return templ_7745c5c3_Err
929942 }
930943 if !customProfile {
931- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, " disabled")
944+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, " disabled")
932945 if templ_7745c5c3_Err != nil {
933946 return templ_7745c5c3_Err
934947 }
935948 }
936- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, " data-sv-performance-custom></label> <button class=\"sv-button\" type=\"submit\">")
949+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, " data-sv-performance-custom></label> <button class=\"sv-button\" type=\"submit\">")
937950 if templ_7745c5c3_Err != nil {
938951 return templ_7745c5c3_Err
939952 }
@@ -941,69 +954,69 @@ func PerformanceSettings(config dto.SystemviewConfigPayload) templ.Component {
941954 if templ_7745c5c3_Err != nil {
942955 return templ_7745c5c3_Err
943956 }
944- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</button></form><div class=\"sv-stat-grid\"><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
957+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</button></form><div class=\"sv-stat-grid\"><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
945958 if templ_7745c5c3_Err != nil {
946959 return templ_7745c5c3_Err
947960 }
948- var templ_7745c5c3_Var44 string
949- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.CPUThreads))
961+ var templ_7745c5c3_Var45 string
962+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.CPUThreads))
950963 if templ_7745c5c3_Err != nil {
951- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 122, Col: 113}
964+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 123, Col: 113}
952965 }
953- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
966+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
954967 if templ_7745c5c3_Err != nil {
955968 return templ_7745c5c3_Err
956969 }
957- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</span><span class=\"sv-stat-label\">CPU threads</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
970+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</span><span class=\"sv-stat-label\">CPU threads</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
958971 if templ_7745c5c3_Err != nil {
959972 return templ_7745c5c3_Err
960973 }
961- var templ_7745c5c3_Var45 string
962- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.TotalRAMMB))
974+ var templ_7745c5c3_Var46 string
975+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.TotalRAMMB))
963976 if templ_7745c5c3_Err != nil {
964- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 123, Col: 113}
977+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 124, Col: 113}
965978 }
966- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
979+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
967980 if templ_7745c5c3_Err != nil {
968981 return templ_7745c5c3_Err
969982 }
970- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</span><span class=\"sv-stat-label\">RAM MB</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
983+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</span><span class=\"sv-stat-label\">RAM MB</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
971984 if templ_7745c5c3_Err != nil {
972985 return templ_7745c5c3_Err
973986 }
974- var templ_7745c5c3_Var46 string
975- templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(config.Performance.Hardware.GPUName)
987+ var templ_7745c5c3_Var47 string
988+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(config.Performance.Hardware.GPUName)
976989 if templ_7745c5c3_Err != nil {
977- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 124, Col: 93}
990+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 125, Col: 93}
978991 }
979- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
992+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
980993 if templ_7745c5c3_Err != nil {
981994 return templ_7745c5c3_Err
982995 }
983- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</span><span class=\"sv-stat-label\">GPU</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
996+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span><span class=\"sv-stat-label\">GPU</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
984997 if templ_7745c5c3_Err != nil {
985998 return templ_7745c5c3_Err
986999 }
987- var templ_7745c5c3_Var47 string
988- templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(config.EngineType)
1000+ var templ_7745c5c3_Var48 string
1001+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(config.EngineType)
9891002 if templ_7745c5c3_Err != nil {
990- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 125, Col: 75}
1003+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 126, Col: 75}
9911004 }
992- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
1005+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
9931006 if templ_7745c5c3_Err != nil {
9941007 return templ_7745c5c3_Err
9951008 }
996- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span><span class=\"sv-stat-label\">Engine</span></div></div>")
1009+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</span><span class=\"sv-stat-label\">Engine</span></div></div>")
9971010 if templ_7745c5c3_Err != nil {
9981011 return templ_7745c5c3_Err
9991012 }
10001013 if !engineIsWebKit(config.EngineType) {
1001- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "<p class=\"sv-meta\">Performance tuning applies only to the WebKit engine.</p>")
1014+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<p class=\"sv-meta\">Performance tuning applies only to the WebKit engine.</p>")
10021015 if templ_7745c5c3_Err != nil {
10031016 return templ_7745c5c3_Err
10041017 }
10051018 } else {
1006- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<p class=\"sv-meta\">Performance profile changes may require restarting the browser to affect existing engine processes.</p>")
1019+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<p class=\"sv-meta\">Performance profile changes may require restarting the browser to affect existing engine processes.</p>")
10071020 if templ_7745c5c3_Err != nil {
10081021 return templ_7745c5c3_Err
10091022 }
@@ -1028,9 +1041,9 @@ func ConfigKeybindings(keybindings port.KeybindingsConfig) templ.Component {
10281041 }()
10291042 }
10301043 ctx = templ.InitializeContext(ctx)
1031- templ_7745c5c3_Var48 := templ.GetChildren(ctx)
1032- if templ_7745c5c3_Var48 == nil {
1033- templ_7745c5c3_Var48 = templ.NopComponent
1044+ templ_7745c5c3_Var49 := templ.GetChildren(ctx)
1045+ if templ_7745c5c3_Var49 == nil {
1046+ templ_7745c5c3_Var49 = templ.NopComponent
10341047 }
10351048 ctx = templ.ClearChildren(ctx)
10361049 groups := configKeybindingGroups(keybindings)
@@ -1045,7 +1058,7 @@ func ConfigKeybindings(keybindings port.KeybindingsConfig) templ.Component {
10451058 return templ_7745c5c3_Err
10461059 }
10471060 } else {
1048- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<div class=\"sv-button-row\"><button class=\"sv-button sv-button-secondary sv-button-danger\" type=\"button\" data-sv-action=\"config.keybinding.resetAll\" data-sv-confirm=\"Reset all keybindings to defaults?\">")
1061+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<div class=\"sv-button-row\"><button class=\"sv-button sv-button-secondary sv-button-danger\" type=\"button\" data-sv-action=\"config.keybinding.resetAll\" data-sv-confirm=\"Reset all keybindings to defaults?\">")
10491062 if templ_7745c5c3_Err != nil {
10501063 return templ_7745c5c3_Err
10511064 }
@@ -1053,7 +1066,7 @@ func ConfigKeybindings(keybindings port.KeybindingsConfig) templ.Component {
10531066 if templ_7745c5c3_Err != nil {
10541067 return templ_7745c5c3_Err
10551068 }
1056- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</button></div>")
1069+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</button></div>")
10571070 if templ_7745c5c3_Err != nil {
10581071 return templ_7745c5c3_Err
10591072 }
@@ -1084,48 +1097,48 @@ func ConfigKeybindingGroup(group renderedKeybindingGroup) templ.Component {
10841097 }()
10851098 }
10861099 ctx = templ.InitializeContext(ctx)
1087- templ_7745c5c3_Var49 := templ.GetChildren(ctx)
1088- if templ_7745c5c3_Var49 == nil {
1089- templ_7745c5c3_Var49 = templ.NopComponent
1100+ templ_7745c5c3_Var50 := templ.GetChildren(ctx)
1101+ if templ_7745c5c3_Var50 == nil {
1102+ templ_7745c5c3_Var50 = templ.NopComponent
10901103 }
10911104 ctx = templ.ClearChildren(ctx)
1092- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<div class=\"sv-group\"><div class=\"sv-group-header\"><div><h4>")
1105+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<div class=\"sv-group\"><div class=\"sv-group-header\"><div><h4>")
10931106 if templ_7745c5c3_Err != nil {
10941107 return templ_7745c5c3_Err
10951108 }
1096- var templ_7745c5c3_Var50 string
1097- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupTitle(group))
1109+ var templ_7745c5c3_Var51 string
1110+ templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupTitle(group))
10981111 if templ_7745c5c3_Err != nil {
1099- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 154, Col: 37}
1112+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 155, Col: 37}
11001113 }
1101- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
1114+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
11021115 if templ_7745c5c3_Err != nil {
11031116 return templ_7745c5c3_Err
11041117 }
1105- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</h4>")
1118+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</h4>")
11061119 if templ_7745c5c3_Err != nil {
11071120 return templ_7745c5c3_Err
11081121 }
11091122 if keybindingGroupMeta(group) != "" {
1110- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<p class=\"sv-meta\">")
1123+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<p class=\"sv-meta\">")
11111124 if templ_7745c5c3_Err != nil {
11121125 return templ_7745c5c3_Err
11131126 }
1114- var templ_7745c5c3_Var51 string
1115- templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupMeta(group))
1127+ var templ_7745c5c3_Var52 string
1128+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupMeta(group))
11161129 if templ_7745c5c3_Err != nil {
1117- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 156, Col: 52}
1130+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 157, Col: 52}
11181131 }
1119- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
1132+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
11201133 if templ_7745c5c3_Err != nil {
11211134 return templ_7745c5c3_Err
11221135 }
1123- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</p>")
1136+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</p>")
11241137 if templ_7745c5c3_Err != nil {
11251138 return templ_7745c5c3_Err
11261139 }
11271140 }
1128- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</div></div><div class=\"sv-group-body\">")
1141+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "</div></div><div class=\"sv-group-body\">")
11291142 if templ_7745c5c3_Err != nil {
11301143 return templ_7745c5c3_Err
11311144 }
@@ -1135,7 +1148,7 @@ func ConfigKeybindingGroup(group renderedKeybindingGroup) templ.Component {
11351148 return templ_7745c5c3_Err
11361149 }
11371150 } else {
1138- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<ul class=\"sv-list\">")
1151+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<ul class=\"sv-list\">")
11391152 if templ_7745c5c3_Err != nil {
11401153 return templ_7745c5c3_Err
11411154 }
@@ -1145,12 +1158,12 @@ func ConfigKeybindingGroup(group renderedKeybindingGroup) templ.Component {
11451158 return templ_7745c5c3_Err
11461159 }
11471160 }
1148- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</ul>")
1161+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</ul>")
11491162 if templ_7745c5c3_Err != nil {
11501163 return templ_7745c5c3_Err
11511164 }
11521165 }
1153- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</div></div>")
1166+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</div></div>")
11541167 if templ_7745c5c3_Err != nil {
11551168 return templ_7745c5c3_Err
11561169 }
@@ -1174,38 +1187,38 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
11741187 }()
11751188 }
11761189 ctx = templ.InitializeContext(ctx)
1177- templ_7745c5c3_Var52 := templ.GetChildren(ctx)
1178- if templ_7745c5c3_Var52 == nil {
1179- templ_7745c5c3_Var52 = templ.NopComponent
1190+ templ_7745c5c3_Var53 := templ.GetChildren(ctx)
1191+ if templ_7745c5c3_Var53 == nil {
1192+ templ_7745c5c3_Var53 = templ.NopComponent
11801193 }
11811194 ctx = templ.ClearChildren(ctx)
1182- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<li class=\"sv-list-row\"><div class=\"sv-keybinding-row\"><div><strong>")
1195+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<li class=\"sv-list-row\"><div class=\"sv-keybinding-row\"><div><strong>")
11831196 if templ_7745c5c3_Err != nil {
11841197 return templ_7745c5c3_Err
11851198 }
1186- var templ_7745c5c3_Var53 string
1187- templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingDescription(binding))
1199+ var templ_7745c5c3_Var54 string
1200+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingDescription(binding))
11881201 if templ_7745c5c3_Err != nil {
1189- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 178, Col: 44}
1202+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 179, Col: 44}
11901203 }
1191- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
1204+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
11921205 if templ_7745c5c3_Err != nil {
11931206 return templ_7745c5c3_Err
11941207 }
1195- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "</strong><p class=\"sv-meta\">")
1208+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</strong><p class=\"sv-meta\">")
11961209 if templ_7745c5c3_Err != nil {
11971210 return templ_7745c5c3_Err
11981211 }
1199- var templ_7745c5c3_Var54 string
1200- templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingAction(binding))
1212+ var templ_7745c5c3_Var55 string
1213+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingAction(binding))
12011214 if templ_7745c5c3_Err != nil {
1202- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 179, Col: 50}
1215+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 180, Col: 50}
12031216 }
1204- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
1217+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
12051218 if templ_7745c5c3_Err != nil {
12061219 return templ_7745c5c3_Err
12071220 }
1208- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</p><div class=\"sv-binding-keys\">")
1221+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "</p><div class=\"sv-binding-keys\">")
12091222 if templ_7745c5c3_Err != nil {
12101223 return templ_7745c5c3_Err
12111224 }
@@ -1213,25 +1226,25 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
12131226 if templ_7745c5c3_Err != nil {
12141227 return templ_7745c5c3_Err
12151228 }
1216- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<span class=\"sv-badge\">")
1229+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "<span class=\"sv-badge\">")
12171230 if templ_7745c5c3_Err != nil {
12181231 return templ_7745c5c3_Err
12191232 }
1220- var templ_7745c5c3_Var55 string
1221- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingStatus(binding))
1233+ var templ_7745c5c3_Var56 string
1234+ templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingStatus(binding))
12221235 if templ_7745c5c3_Err != nil {
1223- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 182, Col: 55}
1236+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 183, Col: 55}
12241237 }
1225- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1238+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
12261239 if templ_7745c5c3_Err != nil {
12271240 return templ_7745c5c3_Err
12281241 }
1229- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</span> ")
1242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "</span> ")
12301243 if templ_7745c5c3_Err != nil {
12311244 return templ_7745c5c3_Err
12321245 }
12331246 if keybindingIsCustom(binding) && len(binding.DefaultKeys) > 0 {
1234- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<span class=\"sv-meta\">default:</span>")
1247+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "<span class=\"sv-meta\">default:</span>")
12351248 if templ_7745c5c3_Err != nil {
12361249 return templ_7745c5c3_Err
12371250 }
@@ -1240,46 +1253,46 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
12401253 return templ_7745c5c3_Err
12411254 }
12421255 }
1243- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</div></div><form class=\"sv-inline-form\" data-sv-action=\"config.keybinding.set\"><input type=\"hidden\" name=\"mode\" value=\"")
1256+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</div></div><form class=\"sv-inline-form\" data-sv-action=\"config.keybinding.set\"><input type=\"hidden\" name=\"mode\" value=\"")
12441257 if templ_7745c5c3_Err != nil {
12451258 return templ_7745c5c3_Err
12461259 }
1247- var templ_7745c5c3_Var56 string
1248- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(group.Mode)
1260+ var templ_7745c5c3_Var57 string
1261+ templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.ResolveAttributeValue(group.Mode)
12491262 if templ_7745c5c3_Err != nil {
1250- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 190, Col: 55}
1263+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 191, Col: 55}
12511264 }
1252- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
1265+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var57)
12531266 if templ_7745c5c3_Err != nil {
12541267 return templ_7745c5c3_Err
12551268 }
1256- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "\"> <input type=\"hidden\" name=\"action\" value=\"")
1269+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"> <input type=\"hidden\" name=\"action\" value=\"")
12571270 if templ_7745c5c3_Err != nil {
12581271 return templ_7745c5c3_Err
12591272 }
1260- var templ_7745c5c3_Var57 string
1261- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(binding.Action)
1273+ var templ_7745c5c3_Var58 string
1274+ templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.ResolveAttributeValue(binding.Action)
12621275 if templ_7745c5c3_Err != nil {
1263- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 191, Col: 61}
1276+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 192, Col: 61}
12641277 }
1265- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
1278+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var58)
12661279 if templ_7745c5c3_Err != nil {
12671280 return templ_7745c5c3_Err
12681281 }
1269- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"> <label><span>Keys</span><input name=\"keys\" type=\"text\" value=\"")
1282+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\"> <label><span>Keys</span><input name=\"keys\" type=\"text\" value=\"")
12701283 if templ_7745c5c3_Err != nil {
12711284 return templ_7745c5c3_Err
12721285 }
1273- var templ_7745c5c3_Var58 string
1274- templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingKeysValue(binding.Keys))
1286+ var templ_7745c5c3_Var59 string
1287+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.ResolveAttributeValue(keybindingKeysValue(binding.Keys))
12751288 if templ_7745c5c3_Err != nil {
1276- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 192, Col: 100}
1289+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 193, Col: 100}
12771290 }
1278- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
1291+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59)
12791292 if templ_7745c5c3_Err != nil {
12801293 return templ_7745c5c3_Err
12811294 }
1282- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\" placeholder=\"ctrl+h, ctrl+shift+h\" required></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
1295+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\" placeholder=\"ctrl+h, ctrl+shift+h\" required></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
12831296 if templ_7745c5c3_Err != nil {
12841297 return templ_7745c5c3_Err
12851298 }
@@ -1287,33 +1300,33 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
12871300 if templ_7745c5c3_Err != nil {
12881301 return templ_7745c5c3_Err
12891302 }
1290- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.keybinding.reset\" data-mode=\"")
1303+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.keybinding.reset\" data-mode=\"")
12911304 if templ_7745c5c3_Err != nil {
12921305 return templ_7745c5c3_Err
12931306 }
1294- var templ_7745c5c3_Var59 string
1295- templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(group.Mode)
1307+ var templ_7745c5c3_Var60 string
1308+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.ResolveAttributeValue(group.Mode)
12961309 if templ_7745c5c3_Err != nil {
1297- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 194, Col: 127}
1310+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 195, Col: 127}
12981311 }
1299- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
1312+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var60)
13001313 if templ_7745c5c3_Err != nil {
13011314 return templ_7745c5c3_Err
13021315 }
1303- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "\" data-action=\"")
1316+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "\" data-action=\"")
13041317 if templ_7745c5c3_Err != nil {
13051318 return templ_7745c5c3_Err
13061319 }
1307- var templ_7745c5c3_Var60 string
1308- templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(binding.Action)
1320+ var templ_7745c5c3_Var61 string
1321+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.ResolveAttributeValue(binding.Action)
13091322 if templ_7745c5c3_Err != nil {
1310- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 194, Col: 158}
1323+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 195, Col: 158}
13111324 }
1312- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))
1325+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var61)
13131326 if templ_7745c5c3_Err != nil {
13141327 return templ_7745c5c3_Err
13151328 }
1316- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "\">")
1329+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "\">")
13171330 if templ_7745c5c3_Err != nil {
13181331 return templ_7745c5c3_Err
13191332 }
@@ -1321,7 +1334,7 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
13211334 if templ_7745c5c3_Err != nil {
13221335 return templ_7745c5c3_Err
13231336 }
1324- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</button></form></div></li>")
1337+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "</button></form></div></li>")
13251338 if templ_7745c5c3_Err != nil {
13261339 return templ_7745c5c3_Err
13271340 }
@@ -189,11 +189,11 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
189 return templ_7745c5c3_Err189 return templ_7745c5c3_Err
190 }190 }
191 var templ_7745c5c3_Var8 string191 var templ_7745c5c3_Var8 string
192- templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(config.Appearance.SansFont)192+ templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.SansFont)
193 if templ_7745c5c3_Err != nil {193 if templ_7745c5c3_Err != nil {
194 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 31, Col: 101}194 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 31, Col: 101}
195 }195 }
196- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))196+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8)
197 if templ_7745c5c3_Err != nil {197 if templ_7745c5c3_Err != nil {
198 return templ_7745c5c3_Err198 return templ_7745c5c3_Err
199 }199 }
@@ -202,11 +202,11 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
202 return templ_7745c5c3_Err202 return templ_7745c5c3_Err
203 }203 }
204 var templ_7745c5c3_Var9 string204 var templ_7745c5c3_Var9 string
205- templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(config.Appearance.SerifFont)205+ templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.SerifFont)
206 if templ_7745c5c3_Err != nil {206 if templ_7745c5c3_Err != nil {
207 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 32, Col: 104}207 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 32, Col: 104}
208 }208 }
209- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))209+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9)
210 if templ_7745c5c3_Err != nil {210 if templ_7745c5c3_Err != nil {
211 return templ_7745c5c3_Err211 return templ_7745c5c3_Err
212 }212 }
@@ -215,71 +215,84 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
215 return templ_7745c5c3_Err215 return templ_7745c5c3_Err
216 }216 }
217 var templ_7745c5c3_Var10 string217 var templ_7745c5c3_Var10 string
218- templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(config.Appearance.MonospaceFont)218+ templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.MonospaceFont)
219 if templ_7745c5c3_Err != nil {219 if templ_7745c5c3_Err != nil {
220 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 33, Col: 116}220 return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 33, Col: 116}
221 }221 }
222- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))222+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var10)
223 if templ_7745c5c3_Err != nil {223 if templ_7745c5c3_Err != nil {
224 return templ_7745c5c3_Err224 return templ_7745c5c3_Err
225 }225 }
226- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\" required></label> <label><span>Default font size</span><input name=\"default_font_size\" type=\"number\" min=\"1\" max=\"72\" value=\"")226+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\" required></label> <label><span>GTK UI font</span><input name=\"gtk_font\" type=\"text\" value=\"")
227 if templ_7745c5c3_Err != nil {227 if templ_7745c5c3_Err != nil {
228 return templ_7745c5c3_Err228 return templ_7745c5c3_Err
229 }229 }
230 var templ_7745c5c3_Var11 string230 var templ_7745c5c3_Var11 string
231- templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Appearance.DefaultFontSize))231+ templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.Appearance.GtkFont)
232 if templ_7745c5c3_Err != nil {232 if templ_7745c5c3_Err != nil {
233- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 34, Col: 160}233+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 34, Col: 101}
234 }234 }
235- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))235+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11)
236 if templ_7745c5c3_Err != nil {236 if templ_7745c5c3_Err != nil {
237 return templ_7745c5c3_Err237 return templ_7745c5c3_Err
238 }238 }
239- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" required></label> <label><span>UI scale</span><input name=\"default_ui_scale\" type=\"number\" min=\"0.5\" max=\"3\" step=\"0.05\" value=\"")239+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" required></label> <label><span>Default font size</span><input name=\"default_font_size\" type=\"number\" min=\"1\" max=\"72\" value=\"")
240 if templ_7745c5c3_Err != nil {240 if templ_7745c5c3_Err != nil {
241 return templ_7745c5c3_Err241 return templ_7745c5c3_Err
242 }242 }
243 var templ_7745c5c3_Var12 string243 var templ_7745c5c3_Var12 string
244- templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigFloat(config.DefaultUIScale))244+ templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Appearance.DefaultFontSize))
245 if templ_7745c5c3_Err != nil {245 if templ_7745c5c3_Err != nil {
246- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 35, Col: 153}246+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 35, Col: 160}
247 }247 }
248- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))248+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var12)
249 if templ_7745c5c3_Err != nil {249 if templ_7745c5c3_Err != nil {
250 return templ_7745c5c3_Err250 return templ_7745c5c3_Err
251 }251 }
252- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\" required></label> <label><span>Color scheme</span><select name=\"color_scheme\"><option value=\"default\"")252+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\" required></label> <label><span>UI scale</span><input name=\"default_ui_scale\" type=\"number\" min=\"0.5\" max=\"3\" step=\"0.05\" value=\"")
253+ if templ_7745c5c3_Err != nil {
254+ return templ_7745c5c3_Err
255+ }
256+ var templ_7745c5c3_Var13 string
257+ templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigFloat(config.DefaultUIScale))
258+ if templ_7745c5c3_Err != nil {
259+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 36, Col: 153}
260+ }
261+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13)
262+ if templ_7745c5c3_Err != nil {
263+ return templ_7745c5c3_Err
264+ }
265+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "\" required></label> <label><span>Color scheme</span><select name=\"color_scheme\"><option value=\"default\"")
253 if templ_7745c5c3_Err != nil {266 if templ_7745c5c3_Err != nil {
254 return templ_7745c5c3_Err267 return templ_7745c5c3_Err
255 }268 }
256 if colorSchemeSelected(config.Appearance.ColorScheme, "default") {269 if colorSchemeSelected(config.Appearance.ColorScheme, "default") {
257- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, " selected")270+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, " selected")
258 if templ_7745c5c3_Err != nil {271 if templ_7745c5c3_Err != nil {
259 return templ_7745c5c3_Err272 return templ_7745c5c3_Err
260 }273 }
261 }274 }
262- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, ">System default</option> <option value=\"prefer-light\"")275+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, ">System default</option> <option value=\"prefer-light\"")
263 if templ_7745c5c3_Err != nil {276 if templ_7745c5c3_Err != nil {
264 return templ_7745c5c3_Err277 return templ_7745c5c3_Err
265 }278 }
266 if colorSchemeSelected(config.Appearance.ColorScheme, "prefer-light") {279 if colorSchemeSelected(config.Appearance.ColorScheme, "prefer-light") {
267- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, " selected")280+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, " selected")
268 if templ_7745c5c3_Err != nil {281 if templ_7745c5c3_Err != nil {
269 return templ_7745c5c3_Err282 return templ_7745c5c3_Err
270 }283 }
271 }284 }
272- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, ">Prefer light</option> <option value=\"prefer-dark\"")285+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, ">Prefer light</option> <option value=\"prefer-dark\"")
273 if templ_7745c5c3_Err != nil {286 if templ_7745c5c3_Err != nil {
274 return templ_7745c5c3_Err287 return templ_7745c5c3_Err
275 }288 }
276 if colorSchemeSelected(config.Appearance.ColorScheme, "prefer-dark") {289 if colorSchemeSelected(config.Appearance.ColorScheme, "prefer-dark") {
277- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, " selected")290+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, " selected")
278 if templ_7745c5c3_Err != nil {291 if templ_7745c5c3_Err != nil {
279 return templ_7745c5c3_Err292 return templ_7745c5c3_Err
280 }293 }
281 }294 }
282- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, ">Prefer dark</option></select></label>")295+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, ">Prefer dark</option></select></label>")
283 if templ_7745c5c3_Err != nil {296 if templ_7745c5c3_Err != nil {
284 return templ_7745c5c3_Err297 return templ_7745c5c3_Err
285 }298 }
@@ -291,7 +304,7 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
291 if templ_7745c5c3_Err != nil {304 if templ_7745c5c3_Err != nil {
292 return templ_7745c5c3_Err305 return templ_7745c5c3_Err
293 }306 }
294- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<div class=\"sv-button-row sv-form-actions\"><button class=\"sv-button\" type=\"submit\">")307+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<div class=\"sv-button-row sv-form-actions\"><button class=\"sv-button\" type=\"submit\">")
295 if templ_7745c5c3_Err != nil {308 if templ_7745c5c3_Err != nil {
296 return templ_7745c5c3_Err309 return templ_7745c5c3_Err
297 }310 }
@@ -299,7 +312,7 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
299 if templ_7745c5c3_Err != nil {312 if templ_7745c5c3_Err != nil {
300 return templ_7745c5c3_Err313 return templ_7745c5c3_Err
301 }314 }
302- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.appearance.reset\" data-sv-confirm=\"Reset appearance settings to defaults?\">")315+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.appearance.reset\" data-sv-confirm=\"Reset appearance settings to defaults?\">")
303 if templ_7745c5c3_Err != nil {316 if templ_7745c5c3_Err != nil {
304 return templ_7745c5c3_Err317 return templ_7745c5c3_Err
305 }318 }
@@ -307,7 +320,7 @@ func AppearanceForm(config dto.SystemviewConfigPayload) templ.Component {
307 if templ_7745c5c3_Err != nil {320 if templ_7745c5c3_Err != nil {
308 return templ_7745c5c3_Err321 return templ_7745c5c3_Err
309 }322 }
310- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</button></div></form>")323+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</button></div></form>")
311 if templ_7745c5c3_Err != nil {324 if templ_7745c5c3_Err != nil {
312 return templ_7745c5c3_Err325 return templ_7745c5c3_Err
313 }326 }
@@ -331,207 +344,207 @@ func PaletteFields(title string, prefix string, palette dto.ColorPalette) templ.
331 }()344 }()
332 }345 }
333 ctx = templ.InitializeContext(ctx)346 ctx = templ.InitializeContext(ctx)
334- templ_7745c5c3_Var13 := templ.GetChildren(ctx)347+ templ_7745c5c3_Var14 := templ.GetChildren(ctx)
335- if templ_7745c5c3_Var13 == nil {348+ if templ_7745c5c3_Var14 == nil {
336- templ_7745c5c3_Var13 = templ.NopComponent349+ templ_7745c5c3_Var14 = templ.NopComponent
337 }350 }
338 ctx = templ.ClearChildren(ctx)351 ctx = templ.ClearChildren(ctx)
339- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<fieldset class=\"sv-fieldset\"><legend>")352+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<fieldset class=\"sv-fieldset\"><legend>")
340- if templ_7745c5c3_Err != nil {
341- return templ_7745c5c3_Err
342- }
343- var templ_7745c5c3_Var14 string
344- templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(title)
345- if templ_7745c5c3_Err != nil {
346- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 52, Col: 17}
347- }
348- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
349- if templ_7745c5c3_Err != nil {
350- return templ_7745c5c3_Err
351- }
352- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</legend> <label><span>Background</span><input name=\"")
353 if templ_7745c5c3_Err != nil {353 if templ_7745c5c3_Err != nil {
354 return templ_7745c5c3_Err354 return templ_7745c5c3_Err
355 }355 }
356 var templ_7745c5c3_Var15 string356 var templ_7745c5c3_Var15 string
357- templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_background")357+ templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(title)
358 if templ_7745c5c3_Err != nil {358 if templ_7745c5c3_Err != nil {
359- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 53, Col: 68}359+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 53, Col: 17}
360 }360 }
361 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))361 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
362 if templ_7745c5c3_Err != nil {362 if templ_7745c5c3_Err != nil {
363 return templ_7745c5c3_Err363 return templ_7745c5c3_Err
364 }364 }
365- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "\" type=\"text\" value=\"")365+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</legend> <label><span>Background</span><input name=\"")
366 if templ_7745c5c3_Err != nil {366 if templ_7745c5c3_Err != nil {
367 return templ_7745c5c3_Err367 return templ_7745c5c3_Err
368 }368 }
369 var templ_7745c5c3_Var16 string369 var templ_7745c5c3_Var16 string
370- templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Background)370+ templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_background")
371 if templ_7745c5c3_Err != nil {371 if templ_7745c5c3_Err != nil {
372- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 53, Col: 109}372+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 68}
373 }373 }
374- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))374+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)
375 if templ_7745c5c3_Err != nil {375 if templ_7745c5c3_Err != nil {
376 return templ_7745c5c3_Err376 return templ_7745c5c3_Err
377 }377 }
378- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\" required></label> <label><span>Surface</span><input name=\"")378+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\" type=\"text\" value=\"")
379 if templ_7745c5c3_Err != nil {379 if templ_7745c5c3_Err != nil {
380 return templ_7745c5c3_Err380 return templ_7745c5c3_Err
381 }381 }
382 var templ_7745c5c3_Var17 string382 var templ_7745c5c3_Var17 string
383- templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_surface")383+ templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Background)
384 if templ_7745c5c3_Err != nil {384 if templ_7745c5c3_Err != nil {
385- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 62}385+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 109}
386 }386 }
387- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))387+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var17)
388 if templ_7745c5c3_Err != nil {388 if templ_7745c5c3_Err != nil {
389 return templ_7745c5c3_Err389 return templ_7745c5c3_Err
390 }390 }
391- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" type=\"text\" value=\"")391+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" required></label> <label><span>Surface</span><input name=\"")
392 if templ_7745c5c3_Err != nil {392 if templ_7745c5c3_Err != nil {
393 return templ_7745c5c3_Err393 return templ_7745c5c3_Err
394 }394 }
395 var templ_7745c5c3_Var18 string395 var templ_7745c5c3_Var18 string
396- templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Surface)396+ templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_surface")
397 if templ_7745c5c3_Err != nil {397 if templ_7745c5c3_Err != nil {
398- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 54, Col: 100}398+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 62}
399 }399 }
400- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))400+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var18)
401 if templ_7745c5c3_Err != nil {401 if templ_7745c5c3_Err != nil {
402 return templ_7745c5c3_Err402 return templ_7745c5c3_Err
403 }403 }
404- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\" required></label> <label><span>Surface variant</span><input name=\"")404+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\" type=\"text\" value=\"")
405 if templ_7745c5c3_Err != nil {405 if templ_7745c5c3_Err != nil {
406 return templ_7745c5c3_Err406 return templ_7745c5c3_Err
407 }407 }
408 var templ_7745c5c3_Var19 string408 var templ_7745c5c3_Var19 string
409- templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_surface_variant")409+ templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Surface)
410 if templ_7745c5c3_Err != nil {410 if templ_7745c5c3_Err != nil {
411- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 78}411+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 100}
412 }412 }
413- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))413+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var19)
414 if templ_7745c5c3_Err != nil {414 if templ_7745c5c3_Err != nil {
415 return templ_7745c5c3_Err415 return templ_7745c5c3_Err
416 }416 }
417- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\" type=\"text\" value=\"")417+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\" required></label> <label><span>Surface variant</span><input name=\"")
418 if templ_7745c5c3_Err != nil {418 if templ_7745c5c3_Err != nil {
419 return templ_7745c5c3_Err419 return templ_7745c5c3_Err
420 }420 }
421 var templ_7745c5c3_Var20 string421 var templ_7745c5c3_Var20 string
422- templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(palette.SurfaceVariant)422+ templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_surface_variant")
423 if templ_7745c5c3_Err != nil {423 if templ_7745c5c3_Err != nil {
424- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 55, Col: 123}424+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 78}
425 }425 }
426- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))426+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var20)
427 if templ_7745c5c3_Err != nil {427 if templ_7745c5c3_Err != nil {
428 return templ_7745c5c3_Err428 return templ_7745c5c3_Err
429 }429 }
430- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "\" required></label> <label><span>Text</span><input name=\"")430+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "\" type=\"text\" value=\"")
431 if templ_7745c5c3_Err != nil {431 if templ_7745c5c3_Err != nil {
432 return templ_7745c5c3_Err432 return templ_7745c5c3_Err
433 }433 }
434 var templ_7745c5c3_Var21 string434 var templ_7745c5c3_Var21 string
435- templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_text")435+ templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.SurfaceVariant)
436 if templ_7745c5c3_Err != nil {436 if templ_7745c5c3_Err != nil {
437- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 56}437+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 123}
438 }438 }
439- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))439+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var21)
440 if templ_7745c5c3_Err != nil {440 if templ_7745c5c3_Err != nil {
441 return templ_7745c5c3_Err441 return templ_7745c5c3_Err
442 }442 }
443- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\" type=\"text\" value=\"")443+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\" required></label> <label><span>Text</span><input name=\"")
444 if templ_7745c5c3_Err != nil {444 if templ_7745c5c3_Err != nil {
445 return templ_7745c5c3_Err445 return templ_7745c5c3_Err
446 }446 }
447 var templ_7745c5c3_Var22 string447 var templ_7745c5c3_Var22 string
448- templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Text)448+ templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_text")
449 if templ_7745c5c3_Err != nil {449 if templ_7745c5c3_Err != nil {
450- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 56, Col: 91}450+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 56}
451 }451 }
452- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))452+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22)
453 if templ_7745c5c3_Err != nil {453 if templ_7745c5c3_Err != nil {
454 return templ_7745c5c3_Err454 return templ_7745c5c3_Err
455 }455 }
456- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "\" required></label> <label><span>Muted</span><input name=\"")456+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "\" type=\"text\" value=\"")
457 if templ_7745c5c3_Err != nil {457 if templ_7745c5c3_Err != nil {
458 return templ_7745c5c3_Err458 return templ_7745c5c3_Err
459 }459 }
460 var templ_7745c5c3_Var23 string460 var templ_7745c5c3_Var23 string
461- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_muted")461+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Text)
462 if templ_7745c5c3_Err != nil {462 if templ_7745c5c3_Err != nil {
463- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 58}463+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 91}
464 }464 }
465- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))465+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var23)
466 if templ_7745c5c3_Err != nil {466 if templ_7745c5c3_Err != nil {
467 return templ_7745c5c3_Err467 return templ_7745c5c3_Err
468 }468 }
469- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\" type=\"text\" value=\"")469+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\" required></label> <label><span>Muted</span><input name=\"")
470 if templ_7745c5c3_Err != nil {470 if templ_7745c5c3_Err != nil {
471 return templ_7745c5c3_Err471 return templ_7745c5c3_Err
472 }472 }
473 var templ_7745c5c3_Var24 string473 var templ_7745c5c3_Var24 string
474- templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Muted)474+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_muted")
475 if templ_7745c5c3_Err != nil {475 if templ_7745c5c3_Err != nil {
476- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 57, Col: 94}476+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 58}
477 }477 }
478- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))478+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var24)
479 if templ_7745c5c3_Err != nil {479 if templ_7745c5c3_Err != nil {
480 return templ_7745c5c3_Err480 return templ_7745c5c3_Err
481 }481 }
482- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\" required></label> <label><span>Accent</span><input name=\"")482+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\" type=\"text\" value=\"")
483 if templ_7745c5c3_Err != nil {483 if templ_7745c5c3_Err != nil {
484 return templ_7745c5c3_Err484 return templ_7745c5c3_Err
485 }485 }
486 var templ_7745c5c3_Var25 string486 var templ_7745c5c3_Var25 string
487- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_accent")487+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Muted)
488 if templ_7745c5c3_Err != nil {488 if templ_7745c5c3_Err != nil {
489- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 60}489+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 94}
490 }490 }
491- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))491+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var25)
492 if templ_7745c5c3_Err != nil {492 if templ_7745c5c3_Err != nil {
493 return templ_7745c5c3_Err493 return templ_7745c5c3_Err
494 }494 }
495- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "\" type=\"text\" value=\"")495+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "\" required></label> <label><span>Accent</span><input name=\"")
496 if templ_7745c5c3_Err != nil {496 if templ_7745c5c3_Err != nil {
497 return templ_7745c5c3_Err497 return templ_7745c5c3_Err
498 }498 }
499 var templ_7745c5c3_Var26 string499 var templ_7745c5c3_Var26 string
500- templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Accent)500+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_accent")
501 if templ_7745c5c3_Err != nil {501 if templ_7745c5c3_Err != nil {
502- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 58, Col: 97}502+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 60}
503 }503 }
504- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))504+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var26)
505 if templ_7745c5c3_Err != nil {505 if templ_7745c5c3_Err != nil {
506 return templ_7745c5c3_Err506 return templ_7745c5c3_Err
507 }507 }
508- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "\" required></label> <label><span>Border</span><input name=\"")508+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "\" type=\"text\" value=\"")
509 if templ_7745c5c3_Err != nil {509 if templ_7745c5c3_Err != nil {
510 return templ_7745c5c3_Err510 return templ_7745c5c3_Err
511 }511 }
512 var templ_7745c5c3_Var27 string512 var templ_7745c5c3_Var27 string
513- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(prefix + "_border")513+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Accent)
514 if templ_7745c5c3_Err != nil {514 if templ_7745c5c3_Err != nil {
515- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 60}515+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 97}
516 }516 }
517- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))517+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var27)
518 if templ_7745c5c3_Err != nil {518 if templ_7745c5c3_Err != nil {
519 return templ_7745c5c3_Err519 return templ_7745c5c3_Err
520 }520 }
521- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\" type=\"text\" value=\"")521+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\" required></label> <label><span>Border</span><input name=\"")
522 if templ_7745c5c3_Err != nil {522 if templ_7745c5c3_Err != nil {
523 return templ_7745c5c3_Err523 return templ_7745c5c3_Err
524 }524 }
525 var templ_7745c5c3_Var28 string525 var templ_7745c5c3_Var28 string
526- templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(palette.Border)526+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.ResolveAttributeValue(prefix + "_border")
527 if templ_7745c5c3_Err != nil {527 if templ_7745c5c3_Err != nil {
528- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 59, Col: 97}528+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 60, Col: 60}
529+ }
530+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var28)
531+ if templ_7745c5c3_Err != nil {
532+ return templ_7745c5c3_Err
533+ }
534+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\" type=\"text\" value=\"")
535+ if templ_7745c5c3_Err != nil {
536+ return templ_7745c5c3_Err
537+ }
538+ var templ_7745c5c3_Var29 string
539+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.ResolveAttributeValue(palette.Border)
540+ if templ_7745c5c3_Err != nil {
541+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 60, Col: 97}
529 }542 }
530- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))543+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var29)
531 if templ_7745c5c3_Err != nil {544 if templ_7745c5c3_Err != nil {
532 return templ_7745c5c3_Err545 return templ_7745c5c3_Err
533 }546 }
534- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\" required></label></fieldset>")547+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "\" required></label></fieldset>")
535 if templ_7745c5c3_Err != nil {548 if templ_7745c5c3_Err != nil {
536 return templ_7745c5c3_Err549 return templ_7745c5c3_Err
537 }550 }
@@ -555,25 +568,25 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
555 }()568 }()
556 }569 }
557 ctx = templ.InitializeContext(ctx)570 ctx = templ.InitializeContext(ctx)
558- templ_7745c5c3_Var29 := templ.GetChildren(ctx)571+ templ_7745c5c3_Var30 := templ.GetChildren(ctx)
559- if templ_7745c5c3_Var29 == nil {572+ if templ_7745c5c3_Var30 == nil {
560- templ_7745c5c3_Var29 = templ.NopComponent573+ templ_7745c5c3_Var30 = templ.NopComponent
561 }574 }
562 ctx = templ.ClearChildren(ctx)575 ctx = templ.ClearChildren(ctx)
563- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<form class=\"sv-card-form\" data-sv-action=\"config.search.save\"><label><span>Default search engine</span><input name=\"default_search_engine\" type=\"text\" value=\"")576+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<form class=\"sv-card-form\" data-sv-action=\"config.search.save\"><label><span>Default search engine</span><input name=\"default_search_engine\" type=\"text\" value=\"")
564 if templ_7745c5c3_Err != nil {577 if templ_7745c5c3_Err != nil {
565 return templ_7745c5c3_Err578 return templ_7745c5c3_Err
566 }579 }
567- var templ_7745c5c3_Var30 string580+ var templ_7745c5c3_Var31 string
568- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(config.DefaultSearchEngine)581+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.ResolveAttributeValue(config.DefaultSearchEngine)
569 if templ_7745c5c3_Err != nil {582 if templ_7745c5c3_Err != nil {
570- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 65, Col: 125}583+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 66, Col: 125}
571 }584 }
572- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))585+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var31)
573 if templ_7745c5c3_Err != nil {586 if templ_7745c5c3_Err != nil {
574 return templ_7745c5c3_Err587 return templ_7745c5c3_Err
575 }588 }
576- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "\" placeholder=\"https://duckduckgo.com/?q=%s\" required></label> <button class=\"sv-button\" type=\"submit\">")589+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "\" placeholder=\"https://duckduckgo.com/?q=%s\" required></label> <button class=\"sv-button\" type=\"submit\">")
577 if templ_7745c5c3_Err != nil {590 if templ_7745c5c3_Err != nil {
578 return templ_7745c5c3_Err591 return templ_7745c5c3_Err
579 }592 }
@@ -581,7 +594,7 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
581 if templ_7745c5c3_Err != nil {594 if templ_7745c5c3_Err != nil {
582 return templ_7745c5c3_Err595 return templ_7745c5c3_Err
583 }596 }
584- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</button></form><div class=\"sv-group\"><div class=\"sv-group-header\"><h4>Search shortcuts</h4></div><p class=\"sv-meta\">Shortcut URLs must include the %s placeholder for the search query.</p><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.create\"><label><span>Key</span><input name=\"key\" type=\"text\" placeholder=\"ddg\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" placeholder=\"https://duckduckgo.com/?q=%s\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" placeholder=\"DuckDuckGo\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")597+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</button></form><div class=\"sv-group\"><div class=\"sv-group-header\"><h4>Search shortcuts</h4></div><p class=\"sv-meta\">Shortcut URLs must include the %s placeholder for the search query.</p><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.create\"><label><span>Key</span><input name=\"key\" type=\"text\" placeholder=\"ddg\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" placeholder=\"https://duckduckgo.com/?q=%s\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" placeholder=\"DuckDuckGo\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
585 if templ_7745c5c3_Err != nil {598 if templ_7745c5c3_Err != nil {
586 return templ_7745c5c3_Err599 return templ_7745c5c3_Err
587 }600 }
@@ -589,7 +602,7 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
589 if templ_7745c5c3_Err != nil {602 if templ_7745c5c3_Err != nil {
590 return templ_7745c5c3_Err603 return templ_7745c5c3_Err
591 }604 }
592- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</button></form>")605+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</button></form>")
593 if templ_7745c5c3_Err != nil {606 if templ_7745c5c3_Err != nil {
594 return templ_7745c5c3_Err607 return templ_7745c5c3_Err
595 }608 }
@@ -600,7 +613,7 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
600 return templ_7745c5c3_Err613 return templ_7745c5c3_Err
601 }614 }
602 } else {615 } else {
603- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<ul class=\"sv-list\">")616+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<ul class=\"sv-list\">")
604 if templ_7745c5c3_Err != nil {617 if templ_7745c5c3_Err != nil {
605 return templ_7745c5c3_Err618 return templ_7745c5c3_Err
606 }619 }
@@ -610,12 +623,12 @@ func SearchSettings(config dto.SystemviewConfigPayload) templ.Component {
610 return templ_7745c5c3_Err623 return templ_7745c5c3_Err
611 }624 }
612 }625 }
613- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</ul>")626+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</ul>")
614 if templ_7745c5c3_Err != nil {627 if templ_7745c5c3_Err != nil {
615 return templ_7745c5c3_Err628 return templ_7745c5c3_Err
616 }629 }
617 }630 }
618- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</div>")631+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</div>")
619 if templ_7745c5c3_Err != nil {632 if templ_7745c5c3_Err != nil {
620 return templ_7745c5c3_Err633 return templ_7745c5c3_Err
621 }634 }
@@ -639,64 +652,64 @@ func SearchShortcutItem(shortcut searchShortcutRow) templ.Component {
639 }()652 }()
640 }653 }
641 ctx = templ.InitializeContext(ctx)654 ctx = templ.InitializeContext(ctx)
642- templ_7745c5c3_Var31 := templ.GetChildren(ctx)655+ templ_7745c5c3_Var32 := templ.GetChildren(ctx)
643- if templ_7745c5c3_Var31 == nil {656+ if templ_7745c5c3_Var32 == nil {
644- templ_7745c5c3_Var31 = templ.NopComponent657+ templ_7745c5c3_Var32 = templ.NopComponent
645 }658 }
646 ctx = templ.ClearChildren(ctx)659 ctx = templ.ClearChildren(ctx)
647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<li class=\"sv-list-row\"><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.update\"><input type=\"hidden\" name=\"key\" value=\"")660+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<li class=\"sv-list-row\"><form class=\"sv-inline-form\" data-sv-action=\"config.searchShortcut.update\"><input type=\"hidden\" name=\"key\" value=\"")
648 if templ_7745c5c3_Err != nil {661 if templ_7745c5c3_Err != nil {
649 return templ_7745c5c3_Err662 return templ_7745c5c3_Err
650 }663 }
651- var templ_7745c5c3_Var32 string664+ var templ_7745c5c3_Var33 string
652- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Key)665+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Key)
653 if templ_7745c5c3_Err != nil {666 if templ_7745c5c3_Err != nil {
654- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 93, Col: 55}667+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 94, Col: 55}
655 }668 }
656- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))669+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
657 if templ_7745c5c3_Err != nil {670 if templ_7745c5c3_Err != nil {
658 return templ_7745c5c3_Err671 return templ_7745c5c3_Err
659 }672 }
660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "\"> <label><span>Key</span><input name=\"new_key\" type=\"text\" value=\"")673+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\"> <label><span>Key</span><input name=\"new_key\" type=\"text\" value=\"")
661 if templ_7745c5c3_Err != nil {674 if templ_7745c5c3_Err != nil {
662 return templ_7745c5c3_Err675 return templ_7745c5c3_Err
663 }676 }
664- var templ_7745c5c3_Var33 string677+ var templ_7745c5c3_Var34 string
665- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Key)678+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Key)
666 if templ_7745c5c3_Err != nil {679 if templ_7745c5c3_Err != nil {
667- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 94, Col: 80}680+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 95, Col: 80}
668 }681 }
669- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))682+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34)
670 if templ_7745c5c3_Err != nil {683 if templ_7745c5c3_Err != nil {
671 return templ_7745c5c3_Err684 return templ_7745c5c3_Err
672 }685 }
673- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" value=\"")686+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\" required></label> <label><span>URL</span><input name=\"url\" type=\"text\" value=\"")
674 if templ_7745c5c3_Err != nil {687 if templ_7745c5c3_Err != nil {
675 return templ_7745c5c3_Err688 return templ_7745c5c3_Err
676 }689 }
677- var templ_7745c5c3_Var34 string690+ var templ_7745c5c3_Var35 string
678- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.URL)691+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.URL)
679 if templ_7745c5c3_Err != nil {692 if templ_7745c5c3_Err != nil {
680- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 95, Col: 76}693+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 96, Col: 76}
681 }694 }
682- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))695+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)
683 if templ_7745c5c3_Err != nil {696 if templ_7745c5c3_Err != nil {
684 return templ_7745c5c3_Err697 return templ_7745c5c3_Err
685 }698 }
686- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" value=\"")699+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "\" pattern=\".*%s.*\" required></label> <label><span>Description</span><input name=\"description\" type=\"text\" value=\"")
687 if templ_7745c5c3_Err != nil {700 if templ_7745c5c3_Err != nil {
688 return templ_7745c5c3_Err701 return templ_7745c5c3_Err
689 }702 }
690- var templ_7745c5c3_Var35 string703+ var templ_7745c5c3_Var36 string
691- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Description)704+ templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Description)
692 if templ_7745c5c3_Err != nil {705 if templ_7745c5c3_Err != nil {
693- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 96, Col: 100}706+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 97, Col: 100}
694 }707 }
695- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))708+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36)
696 if templ_7745c5c3_Err != nil {709 if templ_7745c5c3_Err != nil {
697 return templ_7745c5c3_Err710 return templ_7745c5c3_Err
698 }711 }
699- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")712+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\"></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
700 if templ_7745c5c3_Err != nil {713 if templ_7745c5c3_Err != nil {
701 return templ_7745c5c3_Err714 return templ_7745c5c3_Err
702 }715 }
@@ -704,33 +717,33 @@ func SearchShortcutItem(shortcut searchShortcutRow) templ.Component {
704 if templ_7745c5c3_Err != nil {717 if templ_7745c5c3_Err != nil {
705 return templ_7745c5c3_Err718 return templ_7745c5c3_Err
706 }719 }
707- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</button> <button class=\"sv-button sv-button-secondary sv-button-danger sv-button-icon-only\" type=\"button\" data-sv-action=\"config.searchShortcut.delete\" data-key=\"")720+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</button> <button class=\"sv-button sv-button-secondary sv-button-danger sv-button-icon-only\" type=\"button\" data-sv-action=\"config.searchShortcut.delete\" data-key=\"")
708 if templ_7745c5c3_Err != nil {721 if templ_7745c5c3_Err != nil {
709 return templ_7745c5c3_Err722 return templ_7745c5c3_Err
710 }723 }
711- var templ_7745c5c3_Var36 string724+ var templ_7745c5c3_Var37 string
712- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(shortcut.Key)725+ templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue(shortcut.Key)
713 if templ_7745c5c3_Err != nil {726 if templ_7745c5c3_Err != nil {
714- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 98, Col: 169}727+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 99, Col: 169}
715 }728 }
716- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))729+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37)
717 if templ_7745c5c3_Err != nil {730 if templ_7745c5c3_Err != nil {
718 return templ_7745c5c3_Err731 return templ_7745c5c3_Err
719 }732 }
720- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\" data-sv-confirm=\"Delete this search shortcut?\" aria-label=\"")733+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\" data-sv-confirm=\"Delete this search shortcut?\" aria-label=\"")
721 if templ_7745c5c3_Err != nil {734 if templ_7745c5c3_Err != nil {
722 return templ_7745c5c3_Err735 return templ_7745c5c3_Err
723 }736 }
724- var templ_7745c5c3_Var37 string737+ var templ_7745c5c3_Var38 string
725- templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs("Delete search shortcut " + shortcut.Key)738+ templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.ResolveAttributeValue("Delete search shortcut " + shortcut.Key)
726 if templ_7745c5c3_Err != nil {739 if templ_7745c5c3_Err != nil {
727- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 98, Col: 272}740+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 99, Col: 272}
728 }741 }
729- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))742+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var38)
730 if templ_7745c5c3_Err != nil {743 if templ_7745c5c3_Err != nil {
731 return templ_7745c5c3_Err744 return templ_7745c5c3_Err
732 }745 }
733- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\">")746+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\">")
734 if templ_7745c5c3_Err != nil {747 if templ_7745c5c3_Err != nil {
735 return templ_7745c5c3_Err748 return templ_7745c5c3_Err
736 }749 }
@@ -738,7 +751,7 @@ func SearchShortcutItem(shortcut searchShortcutRow) templ.Component {
738 if templ_7745c5c3_Err != nil {751 if templ_7745c5c3_Err != nil {
739 return templ_7745c5c3_Err752 return templ_7745c5c3_Err
740 }753 }
741- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</button></form></li>")754+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</button></form></li>")
742 if templ_7745c5c3_Err != nil {755 if templ_7745c5c3_Err != nil {
743 return templ_7745c5c3_Err756 return templ_7745c5c3_Err
744 }757 }
@@ -762,178 +775,178 @@ func PerformanceSettings(config dto.SystemviewConfigPayload) templ.Component {
762 }()775 }()
763 }776 }
764 ctx = templ.InitializeContext(ctx)777 ctx = templ.InitializeContext(ctx)
765- templ_7745c5c3_Var38 := templ.GetChildren(ctx)778+ templ_7745c5c3_Var39 := templ.GetChildren(ctx)
766- if templ_7745c5c3_Var38 == nil {779+ if templ_7745c5c3_Var39 == nil {
767- templ_7745c5c3_Var38 = templ.NopComponent780+ templ_7745c5c3_Var39 = templ.NopComponent
768 }781 }
769 ctx = templ.ClearChildren(ctx)782 ctx = templ.ClearChildren(ctx)
770 customProfile := performanceProfileSelected(config.Performance.Profile, "custom")783 customProfile := performanceProfileSelected(config.Performance.Profile, "custom")
771- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<form class=\"sv-card-form sv-config-form\" data-sv-action=\"config.performance.save\" data-sv-performance-form><label><span>Profile</span><select name=\"profile\" data-sv-performance-profile><option value=\"default\"")784+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "<form class=\"sv-card-form sv-config-form\" data-sv-action=\"config.performance.save\" data-sv-performance-form><label><span>Profile</span><select name=\"profile\" data-sv-performance-profile><option value=\"default\"")
772 if templ_7745c5c3_Err != nil {785 if templ_7745c5c3_Err != nil {
773 return templ_7745c5c3_Err786 return templ_7745c5c3_Err
774 }787 }
775 if performanceProfileSelected(config.Performance.Profile, "default") {788 if performanceProfileSelected(config.Performance.Profile, "default") {
776- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, " selected")789+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, " selected")
777 if templ_7745c5c3_Err != nil {790 if templ_7745c5c3_Err != nil {
778 return templ_7745c5c3_Err791 return templ_7745c5c3_Err
779 }792 }
780 }793 }
781- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, ">Default</option> <option value=\"balanced\"")794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, ">Default</option> <option value=\"balanced\"")
782 if templ_7745c5c3_Err != nil {795 if templ_7745c5c3_Err != nil {
783 return templ_7745c5c3_Err796 return templ_7745c5c3_Err
784 }797 }
785 if performanceProfileSelected(config.Performance.Profile, "balanced") {798 if performanceProfileSelected(config.Performance.Profile, "balanced") {
786- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, " selected")799+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, " selected")
787 if templ_7745c5c3_Err != nil {800 if templ_7745c5c3_Err != nil {
788 return templ_7745c5c3_Err801 return templ_7745c5c3_Err
789 }802 }
790 }803 }
791- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, ">Balanced</option> <option value=\"lite\"")804+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, ">Balanced</option> <option value=\"lite\"")
792 if templ_7745c5c3_Err != nil {805 if templ_7745c5c3_Err != nil {
793 return templ_7745c5c3_Err806 return templ_7745c5c3_Err
794 }807 }
795 if performanceProfileSelected(config.Performance.Profile, "lite") {808 if performanceProfileSelected(config.Performance.Profile, "lite") {
796- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, " selected")809+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, " selected")
797 if templ_7745c5c3_Err != nil {810 if templ_7745c5c3_Err != nil {
798 return templ_7745c5c3_Err811 return templ_7745c5c3_Err
799 }812 }
800 }813 }
801- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, ">Lite</option> <option value=\"max\"")814+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, ">Lite</option> <option value=\"max\"")
802 if templ_7745c5c3_Err != nil {815 if templ_7745c5c3_Err != nil {
803 return templ_7745c5c3_Err816 return templ_7745c5c3_Err
804 }817 }
805 if performanceProfileSelected(config.Performance.Profile, "max") {818 if performanceProfileSelected(config.Performance.Profile, "max") {
806- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, " selected")819+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, " selected")
807 if templ_7745c5c3_Err != nil {820 if templ_7745c5c3_Err != nil {
808 return templ_7745c5c3_Err821 return templ_7745c5c3_Err
809 }822 }
810 }823 }
811- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, ">Max</option> <option value=\"custom\"")824+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, ">Max</option> <option value=\"custom\"")
812 if templ_7745c5c3_Err != nil {825 if templ_7745c5c3_Err != nil {
813 return templ_7745c5c3_Err826 return templ_7745c5c3_Err
814 }827 }
815 if performanceProfileSelected(config.Performance.Profile, "custom") {828 if performanceProfileSelected(config.Performance.Profile, "custom") {
816- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, " selected")829+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, " selected")
817 if templ_7745c5c3_Err != nil {830 if templ_7745c5c3_Err != nil {
818 return templ_7745c5c3_Err831 return templ_7745c5c3_Err
819 }832 }
820 }833 }
821- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, ">Custom</option></select></label><p class=\"sv-meta\">Choose Custom to edit individual performance values.</p><label><span>Skia CPU threads</span><input name=\"skia_cpu_threads\" type=\"number\" min=\"0\" max=\"8\" value=\"")834+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, ">Custom</option></select></label><p class=\"sv-meta\">Choose Custom to edit individual performance values.</p><label><span>Skia CPU threads</span><input name=\"skia_cpu_threads\" type=\"number\" min=\"0\" max=\"8\" value=\"")
822 if templ_7745c5c3_Err != nil {835 if templ_7745c5c3_Err != nil {
823 return templ_7745c5c3_Err836 return templ_7745c5c3_Err
824 }837 }
825- var templ_7745c5c3_Var39 string838+ var templ_7745c5c3_Var40 string
826- templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.SkiaCPUThreads))839+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.SkiaCPUThreads))
827 if templ_7745c5c3_Err != nil {840 if templ_7745c5c3_Err != nil {
828- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 114, Col: 164}841+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 115, Col: 164}
829 }842 }
830- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))843+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40)
831 if templ_7745c5c3_Err != nil {844 if templ_7745c5c3_Err != nil {
832 return templ_7745c5c3_Err845 return templ_7745c5c3_Err
833 }846 }
834- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\"")847+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "\"")
835 if templ_7745c5c3_Err != nil {848 if templ_7745c5c3_Err != nil {
836 return templ_7745c5c3_Err849 return templ_7745c5c3_Err
837 }850 }
838 if !customProfile {851 if !customProfile {
839- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, " disabled")852+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, " disabled")
840 if templ_7745c5c3_Err != nil {853 if templ_7745c5c3_Err != nil {
841 return templ_7745c5c3_Err854 return templ_7745c5c3_Err
842 }855 }
843 }856 }
844- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, " data-sv-performance-custom></label> <label><span>Skia GPU threads</span><input name=\"skia_gpu_threads\" type=\"number\" min=\"-1\" max=\"8\" value=\"")857+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, " data-sv-performance-custom></label> <label><span>Skia GPU threads</span><input name=\"skia_gpu_threads\" type=\"number\" min=\"-1\" max=\"8\" value=\"")
845 if templ_7745c5c3_Err != nil {858 if templ_7745c5c3_Err != nil {
846 return templ_7745c5c3_Err859 return templ_7745c5c3_Err
847 }860 }
848- var templ_7745c5c3_Var40 string861+ var templ_7745c5c3_Var41 string
849- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.SkiaGPUThreads))862+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.SkiaGPUThreads))
850 if templ_7745c5c3_Err != nil {863 if templ_7745c5c3_Err != nil {
851- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 115, Col: 165}864+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 116, Col: 165}
852 }865 }
853- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))866+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var41)
854 if templ_7745c5c3_Err != nil {867 if templ_7745c5c3_Err != nil {
855 return templ_7745c5c3_Err868 return templ_7745c5c3_Err
856 }869 }
857- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "\"")870+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "\"")
858 if templ_7745c5c3_Err != nil {871 if templ_7745c5c3_Err != nil {
859 return templ_7745c5c3_Err872 return templ_7745c5c3_Err
860 }873 }
861 if !customProfile {874 if !customProfile {
862- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, " disabled")875+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, " disabled")
863 if templ_7745c5c3_Err != nil {876 if templ_7745c5c3_Err != nil {
864 return templ_7745c5c3_Err877 return templ_7745c5c3_Err
865 }878 }
866 }879 }
867- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, " data-sv-performance-custom></label> <label><span>Web process memory MB</span><input name=\"web_process_memory_mb\" type=\"number\" min=\"0\" max=\"16384\" value=\"")880+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, " data-sv-performance-custom></label> <label><span>Web process memory MB</span><input name=\"web_process_memory_mb\" type=\"number\" min=\"0\" max=\"16384\" value=\"")
868 if templ_7745c5c3_Err != nil {881 if templ_7745c5c3_Err != nil {
869 return templ_7745c5c3_Err882 return templ_7745c5c3_Err
870 }883 }
871- var templ_7745c5c3_Var41 string884+ var templ_7745c5c3_Var42 string
872- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.WebProcessMemoryMB))885+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.WebProcessMemoryMB))
873 if templ_7745c5c3_Err != nil {886 if templ_7745c5c3_Err != nil {
874- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 116, Col: 182}887+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 117, Col: 182}
875 }888 }
876- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))889+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var42)
877 if templ_7745c5c3_Err != nil {890 if templ_7745c5c3_Err != nil {
878 return templ_7745c5c3_Err891 return templ_7745c5c3_Err
879 }892 }
880- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\"")893+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "\"")
881 if templ_7745c5c3_Err != nil {894 if templ_7745c5c3_Err != nil {
882 return templ_7745c5c3_Err895 return templ_7745c5c3_Err
883 }896 }
884 if !customProfile {897 if !customProfile {
885- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, " disabled")898+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, " disabled")
886 if templ_7745c5c3_Err != nil {899 if templ_7745c5c3_Err != nil {
887 return templ_7745c5c3_Err900 return templ_7745c5c3_Err
888 }901 }
889 }902 }
890- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, " data-sv-performance-custom></label> <label><span>Network process memory MB</span><input name=\"network_process_memory_mb\" type=\"number\" min=\"0\" max=\"4096\" value=\"")903+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, " data-sv-performance-custom></label> <label><span>Network process memory MB</span><input name=\"network_process_memory_mb\" type=\"number\" min=\"0\" max=\"4096\" value=\"")
891 if templ_7745c5c3_Err != nil {904 if templ_7745c5c3_Err != nil {
892 return templ_7745c5c3_Err905 return templ_7745c5c3_Err
893 }906 }
894- var templ_7745c5c3_Var42 string907+ var templ_7745c5c3_Var43 string
895- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.NetworkProcessMemoryMB))908+ templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.NetworkProcessMemoryMB))
896 if templ_7745c5c3_Err != nil {909 if templ_7745c5c3_Err != nil {
897- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 117, Col: 193}910+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 118, Col: 193}
898 }911 }
899- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))912+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var43)
900 if templ_7745c5c3_Err != nil {913 if templ_7745c5c3_Err != nil {
901 return templ_7745c5c3_Err914 return templ_7745c5c3_Err
902 }915 }
903- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "\"")916+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "\"")
904 if templ_7745c5c3_Err != nil {917 if templ_7745c5c3_Err != nil {
905 return templ_7745c5c3_Err918 return templ_7745c5c3_Err
906 }919 }
907 if !customProfile {920 if !customProfile {
908- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, " disabled")921+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, " disabled")
909 if templ_7745c5c3_Err != nil {922 if templ_7745c5c3_Err != nil {
910 return templ_7745c5c3_Err923 return templ_7745c5c3_Err
911 }924 }
912 }925 }
913- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, " data-sv-performance-custom></label> <label><span>WebView pool prewarm</span><input name=\"webview_pool_prewarm\" type=\"number\" min=\"0\" max=\"20\" value=\"")926+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, " data-sv-performance-custom></label> <label><span>WebView pool prewarm</span><input name=\"webview_pool_prewarm\" type=\"number\" min=\"0\" max=\"20\" value=\"")
914 if templ_7745c5c3_Err != nil {927 if templ_7745c5c3_Err != nil {
915 return templ_7745c5c3_Err928 return templ_7745c5c3_Err
916 }929 }
917- var templ_7745c5c3_Var43 string930+ var templ_7745c5c3_Var44 string
918- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Custom.WebViewPoolPrewarm))931+ templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.ResolveAttributeValue(formatConfigInt(config.Performance.Custom.WebViewPoolPrewarm))
919 if templ_7745c5c3_Err != nil {932 if templ_7745c5c3_Err != nil {
920- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 118, Col: 177}933+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 119, Col: 177}
921 }934 }
922- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))935+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var44)
923 if templ_7745c5c3_Err != nil {936 if templ_7745c5c3_Err != nil {
924 return templ_7745c5c3_Err937 return templ_7745c5c3_Err
925 }938 }
926- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "\"")939+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "\"")
927 if templ_7745c5c3_Err != nil {940 if templ_7745c5c3_Err != nil {
928 return templ_7745c5c3_Err941 return templ_7745c5c3_Err
929 }942 }
930 if !customProfile {943 if !customProfile {
931- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, " disabled")944+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, " disabled")
932 if templ_7745c5c3_Err != nil {945 if templ_7745c5c3_Err != nil {
933 return templ_7745c5c3_Err946 return templ_7745c5c3_Err
934 }947 }
935 }948 }
936- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, " data-sv-performance-custom></label> <button class=\"sv-button\" type=\"submit\">")949+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, " data-sv-performance-custom></label> <button class=\"sv-button\" type=\"submit\">")
937 if templ_7745c5c3_Err != nil {950 if templ_7745c5c3_Err != nil {
938 return templ_7745c5c3_Err951 return templ_7745c5c3_Err
939 }952 }
@@ -941,69 +954,69 @@ func PerformanceSettings(config dto.SystemviewConfigPayload) templ.Component {
941 if templ_7745c5c3_Err != nil {954 if templ_7745c5c3_Err != nil {
942 return templ_7745c5c3_Err955 return templ_7745c5c3_Err
943 }956 }
944- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</button></form><div class=\"sv-stat-grid\"><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")957+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</button></form><div class=\"sv-stat-grid\"><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
945 if templ_7745c5c3_Err != nil {958 if templ_7745c5c3_Err != nil {
946 return templ_7745c5c3_Err959 return templ_7745c5c3_Err
947 }960 }
948- var templ_7745c5c3_Var44 string961+ var templ_7745c5c3_Var45 string
949- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.CPUThreads))962+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.CPUThreads))
950 if templ_7745c5c3_Err != nil {963 if templ_7745c5c3_Err != nil {
951- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 122, Col: 113}964+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 123, Col: 113}
952 }965 }
953- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))966+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
954 if templ_7745c5c3_Err != nil {967 if templ_7745c5c3_Err != nil {
955 return templ_7745c5c3_Err968 return templ_7745c5c3_Err
956 }969 }
957- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</span><span class=\"sv-stat-label\">CPU threads</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")970+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</span><span class=\"sv-stat-label\">CPU threads</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
958 if templ_7745c5c3_Err != nil {971 if templ_7745c5c3_Err != nil {
959 return templ_7745c5c3_Err972 return templ_7745c5c3_Err
960 }973 }
961- var templ_7745c5c3_Var45 string974+ var templ_7745c5c3_Var46 string
962- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.TotalRAMMB))975+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(formatConfigInt(config.Performance.Hardware.TotalRAMMB))
963 if templ_7745c5c3_Err != nil {976 if templ_7745c5c3_Err != nil {
964- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 123, Col: 113}977+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 124, Col: 113}
965 }978 }
966- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))979+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
967 if templ_7745c5c3_Err != nil {980 if templ_7745c5c3_Err != nil {
968 return templ_7745c5c3_Err981 return templ_7745c5c3_Err
969 }982 }
970- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</span><span class=\"sv-stat-label\">RAM MB</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")983+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</span><span class=\"sv-stat-label\">RAM MB</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
971 if templ_7745c5c3_Err != nil {984 if templ_7745c5c3_Err != nil {
972 return templ_7745c5c3_Err985 return templ_7745c5c3_Err
973 }986 }
974- var templ_7745c5c3_Var46 string987+ var templ_7745c5c3_Var47 string
975- templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(config.Performance.Hardware.GPUName)988+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(config.Performance.Hardware.GPUName)
976 if templ_7745c5c3_Err != nil {989 if templ_7745c5c3_Err != nil {
977- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 124, Col: 93}990+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 125, Col: 93}
978 }991 }
979- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))992+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
980 if templ_7745c5c3_Err != nil {993 if templ_7745c5c3_Err != nil {
981 return templ_7745c5c3_Err994 return templ_7745c5c3_Err
982 }995 }
983- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</span><span class=\"sv-stat-label\">GPU</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")996+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span><span class=\"sv-stat-label\">GPU</span></div><div class=\"sv-stat-card\"><span class=\"sv-stat-value\">")
984 if templ_7745c5c3_Err != nil {997 if templ_7745c5c3_Err != nil {
985 return templ_7745c5c3_Err998 return templ_7745c5c3_Err
986 }999 }
987- var templ_7745c5c3_Var47 string1000+ var templ_7745c5c3_Var48 string
988- templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(config.EngineType)1001+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(config.EngineType)
989 if templ_7745c5c3_Err != nil {1002 if templ_7745c5c3_Err != nil {
990- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 125, Col: 75}1003+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 126, Col: 75}
991 }1004 }
992- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))1005+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
993 if templ_7745c5c3_Err != nil {1006 if templ_7745c5c3_Err != nil {
994 return templ_7745c5c3_Err1007 return templ_7745c5c3_Err
995 }1008 }
996- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span><span class=\"sv-stat-label\">Engine</span></div></div>")1009+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</span><span class=\"sv-stat-label\">Engine</span></div></div>")
997 if templ_7745c5c3_Err != nil {1010 if templ_7745c5c3_Err != nil {
998 return templ_7745c5c3_Err1011 return templ_7745c5c3_Err
999 }1012 }
1000 if !engineIsWebKit(config.EngineType) {1013 if !engineIsWebKit(config.EngineType) {
1001- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "<p class=\"sv-meta\">Performance tuning applies only to the WebKit engine.</p>")1014+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<p class=\"sv-meta\">Performance tuning applies only to the WebKit engine.</p>")
1002 if templ_7745c5c3_Err != nil {1015 if templ_7745c5c3_Err != nil {
1003 return templ_7745c5c3_Err1016 return templ_7745c5c3_Err
1004 }1017 }
1005 } else {1018 } else {
1006- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<p class=\"sv-meta\">Performance profile changes may require restarting the browser to affect existing engine processes.</p>")1019+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<p class=\"sv-meta\">Performance profile changes may require restarting the browser to affect existing engine processes.</p>")
1007 if templ_7745c5c3_Err != nil {1020 if templ_7745c5c3_Err != nil {
1008 return templ_7745c5c3_Err1021 return templ_7745c5c3_Err
1009 }1022 }
@@ -1028,9 +1041,9 @@ func ConfigKeybindings(keybindings port.KeybindingsConfig) templ.Component {
1028 }()1041 }()
1029 }1042 }
1030 ctx = templ.InitializeContext(ctx)1043 ctx = templ.InitializeContext(ctx)
1031- templ_7745c5c3_Var48 := templ.GetChildren(ctx)1044+ templ_7745c5c3_Var49 := templ.GetChildren(ctx)
1032- if templ_7745c5c3_Var48 == nil {1045+ if templ_7745c5c3_Var49 == nil {
1033- templ_7745c5c3_Var48 = templ.NopComponent1046+ templ_7745c5c3_Var49 = templ.NopComponent
1034 }1047 }
1035 ctx = templ.ClearChildren(ctx)1048 ctx = templ.ClearChildren(ctx)
1036 groups := configKeybindingGroups(keybindings)1049 groups := configKeybindingGroups(keybindings)
@@ -1045,7 +1058,7 @@ func ConfigKeybindings(keybindings port.KeybindingsConfig) templ.Component {
1045 return templ_7745c5c3_Err1058 return templ_7745c5c3_Err
1046 }1059 }
1047 } else {1060 } else {
1048- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<div class=\"sv-button-row\"><button class=\"sv-button sv-button-secondary sv-button-danger\" type=\"button\" data-sv-action=\"config.keybinding.resetAll\" data-sv-confirm=\"Reset all keybindings to defaults?\">")1061+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<div class=\"sv-button-row\"><button class=\"sv-button sv-button-secondary sv-button-danger\" type=\"button\" data-sv-action=\"config.keybinding.resetAll\" data-sv-confirm=\"Reset all keybindings to defaults?\">")
1049 if templ_7745c5c3_Err != nil {1062 if templ_7745c5c3_Err != nil {
1050 return templ_7745c5c3_Err1063 return templ_7745c5c3_Err
1051 }1064 }
@@ -1053,7 +1066,7 @@ func ConfigKeybindings(keybindings port.KeybindingsConfig) templ.Component {
1053 if templ_7745c5c3_Err != nil {1066 if templ_7745c5c3_Err != nil {
1054 return templ_7745c5c3_Err1067 return templ_7745c5c3_Err
1055 }1068 }
1056- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</button></div>")1069+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</button></div>")
1057 if templ_7745c5c3_Err != nil {1070 if templ_7745c5c3_Err != nil {
1058 return templ_7745c5c3_Err1071 return templ_7745c5c3_Err
1059 }1072 }
@@ -1084,48 +1097,48 @@ func ConfigKeybindingGroup(group renderedKeybindingGroup) templ.Component {
1084 }()1097 }()
1085 }1098 }
1086 ctx = templ.InitializeContext(ctx)1099 ctx = templ.InitializeContext(ctx)
1087- templ_7745c5c3_Var49 := templ.GetChildren(ctx)1100+ templ_7745c5c3_Var50 := templ.GetChildren(ctx)
1088- if templ_7745c5c3_Var49 == nil {1101+ if templ_7745c5c3_Var50 == nil {
1089- templ_7745c5c3_Var49 = templ.NopComponent1102+ templ_7745c5c3_Var50 = templ.NopComponent
1090 }1103 }
1091 ctx = templ.ClearChildren(ctx)1104 ctx = templ.ClearChildren(ctx)
1092- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<div class=\"sv-group\"><div class=\"sv-group-header\"><div><h4>")1105+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<div class=\"sv-group\"><div class=\"sv-group-header\"><div><h4>")
1093 if templ_7745c5c3_Err != nil {1106 if templ_7745c5c3_Err != nil {
1094 return templ_7745c5c3_Err1107 return templ_7745c5c3_Err
1095 }1108 }
1096- var templ_7745c5c3_Var50 string1109+ var templ_7745c5c3_Var51 string
1097- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupTitle(group))1110+ templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupTitle(group))
1098 if templ_7745c5c3_Err != nil {1111 if templ_7745c5c3_Err != nil {
1099- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 154, Col: 37}1112+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 155, Col: 37}
1100 }1113 }
1101- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))1114+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
1102 if templ_7745c5c3_Err != nil {1115 if templ_7745c5c3_Err != nil {
1103 return templ_7745c5c3_Err1116 return templ_7745c5c3_Err
1104 }1117 }
1105- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</h4>")1118+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</h4>")
1106 if templ_7745c5c3_Err != nil {1119 if templ_7745c5c3_Err != nil {
1107 return templ_7745c5c3_Err1120 return templ_7745c5c3_Err
1108 }1121 }
1109 if keybindingGroupMeta(group) != "" {1122 if keybindingGroupMeta(group) != "" {
1110- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<p class=\"sv-meta\">")1123+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<p class=\"sv-meta\">")
1111 if templ_7745c5c3_Err != nil {1124 if templ_7745c5c3_Err != nil {
1112 return templ_7745c5c3_Err1125 return templ_7745c5c3_Err
1113 }1126 }
1114- var templ_7745c5c3_Var51 string1127+ var templ_7745c5c3_Var52 string
1115- templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupMeta(group))1128+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingGroupMeta(group))
1116 if templ_7745c5c3_Err != nil {1129 if templ_7745c5c3_Err != nil {
1117- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 156, Col: 52}1130+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 157, Col: 52}
1118 }1131 }
1119- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))1132+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
1120 if templ_7745c5c3_Err != nil {1133 if templ_7745c5c3_Err != nil {
1121 return templ_7745c5c3_Err1134 return templ_7745c5c3_Err
1122 }1135 }
1123- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</p>")1136+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</p>")
1124 if templ_7745c5c3_Err != nil {1137 if templ_7745c5c3_Err != nil {
1125 return templ_7745c5c3_Err1138 return templ_7745c5c3_Err
1126 }1139 }
1127 }1140 }
1128- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</div></div><div class=\"sv-group-body\">")1141+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "</div></div><div class=\"sv-group-body\">")
1129 if templ_7745c5c3_Err != nil {1142 if templ_7745c5c3_Err != nil {
1130 return templ_7745c5c3_Err1143 return templ_7745c5c3_Err
1131 }1144 }
@@ -1135,7 +1148,7 @@ func ConfigKeybindingGroup(group renderedKeybindingGroup) templ.Component {
1135 return templ_7745c5c3_Err1148 return templ_7745c5c3_Err
1136 }1149 }
1137 } else {1150 } else {
1138- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<ul class=\"sv-list\">")1151+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<ul class=\"sv-list\">")
1139 if templ_7745c5c3_Err != nil {1152 if templ_7745c5c3_Err != nil {
1140 return templ_7745c5c3_Err1153 return templ_7745c5c3_Err
1141 }1154 }
@@ -1145,12 +1158,12 @@ func ConfigKeybindingGroup(group renderedKeybindingGroup) templ.Component {
1145 return templ_7745c5c3_Err1158 return templ_7745c5c3_Err
1146 }1159 }
1147 }1160 }
1148- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</ul>")1161+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</ul>")
1149 if templ_7745c5c3_Err != nil {1162 if templ_7745c5c3_Err != nil {
1150 return templ_7745c5c3_Err1163 return templ_7745c5c3_Err
1151 }1164 }
1152 }1165 }
1153- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</div></div>")1166+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</div></div>")
1154 if templ_7745c5c3_Err != nil {1167 if templ_7745c5c3_Err != nil {
1155 return templ_7745c5c3_Err1168 return templ_7745c5c3_Err
1156 }1169 }
@@ -1174,38 +1187,38 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
1174 }()1187 }()
1175 }1188 }
1176 ctx = templ.InitializeContext(ctx)1189 ctx = templ.InitializeContext(ctx)
1177- templ_7745c5c3_Var52 := templ.GetChildren(ctx)1190+ templ_7745c5c3_Var53 := templ.GetChildren(ctx)
1178- if templ_7745c5c3_Var52 == nil {1191+ if templ_7745c5c3_Var53 == nil {
1179- templ_7745c5c3_Var52 = templ.NopComponent1192+ templ_7745c5c3_Var53 = templ.NopComponent
1180 }1193 }
1181 ctx = templ.ClearChildren(ctx)1194 ctx = templ.ClearChildren(ctx)
1182- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<li class=\"sv-list-row\"><div class=\"sv-keybinding-row\"><div><strong>")1195+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<li class=\"sv-list-row\"><div class=\"sv-keybinding-row\"><div><strong>")
1183 if templ_7745c5c3_Err != nil {1196 if templ_7745c5c3_Err != nil {
1184 return templ_7745c5c3_Err1197 return templ_7745c5c3_Err
1185 }1198 }
1186- var templ_7745c5c3_Var53 string1199+ var templ_7745c5c3_Var54 string
1187- templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingDescription(binding))1200+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingDescription(binding))
1188 if templ_7745c5c3_Err != nil {1201 if templ_7745c5c3_Err != nil {
1189- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 178, Col: 44}1202+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 179, Col: 44}
1190 }1203 }
1191- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))1204+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
1192 if templ_7745c5c3_Err != nil {1205 if templ_7745c5c3_Err != nil {
1193 return templ_7745c5c3_Err1206 return templ_7745c5c3_Err
1194 }1207 }
1195- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "</strong><p class=\"sv-meta\">")1208+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</strong><p class=\"sv-meta\">")
1196 if templ_7745c5c3_Err != nil {1209 if templ_7745c5c3_Err != nil {
1197 return templ_7745c5c3_Err1210 return templ_7745c5c3_Err
1198 }1211 }
1199- var templ_7745c5c3_Var54 string1212+ var templ_7745c5c3_Var55 string
1200- templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingAction(binding))1213+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingAction(binding))
1201 if templ_7745c5c3_Err != nil {1214 if templ_7745c5c3_Err != nil {
1202- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 179, Col: 50}1215+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 180, Col: 50}
1203 }1216 }
1204- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))1217+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1205 if templ_7745c5c3_Err != nil {1218 if templ_7745c5c3_Err != nil {
1206 return templ_7745c5c3_Err1219 return templ_7745c5c3_Err
1207 }1220 }
1208- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</p><div class=\"sv-binding-keys\">")1221+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "</p><div class=\"sv-binding-keys\">")
1209 if templ_7745c5c3_Err != nil {1222 if templ_7745c5c3_Err != nil {
1210 return templ_7745c5c3_Err1223 return templ_7745c5c3_Err
1211 }1224 }
@@ -1213,25 +1226,25 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
1213 if templ_7745c5c3_Err != nil {1226 if templ_7745c5c3_Err != nil {
1214 return templ_7745c5c3_Err1227 return templ_7745c5c3_Err
1215 }1228 }
1216- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<span class=\"sv-badge\">")1229+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "<span class=\"sv-badge\">")
1217 if templ_7745c5c3_Err != nil {1230 if templ_7745c5c3_Err != nil {
1218 return templ_7745c5c3_Err1231 return templ_7745c5c3_Err
1219 }1232 }
1220- var templ_7745c5c3_Var55 string1233+ var templ_7745c5c3_Var56 string
1221- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingStatus(binding))1234+ templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingStatus(binding))
1222 if templ_7745c5c3_Err != nil {1235 if templ_7745c5c3_Err != nil {
1223- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 182, Col: 55}1236+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 183, Col: 55}
1224 }1237 }
1225- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))1238+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
1226 if templ_7745c5c3_Err != nil {1239 if templ_7745c5c3_Err != nil {
1227 return templ_7745c5c3_Err1240 return templ_7745c5c3_Err
1228 }1241 }
1229- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</span> ")1242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "</span> ")
1230 if templ_7745c5c3_Err != nil {1243 if templ_7745c5c3_Err != nil {
1231 return templ_7745c5c3_Err1244 return templ_7745c5c3_Err
1232 }1245 }
1233 if keybindingIsCustom(binding) && len(binding.DefaultKeys) > 0 {1246 if keybindingIsCustom(binding) && len(binding.DefaultKeys) > 0 {
1234- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<span class=\"sv-meta\">default:</span>")1247+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "<span class=\"sv-meta\">default:</span>")
1235 if templ_7745c5c3_Err != nil {1248 if templ_7745c5c3_Err != nil {
1236 return templ_7745c5c3_Err1249 return templ_7745c5c3_Err
1237 }1250 }
@@ -1240,46 +1253,46 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
1240 return templ_7745c5c3_Err1253 return templ_7745c5c3_Err
1241 }1254 }
1242 }1255 }
1243- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</div></div><form class=\"sv-inline-form\" data-sv-action=\"config.keybinding.set\"><input type=\"hidden\" name=\"mode\" value=\"")1256+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</div></div><form class=\"sv-inline-form\" data-sv-action=\"config.keybinding.set\"><input type=\"hidden\" name=\"mode\" value=\"")
1244 if templ_7745c5c3_Err != nil {1257 if templ_7745c5c3_Err != nil {
1245 return templ_7745c5c3_Err1258 return templ_7745c5c3_Err
1246 }1259 }
1247- var templ_7745c5c3_Var56 string1260+ var templ_7745c5c3_Var57 string
1248- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(group.Mode)1261+ templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.ResolveAttributeValue(group.Mode)
1249 if templ_7745c5c3_Err != nil {1262 if templ_7745c5c3_Err != nil {
1250- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 190, Col: 55}1263+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 191, Col: 55}
1251 }1264 }
1252- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))1265+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var57)
1253 if templ_7745c5c3_Err != nil {1266 if templ_7745c5c3_Err != nil {
1254 return templ_7745c5c3_Err1267 return templ_7745c5c3_Err
1255 }1268 }
1256- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "\"> <input type=\"hidden\" name=\"action\" value=\"")1269+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"> <input type=\"hidden\" name=\"action\" value=\"")
1257 if templ_7745c5c3_Err != nil {1270 if templ_7745c5c3_Err != nil {
1258 return templ_7745c5c3_Err1271 return templ_7745c5c3_Err
1259 }1272 }
1260- var templ_7745c5c3_Var57 string1273+ var templ_7745c5c3_Var58 string
1261- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(binding.Action)1274+ templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.ResolveAttributeValue(binding.Action)
1262 if templ_7745c5c3_Err != nil {1275 if templ_7745c5c3_Err != nil {
1263- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 191, Col: 61}1276+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 192, Col: 61}
1264 }1277 }
1265- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))1278+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var58)
1266 if templ_7745c5c3_Err != nil {1279 if templ_7745c5c3_Err != nil {
1267 return templ_7745c5c3_Err1280 return templ_7745c5c3_Err
1268 }1281 }
1269- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"> <label><span>Keys</span><input name=\"keys\" type=\"text\" value=\"")1282+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\"> <label><span>Keys</span><input name=\"keys\" type=\"text\" value=\"")
1270 if templ_7745c5c3_Err != nil {1283 if templ_7745c5c3_Err != nil {
1271 return templ_7745c5c3_Err1284 return templ_7745c5c3_Err
1272 }1285 }
1273- var templ_7745c5c3_Var58 string1286+ var templ_7745c5c3_Var59 string
1274- templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(keybindingKeysValue(binding.Keys))1287+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.ResolveAttributeValue(keybindingKeysValue(binding.Keys))
1275 if templ_7745c5c3_Err != nil {1288 if templ_7745c5c3_Err != nil {
1276- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 192, Col: 100}1289+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 193, Col: 100}
1277 }1290 }
1278- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))1291+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59)
1279 if templ_7745c5c3_Err != nil {1292 if templ_7745c5c3_Err != nil {
1280 return templ_7745c5c3_Err1293 return templ_7745c5c3_Err
1281 }1294 }
1282- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\" placeholder=\"ctrl+h, ctrl+shift+h\" required></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")1295+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\" placeholder=\"ctrl+h, ctrl+shift+h\" required></label> <button class=\"sv-button sv-button-secondary\" type=\"submit\">")
1283 if templ_7745c5c3_Err != nil {1296 if templ_7745c5c3_Err != nil {
1284 return templ_7745c5c3_Err1297 return templ_7745c5c3_Err
1285 }1298 }
@@ -1287,33 +1300,33 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
1287 if templ_7745c5c3_Err != nil {1300 if templ_7745c5c3_Err != nil {
1288 return templ_7745c5c3_Err1301 return templ_7745c5c3_Err
1289 }1302 }
1290- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.keybinding.reset\" data-mode=\"")1303+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</button> <button class=\"sv-button sv-button-secondary\" type=\"button\" data-sv-action=\"config.keybinding.reset\" data-mode=\"")
1291 if templ_7745c5c3_Err != nil {1304 if templ_7745c5c3_Err != nil {
1292 return templ_7745c5c3_Err1305 return templ_7745c5c3_Err
1293 }1306 }
1294- var templ_7745c5c3_Var59 string1307+ var templ_7745c5c3_Var60 string
1295- templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(group.Mode)1308+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.ResolveAttributeValue(group.Mode)
1296 if templ_7745c5c3_Err != nil {1309 if templ_7745c5c3_Err != nil {
1297- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 194, Col: 127}1310+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 195, Col: 127}
1298 }1311 }
1299- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))1312+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var60)
1300 if templ_7745c5c3_Err != nil {1313 if templ_7745c5c3_Err != nil {
1301 return templ_7745c5c3_Err1314 return templ_7745c5c3_Err
1302 }1315 }
1303- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "\" data-action=\"")1316+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "\" data-action=\"")
1304 if templ_7745c5c3_Err != nil {1317 if templ_7745c5c3_Err != nil {
1305 return templ_7745c5c3_Err1318 return templ_7745c5c3_Err
1306 }1319 }
1307- var templ_7745c5c3_Var60 string1320+ var templ_7745c5c3_Var61 string
1308- templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(binding.Action)1321+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.ResolveAttributeValue(binding.Action)
1309 if templ_7745c5c3_Err != nil {1322 if templ_7745c5c3_Err != nil {
1310- return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 194, Col: 158}1323+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `config.templ`, Line: 195, Col: 158}
1311 }1324 }
1312- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))1325+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var61)
1313 if templ_7745c5c3_Err != nil {1326 if templ_7745c5c3_Err != nil {
1314 return templ_7745c5c3_Err1327 return templ_7745c5c3_Err
1315 }1328 }
1316- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "\">")1329+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "\">")
1317 if templ_7745c5c3_Err != nil {1330 if templ_7745c5c3_Err != nil {
1318 return templ_7745c5c3_Err1331 return templ_7745c5c3_Err
1319 }1332 }
@@ -1321,7 +1334,7 @@ func ConfigKeybinding(group renderedKeybindingGroup, binding renderedKeybinding)
1321 if templ_7745c5c3_Err != nil {1334 if templ_7745c5c3_Err != nil {
1322 return templ_7745c5c3_Err1335 return templ_7745c5c3_Err
1323 }1336 }
1324- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</button></form></div></li>")1337+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "</button></form></div></li>")
1325 if templ_7745c5c3_Err != nil {1338 if templ_7745c5c3_Err != nil {
1326 return templ_7745c5c3_Err1339 return templ_7745c5c3_Err
1327 }1340 }
M internal/ui/systemviews/theme.go +1 -0
@@ -184,6 +184,7 @@ func isZeroAppearance(appearance dto.WebUIAppearanceConfig) bool {
184184 appearance.SansFont == "" &&
185185 appearance.SerifFont == "" &&
186186 appearance.MonospaceFont == "" &&
187+ appearance.GtkFont == "" &&
187188 appearance.DefaultFontSize == 0 &&
188189 appearance.LightPalette == (dto.ColorPalette{}) &&
189190 appearance.DarkPalette == (dto.ColorPalette{})
@@ -184,6 +184,7 @@ func isZeroAppearance(appearance dto.WebUIAppearanceConfig) bool {
184 appearance.SansFont == "" &&184 appearance.SansFont == "" &&
185 appearance.SerifFont == "" &&185 appearance.SerifFont == "" &&
186 appearance.MonospaceFont == "" &&186 appearance.MonospaceFont == "" &&
187+ appearance.GtkFont == "" &&
187 appearance.DefaultFontSize == 0 &&188 appearance.DefaultFontSize == 0 &&
188 appearance.LightPalette == (dto.ColorPalette{}) &&189 appearance.LightPalette == (dto.ColorPalette{}) &&
189 appearance.DarkPalette == (dto.ColorPalette{})190 appearance.DarkPalette == (dto.ColorPalette{})
M internal/ui/theme/css.go +5 -1
@@ -21,6 +21,7 @@ func GenerateCSSWithScale(p Palette, scale float64) string {
2121 type FontConfig struct {
2222 SansFont string
2323 MonospaceFont string
24+ GtkFont string
2425 }
2526
2627 // DefaultFontConfig returns safe font fallbacks.
@@ -28,6 +29,7 @@ func DefaultFontConfig() FontConfig {
2829 return FontConfig{
2930 SansFont: "sans-serif",
3031 MonospaceFont: "monospace",
32+ GtkFont: DefaultGTKFont(),
3133 }
3234 }
3335
@@ -37,13 +39,14 @@ func FontCSSVars(fonts FontConfig) string {
3739 // Quote the configured family; include generic fallback.
3840 fmt.Fprintf(&sb, " --font-sans: %q, sans-serif;\n", fonts.SansFont)
3941 fmt.Fprintf(&sb, " --font-mono: %q, monospace;\n", fonts.MonospaceFont)
42+ fmt.Fprintf(&sb, " --font-gtk: %q, sans-serif;\n", fonts.GtkFont)
4043 return sb.String()
4144 }
4245
4346 func generateFontCSS() string {
4447 return `/* Font styling */
4548 window, tooltip, popover {
46- font-family: var(--font-sans);
49+ font-family: var(--font-gtk);
4750 }
4851 `
4952 }
@@ -62,6 +65,7 @@ func GenerateCSSFull(p Palette, _ float64, fonts FontConfig, modeColors ModeColo
6265 fonts = FontConfig{
6366 SansFont: Coalesce(fonts.SansFont, defaults.SansFont),
6467 MonospaceFont: Coalesce(fonts.MonospaceFont, defaults.MonospaceFont),
68+ GtkFont: Coalesce(fonts.GtkFont, defaults.GtkFont),
6569 }
6670
6771 var sb strings.Builder
@@ -21,6 +21,7 @@ func GenerateCSSWithScale(p Palette, scale float64) string {
21 type FontConfig struct {21 type FontConfig struct {
22 SansFont string22 SansFont string
23 MonospaceFont string23 MonospaceFont string
24+ GtkFont string
24 }25 }
25 26
26 // DefaultFontConfig returns safe font fallbacks.27 // DefaultFontConfig returns safe font fallbacks.
@@ -28,6 +29,7 @@ func DefaultFontConfig() FontConfig {
28 return FontConfig{29 return FontConfig{
29 SansFont: "sans-serif",30 SansFont: "sans-serif",
30 MonospaceFont: "monospace",31 MonospaceFont: "monospace",
32+ GtkFont: DefaultGTKFont(),
31 }33 }
32 }34 }
33 35
@@ -37,13 +39,14 @@ func FontCSSVars(fonts FontConfig) string {
37 // Quote the configured family; include generic fallback.39 // Quote the configured family; include generic fallback.
38 fmt.Fprintf(&sb, " --font-sans: %q, sans-serif;\n", fonts.SansFont)40 fmt.Fprintf(&sb, " --font-sans: %q, sans-serif;\n", fonts.SansFont)
39 fmt.Fprintf(&sb, " --font-mono: %q, monospace;\n", fonts.MonospaceFont)41 fmt.Fprintf(&sb, " --font-mono: %q, monospace;\n", fonts.MonospaceFont)
42+ fmt.Fprintf(&sb, " --font-gtk: %q, sans-serif;\n", fonts.GtkFont)
40 return sb.String()43 return sb.String()
41 }44 }
42 45
43 func generateFontCSS() string {46 func generateFontCSS() string {
44 return `/* Font styling */47 return `/* Font styling */
45 window, tooltip, popover {48 window, tooltip, popover {
46- font-family: var(--font-sans);49+ font-family: var(--font-gtk);
47 }50 }
48 `51 `
49 }52 }
@@ -62,6 +65,7 @@ func GenerateCSSFull(p Palette, _ float64, fonts FontConfig, modeColors ModeColo
62 fonts = FontConfig{65 fonts = FontConfig{
63 SansFont: Coalesce(fonts.SansFont, defaults.SansFont),66 SansFont: Coalesce(fonts.SansFont, defaults.SansFont),
64 MonospaceFont: Coalesce(fonts.MonospaceFont, defaults.MonospaceFont),67 MonospaceFont: Coalesce(fonts.MonospaceFont, defaults.MonospaceFont),
68+ GtkFont: Coalesce(fonts.GtkFont, defaults.GtkFont),
65 }69 }
66 70
67 var sb strings.Builder71 var sb strings.Builder
M internal/ui/theme/css_test.go +14 -0
@@ -8,6 +8,20 @@ import (
88 "github.com/stretchr/testify/assert"
99 )
1010
11+func TestGenerateCSS_UsesGTKFontForNativeWidgets(t *testing.T) {
12+ css := GenerateCSSWithScaleAndFonts(DefaultDarkPalette(), 1.0, FontConfig{
13+ SansFont: "Fira Sans",
14+ MonospaceFont: "Fira Code",
15+ GtkFont: "Adwaita Sans",
16+ })
17+
18+ assert.Contains(t, css, `--font-sans: "Fira Sans", sans-serif;`)
19+ assert.Contains(t, css, `--font-mono: "Fira Code", monospace;`)
20+ assert.Contains(t, css, `--font-gtk: "Adwaita Sans", sans-serif;`)
21+ assert.Contains(t, css, "window, tooltip, popover {\n\tfont-family: var(--font-gtk);\n}")
22+ assert.NotContains(t, css, "window, tooltip, popover {\n\tfont-family: var(--font-sans);\n}")
23+}
24+
1125 func TestGenerateCSS_StandaloneOmniboxWindowUsesTransparentBackground(t *testing.T) {
1226 css := GenerateCSS(DefaultDarkPalette())
1327
@@ -8,6 +8,20 @@ import (
8 "github.com/stretchr/testify/assert"8 "github.com/stretchr/testify/assert"
9 )9 )
10 10
11+func TestGenerateCSS_UsesGTKFontForNativeWidgets(t *testing.T) {
12+ css := GenerateCSSWithScaleAndFonts(DefaultDarkPalette(), 1.0, FontConfig{
13+ SansFont: "Fira Sans",
14+ MonospaceFont: "Fira Code",
15+ GtkFont: "Adwaita Sans",
16+ })
17+
18+ assert.Contains(t, css, `--font-sans: "Fira Sans", sans-serif;`)
19+ assert.Contains(t, css, `--font-mono: "Fira Code", monospace;`)
20+ assert.Contains(t, css, `--font-gtk: "Adwaita Sans", sans-serif;`)
21+ assert.Contains(t, css, "window, tooltip, popover {\n\tfont-family: var(--font-gtk);\n}")
22+ assert.NotContains(t, css, "window, tooltip, popover {\n\tfont-family: var(--font-sans);\n}")
23+}
24+
11 func TestGenerateCSS_StandaloneOmniboxWindowUsesTransparentBackground(t *testing.T) {25 func TestGenerateCSS_StandaloneOmniboxWindowUsesTransparentBackground(t *testing.T) {
12 css := GenerateCSS(DefaultDarkPalette())26 css := GenerateCSS(DefaultDarkPalette())
13 27
M internal/ui/theme/manager.go +13 -2
@@ -21,6 +21,7 @@ type Manager struct {
2121 darkPalette Palette // Dark theme colors
2222 uiScale float64 // UI scaling factor (1.0 = 100%)
2323 fonts FontConfig
24+ gtkFont string
2425 modeColors ModeColors // Modal mode indicator colors
2526 cssProvider *gtk.CssProvider
2627 appliedFont string
@@ -68,9 +69,12 @@ func NewManager(
6869 }
6970
7071 fonts := DefaultFontConfig()
72+ gtkFont := DefaultGTKFont()
7173 if appearance != nil {
7274 fonts.SansFont = Coalesce(appearance.SansFont, fonts.SansFont)
7375 fonts.MonospaceFont = Coalesce(appearance.MonospaceFont, fonts.MonospaceFont)
76+ gtkFont = Coalesce(appearance.GtkFont, gtkFont)
77+ fonts.GtkFont = gtkFont
7478 }
7579
7680 // Build mode colors from config
@@ -82,6 +86,7 @@ func NewManager(
8286 Float64("ui_scale", uiScale).
8387 Str("sans_font", fonts.SansFont).
8488 Str("monospace_font", fonts.MonospaceFont).
89+ Str("gtk_font", gtkFont).
8590 Msg("theme manager initialized")
8691
8792 return &Manager{
@@ -91,6 +96,7 @@ func NewManager(
9196 darkPalette: darkPalette,
9297 uiScale: uiScale,
9398 fonts: fonts,
99+ gtkFont: gtkFont,
94100 modeColors: modeColors,
95101 colorResolver: resolver,
96102 }
@@ -155,10 +161,12 @@ func (m *Manager) GetWebUIThemeCSS() string {
155161
156162 const gtkDefaultFontPointSize = 11
157163
164+func DefaultGTKFont() string { return "Adwaita Sans" }
165+
158166 func formatGTKFontName(family string, uiScale float64) string {
159167 family = strings.TrimSpace(family)
160168 if family == "" {
161- family = DefaultFontConfig().SansFont
169+ family = DefaultGTKFont()
162170 }
163171 if uiScale <= 0 {
164172 uiScale = 1.0
@@ -186,7 +194,7 @@ func (m *Manager) ApplyToDisplay(ctx context.Context, display *gdk.Display) {
186194 // Generate CSS with current palette, UI scale, fonts, and mode colors
187195 palette := m.GetCurrentPalette()
188196 css := GenerateCSSFull(palette, m.uiScale, m.fonts, m.modeColors)
189- fontName := formatGTKFontName(m.fonts.SansFont, m.uiScale)
197+ fontName := formatGTKFontName(m.gtkFont, m.uiScale)
190198
191199 settings := gtk.SettingsGetForDisplay(display)
192200 if settings == nil {
@@ -279,9 +287,11 @@ func (m *Manager) UpdateFromConfig(
279287 }
280288
281289 defaults := DefaultFontConfig()
290+ m.gtkFont = Coalesce(appearance.GtkFont, DefaultGTKFont())
282291 m.fonts = FontConfig{
283292 SansFont: Coalesce(appearance.SansFont, defaults.SansFont),
284293 MonospaceFont: Coalesce(appearance.MonospaceFont, defaults.MonospaceFont),
294+ GtkFont: m.gtkFont,
285295 }
286296
287297 // Update mode colors
@@ -295,6 +305,7 @@ func (m *Manager) UpdateFromConfig(
295305 Float64("ui_scale", m.uiScale).
296306 Str("sans_font", m.fonts.SansFont).
297307 Str("monospace_font", m.fonts.MonospaceFont).
308+ Str("gtk_font", m.gtkFont).
298309 Msg("theme manager updated from config")
299310
300311 // Re-apply CSS if display is available
@@ -21,6 +21,7 @@ type Manager struct {
21 darkPalette Palette // Dark theme colors21 darkPalette Palette // Dark theme colors
22 uiScale float64 // UI scaling factor (1.0 = 100%)22 uiScale float64 // UI scaling factor (1.0 = 100%)
23 fonts FontConfig23 fonts FontConfig
24+ gtkFont string
24 modeColors ModeColors // Modal mode indicator colors25 modeColors ModeColors // Modal mode indicator colors
25 cssProvider *gtk.CssProvider26 cssProvider *gtk.CssProvider
26 appliedFont string27 appliedFont string
@@ -68,9 +69,12 @@ func NewManager(
68 }69 }
69 70
70 fonts := DefaultFontConfig()71 fonts := DefaultFontConfig()
72+ gtkFont := DefaultGTKFont()
71 if appearance != nil {73 if appearance != nil {
72 fonts.SansFont = Coalesce(appearance.SansFont, fonts.SansFont)74 fonts.SansFont = Coalesce(appearance.SansFont, fonts.SansFont)
73 fonts.MonospaceFont = Coalesce(appearance.MonospaceFont, fonts.MonospaceFont)75 fonts.MonospaceFont = Coalesce(appearance.MonospaceFont, fonts.MonospaceFont)
76+ gtkFont = Coalesce(appearance.GtkFont, gtkFont)
77+ fonts.GtkFont = gtkFont
74 }78 }
75 79
76 // Build mode colors from config80 // Build mode colors from config
@@ -82,6 +86,7 @@ func NewManager(
82 Float64("ui_scale", uiScale).86 Float64("ui_scale", uiScale).
83 Str("sans_font", fonts.SansFont).87 Str("sans_font", fonts.SansFont).
84 Str("monospace_font", fonts.MonospaceFont).88 Str("monospace_font", fonts.MonospaceFont).
89+ Str("gtk_font", gtkFont).
85 Msg("theme manager initialized")90 Msg("theme manager initialized")
86 91
87 return &Manager{92 return &Manager{
@@ -91,6 +96,7 @@ func NewManager(
91 darkPalette: darkPalette,96 darkPalette: darkPalette,
92 uiScale: uiScale,97 uiScale: uiScale,
93 fonts: fonts,98 fonts: fonts,
99+ gtkFont: gtkFont,
94 modeColors: modeColors,100 modeColors: modeColors,
95 colorResolver: resolver,101 colorResolver: resolver,
96 }102 }
@@ -155,10 +161,12 @@ func (m *Manager) GetWebUIThemeCSS() string {
155 161
156 const gtkDefaultFontPointSize = 11162 const gtkDefaultFontPointSize = 11
157 163
164+func DefaultGTKFont() string { return "Adwaita Sans" }
165+
158 func formatGTKFontName(family string, uiScale float64) string {166 func formatGTKFontName(family string, uiScale float64) string {
159 family = strings.TrimSpace(family)167 family = strings.TrimSpace(family)
160 if family == "" {168 if family == "" {
161- family = DefaultFontConfig().SansFont169+ family = DefaultGTKFont()
162 }170 }
163 if uiScale <= 0 {171 if uiScale <= 0 {
164 uiScale = 1.0172 uiScale = 1.0
@@ -186,7 +194,7 @@ func (m *Manager) ApplyToDisplay(ctx context.Context, display *gdk.Display) {
186 // Generate CSS with current palette, UI scale, fonts, and mode colors194 // Generate CSS with current palette, UI scale, fonts, and mode colors
187 palette := m.GetCurrentPalette()195 palette := m.GetCurrentPalette()
188 css := GenerateCSSFull(palette, m.uiScale, m.fonts, m.modeColors)196 css := GenerateCSSFull(palette, m.uiScale, m.fonts, m.modeColors)
189- fontName := formatGTKFontName(m.fonts.SansFont, m.uiScale)197+ fontName := formatGTKFontName(m.gtkFont, m.uiScale)
190 198
191 settings := gtk.SettingsGetForDisplay(display)199 settings := gtk.SettingsGetForDisplay(display)
192 if settings == nil {200 if settings == nil {
@@ -279,9 +287,11 @@ func (m *Manager) UpdateFromConfig(
279 }287 }
280 288
281 defaults := DefaultFontConfig()289 defaults := DefaultFontConfig()
290+ m.gtkFont = Coalesce(appearance.GtkFont, DefaultGTKFont())
282 m.fonts = FontConfig{291 m.fonts = FontConfig{
283 SansFont: Coalesce(appearance.SansFont, defaults.SansFont),292 SansFont: Coalesce(appearance.SansFont, defaults.SansFont),
284 MonospaceFont: Coalesce(appearance.MonospaceFont, defaults.MonospaceFont),293 MonospaceFont: Coalesce(appearance.MonospaceFont, defaults.MonospaceFont),
294+ GtkFont: m.gtkFont,
285 }295 }
286 296
287 // Update mode colors297 // Update mode colors
@@ -295,6 +305,7 @@ func (m *Manager) UpdateFromConfig(
295 Float64("ui_scale", m.uiScale).305 Float64("ui_scale", m.uiScale).
296 Str("sans_font", m.fonts.SansFont).306 Str("sans_font", m.fonts.SansFont).
297 Str("monospace_font", m.fonts.MonospaceFont).307 Str("monospace_font", m.fonts.MonospaceFont).
308+ Str("gtk_font", m.gtkFont).
298 Msg("theme manager updated from config")309 Msg("theme manager updated from config")
299 310
300 // Re-apply CSS if display is available311 // Re-apply CSS if display is available
M internal/ui/theme/manager_test.go +8 -2
@@ -276,6 +276,7 @@ func TestManager_Fonts(t *testing.T) {
276276 appearance := &entity.AppearanceConfig{
277277 SansFont: "Inter",
278278 MonospaceFont: "JetBrains Mono",
279+ GtkFont: "Adwaita Sans",
279280 }
280281
281282 mockResolver := mocks.NewMockColorSchemeResolver(t)
@@ -314,13 +315,18 @@ func TestManager_ModeColors(t *testing.T) {
314315 assert.Equal(t, "#ffff00", modeColors.ResizeMode)
315316 }
316317
317-func TestFormatGTKFontName_UsesScaledConfiguredSansFont(t *testing.T) {
318- assert.Equal(t, "Fira Sans 14", formatGTKFontName("Fira Sans", 1.3))
318+func TestDefaultGTKFont(t *testing.T) {
319+ assert.Equal(t, "Adwaita Sans", DefaultGTKFont())
320+}
321+
322+func TestFormatGTKFontName_UsesScaledConfiguredGTKFont(t *testing.T) {
323+ assert.Equal(t, "Adwaita Sans 14", formatGTKFontName("Adwaita Sans", 1.3))
319324 }
320325
321326 func TestFormatGTKFontName_DefaultsScaleAndRoundsToNearestPoint(t *testing.T) {
322327 assert.Equal(t, "Inter 11", formatGTKFontName("Inter", 0))
323328 assert.Equal(t, "Inter 12", formatGTKFontName("Inter", 1.05))
329+ assert.Equal(t, "Adwaita Sans 11", formatGTKFontName("", 1.0))
324330 }
325331
326332 func TestShouldApplyGTKFontName(t *testing.T) {
@@ -276,6 +276,7 @@ func TestManager_Fonts(t *testing.T) {
276 appearance := &entity.AppearanceConfig{276 appearance := &entity.AppearanceConfig{
277 SansFont: "Inter",277 SansFont: "Inter",
278 MonospaceFont: "JetBrains Mono",278 MonospaceFont: "JetBrains Mono",
279+ GtkFont: "Adwaita Sans",
279 }280 }
280 281
281 mockResolver := mocks.NewMockColorSchemeResolver(t)282 mockResolver := mocks.NewMockColorSchemeResolver(t)
@@ -314,13 +315,18 @@ func TestManager_ModeColors(t *testing.T) {
314 assert.Equal(t, "#ffff00", modeColors.ResizeMode)315 assert.Equal(t, "#ffff00", modeColors.ResizeMode)
315 }316 }
316 317
317-func TestFormatGTKFontName_UsesScaledConfiguredSansFont(t *testing.T) {318+func TestDefaultGTKFont(t *testing.T) {
318- assert.Equal(t, "Fira Sans 14", formatGTKFontName("Fira Sans", 1.3))319+ assert.Equal(t, "Adwaita Sans", DefaultGTKFont())
320+}
321+
322+func TestFormatGTKFontName_UsesScaledConfiguredGTKFont(t *testing.T) {
323+ assert.Equal(t, "Adwaita Sans 14", formatGTKFontName("Adwaita Sans", 1.3))
319 }324 }
320 325
321 func TestFormatGTKFontName_DefaultsScaleAndRoundsToNearestPoint(t *testing.T) {326 func TestFormatGTKFontName_DefaultsScaleAndRoundsToNearestPoint(t *testing.T) {
322 assert.Equal(t, "Inter 11", formatGTKFontName("Inter", 0))327 assert.Equal(t, "Inter 11", formatGTKFontName("Inter", 0))
323 assert.Equal(t, "Inter 12", formatGTKFontName("Inter", 1.05))328 assert.Equal(t, "Inter 12", formatGTKFontName("Inter", 1.05))
329+ assert.Equal(t, "Adwaita Sans 11", formatGTKFontName("", 1.0))
324 }330 }
325 331
326 func TestShouldApplyGTKFontName(t *testing.T) {332 func TestShouldApplyGTKFontName(t *testing.T) {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close