diff --git a/Cargo.toml b/Cargo.toml index 38d3fde..3334b55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "osui" -version = "0.0.8-alpha.2" +version = "0.0.9-alpha.0" edition = "2021" license = "Apache-2.0" description = "A TUI library for advanced uis" @@ -21,8 +21,6 @@ cc = "1.0" [dependencies] crossterm = "0.28.1" -dyn-clone = "1.0.17" -osui-element = "0.1.23" [profile.dev] opt-level = 1 diff --git a/src/css.rs b/src/css.rs deleted file mode 100644 index 6622ad4..0000000 --- a/src/css.rs +++ /dev/null @@ -1,206 +0,0 @@ -#[macro_export] -macro_rules! __css { - ($_style:expr,)=>{}; - // percentage (n%) - ( - $_style:expr, $name:ident: $value:literal% $(, $($rest:tt)*)? - ) => {{ - $_style.$name = (true, Number::Pe($value)); - $crate::__css!($_style, $($($rest)*)?); - }}; - - // Number - ( - $_style:expr, $name:ident: $value:literal px $(, $($rest:tt)*)? - ) => {{ - $_style.$name = (true, Number::Px($value)); - $crate::__css!($_style, $($($rest)*)?); - }}; - - // Vector - ( - $_style:expr, $name:ident: [$($inner:tt),*] $(, $($rest:tt)*)? - ) => {{ - $_style.$name = (true, vec![$($inner),*]); - $crate::__css!($_style, $($($rest)*)?); - }}; - - // Normal - ( - $_style:expr, $name:ident: $value:expr $(, $($rest:tt)*)? - ) => {{ - $_style.$name = (true, $value); - $crate::__css!($_style, $($($rest)*)?); - }}; -} - -#[macro_export] -macro_rules! _css { - ($_style:expr,) => {}; - ( - $hm:expr, $($($name:ident)-+),* { $($inner:tt)* } $($rest:tt)* - ) => {{ - let mut _style = $crate::ui::StyleElement::default(); - $crate::__css!(_style, $($inner)*); - $( - $hm.insert( - $crate::ui::StyleName::Class(String::from(stringify!($($name)-+).replace(' ', ""))), - _style.clone(), - ); - )* - $crate::_css!($hm, $($rest)*); - }}; - ( - $hm:expr, $($($name:ident)-+),*: $state:literal { $($inner:tt)* } $($rest:tt)* - ) => {{ - let mut _style = $crate::ui::StyleElement::default(); - $crate::__css!(_style, $($inner)*); - $( - $hm.insert( - $crate::ui::StyleName::ClassState(String::from(stringify!($($name)-+).replace(' ', "")), String::from($state)), - _style.clone(), - ); - )* - $crate::_css!($hm, $($rest)*); - }}; - ( - $hm:expr, $($name:literal),+ { $($inner:tt)* } $($rest:tt)* - ) => {{ - let mut _style = $crate::ui::StyleElement::default(); - $crate::__css!(_style, $($inner)*); - $( - $hm.insert( - $crate::ui::StyleName::Class(String::from($name)), - _style, - ); - )+ - $crate::_css!($hm, $($rest)*); - }}; - ( - $hm:expr, $($name:literal),+: $state:literal { $($inner:tt)* } $($rest:tt)* - ) => {{ - let mut _style = $crate::ui::StyleElement::default(); - $crate::__css!(_style, $($inner)*); - $( - $hm.insert( - $crate::ui::StyleName::ClassState(String::from($name), String::from($state)), - _style, - ); - )+ - $crate::_css!($hm, $($rest)*); - }}; -} - -/// Creates a styling map `Css` -/// -/// # Example -/// ``` -/// css! { -/// "btn" { -/// color: Red, -/// } -/// "btn": "clicked" { -/// color: Blue, -/// } -/// } -/// ``` -/// -/// # Returns -/// `Css` -#[macro_export] -macro_rules! css { - ( - $($inner:tt)* - ) => {{ - #[allow(unused_mut)] - let mut hm: $crate::ui::Css = std::collections::HashMap::new(); - $crate::_css!(hm, $($inner)*); - hm - }}; -} - -#[macro_export] -macro_rules! style { - ( - $key:ident: $value:literal% $(, $($rest:tt)*)? - ) => {{ - let mut _style = $crate::ui::Style::default(); - $crate::__css!(_style.0, $key: $crate::ui::Number::Pe($value)); - $crate::style!{ _style; $($($rest)*)? } - }}; - ( - $key:ident: $value:literal px $(, $($rest:tt)*)? - ) => {{ - let mut _style = $crate::ui::Style::default(); - $crate::__css!(_style.0, $key: $crate::ui::Number::Px($value)); - $crate::style!{ _style; $($($rest)*)? } - }}; - ( - $style:expr; $key:ident: $value:literal% $(, $($rest:tt)*)? - ) => {{ - $crate::__css!($style.0, $key: $crate::ui::Number::Pe($value)); - $crate::style!{ $style; $($($rest)*)? } - }}; - ( - $style:expr; $key:ident: $value:literal px $(, $($rest:tt)*)? - ) => {{ - $crate::__css!($style.0, $key: $crate::ui::Number::Px($value)); - $crate::style!{ $style; $($($rest)*)? } - }}; - ( - $key:ident: $value:expr $(, $($rest:tt)*)? - ) => {{ - let mut _style = $crate::ui::Style::default(); - $crate::__css!(_style.0, $key: $value); - $crate::style!{ _style; $($($rest)*)? } - }}; - ( - $style:expr; $key:ident: $value:expr $(, $($rest:tt)*)? - ) => {{ - let mut style_elem = $crate::ui::StyleElement::default(); - $crate::__css!($style.0, $key: $value); - $crate::style!{ $style; $($($rest)*)? } - }}; - ( - ($key:ident): $value:expr $(, $($rest:tt)*)? - ) => {{ - let mut _style = $crate::ui::Style::default(); - $crate::__css!(_style.0, ($key): $value); - $crate::style!{ _style; $($($rest)*)? } - }}; - ( - $style:expr; $key:literal: $value:expr $(, $($rest:tt)*)? - ) => {{ - let mut style_elem = $crate::ui::StyleElement::default(); - $crate::__css!($style.0, $key: $value); - $crate::style!{ $style; $($($rest)*)? } - }}; - - ( - $kind:ident {$($inner:tt)*} $(, $($rest:tt)*)? - ) => {{ - let mut _style = $crate::ui::Style::default(); - let mut style_elem = $crate::ui::StyleElement::default(); - $crate::__css!(style_elem, $($inner)*); - _style.1.insert(stringify!($kind).to_string(), style_elem); - $crate::style!{ _style; $($($rest)*)? } - }}; - ( - $style:expr; $kind:ident {$($inner:tt)*} $(, $($rest:tt)*)? - ) => {{ - let mut style_elem = $crate::ui::StyleElement::default(); - $crate::__css!(style_elem, $($inner)*); - $style.1.insert(stringify!($kind).to_string(), style_elem); - $crate::style!{ $style; $($($rest)*)? } - }}; - - ( - $style:expr; - ) => {{ - $style - }}; - - () => {{ - $crate::ui::Style::default() - }}; -} diff --git a/src/examples.rs b/src/examples.rs deleted file mode 100644 index 5345acc..0000000 --- a/src/examples.rs +++ /dev/null @@ -1,132 +0,0 @@ -pub mod counter_example { - use crate::prelude::*; - - #[component] - pub fn App() -> Element { - let count = use_state(0); - - rsx! { - @SetStyle(styling()) - - button { - class: "btn", - - on_click: fn(_, _, _) @count { - count += 1; - }, - - "The current count is: {count}" - } - } - } - - pub fn styling() -> Css { - css! { - btn { - outline: true, - outline_color: Red - } - } - } -} - -pub mod todo_example { - use crate::prelude::*; - - #[component] - pub fn App() -> Element { - let todo = vec!["Todo", "Hovering", "Completed", "Foo", "Bar"]; - - rsx! { - @SetStyle(styling()) - @SetChild(2) - - text { class: "title", static "Todo list app made with OSUI" } - text { class: "title", "{}", "-".repeat(crossterm::terminal::size().unwrap().0 as usize) } - for (t in todo) { - ersx!(button { class: "todo", on_click: fn(btn: &mut Button, _, _) { - btn.class = if btn.class == "todo" { - "complete" - } else { - "todo" - }; - }, "{t}" } ) - } - } - } - - pub fn styling() -> Css { - css! { - todo { - x: 0 px, - y: Auto, - color: Red, - } - todo: "hover" { - color: Blue, - } - complete { - x: 0 px, - y: Auto, - color: Green, - } - complete: "hover" { - color: Cyan - } - title { - x: 0 px, - y: Auto, - } - title: "hover" { - color: Blue - } - } - } -} - -pub mod login_example { - use crate::prelude::*; - - #[component] - pub fn App() -> Element { - rsx! { - @SetStyle(styling()) - - input { class: "input", id: "usr", on_click: fn(_, _, document) { - let root = document.get_root::