diff --git a/TODO b/TODO
index 1d4f2d7600350872ac53c4e536530f337e1e07f2..795e37b2268a3c9c6998233ac8f3475e4678ee1f 100644
--- a/TODO
+++ b/TODO
@@ -3,8 +3,6 @@
 
 BUGS INTRODUCED:
 
-[ ] Not all text boxes want to be click-selectable
-    Make utils.rs in examples; move click functions there.
 
 BUGS SQUASHED:
 
@@ -20,3 +18,6 @@ BUGS SQUASHED:
     Used to redraw on click, now redraws on scroll or drag?
     Now drag doesn't work either (tested on readonly, might be that)
       fixed by percentage-select fix
+
+[x] Not all text boxes want to be click-selectable
+    Make utils.rs in examples; move click functions there.
diff --git a/examples/bevy_api_testing.rs b/examples/bevy_api_testing.rs
index c2677d11076e29f91435c7e66174040df8b6c527..fcb9bc8f0abac266939ecf841e7671c7db8654d7 100644
--- a/examples/bevy_api_testing.rs
+++ b/examples/bevy_api_testing.rs
@@ -1,6 +1,7 @@
 use bevy::prelude::*;
 use bevy_cosmic_edit::{
-    ActiveEditor, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicEditUiBundle,
+    change_active_editor_sprite, change_active_editor_ui, ActiveEditor, CosmicEditPlugin,
+    CosmicEditSpriteBundle, CosmicEditUiBundle,
 };
 
 fn setup(mut commands: Commands) {
@@ -42,5 +43,7 @@ fn main() {
         .add_plugins(DefaultPlugins)
         .add_plugins(CosmicEditPlugin::default())
         .add_systems(Startup, setup)
+        .add_systems(Update, change_active_editor_ui)
+        .add_systems(Update, change_active_editor_sprite)
         .run();
 }
diff --git a/examples/font_per_widget.rs b/examples/font_per_widget.rs
index 59687bb43a21a8dee00204ddbe1164a9d0dd5113..50d0843d14160b3d9d57981b18dd49eec0439a10 100644
--- a/examples/font_per_widget.rs
+++ b/examples/font_per_widget.rs
@@ -1,6 +1,8 @@
 #![allow(clippy::type_complexity)]
 
 use bevy::{prelude::*, window::PrimaryWindow};
+use bevy_cosmic_edit::change_active_editor_sprite;
+use bevy_cosmic_edit::change_active_editor_ui;
 use bevy_cosmic_edit::{
     ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig,
     CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition,
@@ -292,5 +294,7 @@ fn main() {
         .add_plugins(DefaultPlugins)
         .add_plugins(CosmicEditPlugin { font_config })
         .add_systems(Startup, setup)
+        .add_systems(Update, change_active_editor_ui)
+        .add_systems(Update, change_active_editor_sprite)
         .run();
 }
diff --git a/examples/multiple_sprites.rs b/examples/multiple_sprites.rs
index cd54dad9b36ae3e45bc6ecd43e6919609a93a8fb..d71e6b5860fd5f6f7bdc762183dab7da544ed4c5 100644
--- a/examples/multiple_sprites.rs
+++ b/examples/multiple_sprites.rs
@@ -1,4 +1,6 @@
 use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
+use bevy_cosmic_edit::change_active_editor_sprite;
+use bevy_cosmic_edit::change_active_editor_ui;
 use bevy_cosmic_edit::{
     ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig,
     CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition,
@@ -93,5 +95,7 @@ fn main() {
         .add_plugins(DefaultPlugins)
         .add_plugins(CosmicEditPlugin { font_config })
         .add_systems(Startup, setup)
+        .add_systems(Update, change_active_editor_ui)
+        .add_systems(Update, change_active_editor_sprite)
         .run();
 }
diff --git a/src/lib.rs b/src/lib.rs
index 80c95e6c566887c423a652a3b286d61803203f0d..8dcf611d028c7ee959a044721c482c9c2af1c6e3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -368,8 +368,6 @@ impl Plugin for CosmicEditPlugin {
             .add_systems(
                 Update,
                 (
-                    change_active_editor_ui,
-                    change_active_editor_sprite,
                     cosmic_edit_bevy_events,
                     cosmic_edit_set_redraw,
                     on_scale_factor_change,
@@ -394,57 +392,6 @@ pub struct ActiveEditor {
     pub entity: Option<Entity>,
 }
 
-fn change_active_editor_ui(
-    mut commands: Commands,
-    mut interaction_query: Query<
-        (&Interaction, Entity),
-        (
-            Changed<Interaction>,
-            (With<CosmicEditor>, Without<ReadOnly>),
-        ),
-    >,
-) {
-    for (interaction, entity) in interaction_query.iter_mut() {
-        if let Interaction::Pressed = interaction {
-            commands.insert_resource(ActiveEditor {
-                entity: Some(entity),
-            });
-        }
-    }
-}
-
-fn change_active_editor_sprite(
-    mut commands: Commands,
-    windows: Query<&Window, With<PrimaryWindow>>,
-    buttons: Res<Input<MouseButton>>,
-    mut cosmic_edit_query: Query<
-        (&mut Sprite, &GlobalTransform, Entity),
-        (With<CosmicEditor>, Without<ReadOnly>),
-    >,
-    camera_q: Query<(&Camera, &GlobalTransform)>,
-) {
-    let window = windows.single();
-    let (camera, camera_transform) = camera_q.single();
-    if buttons.just_pressed(MouseButton::Left) {
-        for (sprite, node_transform, entity) in &mut cosmic_edit_query.iter_mut() {
-            let size = sprite.custom_size.unwrap_or(Vec2::new(1., 1.));
-            let x_min = node_transform.affine().translation.x - size.x / 2.;
-            let y_min = node_transform.affine().translation.y - size.y / 2.;
-            let x_max = node_transform.affine().translation.x + size.x / 2.;
-            let y_max = node_transform.affine().translation.y + size.y / 2.;
-            if let Some(pos) = window.cursor_position() {
-                if let Some(pos) = camera.viewport_to_world_2d(camera_transform, pos) {
-                    if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max {
-                        commands.insert_resource(ActiveEditor {
-                            entity: Some(entity),
-                        });
-                    };
-                }
-            };
-        }
-    }
-}
-
 /// Resource struct that holds configuration options for cosmic fonts.
 #[derive(Resource, Clone)]
 pub struct CosmicFontConfig {
@@ -965,11 +912,7 @@ pub fn cosmic_edit_bevy_events(
                 if let Some(node_cursor_pos) = get_node_cursor_pos(
                     primary_window,
                     node_transform,
-                    (
-                        // TODO this does not work with percent sizes
-                        // well like I haven't tested it so it might
-                        width, height,
-                    ),
+                    (width, height),
                     is_ui_node,
                     camera,
                     camera_transform,
diff --git a/src/utils.rs b/src/utils.rs
index 8728dda5ac6469cbbf08a5ab5a6496b20edabfeb..b3d72d9f081f61ad21e7b53265798d03cc2381b4 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -10,3 +10,59 @@ pub fn get_timestamp() -> f64 {
     let duration = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
     duration.as_millis() as f64
 }
+
+use crate::{ActiveEditor, CosmicEditor, ReadOnly};
+use bevy::{prelude::*, ui::Interaction, window::PrimaryWindow};
+
+// util fns for examples
+//
+pub fn change_active_editor_ui(
+    mut commands: Commands,
+    mut interaction_query: Query<
+        (&Interaction, Entity),
+        (
+            Changed<Interaction>,
+            (With<CosmicEditor>, Without<ReadOnly>),
+        ),
+    >,
+) {
+    for (interaction, entity) in interaction_query.iter_mut() {
+        if let Interaction::Pressed = interaction {
+            commands.insert_resource(ActiveEditor {
+                entity: Some(entity),
+            });
+        }
+    }
+}
+
+pub fn change_active_editor_sprite(
+    mut commands: Commands,
+    windows: Query<&Window, With<PrimaryWindow>>,
+    buttons: Res<Input<MouseButton>>,
+    mut cosmic_edit_query: Query<
+        (&mut Sprite, &GlobalTransform, Entity),
+        (With<CosmicEditor>, Without<ReadOnly>),
+    >,
+    camera_q: Query<(&Camera, &GlobalTransform)>,
+) {
+    let window = windows.single();
+    let (camera, camera_transform) = camera_q.single();
+    if buttons.just_pressed(MouseButton::Left) {
+        for (sprite, node_transform, entity) in &mut cosmic_edit_query.iter_mut() {
+            let size = sprite.custom_size.unwrap_or(Vec2::new(1., 1.));
+            let x_min = node_transform.affine().translation.x - size.x / 2.;
+            let y_min = node_transform.affine().translation.y - size.y / 2.;
+            let x_max = node_transform.affine().translation.x + size.x / 2.;
+            let y_max = node_transform.affine().translation.y + size.y / 2.;
+            if let Some(pos) = window.cursor_position() {
+                if let Some(pos) = camera.viewport_to_world_2d(camera_transform, pos) {
+                    if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max {
+                        commands.insert_resource(ActiveEditor {
+                            entity: Some(entity),
+                        });
+                    };
+                }
+            };
+        }
+    }
+}