diff --git a/TODO b/TODO
index 39f53d7e7bf5448c4c5a824bdaaf49e6634013e3..e386cf1ffece8ab58c4e07d8195a3192d974709a 100644
--- a/TODO
+++ b/TODO
@@ -3,6 +3,13 @@
 
 BUGS INTRODUCED:
 
+[ ] MultiStyle text is fully dead. Idk what I did to it :(
+
+[ ] Cannot select text on Ui bundles sized by percentage
+        Maybe intercept percentages and set as px on instantiation?
+        Replace evaluate() with custom percent to px fn?
+            Read into how evaluate() works
+
 [ ] Window resizing broken
     Used to redraw on click, now redraws on scroll or drag?
     Now drag doesn't work either (tested on readonly, might be that)
diff --git a/examples/basic_button.rs b/examples/basic_button.rs
index 9f355754c3ca76f4aab8a7e1081b0a6207781a1a..943700dd1abca1bc417a3f021c13d958160ef09c 100644
--- a/examples/basic_button.rs
+++ b/examples/basic_button.rs
@@ -1,67 +1,69 @@
-use bevy::{prelude::*, window::PrimaryWindow};
+use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEditMeta, CosmicEditPlugin,
-    CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, CosmicText, CosmicTextPos,
+    ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig,
+    CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition,
 };
 use cosmic_text::AttrsOwned;
 
 fn setup(
     mut commands: Commands,
     windows: Query<&Window, With<PrimaryWindow>>,
-    mut cosmic_fonts: ResMut<Assets<CosmicFont>>,
+    mut font_system: ResMut<CosmicFontSystem>,
 ) {
     let primary_window = windows.single();
-    commands.spawn(Camera2dBundle::default());
-    let root = commands
-        .spawn(NodeBundle {
-            style: Style {
-                display: Display::Flex,
-                width: Val::Percent(100.),
-                height: Val::Percent(100.),
-                ..default()
-            },
-            ..default()
-        })
-        .id();
-
-    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
-    let cosmic_font_config = CosmicFontConfig {
-        fonts_dir_path: None,
-        font_bytes: Some(vec![font_bytes]),
-        load_system_fonts: true,
+    let camera_bundle = Camera2dBundle {
+        camera_2d: Camera2d {
+            clear_color: ClearColorConfig::Custom(Color::WHITE),
+        },
+        ..default()
     };
-    let font_system = create_cosmic_font_system(cosmic_font_config);
-    let font_system_handle: Handle<CosmicFont> = cosmic_fonts.add(CosmicFont(font_system));
+    commands.spawn(camera_bundle);
+
     let mut attrs = cosmic_text::Attrs::new();
     attrs = attrs.family(cosmic_text::Family::Name("Victor Mono"));
     attrs = attrs.color(cosmic_text::Color::rgb(0x94, 0x00, 0xD3));
-    let cosmic_edit_meta = CosmicEditMeta {
-        text: CosmicText::OneStyle("😀😀😀 x => y".to_string()),
-        attrs: AttrsOwned::new(attrs),
-        text_pos: CosmicTextPos::Center,
-        bg: Color::WHITE,
-        metrics: CosmicMetrics {
+
+    let scale_factor = primary_window.scale_factor() as f32;
+
+    let cosmic_edit = CosmicEditUiBundle {
+        style: Style {
+            width: Val::Percent(100.),
+            height: Val::Percent(100.),
+            ..default()
+        },
+        cosmic_metrics: CosmicMetrics {
             font_size: 14.,
             line_height: 18.,
-            scale_factor: primary_window.scale_factor() as f32,
+            scale_factor,
         },
-        font_system_handle,
-        node: CosmicNode::Ui,
-        size: None,
-        readonly: false,
-        bg_image: None,
-    };
-    let cosmic_edit = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta);
-    commands.entity(root).add_child(cosmic_edit);
+        text_position: CosmicTextPosition::Center,
+        cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)),
+        ..default()
+    }
+    .set_text(
+        CosmicText::OneStyle("😀😀😀 x => y".to_string()),
+        AttrsOwned::new(attrs),
+        &mut font_system.0,
+    );
+
+    let cosmic_edit = commands.spawn(cosmic_edit).id();
+
     commands.insert_resource(ActiveEditor {
         entity: Some(cosmic_edit),
     });
 }
 
 fn main() {
+    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
+    let font_config = CosmicFontConfig {
+        fonts_dir_path: None,
+        font_bytes: Some(vec![font_bytes]),
+        load_system_fonts: true,
+    };
+
     App::new()
         .add_plugins(DefaultPlugins)
-        .add_plugins(CosmicEditPlugin)
+        .add_plugins(CosmicEditPlugin { font_config })
         .add_systems(Startup, setup)
         .run();
 }
