diff --git a/Cargo.lock b/Cargo.lock
index 2ebc893bd8213bddf763c326f201100cac6e73ac..026a1f29c3cbef05b39d377f8abfe6ec3c861cee 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -388,7 +388,7 @@ dependencies = [
 
 [[package]]
 name = "bevy_cosmic_edit"
-version = "0.11.0"
+version = "0.12.0"
 dependencies = [
  "arboard",
  "bevy",
diff --git a/Cargo.toml b/Cargo.toml
index 6894731a7df86c8992cced398f2b1b1db0fc0494..e635cf97f617c681fdd6bf7daf27330e1ff8c1cb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "bevy_cosmic_edit"
-version = "0.11.0"
+version = "0.12.0"
 edition = "2021"
 license = "MIT OR Apache-2.0"
 description = "Bevy cosmic-text multiline text input"
diff --git a/examples/basic_sprite.rs b/examples/basic_sprite.rs
index 59fa63823422e8617b465cca3bbf6a13e7545f56..1019ce106e7665d1270a2d54961a90d88fef2a26 100644
--- a/examples/basic_sprite.rs
+++ b/examples/basic_sprite.rs
@@ -1,7 +1,7 @@
 use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    ActiveEditor, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle,
-    CosmicFontConfig, CosmicMetrics, CosmicText, CosmicTextPosition,
+    AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig,
+    CosmicMetrics, CosmicText, CosmicTextPosition, Focus,
 };
 
 fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
@@ -38,9 +38,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
 
     let cosmic_edit = commands.spawn(cosmic_edit).id();
 
-    commands.insert_resource(ActiveEditor {
-        entity: Some(cosmic_edit),
-    });
+    commands.insert_resource(Focus(Some(cosmic_edit)));
 }
 
 fn main() {
diff --git a/examples/basic_ui.rs b/examples/basic_ui.rs
index f390de55cc3cff758814ee119b5042ab389a7420..09235a7eb7e3178ff1811ed389aabe7a3e3fb17f 100644
--- a/examples/basic_ui.rs
+++ b/examples/basic_ui.rs
@@ -1,7 +1,7 @@
 use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    ActiveEditor, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicEditor,
-    CosmicFontConfig, CosmicMetrics, CosmicText, CosmicTextPosition,
+    AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicEditor, CosmicFontConfig,
+    CosmicMetrics, CosmicText, CosmicTextPosition, Focus,
 };
 
 fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
@@ -39,9 +39,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
 
     let cosmic_edit = commands.spawn(cosmic_edit).id();
 
-    commands.insert_resource(ActiveEditor {
-        entity: Some(cosmic_edit),
-    });
+    commands.insert_resource(Focus(Some(cosmic_edit)));
 }
 
 fn print_text(
diff --git a/examples/bevy_api_testing.rs b/examples/bevy_api_testing.rs
index 83a85f2becf044d63bc5b62812d3d4d1e54b3d75..7bc27c18441fca92f6187404531239e319d7c281 100644
--- a/examples/bevy_api_testing.rs
+++ b/examples/bevy_api_testing.rs
@@ -1,7 +1,7 @@
 use bevy::prelude::*;
 use bevy_cosmic_edit::{
-    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, ActiveEditor,
-    Attrs, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicEditUiBundle,
+    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, Attrs, AttrsOwned,
+    CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicEditUiBundle, Focus,
 };
 
 fn setup(mut commands: Commands) {
@@ -36,9 +36,7 @@ fn setup(mut commands: Commands) {
         })
         .id();
 
-    commands.insert_resource(ActiveEditor {
-        entity: Some(sprite_editor),
-    });
+    commands.insert_resource(Focus(Some(sprite_editor)));
 }
 
 fn main() {
diff --git a/examples/every_option.rs b/examples/every_option.rs
index 1a9697bc8dcb932779003edb6abd77207f71d23d..0fe4f19a95fa4f8ac43556ecea21e659ea5744ba 100644
--- a/examples/every_option.rs
+++ b/examples/every_option.rs
@@ -1,9 +1,9 @@
 use bevy::{prelude::*, ui::FocusPolicy, window::PrimaryWindow};
 use bevy_cosmic_edit::{
     bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, get_x_offset,
-    ActiveEditor, Attrs, AttrsOwned, CosmicAttrs, CosmicBackground, CosmicEditPlugin,
-    CosmicEditUiBundle, CosmicEditor, CosmicMaxChars, CosmicMaxLines, CosmicMetrics, CosmicText,
-    CosmicTextPosition, Edit,
+    Attrs, AttrsOwned, CosmicAttrs, CosmicBackground, CosmicEditPlugin, CosmicEditUiBundle,
+    CosmicEditor, CosmicMaxChars, CosmicMaxLines, CosmicMetrics, CosmicText, CosmicTextPosition,
+    Edit, Focus,
 };
 
 #[derive(Resource)]
@@ -53,9 +53,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
         })
         .id();
 
