diff --git a/Cargo.toml b/Cargo.toml index b8e0ab885..c6cb15fba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,20 +10,22 @@ description = "Core functionality for Dioxus - a concurrent renderer-agnostic Vi [dependencies] dioxus-core = { path="./packages/core", version="0.1.0" } dioxus-core-macro = { path="./packages/core-macro", version="0.1.0" } -dioxus-html-namespace = { path="./packages/html-namespace" } +dioxus-html = { path="./packages/html", optional=true } dioxus-web = { path="./packages/web", optional=true } +dioxus-webview = { path="./packages/webview", optional=true } # dioxus-hooks = { path="./packages/hooks", version="0.0.0" } [features] -default = ["ssr", "hooks", "router", "web", "core", "atoms"] +default = ["ssr", "hooks", "router", "core", "atoms", "html", "web", "desktop"] atoms = [] core = [] ssr = [] hooks = [] router = [] +html = ["dioxus-html"] web = ["dioxus-web"] -desktop = [] +desktop = ["dioxus-webview"] [profile.dev] @@ -44,7 +46,7 @@ surf = "2.2.0" members = [ "packages/core-macro", "packages/core", - "packages/html-namespace", + "packages/html", "packages/web", "packages/webview", # "packages/atoms", diff --git a/examples/_examples/basic.rs b/examples/_examples/basic.rs index 70a6fa112..66537a379 100644 --- a/examples/_examples/basic.rs +++ b/examples/_examples/basic.rs @@ -3,7 +3,7 @@ use dioxus::events::on::MouseEvent; use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::*; fn main() { diff --git a/examples/_examples/calculator.rs b/examples/_examples/calculator.rs index 153c2cf3e..769d39db7 100644 --- a/examples/_examples/calculator.rs +++ b/examples/_examples/calculator.rs @@ -9,7 +9,7 @@ use dioxus::events::on::*; use dioxus::prelude::*; use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; const STYLE: &str = include_str!("../../../examples/assets/calculator.css"); diff --git a/examples/_examples/children.rs b/examples/_examples/children.rs index 1067fdcbf..17d63df35 100644 --- a/examples/_examples/children.rs +++ b/examples/_examples/children.rs @@ -1,7 +1,7 @@ //! Basic example that renders a simple VNode to the browser. use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::*; fn main() { diff --git a/examples/_examples/context.rs b/examples/_examples/context.rs index dc597d352..c299c19ef 100644 --- a/examples/_examples/context.rs +++ b/examples/_examples/context.rs @@ -14,7 +14,7 @@ use dioxus_core::prelude::*; use dioxus_core as dioxus; use dioxus_web::WebsysRenderer; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; fn main() { wasm_logger::init(wasm_logger::Config::new(log::Level::Trace)); diff --git a/examples/_examples/deep.rs b/examples/_examples/deep.rs index e3d97d656..bec2dd5fd 100644 --- a/examples/_examples/deep.rs +++ b/examples/_examples/deep.rs @@ -2,7 +2,7 @@ use std::rc::Rc; use dioxus::prelude::*; use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; fn main() { wasm_logger::init(wasm_logger::Config::new(log::Level::Debug)); diff --git a/examples/_examples/demoday.rs b/examples/_examples/demoday.rs index 03390f009..a77392ff8 100644 --- a/examples/_examples/demoday.rs +++ b/examples/_examples/demoday.rs @@ -1,6 +1,6 @@ use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; -use dioxus_html_namespace::*; +use dioxus_html as dioxus_elements; +use dioxus_html::*; use dioxus_web::{dioxus::prelude::*, WebsysRenderer}; fn main() { diff --git a/examples/_examples/derive.rs b/examples/_examples/derive.rs index 9d2b52e8c..bc6526155 100644 --- a/examples/_examples/derive.rs +++ b/examples/_examples/derive.rs @@ -1,6 +1,6 @@ use dioxus::{events::on::MouseEvent, prelude::*}; use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; fn main() { diff --git a/examples/_examples/fragment.rs b/examples/_examples/fragment.rs index 8934a8f9b..059f57431 100644 --- a/examples/_examples/fragment.rs +++ b/examples/_examples/fragment.rs @@ -1,7 +1,7 @@ //! Basic example that renders a simple VNode to the browser. use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::*; fn main() { diff --git a/examples/_examples/framework_benchmark.rs b/examples/_examples/framework_benchmark.rs index 018ce878a..ef1410903 100644 --- a/examples/_examples/framework_benchmark.rs +++ b/examples/_examples/framework_benchmark.rs @@ -12,7 +12,7 @@ use dioxus::events::on::MouseEvent; use dioxus_core as dioxus; use dioxus_core::prelude::*; use dioxus_web::WebsysRenderer; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; diff --git a/examples/_examples/hello.rs b/examples/_examples/hello.rs index 715ea7248..023ec3acb 100644 --- a/examples/_examples/hello.rs +++ b/examples/_examples/hello.rs @@ -1,6 +1,6 @@ use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; fn main() { diff --git a/examples/_examples/helloworld.rs b/examples/_examples/helloworld.rs index 28c250619..cda9c4d1a 100644 --- a/examples/_examples/helloworld.rs +++ b/examples/_examples/helloworld.rs @@ -1,5 +1,5 @@ use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::prelude::*; fn main() { diff --git a/examples/_examples/infer.rs b/examples/_examples/infer.rs index 45d78f64d..167e46b94 100644 --- a/examples/_examples/infer.rs +++ b/examples/_examples/infer.rs @@ -1,7 +1,7 @@ use dioxus_core as dioxus; use dioxus_core::{events::on::MouseEvent, prelude::*}; use dioxus_web::WebsysRenderer; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; fn main() { diff --git a/examples/_examples/input.rs b/examples/_examples/input.rs index 29ba23406..8c9da11a5 100644 --- a/examples/_examples/input.rs +++ b/examples/_examples/input.rs @@ -1,7 +1,7 @@ use dioxus_core as dioxus; use dioxus_core::prelude::*; use dioxus_web::WebsysRenderer; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; fn main() { diff --git a/examples/_examples/jackjillrsx.rs b/examples/_examples/jackjillrsx.rs index 7974a0bf2..147b57eca 100644 --- a/examples/_examples/jackjillrsx.rs +++ b/examples/_examples/jackjillrsx.rs @@ -1,6 +1,6 @@ use dioxus::prelude::*; use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; fn main() { diff --git a/examples/_examples/landingpage.rs b/examples/_examples/landingpage.rs index b4be2626b..a6589d7ab 100644 --- a/examples/_examples/landingpage.rs +++ b/examples/_examples/landingpage.rs @@ -3,7 +3,7 @@ use std::rc::Rc; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::*; fn main() { diff --git a/examples/_examples/landingpage2.rs b/examples/_examples/landingpage2.rs index a2f8b8817..bf47c9f97 100644 --- a/examples/_examples/landingpage2.rs +++ b/examples/_examples/landingpage2.rs @@ -1,7 +1,7 @@ //! Basic example that renders a simple VNode to the browser. use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::*; fn main() { diff --git a/examples/_examples/list.rs b/examples/_examples/list.rs index 66b965706..93260d300 100644 --- a/examples/_examples/list.rs +++ b/examples/_examples/list.rs @@ -1,6 +1,6 @@ use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; use std::collections::BTreeMap; diff --git a/examples/_examples/listy.rs b/examples/_examples/listy.rs index 8cbbd4733..97edebf99 100644 --- a/examples/_examples/listy.rs +++ b/examples/_examples/listy.rs @@ -1,6 +1,6 @@ use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; fn main() { diff --git a/examples/_examples/many.rs b/examples/_examples/many.rs index 5a84173e5..e283b4249 100644 --- a/examples/_examples/many.rs +++ b/examples/_examples/many.rs @@ -1,6 +1,6 @@ use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; fn main() { diff --git a/examples/_examples/model.rs b/examples/_examples/model.rs index 6716c2073..eae311b72 100644 --- a/examples/_examples/model.rs +++ b/examples/_examples/model.rs @@ -18,7 +18,7 @@ use dioxus::events::on::*; use dioxus::prelude::*; use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; const STYLE: &str = include_str!("../../../examples/assets/calculator.css"); diff --git a/examples/_examples/rsxt.rs b/examples/_examples/rsxt.rs index 6aae358b4..0a0d4e99a 100644 --- a/examples/_examples/rsxt.rs +++ b/examples/_examples/rsxt.rs @@ -4,7 +4,7 @@ use std::rc::Rc; use dioxus::{events::on::MouseEvent, prelude::*}; use dioxus_core as dioxus; use dioxus_web::WebsysRenderer; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; fn main() { diff --git a/examples/_examples/todomvc-nodeps.rs b/examples/_examples/todomvc-nodeps.rs index 60d2d9bca..793a787f3 100644 --- a/examples/_examples/todomvc-nodeps.rs +++ b/examples/_examples/todomvc-nodeps.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, rc::Rc}; use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; static APP_STYLE: &'static str = include_str!("./todomvc/style.css"); diff --git a/examples/_examples/todomvc/main.rs b/examples/_examples/todomvc/main.rs index 18e6ef4a2..7b637fcc8 100644 --- a/examples/_examples/todomvc/main.rs +++ b/examples/_examples/todomvc/main.rs @@ -1,5 +1,5 @@ use dioxus_core as dioxus; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::{prelude::*, WebsysRenderer}; // mod filtertoggles; diff --git a/examples/_examples/todomvc_simple.rs b/examples/_examples/todomvc_simple.rs index 189824a1a..5f8b0484f 100644 --- a/examples/_examples/todomvc_simple.rs +++ b/examples/_examples/todomvc_simple.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, rc::Rc}; use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_html_namespace as dioxus_elements; +use dioxus_html as dioxus_elements; use dioxus_web::WebsysRenderer; static APP_STYLE: &'static str = include_str!("./todomvc/style.css"); diff --git a/examples/calculator.rs b/examples/calculator.rs index 53dacf77b..4a7884ea3 100644 --- a/examples/calculator.rs +++ b/examples/calculator.rs @@ -5,7 +5,7 @@ // use dioxus::prelude::*; fn main() { - dioxus::webview::launch(App); + dioxus::desktop::launch(App); } use dioxus::events::on::*; diff --git a/examples/webview.rs b/examples/webview.rs index 8953068c2..535915cab 100644 --- a/examples/webview.rs +++ b/examples/webview.rs @@ -12,7 +12,7 @@ use dioxus::prelude::*; fn main() { - dioxus::webview::launch(App); + dioxus::desktop::launch(App); } static App: FC<()> = |cx| { diff --git a/packages/core-macro/src/rsx/ambiguous.rs b/packages/core-macro/src/rsx/ambiguous.rs index 59312d136..002c27bb9 100644 --- a/packages/core-macro/src/rsx/ambiguous.rs +++ b/packages/core-macro/src/rsx/ambiguous.rs @@ -39,6 +39,11 @@ impl Parse for AmbiguousElement { } } + // if input.peek(Ident) { + // let name_str = input.fork().parse::().unwrap().to_string(); + // } else { + // } + if let Ok(name) = input.fork().parse::() { let name_str = name.to_string(); diff --git a/packages/core-macro/src/rsx/component.rs b/packages/core-macro/src/rsx/component.rs index 98ccdc090..f5f63c3f5 100644 --- a/packages/core-macro/src/rsx/component.rs +++ b/packages/core-macro/src/rsx/component.rs @@ -45,27 +45,17 @@ impl Parse for Component { let mut children: Vec = Vec::new(); let mut manual_props = None; - 'parsing: loop { - // [1] Break if empty - if content.is_empty() { - break 'parsing; - } - - if content.peek(Token![..]) { - content.parse::()?; - manual_props = Some(content.parse::()?); - } else if content.peek(Ident) && content.peek2(Token![:]) { - body.push(content.parse::()?); - } else { - children.push(content.parse::()?); - } - - // consume comma if it exists - // we don't actually care if there *are* commas between attrs - if content.peek(Token![,]) { - let _ = content.parse::(); - } - } + parse_component_body( + &content, + &BodyParseConfig { + allow_children: true, + allow_fields: true, + allow_manual_props: true, + }, + &mut body, + &mut children, + &mut manual_props, + )?; Ok(Self { name, @@ -76,6 +66,52 @@ impl Parse for Component { } } +pub struct BodyParseConfig { + pub allow_fields: bool, + pub allow_children: bool, + pub allow_manual_props: bool, +} + +pub fn parse_component_body( + content: &ParseBuffer, + cfg: &BodyParseConfig, + body: &mut Vec, + children: &mut Vec, + manual_props: &mut Option, +) -> Result<()> { + 'parsing: loop { + // [1] Break if empty + if content.is_empty() { + break 'parsing; + } + + if content.peek(Token![..]) { + if !cfg.allow_manual_props { + // toss an error + } + content.parse::()?; + *manual_props = Some(content.parse::()?); + } else if content.peek(Ident) && content.peek2(Token![:]) { + if !cfg.allow_fields { + // toss an error + } + body.push(content.parse::()?); + } else { + if !cfg.allow_children { + // toss an error + } + children.push(content.parse::()?); + } + + // consume comma if it exists + // we don't actually care if there *are* commas between attrs + if content.peek(Token![,]) { + let _ = content.parse::(); + } + } + Ok(()) +} + impl ToTokens for Component { fn to_tokens(&self, tokens: &mut TokenStream2) { let name = &self.name; @@ -135,12 +171,6 @@ impl ToTokens for Component { let children = quote! { [ #( #childs ),* ] }; - // ChildrenList::new(__cx) - // #( .add_child(#childs) )* - // .finish() - // ChildrenList::new(__cx) - // #( .add_child(#childs) )* - // .finish() tokens.append_all(quote! { __cx.virtual_child( diff --git a/packages/core-macro/src/rsx/mod.rs b/packages/core-macro/src/rsx/mod.rs index 7ff69d7d6..2c56acad9 100644 --- a/packages/core-macro/src/rsx/mod.rs +++ b/packages/core-macro/src/rsx/mod.rs @@ -34,14 +34,14 @@ use syn::{ pub struct RsxRender { custom_context: Option, - roots: Vec, + roots: Vec, } impl Parse for RsxRender { fn parse(input: ParseStream) -> Result { - if input.peek(LitStr) { - return input.parse::()?.parse::(); - } + // if input.peek(LitStr) { + // return input.parse::()?.parse::(); + // } // try to parse the first ident and comma let custom_context = @@ -61,13 +61,23 @@ impl Parse for RsxRender { None }; - let mut roots = Vec::new(); - while !input.is_empty() { - roots.push(input.parse::()?); - } + let mut body = Vec::new(); + let mut children = Vec::new(); + let mut manual_props = None; + parse_component_body( + input, + &BodyParseConfig { + allow_children: true, + allow_fields: false, + allow_manual_props: false, + }, + &mut body, + &mut children, + &mut manual_props, + )?; Ok(Self { - roots, + roots: children, custom_context, }) } diff --git a/packages/core-macro/src/rsx/node.rs b/packages/core-macro/src/rsx/node.rs index e635d525d..c97ef7c0c 100644 --- a/packages/core-macro/src/rsx/node.rs +++ b/packages/core-macro/src/rsx/node.rs @@ -16,18 +16,6 @@ pub enum Node { RawExpr(Expr), } -impl ToTokens for Node { - fn to_tokens(&self, tokens: &mut TokenStream2) { - match &self { - Node::Element(el) => el.to_tokens(tokens), - Node::Text(txt) => txt.to_tokens(tokens), - Node::RawExpr(exp) => tokens.append_all(quote! { - __cx.fragment_from_iter(#exp) - }), - } - } -} - impl Parse for Node { fn parse(stream: ParseStream) -> Result { // Supposedly this approach is discouraged due to inability to return proper errors @@ -47,6 +35,18 @@ impl Parse for Node { } } +impl ToTokens for Node { + fn to_tokens(&self, tokens: &mut TokenStream2) { + match &self { + Node::Element(el) => el.to_tokens(tokens), + Node::Text(txt) => txt.to_tokens(tokens), + Node::RawExpr(exp) => tokens.append_all(quote! { + __cx.fragment_from_iter(#exp) + }), + } + } +} + // ======================================= // Parse just plain text // ======================================= diff --git a/packages/html-namespace/Cargo.toml b/packages/html/Cargo.toml similarity index 88% rename from packages/html-namespace/Cargo.toml rename to packages/html/Cargo.toml index 5d6e8a6f2..819a5d291 100644 --- a/packages/html-namespace/Cargo.toml +++ b/packages/html/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "dioxus-html-namespace" +name = "dioxus-html" version = "0.0.0" edition = "2018" diff --git a/packages/html-namespace/README.md b/packages/html/README.md similarity index 100% rename from packages/html-namespace/README.md rename to packages/html/README.md diff --git a/packages/html-namespace/src/lib.rs b/packages/html/src/lib.rs similarity index 100% rename from packages/html-namespace/src/lib.rs rename to packages/html/src/lib.rs diff --git a/packages/web/Cargo.toml b/packages/web/Cargo.toml index 41865a306..73584d522 100644 --- a/packages/web/Cargo.toml +++ b/packages/web/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT/Apache-2.0" [dependencies] dioxus-core = { path="../core", version="0.1.2" } -dioxus-html-namespace = { path="../html-namespace" } +dioxus-html = { path="../html" } js-sys = "0.3" wasm-bindgen = { version="0.2.71", features=["enable-interning"] } lazy_static = "1.4.0" diff --git a/packages/webview/src/dom.rs b/packages/webview/src/dom.rs index a11ee1ff3..b360e9b68 100644 --- a/packages/webview/src/dom.rs +++ b/packages/webview/src/dom.rs @@ -2,13 +2,11 @@ use dioxus_core as dioxus; use dioxus_core::prelude::*; -use dioxus_core::serialize::DomEdits; use dioxus_core::{ diff::RealDom, - prelude::ScopeIdx, + serialize::DomEdits, virtual_dom::{RealDomNode, VirtualDom}, }; -use serde::{Deserialize, Serialize}; use DomEdits::*; pub struct WebviewDom<'bump> { diff --git a/packages/webview/src/lib.rs b/packages/webview/src/lib.rs index 98073c4b1..3a60b3143 100644 --- a/packages/webview/src/lib.rs +++ b/packages/webview/src/lib.rs @@ -9,10 +9,16 @@ mod dom; static HTML_CONTENT: &'static str = include_str!("./index.html"); -pub fn launch( +pub fn launch( builder: impl FnOnce(DioxusWebviewBuilder) -> DioxusWebviewBuilder, - props: T, - root: FC, + root: FC<()>, +) -> anyhow::Result<()> { + launch_with_props(builder, (), root) +} +pub fn launch_with_props( + builder: impl FnOnce(DioxusWebviewBuilder) -> DioxusWebviewBuilder, + props: P, + root: FC

, ) -> anyhow::Result<()> { WebviewRenderer::run(root, props, builder) } diff --git a/src/lib.rs b/src/lib.rs index 10168029d..7bb844769 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -169,7 +169,7 @@ pub mod prelude { //! A glob import that includes helper types like FC, rsx!, html!, and required traits pub use dioxus_core::prelude::*; pub use dioxus_core_macro::fc; - pub use dioxus_html_namespace as dioxus_elements; + pub use dioxus_html as dioxus_elements; } // pub mod builder { // // pub use dioxus_core::builder::*; @@ -218,3 +218,6 @@ pub mod testing { } #[cfg(feature = "atoms")] pub mod atoms {} + +#[cfg(feature = "desktop")] +pub use dioxus_webview as desktop;