diff --git a/examples/basic_sprite.rs b/examples/basic_sprite.rs
index 696d26c810385be49ade2148d75ff3506e419ad6..ef0b9e3ca5113029f525bd62995bf7bc12c05e5d 100644
--- a/examples/basic_sprite.rs
+++ b/examples/basic_sprite.rs
@@ -1,15 +1,14 @@
 use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEditMeta, CosmicEditPlugin,
-    CosmicEditSprite, CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, CosmicText,
-    CosmicTextPos,
+    ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig,
+    CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition,
 };
 use cosmic_text::AttrsOwned;
 
 fn setup(
     mut commands: Commands,
     windows: Query<&Window, With<PrimaryWindow>>,
-    mut cosmic_fonts: ResMut<Assets<CosmicFont>>,
+    mut font_system: ResMut<CosmicFontSystem>,
 ) {
     let primary_window = windows.single();
     let camera_bundle = Camera2dBundle {
@@ -19,49 +18,51 @@ fn setup(
         ..default()
     };
     commands.spawn(camera_bundle);
-    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
-    let cosmic_font_config = CosmicFontConfig {
-        fonts_dir_path: None,
-        font_bytes: Some(vec![font_bytes]),
-        load_system_fonts: true,
-    };
-    let font_system = create_cosmic_font_system(cosmic_font_config);
-    let font_system_handle: Handle<CosmicFont> = cosmic_fonts.add(CosmicFont(font_system));
+
     let mut attrs = cosmic_text::Attrs::new();
     attrs = attrs.family(cosmic_text::Family::Name("Victor Mono"));
     attrs = attrs.color(cosmic_text::Color::rgb(0x94, 0x00, 0xD3));
+
     let scale_factor = primary_window.scale_factor() as f32;
-    let cosmic_edit_meta = CosmicEditMeta {
-        text: CosmicText::OneStyle("😀😀😀 x => y".to_string()),
-        attrs: AttrsOwned::new(attrs),
-        text_pos: CosmicTextPos::Center,
-        bg: Color::WHITE,
-        metrics: CosmicMetrics {
+
+    let cosmic_edit = CosmicEditSpriteBundle {
+        sprite: Sprite {
+            custom_size: Some(Vec2::new(primary_window.width(), primary_window.height())),
+            ..default()
+        },
+        cosmic_metrics: CosmicMetrics {
             font_size: 14.,
             line_height: 18.,
             scale_factor,
         },
-        font_system_handle,
-        node: CosmicNode::Sprite(CosmicEditSprite {
-            transform: Transform {
-                translation: Vec3::new(0., 0., 1.),
-                ..default()
-            },
-        }),
-        size: Some((primary_window.width(), primary_window.height())),
-        readonly: false,
-        bg_image: None,
-    };
-    let cosmic_edit = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta);
+        text_position: CosmicTextPosition::Center,
+        cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)),
+        ..default()
+    }
+    .set_text(
+        CosmicText::OneStyle("😀😀😀 x => y".to_string()),
+        AttrsOwned::new(attrs),
+        &mut font_system.0,
+    );
+
+    let cosmic_edit = commands.spawn(cosmic_edit).id();
+
     commands.insert_resource(ActiveEditor {
         entity: Some(cosmic_edit),
     });
 }
 
 fn main() {
+    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
+    let font_config = CosmicFontConfig {
+        fonts_dir_path: None,
+        font_bytes: Some(vec![font_bytes]),
+        load_system_fonts: true,
+    };
+
     App::new()
         .add_plugins(DefaultPlugins)
-        .add_plugins(CosmicEditPlugin)
+        .add_plugins(CosmicEditPlugin { font_config })
         .add_systems(Startup, setup)
         .run();
 }
