diff --git a/bevy_kayak_ui/src/render/unified/pipeline.rs b/bevy_kayak_ui/src/render/unified/pipeline.rs
index b09888438c059a0e263810087da7e7aaca6c6573..562a110362b8bb4221627387f905d38c36da60ca 100644
--- a/bevy_kayak_ui/src/render/unified/pipeline.rs
+++ b/bevy_kayak_ui/src/render/unified/pipeline.rs
@@ -594,6 +594,12 @@ impl Draw<TransparentUI> for DrawUI {
             if width == 0 || height == 0 {
                 return;
             }
+            if x + width > window_size.0 as u32 {
+                width = window_size.0 as u32 - x;
+            }
+            if y + height > window_size.1 as u32 {
+                height = window_size.1 as u32 - y;
+            }
             pass.set_scissor_rect(x, y, width, height);
             return;
         }
diff --git a/examples/full_ui.rs b/examples/full_ui.rs
index 9295e4e6d3a3086fb60d39667f148e32a212c530..94bed23459cf67fe726dcfb7638d0c37d63774ec 100644
--- a/examples/full_ui.rs
+++ b/examples/full_ui.rs
@@ -52,7 +52,7 @@ fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>)
     };
 
     let cloned_current_button_handle = current_button_handle.clone();
-    let on_event = OnEvent::new(move |_context, event| match event.event_type {
+    let on_event = OnEvent::new(move |_, event| match event.event_type {
         EventType::MouseIn => {
             cloned_current_button_handle.set(blue_button_hover_handle);
         }
diff --git a/examples/todo/card.rs b/examples/todo/card.rs
index 7bb615c616307f324a11019b73900e76df4d1300..8134e5564db50d7fb545d4ff8bd720ca923f5c95 100644
--- a/examples/todo/card.rs
+++ b/examples/todo/card.rs
@@ -9,7 +9,6 @@ use super::delete_button::DeleteButton;
 
 #[widget]
 pub fn Card(card_id: usize, name: String, on_delete: Handler<usize>) {
-    let name = name.clone();
     let background_styles = Style {
         layout_type: StyleProp::Value(LayoutType::Row),
         background_color: StyleProp::Value(Color::new(0.176, 0.196, 0.215, 1.0)),
@@ -23,7 +22,6 @@ pub fn Card(card_id: usize, name: String, on_delete: Handler<usize>) {
     };
 
     let on_delete = on_delete.clone();
-    let card_id = *card_id;
     let on_event = OnEvent::new(move |_, event| match event.event_type {
         EventType::Click => {
             on_delete.call(card_id);
diff --git a/kayak_core/src/node.rs b/kayak_core/src/node.rs
index 91023eb5a3b25cf0104cbae02d2036845e5f815b..d07d5343d445dfd360568a19dafbbdeb009ac251 100644
--- a/kayak_core/src/node.rs
+++ b/kayak_core/src/node.rs
@@ -142,11 +142,29 @@ impl<'a> morphorm::Node<'a> for Index {
         Some(morphorm::Units::Auto)
     }
 
-    fn max_width(&self, _store: &'_ Self::Data) -> Option<morphorm::Units> {
+    fn max_width(&self, store: &'_ Self::Data) -> Option<morphorm::Units> {
+        if let Some(node) = store.get(*self) {
+            if let Some(node) = node {
+                return match node.styles.max_width {
+                    StyleProp::Default => Some(morphorm::Units::Auto),
+                    StyleProp::Value(prop) => Some(prop),
+                    _ => Some(morphorm::Units::Auto),
+                };
+            }
+        }
         Some(morphorm::Units::Auto)
     }
 
-    fn max_height(&self, _store: &'_ Self::Data) -> Option<morphorm::Units> {
+    fn max_height(&self, store: &'_ Self::Data) -> Option<morphorm::Units> {
+        if let Some(node) = store.get(*self) {
+            if let Some(node) = node {
+                return match node.styles.max_height {
+                    StyleProp::Default => Some(morphorm::Units::Auto),
+                    StyleProp::Value(prop) => Some(prop),
+                    _ => Some(morphorm::Units::Auto),
+                };
+            }
+        }
         Some(morphorm::Units::Auto)
     }
 
diff --git a/kayak_core/src/styles.rs b/kayak_core/src/styles.rs
index 850f17bdf11f59084f2772335ff42aa9739f5657..51767b5816d1366262fd4613c0c6a7cf9f6b8422 100644
--- a/kayak_core/src/styles.rs
+++ b/kayak_core/src/styles.rs
@@ -55,6 +55,8 @@ pub struct Style {
     pub margin_bottom: StyleProp<Units>,
     pub min_width: StyleProp<Units>,
     pub min_height: StyleProp<Units>,
+    pub max_width: StyleProp<Units>,
+    pub max_height: StyleProp<Units>,
 }
 
 impl Default for Style {
@@ -82,6 +84,8 @@ impl Default for Style {
             margin_bottom: StyleProp::Default,
             min_width: StyleProp::Default,
             min_height: StyleProp::Default,
+            max_width: StyleProp::Default,
+            max_height: StyleProp::Default,
         }
     }
 }
diff --git a/kayak_render_macros/src/function_component.rs b/kayak_render_macros/src/function_component.rs
index 9e96becd339b920736a4fb0bfa70d1b1d858bd36..58c4e29fce0e8144e2e8739517a80da1447683da 100644
--- a/kayak_render_macros/src/function_component.rs
+++ b/kayak_render_macros/src/function_component.rs
@@ -141,6 +141,7 @@ pub fn create_function_widget(f: syn::ItemFn, widget_arguments: WidgetArguments)
     } else {
         quote!(
             let #struct_name { #(#input_names),*, styles, .. } = self;
+            #(let #input_names = #input_names.clone();)*
         )
     };
 
diff --git a/kayak_widgets/src/if_element.rs b/kayak_widgets/src/if_element.rs
index bcf9b94465faaedb1bf06222d5019c237b6e10e7..c2e29174ae80458c0fbc67180a34ad3ff272dcaf 100644
--- a/kayak_widgets/src/if_element.rs
+++ b/kayak_widgets/src/if_element.rs
@@ -2,7 +2,7 @@ use kayak_ui::core::{rsx, widget, Children};
 
 #[widget]
 pub fn If(children: Children, condition: bool) {
-    if *condition {
+    if condition {
         rsx! {
             <>
                 {children}
diff --git a/kayak_widgets/src/image.rs b/kayak_widgets/src/image.rs
index 8e2d2f500ac43946cba05ad9cd3720742cee10e5..c44cb604da9d967b9655e20bd8862b3588c194f9 100644
--- a/kayak_widgets/src/image.rs
+++ b/kayak_widgets/src/image.rs
@@ -8,7 +8,7 @@ use kayak_ui::core::{
 #[widget]
 pub fn Image(handle: u16, children: Children) {
     *styles = Some(Style {
-        render_command: StyleProp::Value(RenderCommand::Image { handle: *handle }),
+        render_command: StyleProp::Value(RenderCommand::Image { handle }),
         ..styles.clone().unwrap_or_default()
     });
 
diff --git a/kayak_widgets/src/nine_patch.rs b/kayak_widgets/src/nine_patch.rs
index c31f774f6a2a51191601ee336fca7babf37e8cec..f491da9c2d009b5d1e8fcff892b58693f39dddd7 100644
--- a/kayak_widgets/src/nine_patch.rs
+++ b/kayak_widgets/src/nine_patch.rs
@@ -9,10 +9,7 @@ use kayak_ui::core::{
 #[widget]
 pub fn NinePatch(handle: u16, border: Space, children: Children) {
     *styles = Some(Style {
-        render_command: StyleProp::Value(RenderCommand::NinePatch {
-            handle: *handle,
-            border: *border,
-        }),
+        render_command: StyleProp::Value(RenderCommand::NinePatch { handle, border }),
         ..styles.clone().unwrap_or_default()
     });
 
diff --git a/kayak_widgets/src/text.rs b/kayak_widgets/src/text.rs
index 93573579d42f1405088198d5dba4108dfd13cf81..dbaf3498d1454f12bc88df62edeac8e04f94799b 100644
--- a/kayak_widgets/src/text.rs
+++ b/kayak_widgets/src/text.rs
@@ -7,8 +7,8 @@ use kayak_ui::core::{
 #[widget]
 pub fn Text(size: f32, content: String, styles: Option<Style>) {
     let render_command = RenderCommand::Text {
-        content: content.clone(),
-        size: *size,
+        content,
+        size,
         font: 0, // TODO: Support font passing here. Perhaps move to style?
     };
     *styles = Some(Style {
diff --git a/kayak_widgets/src/text_box.rs b/kayak_widgets/src/text_box.rs
index 75e43c767f64b5b0b12319e8a127cd9783313d16..2a7f61200db0eb59418a59afba399cfa223b35eb 100644
--- a/kayak_widgets/src/text_box.rs
+++ b/kayak_widgets/src/text_box.rs
@@ -39,12 +39,21 @@ pub struct Focus(pub bool);
 
 #[widget(focusable)]
 pub fn TextBox(value: String, on_change: Option<OnChange>, placeholder: Option<String>) {
+    let current_styles = styles.clone().unwrap_or_default();
     *styles = Some(Style {
         render_command: StyleProp::Value(RenderCommand::Layout),
         height: StyleProp::Value(Units::Pixels(26.0)),
-        top: StyleProp::Value(Units::Pixels(0.0)),
-        bottom: StyleProp::Value(Units::Pixels(0.0)),
-        ..styles.clone().unwrap_or_default()
+        top: if matches!(current_styles.top, StyleProp::Value { .. }) {
+            current_styles.top.clone()
+        } else {
+            StyleProp::Value(Units::Pixels(0.0))
+        },
+        bottom: if matches!(current_styles.bottom, StyleProp::Value { .. }) {
+            current_styles.top.clone()
+        } else {
+            StyleProp::Value(Units::Pixels(0.0))
+        },
+        ..current_styles
     });
 
     let background_styles = Style {
@@ -105,4 +114,4 @@ pub fn TextBox(value: String, on_change: Option<OnChange>, placeholder: Option<S
 /// Context: [Wikipedia](https://en.wikipedia.org/wiki/Backspace#Common_use)
 fn is_backspace(c: char) -> bool {
     c == '\u{8}' || c == '\u{7f}'
-}
\ No newline at end of file
+}
diff --git a/kayak_widgets/src/window.rs b/kayak_widgets/src/window.rs
index c2cdee37d15ede5feafa649e5c86a06a470db3a0..0b9abc5207c0d8df62e7e5cbf6e84cebe645663c 100644
--- a/kayak_widgets/src/window.rs
+++ b/kayak_widgets/src/window.rs
@@ -25,6 +25,8 @@ pub fn Window(
         top: StyleProp::Value(Units::Pixels(position.1)),
         width: StyleProp::Value(Units::Pixels(size.0)),
         height: StyleProp::Value(Units::Pixels(size.1)),
+        max_width: StyleProp::Value(Units::Pixels(size.0)),
+        max_height: StyleProp::Value(Units::Pixels(size.1)),
         ..styles.clone().unwrap_or_default()
     });