-    commands.insert_resource(ActiveEditor {
-        entity: Some(editor),
-    });
+    commands.insert_resource(Focus(Some(editor)));
 
     commands.insert_resource(TextChangeTimer(Timer::from_seconds(
         1.,
diff --git a/examples/font_per_widget.rs b/examples/font_per_widget.rs
index b8721cb0e2a2ca82f144eb55799b8b368e43066e..089a17b2d660da9a84b7c14759a9f8f479a55e91 100644
--- a/examples/font_per_widget.rs
+++ b/examples/font_per_widget.rs
@@ -2,9 +2,9 @@
 
 use bevy::{prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, ActiveEditor,
-    Attrs, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig,
-    CosmicMetrics, CosmicText, CosmicTextPosition, Family, FontStyle, FontWeight,
+    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, Attrs, AttrsOwned,
+    CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig, CosmicMetrics, CosmicText,
+    CosmicTextPosition, Family, Focus, FontStyle, FontWeight,
 };
 
 fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
@@ -259,7 +259,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
     });
 
     // Set active editor
-    commands.insert_resource(ActiveEditor { entity: id });
+    commands.insert_resource(Focus(id));
 }
 
 fn main() {
diff --git a/examples/image_background.rs b/examples/image_background.rs
index 135ee717158b9de7067339e1219abb115f3f916c..7945c74591c5202708a6afc87d0cb275f203a154 100644
--- a/examples/image_background.rs
+++ b/examples/image_background.rs
@@ -1,7 +1,7 @@
 use bevy::prelude::*;
 use bevy_cosmic_edit::{
-    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, ActiveEditor,
-    Attrs, AttrsOwned, CosmicAttrs, CosmicBackground, CosmicEditPlugin, CosmicEditUiBundle,
+    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui,
+    Attrs, AttrsOwned, CosmicAttrs, CosmicBackground, CosmicEditPlugin, CosmicEditUiBundle, Focus,
 };
 
 fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
@@ -26,10 +26,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
             ..default()
         })
         .id();
-
-    commands.insert_resource(ActiveEditor {
-        entity: Some(editor),
-    });
+    commands.insert_resource(Focus(Some(editor)));
 }
 
 fn main() {
diff --git a/examples/multiple_sprites.rs b/examples/multiple_sprites.rs
index fd240f1672ec85aa691afd932fa258c8450dd424..2c2c74a26b44487fe11420b750bcb76bda600c24 100644
--- a/examples/multiple_sprites.rs
+++ b/examples/multiple_sprites.rs
@@ -1,8 +1,8 @@
 use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, ActiveEditor,
-    Attrs, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig,
-    CosmicMetrics, CosmicText, CosmicTextPosition, Family,
+    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, Attrs, AttrsOwned,
+    CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig, CosmicMetrics,
+    CosmicText, CosmicTextPosition, Family, Focus,
 };
 
 fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
@@ -64,7 +64,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
 
     let id = commands.spawn(cosmic_edit_1).id();
 
-    commands.insert_resource(ActiveEditor { entity: Some(id) });
+    commands.insert_resource(Focus(Some(id)));
 
     commands.spawn(cosmic_edit_2);
 }