diff --git a/examples/font_per_widget.rs b/examples/font_per_widget.rs
index 8cfd85eb5b4e907c792e8488b8f49ae55d53c9f6..59687bb43a21a8dee00204ddbe1164a9d0dd5113 100644
--- a/examples/font_per_widget.rs
+++ b/examples/font_per_widget.rs
@@ -1,15 +1,16 @@
+#![allow(clippy::type_complexity)]
+
 use bevy::{prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    create_cosmic_font_system, get_cosmic_text, spawn_cosmic_edit, ActiveEditor, CosmicEdit,
-    CosmicEditMeta, CosmicEditPlugin, CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode,
-    CosmicText, CosmicTextPos,
+    ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig,
+    CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition,
 };
-use cosmic_text::*;
+use cosmic_text::{Attrs, AttrsOwned, Family};
 
 fn setup(
     mut commands: Commands,
     windows: Query<&Window, With<PrimaryWindow>>,
-    mut cosmic_fonts: ResMut<Assets<CosmicFont>>,
+    mut font_system: ResMut<CosmicFontSystem>,
 ) {
     commands.spawn(Camera2dBundle::default());
     let root = commands
@@ -24,13 +25,6 @@ fn setup(
         })
         .id();
     let primary_window = windows.single();
-    let cosmic_font_config = CosmicFontConfig {
-        fonts_dir_path: None,
-        font_bytes: None,
-        load_system_fonts: true,
-    };
-    let font_system = create_cosmic_font_system(cosmic_font_config);
-    let font_system_handle = cosmic_fonts.add(CosmicFont(font_system));
 
     let attrs = Attrs::new();
     let serif_attrs = attrs.family(Family::Serif);
@@ -229,77 +223,74 @@ fn setup(
         )],
     ];
 
-    let cosmic_edit_meta_1 = CosmicEditMeta {
-        text: CosmicText::MultiStyle(lines),
-        attrs: AttrsOwned::new(attrs),
-        text_pos: CosmicTextPos::Center,
-        metrics: CosmicMetrics {
+    let cosmic_edit_1 = CosmicEditUiBundle {
+        text_position: bevy_cosmic_edit::CosmicTextPosition::Center,
+        cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)),
+        cosmic_metrics: CosmicMetrics {
             font_size: 18.,
             line_height: 22.,
             scale_factor: primary_window.scale_factor() as f32,
         },
-        font_system_handle: font_system_handle.clone(),
-        node: CosmicNode::Ui,
-        size: None,
-        bg: bevy::prelude::Color::WHITE,
-        readonly: false,
-        bg_image: None,
-    };
-    let cosmic_edit_1 = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta_1);
+        style: Style {
+            width: Val::Percent(50.),
+            height: Val::Percent(100.),
+            ..default()
+        },
+        background_color: BackgroundColor(Color::WHITE),
+        ..default()
+    }
+    .set_text(
+        CosmicText::MultiStyle(lines),
+        AttrsOwned::new(attrs),
+        &mut font_system.0,
+    );
 
     let mut attrs_2 = cosmic_text::Attrs::new();
     attrs_2 = attrs_2.family(cosmic_text::Family::Name("Times New Roman"));
