From 1e6e5e611b61571f272289adefc9cdd7d59c4399 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Wed, 3 Nov 2021 15:13:50 -0400 Subject: [PATCH] wip: move examples around --- .vscode/settings.json | 2 +- Cargo.toml | 1 - examples/calculator.rs | 5 +- .../examples => examples/core}/alternative.rs | 0 .../core/examples => examples/core}/async.rs | 0 .../examples => examples/core}/borrowed.rs | 0 .../examples => examples/core}/contextapi.rs | 0 .../core/examples => examples/core}/expand.rs | 0 .../core}/fragment_from_iter.rs | 0 .../core/examples => examples/core}/html.rs | 0 .../examples => examples/core}/jsframework.rs | 0 .../core/examples => examples/core}/syntax.rs | 0 .../examples => examples/core}/syntax2.rs | 0 .../core/examples => examples/core}/tasks.rs | 0 .../examples => examples/core}/vdom_usage.rs | 0 .../core_reference}/README.md | 0 .../core_reference}/antipatterns.rs | 0 .../core_reference}/basics.rs | 0 .../core_reference}/children.rs | 0 .../core_reference}/conditional_rendering.rs | 0 .../core_reference}/controlled_inputs.rs | 0 .../core_reference}/custom_elements.rs | 0 .../core_reference}/empty.rs | 0 .../core_reference}/errorhandling.rs | 0 .../core_reference}/fragments.rs | 0 .../core_reference}/global_css.rs | 0 .../core_reference}/inline_styles.rs | 0 .../core_reference}/iterators.rs | 0 .../core_reference}/listener.rs | 0 .../core_reference}/memo.rs | 0 .../core_reference}/noderefs.rs | 0 .../core_reference}/signals.rs | 0 .../core_reference}/spreadpattern.rs | 0 .../core_reference}/statemanagement.rs | 0 .../core_reference}/suspense.rs | 0 .../core_reference}/task.rs | 0 .../core_reference}/testing.rs | 0 .../core_reference}/tostring.rs | 0 examples/coroutine.rs | 20 +++---- examples/crm.rs | 10 ++-- .../examples => examples/desktop}/core.rs | 0 .../examples => examples/desktop}/crm.rs | 0 .../examples => examples/desktop}/demo.rs | 0 .../desktop}/kitchensink.rs | 0 .../examples => examples/desktop}/tauri.rs | 0 .../examples => examples/desktop}/todomvc.css | 0 .../examples => examples/desktop}/todomvc.rs | 16 +++--- examples/framework_benchmark.rs | 4 +- examples/pattern_model.rs | 5 +- .../examples/v2.rs => examples/router.rs | 8 ++- examples/rsx_usage.rs | 15 +++--- .../ssr/examples => examples/ssr}/basic.rs | 0 .../examples => examples/ssr}/hydration.rs | 0 .../examples => examples/ssr}/template.html | 0 .../ssr/examples => examples/ssr}/tide.rs | 0 .../ssr/examples => examples/ssr}/tofile.rs | 10 ++-- examples/tailwind.rs | 4 +- examples/todomvc.rs | 10 ++-- examples/weather_app.rs | 2 +- .../examples => examples/web}/async_web.rs | 0 .../web/examples => examples/web}/basic.rs | 0 .../web/examples => examples/web}/blah.rs | 0 .../web/examples => examples/web}/btns.rs | 0 .../web/examples => examples/web}/crm2.rs | 0 .../web/examples => examples/web}/demo.rs | 0 examples/webview_web.rs | 1 - packages/core/benches/jsframework.rs | 1 + packages/core/src/component.rs | 39 ++++++++++---- packages/core/src/lazynodes.rs | 8 +-- packages/core/src/lib.rs | 6 +-- packages/core/src/nodes.rs | 5 +- packages/core/tests/create_dom.rs | 21 +------- packages/desktop/Cargo.toml | 3 -- packages/desktop/src/desktop_context.rs | 10 ++-- packages/desktop/src/index.html | 2 + packages/desktop/src/lib.rs | 47 ++++++++++++++--- packages/hooks/examples/lifecycle.rs | 52 ------------------- packages/hooks/examples/reducer.rs | 1 - packages/hooks/src/use_shared_state.rs | 2 +- packages/hooks/src/usestate.rs | 2 +- packages/router/examples/blog.rs | 28 ---------- packages/ssr/src/lib.rs | 14 ++--- packages/web/.vscode/settings.json | 3 -- packages/webview-client/Cargo.toml | 8 --- packages/webview-client/README.md | 8 --- packages/webview-client/src/main.rs | 3 -- 86 files changed, 160 insertions(+), 216 deletions(-) rename {packages/core/examples => examples/core}/alternative.rs (100%) rename {packages/core/examples => examples/core}/async.rs (100%) rename {packages/core/examples => examples/core}/borrowed.rs (100%) rename {packages/core/examples => examples/core}/contextapi.rs (100%) rename {packages/core/examples => examples/core}/expand.rs (100%) rename {packages/core/examples => examples/core}/fragment_from_iter.rs (100%) rename {packages/core/examples => examples/core}/html.rs (100%) rename {packages/core/examples => examples/core}/jsframework.rs (100%) rename {packages/core/examples => examples/core}/syntax.rs (100%) rename {packages/core/examples => examples/core}/syntax2.rs (100%) rename {packages/core/examples => examples/core}/tasks.rs (100%) rename {packages/core/examples => examples/core}/vdom_usage.rs (100%) rename {reference => examples/core_reference}/README.md (100%) rename {reference => examples/core_reference}/antipatterns.rs (100%) rename {reference => examples/core_reference}/basics.rs (100%) rename {reference => examples/core_reference}/children.rs (100%) rename {reference => examples/core_reference}/conditional_rendering.rs (100%) rename {reference => examples/core_reference}/controlled_inputs.rs (100%) rename {reference => examples/core_reference}/custom_elements.rs (100%) rename {reference => examples/core_reference}/empty.rs (100%) rename {reference => examples/core_reference}/errorhandling.rs (100%) rename {reference => examples/core_reference}/fragments.rs (100%) rename {reference => examples/core_reference}/global_css.rs (100%) rename {reference => examples/core_reference}/inline_styles.rs (100%) rename {reference => examples/core_reference}/iterators.rs (100%) rename {reference => examples/core_reference}/listener.rs (100%) rename {reference => examples/core_reference}/memo.rs (100%) rename {reference => examples/core_reference}/noderefs.rs (100%) rename {reference => examples/core_reference}/signals.rs (100%) rename {reference => examples/core_reference}/spreadpattern.rs (100%) rename {reference => examples/core_reference}/statemanagement.rs (100%) rename {reference => examples/core_reference}/suspense.rs (100%) rename {reference => examples/core_reference}/task.rs (100%) rename {reference => examples/core_reference}/testing.rs (100%) rename {reference => examples/core_reference}/tostring.rs (100%) rename {packages/desktop/examples => examples/desktop}/core.rs (100%) rename {packages/desktop/examples => examples/desktop}/crm.rs (100%) rename {packages/desktop/examples => examples/desktop}/demo.rs (100%) rename {packages/desktop/examples => examples/desktop}/kitchensink.rs (100%) rename {packages/desktop/examples => examples/desktop}/tauri.rs (100%) rename {packages/desktop/examples => examples/desktop}/todomvc.css (100%) rename {packages/desktop/examples => examples/desktop}/todomvc.rs (90%) rename packages/router/examples/v2.rs => examples/router.rs (95%) rename {packages/ssr/examples => examples/ssr}/basic.rs (100%) rename {packages/ssr/examples => examples/ssr}/hydration.rs (100%) rename {packages/ssr/examples => examples/ssr}/template.html (100%) rename {packages/ssr/examples => examples/ssr}/tide.rs (100%) rename {packages/ssr/examples => examples/ssr}/tofile.rs (95%) rename {packages/web/examples => examples/web}/async_web.rs (100%) rename {packages/web/examples => examples/web}/basic.rs (100%) rename {packages/web/examples => examples/web}/blah.rs (100%) rename {packages/web/examples => examples/web}/btns.rs (100%) rename {packages/web/examples => examples/web}/crm2.rs (100%) rename {packages/web/examples => examples/web}/demo.rs (100%) delete mode 100644 packages/hooks/examples/lifecycle.rs delete mode 100644 packages/hooks/examples/reducer.rs delete mode 100644 packages/router/examples/blog.rs delete mode 100644 packages/web/.vscode/settings.json delete mode 100644 packages/webview-client/Cargo.toml delete mode 100644 packages/webview-client/README.md delete mode 100644 packages/webview-client/src/main.rs diff --git a/.vscode/settings.json b/.vscode/settings.json index 6b608c765..b3bde867c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - // "rust-analyzer.cargo.allFeatures": true + "rust-analyzer.cargo.allFeatures": true } diff --git a/Cargo.toml b/Cargo.toml index 9a066caa8..4c1863dc8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,7 +79,6 @@ members = [ "packages/ssr", "packages/desktop", "packages/mobile", - "packages/webview-client", ] diff --git a/examples/calculator.rs b/examples/calculator.rs index a00ad98f3..3fc110b64 100644 --- a/examples/calculator.rs +++ b/examples/calculator.rs @@ -114,12 +114,13 @@ const APP: FC<()> = |(cx, _)| { struct CalculatorKeyProps<'a> { name: &'static str, onclick: &'a dyn Fn(MouseEvent), + children: ScopeChildren<'a>, } -fn CalculatorKey<'a>((cx, props): Scope<'a, CalculatorKeyProps>) -> Element<'a> { +fn CalculatorKey<'a>((cx, props): Scope<'a, CalculatorKeyProps<'a>>) -> Element { rsx!(cx, button { class: "calculator-key {props.name}" onclick: {props.onclick} - {cx.children()} + {&props.children} }) } diff --git a/packages/core/examples/alternative.rs b/examples/core/alternative.rs similarity index 100% rename from packages/core/examples/alternative.rs rename to examples/core/alternative.rs diff --git a/packages/core/examples/async.rs b/examples/core/async.rs similarity index 100% rename from packages/core/examples/async.rs rename to examples/core/async.rs diff --git a/packages/core/examples/borrowed.rs b/examples/core/borrowed.rs similarity index 100% rename from packages/core/examples/borrowed.rs rename to examples/core/borrowed.rs diff --git a/packages/core/examples/contextapi.rs b/examples/core/contextapi.rs similarity index 100% rename from packages/core/examples/contextapi.rs rename to examples/core/contextapi.rs diff --git a/packages/core/examples/expand.rs b/examples/core/expand.rs similarity index 100% rename from packages/core/examples/expand.rs rename to examples/core/expand.rs diff --git a/packages/core/examples/fragment_from_iter.rs b/examples/core/fragment_from_iter.rs similarity index 100% rename from packages/core/examples/fragment_from_iter.rs rename to examples/core/fragment_from_iter.rs diff --git a/packages/core/examples/html.rs b/examples/core/html.rs similarity index 100% rename from packages/core/examples/html.rs rename to examples/core/html.rs diff --git a/packages/core/examples/jsframework.rs b/examples/core/jsframework.rs similarity index 100% rename from packages/core/examples/jsframework.rs rename to examples/core/jsframework.rs diff --git a/packages/core/examples/syntax.rs b/examples/core/syntax.rs similarity index 100% rename from packages/core/examples/syntax.rs rename to examples/core/syntax.rs diff --git a/packages/core/examples/syntax2.rs b/examples/core/syntax2.rs similarity index 100% rename from packages/core/examples/syntax2.rs rename to examples/core/syntax2.rs diff --git a/packages/core/examples/tasks.rs b/examples/core/tasks.rs similarity index 100% rename from packages/core/examples/tasks.rs rename to examples/core/tasks.rs diff --git a/packages/core/examples/vdom_usage.rs b/examples/core/vdom_usage.rs similarity index 100% rename from packages/core/examples/vdom_usage.rs rename to examples/core/vdom_usage.rs diff --git a/reference/README.md b/examples/core_reference/README.md similarity index 100% rename from reference/README.md rename to examples/core_reference/README.md diff --git a/reference/antipatterns.rs b/examples/core_reference/antipatterns.rs similarity index 100% rename from reference/antipatterns.rs rename to examples/core_reference/antipatterns.rs diff --git a/reference/basics.rs b/examples/core_reference/basics.rs similarity index 100% rename from reference/basics.rs rename to examples/core_reference/basics.rs diff --git a/reference/children.rs b/examples/core_reference/children.rs similarity index 100% rename from reference/children.rs rename to examples/core_reference/children.rs diff --git a/reference/conditional_rendering.rs b/examples/core_reference/conditional_rendering.rs similarity index 100% rename from reference/conditional_rendering.rs rename to examples/core_reference/conditional_rendering.rs diff --git a/reference/controlled_inputs.rs b/examples/core_reference/controlled_inputs.rs similarity index 100% rename from reference/controlled_inputs.rs rename to examples/core_reference/controlled_inputs.rs diff --git a/reference/custom_elements.rs b/examples/core_reference/custom_elements.rs similarity index 100% rename from reference/custom_elements.rs rename to examples/core_reference/custom_elements.rs diff --git a/reference/empty.rs b/examples/core_reference/empty.rs similarity index 100% rename from reference/empty.rs rename to examples/core_reference/empty.rs diff --git a/reference/errorhandling.rs b/examples/core_reference/errorhandling.rs similarity index 100% rename from reference/errorhandling.rs rename to examples/core_reference/errorhandling.rs diff --git a/reference/fragments.rs b/examples/core_reference/fragments.rs similarity index 100% rename from reference/fragments.rs rename to examples/core_reference/fragments.rs diff --git a/reference/global_css.rs b/examples/core_reference/global_css.rs similarity index 100% rename from reference/global_css.rs rename to examples/core_reference/global_css.rs diff --git a/reference/inline_styles.rs b/examples/core_reference/inline_styles.rs similarity index 100% rename from reference/inline_styles.rs rename to examples/core_reference/inline_styles.rs diff --git a/reference/iterators.rs b/examples/core_reference/iterators.rs similarity index 100% rename from reference/iterators.rs rename to examples/core_reference/iterators.rs diff --git a/reference/listener.rs b/examples/core_reference/listener.rs similarity index 100% rename from reference/listener.rs rename to examples/core_reference/listener.rs diff --git a/reference/memo.rs b/examples/core_reference/memo.rs similarity index 100% rename from reference/memo.rs rename to examples/core_reference/memo.rs diff --git a/reference/noderefs.rs b/examples/core_reference/noderefs.rs similarity index 100% rename from reference/noderefs.rs rename to examples/core_reference/noderefs.rs diff --git a/reference/signals.rs b/examples/core_reference/signals.rs similarity index 100% rename from reference/signals.rs rename to examples/core_reference/signals.rs diff --git a/reference/spreadpattern.rs b/examples/core_reference/spreadpattern.rs similarity index 100% rename from reference/spreadpattern.rs rename to examples/core_reference/spreadpattern.rs diff --git a/reference/statemanagement.rs b/examples/core_reference/statemanagement.rs similarity index 100% rename from reference/statemanagement.rs rename to examples/core_reference/statemanagement.rs diff --git a/reference/suspense.rs b/examples/core_reference/suspense.rs similarity index 100% rename from reference/suspense.rs rename to examples/core_reference/suspense.rs diff --git a/reference/task.rs b/examples/core_reference/task.rs similarity index 100% rename from reference/task.rs rename to examples/core_reference/task.rs diff --git a/reference/testing.rs b/examples/core_reference/testing.rs similarity index 100% rename from reference/testing.rs rename to examples/core_reference/testing.rs diff --git a/reference/tostring.rs b/examples/core_reference/tostring.rs similarity index 100% rename from reference/tostring.rs rename to examples/core_reference/tostring.rs diff --git a/examples/coroutine.rs b/examples/coroutine.rs index 14faaaa47..3cafeb055 100644 --- a/examples/coroutine.rs +++ b/examples/coroutine.rs @@ -46,7 +46,8 @@ static App: FC<()> = |(cx, props)| { }); cx.render(rsx! { - div { style: { width: "400px", height: "400px", position: "relative", background: "yellow" } + div { + width: "400px", height: "400px", position: "relative", background: "yellow" button { "reset", onclick: move |_| {} } Horsey { pos: *p1, "horsey 1" } Horsey { pos: *p2, "horsey 2" } @@ -54,18 +55,19 @@ static App: FC<()> = |(cx, props)| { }) }; -#[derive(PartialEq, Props)] -struct HorseyProps { +#[derive(Props)] +struct HorseyProps<'a> { pos: i32, + children: ScopeChildren<'a>, } -static Horsey: FC = |(cx, props)| { +fn Horsey<'a>((cx, props): Scope<'a, HorseyProps<'a>>) -> Element { cx.render(rsx! { - div { - button { "pause" } div { - {cx.children()} + button { "pause" } + div { + {&props.children} + } } - } }) -}; +} diff --git a/examples/crm.rs b/examples/crm.rs index 994a43f72..be1abb3d9 100644 --- a/examples/crm.rs +++ b/examples/crm.rs @@ -20,12 +20,12 @@ pub struct Client { } static App: FC<()> = |(cx, _)| { - let clients = use_ref(cx, || vec![] as Vec); - let scene = use_state(cx, || Scene::ClientsList); + let mut clients = use_ref(cx, || vec![] as Vec); + let mut scene = use_state(cx, || Scene::ClientsList); - let firstname = use_state(cx, || String::new()); - let lastname = use_state(cx, || String::new()); - let description = use_state(cx, || String::new()); + let mut firstname = use_state(cx, || String::new()); + let mut lastname = use_state(cx, || String::new()); + let mut description = use_state(cx, || String::new()); let scene = match *scene { Scene::ClientsList => { diff --git a/packages/desktop/examples/core.rs b/examples/desktop/core.rs similarity index 100% rename from packages/desktop/examples/core.rs rename to examples/desktop/core.rs diff --git a/packages/desktop/examples/crm.rs b/examples/desktop/crm.rs similarity index 100% rename from packages/desktop/examples/crm.rs rename to examples/desktop/crm.rs diff --git a/packages/desktop/examples/demo.rs b/examples/desktop/demo.rs similarity index 100% rename from packages/desktop/examples/demo.rs rename to examples/desktop/demo.rs diff --git a/packages/desktop/examples/kitchensink.rs b/examples/desktop/kitchensink.rs similarity index 100% rename from packages/desktop/examples/kitchensink.rs rename to examples/desktop/kitchensink.rs diff --git a/packages/desktop/examples/tauri.rs b/examples/desktop/tauri.rs similarity index 100% rename from packages/desktop/examples/tauri.rs rename to examples/desktop/tauri.rs diff --git a/packages/desktop/examples/todomvc.css b/examples/desktop/todomvc.css similarity index 100% rename from packages/desktop/examples/todomvc.css rename to examples/desktop/todomvc.css diff --git a/packages/desktop/examples/todomvc.rs b/examples/desktop/todomvc.rs similarity index 90% rename from packages/desktop/examples/todomvc.rs rename to examples/desktop/todomvc.rs index cd78eb523..6e85b87c6 100644 --- a/packages/desktop/examples/todomvc.rs +++ b/examples/desktop/todomvc.rs @@ -34,11 +34,11 @@ pub type Todos = HashMap; pub static App: FC<()> = |(cx, _)| { // Share our TodoList to the todos themselves - use_provide_state(cx, || Todos::new()); + use_provide_state(cx, Todos::new); // Save state for the draft, filter - let mut draft = use_state(cx, || "".to_string()); - let mut filter = use_state(cx, || FilterState::All); + let draft = use_state(cx, || "".to_string()); + let filter = use_state(cx, || FilterState::All); let mut todo_id = use_state(cx, || 0); // Consume the todos @@ -95,7 +95,7 @@ pub static App: FC<()> = |(cx, _)| { placeholder: "What needs to be done?" value: "{draft}" autofocus: "true" - oninput: move |evt| draft.set(evt.value.clone()) + oninput: move |evt| draft.set(evt.value) onkeydown: move |evt| { if evt.key == "Enter" { submit_todo(); @@ -150,7 +150,9 @@ pub fn TodoEntry((cx, props): Scope) -> Element { div { class: "view" input { class: "toggle" r#type: "checkbox" id: "cbg-{todo.id}" checked: "{todo.checked}" onchange: move |evt| { - todos.write().get_mut(&props.id).map(|todo| todo.checked = evt.value.parse().unwrap()); + if let Some(todo) = todos.write().get_mut(&props.id) { + todo.checked = evt.value.parse().unwrap() + } } } @@ -161,7 +163,9 @@ pub fn TodoEntry((cx, props): Scope) -> Element { {is_editing.then(|| rsx!{ input { value: "{todo.contents}" oninput: move |evt| { - todos.write().get_mut(&props.id).map(|todo| todo.contents = evt.value.clone()); + if let Some(todo) = todos.write().get_mut(&props.id) { + todo.contents = evt.value + } }, } })} diff --git a/examples/framework_benchmark.rs b/examples/framework_benchmark.rs index 5ca02fb49..6dd9a9073 100644 --- a/examples/framework_benchmark.rs +++ b/examples/framework_benchmark.rs @@ -10,11 +10,11 @@ fn main() { type RowList = im_rc::HashMap, FxBuildHasher>; static App: FC<()> = |(cx, _props)| { - let items = use_state(cx, || RowList::default()); + let mut items = use_state(cx, || RowList::default()); let create_rendered_rows = move |from, num| move |_| items.set(create_row_list(from, num)); - let append_1_000_rows = + let mut append_1_000_rows = move |_| items.set(create_row_list(items.len(), 1000).union((*items).clone())); let update_every_10th_row = move |_| { diff --git a/examples/pattern_model.rs b/examples/pattern_model.rs index 33d2063a4..0accd1702 100644 --- a/examples/pattern_model.rs +++ b/examples/pattern_model.rs @@ -74,14 +74,15 @@ static App: FC<()> = |(cx, props)| { struct CalculatorKeyProps<'a> { name: &'static str, onclick: &'a dyn Fn(MouseEvent), + children: ScopeChildren<'a>, } -fn CalculatorKey<'a>((cx, props): Scope<'a, CalculatorKeyProps>) -> Element<'a> { +fn CalculatorKey<'a>((cx, props): Scope<'a, CalculatorKeyProps<'a>>) -> Element<'a> { cx.render(rsx! { button { class: "calculator-key {props.name}" onclick: {props.onclick} - {cx.children()} + {&props.children} } }) } diff --git a/packages/router/examples/v2.rs b/examples/router.rs similarity index 95% rename from packages/router/examples/v2.rs rename to examples/router.rs index 6bea4b58e..e04f92ebd 100644 --- a/packages/router/examples/v2.rs +++ b/examples/router.rs @@ -1,9 +1,5 @@ use dioxus::prelude::*; -use dioxus_router::{use_router, Link, Routable}; - -fn main() { - dbg!(App as *const fn()); -} +use dioxus::router::Router; #[derive(PartialEq, Debug, Clone)] pub enum Route { @@ -86,3 +82,5 @@ impl Routable for Route { todo!() } } + +fn main() {} diff --git a/examples/rsx_usage.rs b/examples/rsx_usage.rs index dffd440b4..becf386f5 100644 --- a/examples/rsx_usage.rs +++ b/examples/rsx_usage.rs @@ -162,13 +162,13 @@ pub static Example: FC<()> = |(cx, props)| { // Can pass in props directly as an expression {{ - let props = TallerProps {a: "hello"}; + let props = TallerProps {a: "hello", children: Default::default()}; rsx!(Taller { ..props }) }} // Spreading can also be overridden manually Taller { - ..TallerProps { a: "ballin!" } + ..TallerProps { a: "ballin!", children: Default::default() } a: "not ballin!" } @@ -180,7 +180,7 @@ pub static Example: FC<()> = |(cx, props)| { mod baller { use super::*; - #[derive(PartialEq, Props)] + #[derive(Props, PartialEq)] pub struct BallerProps {} /// This component totally balls @@ -189,13 +189,16 @@ mod baller { } } -#[derive(Debug, PartialEq, Props)] -pub struct TallerProps { +#[derive(Props)] +pub struct TallerProps<'a> { a: &'static str, + + #[builder(default)] + children: ScopeChildren<'a>, } /// This component is taller than most :) -pub fn Taller(_: Scope) -> Element { +pub fn Taller<'a>(_: Scope<'a, TallerProps<'a>>) -> Element { let b = true; todo!() } diff --git a/packages/ssr/examples/basic.rs b/examples/ssr/basic.rs similarity index 100% rename from packages/ssr/examples/basic.rs rename to examples/ssr/basic.rs diff --git a/packages/ssr/examples/hydration.rs b/examples/ssr/hydration.rs similarity index 100% rename from packages/ssr/examples/hydration.rs rename to examples/ssr/hydration.rs diff --git a/packages/ssr/examples/template.html b/examples/ssr/template.html similarity index 100% rename from packages/ssr/examples/template.html rename to examples/ssr/template.html diff --git a/packages/ssr/examples/tide.rs b/examples/ssr/tide.rs similarity index 100% rename from packages/ssr/examples/tide.rs rename to examples/ssr/tide.rs diff --git a/packages/ssr/examples/tofile.rs b/examples/ssr/tofile.rs similarity index 95% rename from packages/ssr/examples/tofile.rs rename to examples/ssr/tofile.rs index 83e4dc28a..35777240f 100644 --- a/packages/ssr/examples/tofile.rs +++ b/examples/ssr/tofile.rs @@ -119,14 +119,14 @@ pub static Entry: FC<()> = |(cx, props)| { pub static StacksIcon: FC<()> = |(cx, props)| { cx.render(rsx!( svg { - // xmlns: "http://www.w3.org/2000/svg" + xmlns: "http://www.w3.org/2000/svg" fill: "none" stroke: "currentColor" stroke_linecap: "round" stroke_linejoin: "round" stroke_width: "2" - // class: "w-10 h-10 text-white p-2 bg-indigo-500 rounded-full" - viewBox: "0 0 24 24" + class: "w-10 h-10 text-white p-2 bg-indigo-500 rounded-full" + view_box: "0 0 24 24" path { d: "M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"} } )) @@ -139,8 +139,8 @@ pub static RightArrowIcon: FC<()> = |(cx, props)| { stroke_linecap: "round" stroke_linejoin: "round" stroke_width: "2" - // class: "w-4 h-4 ml-1" - viewBox: "0 0 24 24" + class: "w-4 h-4 ml-1" + view_box: "0 0 24 24" path { d: "M5 12h14M12 5l7 7-7 7"} } )) diff --git a/examples/tailwind.rs b/examples/tailwind.rs index e9b8b5378..47046be8f 100644 --- a/examples/tailwind.rs +++ b/examples/tailwind.rs @@ -117,7 +117,7 @@ pub static StacksIcon: FC<()> = |(cx, props)| { stroke_linejoin: "round" stroke_width: "2" class: "w-10 h-10 text-white p-2 bg-indigo-500 rounded-full" - viewBox: "0 0 24 24" + view_box: "0 0 24 24" path { d: "M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"} } )) @@ -131,7 +131,7 @@ pub static RightArrowIcon: FC<()> = |(cx, props)| { stroke_linejoin: "round" stroke_width: "2" class: "w-4 h-4 ml-1" - viewBox: "0 0 24 24" + view_box: "0 0 24 24" path { d: "M5 12h14M12 5l7 7-7 7"} } )) diff --git a/examples/todomvc.rs b/examples/todomvc.rs index 294ae36db..6ed2c1d7d 100644 --- a/examples/todomvc.rs +++ b/examples/todomvc.rs @@ -23,9 +23,9 @@ pub struct TodoItem { const STYLE: &str = include_str!("./assets/todomvc.css"); const App: FC<()> = |(cx, props)| { - let draft = use_state(cx, || "".to_string()); - let todos = use_state(cx, || HashMap::>::new()); - let filter = use_state(cx, || FilterState::All); + let mut draft = use_state(cx, || "".to_string()); + let mut todos = use_state(cx, || HashMap::>::new()); + let mut filter = use_state(cx, || FilterState::All); let todolist = todos .iter() @@ -86,8 +86,8 @@ pub struct TodoEntryProps { } pub fn TodoEntry((cx, props): Scope) -> Element { - let is_editing = use_state(cx, || false); - let contents = use_state(cx, || String::from("")); + let mut is_editing = use_state(cx, || false); + let mut contents = use_state(cx, || String::from("")); let todo = &props.todo; rsx!(cx, li { diff --git a/examples/weather_app.rs b/examples/weather_app.rs index f1772805b..2682b9f9b 100644 --- a/examples/weather_app.rs +++ b/examples/weather_app.rs @@ -26,7 +26,7 @@ static App: FC<()> = |(cx, props)| { }, |cx, props| { // - rsx!(cx, WeatherDisplay {}) + rsx!(WeatherDisplay {}) }, ); diff --git a/packages/web/examples/async_web.rs b/examples/web/async_web.rs similarity index 100% rename from packages/web/examples/async_web.rs rename to examples/web/async_web.rs diff --git a/packages/web/examples/basic.rs b/examples/web/basic.rs similarity index 100% rename from packages/web/examples/basic.rs rename to examples/web/basic.rs diff --git a/packages/web/examples/blah.rs b/examples/web/blah.rs similarity index 100% rename from packages/web/examples/blah.rs rename to examples/web/blah.rs diff --git a/packages/web/examples/btns.rs b/examples/web/btns.rs similarity index 100% rename from packages/web/examples/btns.rs rename to examples/web/btns.rs diff --git a/packages/web/examples/crm2.rs b/examples/web/crm2.rs similarity index 100% rename from packages/web/examples/crm2.rs rename to examples/web/crm2.rs diff --git a/packages/web/examples/demo.rs b/examples/web/demo.rs similarity index 100% rename from packages/web/examples/demo.rs rename to examples/web/demo.rs diff --git a/examples/webview_web.rs b/examples/webview_web.rs index 55be2dcea..408095c57 100644 --- a/examples/webview_web.rs +++ b/examples/webview_web.rs @@ -22,7 +22,6 @@ static App: FC<()> = |(cx, props)| { cx.render(rsx! { div { h1 { "Hifive counter: {count}" } - {cx.children()} button { onclick: move |_| count += 1, "Up high!" } button { onclick: move |_| count -= 1, "Down low!" } } diff --git a/packages/core/benches/jsframework.rs b/packages/core/benches/jsframework.rs index 3fc3c273c..d0c8aae77 100644 --- a/packages/core/benches/jsframework.rs +++ b/packages/core/benches/jsframework.rs @@ -19,6 +19,7 @@ use dioxus_core_macro::*; use dioxus_html as dioxus_elements; use rand::prelude::*; +fn main() {} criterion_group!(mbenches, create_rows); criterion_main!(mbenches); diff --git a/packages/core/src/component.rs b/packages/core/src/component.rs index 5c7b4c36c..e249bfae1 100644 --- a/packages/core/src/component.rs +++ b/packages/core/src/component.rs @@ -5,7 +5,10 @@ //! if the type supports PartialEq. The Properties trait is used by the rsx! and html! macros to generate the type-safe builder //! that ensures compile-time required and optional fields on cx. -use crate::innerlude::{Context, Element, VNode}; +use crate::{ + innerlude::{Context, Element, VAnchor, VFragment, VNode}, + LazyNodes, ScopeChildren, +}; /// A component is a wrapper around a Context and some Props that share a lifetime /// /// @@ -41,23 +44,39 @@ use crate::innerlude::{Context, Element, VNode}; pub type Scope<'a, T> = (Context<'a>, &'a T); pub struct FragmentProps<'a> { - childen: &'a VNode<'a>, + children: ScopeChildren<'a>, } -pub struct FragmentPropsBuilder<'a> { - childen: Option<&'a VNode<'a>>, + +pub struct FragmentBuilder<'a, const BUILT: bool> { + children: Option>, +} +impl<'a> FragmentBuilder<'a, false> { + pub fn children(mut self, children: ScopeChildren<'a>) -> FragmentBuilder<'a, true> { + FragmentBuilder { + children: Some(children), + } + } +} + +impl<'a, const A: bool> FragmentBuilder<'a, A> { + pub fn build(self) -> FragmentProps<'a> { + FragmentProps { + children: self.children.unwrap_or_default(), + } + } } impl<'a> Properties for FragmentProps<'a> { - type Builder = FragmentPropsBuilder<'a>; + type Builder = FragmentBuilder<'a, false>; const IS_STATIC: bool = false; fn builder() -> Self::Builder { - todo!() + FragmentBuilder { children: None } } unsafe fn memoize(&self, other: &Self) -> bool { - todo!() + false } } @@ -83,8 +102,10 @@ impl<'a> Properties for FragmentProps<'a> { /// You want to use this free-function when your fragment needs a key and simply returning multiple nodes from rsx! won't cut it. /// #[allow(non_upper_case_globals, non_snake_case)] -pub fn Fragment<'a>((_, props): Scope<'a, FragmentProps<'a>>) -> Element<'a> { - Some(props.childen.decouple()) +pub fn Fragment<'a>((cx, props): Scope<'a, FragmentProps<'a>>) -> Element<'a> { + cx.render(Some(LazyNodes::new(|f| { + f.fragment_from_iter(&props.children) + }))) } /// Every "Props" used for a component must implement the `Properties` trait. This trait gives some hints to Dioxus diff --git a/packages/core/src/lazynodes.rs b/packages/core/src/lazynodes.rs index 249948517..19f56cf58 100644 --- a/packages/core/src/lazynodes.rs +++ b/packages/core/src/lazynodes.rs @@ -11,7 +11,7 @@ //! The logic for this was borrowed from https://docs.rs/stack_dst/0.6.1/stack_dst/. Unfortunately, this crate does not //! support non-static closures, so we've implemented the core logic of `ValueA` in this module. -use crate::innerlude::{NodeFactory, VNode}; +use crate::prelude::{NodeFactory, VNode}; use std::mem; /// A concrete type provider for closures that build VNode structures. @@ -27,7 +27,7 @@ pub struct LazyNodes<'a, 'b> { inner: StackNodeStorage<'a, 'b>, } -type StackHeapSize = [usize; 12]; +type StackHeapSize = [usize; 0]; enum StackNodeStorage<'a, 'b> { Stack(LazyStack), @@ -77,7 +77,7 @@ impl<'a, 'b> LazyNodes<'a, 'b> { } } else { log::debug!("lazy nodes fits on stack!"); - let mut buf: StackHeapSize = [0; 12]; + let mut buf: StackHeapSize = StackHeapSize::default(); assert!(info.len() + round_to_words(size) <= buf.as_ref().len()); @@ -97,6 +97,8 @@ impl<'a, 'b> LazyNodes<'a, 'b> { *dataptr.add(i) = *src_ptr.add(i); } + std::mem::forget(val); + Self { inner: StackNodeStorage::Stack(LazyStack { _align: [], buf }), } diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index 8fc6bddc7..f602f512e 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -65,9 +65,9 @@ pub(crate) mod innerlude { } pub use crate::innerlude::{ - Context, DioxusElement, DomEdit, Element, ElementId, EventPriority, MountType, Mutations, - NodeFactory, Properties, SchedulerMsg, ScopeChildren, ScopeId, SuspendedContext, TaskHandle, - TestDom, ThreadsafeVirtualDom, UserEvent, VNode, VirtualDom, FC, + Context, DioxusElement, DomEdit, Element, ElementId, EventPriority, LazyNodes, MountType, + Mutations, NodeFactory, Properties, SchedulerMsg, ScopeChildren, ScopeId, SuspendedContext, + TaskHandle, TestDom, ThreadsafeVirtualDom, UserEvent, VNode, VirtualDom, FC, }; pub mod prelude { diff --git a/packages/core/src/nodes.rs b/packages/core/src/nodes.rs index 728a1f4cf..9b9693a8e 100644 --- a/packages/core/src/nodes.rs +++ b/packages/core/src/nodes.rs @@ -765,6 +765,9 @@ impl<'a> ScopeChildren<'a> { pub fn new(root: VNode<'a>) -> Self { Self { root: Some(root) } } + pub fn new_option(root: Option>) -> Self { + Self { root } + } } impl IntoIterator for &ScopeChildren<'_> { @@ -773,7 +776,7 @@ impl IntoIterator for &ScopeChildren<'_> { type IntoIter = std::iter::Once; fn into_iter(self) -> Self::IntoIter { - todo!() + std::iter::once(self) } } diff --git a/packages/core/tests/create_dom.rs b/packages/core/tests/create_dom.rs index 875db7a75..712bf3713 100644 --- a/packages/core/tests/create_dom.rs +++ b/packages/core/tests/create_dom.rs @@ -303,27 +303,8 @@ fn anchors() { #[test] fn suspended() { static App: FC<()> = |(cx, props)| { - let val = use_suspense( - cx, - || async { - // - }, - |cx, p| todo!(), - // |cx, p| rsx! { "hi "}, - ); + let val = use_suspense(cx, || async {}, |cx, p| todo!()); - // let prom = use_task(fetch()); - - // Value { - // a: value.await, - // b: value.await, - // f: a.await - // div { - // div { - // hidden: should_hide.await, - // } - // } - // } cx.render(rsx! { {val} }) }; diff --git a/packages/desktop/Cargo.toml b/packages/desktop/Cargo.toml index 948ffcc0b..e6aef1378 100644 --- a/packages/desktop/Cargo.toml +++ b/packages/desktop/Cargo.toml @@ -34,6 +34,3 @@ tokio_runtime = ["tokio"] dioxus-html = { path = "../html" } dioxus-hooks = { path = "../hooks" } simple_logger = "1.13.0" - - -[build-dependencies] diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 1cf369d9f..54b62217a 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -1,6 +1,7 @@ use std::cell::RefCell; use dioxus::prelude::Scope; +use dioxus::ScopeChildren; use dioxus_core as dioxus; use dioxus_core::{Context, Element, LazyNodes, NodeFactory, Properties}; use dioxus_core_macro::Props; @@ -42,6 +43,8 @@ pub struct WebviewWindowProps<'a> { /// focuse me onfocused: &'a dyn FnMut(()), + + children: ScopeChildren<'a>, } /// A handle to a @@ -70,9 +73,10 @@ pub fn WebviewWindow<'a>((cx, props): Scope<'a, WebviewWindowProps>) -> Element< ); // render the children directly - cx.render(LazyNodes::new(move |f: NodeFactory| { - f.fragment_from_iter(cx.children()) - })) + todo!() + // cx.render(LazyNodes::new(move |f: NodeFactory| { + // f.fragment_from_iter(cx.children()) + // })) } pub struct WindowHandle {} diff --git a/packages/desktop/src/index.html b/packages/desktop/src/index.html index ebddd60d5..428a3b8d8 100644 --- a/packages/desktop/src/index.html +++ b/packages/desktop/src/index.html @@ -13,6 +13,8 @@ position: fixed; } --> + + diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 3f521c9ab..7484f1bbc 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -20,9 +20,9 @@ use serde::{Deserialize, Serialize}; pub use wry; use wry::application::accelerator::{Accelerator, SysMods}; -use wry::application::event::{Event, StartCause, WindowEvent}; +use wry::application::event::{ElementState, Event, StartCause, WindowEvent}; use wry::application::event_loop::{self, ControlFlow, EventLoop}; -use wry::application::keyboard::KeyCode; +use wry::application::keyboard::{Key, KeyCode, ModifiersState}; use wry::application::menu::{MenuBar, MenuItem, MenuItemAttributes}; use wry::application::window::Fullscreen; use wry::webview::{WebView, WebViewBuilder}; @@ -94,6 +94,11 @@ pub fn run( let props_shared = Cell::new(Some(props)); + // create local modifier state + let mut modifiers = ModifiersState::default(); + + let quit_hotkey = Accelerator::new(SysMods::Cmd, KeyCode::KeyQ); + event_loop.run(move |event, event_loop, control_flow| { *control_flow = ControlFlow::Wait; @@ -112,10 +117,8 @@ pub fn run( first_menu.add_native_item(MenuItem::HideOthers); first_menu.add_native_item(MenuItem::ShowAll); - let quit_item = first_menu.add_item( - MenuItemAttributes::new("Quit") - .with_accelerators(&Accelerator::new(SysMods::Cmd, KeyCode::KeyQ)), - ); + first_menu.add_native_item(MenuItem::Quit); + first_menu.add_native_item(MenuItem::CloseWindow); // create second menu let mut second_menu = MenuBar::new(); @@ -129,6 +132,7 @@ pub fn run( menu_bar_menu.add_submenu("Second menu", true, second_menu); let window = WindowBuilder::new() + .with_maximized(true) .with_menu(menu_bar_menu) .with_title("Dioxus App") .build(event_loop) @@ -197,6 +201,37 @@ pub fn run( event, window_id, .. } => match event { WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit, + WindowEvent::Destroyed { .. } => { + webviews.remove(&window_id); + if webviews.is_empty() { + *control_flow = ControlFlow::Exit; + } + } + // catch only pressed event + WindowEvent::KeyboardInput { event, .. } => { + log::debug!("keybowrd input"); + if quit_hotkey.matches(&modifiers, &event.physical_key) { + log::debug!("quitting"); + + webviews.remove(&window_id); + if webviews.is_empty() { + *control_flow = ControlFlow::Exit; + } + } + + // println!( + // "KeyEvent: `Shift` + `1` | logical_key: {:?}", + // &event.logical_key + // ); + // we can match manually without `Accelerator` + + // else if event.key_without_modifiers() == Key::Character("1") + // && modifiers.is_empty() + // { + // println!("KeyEvent: `1`"); + // } + } + WindowEvent::Resized(_) | WindowEvent::Moved(_) => { if let Some(view) = webviews.get_mut(&window_id) { let _ = view.resize(); diff --git a/packages/hooks/examples/lifecycle.rs b/packages/hooks/examples/lifecycle.rs deleted file mode 100644 index 6988b8ae5..000000000 --- a/packages/hooks/examples/lifecycle.rs +++ /dev/null @@ -1,52 +0,0 @@ -fn main() {} - -// struct CompState { -// tasks: Vec<()>, -// } -// enum Actions { -// Add, -// MoveUp, -// MoveDown, -// Remvoe, -// } - -// static Component: FC<()> = |(cx, props)|{ -// let (tasks, dispatch) = use_reducer( -// cx, -// || CompState { tasks: Vec::new() }, -// |state, action: Actions| match action { -// Actions::Add => state, -// Actions::MoveUp => state, -// Actions::MoveDown => state, -// Actions::Remvoe => state, -// }, -// ); - -// let tasklist = { (0..10).map(|f| html! {
  • }) }.collect::>(); - -// html! { -//
    -//
    -//

    "Tasks: "

    -//
      -// {tasklist} -//
    -//
    -//
    -// -// -// -// -//
    -//
    -// } -// }; - -// fn use_reducer( -// cx: &mut Context, -// init: fn() -> State, -// reducer: fn(State, Action) -> State, -// ) -> (State, impl Fn(Action)) { -// let ii = init(); -// (ii, |_| {}) -// } diff --git a/packages/hooks/examples/reducer.rs b/packages/hooks/examples/reducer.rs deleted file mode 100644 index f328e4d9d..000000000 --- a/packages/hooks/examples/reducer.rs +++ /dev/null @@ -1 +0,0 @@ -fn main() {} diff --git a/packages/hooks/src/use_shared_state.rs b/packages/hooks/src/use_shared_state.rs index 593cf3922..b1febb498 100644 --- a/packages/hooks/src/use_shared_state.rs +++ b/packages/hooks/src/use_shared_state.rs @@ -126,7 +126,7 @@ impl<'a, T: 'static> UseSharedState<'a, T> { /// /// /// TODO: We prevent unncessary notifications only in the hook, but we should figure out some more global lock - pub fn write(&mut self) -> RefMut<'_, T> { + pub fn write(&self) -> RefMut<'_, T> { self.cx.needs_update(); self.notify_consumers(); self.value.borrow_mut() diff --git a/packages/hooks/src/usestate.rs b/packages/hooks/src/usestate.rs index 79402f22d..76a72ea75 100644 --- a/packages/hooks/src/usestate.rs +++ b/packages/hooks/src/usestate.rs @@ -102,7 +102,7 @@ impl<'a, T: 'static> UseState<'a, T> { } } - pub fn set(&mut self, new_val: T) { + pub fn set(&self, new_val: T) { *self.inner.wip.borrow_mut() = Some(new_val); self.needs_update(); } diff --git a/packages/router/examples/blog.rs b/packages/router/examples/blog.rs deleted file mode 100644 index fa282363c..000000000 --- a/packages/router/examples/blog.rs +++ /dev/null @@ -1,28 +0,0 @@ -use dioxus::prelude::*; - -fn main() {} - -enum Routes { - Home, - Blog, -} - -static App: FC<()> = |(cx, props)| { - let route = use_router::(cx); - - let content = match route { - Routes::Home => rsx!(Home {}), - Routes::Blog => rsx!(Blog {}), - }; - - cx.render(rsx! { - {content} - }) -}; - -fn use_router

    (cx: Context) -> &P { - todo!() -} - -static Home: FC<()> = |(cx, props)| todo!(); -static Blog: FC<()> = |(cx, props)| todo!(); diff --git a/packages/ssr/src/lib.rs b/packages/ssr/src/lib.rs index 2813a9d82..9e5faa693 100644 --- a/packages/ssr/src/lib.rs +++ b/packages/ssr/src/lib.rs @@ -31,10 +31,7 @@ impl SsrRenderer { } } - pub fn render_lazy<'a, F: FnOnce(NodeFactory<'a>) -> VNode<'a>>( - &'a mut self, - f: LazyNodes<'a, F>, - ) -> String { + pub fn render_lazy<'a>(&'a mut self, f: Option>) -> String { let bump = &mut self.inner as *mut _; let s = self.render_inner(f); // reuse the bump's memory @@ -42,10 +39,7 @@ impl SsrRenderer { s } - fn render_inner<'a, F: FnOnce(NodeFactory<'a>) -> VNode<'a>>( - &'a self, - f: LazyNodes<'a, F>, - ) -> String { + fn render_inner<'a>(&'a self, f: Option>) -> String { let factory = NodeFactory::new(&self.inner); let root = f.into_vnode(factory); format!( @@ -59,7 +53,7 @@ impl SsrRenderer { } } -pub fn render_lazy<'a, F: FnOnce(NodeFactory<'a>) -> VNode<'a>>(f: LazyNodes<'a, F>) -> String { +pub fn render_lazy<'a>(f: Option>) -> String { let bump = bumpalo::Bump::new(); let borrowed = ≎ @@ -398,7 +392,7 @@ mod tests { fn styles() { static STLYE_APP: FC<()> = |(cx, _)| { cx.render(rsx! { - div { style: { color: "blue", font_size: "46px" } } + div { color: "blue", font_size: "46px" } }) }; diff --git a/packages/web/.vscode/settings.json b/packages/web/.vscode/settings.json deleted file mode 100644 index 2b58ae251..000000000 --- a/packages/web/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "rust-analyzer.inlayHints.enable": false -} diff --git a/packages/webview-client/Cargo.toml b/packages/webview-client/Cargo.toml deleted file mode 100644 index 0218e3a0c..000000000 --- a/packages/webview-client/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "dioxus-webview-client" -version = "0.0.0" -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] \ No newline at end of file diff --git a/packages/webview-client/README.md b/packages/webview-client/README.md deleted file mode 100644 index e3032b25c..000000000 --- a/packages/webview-client/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# the client part of the vdom - - -this crate is designed to be the "receiving end" of the dioxus virtualdom, using wasm_bindgen to expose an API for the receiving end. - - - - diff --git a/packages/webview-client/src/main.rs b/packages/webview-client/src/main.rs deleted file mode 100644 index e7a11a969..000000000 --- a/packages/webview-client/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -}