fix(theme): scale remaining fixed CSS dimensions (#440)
* fix(theme): scale auxiliary CSS dimensions * fix(theme): preserve baseline CSS dimensions
- commit
- a015def7b20f22b5e05faaa83f351730c4969801
- author
- bnema · · 2026-09-15 04:53 UTC
- committer
- GitHub · · 2026-09-15 04:53 UTC
- parent
- fc90745
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
2 files · +36 -16
M internal/ui/theme/css.go +16 -16
| @@ -874,22 +874,22 @@ func generatePaneCSS(p Palette) string { | |||
| 874 | 874 | } | |
| 875 | 875 | ||
| 876 | 876 | .loading-skeleton-spinner { | |
| 877 | - | -gtk-icon-size: 32px; | |
| 878 | - | min-width: 32px; | |
| 879 | - | min-height: 32px; | |
| 877 | + | -gtk-icon-size: 2.1818em; | |
| 878 | + | min-width: 2.1818em; | |
| 879 | + | min-height: 2.1818em; | |
| 880 | 880 | color: var(--muted); | |
| 881 | 881 | opacity: 0.4; | |
| 882 | 882 | } | |
| 883 | 883 | ||
| 884 | 884 | .loading-skeleton-logo { | |
| 885 | 885 | opacity: 0.08; | |
| 886 | - | min-width: 256px; | |
| 887 | - | min-height: 256px; | |
| 886 | + | min-width: 17.4545em; | |
| 887 | + | min-height: 17.4545em; | |
| 888 | 888 | } | |
| 889 | 889 | ||
| 890 | 890 | .loading-skeleton-version { | |
| 891 | 891 | opacity: 0.25; | |
| 892 | - | font-size: 13px; | |
| 892 | + | font-size: 0.8864em; | |
| 893 | 893 | color: var(--muted); | |
| 894 | 894 | } | |
| 895 | 895 | ||
| @@ -979,11 +979,11 @@ func generateStackedPaneCSS(p Palette) string { | |||
| 979 | 979 | .stacked-pane-close-button { | |
| 980 | 980 | background: transparent; | |
| 981 | 981 | border: none; | |
| 982 | - | border-radius: 4px; | |
| 983 | - | padding: 4px; | |
| 984 | - | margin: 0 2px; | |
| 985 | - | min-width: 20px; | |
| 986 | - | min-height: 20px; | |
| 982 | + | border-radius: 0.2727em; | |
| 983 | + | padding: 0.2727em; | |
| 984 | + | margin: 0 0.1364em; | |
| 985 | + | min-width: 1.3636em; | |
| 986 | + | min-height: 1.3636em; | |
| 987 | 987 | opacity: 0.4; | |
| 988 | 988 | transition: opacity 100ms ease-in-out, background-color 100ms ease-in-out; | |
| 989 | 989 | } | |
| @@ -1020,20 +1020,20 @@ func generateProgressBarCSS(p Palette) string { | |||
| 1020 | 1020 | ||
| 1021 | 1021 | /* Native GtkProgressBar with osd class */ | |
| 1022 | 1022 | progressbar.osd { | |
| 1023 | - | min-height: 4px; | |
| 1023 | + | min-height: 0.2727em; | |
| 1024 | 1024 | } | |
| 1025 | 1025 | ||
| 1026 | 1026 | progressbar.osd trough { | |
| 1027 | - | min-height: 4px; | |
| 1028 | - | min-width: 2px; | |
| 1027 | + | min-height: 0.2727em; | |
| 1028 | + | min-width: 0.1364em; | |
| 1029 | 1029 | margin: 0; | |
| 1030 | 1030 | padding: 0; | |
| 1031 | 1031 | background-color: alpha(var(--bg), 0.3); | |
| 1032 | 1032 | } | |
| 1033 | 1033 | ||
| 1034 | 1034 | progressbar.osd progress { | |
| 1035 | - | min-height: 4px; | |
| 1036 | - | min-width: 2px; | |
| 1035 | + | min-height: 0.2727em; | |
| 1036 | + | min-width: 0.1364em; | |
| 1037 | 1037 | margin: 0; | |
| 1038 | 1038 | padding: 0; | |
| 1039 | 1039 | background-color: var(--accent); | |
| @@ -874,22 +874,22 @@ func generatePaneCSS(p Palette) string { | |||||
| 874 | } | 874 | } | ||
| 875 | 875 | ||||
| 876 | .loading-skeleton-spinner { | 876 | .loading-skeleton-spinner { | ||
| 877 | - | -gtk-icon-size: 32px; | 877 | + | -gtk-icon-size: 2.1818em; |
| 878 | - | min-width: 32px; | 878 | + | min-width: 2.1818em; |
| 879 | - | min-height: 32px; | 879 | + | min-height: 2.1818em; |
| 880 | color: var(--muted); | 880 | color: var(--muted); | ||
| 881 | opacity: 0.4; | 881 | opacity: 0.4; | ||
| 882 | } | 882 | } | ||
| 883 | 883 | ||||
| 884 | .loading-skeleton-logo { | 884 | .loading-skeleton-logo { | ||
| 885 | opacity: 0.08; | 885 | opacity: 0.08; | ||
| 886 | - | min-width: 256px; | 886 | + | min-width: 17.4545em; |
| 887 | - | min-height: 256px; | 887 | + | min-height: 17.4545em; |
| 888 | } | 888 | } | ||
| 889 | 889 | ||||
| 890 | .loading-skeleton-version { | 890 | .loading-skeleton-version { | ||
| 891 | opacity: 0.25; | 891 | opacity: 0.25; | ||
| 892 | - | font-size: 13px; | 892 | + | font-size: 0.8864em; |
| 893 | color: var(--muted); | 893 | color: var(--muted); | ||
| 894 | } | 894 | } | ||
| 895 | 895 | ||||
| @@ -979,11 +979,11 @@ func generateStackedPaneCSS(p Palette) string { | |||||
| 979 | .stacked-pane-close-button { | 979 | .stacked-pane-close-button { | ||
| 980 | background: transparent; | 980 | background: transparent; | ||
| 981 | border: none; | 981 | border: none; | ||
| 982 | - | border-radius: 4px; | 982 | + | border-radius: 0.2727em; |
| 983 | - | padding: 4px; | 983 | + | padding: 0.2727em; |
| 984 | - | margin: 0 2px; | 984 | + | margin: 0 0.1364em; |
| 985 | - | min-width: 20px; | 985 | + | min-width: 1.3636em; |
| 986 | - | min-height: 20px; | 986 | + | min-height: 1.3636em; |
| 987 | opacity: 0.4; | 987 | opacity: 0.4; | ||
| 988 | transition: opacity 100ms ease-in-out, background-color 100ms ease-in-out; | 988 | transition: opacity 100ms ease-in-out, background-color 100ms ease-in-out; | ||
| 989 | } | 989 | } | ||
| @@ -1020,20 +1020,20 @@ func generateProgressBarCSS(p Palette) string { | |||||
| 1020 | 1020 | ||||
| 1021 | /* Native GtkProgressBar with osd class */ | 1021 | /* Native GtkProgressBar with osd class */ | ||
| 1022 | progressbar.osd { | 1022 | progressbar.osd { | ||
| 1023 | - | min-height: 4px; | 1023 | + | min-height: 0.2727em; |
| 1024 | } | 1024 | } | ||
| 1025 | 1025 | ||||
| 1026 | progressbar.osd trough { | 1026 | progressbar.osd trough { | ||
| 1027 | - | min-height: 4px; | 1027 | + | min-height: 0.2727em; |
| 1028 | - | min-width: 2px; | 1028 | + | min-width: 0.1364em; |
| 1029 | margin: 0; | 1029 | margin: 0; | ||
| 1030 | padding: 0; | 1030 | padding: 0; | ||
| 1031 | background-color: alpha(var(--bg), 0.3); | 1031 | background-color: alpha(var(--bg), 0.3); | ||
| 1032 | } | 1032 | } | ||
| 1033 | 1033 | ||||
| 1034 | progressbar.osd progress { | 1034 | progressbar.osd progress { | ||
| 1035 | - | min-height: 4px; | 1035 | + | min-height: 0.2727em; |
| 1036 | - | min-width: 2px; | 1036 | + | min-width: 0.1364em; |
| 1037 | margin: 0; | 1037 | margin: 0; | ||
| 1038 | padding: 0; | 1038 | padding: 0; | ||
| 1039 | background-color: var(--accent); | 1039 | background-color: var(--accent); | ||
M internal/ui/theme/css_test.go +20 -0
| @@ -252,6 +252,26 @@ func TestGenerateCSSWithScale_UsesMediumWeightForOmniboxSuggestionTitle(t *testi | |||
| 252 | 252 | assert.NotContains(t, css, ".omnibox-suggestion-title {\n\tfont-size: 0.875em;\n\tcolor: var(--text);\n\tfont-weight: 400;") | |
| 253 | 253 | } | |
| 254 | 254 | ||
| 255 | + | func TestGenerateCSS_AuxiliaryWidgetDimensionsUseScalableUnits(t *testing.T) { | |
| 256 | + | css := GenerateCSS(DefaultDarkPalette()) | |
| 257 | + | ||
| 258 | + | selectors := []string{ | |
| 259 | + | ".loading-skeleton-spinner", | |
| 260 | + | ".loading-skeleton-logo", | |
| 261 | + | ".loading-skeleton-version", | |
| 262 | + | ".stacked-pane-close-button", | |
| 263 | + | "progressbar.osd", | |
| 264 | + | "progressbar.osd trough", | |
| 265 | + | "progressbar.osd progress", | |
| 266 | + | } | |
| 267 | + | pxDimension := regexp.MustCompile(`(?m)^\s*(?:-gtk-icon-size|font-size|min-width|min-height|padding|margin|border-radius):[^;]*\dpx`) | |
| 268 | + | for _, selector := range selectors { | |
| 269 | + | block := cssRuleBlock(t, css, selector) | |
| 270 | + | assert.NotRegexp(t, pxDimension, block, selector) | |
| 271 | + | assert.Regexp(t, `\d(?:\.\d+)?em`, block, selector) | |
| 272 | + | } | |
| 273 | + | } | |
| 274 | + | ||
| 255 | 275 | func TestGenerateCSS_OmniboxOuterBordersUseScalableEmUnits(t *testing.T) { | |
| 256 | 276 | css := GenerateCSS(DefaultDarkPalette()) | |
| 257 | 277 | ||
| @@ -252,6 +252,26 @@ func TestGenerateCSSWithScale_UsesMediumWeightForOmniboxSuggestionTitle(t *testi | |||||
| 252 | assert.NotContains(t, css, ".omnibox-suggestion-title {\n\tfont-size: 0.875em;\n\tcolor: var(--text);\n\tfont-weight: 400;") | 252 | assert.NotContains(t, css, ".omnibox-suggestion-title {\n\tfont-size: 0.875em;\n\tcolor: var(--text);\n\tfont-weight: 400;") | ||
| 253 | } | 253 | } | ||
| 254 | 254 | ||||
| 255 | + | func TestGenerateCSS_AuxiliaryWidgetDimensionsUseScalableUnits(t *testing.T) { | |||
| 256 | + | css := GenerateCSS(DefaultDarkPalette()) | |||
| 257 | + | ||||
| 258 | + | selectors := []string{ | |||
| 259 | + | ".loading-skeleton-spinner", | |||
| 260 | + | ".loading-skeleton-logo", | |||
| 261 | + | ".loading-skeleton-version", | |||
| 262 | + | ".stacked-pane-close-button", | |||
| 263 | + | "progressbar.osd", | |||
| 264 | + | "progressbar.osd trough", | |||
| 265 | + | "progressbar.osd progress", | |||
| 266 | + | } | |||
| 267 | + | pxDimension := regexp.MustCompile(`(?m)^\s*(?:-gtk-icon-size|font-size|min-width|min-height|padding|margin|border-radius):[^;]*\dpx`) | |||
| 268 | + | for _, selector := range selectors { | |||
| 269 | + | block := cssRuleBlock(t, css, selector) | |||
| 270 | + | assert.NotRegexp(t, pxDimension, block, selector) | |||
| 271 | + | assert.Regexp(t, `\d(?:\.\d+)?em`, block, selector) | |||
| 272 | + | } | |||
| 273 | + | } | |||
| 274 | + | ||||
| 255 | func TestGenerateCSS_OmniboxOuterBordersUseScalableEmUnits(t *testing.T) { | 275 | func TestGenerateCSS_OmniboxOuterBordersUseScalableEmUnits(t *testing.T) { | ||
| 256 | css := GenerateCSS(DefaultDarkPalette()) | 276 | css := GenerateCSS(DefaultDarkPalette()) | ||
| 257 | 277 | ||||