-    let cosmic_edit_meta_2 = CosmicEditMeta {
-        text: CosmicText::OneStyle("Widget 2.\nClick on me =>".to_string()),
-        attrs: AttrsOwned::new(attrs_2),
-        metrics: CosmicMetrics {
+
+    let cosmic_edit_2 = CosmicEditUiBundle {
+        cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs_2)),
+        cosmic_metrics: CosmicMetrics {
             font_size: 14.,
             line_height: 18.,
             scale_factor: primary_window.scale_factor() as f32,
         },
-        font_system_handle: font_system_handle.clone(),
-        node: CosmicNode::Ui,
-        text_pos: CosmicTextPos::Center,
-        size: None,
-        bg: bevy::prelude::Color::WHITE.with_a(0.8),
-        readonly: false,
-        bg_image: None,
-    };
-    let cosmic_edit_2 = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta_2);
-
-    commands.entity(root).add_child(cosmic_edit_1);
-    commands.entity(root).add_child(cosmic_edit_2);
+        text_position: CosmicTextPosition::Center,
+        background_color: BackgroundColor(Color::WHITE.with_a(0.8)),
+        style: Style {
+            width: Val::Percent(50.),
+            height: Val::Percent(100.),
+            ..default()
+        },
+        ..default()
+    }
+    .set_text(
+        CosmicText::OneStyle("Widget 2.\nClick on me =>".to_string()),
+        AttrsOwned::new(attrs_2),
+        &mut font_system.0,
+    );
 
-    commands.insert_resource(ActiveEditor {
-        entity: Some(cosmic_edit_1),
+    let mut id = None;
+    // Spawn the CosmicEditUiBundles as children of root
+    commands.entity(root).with_children(|parent| {
+        id = Some(parent.spawn(cosmic_edit_1).id());
+        parent.spawn(cosmic_edit_2);
     });
-}
 
-fn change_active_editor(
-    mut commands: Commands,
-    mut interaction_query: Query<
-        (&Interaction, &mut CosmicEdit, Entity),
-        (Changed<Interaction>, With<CosmicEdit>),
-    >,
-) {
-    for (interaction, cosmic_edit, entity) in interaction_query.iter_mut() {
-        if let Interaction::Pressed = interaction {
-            commands.insert_resource(ActiveEditor {
-                entity: Some(entity),
-            });
-            info!(
-                "Widget text: {}",
-                get_cosmic_text(&cosmic_edit.editor.buffer())
-            );
-        }
-    }
+    // Set active editor
+    commands.insert_resource(ActiveEditor { entity: id });
 }
 
 fn main() {
+    let font_config = CosmicFontConfig {
+        fonts_dir_path: None,
+        font_bytes: None,
+        load_system_fonts: true,
+    };
+
     App::new()
         .add_plugins(DefaultPlugins)
-        .add_plugins(CosmicEditPlugin)
+        .add_plugins(CosmicEditPlugin { font_config })
         .add_systems(Startup, setup)
-        .add_systems(Update, change_active_editor)
         .run();
 }
diff --git a/examples/multiple_sprites.rs b/examples/multiple_sprites.rs
index e89bd86255da132a08f9942adefef741cf97c588..cd54dad9b36ae3e45bc6ecd43e6919609a93a8fb 100644
--- a/examples/multiple_sprites.rs
+++ b/examples/multiple_sprites.rs
@@ -1,18 +1,14 @@
 use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow};
 use bevy_cosmic_edit::{
-    create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEdit, CosmicEditMeta,
-    CosmicEditPlugin, CosmicEditSprite, CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode,
-    CosmicText, CosmicTextPos,
+    ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig,
+    CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition,
 };
 use cosmic_text::AttrsOwned;
 
-#[derive(Component)]
-pub struct MainCamera;
-
 fn setup(
     mut commands: Commands,
     windows: Query<&Window, With<PrimaryWindow>>,
-    mut cosmic_fonts: ResMut<Assets<CosmicFont>>,
+    mut font_system: ResMut<CosmicFontSystem>,
 ) {
     let primary_window = windows.single();
     let camera_bundle = Camera2dBundle {
@@ -21,15 +17,8 @@ fn setup(
         },
         ..default()
     };
-    commands.spawn((camera_bundle, MainCamera));
-    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
-    let cosmic_font_config = CosmicFontConfig {
-        fonts_dir_path: None,
-        font_bytes: Some(vec![font_bytes]),
-        load_system_fonts: true,
-    };
-    let font_system = create_cosmic_font_system(cosmic_font_config);
-    let font_system_handle = cosmic_fonts.add(CosmicFont(font_system));
+    commands.spawn(camera_bundle);
+
     let mut attrs = cosmic_text::Attrs::new();
     attrs = attrs.family(cosmic_text::Family::Name("Victor Mono"));
     attrs = attrs.color(cosmic_text::Color::rgb(0x94, 0x00, 0xD3));
@@ -38,111 +27,71 @@ fn setup(
         line_height: 18.,
         scale_factor: primary_window.scale_factor() as f32,
     };
-    let cosmic_edit_meta = CosmicEditMeta {
-        text: CosmicText::OneStyle("😀😀😀 x => y".to_string()),
-        attrs: AttrsOwned::new(attrs),
-        text_pos: CosmicTextPos::Center,
-        metrics: metrics.clone(),
-        font_system_handle: font_system_handle.clone(),
-        node: CosmicNode::Sprite(CosmicEditSprite {
-            transform: Transform {
-                translation: Vec3::new(-primary_window.width() / 4., 0., 1.),
-                ..default()
-            },
-        }),
-        size: Some((primary_window.width() / 2., primary_window.height())),
-        bg: Color::WHITE,
-        readonly: false,
-        bg_image: None,
-    };
-    let cosmic_edit_1 = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta);
-    let cosmic_edit_meta = CosmicEditMeta {
-        text: CosmicText::OneStyle("Widget_2. Click on me".to_string()),
-        attrs: AttrsOwned::new(attrs),
-        text_pos: CosmicTextPos::Center,
-        metrics: metrics.clone(),
-        font_system_handle: font_system_handle.clone(),
-        node: CosmicNode::Sprite(CosmicEditSprite {
-            transform: Transform {
-                translation: Vec3::new(
-                    primary_window.width() / 4.,
-                    -primary_window.height() / 4.,
-                    1.,
-                ),
-                ..default()
-            },
-        }),
-        size: Some((primary_window.width() / 2., primary_window.height() / 2.)),
-        bg: Color::GRAY.with_a(0.5),
-        readonly: false,
-        bg_image: None,
-    };
-    let _ = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta);
-    let cosmic_edit_meta = CosmicEditMeta {
-        text: CosmicText::OneStyle("Widget_3. Click on me".to_string()),
-        attrs: AttrsOwned::new(attrs),
-        text_pos: CosmicTextPos::Center,
-        metrics: metrics.clone(),
-        font_system_handle: font_system_handle.clone(),
-        node: CosmicNode::Sprite(CosmicEditSprite {
-            transform: Transform {
-                translation: Vec3::new(
-                    primary_window.width() / 4.,
-                    primary_window.height() / 4.,
-                    1.,
-                ),
-                ..default()
-            },
-        }),
-        size: Some((primary_window.width() / 2., primary_window.height() / 2.)),
-        bg: Color::GRAY.with_a(0.8),
-        readonly: false,
-        bg_image: None,
-    };
-    let _ = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta);
-    commands.insert_resource(ActiveEditor {
-        entity: Some(cosmic_edit_1),
-    });
-}
 
