diff --git a/solvronix_desk/hooks.py b/solvronix_desk/hooks.py
index 4f792c9..8292cbb 100644
--- a/solvronix_desk/hooks.py
+++ b/solvronix_desk/hooks.py
@@ -18,7 +18,7 @@
# ── AUTHENTICATED DESK ASSETS ──────────────────────────────────────────────────
# Query versions are bumped whenever an asset changes to invalidate browser cache.
app_include_css = [
- "/assets/solvronix_desk/css/solvronix_desk.css?v=51",
+ "/assets/solvronix_desk/css/solvronix_desk.css?v=52",
"/assets/solvronix_desk/css/sidebar.css?v=21",
"/assets/solvronix_desk/css/command_palette.css?v=4",
"/assets/solvronix_desk/css/smart_home.css?v=7",
diff --git a/solvronix_desk/public/css/solvronix_desk.css b/solvronix_desk/public/css/solvronix_desk.css
index 52c7a06..277976f 100644
--- a/solvronix_desk/public/css/solvronix_desk.css
+++ b/solvronix_desk/public/css/solvronix_desk.css
@@ -2460,3 +2460,21 @@ html[dir="rtl"] #st-lang-dropdown {
background: var(--st-brand);
color: white;
}
+
+/* ── DASHBOARD CHART GRID OVERFLOW FIX ───────────────────────────────────────
+ Frappe's own .widget-group .grid-col-2 uses bare `1fr 1fr` tracks, which
+ default to minmax(auto, 1fr) — the track's minimum is its content's
+ max-content size, not 0. Frappe Charts' own ResizeObserver reads the
+ rendered chart container width to redraw responsively; because the track
+ can grow to fit content instead of being capped at the container, each
+ redraw can nudge the track wider, which nudges the chart wider next time —
+ a feedback loop that pushes the second column further right on every
+ resize cycle until it's cut off past the viewport edge. minmax(0, 1fr)
+ hard-caps the track at its fair share of the container, breaking the
+ loop; min-width: 0 does the same for the grid item itself. */
+.widget-group .grid-col-2 {
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) !important;
+}
+.widget-group .grid-col-2 > .widget.dashboard-widget-box {
+ min-width: 0;
+}
diff --git a/solvronix_desk/solvronix_desk/page/smart_home/smart_home.js b/solvronix_desk/solvronix_desk/page/smart_home/smart_home.js
index 032baa5..83591ae 100644
--- a/solvronix_desk/solvronix_desk/page/smart_home/smart_home.js
+++ b/solvronix_desk/solvronix_desk/page/smart_home/smart_home.js
@@ -108,7 +108,7 @@ solvronix_desk.SmartHome = class SmartHome {
this._icon("edit", "sm") +
'' + __("Customize layout") + '' +
'' +
- '' +
+ '' +
__("All Workspaces") + ' →' +
'' +
'' +
diff --git a/tests/test_workspace_editorjs_popover_css.py b/tests/test_workspace_editorjs_popover_css.py
index 5fbd91a..6e68fa6 100644
--- a/tests/test_workspace_editorjs_popover_css.py
+++ b/tests/test_workspace_editorjs_popover_css.py
@@ -39,7 +39,7 @@ def test_block_with_open_editorjs_popover_is_promoted_before_focus(self):
def test_workspace_css_cache_is_bumped(self):
hooks = HOOKS.read_text(encoding="utf-8")
- self.assertIn("/assets/solvronix_desk/css/solvronix_desk.css?v=51", hooks)
+ self.assertIn("/assets/solvronix_desk/css/solvronix_desk.css?v=52", hooks)
self.assertIn("/assets/solvronix_desk/js/solvronix_desk.js?v=51", hooks)