Compare commits

...

622 Commits

Author SHA1 Message Date
Greg Johnston
f8c036ab51 chore: unused import 2024-06-28 15:28:17 -04:00
Greg Johnston
d31c48b115 restore fallback for compressed version 2024-06-28 15:28:03 -04:00
Greg Johnston
46376bbd0c docs: working on memo docs 2024-06-28 15:21:24 -04:00
Greg Johnston
0d83042621 0.7.0-alpha 2024-06-28 15:21:24 -04:00
Greg Johnston
a951bad070 feat: support reactive and asynchronous ProtectedRoute conditions 2024-06-28 15:21:24 -04:00
Greg Johnston
0bf9063a76 fix: correct For behavior when mounting with siblings, and when clearing 2024-06-28 15:21:24 -04:00
Ben Wishovich
78581d87cb Make get_configuration sync (#2647)
* Made get_configuraiton sync

* Update examples
2024-06-28 15:21:24 -04:00
Greg Johnston
af1525d4ea examples: update directives tests 2024-06-28 15:21:24 -04:00
Greg Johnston
61a9d45060 chore: cargo fmt 2024-06-28 15:21:24 -04:00
Greg Johnston
1bf2982d03 make RemoveEventHandler a concrete type 2024-06-28 15:21:24 -04:00
Greg Johnston
5d7dfd360e feat: add ElementExt to give access to the same view APIs at runtime that we do at compile time 2024-06-28 15:21:24 -04:00
Greg Johnston
704b66ec31 feat: add ElementExt to give access to the same view APIs at runtime that we do at compile time 2024-06-28 15:21:24 -04:00
Greg Johnston
3ff20c3708 chore: cargo fmt 2024-06-28 15:21:24 -04:00
Greg Johnston
7c2df473c2 chore: cargo fmt 2024-06-28 15:21:24 -04:00
Greg Johnston
a75edf3526 docs: warn on unused RenderEffect 2024-06-28 15:21:24 -04:00
Greg Johnston
f0e259f42f chore: missing Debug implementations 2024-06-28 15:21:24 -04:00
Greg Johnston
e3e9ad54c6 chore: suppress unnecessary .into() warning 2024-06-28 15:21:24 -04:00
Greg Johnston
d344f96138 cargo fmt 2024-06-28 15:21:24 -04:00
Greg Johnston
876ce79c2a updated directives example 2024-06-28 15:21:24 -04:00
brofrain
336e702b86 fix: update HtmlViewState & BodyViewState as well 2024-06-28 15:21:24 -04:00
Kajetan Welc
09bdeb7286 fix: do not accidentally mount things before meta tags in the <head> when updating the DOM v2 2024-06-28 15:21:24 -04:00
Greg Johnston
6aac824207 remove log 2024-06-28 15:21:24 -04:00
Greg Johnston
baf11b30b3 preliminary work on directives (not useful yet until we have an ElementExt that allows you to do things declaratively from an Element 2024-06-28 15:21:24 -04:00
Greg Johnston
6e6d16ffe5 omit () entirely if it is the only child of an HTML element 2024-06-28 15:21:24 -04:00
Greg Johnston
cadd3cdd09 fix: don't override a text node's 'next sibling after text' position if it's in Either, now that they don't have separate marker nodes 2024-06-28 15:21:24 -04:00
Greg Johnston
548e5acb39 fix: do not accidentally mount things before meta tags in the <head> when updating the DOM 2024-06-28 15:21:24 -04:00
Greg Johnston
d135dbf337 fix docs for hydrate_islands 2024-06-28 15:21:24 -04:00
Greg Johnston
c1458fd061 hackernews islands example 2024-06-28 15:21:24 -04:00
Greg Johnston
57170beca6 update static file serving in Axum examples 2024-06-28 15:21:00 -04:00
Greg Johnston
72492f3102 fix islands ci setup 2024-06-28 15:20:05 -04:00
Greg Johnston
ea22cd3757 fix: remove extra comment at end of Suspense now that Either no longer requires it 2024-06-28 15:20:05 -04:00
Greg Johnston
0dded850ab feat: provide static file handling/fallback directly in integration 2024-06-28 15:20:05 -04:00
Greg Johnston
c189fbef6c islands example 2024-06-28 15:20:05 -04:00
Greg Johnston
ee8ac29496 remove unused tests and dependencies 2024-06-28 15:20:05 -04:00
Greg Johnston
645c4abee3 fix: () in templates 2024-06-28 15:20:05 -04:00
Greg Johnston
532ee6daea chore: clippy 2024-06-28 15:20:05 -04:00
Greg Johnston
4f65c4440a fix js-framework-benchmark for stable 2024-06-28 15:20:05 -04:00
Greg Johnston
c7fd25d164 update hackernews_axum to 0.7 2024-06-28 15:20:05 -04:00
Greg Johnston
5f944f997f fix ErrorBoundary starting in error state in CSR 2024-06-28 15:20:05 -04:00
Greg Johnston
3a633be215 fix example tests 2024-06-28 15:20:05 -04:00
Greg Johnston
7581348bcd remove unnecessary logs 2024-06-28 15:20:05 -04:00
Greg Johnston
c6e8058b82 update islands example 2024-06-28 15:20:05 -04:00
Greg Johnston
dd6e05559f chore: unused hooks 2024-06-28 15:20:05 -04:00
Greg Johnston
d9d80344fb regression test for 7094dee150 2024-06-28 15:20:05 -04:00
Greg Johnston
c82661b5b1 fix: signals mark subscribers dirty, but don't say they're always dirty if they haven't changed 2024-06-28 15:20:04 -04:00
Greg Johnston
262df175dd make Routes fallback run lazily 2024-06-28 15:20:04 -04:00
Greg Johnston
8d13b3e679 make ErrorBoundary fallback run lazily 2024-06-28 15:20:04 -04:00
Greg Johnston
bd92397ac7 examples: errors_axum 2024-06-28 15:20:04 -04:00
Greg Johnston
b464d5c842 chore(ci): fix examples 2024-06-28 15:20:04 -04:00
Greg Johnston
beecba5532 enable reactive-graph hydration when hydration is enabled 2024-06-28 15:20:04 -04:00
Greg Johnston
c880250729 allow conversion directly from Arc signal types to MaybeSignal 2024-06-28 15:20:04 -04:00
Greg Johnston
463f5f4440 expose Owner::shared_context() 2024-06-28 15:20:04 -04:00
Greg Johnston
bc2cd0c7c1 0.7 Provider component 2024-06-28 15:20:04 -04:00
Greg Johnston
db467fb153 fix tests 2024-06-28 15:20:04 -04:00
Greg Johnston
da37908d81 fix reactive styles 2024-06-28 15:20:04 -04:00
Greg Johnston
df31ffb00a fix: correctly rebuild reactive attributes to avoid stale signals 2024-06-28 15:20:04 -04:00
Greg Johnston
53778936fa type-erase RenderEffeect functions for binary size improvements 2024-06-28 15:20:04 -04:00
luoxiaozero
897751de40 feat: Attr exposes PhantomData field (#2641) 2024-06-28 15:20:04 -04:00
Greg Johnston
1c024b7464 chore(ci): remove warnings in tests 2024-06-28 15:20:04 -04:00
Greg Johnston
9f2963c4a9 feat: 0.7 query signals 2024-06-28 15:20:04 -04:00
Greg Johnston
e4a2344110 chore(ci): add Makefiles for smaller packages 2024-06-28 15:20:04 -04:00
Greg Johnston
68c4038fe5 chore(ci): only run semver checks if not labeled 'breaking' 2024-06-28 15:20:04 -04:00
Greg Johnston
057b449ba2 chore: clippy 2024-06-28 15:20:04 -04:00
Greg Johnston
4b323829f0 rename from new_serde to new 2024-06-28 15:20:04 -04:00
Greg Johnston
e58d4f8fa8 remove most remaining marker/placeholder elements 2024-06-28 15:20:04 -04:00
Greg Johnston
85cf4bfde8 add trait impls and encodings for SharedValue 2024-06-28 15:20:04 -04:00
Greg Johnston
fdf8250770 default to SerdeJson encoding for resources, use new_str() for Str encoding 2024-06-28 15:20:04 -04:00
Greg Johnston
947079ef99 feat: synchronous serialized values with SharedValue 2024-06-28 15:20:04 -04:00
Greg Johnston
618f649a4c whenever we create a new root Owner, set it as the current owner, which will make it the default owner (e.g., during SSR) instead of None 2024-06-28 15:20:04 -04:00
Greg Johnston
da31d321ec fix: can't memoize JS properties, because they can be set between signal updates by user input 2024-06-28 15:20:04 -04:00
Greg Johnston
a62b154ec8 fix: correctly escape style and class attributes 2024-06-28 15:20:04 -04:00
Greg Johnston
30544ca05b chore: clippy 2024-06-28 15:20:04 -04:00
Greg Johnston
eaa039efcc don't require spawn_local for actios 2024-06-28 15:20:04 -04:00
Greg Johnston
f1f5e19136 catch resource reads inside Signal during Suspense 2024-06-28 15:20:04 -04:00
Greg Johnston
f14702c39f fix CSS file names 2024-06-28 15:20:04 -04:00
Greg Johnston
602b36ee60 update todo app csr 2024-06-28 15:20:04 -04:00
Greg Johnston
8605e3f0cb fix: correctly escape text nodes, except in script/style tags 2024-06-28 15:20:04 -04:00
Greg Johnston
f45dbf25ab chore: clean up examples for CI 2024-06-28 15:20:04 -04:00
Greg Johnston
9be2bad400 fix: provide matched route via context when rebuilding (so <A> works) 2024-06-28 15:20:04 -04:00
Greg Johnston
0600a646be unused 2024-06-28 15:20:04 -04:00
Greg Johnston
722bedee63 refactor insert_before_this to find parent lazily, and use it for rebuilding reactive components by replacing their whole contents 2024-06-28 15:20:04 -04:00
Greg Johnston
597eb4fc04 make sure SendWrapper supports Futures 2024-06-28 15:20:04 -04:00
Greg Johnston
5ec26aeada move several complex examples into projects 2024-06-28 15:20:04 -04:00
Greg Johnston
c84e189a61 update js-framework-benchmark example 2024-06-28 15:20:04 -04:00
Greg Johnston
88831c5543 fix test text 2024-06-28 15:20:04 -04:00
Greg Johnston
f455c55b85 fix: custom Stream implementation for streaming resource data that supports nested data/multiple polled values, rather than taking it all at once at the beginning 2024-06-28 15:20:04 -04:00
Greg Johnston
dec1b02579 suspense_tests: actually wait for other resource in nested case 2024-06-28 15:20:04 -04:00
Greg Johnston
c4ccc306ca can save a lookup here 2024-06-28 15:20:04 -04:00
Greg Johnston
330c2928fc remove unused workspace member 2024-06-28 15:20:04 -04:00
Greg Johnston
464c42f314 update workflows 2024-06-28 15:20:04 -04:00
Greg Johnston
6d71383637 remove unused leptos_reactive integration 2024-06-28 15:20:04 -04:00
Greg Johnston
2a99996e53 remove old router files 2024-06-28 15:20:04 -04:00
Greg Johnston
21292c059f fix Cargo.toml after merge 2024-06-28 15:20:04 -04:00
Greg Johnston
36b9354869 re-enable all routes 2024-06-28 15:20:04 -04:00
Greg Johnston
c2cbfd50a3 chore: clean up warnings and logging 2024-06-28 15:20:04 -04:00
Greg Johnston
499b7ea4fc reverted Fn()/FnMut() change 2024-06-28 15:20:04 -04:00
Greg Johnston
54595e0ef8 Revert "fix: constrain reactive rendering to Fn(), because using dry_resolve() for Suspense requires idempotent render functions so that they can be called once (to register resources) and called a second time to resolve"
This reverts commit 7ec5c77ba3e8f45bae04a7661a56741f95125adb.
2024-06-28 15:20:04 -04:00
Greg Johnston
3eb6b14da7 progress on updating suspense tests 2024-06-28 15:20:04 -04:00
Greg Johnston
1d0865bee7 add server redirects 2024-06-28 15:20:04 -04:00
Greg Johnston
7145efc813 fix: relative path resolution 2024-06-28 15:20:04 -04:00
Greg Johnston
db99714f66 simplifying todo examples 2024-06-28 15:20:04 -04:00
Greg Johnston
e184438b2c initial work updating suspense tests 2024-06-28 15:20:04 -04:00
Greg Johnston
0a0d1803b8 clarify hydrate/csr warning 2024-06-28 15:20:04 -04:00
Greg Johnston
812ad7c59f export actions in prelude 2024-06-28 15:20:04 -04:00
Greg Johnston
8105a27b13 remove Into<_> by default for setting signals, because it interferes with type inference 2024-06-28 15:20:04 -04:00
Greg Johnston
eb0fa2cc9e add support for unsync actions 2024-06-28 15:20:04 -04:00
Greg Johnston
fec59ff13f simplifying and updating server fns example 2024-06-28 15:20:04 -04:00
Greg Johnston
134a9d1593 change name to shell 2024-06-28 15:20:04 -04:00
Greg Johnston
506e5a7470 update control flow components to new Fn() constraint 2024-06-28 15:20:04 -04:00
Greg Johnston
08bfcdb0ff fix: constrain reactive rendering to Fn(), because using dry_resolve() for Suspense requires idempotent render functions so that they can be called once (to register resources) and called a second time to resolve 2024-06-28 15:20:04 -04:00
Greg Johnston
97c1a32200 add Debug impl 2024-06-28 15:20:04 -04:00
Greg Johnston
3bf17f9ff7 fix: actually concatenate nested routes during route generation 2024-06-28 15:20:04 -04:00
Greg Johnston
aff6939f79 reorganize Outlet export 2024-06-28 15:20:04 -04:00
Greg Johnston
4c7223136c examples: porting to 0.7 and cleaning up 2024-06-28 15:20:04 -04:00
Greg Johnston
0379a3c2ff fix merge 2024-06-28 15:20:04 -04:00
Rakshith Ravi
8dacdb5917 Update import statements in examples (#2625) 2024-06-28 15:20:04 -04:00
Greg Johnston
6fa4b0cd4c examples: use application 404 page 2024-06-28 15:20:04 -04:00
Greg Johnston
17442f3e94 chore: cargo fmt 2024-06-28 15:20:04 -04:00
Greg Johnston
f9100a6752 chore: cargo fmt 2024-06-28 15:20:03 -04:00
Greg Johnston
bffe2607d8 add warnings if correct features not set for browser 2024-06-28 15:20:03 -04:00
Greg Johnston
e8f2c5a931 use csr feature so that reactivity runs 2024-06-28 15:20:03 -04:00
Greg Johnston
382ece1686 chore: clippy 2024-06-28 15:20:03 -04:00
Greg Johnston
4be21eb298 examples: fix input type so tests work, and update text to make the purpose clearer 2024-06-28 15:20:03 -04:00
Greg Johnston
6c9f3a9c2d remove leptos_reactive (moved into reactive_graph and leptos_server) 2024-06-28 15:20:03 -04:00
Greg Johnston
04d1ed3371 fix: Clone for ArcResource and default to SerdeJson for Resource 2024-06-28 15:20:03 -04:00
Greg Johnston
a9552411fe chore: clippy 2024-06-28 15:20:03 -04:00
Greg Johnston
ffbaa482b9 fix: don't dispose of parent owners before Suspense children have been rendered 2024-06-28 15:20:03 -04:00
Greg Johnston
fc670fb473 warn if trying to use meta on server side without context 2024-06-28 15:20:03 -04:00
Greg Johnston
d911638221 only run RenderEffects when effects are enabled 2024-06-28 15:20:03 -04:00
Greg Johnston
90513e8156 add set_pending to <Transition/> 2024-06-28 15:20:03 -04:00
Greg Johnston
abc53662f8 simplify FlatRoutes logic by using existing OwnedView infrastructure 2024-06-28 15:20:03 -04:00
Greg Johnston
914db2da00 reexport tick() for testing 2024-06-28 15:20:03 -04:00
Greg Johnston
68273127c2 fix: ensure that leptos_meta and leptos_router are in SSR mode if using one of the server integrations 2024-06-28 15:20:03 -04:00
Greg Johnston
b277e8322e examples: update hackernews for SSR support 2024-06-28 15:20:03 -04:00
Greg Johnston
a4f68d8061 fix: correctly notify multiple subscribers to same AsyncDerived 2024-06-28 15:20:03 -04:00
Greg Johnston
d9ed2caf5a fix: Routes SSR 2024-06-28 15:20:03 -04:00
Greg Johnston
df4189f7bf fix: correct owner for HTML rendering in FlatRoutes 2024-06-28 15:20:03 -04:00
Greg Johnston
944329fdba testing: provide tick() that can be called anywhere in tests 2024-06-28 15:20:03 -04:00
Greg Johnston
136f96b090 testing: provide tick() that can be called anywhere in tests 2024-06-28 15:20:03 -04:00
Greg Johnston
869fc2fb01 fix portal tests 2024-06-28 15:20:03 -04:00
Greg Johnston
a28042e863 fix cleanups in render effects 2024-06-28 15:20:03 -04:00
Greg Johnston
1dda2fb1dd chore: clippy 2024-06-28 15:20:03 -04:00
Greg Johnston
3f094e76ae update counters_isomorphic 2024-06-28 15:20:03 -04:00
Greg Johnston
5e8ff1f222 reexport spawn and spawn_local 2024-06-28 15:20:03 -04:00
Greg Johnston
8a9466acda ReadSignal from stream 2024-06-28 15:20:03 -04:00
Greg Johnston
c4c491935b refactor to allow rendering Resource directly in view 2024-06-28 15:20:03 -04:00
Greg Johnston
ddbbb68255 removed AnimatedShow example (duplicates the component docs) 2024-06-28 15:20:03 -04:00
Greg Johnston
b9be78bfc9 properly serialize errors 2024-06-28 15:20:03 -04:00
Greg Johnston
324a3e5e37 chore: clear warning 2024-06-28 15:20:03 -04:00
Greg Johnston
32666b97fe pick up on server action error in both server and client 2024-06-28 15:20:03 -04:00
Greg Johnston
a03870315e fmt and chores in examples 2024-06-28 15:20:03 -04:00
Greg Johnston
ddc68b9698 fix: serialize an empty string into HTML so it still works as a text node 2024-06-28 15:20:03 -04:00
Greg Johnston
4437e9cc75 fix: make router fallback lazy 2024-06-28 15:20:03 -04:00
Greg Johnston
e800108c46 add expect_context 2024-06-28 15:20:03 -04:00
Greg Johnston
136be456b2 fix attr:class when spreading onto a component 2024-06-28 15:20:03 -04:00
Greg Johnston
a8f75f9678 add ServerAction error handling for any error type (closes #2325) 2024-06-28 15:20:03 -04:00
Greg Johnston
0e4398bc86 remove unused import 2024-06-28 15:20:03 -04:00
Greg Johnston
fb38f51f82 clean up example 2024-06-28 15:20:03 -04:00
Greg Johnston
7a7bc394df add CollectView 2024-06-28 15:20:03 -04:00
Greg Johnston
c78608d1d0 Actix todo_app_sqlite 2024-06-28 15:20:03 -04:00
Greg Johnston
b7d3a628a1 fix: don't drop Owner in FlatRoutes until route has been rendered (thanks @benwis) 2024-06-28 15:20:03 -04:00
Greg Johnston
6556a0b6a5 fix: make sure all resource reads are registered 2024-06-28 15:20:03 -04:00
Greg Johnston
5a7ddeb9af chore: clippy and unused dependencies in integrations 2024-06-28 15:20:03 -04:00
Greg Johnston
2a9ac08d6e add some tracing and debug info to HTML elements 2024-06-28 15:20:03 -04:00
Greg Johnston
b896e4d5bf refactor integrations and add Actix integration 2024-06-28 15:20:03 -04:00
Greg Johnston
757435b218 feat: 0.7 nonce support 2024-06-28 15:20:03 -04:00
Greg Johnston
65b2dc4136 ResponseOptions support 2024-06-28 15:20:03 -04:00
Greg Johnston
c83435812d fix counters tests 2024-06-28 15:20:03 -04:00
Greg Johnston
e10d872c02 allow .children() on HTML elements 2024-06-28 15:20:03 -04:00
Greg Johnston
c335203205 remove async demo 2024-06-28 15:20:03 -04:00
Greg Johnston
98ccf27909 fix: writing to lock that has a read 2024-06-28 15:20:03 -04:00
Greg Johnston
521a591ee4 allow untracking on write guards to support maybe_update 2024-06-28 15:20:03 -04:00
Greg Johnston
7dbfb0a86e feat: allow .write() on all writeable signals 2024-06-28 15:20:03 -04:00
Greg Johnston
0894dbff58 feat: add .by_ref() to create a Future from an AsyncDerived (etc.) that takes a reference, rather than cloning 2024-06-28 15:20:03 -04:00
Greg Johnston
cce4b0aef0 use impl trait in props 2024-06-28 15:20:03 -04:00
Greg Johnston
dea4a2a91a update wasm-bindgen testing approaches 2024-06-28 15:20:03 -04:00
Greg Johnston
828ea30c86 chore: clearing warnings in examples 2024-06-28 15:20:03 -04:00
Greg Johnston
fb583262f4 additional warnings 2024-06-28 15:20:03 -04:00
Greg Johnston
e92711166d cargo fmt 2024-06-28 15:20:03 -04:00
Greg Johnston
db134bce48 chore: clear up... a few warnings 2024-06-28 15:20:03 -04:00
Greg Johnston
7d54ecf4a1 update sledgehammer integration 2024-06-28 15:20:03 -04:00
Greg Johnston
37112d9cc2 remove signal function setter Send-only implementation (dead code) 2024-06-28 15:20:03 -04:00
Greg Johnston
dd21e7e8b7 remove signal function call Read implementations (dead code) 2024-06-28 15:20:03 -04:00
Greg Johnston
63e120f147 remove leptos_reactive dependency 2024-06-28 15:20:03 -04:00
Greg Johnston
70b3a7b259 oco merge issues 2024-06-28 15:20:03 -04:00
Greg Johnston
2b5321dcdd feat: return an async guard from .await rather than cloning the value every time 2024-06-28 15:20:03 -04:00
Greg Johnston
6a6770ccee fix return type in async tests 2024-06-28 15:20:03 -04:00
Greg Johnston
5d9eab2e03 fix tests that run effects 2024-06-28 15:20:03 -04:00
Greg Johnston
6e24177139 feat: return Option from AsyncDerived.get() instead of AsyncState 2024-06-28 15:20:03 -04:00
Greg Johnston
51720368ce example: restore ErrorBoundary 2024-06-28 15:20:03 -04:00
Greg Johnston
906bb15c13 docs for Owner and context 2024-06-28 15:20:03 -04:00
Greg Johnston
39154d917a fix tests 2024-06-28 15:20:03 -04:00
Greg Johnston
e7d3d4ecf2 poll AsyncDerived synchronously so that it has the correct value during hydration if it reads from a resource 2024-06-28 15:20:02 -04:00
Greg Johnston
a88375204d correct dirty-checking on AsyncDerived 2024-06-28 15:20:02 -04:00
Greg Johnston
7442147737 fix regular suspense if nothing was read synchronously 2024-06-28 15:20:02 -04:00
Greg Johnston
d20b8b52a0 missing dry_resolve on Static 2024-06-28 15:20:02 -04:00
Greg Johnston
bd26c611e5 feat: support *either* .await or reactive reads inside Suspense 2024-06-28 15:20:02 -04:00
Greg Johnston
679799f9c8 feat: 0.7 slots 2024-06-28 15:20:02 -04:00
Greg Johnston
a3efe5a228 feat: enhanced spreading syntax 2024-06-28 15:20:02 -04:00
Greg Johnston
5c7a5654eb fix external navigations 2024-06-28 15:20:02 -04:00
Greg Johnston
d481c1b3c8 make WindowListenerHandle Send + Sync so it can be remove via on_cleanup 2024-06-28 15:20:02 -04:00
Greg Johnston
e9d86a549f restore ssr/hydration for Routes 2024-06-28 15:20:02 -04:00
Greg Johnston
9290a1a66e get nested Routes working again 2024-06-28 15:20:02 -04:00
Greg Johnston
89b15e784b default to Params::get() giving an owned value (which you want in a derived signal), but use reference in the macro 2024-06-28 15:20:02 -04:00
Greg Johnston
f1c1401da6 add proper dirty checking on AsyncDerived so it can read from memos properly 2024-06-28 15:20:02 -04:00
Greg Johnston
3eca539423 make NavigateOptions pub 2024-06-28 15:20:02 -04:00
Greg Johnston
6c09456f5a feat: owning memo 2024-06-28 15:20:02 -04:00
Greg Johnston
3190ebc971 remove warnings in tests and only run if effects are enabled 2024-06-28 15:20:02 -04:00
Greg Johnston
d82215c919 fix: prevent memos that have changed from re-triggering the running effect, by setting the Observer during .update_if_necessary() 2024-06-28 15:20:02 -04:00
Greg Johnston
a35b9f283c feat: add Popover API 2024-06-28 15:20:02 -04:00
Greg Johnston
0eca06e5a2 fix Script children 2024-06-28 15:20:02 -04:00
Greg Johnston
aa32552f1a fix hydration of Suspend by including the missing placeholder it expects during hydration 2024-06-28 15:20:02 -04:00
Greg Johnston
472674a841 add missing marker comments for Result 2024-06-28 15:20:02 -04:00
Greg Johnston
86aa1a019e include marker comments in html len 2024-06-28 15:20:02 -04:00
Greg Johnston
0734af4cb1 unused owner 2024-06-28 15:20:02 -04:00
Greg Johnston
ced6510e7d impl From/Into for Signal/ArcSignal 2024-06-28 15:20:02 -04:00
Greg Johnston
df0e59bf8a add ArcSignal::derive() 2024-06-28 15:20:02 -04:00
Greg Johnston
717c99a1c5 routing progress indicator 2024-06-28 15:20:02 -04:00
Greg Johnston
4d28b134d4 missing min attribute 2024-06-28 15:20:02 -04:00
Greg Johnston
a74fe75e10 clean up 2024-06-28 15:20:02 -04:00
Greg Johnston
a38b410587 remove log 2024-06-28 15:20:02 -04:00
Greg Johnston
23256f4d9d relax trait bounds on reactive types where possible 2024-06-28 15:20:02 -04:00
Greg Johnston
16d6110e75 add SignalSetter 2024-06-28 15:20:02 -04:00
Greg Johnston
c79852cea5 use transition between navigations 2024-06-28 15:20:02 -04:00
Greg Johnston
97c5a7ca9d add async transitions that wait for any AsyncDerived created/triggered under them before resolving 2024-06-28 15:20:02 -04:00
Greg Johnston
dac4549117 resolve() on OwnedView 2024-06-28 15:20:02 -04:00
Greg Johnston
ff4e3338e0 restore hydration feature for some of its feature-gating benefits for Resource deserialization 2024-06-28 15:20:02 -04:00
Greg Johnston
1f4de404ee cargo fmt 2024-06-28 15:20:02 -04:00
Greg Johnston
adf5fe83b1 create separate URL/params signals for each route, to prevent updating them and running side effects while navigating away 2024-06-28 15:20:02 -04:00
Greg Johnston
88feadecc9 fmt 2024-06-28 15:20:02 -04:00
Greg Johnston
9ddebd2413 distinguish between dirty and check in effects, so that memos and signals both work correctly 2024-06-28 15:20:02 -04:00
Greg Johnston
6e97cb30a1 remove unused feature 2024-06-28 15:20:02 -04:00
Greg Johnston
1dfb34413c updated future impls 2024-06-28 15:20:02 -04:00
Greg Johnston
92b2d72bfb check whether ArcAsyncDerived actually needs to run when marked check 2024-06-28 15:20:02 -04:00
Greg Johnston
ebbf1e9118 add ancestry debugging for owners 2024-06-28 15:20:02 -04:00
Greg Johnston
9e84e1f57c lazy Future construction for AsyncDerived 2024-06-28 15:20:02 -04:00
Greg Johnston
8be0f499b9 support Resource in CSR for backward-compat 2024-06-28 15:20:02 -04:00
Greg Johnston
481c0c8e19 allow let: syntax to work 2024-06-28 15:20:02 -04:00
Greg Johnston
9515840c9a scope Suspense/Transition correctly within ownership tree 2024-06-28 15:20:02 -04:00
Greg Johnston
83cd043ac7 upgrading hackernews example 2024-06-28 15:20:02 -04:00
Greg Johnston
e103b10a02 immediately commit URL signal updates 2024-06-28 15:20:02 -04:00
Greg Johnston
1ca0039f91 reexport A from router::components 2024-06-28 15:20:02 -04:00
Greg Johnston
2826b5d252 add IntoAny to tachys prelude 2024-06-28 15:20:02 -04:00
Greg Johnston
cb3fb964d9 finish support for innerHTML 2024-06-28 15:20:02 -04:00
Greg Johnston
06ea212d40 feat: iterating over items in children with ChildrenFragment, ChildrenFragmentFn, ChildrenFragmentMut 2024-06-28 15:20:02 -04:00
Greg Johnston
4cf0a6782c only warn about non-reactive accesses if effects are enabled 2024-06-28 15:20:02 -04:00
Greg Johnston
1d11836c23 only run effects on client 2024-06-28 15:20:02 -04:00
Greg Johnston
6c6a009281 resolve() implementation for AnyView 2024-06-28 15:20:02 -04:00
Greg Johnston
bc66faea1c fix deadlock on nested Signals 2024-06-28 15:20:02 -04:00
Greg Johnston
ada87a4b4d fix FlatRouter SSR/hydration after lazy routes 2024-06-28 15:20:02 -04:00
Greg Johnston
0fc64a432f feat: nested islands with context for 0.7 2024-06-28 15:20:02 -04:00
Greg Johnston
13b22c7623 fix: correct Send + Sync bounds for children 2024-06-28 15:20:02 -04:00
Greg Johnston
d481dee95f feat: minimal island support in 0.7 2024-06-28 15:20:02 -04:00
Greg Johnston
65c6527527 docs: full docs and doctests for Action/MultiAction 2024-06-28 15:20:02 -04:00
Greg Johnston
f96b8b24ec remove support for rendering guards directly, as they are !Send and holding onto them in State is also a bad idea 2024-06-28 15:20:02 -04:00
Greg Johnston
079cb4d675 support nightly static values for style:key="value" 2024-06-28 15:20:02 -04:00
Greg Johnston
2f39ac5c33 revert to using .get() for function calls 2024-06-28 15:20:02 -04:00
Greg Johnston
dca7c857ae fix: only rerun effects if they have dirty ancestors (or it's the first run) 2024-06-28 15:20:02 -04:00
Greg Johnston
ef3b95fca0 start working on porting over docs and tests and 0.7... 2024-06-28 15:20:02 -04:00
Greg Johnston
f5d95b2f73 fix meta issue with attributes 2024-06-28 15:20:02 -04:00
Greg Johnston
b906625a83 fix tracing issue 2024-06-28 15:20:02 -04:00
Greg Johnston
cfd369e5ff chore: get tests in a working state 2024-06-28 15:20:02 -04:00
Greg Johnston
36ab0e8ead fix: make Selector Send/Sync 2024-06-28 15:20:02 -04:00
Greg Johnston
440e397bb2 docs: runtime warning if you use .track() outside a tracking context 2024-06-28 15:20:02 -04:00
Greg Johnston
c5520dca48 preliminary tracing for tachys 2024-06-28 15:20:02 -04:00
Greg Johnston
2aacf81380 chore: warnings 2024-06-28 15:20:02 -04:00
Greg Johnston
43f70983ac examples: router in 0.7 2024-06-28 15:20:02 -04:00
Greg Johnston
386665d6b6 fix: passing context through router 2024-06-28 15:20:02 -04:00
Greg Johnston
38b84b3c61 chore: fix warnings about variable case 2024-06-28 15:20:02 -04:00
Greg Johnston
b1ee80ef9e examples: timer in 0.7 2024-06-28 15:20:02 -04:00
Greg Johnston
3586f772a4 feat: Portals in 0.7 2024-06-28 15:20:02 -04:00
Greg Johnston
b2920ea32a allow either eager or lazy routes 2024-06-28 15:20:02 -04:00
Greg Johnston
0f5cb43d26 update StoredValue API in callbacks 2024-06-28 15:20:02 -04:00
Greg Johnston
4731bb0716 chore: clippy warnings 2024-06-28 15:20:02 -04:00
Greg Johnston
7d8e51f81a smooth out StoredValue APIs 2024-06-28 15:20:02 -04:00
Greg Johnston
38d7acc7d0 MaybeSignal and MaybeProp 2024-06-28 15:20:02 -04:00
Marc-Stefan Cassola
393cd6577b added a few old deprecated functions to help users port (#2580) 2024-06-28 15:20:02 -04:00
Greg Johnston
db1de18549 implement With(Untracked) for Signal 2024-06-28 15:20:02 -04:00
Greg Johnston
8225697a50 don't over-rerender nested router 2024-06-28 15:20:02 -04:00
Greg Johnston
6e77f3a25f initial async routing work (to support bundle splitting) 2024-06-28 15:20:02 -04:00
Greg Johnston
fcd5f682e2 noop attribute 'spreading' for routers 2024-06-28 15:20:02 -04:00
Greg Johnston
7427c3417f support arbitrary attributes on components in view 2024-06-28 15:20:01 -04:00
Greg Johnston
436bd3f743 full attribute spreading 2024-06-28 15:20:01 -04:00
Greg Johnston
c11055cb0d update counter_without_macros imports 2024-06-28 15:20:01 -04:00
Greg Johnston
816deeba86 stashing 2024-06-28 15:20:01 -04:00
Greg Johnston
8fa9c2a210 give a route to upgrade any attribute into a cloneable one 2024-06-28 15:20:01 -04:00
Greg Johnston
cfc5bb6c82 work on attribute spreading 2024-06-28 15:20:01 -04:00
Greg Johnston
9fb0b021c1 disable AddAnyAttr again now that I remember why it was broken 2024-06-28 15:20:01 -04:00
Greg Johnston
a9e9832b10 reenable AnyAttr 2024-06-28 15:20:01 -04:00
Greg Johnston
e2a47e979b reorganizing exports and updating examples 2024-06-28 15:20:01 -04:00
Greg Johnston
5fc03b8f54 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
4b805e1c72 fix reorganized exports 2024-06-28 15:20:01 -04:00
Greg Johnston
4478444734 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
243e88cd35 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
e775a64bb9 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
9c2c9c4eca module restructuring for 0.7 2024-06-28 15:20:01 -04:00
Greg Johnston
a347f25959 let ErrorBoundary own the fallback 2024-06-28 15:20:01 -04:00
Greg Johnston
2cb146f6af make Suspend a transparent wrapper 2024-06-28 15:20:01 -04:00
Greg Johnston
0a611c9448 provide params properly in FlatRouter 2024-06-28 15:20:01 -04:00
Greg Johnston
d76b7a3bf3 clear some warnings 2024-06-28 15:20:01 -04:00
Greg Johnston
1775060fb0 rename TupleBuilder to NextTuple and prep for release 2024-06-28 15:20:01 -04:00
Greg Johnston
f576babd6f prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
07eaa15902 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
ce83ca2504 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
5584f3fc37 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
d470de5a4c rename any_error 2024-06-28 15:20:01 -04:00
Greg Johnston
74faa51022 prep for preview release 2024-06-28 15:20:01 -04:00
Greg Johnston
65a400e084 remove twiggy file 2024-06-28 15:20:01 -04:00
Greg Johnston
35dc9b5e25 move router crates 2024-06-28 15:20:01 -04:00
Greg Johnston
3c63069aaf comparison demo 2024-06-28 15:20:01 -04:00
Greg Johnston
1199d5afff SSR optimizations for binary size, and flat router 2024-06-28 15:20:01 -04:00
Greg Johnston
56f9df9188 work on Axum integration and on error boundaries 2024-06-28 15:20:01 -04:00
Greg Johnston
732cfca287 stash 2024-06-28 15:20:01 -04:00
Greg Johnston
23546f55dd feat: add <A> 2024-06-28 15:20:01 -04:00
Greg Johnston
18bd20b7fb add use_navigate and Redirect 2024-06-28 15:20:01 -04:00
Greg Johnston
df3b714b6a preliminary use_navigate work 2024-06-28 15:20:01 -04:00
Greg Johnston
406bc24f13 fix fallback => match update 2024-06-28 15:20:01 -04:00
Greg Johnston
136b08a1fb add more hooks and primitives to router 2024-06-28 15:20:01 -04:00
Greg Johnston
5e6274d338 nested route CSR working 2024-06-28 15:20:01 -04:00
Greg Johnston
db98405215 continuing on nested routes 2024-06-28 15:20:01 -04:00
Greg Johnston
262d0ccc3e continuing on nested routes 2024-06-28 15:20:01 -04:00
Greg Johnston
86f8e5e903 working on reconfiguring nested routing 2024-06-28 15:20:01 -04:00
Greg Johnston
8f47cb7a20 make placeholder-finding code consistent across container types 2024-06-28 15:20:01 -04:00
Greg Johnston
32b4defa36 remove logs 2024-06-28 15:20:01 -04:00
Greg Johnston
51117f52c3 fix Transition hydration 2024-06-28 15:20:01 -04:00
Greg Johnston
27445ce1f7 remove TryCatch/fallible rendering in favor of better ErrorBoundary model 2024-06-28 15:20:01 -04:00
Greg Johnston
a355ef0201 finish todo_app_sqlite_axum 2024-06-28 15:20:01 -04:00
Greg Johnston
caf51420f9 fix Vec hydration 2024-06-28 15:20:01 -04:00
Greg Johnston
077ea24f05 add MultiActionForm 2024-06-28 15:20:01 -04:00
Greg Johnston
1166d69d3a add MultiAction/ServerMultiAction 2024-06-28 15:20:01 -04:00
Greg Johnston
0541e8ce90 stash 2024-06-28 15:20:01 -04:00
Greg Johnston
98f891d45c ErrorBoundary SSR and serialization of errors to support hydration 2024-06-28 15:20:01 -04:00
Greg Johnston
075235f8dd get types working with nested ErrorBoundary/Suspense 2024-06-28 15:20:01 -04:00
Greg Johnston
69db634da1 probably as far as I can go with the current SuspenseBoundary approach 2024-06-28 15:20:01 -04:00
Greg Johnston
147ba5b7e6 fix static types 2024-06-28 15:20:01 -04:00
Greg Johnston
d3192c9839 fix cancellation logic for server fn requests 2024-06-28 15:20:01 -04:00
Greg Johnston
86de41c068 only subscribe to memo manually if already loaded 2024-06-28 15:20:01 -04:00
Greg Johnston
9d31d885c5 Suspense SSR 2024-06-28 15:20:01 -04:00
Greg Johnston
e07227f1c4 updates toward todo_app_sqlite 2024-06-28 15:20:00 -04:00
Greg Johnston
97321c58f0 fix stable examples 2024-06-28 15:20:00 -04:00
Greg Johnston
8e247f421e implement rendering traits for signals directly on stable 2024-06-28 15:20:00 -04:00
Greg Johnston
f45cb64cd9 suspend!() macro 2024-06-28 15:20:00 -04:00
Greg Johnston
5df6bdbabd add Transition 2024-06-28 15:20:00 -04:00
Greg Johnston
30fa0ac7d3 loosen requirements for Show 2024-06-28 15:20:00 -04:00
Greg Johnston
e09267bde6 working on examples 2024-06-28 15:20:00 -04:00
Greg Johnston
cb1f75551f finish TodoMVC example 2024-06-28 15:20:00 -04:00
Greg Johnston
f42ab13332 simplify Suspense: this should still work with hydration 2024-06-28 15:20:00 -04:00
Greg Johnston
b479fd4913 working model for Suspense with new version 2024-06-28 15:20:00 -04:00
Greg Johnston
3aacbd7bba probably as far as I can go with the current SuspenseBoundary approach 2024-06-28 15:20:00 -04:00
Greg Johnston
ffe82dff78 fix ErrorBoundary/Suspense 2024-06-28 15:20:00 -04:00
Greg Johnston
0edf5686fb feat: ErrorBoundary and Suspense 2024-06-28 15:20:00 -04:00
Greg Johnston
f7c5f62d20 feat: ErrorBoundary 2024-06-28 15:20:00 -04:00
Greg Johnston
1857c6b614 fix Cargo.toml merge issues 2024-06-28 15:20:00 -04:00
Greg Johnston
df856a7b52 working on examples 2024-06-28 15:20:00 -04:00
Greg Johnston
4f9510f145 styling with CSS 2024-06-28 15:20:00 -04:00
Greg Johnston
3b8ebd88a7 example with isomorphic GTK/web design system 2024-06-28 15:20:00 -04:00
Greg Johnston
89ff803672 gtk example 2024-06-28 15:20:00 -04:00
Greg Johnston
b1241408ac ErrorBoundary component 2024-06-28 15:20:00 -04:00
Greg Johnston
521d9aa27f Suspense/Transition components 2024-06-28 15:20:00 -04:00
Greg Johnston
98474eff66 GTK example for 0.7 2024-06-28 15:20:00 -04:00
Greg Johnston
e7e58c063b add serde-wasm-bindgen encoding for resources 2024-06-28 15:20:00 -04:00
Greg Johnston
720934741d add typed children 2024-06-28 15:20:00 -04:00
Greg Johnston
16e934bf88 scope Arena to each request 2024-06-28 15:20:00 -04:00
Greg Johnston
2de66a34cf correctly omit HTML-generating code from AnyView 2024-06-28 15:20:00 -04:00
Greg Johnston
ec44cdc123 experimental sledgehammer Renderer backend 2024-06-28 15:20:00 -04:00
Greg Johnston
40849d65d1 fix async context issues, add flat routing 2024-06-28 15:20:00 -04:00
Greg Johnston
6b34d0287f test more dynamic string length work 2024-06-28 15:20:00 -04:00
Greg Johnston
1c9b955e9b attribute value escaping 2024-06-28 15:20:00 -04:00
Greg Johnston
2595ddcfe6 work related to 0.7 blog port 2024-06-28 15:20:00 -04:00
Greg Johnston
5df260c419 work related to 0.7 blog port 2024-06-28 15:20:00 -04:00
Greg Johnston
a7997ea1d5 completing work on meta 2024-06-28 15:20:00 -04:00
Greg Johnston
c6b097c664 completing work on meta 2024-06-28 15:20:00 -04:00
Greg Johnston
dcdcaaf01c initial work on meta 2024-06-28 15:20:00 -04:00
Greg Johnston
d971a86ee0 initial work on meta 2024-06-28 15:20:00 -04:00
Greg Johnston
099ba87216 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
746e39b295 fix nested route rebuilding 2024-06-28 15:20:00 -04:00
Greg Johnston
1e0a3006cf navigation between nested routes 2024-06-28 15:20:00 -04:00
Greg Johnston
0cae2ca4d1 initial stage for working nested route rendering 2024-06-28 15:20:00 -04:00
Greg Johnston
d2da5c6a60 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
263be1d726 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
f942d334c2 get basic routing working 2024-06-28 15:20:00 -04:00
Greg Johnston
cf56b6c623 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
2fdf87d416 reorganize 2024-06-28 15:20:00 -04:00
Greg Johnston
c0cb79a396 working on nesting routing 2024-06-28 15:20:00 -04:00
Greg Johnston
096a1e48f2 reorganize 2024-06-28 15:20:00 -04:00
Greg Johnston
e1a2650277 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
d4c1b07fec abstract interface to walk nested routes and to access views 2024-06-28 15:20:00 -04:00
Greg Johnston
8abbff3060 reorganize and clean up 2024-06-28 15:20:00 -04:00
Greg Johnston
fcd5162ee2 nested route matching 2024-06-28 15:20:00 -04:00
Greg Johnston
85def69017 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
4152a5f852 stash 2024-06-28 15:20:00 -04:00
Greg Johnston
c0c3ec8348 work on routing utils 2024-06-28 15:20:00 -04:00
Greg Johnston
b710c629db nested route matching working 2024-06-28 15:20:00 -04:00
Greg Johnston
a73ac0236e stash 2024-06-28 15:20:00 -04:00
Greg Johnston
16eb8e6162 use either_of crate 2024-06-28 15:20:00 -04:00
Greg Johnston
cd9d899c62 nested routes take 1 2024-06-28 15:20:00 -04:00
Greg Johnston
991b94291a split EitherOfX into its own crate 2024-06-28 15:20:00 -04:00
Greg Johnston
8910b3d36c work on routing 2024-06-28 15:20:00 -04:00
Greg Johnston
bb37f3b64b work on routing 2024-06-28 15:20:00 -04:00
Greg Johnston
a710cc4468 set up routing 2024-06-28 15:20:00 -04:00
Greg Johnston
d8e7ade42a clear warning 2024-06-28 15:20:00 -04:00
Greg Johnston
c19817ea0d chore: clear warnings 2024-06-28 15:20:00 -04:00
Greg Johnston
b7c2e45a39 pass on: to components (and lay basis for passing all other attributes) 2024-06-28 15:20:00 -04:00
Greg Johnston
cf38ac3e6f working on AddAttr 2024-06-28 15:20:00 -04:00
Greg Johnston
29bbd926e8 remove boilerplate: require that Node, Element, etc. types always be Clone + 'static 2024-06-28 15:20:00 -04:00
Greg Johnston
f19424bcc0 parent_child example 2024-06-28 15:20:00 -04:00
Greg Johnston
4e73a1ec92 use AnyError for all try_ rendering errors, so that they can compose 2024-06-28 15:20:00 -04:00
Greg Johnston
da96fdaa57 support for guards with class: syntax 2024-06-28 15:20:00 -04:00
Greg Johnston
c317048196 add Borrow implementation to make it easier to abstract over T and Guard<T> 2024-06-28 15:20:00 -04:00
Greg Johnston
01a7a71059 finish error boundary (fix last state transition issue) 2024-06-28 15:20:00 -04:00
Greg Johnston
111d6bc389 progress on error boundary that works with nested reactivity 2024-06-28 15:20:00 -04:00
Greg Johnston
bafb1efcff progress on error boundary that works with nested reactivity 2024-06-28 15:20:00 -04:00
Greg Johnston
e81f73ae8b error example 2024-06-28 15:20:00 -04:00
Greg Johnston
028f0a5152 enable event delegation 2024-06-28 15:20:00 -04:00
Greg Johnston
db597d047d fix release build 2024-06-28 15:20:00 -04:00
Greg Johnston
d1074d44c6 update TODO.md 2024-06-28 15:20:00 -04:00
Greg Johnston
464ec943ee store effects in reactive system 2024-06-28 15:20:00 -04:00
Greg Johnston
0d7186ca0c todomvc example 2024-06-28 15:20:00 -04:00
Greg Johnston
4ef7b64f66 work on async demo 2024-06-28 15:20:00 -04:00
Greg Johnston
87bdc5b47a clone values for Futures 2024-06-28 15:20:00 -04:00
Greg Johnston
a341f99355 make guard types more nestable/flexible so that we can implement render traits on any of them 2024-06-28 15:20:00 -04:00
Greg Johnston
f2eec684a8 work on async demo 2024-06-28 15:20:00 -04:00
Greg Johnston
cbee62973a work on async demo 2024-06-28 15:20:00 -04:00
Greg Johnston
14682c1caf feat: create generic any_spawner crate to share between reactive system and renderer 2024-06-28 15:20:00 -04:00
Greg Johnston
1cbea396ea add other methods on Stored 2024-06-28 15:20:00 -04:00
Greg Johnston
9c57f6a218 work on async demo 2024-06-28 15:20:00 -04:00
Greg Johnston
e052230343 stash: working on jsfb 2024-06-28 15:20:00 -04:00
Greg Johnston
85e26e19ac chore: remove unnecessary log 2024-06-28 15:20:00 -04:00
Greg Johnston
31cb6aaa05 fix: correct owner for rows of For, correct cleanup of arenas 2024-06-28 15:20:00 -04:00
Greg Johnston
7965302b89 fix: close memory leak in tasks waiting on channels 2024-06-28 15:20:00 -04:00
Greg Johnston
62ac27dbeb feat: typed event targets 2024-06-28 15:20:00 -04:00
Greg Johnston
9ee801b57b working on examples 2024-06-28 15:20:00 -04:00
Greg Johnston
6e3b6d5d61 begin migrating to leptos and leptos_dom packages 2024-06-28 15:20:00 -04:00
Greg Johnston
01f2977b9d stash 2024-06-28 15:20:00 -04:00
Greg Johnston
c557b1236a stash 2024-06-28 15:19:59 -04:00
Greg Johnston
0ae77d0b5a chore: remove leptos_reactive and add reactive_graph 2024-06-28 15:19:59 -04:00
Greg Johnston
18f73b1482 feat: improved ergonomics of read guards 2024-06-28 15:19:59 -04:00
Greg Johnston
6f96a67d08 feat: add Readable implementation for all types 2024-06-28 15:19:59 -04:00
Greg Johnston
222b7a17c9 feat: add no_std support in appropriate crates 2024-06-28 15:19:59 -04:00
Greg Johnston
45e7847452 feat: tachys 2024-06-28 15:19:59 -04:00
Greg Johnston
087a1c332b feat: add Fn traits 2024-06-28 15:19:59 -04:00
Greg Johnston
37dae6ae90 docs: note re: execution order (see #2261 and #2262) 2024-06-28 15:19:59 -04:00
Greg Johnston
5a8821c336 feat: modular SharedContext for hydration 2024-06-28 15:19:59 -04:00
Greg Johnston
132dcced68 chore: split OrPoisoned trait into its own crate for reuse 2024-06-28 15:19:59 -04:00
Greg Johnston
79cb763d82 feat: modular, trait-based, Send/Sync reactive system 2024-06-28 15:19:59 -04:00
David Karrick
c53fc67d38 feat: Add Compression to Hacker News w/ Islands Example (#2613)
* Add task for cargo leptos w/ precompression

* Update makefile

* Update deps

* Serve precompressed assets

Code was taken from https://github.com/leptos-rs/cargo-leptos/pull/165#issuecomment-1647843037

Co-authored-by: Sebastian Dobe <sebastiandobe@mailbox.org>

* Dynamically compress html

* Update README

* Refactor: Format for ci

* Refactor: Replace use of format!

* Chore: Remove old build file

* Feat: Hash files

This will prevent users from using an old cached file after updates are made

* Fix: Prevent chicken & egg problem with target/site

* Refactor: Use normal cargo-leptos

---------

Co-authored-by: Sebastian Dobe <sebastiandobe@mailbox.org>
2024-06-28 15:01:05 -04:00
Greg Johnston
ff0c8252b0 fix: do not unescape / and other route characters when following a link (#2651) 2024-06-28 14:29:05 -04:00
Evan Almloff
551f9b0a04 feat: add a StreamingJson encoding (#2623) 2024-06-28 11:49:26 -04:00
Greg Johnston
44cd3272f9 Merge pull request #2639 from Giovanni-Tably/dispose-fix
fix: ensure everything is disposed of consistently
2024-06-28 11:30:31 -04:00
Vasily Zorin
73a9797ef9 book_ru: SUMMARY.md (#2648)
* book_ru: SUMMARY.md

* book_ru: SUMMARY.md

* book_ru: SUMMARY.md
2024-06-27 06:46:36 -07:00
Spencer Ferris
57a00a33a3 docs: Add docs for ToChildren (#2643)
* docs: Add docs for `ToChildren`

As discussed in https://github.com/leptos-rs/leptos/discussions/2640,
the `ToChildren` trait is useful to consumers who want to use the
builder syntax. However, because it is currently annotated with
`#[docs(hidden)]`, it's not visible in docs and also not included in
Jetbrains's auto-complete.

Add a doc comment for the `ToChildren` trait, including doc tests that
demonstrate how to use the trait and how it compares to directly
creating children.

* docs: Fix incorrect examples in `ToChildren` docs

Some examples were added to `ToChildren` that don't compile. This
wasn't caught earlier because no errors were seen in the IDE when
writing the examples. The issue was correctly caught by CI, however.
2024-06-26 14:57:40 -07:00
Adrian
5f445cdfbf Translating titles of sections in SUMMARY (#2542) 2024-06-26 14:56:59 -07:00
Hamir Mahal
c9d0ef5033 chore: simplify string interpolation (#2626) 2024-06-21 07:51:38 -04:00
Giovanni
af85623a22 test: add regression tests 2024-06-20 19:37:08 +01:00
Giovanni
40ecc2bd78 fix: dispose of watch effect normally 2024-06-20 15:36:03 +01:00
Giovanni
41a18a1218 fix: clean up recursively in dispose_node 2024-06-20 15:26:55 +01:00
Giovanni
739d1b2e3e refactor: split a couple of functions 2024-06-20 15:26:37 +01:00
Giovanni
9e6996a59f fix: untrack around all on_cleanups 2024-06-20 15:26:37 +01:00
Giovanni
cca3f1f42d refactor: rename cleanup_property -> dispose_property
The property and its node are removed entirely, so it's more aligned with `dispose_node` than `cleanup_node`.
2024-06-20 15:26:37 +01:00
Greg Johnston
80bbb20089 Merge pull request #2631 from leptos-rs/2610
fix `rkyv` feature interaction with Axum integration
2024-06-14 15:10:26 -04:00
Greg Johnston
33e7ed83cc fix: specify correct serialization trait in server fn handler (closes #2610) 2024-06-14 14:20:50 -04:00
Greg Johnston
dcaa1df63d fix: derive rkyv traits on ServerFnError 2024-06-14 14:19:54 -04:00
Oto Petřík
8606f3d928 fix: try_with should not panic on disposed resources (closes #2620) (#2621) 2024-06-12 20:19:44 -04:00
Thomas Versteeg
32e6ac7bb7 docs: remove duplicated code block in example of For (#2622) 2024-06-12 20:11:57 -04:00
ARSON
b22f3bb3bd fix: extract dyn_bindings impl into DynBindings trait (#2619) 2024-06-12 09:07:56 -04:00
Greg Johnston
00a42daa63 Merge pull request #2611 from leptos-rs/failing-ci
Fix failing CI
2024-06-02 15:39:58 -04:00
Greg Johnston
ec19c59850 chore: update hackernews_js_fetch example to latest versions of leptos and axum 2024-06-02 15:39:01 -04:00
Greg Johnston
b06097d085 chore(ci): fix wasm-pack installation 2024-06-02 15:38:22 -04:00
Greg Johnston
a59561f796 chore: clippy 2024-06-02 15:37:54 -04:00
Greg Johnston
96b448805d v0.6.12 2024-06-02 14:08:08 -04:00
Luxalpa
2ef27cb0bb fix: URL encoding issue (closes #2602) (#2601) 2024-06-02 14:06:41 -04:00
SleeplessOne1917
21a6551ce6 feat: allow slice! macro to index tuples (#2598)
* Allow slice! macro to index tuples

* Undo changes to component tests

---------

Co-authored-by: Greg Johnston <greg.johnston@gmail.com>
2024-05-29 09:07:41 -04:00
Mingwei Samuel
2f4fd87c05 feat: #[component] now handles impl Trait by converting to generic type params, fix #2274 (#2599)
Book needs to be updated to remove this line:
35c380ffc8/src/view/03_components.md (L233)
2024-05-29 09:06:52 -04:00
Hecatron
13ad1b235d projects: example using the bevy 3d game engine and leptos (#2577)
* feat: Added example using the bevy 3d game engine and leptos

* fix: moved example to projects

* workspace fix
2024-05-27 15:55:27 -04:00
David Pitoniak
a2c7e23d54 docs: grammar typo for MultiActon doc comment (#2589) 2024-05-11 15:05:35 -04:00
Greg Johnston
9e65f71db4 fix: only issue NodeRef warning in debug mode (necessary to compile in --release) (#2587) 2024-05-11 15:05:17 -04:00
Luxalpa
7f4a2926c1 fix: StoredValue and Resource borrowMut error during dispose (#2583) 2024-05-11 15:04:57 -04:00
Hecatron
7c5203db19 examples: counter with DWARF debugging (breakpoints and sourcemap) (#2563)
* feat: Added initial dwarf debug counter example

* fix: update to readme and launch.json, task.json

* fix: fix tasks.json for debugging

* fix: added Trunk.toml to fix the port

* fix: moved example to projects
2024-05-11 15:02:33 -04:00
Greg Johnston
3760ced0ec fix: allow temporaries as props (closes #2541) (#2582) 2024-05-08 19:35:57 -04:00
Greg Johnston
f3f3a053ba fix: don't insert empty child for comment/doctype (closes #2549) (#2581) 2024-05-08 07:19:57 -04:00
Antoine Büsch
6a8e4bb453 Fix empty_docs warnings in #[component] macro (#2574) 2024-05-06 22:09:19 -04:00
Luxalpa
20f4323e50 feat: allow customize derives for serverfn input struct (#2545) 2024-05-06 08:54:29 -04:00
martin frances
47bcee0ef4 docs: improve NodeRef warning (#2414) (#2467) 2024-05-06 08:51:32 -04:00
SleeplessOne1917
ac3b95d35a examples: use trunk's built-in way of handling tailwind (#2557)
* Use trunk built-in way of handling tailwind

* Remove package manager from package.json
2024-05-06 08:49:07 -04:00
Greg Johnston
a314a4fcd9 docs: clarify the purpose of local resources (#2543) 2024-05-06 08:48:29 -04:00
Sam Judelson
b2a77f06b9 projects: OpenAPI Utopia (#2556) 2024-05-06 08:48:09 -04:00
Sam Judelson
9741c41356 projects: added an index to projects README (#2555)
The Index gives a high level overview of the projects
2024-05-06 08:47:13 -04:00
Joey McKenzie
4e4a770600 projects: add sitemap demo project (#2553) 2024-05-06 08:46:49 -04:00
martin frances
289c02fdac Minor: examples/server_fns_axum FileWatcher logs errors to the console. (#2547)
* Minor: examples/server_fns_axum FileWatcher logs errors to the console.

The cause is an assumption that the directory

./watched_files/

exits.

* chore: Now using .gitkeep to preserve directory structure.
2024-05-06 08:45:27 -04:00
itowlson
123d95c34c Update leptos-spin-macro reference (#2570)
Signed-off-by: itowlson <ivan.towlson@fermyon.com>
2024-05-02 15:25:22 -07:00
Greg Johnston
da9711a743 docs: add caveats for ProtectedRoute (#2558) 2024-05-01 07:06:54 -04:00
Greg Johnston
9353316947 chore: create README for projects directory 2024-04-19 10:39:58 -04:00
Sam Judelson
2960dada4a docs: add projects directory with 4 projects (#2500) 2024-04-17 19:30:31 -04:00
kryesh
c1ebaf9d04 feat: add create_query_signal_with_options to leptos_router (#2517) 2024-04-17 19:23:33 -04:00
bicarlsen
9a7dbd50eb feat: ability to use multiple classes in view macro using array syntax. (#2532) 2024-04-17 19:04:33 -04:00
Ethan Niser
410225c4d1 docs: remove unnecessary type parameter and trait bound in component macro 'bad' example (#2520) 2024-04-17 18:53:18 -04:00
ARSON
8b1c0a7013 feat: spread component attrs (#2534)
* add `dyn_bindings` builder method to component

* Revert "add `dyn_bindings` builder method to component"

This reverts commit cdd5e0f682.

* add `dyn_bindings` builder method to component
2024-04-17 14:05:00 -07:00
0e4ef622
6e819737cd fix: make TextProp's IntoView and IntoAttribute impls reactive (#2518) 2024-04-17 14:02:52 -07:00
Adrian
c4560b7e76 Adding Russian book branch (#2516) 2024-04-17 13:22:32 -07:00
Greg Johnston
0d20f6aca8 chore: publish Oco separately as oco_ref crate so that it can be used elsewhere (#2536) 2024-04-16 20:25:34 -04:00
martin frances
158b0bd294 chore(ci): bump trunk-action to 0.5. (#2533) 2024-04-16 19:19:01 -04:00
Ben Wishovich
c8186eea13 Add id to ActionForm and MultiActionForm (#2535) 2024-04-16 14:52:51 -07:00
Greg Johnston
6141e73436 Merge pull request #2531 from leptos-rs/2523
fix: do not submit `<ActionForm>` on `formmethod="dialog"` submission (closes #2523)
2024-04-15 19:52:06 -04:00
Greg Johnston
03a56f8795 chore(ci): latest nightly 2024-04-15 18:33:06 -04:00
Greg Johnston
fe06c6b91b fix: do not submit <ActionForm> on formmethod="dialog" submission (closes #2523) 2024-04-15 16:49:02 -04:00
martin frances
9a51fb17fc Minor: Bumped serde_qs to 0.13. (#2512) 2024-04-14 14:39:44 -07:00
Sam Judelson
35a8ca1f39 Add beginner tip to ErrorBoundary (#2385)
* Add beginner tip to ErrorBoundary

This might seem simple, but the nuances of types and traits confuse many people learning the language.

* edit

* Update error_boundary.rs

* edits

* ignore error block
2024-04-14 14:38:08 -07:00
Ben Wishovich
1ff0a7176d Update spin_sdk to spin v3 (#2525)
* Update spin_sdk to spin v3

* Add id to Body
2024-04-14 14:34:38 -07:00
Greg Johnston
e29d31e686 0.6.11 2024-04-10 09:33:22 -04:00
Greg Johnston
e68f1bbad5 fix: stable Router IDs (closes #2514) (#2515) 2024-04-10 09:31:34 -04:00
Greg Johnston
454a4f4ccb Merge pull request #2511 from leptos-rs/simplify-stable
Simplify stable syntax in examples
2024-04-09 15:30:51 -04:00
Greg Johnston
85a91af7c6 examples: simplify stable syntax for using signals in view 2024-04-09 14:45:19 -04:00
Greg Johnston
871d2c1b9f feat: directly implement IntoView on resources on stable 2024-04-09 14:45:01 -04:00
Greg Johnston
f0c1061161 chore(ci): remove nightly feature on counter_isomorphic (#2510) 2024-04-09 13:18:37 -04:00
Greg Johnston
d74af819a0 fix: invalid Location header when using leptos_actix::redirect() without JS/WASM (#2507) 2024-04-08 20:10:09 -04:00
Ar4ys
36b2f919dd feat: signifiantly improved error reporting in view macro (#2289)
* Added name span to .build in component_to_tokens

* Added #[allow(unreachable_code)] to  leptos::component_view inside component_to_tokens

* Added span to name reference in component_to_tokens

* Added span to leptos::component_props_builder in component_to_tokens

* Added span to props in component_to_tokens

* Added span to "on" method in events component_to_tokens

* Added spans in directive_call_from_attribute_node

* Added spans in fragment_to_tokens and it's ssr version

* Added span to props in slot_to_tokens

* Added span to the whole slot quote

* Changed slots's name span to last slot node

* Added span to the slot vec

* Added #[allow(unreachable_code)] to `.into()` in slot_to_tokens

* Added span to `.build()` in slot_to_tokens

* Added span for the whole component

* Added span to "clone:" directive

* Added span to ".children()"

* Removed unused "_span" param from fragment_to_tokens and fragment_to_tokens_ssr

* Removed unnecessary parenthesis around values in `attribute_to_tokens`

* Removed unnecessary curly braces around value in `spread_attrs`

* Removed unnecessary parenthesis around children in `element_to_tokens`

* Added catch-all span to element_to_tokens

* Formatted `quote!` according to official guidelines

* Updated view/snapshots in leptos_macro

* Added span to spread props in element_to_tokens_ssr

* Removed unnecessary curly braces in element_to_token_ssr

* Updated view/snapshots in leptos_macro

* Added view macro tests to leptos_macro

* Fixed clippy warnings in view macro output

* Updated view snapshots in tests

* Fixed expected_one_let_bind_got_none test in leptos_macro

* Removed snapshot tests in leptos_macro/tests/ui/view

---------

Co-authored-by: Greg Johnston <greg.johnston@gmail.com>
2024-04-08 08:14:33 -04:00
Greg Johnston
ab1c4ca7a6 chore(ci): run all examples under stable and fix remaining linting issue (#2503) 2024-04-05 16:09:23 -04:00
mahmoud-eltahawy
a1a989011a chore(ci): move all examples to run on stable (#2501) 2024-04-05 14:57:48 -04:00
Greg Johnston
43178b56dc chore(ci): move example CI over to stable (#2502) 2024-04-05 14:55:31 -04:00
Lukas Potthast
119c9ea23f feat: allow spreading of both attributes and event handlers (#2432) 2024-04-05 14:30:34 -04:00
Yann Dirson
fc537c14c4 feat: implement IntoView for Rc<str> (#2462)
With-help-from: Greg Johnston <greg.johnston@gmail.com>
Signed-off-by: Yann Dirson <ydirson@free.fr>
2024-04-05 09:58:35 -04:00
mahmoud-eltahawy
15f8bdd4dc stable todo_app_sqlite_axum example (#2493) 2024-04-04 20:12:45 -07:00
Sam Judelson
ca07d29db5 stable examples change (#2497) 2024-04-04 20:11:28 -07:00
Adrian
a82af6110f ex: counter_url_query; to stable (#2499) 2024-04-04 20:09:55 -07:00
Joseph Cruz
03ac6903f2 ci(examples/error-boundary): use stable syntax (#2496) 2024-04-04 20:08:50 -07:00
Joseph Cruz
e5af1456a6 fix(ci): false leptos changes detected (#2491) 2024-04-04 20:06:09 -07:00
mahmoud-eltahawy
8686d5aabb stable todomvc example (#2489) 2024-04-02 13:38:07 -07:00
Greg Johnston
c750f57ddc v0.6.10 2024-04-02 09:39:53 -04:00
Joseph Cruz
cc1f6f0a94 chore(ci): run semver checks on push (#2483) 2024-04-01 20:38:28 -04:00
Greg Johnston
a9034a92b0 fix: handle directives properly in SSR mode (closes #2488) (#2477) 2024-04-01 17:29:30 -04:00
zakstucke
9f1c09e131 feat: add View::on support for CoreComponent::{DynChild, Each} (#2422) 2024-04-01 17:09:05 -04:00
Greg Johnston
b79037b96f fix: correctly handle empty view! {} in hot-reloading code (closes #2421) (#2478) 2024-04-01 16:23:29 -04:00
Greg Johnston
41f3c46830 chore: bump nightly version in examples (#2479) 2024-04-01 15:16:53 -04:00
Greg Johnston
bfac4cba2a chore: cargo fmt 2024-03-31 14:12:33 -04:00
Paolo Barbolini
3e18edb8f9 chore: add repository field to server_fn_macro (#2474) 2024-03-31 14:10:47 -04:00
Joseph Cruz
e926ff24a6 ci: disable semver checks (#2471) 2024-03-30 20:05:20 +00:00
Gunnar Raßmann
d528cbd828 Fix: Environment variables do not overwrite Config.toml options (#2433)
* Fix environment variable parsing

* Fix failing tests

dfgdfgfd

dsf

* Add new test
2024-03-30 00:02:52 +00:00
Alex Lazar
642504f2ba Remove panic for axum ResponseOptions (#2468) 2024-03-29 07:37:12 +00:00
zakstucke
fd2817de26 Allow CDN_PKG_PATH at runtime as well as current build time, preferring it when available. (#2466) 2024-03-28 08:30:54 +00:00
Bart Toersche
73b8c7872e Fix: Small fix for location hash/fragment (#2464) 2024-03-27 06:45:29 +00:00
martin frances
f3d19ca744 Minor: Ran cargo clippy --fix (#2461)
Manually reviewed the changes. All look like reasonable nudges.

A summary :-

In one place removed a redundant call to .clone().

In two places, now using clone_from() which clippy says
**MAY** be an optimisation.
2024-03-23 18:27:31 -07:00
boyswan
0abcc348ca Persist parent span context within resource fetchers (#2456) 2024-03-22 15:51:50 -07:00
Joseph Cruz
572ae5bbdf test(ci): check semver (#2450)
* test(ci): check semver

* chore: simulate change

* fix(ci): add checkout

* fix(ci): version typo

* chore: remove simulated change
2024-03-22 15:51:13 -07:00
martin frances
0b70949118 Bumped base64 to 0.22. (#2457) 2024-03-22 15:07:04 -07:00
martin frances
5819014ccc Chore(ci) bumping tj-actions/changed-files to version 43. (#2454) 2024-03-22 07:23:57 -04:00
Joseph Cruz
630fd4570d fix(ci): trunk command not found (#2453)
* chore: simulate change

* chore: remove print trunk version

* Revert "chore: remove print trunk version"

This reverts commit c203a83b44.

* chore(ci): use jetli/trunk-action

* chore: remove simulated change
2024-03-22 07:23:48 -04:00
Ratul
d1560f9e1f Added missing link for #[server] macro (#2437)
* Added missing link for #[server] macro

Added missing link for #[server] macro

* Removed spurious entry
2024-03-20 14:24:54 -07:00
martin frances
841d7a690a chore: examples/tailwind_axum bumped tailwindcss to 3.4.2. (#2443) 2024-03-19 09:40:24 -07:00
sify21
104c09f3bf register server_fn first to allow for wildcard Route path (#2435)
It's normal to have a `NotFound` page with a wildcard path like this
```
<Routes>
    ...
    <Route path="*any" view=NotFound>
</Routes>
```
In `ssr` mode, most servers do a `first match win` approach, so we
should register server functions before view routes, or else a wildcard
route would block all api requests.

https://discord.com/channels/1031524867910148188/1218508054442545185

Signed-off-by: 司芳源 <sify21@163.com>
2024-03-19 09:37:42 -07:00
Joseph Cruz
ac75999c9f chore(ci): upgrade actions to node 20 (#2444)
* chore(ci): install jq with apt

* chore(ci): install trunk with cargo

* chore(ci): replace toolchain action

* chore(ci): upgrade pnpm cache action

* chore: simulate change

* fix(ci): pnpm cache action typo

* chore: remove simulated change
2024-03-19 09:36:30 -07:00
Richard Laughlin
7ef186f642 For the session_auth_axum example, move the passhash into a separate (#2446)
non-serializable struct.

This prevents it from being returned in the
get_user() API, and prevents it from being unintentionally returned on any
new API the end-user may create on top of this example code.
2024-03-19 09:35:53 -07:00
Joseph Cruz
fda4dba237 build(examples): clean more output (#2420)
* chore(examples): update workspace members

* build(examples): clean e2e crates

* build(examples): clean pkg directories

* chore: remove simulated change comment

* chore: add simulated change

* chore: remove simulated change
2024-03-18 11:58:37 -04:00
Roland Fredenhagen
4e578e335b chore: update attribute-derive (#2438) 2024-03-18 11:39:34 -04:00
Joseph Cruz
97fd8ff6c4 fix(ci): leptos examples fail with bindgen schema error (#2428) 2024-03-13 22:33:54 -04:00
battmdpkq
4faf3fa894 chore: fix types in some comments (#2413)
Signed-off-by: battmdpkq <cmaker@163.com>
2024-03-09 07:38:25 -05:00
Greg Johnston
480d741749 chore: update to gloo-net 0.5 (closes #2411) (#2416) 2024-03-08 15:22:12 -05:00
Álvaro Mondéjar
7928f61401 chore: add lint to disallow prints to stdout (#2404) 2024-03-08 13:18:37 -05:00
Giovanni
2b4f5e0f58 docs: runtime error if setting the same event listener 2x rather than silent failure (#2383)
Delegated event listeners do not support adding more than one event listener of the same type. This can cause confusion if two listeners are added, as one is silently dropped.
2024-03-07 16:49:23 -05:00
Giovanni
943a992570 fix: re-throw errors in delegated event listeners (#2382) 2024-03-07 16:48:21 -05:00
ARSON
372a241d78 feat: allow #[prop(attrs)] on slots (#2396) 2024-03-04 17:34:21 -08:00
Chris Biscardi
c06f6bede2 fix: remove erroneous debug println!()s in islands (#2402) 2024-03-04 06:56:18 -05:00
benwis
3e93a686f4 Fix and release deps 2024-03-03 17:04:34 -08:00
benwis
34cdff4cb3 Update deps in one crate to 0.6.8 2024-03-03 17:02:50 -08:00
John Lewis
530087d77d Add MessagePack codec (#2371)
* feat: added messagepack codec

* fix: deserialize msgpack from bytes, not string
2024-03-03 13:54:23 -08:00
martin frances
4bb43f6207 examples/todomvc - Rename Todos::new() Todos::default(). (#2390) 2024-03-03 13:48:40 -08:00
benwis
9e2fb62857 0.6.8 2024-03-02 18:01:10 -08:00
Ben Wishovich
1da2fff706 Fix missed stuff (#2398) 2024-03-02 17:57:20 -08:00
Greg Johnston
9fd2987447 fix: correctly reset hydration status in islands mode Suspense (closes #2332) (#2393) 2024-03-02 11:57:35 -05:00
zroug
7996f835d0 fix: remove unnecessary trait bound PartialEq from create_owning_memo (#2394) 2024-03-02 07:27:22 -05:00
Greg Johnston
d72b12524e Merge pull request #2395 from leptos-rs/int-ax-doc 2024-03-01 20:08:18 -05:00
Greg Johnston
8e79c5be5c fix: ignore as with other doctests for now 2024-03-01 18:39:55 -05:00
Greg Johnston
de25658c36 Merge pull request #2392 from paul-hansen/fix-ci
fix(ci): "needless borrow" error and example never exiting
2024-03-01 18:37:48 -05:00
Paul Hansen
e2e35a9659 fix(ci) Wait a bit longer for server to start
It took longer than I thought in Github and barely worked, giving it a
bit more of a buffer.
2024-03-01 15:47:59 -06:00
Paul Hansen
bf1ba589c5 fix(ci): Another attempt to fix hanging example 2024-03-01 15:41:22 -06:00
Sam Judelson
f70ebc1289 docs: add note on how to get ResponseOptions (#2380) 2024-03-01 10:47:02 -05:00
Paul Hansen
3cab09e015 fix(ci): error_boundary example never exiting 2024-03-01 09:21:58 -06:00
Paul Hansen
b431315f7c fix(ci): "needless borrow" error 2024-03-01 09:21:58 -06:00
Baptiste
5b40881e77 fix: specify path to wasm_bindgen in island macro (#2387) 2024-03-01 10:15:19 -05:00
benwis
59d3cce3be 0.6.7 2024-02-29 13:38:09 -08:00
Paul Hansen
6a83161368 chore: add MSRV (#2360) 2024-02-28 07:19:09 -05:00
Marc-Stefan Cassola
4b00c16cb9 added hashes generated from cargo-leptos (#2373)
* added hashes generated from cargo-leptos

* Added config option to disable frontend file name hash
2024-02-27 16:28:27 -08:00
haslersn
6d6019b956 fix: do not strip query in redirect hook when using client-side navigation (#2376) 2024-02-27 09:06:48 -08:00
Sam Judelson
3540291065 docs: Resource::read() in doc examples with Resource::get() (#2372) 2024-02-26 21:37:29 -05:00
zoomiti
4809cf473e feat: provide leptos_router::Method via context (#1808) (#2315) 2024-02-26 21:25:53 -05:00
Tadas Dailyda
aa977001c1 feat: add support for trailing slashes (closes #2154) (#2217) 2024-02-26 20:56:44 -05:00
Greg Johnston
c16189f095 Merge pull request #2362 from leptos-rs/remove-deprecation
chore(ci): fix failing CI by removing deprecation note
2024-02-24 13:05:02 -05:00
Greg Johnston
d0a013c248 chore(ci): omit a few feature flag in CI 2024-02-24 11:55:36 -05:00
Greg Johnston
531ea74e33 chore: cargo fmt in leptos_macro 2024-02-24 07:12:46 -05:00
Greg Johnston
545e87e540 chore(ci): fix failing CI by removing deprecation note 2024-02-24 07:07:31 -05:00
Joseph Cruz
2ca30a0b2d ci(examples): build hackernews_js_fetch with deno (#2344)
* ci(examples): refactor process management

* ci(examples): build hackernews_js_fetch with deno

* ci(workflows): detect hackernews_js_fetch change

* chore(web-report): report deno usage

* chore(web-report): ignore gtk example

* ci(todo_app_sqlite): simulate change

* ci(workflows): install deno

* ci(todo_app_sqlite): remove simulated change
2024-02-23 13:40:44 -05:00
zoomiti
753bf1ed54 Fix Broken Doc links and Deprecate FromUtf8Error in oco.rs (#2318)
* fix: deprecate `FromUtf8Error` in `oco.rs`

* chore: fix broken doc links (#859)

* chore: fix broken doc link to server attribute macro

* cargo fmt
2024-02-21 19:24:40 -08:00
Sam Judelson
37c6387fea finish doc sentence (#2348) 2024-02-21 19:21:57 -08:00
Janu (Janeshwar) Cambrelen
0a73487152 feat(leptos-axum): propagate trace context to server functions (#2340) 2024-02-21 19:21:00 -08:00
Sam Judelson
747aba0d7f add comment specifying edgecase of server function prefixes (#2345) 2024-02-20 18:17:20 -08:00
Sam Judelson
04cf47d5da Update suspense_component.rs documentation to use .get() instead of .read() (#2346) 2024-02-20 18:16:03 -08:00
rjmac
47abe00993 fix: don't leak canceled timeouts (#2331)
Instead of using `Closure::once_into_js`, this uses `into_js_value`,
which uses weak references to clean up the closure when Javascript no
longer has need of it.

It would be nice to make this (and the similar interval function) drop
the callback promptly when cancelled, but I don't think that's
possible while keeping the handles Copy.

Fixes #2330

Co-authored-by: Robert Macomber <robertm@mox>
2024-02-19 21:17:26 -05:00
eliza
aa3700ffb9 feat: add impl_from argument to #[server] proc_macro (#2335)
* Add `impl_into` argument

* Add `impl_into` argument

* Revert unneeded changes

* Address review comments

Rename `impl_into` back to be `impl_from`
Rework docstring

* Fix typo in docstring
2024-02-19 21:16:46 -05:00
Aphek
0770b87cb7 feat: Add owning memos to allow memos that re-use the previous value (#2139) 2024-02-19 21:16:19 -05:00
benwis
330ebdb018 v0.6.6 2024-02-19 13:48:32 -08:00
benwis
c3179d88cf Moved leptos-spin-macro dep to released version 2024-02-19 12:54:43 -08:00
Sahaj
ffcf3c2952 example: fix href path in tailwind_csr example (#2328) 2024-02-17 13:10:07 -05:00
haslersn
001ca5148e fix: handle cross-origin redirects in server function redirect hook (#2329)
In client-side navigation we now handle redirects returned from
server functions by resolving the location against the current
origin as a base. The base is only relevant if the location
doesn't already include an origin. This fixes cross-origin
redirects.

Note: in order to handle redirects in the same way as the browser
would handle them, we need to use the server function's URL
(typically `<origin>/api/something`) as a base. I leave this as
a TODO for a future leptos version, because it probably
requires changing the signature of the `server_fn` redirect hook.

In order to not be affected by a future breaking change, users
should already start making sure that their redirect locations
either include an origin or at least start with a single slash
(e.g. `Location: /foo`).
2024-02-17 13:09:39 -05:00
Greg Johnston
1e000afa78 examples: fix CSS file name in tailwind_axum (#2324) 2024-02-17 12:56:03 -05:00
Greg Johnston
0f7b8841b2 chore(ci): reduce set of tested features to prevent running out of disk space in server_fn (#2320) 2024-02-16 20:26:26 -05:00
Greg Johnston
7dc0441f6c docs: log error on failing to convert form to ServerFn type, in addition to setting action value (#2319) 2024-02-16 17:11:14 -05:00
Joseph Cruz
0a321a1bd7 docs(examples): update docs (#2313)
* docs(examples): fix metadata typo

* docs(examples): update first step about using cargo make
2024-02-16 13:32:01 -05:00
Greg Johnston
88742952f0 fix: Transition in hydrate mode that isn't initially created (closes #2279) (#2314) 2024-02-16 08:16:09 -05:00
martin frances
8a4b972e0b chore: bump config to 0.14 (#2302) 2024-02-15 20:24:12 -05:00
zoomiti
95bd9cc544 feat: use CDN_PKG_PATH at build time to set alternate base URL for JS/WASM bundles (#2281) (#2283) 2024-02-15 20:21:47 -05:00
Marc-Stefan Cassola
23bc892a24 fix: #[server] macro error type detection (#2298)
In most cases when you return `Result<..., ServerFnError<E>>` this worked but when you tried
`Result<..., leptos::ServerFnError<E>>` then it didn't.
2024-02-15 20:20:41 -05:00
Esteban Borai
830fba794e docs: add missing provide_meta_context() in example (#2311)
Otherwise user gets:

```
use_head() is being called without a MetaContext being provided. We'll automatically create and provide one, but if this is being called in a child route it may cause bugs. To be safe, you should provide_meta_context() somewhere in the root of the app.
```
2024-02-15 20:19:07 -05:00
martin frances
98633c8700 chore(ci): update node version for GitHub Actions (#2303) 2024-02-15 20:17:12 -05:00
David Rebbe
b0f5c39711 example: replace yanked version of session_auth_axum crate (#2310) 2024-02-15 20:16:26 -05:00
Greg Johnston
b54aa7f3f5 Merge pull request #2294 from agilarity/add-cargo-make-leptos 2024-02-15 18:52:37 -05:00
Sam Judelson
e33ee7ec99 pub export server is either from leptos_macro or leptos_spin_macro depending on if spin feature is enabled. (#2280)
* leptos spin server macro

* leptos spin

* git chng

* based on the fermyon official git for when that works
2024-02-15 14:37:19 -08:00
Joseph Cruz
cd70b2f52b fix(ci): should exclude cargo-make 2024-02-11 20:40:20 -05:00
Joseph Cruz
c75842ed0c ci(hackernews_islands_axum): build with cargo leptos 2024-02-11 15:40:32 -05:00
Joseph Cruz
4ad228bf47 docs(test-report): add leptos ci warning 2024-02-11 15:40:32 -05:00
Joseph Cruz
bbe7115360 docs(test-report): mention options 2024-02-11 15:40:32 -05:00
Greg Johnston
0658a550b0 fix(examples): align crate name and output name (closes #2206) (#2291) 2024-02-10 15:47:25 -05:00
Joseph Cruz
4222c832b1 fix(ci): empty directory vector error (#2288)
* fix(ci): empty directory vector error

* chore(ci): simulate example change

* chore(ci): remove simulated example change
2024-02-10 10:02:21 -08:00
Greg Johnston
dfddbd6bf9 docs: give a warning when you try to .dispatch() an action immediately (closes #2225) (#2286) 2024-02-09 20:55:10 -05:00
935 changed files with 60315 additions and 38625 deletions

View File

@@ -29,4 +29,4 @@ jobs:
with:
directory: ${{ matrix.directory }}
cargo_make_task: "ci"
toolchain: nightly-2024-01-29
toolchain: stable

View File

@@ -24,4 +24,4 @@ jobs:
with:
directory: ${{ matrix.directory }}
cargo_make_task: "ci"
toolchain: nightly-2024-01-29
toolchain: stable

28
.github/workflows/ci-semver.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: CI semver
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
get-leptos-changed:
uses: ./.github/workflows/get-leptos-changed.yml
test:
needs: [get-leptos-changed]
if: needs.get-leptos-changed.outputs.leptos_changed == 'true' && github.event.pull_request.labels[0].name != 'breaking'
name: Run semver check (nightly-2024-04-14)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Semver Checks
uses: obi1kenobi/cargo-semver-checks-action@v2
with:
rust-toolchain: nightly-2024-04-14

View File

@@ -1,26 +0,0 @@
name: CI Stable Examples
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
get-leptos-changed:
uses: ./.github/workflows/get-leptos-changed.yml
test:
name: CI
needs: [get-leptos-changed]
if: needs.get-leptos-changed.outputs.leptos_changed == 'true'
strategy:
matrix:
directory: [examples/counters_stable, examples/counter_without_macros]
uses: ./.github/workflows/run-cargo-make-task.yml
with:
directory: ${{ matrix.directory }}
cargo_make_task: "ci"
toolchain: stable

View File

@@ -20,6 +20,11 @@ jobs:
matrix:
directory:
[
any_error,
any_spawner,
const_str_slice_concat,
either_of,
hydration_context,
integrations/actix,
integrations/axum,
integrations/utils,
@@ -28,10 +33,14 @@ jobs:
leptos_dom,
leptos_hot_reload,
leptos_macro,
leptos_reactive,
leptos_server,
meta,
next_tuple,
oco,
or_poisoned,
reactive_graph,
router,
router_macro,
server_fn,
server_fn/server_fn_macro_default,
server_fn_macro,
@@ -40,4 +49,4 @@ jobs:
with:
directory: ${{ matrix.directory }}
cargo_make_task: "ci"
toolchain: nightly-2024-01-29
toolchain: nightly-2024-04-14

View File

@@ -31,10 +31,9 @@ jobs:
dir_names: true
dir_names_max_depth: "2"
files: |
examples
!examples/cargo-make
!examples/gtk
!examples/hackernews_js_fetch
examples/**
!examples/cargo-make/**
!examples/gtk/**
!examples/Makefile.toml
!examples/*.md
json: true

View File

@@ -21,12 +21,12 @@ jobs:
- name: Get example files that changed
id: changed-files
uses: tj-actions/changed-files@v41
uses: tj-actions/changed-files@v43
with:
files: |
examples/**
!examples/cargo-make
!examples/gtk
!examples/cargo-make/**
!examples/gtk/**
!examples/Makefile.toml
!examples/*.md

View File

@@ -17,8 +17,8 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Install JQ Tool
uses: mbround18/install-jq@v1
- name: Install jq
run: sudo apt-get install jq
- name: Set Matrix
id: set-matrix

View File

@@ -16,23 +16,37 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get source files that changed
id: changed-source
uses: tj-actions/changed-files@v41
uses: tj-actions/changed-files@v43
with:
files: |
integrations/**
any_error/**
any_spawner/**
const_str_slice_concat/**
either_of/**
hydration_context/**
integrations/actix/**
integrations/axum/**
integrations/utils/**
leptos/**
leptos_config/**
leptos_dom/**
leptos_hot_reload/**
leptos_macro/**
leptos_reactive/**
leptos_server/**
meta/**
next_tuple/**
oco/**
or_poisoned/**
reactive_graph/**
router/**
router_macro/**
server_fn/**
server_fn/server_fn_macro_default/**
server_fn_macro/**
- name: List source files that changed

View File

@@ -27,11 +27,9 @@ jobs:
- uses: actions/checkout@v4
- name: Setup Rust
uses: actions-rs/toolchain@v1
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ inputs.toolchain }}
override: true
components: rustfmt
- name: Add wasm32-unknown-unknown
run: rustup target add wasm32-unknown-unknown
@@ -44,8 +42,17 @@ jobs:
- uses: Swatinem/rust-cache@v2
- name: Install binstall
uses: cargo-bins/cargo-binstall@main
- name: Install wasm-bindgen
run: cargo binstall wasm-bindgen-cli --no-confirm
- name: Install cargo-leptos
run: cargo binstall cargo-leptos --no-confirm
- name: Install Trunk
uses: jetli/trunk-action@v0.4.0
uses: jetli/trunk-action@v0.5.0
with:
version: "latest"
@@ -55,9 +62,9 @@ jobs:
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
- uses: pnpm/action-setup@v2
- uses: pnpm/action-setup@v3
name: Install pnpm
id: pnpm-install
with:
@@ -69,7 +76,7 @@ jobs:
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
@@ -107,6 +114,11 @@ jobs:
fi
done
- name: Install Deno
uses: denoland/setup-deno@v1
with:
deno-version: v1.x
# Run Cargo Make Task
- name: ${{ inputs.cargo_make_task }}
run: |

View File

@@ -72,12 +72,19 @@ check-examples`.
## Before Submitting a PR
We have a fairly extensive CI setup that runs both lints (like `rustfmt` and `clippy`)
We have a fairly extensive CI setup that runs both lints (like `rustfmt` and `clippy`)
and tests on PRs. You can run most of these locally if you have `cargo-make` installed.
Note that some of the `rustfmt` settings used require usage of the nightly compiler.
Formatting the code using the stable toolchain may result in a wrong code format and
subsequently CI errors.
Run `cargo +nightly fmt` if you want to keep the stable toolchain active.
You may want to let your IDE automatically use the `+nightly` parameter when a
"format on save" action is used.
If you added an example, make sure to add it to the list in `examples/Makefile.toml`.
From the root directory of the repo, run
From the root directory of the repo, run
- `cargo +nightly fmt`
- `cargo +nightly make check`
- `cargo +nightly make test`

View File

@@ -1,17 +1,28 @@
[workspace]
resolver = "2"
members = [
# utilities
"oco",
"any_spawner",
"const_str_slice_concat",
"either_of",
"next_tuple",
"oco",
"or_poisoned",
# core
"hydration_context",
"leptos",
"leptos_dom",
"leptos_config",
"leptos_hot_reload",
"leptos_macro",
"leptos_reactive",
"leptos_server",
"reactive_graph",
"server_fn",
"server_fn_macro",
"server_fn/server_fn_macro_default",
"tachys",
# integrations
"integrations/actix",
@@ -21,26 +32,38 @@ members = [
# libraries
"meta",
"router",
"router_macro",
"any_error",
]
exclude = ["benchmarks", "examples"]
[workspace.package]
version = "0.6.5"
version = "0.7.0-alpha"
rust-version = "1.75"
[workspace.dependencies]
leptos = { path = "./leptos", version = "0.6.5" }
leptos_dom = { path = "./leptos_dom", version = "0.6.5" }
leptos_hot_reload = { path = "./leptos_hot_reload", version = "0.6.5" }
leptos_macro = { path = "./leptos_macro", version = "0.6.5" }
leptos_reactive = { path = "./leptos_reactive", version = "0.6.5" }
leptos_server = { path = "./leptos_server", version = "0.6.5" }
server_fn = { path = "./server_fn", version = "0.6.5" }
server_fn_macro = { path = "./server_fn_macro", version = "0.6.5" }
server_fn_macro_default = { path = "./server_fn/server_fn_macro_default", version = "0.6" }
leptos_config = { path = "./leptos_config", version = "0.6.5" }
leptos_router = { path = "./router", version = "0.6.5" }
leptos_meta = { path = "./meta", version = "0.6.5" }
leptos_integration_utils = { path = "./integrations/utils", version = "0.6.5" }
throw_error = { path = "./any_error/", version = "0.1" }
any_spawner = { path = "./any_spawner/", version = "0.1" }
const_str_slice_concat = { path = "./const_str_slice_concat", version = "0.1" }
either_of = { path = "./either_of/", version = "0.1" }
hydration_context = { path = "./hydration_context", version = "0.2.0-alpha" }
leptos = { path = "./leptos", version = "0.7.0-alpha" }
leptos_config = { path = "./leptos_config", version = "0.7.0-alpha" }
leptos_dom = { path = "./leptos_dom", version = "0.7.0-alpha" }
leptos_hot_reload = { path = "./leptos_hot_reload", version = "0.7.0-alpha" }
leptos_integration_utils = { path = "./integrations/utils", version = "0.7.0-alpha" }
leptos_macro = { path = "./leptos_macro", version = "0.7.0-alpha" }
leptos_router = { path = "./router", version = "0.7.0-alpha" }
leptos_server = { path = "./leptos_server", version = "0.7.0-alpha" }
leptos_meta = { path = "./meta", version = "0.7.0-alpha" }
next_tuple = { path = "./next_tuple", version = "0.1.0-alpha" }
oco_ref = { path = "./oco", version = "0.2" }
or_poisoned = { path = "./or_poisoned", version = "0.1" }
reactive_graph = { path = "./reactive_graph", version = "0.1.0-alpha" }
server_fn = { path = "./server_fn", version = "0.7.0-alpha" }
server_fn_macro = { path = "./server_fn_macro", version = "0.7.0-alpha" }
server_fn_macro_default = { path = "./server_fn/server_fn_macro_default", version = "0.7.0-alpha" }
tachys = { path = "./tachys", version = "0.1.0-alpha" }
[profile.release]
codegen-units = 1

View File

@@ -163,7 +163,7 @@ The new rendering approach being developed for 0.7 supports “universal renderi
### How is this different from Yew?
Yew is the most-used library for Rust web UI development, but there are several differences between Yew and Leptos, in philosophy, approach, and performance.
Yew is the most-used library for Rust web UI development, but there are several differences between Yew and Leptos, in philosophy, approach, and performance.
- **VDOM vs. fine-grained:** Yew is built on the virtual DOM (VDOM) model: state changes cause components to re-render, generating a new virtual DOM tree. Yew diffs this against the previous VDOM, and applies those patches to the actual DOM. Component functions rerun whenever state changes. Leptos takes an entirely different approach. Components run once, creating (and returning) actual DOM nodes and setting up a reactive system to update those DOM nodes.
- **Performance:** This has huge performance implications: Leptos is simply much faster at both creating and updating the UI than Yew is.
@@ -182,4 +182,4 @@ Sycamore and Leptos are both heavily influenced by SolidJS. At this point, Lepto
- **Templating DSLs:** Sycamore uses a custom templating language for its views, while Leptos uses a JSX-like template format.
- **`'static` signals:** One of Leptoss main innovations was the creation of `Copy + 'static` signals, which have excellent ergonomics. Sycamore is in the process of adopting the same pattern, but this is not yet released.
- **Perseus vs. server functions:** The Perseus metaframework provides an opinionated way to build Sycamore apps that include server functionality. Leptos instead provides primitives like server functions in the core of the framework.
- **Perseus vs. server functions:** The Perseus metaframework provides an opinionated way to build Sycamore apps that include server functionality. Leptos instead provides primitives like server functions in the core of the framework.

40
TODO.md Normal file
View File

@@ -0,0 +1,40 @@
- core examples
- [x] counter
- [x] counters
- [x] fetch
- [x] todomvc
- [x] error_boundary
- [x] parent\_child
- [x] on: on components
- [ ] router
- [ ] slots
- [ ] hackernews
- [ ] counter\_isomorphic
- [ ] todo\_app\_sqlite
- other ssr examples
- [ ] error boundary SSR
- reactivity
- Signal wrappers
- SignalDispose implementations on all Copy types
- untracked access warnings
- ErrorBoundary
- [ ] RenderHtml implementation
- [ ] Separate component?
- Suspense/Transition components?
- callbacks
- unsync StoredValue
- SSR
- escaping HTML correctly (attributes + text nodes)
- router
- nested routes
- trailing slashes
- \_meta package (and use in hackernews)
- integrations
- update tests
- hackernews example
- TODOs
- Suspense/Transition/Await components
- nicer routing components
- async routing (waiting for data to load before navigation)
- `<A>` component
- figure out rebuilding issues: list (needs new signal IDs) vs. regular rebuild

13
any_error/Cargo.toml Normal file
View File

@@ -0,0 +1,13 @@
[package]
name = "throw_error"
edition = "2021"
version = "0.1.0"
authors = ["Greg Johnston"]
license = "MIT"
readme = "../README.md"
repository = "https://github.com/leptos-rs/leptos"
description = "Utilities for wrapping, throwing, and catching errors."
rust-version.workspace = true
[dependencies]
pin-project-lite = "0.2"

2
any_error/README.md Normal file
View File

@@ -0,0 +1,2 @@
A utility library for wrapping arbitrary errors, and for “throwing” errors in a way
that can be caught by user-defined error hooks.

148
any_error/src/lib.rs Normal file
View File

@@ -0,0 +1,148 @@
#![forbid(unsafe_code)]
#![deny(missing_docs)]
//! A utility library for wrapping arbitrary errors, and for “throwing” errors in a way
//! that can be caught by user-defined error hooks.
use std::{
cell::RefCell,
error,
fmt::{self, Display},
future::Future,
ops,
pin::Pin,
sync::Arc,
task::{Context, Poll},
};
/* Wrapper Types */
/// This is a result type into which any error can be converted.
///
/// Results are stored as [`Error`].
pub type Result<T, E = Error> = core::result::Result<T, E>;
/// A generic wrapper for any error.
#[derive(Debug, Clone)]
#[repr(transparent)]
pub struct Error(Arc<dyn error::Error + Send + Sync>);
impl Error {
/// Converts the wrapper into the inner reference-counted error.
pub fn into_inner(self) -> Arc<dyn error::Error + Send + Sync> {
Arc::clone(&self.0)
}
}
impl ops::Deref for Error {
type Target = Arc<dyn error::Error + Send + Sync>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl<T> From<T> for Error
where
T: error::Error + Send + Sync + 'static,
{
fn from(value: T) -> Self {
Error(Arc::new(value))
}
}
/// Implements behavior that allows for global or scoped error handling.
///
/// This allows for both "throwing" errors to register them, and "clearing" errors when they are no
/// longer valid. This is useful for something like a user interface, in which an error can be
/// "thrown" on some invalid user input, and later "cleared" if the user corrects the input.
/// Keeping a unique identifier for each error allows the UI to be updated accordingly.
pub trait ErrorHook: Send + Sync {
/// Handles the given error, returning a unique identifier.
fn throw(&self, error: Error) -> ErrorId;
/// Clears the error associated with the given identifier.
fn clear(&self, id: &ErrorId);
}
/// A unique identifier for an error. This is returned when you call [`throw`], which calls a
/// global error handler.
#[derive(Debug, PartialEq, Eq, Hash, Clone, Default)]
pub struct ErrorId(usize);
impl Display for ErrorId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Display::fmt(&self.0, f)
}
}
impl From<usize> for ErrorId {
fn from(value: usize) -> Self {
Self(value)
}
}
thread_local! {
static ERROR_HOOK: RefCell<Option<Arc<dyn ErrorHook>>> = RefCell::new(None);
}
/// Sets the current thread-local error hook, which will be invoked when [`throw`] is called.
pub fn set_error_hook(hook: Arc<dyn ErrorHook>) {
ERROR_HOOK.with_borrow_mut(|this| *this = Some(hook))
}
/// Invokes the error hook set by [`set_error_hook`] with the given error.
pub fn throw(error: impl Into<Error>) -> ErrorId {
ERROR_HOOK
.with_borrow(|hook| hook.as_ref().map(|hook| hook.throw(error.into())))
.unwrap_or_default()
}
/// Clears the given error from the current error hook.
pub fn clear(id: &ErrorId) {
ERROR_HOOK
.with_borrow(|hook| hook.as_ref().map(|hook| hook.clear(id)))
.unwrap_or_default()
}
pin_project_lite::pin_project! {
/// A [`Future`] that reads the error hook that is set when it is created, and sets this as the
/// current error hook whenever it is polled.
pub struct ErrorHookFuture<Fut> {
hook: Option<Arc<dyn ErrorHook>>,
#[pin]
inner: Fut
}
}
impl<Fut> ErrorHookFuture<Fut> {
/// Reads the current hook and wraps the given [`Future`], returning a new `Future` that will
/// set the error hook whenever it is polled.
pub fn new(inner: Fut) -> Self {
Self {
hook: ERROR_HOOK.with_borrow(Clone::clone),
inner,
}
}
}
impl<Fut> Future for ErrorHookFuture<Fut>
where
Fut: Future,
{
type Output = Fut::Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.project();
if let Some(hook) = &this.hook {
set_error_hook(Arc::clone(hook))
}
this.inner.poll(cx)
}
}

30
any_spawner/Cargo.toml Normal file
View File

@@ -0,0 +1,30 @@
[package]
name = "any_spawner"
edition = "2021"
version = "0.1.0"
authors = ["Greg Johnston"]
license = "MIT"
readme = "../README.md"
repository = "https://github.com/leptos-rs/leptos"
description = "Spawn asynchronous tasks in an executor-independent way."
[dependencies]
futures = "0.3"
glib = { version = "0.19", optional = true }
thiserror = "1"
tokio = { version = "1", optional = true, default-features = false, features = [
"rt",
] }
tracing = { version = "0.1", optional = true }
wasm-bindgen-futures = { version = "0.4", optional = true }
[features]
tracing = ["dep:tracing"]
tokio = ["dep:tokio"]
glib = ["dep:glib"]
wasm-bindgen = ["dep:wasm-bindgen-futures"]
futures-executor = ["futures/thread-pool", "futures/executor"]
[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]

26
any_spawner/README.md Normal file
View File

@@ -0,0 +1,26 @@
This crate makes it easier to write asynchronous code that is executor-agnostic, by providing a
utility that can be used to spawn tasks in a variety of executors.
It only supports single executor per program, but that executor can be set at runtime, anywhere
in your crate (or an application that depends on it).
This can be extended to support any executor or runtime that supports spawning [`Future`]s.
This is a least common denominator implementation in many ways. Limitations include:
- setting an executor is a one-time, global action
- no "join handle" or other result is returned from the spawn
- the `Future` must output `()`
```rust
use any_spawner::Executor;
Executor::init_futures_executor()
.expect("executor should only be initialized once");
// spawn a thread-safe Future
Executor::spawn(async { /* ... */ });
// spawn a Future that is !Send
Executor::spawn_local(async { /* ... */ });
```

244
any_spawner/src/lib.rs Normal file
View File

@@ -0,0 +1,244 @@
//! This crate makes it easier to write asynchronous code that is executor-agnostic, by providing a
//! utility that can be used to spawn tasks in a variety of executors.
//!
//! It only supports single executor per program, but that executor can be set at runtime, anywhere
//! in your crate (or an application that depends on it).
//!
//! This can be extended to support any executor or runtime that supports spawning [`Future`]s.
//!
//! This is a least common denominator implementation in many ways. Limitations include:
//! - setting an executor is a one-time, global action
//! - no "join handle" or other result is returned from the spawn
//! - the `Future` must output `()`
//!
//! ```rust
//! use any_spawner::Executor;
//!
//! // make sure an Executor has been initialized with one of the init_ functions
//!
//! # if false {
//! // spawn a thread-safe Future
//! Executor::spawn(async { /* ... */ });
//!
//! // spawn a Future that is !Send
//! Executor::spawn_local(async { /* ... */ });
//! # }
//! ```
#![forbid(unsafe_code)]
#![deny(missing_docs)]
use std::{future::Future, pin::Pin, sync::OnceLock};
use thiserror::Error;
pub(crate) type PinnedFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
pub(crate) type PinnedLocalFuture<T> = Pin<Box<dyn Future<Output = T>>>;
static SPAWN: OnceLock<fn(PinnedFuture<()>)> = OnceLock::new();
static SPAWN_LOCAL: OnceLock<fn(PinnedLocalFuture<()>)> = OnceLock::new();
/// Errors that can occur when using the executor.
#[derive(Error, Debug)]
pub enum ExecutorError {
/// The executor has already been set.
#[error("Executor has already been set.")]
AlreadySet,
}
/// A global async executor that can spawn tasks.
pub struct Executor;
impl Executor {
/// Spawns a thread-safe [`Future`].
/// ```rust
/// use any_spawner::Executor;
/// # if false {
/// // spawn a thread-safe Future
/// Executor::spawn(async { /* ... */ });
/// # }
/// ```
#[track_caller]
pub fn spawn(fut: impl Future<Output = ()> + Send + 'static) {
if let Some(spawner) = SPAWN.get() {
spawner(Box::pin(fut))
} else {
#[cfg(all(debug_assertions, feature = "tracing"))]
tracing::error!(
"At {}, tried to spawn a Future with Executor::spawn() before \
the Executor had been set.",
std::panic::Location::caller()
);
#[cfg(all(debug_assertions, not(feature = "tracing")))]
panic!(
"At {}, tried to spawn a Future with Executor::spawn() before \
the Executor had been set.",
std::panic::Location::caller()
);
}
}
/// Spawns a [`Future`] that cannot be sent across threads.
/// ```rust
/// use any_spawner::Executor;
///
/// # if false {
/// // spawn a thread-safe Future
/// Executor::spawn_local(async { /* ... */ });
/// # }
/// ```
#[track_caller]
pub fn spawn_local(fut: impl Future<Output = ()> + 'static) {
if let Some(spawner) = SPAWN_LOCAL.get() {
spawner(Box::pin(fut))
} else {
#[cfg(all(debug_assertions, feature = "tracing"))]
tracing::error!(
"At {}, tried to spawn a Future with Executor::spawn_local() \
before the Executor had been set.",
std::panic::Location::caller()
);
#[cfg(all(debug_assertions, not(feature = "tracing")))]
panic!(
"At {}, tried to spawn a Future with Executor::spawn_local() \
before the Executor had been set.",
std::panic::Location::caller()
);
}
}
/// Waits until the next "tick" of the current async executor.
pub async fn tick() {
let (tx, rx) = futures::channel::oneshot::channel();
Executor::spawn(async move {
_ = tx.send(());
});
_ = rx.await;
}
}
impl Executor {
/// Globally sets the [`tokio`] runtime as the executor used to spawn tasks.
///
/// Returns `Err(_)` if an executor has already been set.
///
/// Requires the `tokio` feature to be activated on this crate.
#[cfg(feature = "tokio")]
#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
pub fn init_tokio() -> Result<(), ExecutorError> {
SPAWN
.set(|fut| {
tokio::spawn(fut);
})
.map_err(|_| ExecutorError::AlreadySet)?;
SPAWN_LOCAL
.set(|fut| {
tokio::task::spawn_local(fut);
})
.map_err(|_| ExecutorError::AlreadySet)?;
Ok(())
}
/// Globally sets the [`wasm-bindgen-futures`] runtime as the executor used to spawn tasks.
///
/// Returns `Err(_)` if an executor has already been set.
///
/// Requires the `wasm-bindgen` feature to be activated on this crate.
#[cfg(feature = "wasm-bindgen")]
#[cfg_attr(docsrs, doc(cfg(feature = "wasm-bindgen")))]
pub fn init_wasm_bindgen() -> Result<(), ExecutorError> {
SPAWN
.set(|fut| {
wasm_bindgen_futures::spawn_local(fut);
})
.map_err(|_| ExecutorError::AlreadySet)?;
SPAWN_LOCAL
.set(|fut| {
wasm_bindgen_futures::spawn_local(fut);
})
.map_err(|_| ExecutorError::AlreadySet)?;
Ok(())
}
/// Globally sets the [`glib`] runtime as the executor used to spawn tasks.
///
/// Returns `Err(_)` if an executor has already been set.
///
/// Requires the `glib` feature to be activated on this crate.
#[cfg(feature = "glib")]
#[cfg_attr(docsrs, doc(cfg(feature = "glib")))]
pub fn init_glib() -> Result<(), ExecutorError> {
SPAWN
.set(|fut| {
let main_context = glib::MainContext::default();
main_context.spawn(fut);
})
.map_err(|_| ExecutorError::AlreadySet)?;
SPAWN_LOCAL
.set(|fut| {
let main_context = glib::MainContext::default();
main_context.spawn_local(fut);
})
.map_err(|_| ExecutorError::AlreadySet)?;
Ok(())
}
/// Globally sets the [`futures`] executor as the executor used to spawn tasks,
/// lazily creating a thread pool to spawn tasks into.
///
/// Returns `Err(_)` if an executor has already been set.
///
/// Requires the `futures-executor` feature to be activated on this crate.
#[cfg(feature = "futures-executor")]
#[cfg_attr(docsrs, doc(cfg(feature = "futures-executor")))]
pub fn init_futures_executor() -> Result<(), ExecutorError> {
use futures::{
executor::{LocalPool, ThreadPool},
task::{LocalSpawnExt, SpawnExt},
};
static THREAD_POOL: OnceLock<ThreadPool> = OnceLock::new();
thread_local! {
static LOCAL_POOL: LocalPool = LocalPool::new();
}
fn get_thread_pool() -> &'static ThreadPool {
THREAD_POOL.get_or_init(|| {
ThreadPool::new()
.expect("could not create futures executor ThreadPool")
})
}
SPAWN
.set(|fut| {
get_thread_pool()
.spawn(fut)
.expect("failed to spawn future");
})
.map_err(|_| ExecutorError::AlreadySet)?;
SPAWN_LOCAL
.set(|fut| {
LOCAL_POOL.with(|pool| {
let spawner = pool.spawner();
spawner.spawn_local(fut).expect("failed to spawn future");
});
})
.map_err(|_| ExecutorError::AlreadySet)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
#[cfg(feature = "futures-executor")]
#[test]
fn can_spawn_local_future() {
use crate::Executor;
use std::rc::Rc;
Executor::init_futures_executor().expect("couldn't set executor");
let rc = Rc::new(());
Executor::spawn_local(async {
_ = rc;
});
Executor::spawn(async {});
}
}

View File

@@ -2,6 +2,7 @@
name = "benchmarks"
version = "0.1.0"
edition = "2021"
rust-version.workspace = true
[dependencies]
l0410 = { package = "leptos", version = "0.4.10", features = [

View File

@@ -3,5 +3,5 @@ alias = "check-all"
[tasks.check-all]
command = "cargo"
args = ["+nightly-2024-01-29", "check-all-features"]
args = ["check-all-features"]
install_crate = "cargo-all-features"

View File

@@ -8,4 +8,11 @@ args = ["fmt", "--", "--check", "--config-path", "${LEPTOS_PROJECT_DIRECTORY}"]
[tasks.clippy-each-feature]
dependencies = ["install-clippy"]
command = "cargo"
args = ["hack", "clippy", "--all", "--each-feature", "--no-dev-deps"]
args = [
"clippy",
"--all-features",
"--no-deps",
"--",
"-D",
"clippy::print_stdout",
]

View File

@@ -3,5 +3,5 @@ alias = "test-all"
[tasks.test-all]
command = "cargo"
args = ["+nightly-2024-01-29", "test-all-features"]
args = ["test-all-features"]
install_crate = "cargo-all-features"

View File

@@ -0,0 +1,12 @@
[package]
name = "const_str_slice_concat"
edition = "2021"
version = "0.1.0"
authors = ["Greg Johnston"]
license = "MIT"
readme = "../README.md"
repository = "https://github.com/leptos-rs/leptos"
description = "Utilities for const concatenation of string slices."
rust-version.workspace = true
[dependencies]

View File

@@ -0,0 +1 @@
extend = { path = "../cargo-make/main.toml" }

View File

@@ -0,0 +1,139 @@
#![no_std]
#![forbid(unsafe_code)]
#![deny(missing_docs)]
//! Utilities for const concatenation of string slices.
pub(crate) const MAX_TEMPLATE_SIZE: usize = 4096;
/// Converts a zero-terminated buffer of bytes into a UTF-8 string.
pub const fn str_from_buffer(buf: &[u8; MAX_TEMPLATE_SIZE]) -> &str {
match core::ffi::CStr::from_bytes_until_nul(buf) {
Ok(cstr) => match cstr.to_str() {
Ok(str) => str,
Err(_) => panic!("TEMPLATE FAILURE"),
},
Err(_) => panic!("TEMPLATE FAILURE"),
}
}
/// Concatenates any number of static strings into a single array.
// credit to Rainer Stropek, "Constant fun," Rust Linz, June 2022
pub const fn const_concat(
strs: &'static [&'static str],
) -> [u8; MAX_TEMPLATE_SIZE] {
let mut buffer = [0; MAX_TEMPLATE_SIZE];
let mut position = 0;
let mut remaining = strs;
while let [current, tail @ ..] = remaining {
let x = current.as_bytes();
let mut i = 0;
// have it iterate over bytes manually, because, again,
// no mutable refernces in const fns
while i < x.len() {
buffer[position] = x[i];
position += 1;
i += 1;
}
remaining = tail;
}
buffer
}
/// Converts a zero-terminated buffer of bytes into a UTF-8 string with the given prefix.
pub const fn const_concat_with_prefix(
strs: &'static [&'static str],
prefix: &'static str,
suffix: &'static str,
) -> [u8; MAX_TEMPLATE_SIZE] {
let mut buffer = [0; MAX_TEMPLATE_SIZE];
let mut position = 0;
let mut remaining = strs;
while let [current, tail @ ..] = remaining {
let x = current.as_bytes();
let mut i = 0;
// have it iterate over bytes manually, because, again,
// no mutable refernces in const fns
while i < x.len() {
buffer[position] = x[i];
position += 1;
i += 1;
}
remaining = tail;
}
if buffer[0] == 0 {
buffer
} else {
let mut new_buf = [0; MAX_TEMPLATE_SIZE];
let prefix = prefix.as_bytes();
let suffix = suffix.as_bytes();
let mut position = 0;
let mut i = 0;
while i < prefix.len() {
new_buf[position] = prefix[i];
position += 1;
i += 1;
}
i = 0;
while i < buffer.len() {
if buffer[i] == 0 {
break;
}
new_buf[position] = buffer[i];
position += 1;
i += 1;
}
i = 0;
while i < suffix.len() {
new_buf[position] = suffix[i];
position += 1;
i += 1;
}
new_buf
}
}
/// Converts any number of strings into a UTF-8 string, separated by the given string.
pub const fn const_concat_with_separator(
strs: &[&str],
separator: &'static str,
) -> [u8; MAX_TEMPLATE_SIZE] {
let mut buffer = [0; MAX_TEMPLATE_SIZE];
let mut position = 0;
let mut remaining = strs;
while let [current, tail @ ..] = remaining {
let x = current.as_bytes();
let mut i = 0;
// have it iterate over bytes manually, because, again,
// no mutable refernces in const fns
while i < x.len() {
buffer[position] = x[i];
position += 1;
i += 1;
}
if !x.is_empty() {
let mut position = 0;
let separator = separator.as_bytes();
while i < separator.len() {
buffer[position] = separator[i];
position += 1;
i += 1;
}
}
remaining = tail;
}
buffer
}

1
docs/book_ru/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
book

2
docs/book_ru/README.md Normal file
View File

@@ -0,0 +1,2 @@
Перевод в процессе, книга скоро будет доступна
> Translation underway, book will be available soon

10
docs/book_ru/book.toml Normal file
View File

@@ -0,0 +1,10 @@
[output.html]
additional-css = ["./mdbook-admonish.css"]
[output.html.playground]
runnable = false
[preprocessor]
[preprocessor.admonish]
command = "mdbook-admonish"
assets_version = "3.0.1" # не редактировать: управляется `mdbook-admonish install`

View File

@@ -0,0 +1,345 @@
@charset "UTF-8";
:root {
--md-admonition-icon--admonish-note: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z'/></svg>");
--md-admonition-icon--admonish-abstract: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z'/></svg>");
--md-admonition-icon--admonish-info: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z'/></svg>");
--md-admonition-icon--admonish-tip: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.58.58 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27z'/></svg>");
--md-admonition-icon--admonish-success: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m9 20.42-6.21-6.21 2.83-2.83L9 14.77l9.88-9.89 2.83 2.83L9 20.42z'/></svg>");
--md-admonition-icon--admonish-question: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10z'/></svg>");
--md-admonition-icon--admonish-warning: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2 1 21z'/></svg>");
--md-admonition-icon--admonish-failure: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20 6.91 17.09 4 12 9.09 6.91 4 4 6.91 9.09 12 4 17.09 6.91 20 12 14.91 17.09 20 20 17.09 14.91 12 20 6.91z'/></svg>");
--md-admonition-icon--admonish-danger: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M11 15H6l7-14v8h5l-7 14v-8z'/></svg>");
--md-admonition-icon--admonish-bug: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z'/></svg>");
--md-admonition-icon--admonish-example: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 0 1 .75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z'/></svg>");
--md-admonition-icon--admonish-quote: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z'/></svg>");
--md-details-icon: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42Z'/></svg>");
}
:is(.admonition) {
display: flow-root;
margin: 1.5625em 0;
padding: 0 1.2rem;
color: var(--fg);
page-break-inside: avoid;
background-color: var(--bg);
border: 0 solid black;
border-inline-start-width: 0.4rem;
border-radius: 0.2rem;
box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.05), 0 0 0.1rem rgba(0, 0, 0, 0.1);
}
@media print {
:is(.admonition) {
box-shadow: none;
}
}
:is(.admonition) > * {
box-sizing: border-box;
}
:is(.admonition) :is(.admonition) {
margin-top: 1em;
margin-bottom: 1em;
}
:is(.admonition) > .tabbed-set:only-child {
margin-top: 0;
}
html :is(.admonition) > :last-child {
margin-bottom: 1.2rem;
}
a.admonition-anchor-link {
display: none;
position: absolute;
left: -1.2rem;
padding-right: 1rem;
}
a.admonition-anchor-link:link, a.admonition-anchor-link:visited {
color: var(--fg);
}
a.admonition-anchor-link:link:hover, a.admonition-anchor-link:visited:hover {
text-decoration: none;
}
a.admonition-anchor-link::before {
content: "§";
}
:is(.admonition-title, summary.admonition-title) {
position: relative;
min-height: 4rem;
margin-block: 0;
margin-inline: -1.6rem -1.2rem;
padding-block: 0.8rem;
padding-inline: 4.4rem 1.2rem;
font-weight: 700;
background-color: rgba(68, 138, 255, 0.1);
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
display: flex;
}
:is(.admonition-title, summary.admonition-title) p {
margin: 0;
}
html :is(.admonition-title, summary.admonition-title):last-child {
margin-bottom: 0;
}
:is(.admonition-title, summary.admonition-title)::before {
position: absolute;
top: 0.625em;
inset-inline-start: 1.6rem;
width: 2rem;
height: 2rem;
background-color: #448aff;
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>');
-webkit-mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>');
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-size: contain;
content: "";
}
:is(.admonition-title, summary.admonition-title):hover a.admonition-anchor-link {
display: initial;
}
details.admonition > summary.admonition-title::after {
position: absolute;
top: 0.625em;
inset-inline-end: 1.6rem;
height: 2rem;
width: 2rem;
background-color: currentcolor;
mask-image: var(--md-details-icon);
-webkit-mask-image: var(--md-details-icon);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-size: contain;
content: "";
transform: rotate(0deg);
transition: transform 0.25s;
}
details[open].admonition > summary.admonition-title::after {
transform: rotate(90deg);
}
:is(.admonition):is(.admonish-note) {
border-color: #448aff;
}
:is(.admonish-note) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(68, 138, 255, 0.1);
}
:is(.admonish-note) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #448aff;
mask-image: var(--md-admonition-icon--admonish-note);
-webkit-mask-image: var(--md-admonition-icon--admonish-note);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-abstract, .admonish-summary, .admonish-tldr) {
border-color: #00b0ff;
}
:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(0, 176, 255, 0.1);
}
:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #00b0ff;
mask-image: var(--md-admonition-icon--admonish-abstract);
-webkit-mask-image: var(--md-admonition-icon--admonish-abstract);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-info, .admonish-todo) {
border-color: #00b8d4;
}
:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(0, 184, 212, 0.1);
}
:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #00b8d4;
mask-image: var(--md-admonition-icon--admonish-info);
-webkit-mask-image: var(--md-admonition-icon--admonish-info);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-tip, .admonish-hint, .admonish-important) {
border-color: #00bfa5;
}
:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(0, 191, 165, 0.1);
}
:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #00bfa5;
mask-image: var(--md-admonition-icon--admonish-tip);
-webkit-mask-image: var(--md-admonition-icon--admonish-tip);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-success, .admonish-check, .admonish-done) {
border-color: #00c853;
}
:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(0, 200, 83, 0.1);
}
:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #00c853;
mask-image: var(--md-admonition-icon--admonish-success);
-webkit-mask-image: var(--md-admonition-icon--admonish-success);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-question, .admonish-help, .admonish-faq) {
border-color: #64dd17;
}
:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(100, 221, 23, 0.1);
}
:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #64dd17;
mask-image: var(--md-admonition-icon--admonish-question);
-webkit-mask-image: var(--md-admonition-icon--admonish-question);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-warning, .admonish-caution, .admonish-attention) {
border-color: #ff9100;
}
:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(255, 145, 0, 0.1);
}
:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #ff9100;
mask-image: var(--md-admonition-icon--admonish-warning);
-webkit-mask-image: var(--md-admonition-icon--admonish-warning);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-failure, .admonish-fail, .admonish-missing) {
border-color: #ff5252;
}
:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(255, 82, 82, 0.1);
}
:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #ff5252;
mask-image: var(--md-admonition-icon--admonish-failure);
-webkit-mask-image: var(--md-admonition-icon--admonish-failure);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-danger, .admonish-error) {
border-color: #ff1744;
}
:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(255, 23, 68, 0.1);
}
:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #ff1744;
mask-image: var(--md-admonition-icon--admonish-danger);
-webkit-mask-image: var(--md-admonition-icon--admonish-danger);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-bug) {
border-color: #f50057;
}
:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(245, 0, 87, 0.1);
}
:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #f50057;
mask-image: var(--md-admonition-icon--admonish-bug);
-webkit-mask-image: var(--md-admonition-icon--admonish-bug);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-example) {
border-color: #7c4dff;
}
:is(.admonish-example) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(124, 77, 255, 0.1);
}
:is(.admonish-example) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #7c4dff;
mask-image: var(--md-admonition-icon--admonish-example);
-webkit-mask-image: var(--md-admonition-icon--admonish-example);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
:is(.admonition):is(.admonish-quote, .admonish-cite) {
border-color: #9e9e9e;
}
:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title) {
background-color: rgba(158, 158, 158, 0.1);
}
:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title)::before {
background-color: #9e9e9e;
mask-image: var(--md-admonition-icon--admonish-quote);
-webkit-mask-image: var(--md-admonition-icon--admonish-quote);
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
}
.navy :is(.admonition) {
background-color: var(--sidebar-bg);
}
.ayu :is(.admonition),
.coal :is(.admonition) {
background-color: var(--theme-hover);
}
.rust :is(.admonition) {
background-color: var(--sidebar-bg);
color: var(--sidebar-fg);
}
.rust .admonition-anchor-link:link, .rust .admonition-anchor-link:visited {
color: var(--sidebar-fg);
}

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/">
<link rel="canonical" href="https://book.leptos.dev/">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/15_global_state.html">
<link rel="canonical" href="https://book.leptos.dev/15_global_state.html">

View File

@@ -0,0 +1,55 @@
# Оглавление
- [Вступление](./01_introduction.md)
- [Начало работы](./getting_started/README.md)
- [Leptos DX](./getting_started/leptos_dx.md)
- [Сообщество Leptos и leptos-* Крейты](./getting_started/community_crates.md)
- [Часть 1: Построение UI](./view/README.md)
- [Простой компонент](./view/01_basic_component.md)
- [Динамические атрибуты](./view/02_dynamic_attributes.md)
- [Компоненты и свойства](./view/03_components.md)
- [Итерирование](./view/04_iteration.md)
- [Итерирование более сложных структур через `<For>`](./view/04b_iteration.md)
- [Формы и поля ввода](./view/05_forms.md)
- [Порядок выполнения](./view/06_control_flow.md)
- [Обработка ошибок](./view/07_errors.md)
- [Общение Родитель-Ребёнок в дереве компонентов](./view/08_parent_child.md)
- [Передача Детей другим компонентам](./view/09_component_children.md)
- [Без макросов: синтаксис билдера View](./view/builder.md)
- [Реактивность](./reactivity/README.md)
- [Работа с сигналами](./reactivity/working_with_signals.md)
- [Реагирование на изменения с помощью `create_effect`](./reactivity/14_create_effect.md)
- [Примечание: Реактивность и функции](./reactivity/interlude_functions.md)
- [Тестирование](./testing.md)
- [Асинхронность](./async/README.md)
- [Подгрузка данных с помощью ресурсов (Resource)](./async/10_resources.md)
- [Ожидания (Suspense)](./async/11_suspense.md)
- [Переходы (Transition)](./async/12_transition.md)
- [Действия (Action)](./async/13_actions.md)
- [Примечание: Пробрасывание дочерних элементов](./interlude_projecting_children.md)
- [Управление глобальным состоянием](./15_global_state.md)
- [Маршрутизатор URL](./router/README.md)
- [Определение `<Routes/>`](./router/16_routes.md)
- [Вложенная маршрутизация](./router/17_nested_routing.md)
- [Параметры в пути и в строке запроса](./router/18_params_and_queries.md)
- [`<A/>`](./router/19_a.md)
- [`<Form/>`](./router/20_form.md)
- [Примечание: Стили](./interlude_styling.md)
- [Метаданные](./metadata.md)
- [Рендеринг на стороне клиента (CSR): Заключение](./csr_wrapping_up.md)
- [Часть 2: Рендеринг на стороне сервера (SSR)](./ssr/README.md)
- [`cargo-leptos`](./ssr/21_cargo_leptos.md)
- [Жизненный цикл загрузки страницы](./ssr/22_life_cycle.md)
- [Асинхронный рендеринг и режимы SSR](./ssr/23_ssr_modes.md)
- [Баги возникающие при гидратации](./ssr/24_hydration_bugs.md)
- [Работа с сервером](./server/README.md)
- [Серверные функции](./server/25_server_functions.md)
- [Экстракторы](./server/26_extractors.md)
- [Ответы и перенаправления](./server/27_response.md)
- [Постепенное улучшение и Изящная деградация](./progressive_enhancement/README.md)
- [`<ActionForm/>`](./progressive_enhancement/action_form.md)
- [Развёртывание](./deployment/README.md)
- [Оптимизация размера бинарника WASM](./deployment/binary_size.md)
- [Руководство: Острова](./islands.md)
- [Приложение: Как работает реактивная система?](./appendix_reactive_graph.md)

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/appendix_reactive_graph.html">
<link rel="canonical" href="https://book.leptos.dev/appendix_reactive_graph.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/async/10_resources.html">
<link rel="canonical" href="https://book.leptos.dev/async/10_resources.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/async/11_suspense.html">
<link rel="canonical" href="https://book.leptos.dev/async/11_suspense.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/async/12_transition.html">
<link rel="canonical" href="https://book.leptos.dev/async/12_transition.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/async/13_action.html">
<link rel="canonical" href="https://book.leptos.dev/async/13_action.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/async/index.html">
<link rel="canonical" href="https://book.leptos.dev/async/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/csr_wrapping_up.html">
<link rel="canonical" href="https://book.leptos.dev/csr_wrapping_up.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/deployment/index.html">
<link rel="canonical" href="https://book.leptos.dev/deployment/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/deployment/binary_size.html">
<link rel="canonical" href="https://book.leptos.dev/deployment/binary_size.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/getting_started/index.html">
<link rel="canonical" href="https://book.leptos.dev/getting_started/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/getting_started/community_crates.html">
<link rel="canonical" href="https://book.leptos.dev/getting_started/community_crates.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/getting_started/leptos_dx.html">
<link rel="canonical" href="https://book.leptos.dev/getting_started/leptos_dx.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/interlude_projecting_children.html">
<link rel="canonical" href="https://book.leptos.dev/interlude_projecting_children.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/interlude_styling.html">
<link rel="canonical" href="https://book.leptos.dev/interlude_styling.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/islands.html">
<link rel="canonical" href="https://book.leptos.dev/islands.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/metadata.html">
<link rel="canonical" href="https://book.leptos.dev/metadata.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/progressive_enhancement/index.html">
<link rel="canonical" href="https://book.leptos.dev/progressive_enhancement/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/progressive_enhancement/action_form.html">
<link rel="canonical" href="https://book.leptos.dev/progressive_enhancement/action_form.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/reactivity/14_create_effect.html">
<link rel="canonical" href="https://book.leptos.dev/reactivity/14_create_effect.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/reactivity/index.html">
<link rel="canonical" href="https://book.leptos.dev/reactivity/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/reactivity/interlude_functions.html">
<link rel="canonical" href="https://book.leptos.dev/reactivity/interlude_functions.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/reactivity/working_with_signals.html">
<link rel="canonical" href="https://book.leptos.dev/reactivity/working_with_signals.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/router/16_routes.html">
<link rel="canonical" href="https://book.leptos.dev/router/16_routes.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/router/17_nested_routing.html">
<link rel="canonical" href="https://book.leptos.dev/router/17_nested_routing.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/router/18_params_and_queries.html">
<link rel="canonical" href="https://book.leptos.dev/router/18_params_and_queries.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/router/19_a.html">
<link rel="canonical" href="https://book.leptos.dev/router/19_a.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/router/20_form.html">
<link rel="canonical" href="https://book.leptos.dev/router/20_form.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/router/index.html">
<link rel="canonical" href="https://book.leptos.dev/router/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/server/25_server_functions.html">
<link rel="canonical" href="https://book.leptos.dev/server/25_server_functions.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/server/26_extractors.html">
<link rel="canonical" href="https://book.leptos.dev/server/26_extractors.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/server/27_response.html">
<link rel="canonical" href="https://book.leptos.dev/server/27_response.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/server/index.html">
<link rel="canonical" href="https://book.leptos.dev/server/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/ssr/21_cargo_leptos.html">
<link rel="canonical" href="https://book.leptos.dev/ssr/21_cargo_leptos.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/ssr/22_life_cycle.html">
<link rel="canonical" href="https://book.leptos.dev/ssr/22_life_cycle.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/ssr/23_ssr_modes.html">
<link rel="canonical" href="https://book.leptos.dev/ssr/23_ssr_modes.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/ssr/24_hydration_bugs.html">
<link rel="canonical" href="https://book.leptos.dev/ssr/24_hydration_bugs.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/ssr/index.html">
<link rel="canonical" href="https://book.leptos.dev/ssr/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/testing.html">
<link rel="canonical" href="https://book.leptos.dev/testing.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/01_basic_component.html">
<link rel="canonical" href="https://book.leptos.dev/view/01_basic_component.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/02_dynamic_attributes.html">
<link rel="canonical" href="https://book.leptos.dev/view/02_dynamic_attributes.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/03_components.html">
<link rel="canonical" href="https://book.leptos.dev/view/03_components.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/04_iteration.html">
<link rel="canonical" href="https://book.leptos.dev/view/04_iteration.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/04b_iteration.html">
<link rel="canonical" href="https://book.leptos.dev/view/04b_iteration.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/05_forms.html">
<link rel="canonical" href="https://book.leptos.dev/view/05_forms.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/06_control_flow.html">
<link rel="canonical" href="https://book.leptos.dev/view/06_control_flow.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/07_errors.html">
<link rel="canonical" href="https://book.leptos.dev/view/07_errors.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/08_parent_child.html">
<link rel="canonical" href="https://book.leptos.dev/view/08_parent_child.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/09_component_children.html">
<link rel="canonical" href="https://book.leptos.dev/view/09_component_children.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/index.html">
<link rel="canonical" href="https://book.leptos.dev/view/index.html">

View File

@@ -0,0 +1,2 @@
<meta http-equiv="refresh" content="0; URL=https://book.leptos.dev/view/builder.html">
<link rel="canonical" href="https://book.leptos.dev/view/builder.html">

13
either_of/Cargo.toml Normal file
View File

@@ -0,0 +1,13 @@
[package]
name = "either_of"
edition = "2021"
version = "0.1.0"
authors = ["Greg Johnston"]
license = "MIT"
readme = "../README.md"
repository = "https://github.com/leptos-rs/leptos"
description = "Utilities for working with enumerated types that contain one of 2..n other types."
rust-version.workspace = true
[dependencies]
pin-project-lite = "0.2"

1
either_of/Makefile.toml Normal file
View File

@@ -0,0 +1 @@
extend = { path = "../cargo-make/main.toml" }

1
either_of/README.md Normal file
View File

@@ -0,0 +1 @@
Utilities for working with enumerated types that contain one of `2..n` other types.

135
either_of/src/lib.rs Normal file
View File

@@ -0,0 +1,135 @@
#![no_std]
#![forbid(unsafe_code)]
//! Utilities for working with enumerated types that contain one of `2..n` other types.
use core::{
fmt::Display,
future::Future,
pin::Pin,
task::{Context, Poll},
};
use pin_project_lite::pin_project;
#[derive(Debug, Clone, Copy)]
pub enum Either<A, B> {
Left(A),
Right(B),
}
impl<Item, A, B> Iterator for Either<A, B>
where
A: Iterator<Item = Item>,
B: Iterator<Item = Item>,
{
type Item = Item;
fn next(&mut self) -> Option<Self::Item> {
match self {
Either::Left(i) => i.next(),
Either::Right(i) => i.next(),
}
}
}
pin_project! {
#[project = EitherFutureProj]
pub enum EitherFuture<A, B> {
Left { #[pin] inner: A },
Right { #[pin] inner: B },
}
}
impl<A, B> Future for EitherFuture<A, B>
where
A: Future,
B: Future,
{
type Output = Either<A::Output, B::Output>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.project();
match this {
EitherFutureProj::Left { inner } => match inner.poll(cx) {
Poll::Pending => Poll::Pending,
Poll::Ready(inner) => Poll::Ready(Either::Left(inner)),
},
EitherFutureProj::Right { inner } => match inner.poll(cx) {
Poll::Pending => Poll::Pending,
Poll::Ready(inner) => Poll::Ready(Either::Right(inner)),
},
}
}
}
macro_rules! tuples {
($name:ident + $fut_name:ident + $fut_proj:ident => $($ty:ident),*) => {
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum $name<$($ty,)*> {
$($ty ($ty),)*
}
impl<$($ty,)*> Display for $name<$($ty,)*>
where
$($ty: Display,)*
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
$($name::$ty(this) => this.fmt(f),)*
}
}
}
impl<Item, $($ty,)*> Iterator for $name<$($ty,)*>
where
$($ty: Iterator<Item = Item>,)*
{
type Item = Item;
fn next(&mut self) -> Option<Self::Item> {
match self {
$($name::$ty(i) => i.next(),)*
}
}
}
pin_project! {
#[project = $fut_proj]
pub enum $fut_name<$($ty,)*> {
$($ty { #[pin] inner: $ty },)*
}
}
impl<$($ty,)*> Future for $fut_name<$($ty,)*>
where
$($ty: Future,)*
{
type Output = $name<$($ty::Output,)*>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.project();
match this {
$($fut_proj::$ty { inner } => match inner.poll(cx) {
Poll::Pending => Poll::Pending,
Poll::Ready(inner) => Poll::Ready($name::$ty(inner)),
},)*
}
}
}
}
}
tuples!(EitherOf3 + EitherOf3Future + EitherOf3FutureProj => A, B, C);
tuples!(EitherOf4 + EitherOf4Future + EitherOf4FutureProj => A, B, C, D);
tuples!(EitherOf5 + EitherOf5Future + EitherOf5FutureProj => A, B, C, D, E);
tuples!(EitherOf6 + EitherOf6Future + EitherOf6FutureProj => A, B, C, D, E, F);
tuples!(EitherOf7 + EitherOf7Future + EitherOf7FutureProj => A, B, C, D, E, F, G);
tuples!(EitherOf8 + EitherOf8Future + EitherOf8FutureProj => A, B, C, D, E, F, G, H);
tuples!(EitherOf9 + EitherOf9Future + EitherOf9FutureProj => A, B, C, D, E, F, G, H, I);
tuples!(EitherOf10 + EitherOf10Future + EitherOf10FutureProj => A, B, C, D, E, F, G, H, I, J);
tuples!(EitherOf11 + EitherOf11Future + EitherOf11FutureProj => A, B, C, D, E, F, G, H, I, J, K);
tuples!(EitherOf12 + EitherOf12Future + EitherOf12FutureProj => A, B, C, D, E, F, G, H, I, J, K, L);
tuples!(EitherOf13 + EitherOf13Future + EitherOf13FutureProj => A, B, C, D, E, F, G, H, I, J, K, L, M);
tuples!(EitherOf14 + EitherOf14Future + EitherOf14FutureProj => A, B, C, D, E, F, G, H, I, J, K, L, M, N);
tuples!(EitherOf15 + EitherOf15Future + EitherOf15FutureProj => A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
tuples!(EitherOf16 + EitherOf16Future + EitherOf16FutureProj => A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);

View File

@@ -5,34 +5,41 @@ CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true
CARGO_MAKE_CARGO_BUILD_TEST_FLAGS = ""
CARGO_MAKE_WORKSPACE_EMULATION = true
CARGO_MAKE_CRATE_WORKSPACE_MEMBERS = [
"action-form-error-handling",
"animated_show",
"counter",
"counter_isomorphic",
"counters",
"counters_stable",
"counter_url_query",
"counter_without_macros",
"directives",
"error_boundary",
"errors_axum",
"fetch",
"hackernews",
"hackernews_axum",
"hackernews_islands_axum",
"hackernews_js_fetch",
"js-framework-benchmark",
"login_with_token_csr_only",
"parent_child",
"portal",
"router",
"server_fns_axum",
"session_auth_axum",
"slots",
"spread",
"sso_auth_axum",
"ssr_modes",
"ssr_modes_axum",
"suspense_tests",
"tailwind_actix",
"tailwind_csr",
"tailwind_axum",
"tailwind_csr",
"timer",
"todo_app_sqlite",
"todo_app_sqlite_axum",
"todo_app_sqlite_csr",
"todomvc",
]
@@ -40,16 +47,16 @@ CARGO_MAKE_CRATE_WORKSPACE_MEMBERS = [
workspace = false
description = "Generate the list of workspace members"
script = '''
examples=$(ls |
grep -v .md |
grep -v Makefile.toml |
grep -v cargo-make |
grep -v gtk |
examples=$(ls |
grep -v .md |
grep -v Makefile.toml |
grep -v cargo-make |
grep -v gtk |
jq -R -s -c 'split("\n")[:-1]')
echo "CARGO_MAKE_CRATE_WORKSPACE_MEMBERS = $examples"
'''
[tasks.test-report]
workspace = false
description = "show the cargo-make configuration for web examples"
description = "show the cargo-make configuration for web examples [web|all|help]"
script = { file = "./cargo-make/scripts/web-report.sh" }

View File

@@ -8,7 +8,7 @@ To the extent that new features have been released or breaking changes have been
## Getting Started
The simplest way to get started with any example is to use the “quick start” command found in the README for each example. Most of the examples use either [`trunk`](https://trunkrs.dev/) (a simple build system and dev server for client-side-rendered apps) or [`cargo-leptos`](https://github.com/leptos-rs/cargo-leptos) (a build system for server-rendered and client-hydrated apps).
The simplest way to get started with any example is to use the “quick start” command found in the README for each example. Most of the examples use either [`trunk`](https://trunkrs.dev/) (a simple build system and dev server for client-side-rendered apps) or [`cargo-leptos`](https://github.com/leptos-rs/cargo-leptos) (a build system for server-rendered and client-hydrated apps).
## Using Cargo Make
@@ -16,16 +16,18 @@ You can also run any of the examples using [`cargo-make`](https://github.com/sag
Follow these steps to get any example up and running.
1. `cd` to the example root directory
2. Run `cargo make ci` to setup and test the example
3. Run `cargo make start` to run the example
4. Open the client URL in the console output (<http://127.0.0.1:8080> or <http://127.0.0.1:3000> by default)
5. Run `cargo make stop` to end any processes started by `cargo make start`.
1. `cd` to the example you want to run
2. Make sure `cargo-make` is installed (for example by running `cargo install cargo-make`)
3. Make sure `rustup target add wasm32-unknown-unknown` was executed for the currently selected toolchain.
4. Run `cargo make ci` to setup and test the example
5. Run `cargo make start` to run the example
6. Open the client URL in the console output (<http://127.0.0.1:8080> or <http://127.0.0.1:3000> by default)
7. Run `cargo make stop` to end any processes started by `cargo make start`.
Here are a few additional notes:
- Extendable custom task files are located in the [cargo-make](./cargo-make/) directory
- Running a task will automatically install `cargo` dependencies
- Running a task will automatically install `cargo` dependencies
- Each `Makefile.toml` file must extend the [cargo-make/main.toml](./cargo-make/main.toml) file
- [cargo-make](./cargo-make/) files that end in `*-test.toml` configure web testing strategies
- Run `cargo make test-report` to learn which examples have web tests

View File

@@ -11,7 +11,6 @@ actix-files = { version = "0.6", optional = true }
actix-web = { version = "4", optional = true, features = ["macros"] }
console_error_panic_hook = "0.1"
cfg-if = "1"
http = { version = "0.2", optional = true }
leptos = { path = "../../leptos" }
leptos_meta = { path = "../../meta" }
leptos_actix = { path = "../../integrations/actix", optional = true }
@@ -20,8 +19,8 @@ wasm-bindgen = "0.2"
serde = { version = "1", features = ["derive"] }
[features]
csr = ["leptos/csr", "leptos_meta/csr", "leptos_router/csr"]
hydrate = ["leptos/hydrate", "leptos_meta/hydrate", "leptos_router/hydrate"]
csr = ["leptos/csr"]
hydrate = ["leptos/hydrate"]
ssr = [
"dep:actix-files",
"dep:actix-web",

View File

@@ -1,27 +1,18 @@
use leptos::*;
use leptos_meta::*;
use leptos_router::*;
use leptos::{logging, prelude::*};
use leptos_router::{
components::{FlatRoutes, Route, Router},
StaticSegment,
};
#[component]
pub fn App() -> impl IntoView {
// Provides context that manages stylesheets, titles, meta tags, etc.
provide_meta_context();
view! {
// injects a stylesheet into the document <head>
// id=leptos means cargo-leptos will hot-reload this stylesheet
<Stylesheet id="leptos" href="/pkg/leptos_start.css"/>
// sets the document title
<Title text="Welcome to Leptos"/>
// content for this welcome page
<Router>
<main id="app">
<Routes>
<Route path="" view=HomePage/>
<Route path="/*any" view=NotFound/>
</Routes>
<FlatRoutes fallback=NotFound>
<Route path=StaticSegment("") view=HomePage/>
</FlatRoutes>
</main>
</Router>
}
@@ -43,7 +34,7 @@ async fn do_something(
/// Renders the home page of your application.
#[component]
fn HomePage() -> impl IntoView {
let do_something_action = Action::<DoSomething, _>::server();
let do_something_action = ServerAction::<DoSomething>::new();
let value = Signal::derive(move || {
do_something_action
.value()
@@ -57,17 +48,12 @@ fn HomePage() -> impl IntoView {
view! {
<h1>"Test the action form!"</h1>
<ErrorBoundary fallback=move |error| format!("{:#?}", error
.get()
.into_iter()
.next()
.unwrap()
.1.into_inner()
.to_string())
>
{value}
<ActionForm action=do_something_action class="form">
<label>Should error: <input type="checkbox" name="should_error"/></label>
<ErrorBoundary fallback=move |error| {
move || format!("{:#?}", error.get())
}>
<pre>{value}</pre>
<ActionForm action=do_something_action attr:class="form">
<label>"Should error: "<input type="checkbox" name="should_error"/></label>
<button type="submit">Submit</button>
</ActionForm>
</ErrorBoundary>
@@ -91,7 +77,5 @@ fn NotFound() -> impl IntoView {
resp.set_status(actix_web::http::StatusCode::NOT_FOUND);
}
view! {
<h1>"Not Found"</h1>
}
view! { <h1>"Not Found"</h1> }
}

View File

@@ -1,18 +1,11 @@
pub mod app;
use cfg_if::cfg_if;
cfg_if! {
if #[cfg(feature = "hydrate")] {
#[cfg(feature = "hydrate")]
#[wasm_bindgen::prelude::wasm_bindgen]
pub fn hydrate() {
use app::*;
use wasm_bindgen::prelude::wasm_bindgen;
console_error_panic_hook::set_once();
#[wasm_bindgen]
pub fn hydrate() {
use app::*;
console_error_panic_hook::set_once();
leptos::mount_to_body(App);
}
}
leptos::mount::hydrate_body(App);
}

View File

@@ -4,25 +4,47 @@ async fn main() -> std::io::Result<()> {
use action_form_error_handling::app::*;
use actix_files::Files;
use actix_web::*;
use leptos::*;
use leptos::prelude::*;
use leptos_actix::{generate_route_list, LeptosRoutes};
use leptos_meta::MetaTags;
let conf = get_configuration(None).await.unwrap();
let addr = conf.leptos_options.site_addr;
// Generate the list of routes in your Leptos App
let routes = generate_route_list(App);
let conf = get_configuration(None).unwrap();
let addr = conf.leptos_options.site_addr;
println!("listening on http://{}", &addr);
HttpServer::new(move || {
// Generate the list of routes in your Leptos App
let routes = generate_route_list(App);
let leptos_options = &conf.leptos_options;
let site_root = &leptos_options.site_root;
App::new()
.route("/api/{tail:.*}", leptos_actix::handle_server_fns())
// serve JS/WASM/CSS from `pkg`
.service(Files::new("/pkg", format!("{site_root}/pkg")))
.leptos_routes(leptos_options.to_owned(), routes.to_owned(), App)
.app_data(web::Data::new(leptos_options.to_owned()))
.leptos_routes(routes, {
let leptos_options = leptos_options.clone();
move || {
use leptos::prelude::*;
view! {
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta
name="viewport"
content="width=device-width, initial-scale=1"
/>
<AutoReload options=leptos_options.clone()/>
<HydrationScripts options=leptos_options.clone()/>
<MetaTags/>
</head>
<body>
<App/>
</body>
</html>
}
}})
//.wrap(middleware::Compress::default())
})
.bind(&addr)?
@@ -44,10 +66,9 @@ pub fn main() {
// prefer using `cargo leptos serve` instead
// to run: `trunk serve --open --features csr`
use action_form_error_handling::app::*;
use leptos::*;
use wasm_bindgen::prelude::wasm_bindgen;
use leptos::prelude::*;
console_error_panic_hook::set_once();
leptos::mount_to_body(App);
mount_to_body(App);
}

View File

@@ -1,14 +0,0 @@
# Animated Show Example
This is a very simple example of the `<AnimatedShow>` component.
The `<AnimatedShow>` component is an extension for the `<Show>` component and it will not take in a fallback, but it will unmount the component from the DOM after a given duration. This makes it possible to have really easy unmount animations with just
CSS.
## Getting Started
See the [Examples README](../README.md) for setup and run instructions.
## Quick Start
Run `trunk serve --open` to run this example.

View File

@@ -1,42 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<link data-trunk rel="rust" data-wasm-opt="z"/>
<link data-trunk rel="icon" type="image/ico" href="/public/favicon.ico"/>
<style>
.hover-me {
width: 100px;
margin: 1rem;
padding: 1rem;
text-align: center;
cursor: pointer;
border: 1px solid grey;
}
.here-i-am {
width: 100px;
margin: 1rem;
padding: 1rem;
text-align: center;
color: white;
font-weight: bold;
background: black;
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes fade-out {
from { opacity: 1; }
to { opacity: 0; }
}
.fade-in-1000 {
animation: 1000ms fade-in forwards;
}
.fade-out-1000 {
animation: 1000ms fade-out forwards;
}
</style>
</head>
<body></body>
</html>

View File

@@ -1,34 +0,0 @@
use core::time::Duration;
use leptos::*;
#[component]
pub fn App() -> impl IntoView {
let show = create_rw_signal(false);
// the CSS classes in this example are just written directly inside the `index.html`
view! {
<div
class="hover-me"
on:mouseenter=move |_| show.set(true)
on:mouseleave=move |_| show.set(false)
>
"Hover Me"
</div>
<AnimatedShow
when=show
// optional CSS class which will be applied if `when == true`
show_class="fade-in-1000"
// optional CSS class which will be applied if `when == false` and before the
// `hide_delay` starts -> makes CSS unmount animations really easy
hide_class="fade-out-1000"
// the given unmount delay which should match your unmount animation duration
hide_delay=Duration::from_millis(1000)
>
// provide any `Children` inside here
<div class="here-i-am">
"Here I Am!"
</div>
</AnimatedShow>
}
}

View File

@@ -1,8 +0,0 @@
use animated_show::App;
use leptos::*;
pub fn main() {
_ = console_log::init_with_level(log::Level::Debug);
console_error_panic_hook::set_once();
mount_to_body(App);
}

Some files were not shown because too many files have changed in this diff Show More