-fn change_active_editor(
-    mut commands: Commands,
-    windows: Query<&Window, With<PrimaryWindow>>,
-    buttons: Res<Input<MouseButton>>,
-    mut cosmic_edit_query: Query<(&mut CosmicEdit, &GlobalTransform, Entity), With<CosmicEdit>>,
-    camera_q: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
-) {
-    let window = windows.single();
-    let (camera, camera_transform) = camera_q.single();
-    if buttons.just_pressed(MouseButton::Left) {
-        for (cosmic_edit, node_transform, entity) in &mut cosmic_edit_query.iter_mut() {
-            let size = (cosmic_edit.width, cosmic_edit.height);
-            let x_min = node_transform.affine().translation.x - size.0 / 2.;
-            let y_min = node_transform.affine().translation.y - size.1 / 2.;
-            let x_max = node_transform.affine().translation.x + size.0 / 2.;
-            let y_max = node_transform.affine().translation.y + size.1 / 2.;
-            window.cursor_position().and_then(|pos| {
-                if let Some(pos) = camera.viewport_to_world_2d(camera_transform, pos) {
-                    Some({
-                        if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max {
-                            commands.insert_resource(ActiveEditor {
-                                entity: Some(entity),
-                            });
-                        };
-                    })
-                } else {
-                    None
-                }
-            });
-        }
+    let cosmic_edit_1 = CosmicEditSpriteBundle {
+        cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)),
+        cosmic_metrics: metrics.clone(),
+        sprite: Sprite {
+            custom_size: Some(Vec2 {
+                x: primary_window.width() / 2.,
+                y: primary_window.height(),
+            }),
+            ..default()
+        },
+        transform: Transform::from_translation(Vec3::new(-primary_window.width() / 4., 0., 1.)),
+        text_position: CosmicTextPosition::Center,
+        background_color: BackgroundColor(Color::ALICE_BLUE),
+        ..default()
     }
+    .set_text(
+        CosmicText::OneStyle("😀😀😀 x => y".to_string()),
+        AttrsOwned::new(attrs),
+        &mut font_system.0,
+    );
+
+    let cosmic_edit_2 = CosmicEditSpriteBundle {
+        cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)),
+        cosmic_metrics: metrics,
+        sprite: Sprite {
+            custom_size: Some(Vec2 {
+                x: primary_window.width() / 2.,
+                y: primary_window.height() / 2.,
+            }),
+            ..default()
+        },
+        transform: Transform::from_translation(Vec3::new(
+            primary_window.width() / 4.,
+            -primary_window.height() / 4.,
+            1.,
+        )),
+        text_position: CosmicTextPosition::Center,
+        background_color: BackgroundColor(Color::GRAY.with_a(0.5)),
+        ..default()
+    }
+    .set_text(
+        CosmicText::OneStyle("Widget_2. Click on me".to_string()),
+        AttrsOwned::new(attrs),
+        &mut font_system.0,
+    );
+
+    let id = commands.spawn(cosmic_edit_1).id();
+
+    commands.insert_resource(ActiveEditor { entity: Some(id) });
+
+    commands.spawn(cosmic_edit_2);
 }
 
 fn main() {
+    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
+    let font_config = CosmicFontConfig {
+        fonts_dir_path: None,
+        font_bytes: Some(vec![font_bytes]),
+        load_system_fonts: true,
+    };
+
     App::new()
         .add_plugins(DefaultPlugins)
-        .add_plugins(CosmicEditPlugin)
+        .add_plugins(CosmicEditPlugin { font_config })
         .add_systems(Startup, setup)
-        .add_systems(Update, change_active_editor)
         .run();
 }
diff --git a/src/lib.rs b/src/lib.rs
index 6339a5b32df396bd28592449ba51b27caab517db..3f72a301ba6d56f6bdb5b1534f3cae52f58c04f7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -22,7 +22,7 @@ use image::{imageops::FilterType, GenericImageView};
 #[derive(Clone)]
 pub enum CosmicText {
     OneStyle(String),
-    MultiStyle(Vec<Vec<(String, cosmic_text::AttrsOwned)>>),
+    MultiStyle(Vec<Vec<(String, AttrsOwned)>>),
 }
 
 /// Enum representing the position of the cosmic text.
@@ -57,9 +57,6 @@ pub struct CosmicFontSystem(pub FontSystem);
 #[derive(Component)]
 pub struct ReadOnly; // tag component
 
-#[derive(Component)]
-pub struct CosmicUiNode; // tag component
-
 #[derive(Component)]
 pub struct CosmicEditor(pub Editor);
 
@@ -74,7 +71,7 @@ impl CosmicEditor {
         &mut self,
         text: CosmicText,
         attrs: AttrsOwned,
-        // i'd like to get this automagically but i'm too 3head -bytemunch
+        // i'd like to get the font system automagically but i'm too 3head -bytemunch
         font_system: &mut FontSystem,
     ) -> &mut Self {
         let editor = &mut self.0;
@@ -88,7 +85,7 @@ impl CosmicEditor {
                     Shaping::Advanced,
                 );
             }
