1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// canonrs_helpers — central reference
//
// Todos os helpers disponiveis no CanonRS
// Fonte: canonrs-server/src/interactions/ + canonrs-client/src/hooks/
// ── IMPORTS ─────────────────────────────────────────────────────────────────
use dialog_close; // fecha Dialog pelo uid
use confirm_dialog_close; // fecha ConfirmDialog pelo uid
use input_reset; // reseta Input pelo name
use use_action_result; // reage a Action com trigger
use use_select; // bridge Select DOM -> RwSignal (so hydrate)
use slot; // ChildrenFn sem boilerplate
// ── dialog_close ─────────────────────────────────────────────────────────────
//
// Fecha um Dialog pelo uid apos acao async concluir.
// SSR-safe: no-op no servidor.
//
// canonrs::dialog_close("dialog-new-project");
// ── confirm_dialog_close ──────────────────────────────────────────────────────
//
// Fecha um ConfirmDialog pelo uid.
// SSR-safe: no-op no servidor.
//
// canonrs::confirm_dialog_close("confirm-delete-project");
// ── input_reset ───────────────────────────────────────────────────────────────
//
// Reseta um Input pelo name apos submit.
// SSR-safe: no-op no servidor.
//
// canonrs::input_reset("project-name");
// ── use_action_result ─────────────────────────────────────────────────────────
//
// Reage ao resultado de uma Action com trigger explicito.
// Retorna RwSignal<u32> que deve ser incrementado no on:click.
//
// let trigger = canonrs::use_action_result(create, move |result| match result {
// Ok(p) => { canonrs::dialog_close("dialog-new-project"); }
// Err(e) => { error.set(Some(e.to_string())); }
// });
//
// on:click=move |_| {
// trigger.update(|v| *v += 1);
// create.dispatch(());
// }
// ── use_select ────────────────────────────────────────────────────────────────
//
// Bridge entre Select DOM-driven e RwSignal<String>.
// Disponivel APENAS em hydrate (wasm32).
//
// let selected = RwSignal::new(String::new());
// let node_ref = canonrs::hooks::use_select(selected);
// <Select node_ref=node_ref> ... </Select>
// ── slot! ─────────────────────────────────────────────────────────────────────
//
// Converte closure em ChildrenFn (Arc<dyn Fn() -> AnyView>).
// Elimina Arc::new boilerplate em slots de Block e Layout.
//
// slot!(|| view! { <Foo /> }.into_any()) -- estatico
// slot!(move || view! { <Foo val=val /> }.into_any()) -- captura escopo
//
// slot! pode ser aninhado dentro de outro slot!.
// Sempre termina com .into_any() dentro do view!.