diff --git a/examples/readonly.rs b/examples/readonly.rs
index 4c67c1b45316eb39a6805983cf1c24a4ca48d822..efbacca3cb28bda313836dfb5cd7fb1d7442f344 100644
--- a/examples/readonly.rs
+++ b/examples/readonly.rs
@@ -1,8 +1,7 @@
 use bevy::{prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    bevy_color_to_cosmic, ActiveEditor, Attrs, AttrsOwned, CosmicAttrs, CosmicEditPlugin,
-    CosmicEditUiBundle, CosmicFontConfig, CosmicMetrics, CosmicText, CosmicTextPosition, Family,
-    ReadOnly,
+    bevy_color_to_cosmic, Attrs, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle,
+    CosmicFontConfig, CosmicMetrics, CosmicText, CosmicTextPosition, Family, Focus, ReadOnly,
 };
 
 fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
@@ -49,7 +48,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
     });
 
     // Set active editor
-    commands.insert_resource(ActiveEditor { entity: id });
+    commands.insert_resource(Focus(id));
 }
 
 fn main() {
diff --git a/examples/restricted_input.rs b/examples/restricted_input.rs
index 847e0ebbf71078a15d0887f5545162d9c919394c..e43b2aa5860f8976dd7fa96445450e04da99f420 100644
--- a/examples/restricted_input.rs
+++ b/examples/restricted_input.rs
@@ -1,8 +1,8 @@
 use bevy::{prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, ActiveEditor,
-    Attrs, AttrsOwned, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicMaxChars,
-    CosmicMaxLines, CosmicMetrics, CosmicText,
+    bevy_color_to_cosmic, change_active_editor_sprite, change_active_editor_ui, Attrs, AttrsOwned,
+    CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicMaxChars, CosmicMaxLines,
+    CosmicMetrics, CosmicText, Focus,
 };
 
 fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
@@ -40,9 +40,7 @@ fn setup(mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>) {
         })
         .id();
 