-            // TODO test
+            // TODO why not working?
             CosmicText::MultiStyle(lines) => {
                 for line in lines {
                     let mut line_text = String::new();
@@ -313,6 +310,18 @@ pub struct CosmicEditSpriteBundle {
     pub background_image: CosmicBackground,
 }
 
+impl CosmicEditSpriteBundle {
+    pub fn set_text(
+        mut self,
+        text: CosmicText,
+        attrs: AttrsOwned,
+        font_system: &mut FontSystem,
+    ) -> Self {
+        self.editor.set_text(text, attrs, font_system);
+        self
+    }
+}
+
 impl Default for CosmicEditSpriteBundle {
     fn default() -> Self {
         Self {
@@ -361,7 +370,8 @@ impl Plugin for CosmicEditPlugin {
             .add_systems(
                 Update,
                 (
-                    change_active_editor,
+                    change_active_editor_ui,
+                    change_active_editor_sprite,
                     cosmic_edit_bevy_events,
                     cosmic_edit_set_redraw,
                     on_scale_factor_change,
@@ -386,20 +396,53 @@ pub struct ActiveEditor {
     pub entity: Option<Entity>,
 }
 
-fn change_active_editor(
+fn change_active_editor_ui(
     mut commands: Commands,
     mut interaction_query: Query<
-        (&Interaction, &mut CosmicEditor, Entity),
-        (Changed<Interaction>, With<CosmicEditor>),
+        (&Interaction, Entity),
+        (
+            Changed<Interaction>,
+            (With<CosmicEditor>, Without<ReadOnly>),
+        ),
     >,
 ) {
-    for (interaction, editor, entity) in interaction_query.iter_mut() {
+    for (interaction, entity) in interaction_query.iter_mut() {
         if let Interaction::Pressed = interaction {
-            info!("PRESSED");
             commands.insert_resource(ActiveEditor {
                 entity: Some(entity),
             });
-            info!("Widget text: {}", editor.get_text());
+        }
+    }
+}
+
+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),
+                        });
+                    };
+                }
+            };
         }
     }
 }
@@ -630,8 +673,8 @@ pub fn cosmic_edit_bevy_events(
 
         let (width, height, is_ui_node) = match style_query.get(entity) {
             Ok(style) => (
-                style.width.evaluate(1.).unwrap(),
-                style.height.evaluate(1.).unwrap(),
+                style.width.evaluate(1.).unwrap_or(1.),
+                style.height.evaluate(1.).unwrap_or(1.),
                 true,
             ),
             Err(_) => {
@@ -1054,8 +1097,6 @@ fn redraw_buffer_common(
     let swash_cache = &mut swash_cache_state.swash_cache;
     editor.shape_as_needed(&mut font_system.0);
     if editor.buffer().redraw() {
-        println!("REDRAW");
-
         editor
             .buffer_mut()
             .set_size(&mut font_system.0, width, height);
@@ -1116,10 +1157,8 @@ fn redraw_buffer_common(
         );
         editor.buffer_mut().set_redraw(false);
 
-        println!("TRY CLEAR");
         if let Some(prev_image) = images.get_mut(cosmic_canvas_img_handle) {
             if *cosmic_canvas_img_handle == bevy::render::texture::DEFAULT_IMAGE_HANDLE.typed() {
-                println!("SWAP HANDLE");
                 let mut prev_image = prev_image.clone();
                 prev_image.data.clear();
                 prev_image.data.extend_from_slice(pixels.as_slice());
@@ -1133,7 +1172,6 @@ fn redraw_buffer_common(
                 let new_handle = images.set(new_handle, prev_image);
                 *cosmic_canvas_img_handle = new_handle;
             } else {
-                println!("CLEAR CANVAS");
                 prev_image.data.clear();
                 prev_image.data.extend_from_slice(pixels.as_slice());
                 prev_image.resize(Extent3d {