diff --git a/src/ui/app.rs b/src/ui/app.rs
index 801b580c3585203a1b8eadc74a277380cae24b74..a5a1ba1f9abb6a0383cca134da2f92dbfa3a1b41 100644
--- a/src/ui/app.rs
+++ b/src/ui/app.rs
@@ -427,6 +427,10 @@ impl Behavior<Pane> for AppBehavior {
     fn tab_title_for_pane(&mut self, _pane: &Pane) -> egui::WidgetText {
         "Tab".into()
     }
+
+    fn min_size(&self) -> f32 {
+        200.0
+    }
 }
 
 #[derive(Clone)]
diff --git a/src/ui/panes/valve_control.rs b/src/ui/panes/valve_control.rs
index 91cf456b7b82d0f36b8561b6d2bdb627a168e6f7..87fd3e7262cb93d5567861a67017ba0e468c9f43 100644
--- a/src/ui/panes/valve_control.rs
+++ b/src/ui/panes/valve_control.rs
@@ -145,9 +145,11 @@ impl PaneBehavior for ValveControlPane {
 impl ValveControlPane {
     fn pane_ui(&mut self) -> impl FnOnce(&mut Ui) {
         |ui| {
-            let valve_chunks = Valve::iter().enumerate().chunks(3);
+            ui.set_min_width(200.0);
+            let n = (ui.max_rect().width() / 200.0) as usize;
+            let valve_chunks = Valve::iter().enumerate().chunks(n);
             Grid::new("valves_grid")
-                .num_columns(3)
+                .num_columns(n)
                 .spacing(Vec2::splat(5.))
                 .show(ui, |ui| {
                     for chunk in &valve_chunks {