fix: apply theme logo scale reliably
This commit is contained in:
@@ -1516,6 +1516,7 @@ _INITIAL_THEME_TOKEN_CSS_MAP = {
|
|||||||
"font_sans": "--font-sans",
|
"font_sans": "--font-sans",
|
||||||
"font_logo": "--font-logo",
|
"font_logo": "--font-logo",
|
||||||
"font_mono": "--font-mono",
|
"font_mono": "--font-mono",
|
||||||
|
"home_logo_scale": "--home-logo-scale",
|
||||||
"admin_bg": "--admin-bg",
|
"admin_bg": "--admin-bg",
|
||||||
"admin_surface": "--admin-surface",
|
"admin_surface": "--admin-surface",
|
||||||
"admin_surface_2": "--admin-surface-2",
|
"admin_surface_2": "--admin-surface-2",
|
||||||
@@ -1570,6 +1571,14 @@ def _initial_theme_head_markup(request: web.Request, theme: Any, primary_color:
|
|||||||
tokens = tokens if isinstance(tokens, dict) else {}
|
tokens = tokens if isinstance(tokens, dict) else {}
|
||||||
declarations = []
|
declarations = []
|
||||||
for token_key, css_name in _INITIAL_THEME_TOKEN_CSS_MAP.items():
|
for token_key, css_name in _INITIAL_THEME_TOKEN_CSS_MAP.items():
|
||||||
|
if token_key == "home_logo_scale":
|
||||||
|
try:
|
||||||
|
scale = float(tokens.get(token_key) or 0)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
continue
|
||||||
|
if scale > 0:
|
||||||
|
declarations.append(f"{css_name}:{scale / 100:g}")
|
||||||
|
continue
|
||||||
value = str(tokens.get(token_key) or "").strip()
|
value = str(tokens.get(token_key) or "").strip()
|
||||||
if value:
|
if value:
|
||||||
declarations.append(f"{css_name}:{value}")
|
declarations.append(f"{css_name}:{value}")
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export function createThemesStore({ api, onThemesSaved, flash, at }) {
|
|||||||
themesDir: data.themes_dir || s.themesDir,
|
themesDir: data.themes_dir || s.themesDir,
|
||||||
}));
|
}));
|
||||||
if (!silent) flash(at("themes_saved", {}, "Темы сохранены"));
|
if (!silent) flash(at("themes_saved", {}, "Темы сохранены"));
|
||||||
if (typeof onThemesSaved === "function") onThemesSaved();
|
if (typeof onThemesSaved === "function") await onThemesSaved();
|
||||||
} else {
|
} else {
|
||||||
flash(data?.message || data?.error || at("themes_save_failed", {}, "Не удалось сохранить"));
|
flash(data?.message || data?.error || at("themes_save_failed", {}, "Не удалось сохранить"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,25 @@
|
|||||||
let className = "";
|
let className = "";
|
||||||
export { className as class };
|
export { className as class };
|
||||||
|
|
||||||
$: sliderValue = Number(value ?? min ?? 0);
|
|
||||||
$: sliderMin = min === undefined ? undefined : Number(min);
|
$: sliderMin = min === undefined ? undefined : Number(min);
|
||||||
$: sliderMax = max === undefined ? undefined : Number(max);
|
$: sliderMax = max === undefined ? undefined : Number(max);
|
||||||
$: sliderStep = step === undefined ? undefined : Number(step);
|
$: sliderStep = step === undefined ? undefined : Number(step);
|
||||||
|
$: sliderValue = normalizeSliderValue(value, sliderMin ?? 0);
|
||||||
|
|
||||||
|
function normalizeSliderValue(next, fallback = 0) {
|
||||||
|
const raw = Array.isArray(next) ? next[0] : next;
|
||||||
|
const numeric = Number(raw);
|
||||||
|
return Number.isFinite(numeric) ? numeric : fallback;
|
||||||
|
}
|
||||||
|
|
||||||
function handleValueChange(next) {
|
function handleValueChange(next) {
|
||||||
value = next;
|
const normalized = normalizeSliderValue(next, sliderMin ?? 0);
|
||||||
onValueChange(next);
|
value = normalized;
|
||||||
|
onValueChange(normalized);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleValueCommit(next) {
|
||||||
|
onValueCommit(normalizeSliderValue(next, sliderMin ?? 0));
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -33,7 +44,7 @@
|
|||||||
step={sliderStep}
|
step={sliderStep}
|
||||||
{disabled}
|
{disabled}
|
||||||
onValueChange={handleValueChange}
|
onValueChange={handleValueChange}
|
||||||
{onValueCommit}
|
onValueCommit={handleValueCommit}
|
||||||
{...$$restProps}
|
{...$$restProps}
|
||||||
>
|
>
|
||||||
<Slider.Range class="ui-range-input__range" />
|
<Slider.Range class="ui-range-input__range" />
|
||||||
|
|||||||
@@ -646,6 +646,7 @@ class WebAppAssetTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
def test_initial_theme_head_markup_includes_css_and_tokens(self):
|
def test_initial_theme_head_markup_includes_css_and_tokens(self):
|
||||||
cfg = builtin_webapp_themes_config("#123456")
|
cfg = builtin_webapp_themes_config("#123456")
|
||||||
theme = cfg.theme_by_key("light")
|
theme = cfg.theme_by_key("light")
|
||||||
|
theme.tokens.home_logo_scale = 135
|
||||||
request = SimpleNamespace(get=lambda key, default="": "nonce-value")
|
request = SimpleNamespace(get=lambda key, default="": "nonce-value")
|
||||||
|
|
||||||
markup = subscription_webapp._initial_theme_head_markup(request, theme, "#123456")
|
markup = subscription_webapp._initial_theme_head_markup(request, theme, "#123456")
|
||||||
@@ -653,6 +654,7 @@ class WebAppAssetTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
self.assertIn("/webapp-theme-css/light/style.css?v=", markup)
|
self.assertIn("/webapp-theme-css/light/style.css?v=", markup)
|
||||||
self.assertIn('nonce="nonce-value"', markup)
|
self.assertIn('nonce="nonce-value"', markup)
|
||||||
self.assertIn("--accent:#123456", markup)
|
self.assertIn("--accent:#123456", markup)
|
||||||
|
self.assertIn("--home-logo-scale:1.35", markup)
|
||||||
self.assertIn("color-scheme:light", markup)
|
self.assertIn("color-scheme:light", markup)
|
||||||
|
|
||||||
def test_theme_asset_version_bumps_for_saved_default_css_theme(self):
|
def test_theme_asset_version_bumps_for_saved_default_css_theme(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user