-    commands.insert_resource(ActiveEditor {
-        entity: Some(editor),
-    });
+    commands.insert_resource(Focus(Some(editor)));
 }
 
 fn main() {
diff --git a/src/lib.rs b/src/lib.rs
index 0bdcd281d17aa73f72dfc76ce0353c261b393dd1..0a669d39944ac1685f7cc6a8a5870aba43edecfc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -14,7 +14,8 @@ use bevy::{
     window::{PrimaryWindow, WindowScaleFactorChanged},
 };
 pub use cosmic_text::{
-    Action, Attrs, AttrsOwned, Cursor, Edit, Family, Style as FontStyle, Weight as FontWeight,
+    Action, Attrs, AttrsOwned, Color as CosmicColor, Cursor, Edit, Family, Style as FontStyle,
+    Weight as FontWeight,
 };
 use cosmic_text::{
     AttrsList, Buffer, BufferLine, Editor, FontSystem, Metrics, Shaping, SwashCache,
@@ -402,8 +403,7 @@ impl Plugin for CosmicEditPlugin {
                     clear_inactive_selection,
                 ),
             )
-            .init_resource::<ActiveEditor>()
-            // .add_asset::<CosmicFont>()
+            .init_resource::<Focus>()
             .insert_resource(SwashCacheState {
                 swash_cache: SwashCache::new(),
             })
@@ -412,10 +412,8 @@ impl Plugin for CosmicEditPlugin {
 }
 
 /// Resource struct that keeps track of the currently active editor entity.
-#[derive(Resource, Default)]
-pub struct ActiveEditor {
-    pub entity: Option<Entity>,
-}
+#[derive(Resource, Default, Deref, DerefMut)]
+pub struct Focus(pub Option<Entity>);
 
 /// Resource struct that holds configuration options for cosmic fonts.
 #[derive(Resource, Clone)]
@@ -689,7 +687,7 @@ pub fn get_x_offset(buffer: &Buffer) -> i32 {
 // the meat of the input management
 fn cosmic_edit_bevy_events(
     windows: Query<&Window, With<PrimaryWindow>>,
-    active_editor: Res<ActiveEditor>,
+    active_editor: Res<Focus>,
     keys: Res<Input<KeyCode>>,
     mut char_evr: EventReader<ReceivedCharacter>,
     buttons: Res<Input<MouseButton>>,
@@ -743,7 +741,7 @@ fn cosmic_edit_bevy_events(
 
         let attrs = &attrs.0;
 
-        if active_editor.entity == Some(entity) {
+        if active_editor.0 == Some(entity) {
             let now_ms = get_timestamp();
 
             #[cfg(target_os = "macos")]
@@ -1308,10 +1306,10 @@ fn blink_cursor(
     mut visible: Local<bool>,
     mut timer: Local<Option<Timer>>,
     time: Res<Time>,
-    active_editor: ResMut<ActiveEditor>,
+    active_editor: ResMut<Focus>,
     mut cosmic_editor_q: Query<&mut CosmicEditor, Without<ReadOnly>>,
 ) {
-    if let Some(e) = active_editor.entity {
+    if let Some(e) = active_editor.0 {
         if let Ok(mut editor) = cosmic_editor_q.get_mut(e) {
             let timer =
                 timer.get_or_insert_with(|| Timer::from_seconds(0.53, TimerMode::Repeating));
@@ -1343,14 +1341,14 @@ fn blink_cursor(
 
 fn hide_inactive_cursor(
     mut cosmic_editor_q: Query<(Entity, &mut CosmicEditor)>,
-    active_editor: Res<ActiveEditor>,
+    active_editor: Res<Focus>,
 ) {
-    if !active_editor.is_changed() || active_editor.entity.is_none() {
+    if !active_editor.is_changed() || active_editor.0.is_none() {
         return;
     }
 
     for (e, mut editor) in &mut cosmic_editor_q.iter_mut() {
-        if e != active_editor.entity.unwrap() {
+        if e != active_editor.0.unwrap() {
             let mut cursor = editor.0.cursor();
             cursor.color = Some(cosmic_text::Color::rgba(0, 0, 0, 0));
             editor.0.set_cursor(cursor);
@@ -1361,14 +1359,14 @@ fn hide_inactive_cursor(
 
 fn clear_inactive_selection(
     mut cosmic_editor_q: Query<(Entity, &mut CosmicEditor)>,
-    active_editor: Res<ActiveEditor>,
+    active_editor: Res<Focus>,
 ) {
-    if !active_editor.is_changed() || active_editor.entity.is_none() {
+    if !active_editor.is_changed() || active_editor.0.is_none() {
         return;
     }
 
     for (e, mut editor) in &mut cosmic_editor_q.iter_mut() {
-        if e != active_editor.entity.unwrap() {
+        if e != active_editor.0.unwrap() {
             editor.0.set_select_opt(None);
         }
     }
diff --git a/src/utils.rs b/src/utils.rs
index b3d72d9f081f61ad21e7b53265798d03cc2381b4..0e519db91829e49572a71000c60aefee0c61815e 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -11,7 +11,7 @@ pub fn get_timestamp() -> f64 {
     duration.as_millis() as f64
 }
 
-use crate::{ActiveEditor, CosmicEditor, ReadOnly};
+use crate::{CosmicEditor, Focus, ReadOnly};
 use bevy::{prelude::*, ui::Interaction, window::PrimaryWindow};
 
 // util fns for examples
@@ -28,9 +28,7 @@ pub fn change_active_editor_ui(
 ) {
     for (interaction, entity) in interaction_query.iter_mut() {
         if let Interaction::Pressed = interaction {
-            commands.insert_resource(ActiveEditor {
-                entity: Some(entity),
-            });
+            commands.insert_resource(Focus(Some(entity)));
         }
     }
 }
@@ -57,9 +55,7 @@ pub fn change_active_editor_sprite(
             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),
-                        });
+                        commands.insert_resource(Focus(Some(entity)))
                     };
                 }
             };