euv-example 0.26.7

An example application demonstrating the euv UI framework with reactive signals, custom components, and WebAssembly.
Documentation
use super::*;

/// A browser API demo page showcasing localStorage, sessionStorage, clipboard, window, navigator, and location.
///
/// # Returns
///
/// - `VirtualNode` - The browser API demo page virtual DOM tree.
#[component]
pub(crate) fn page_browser(node: VirtualNode<PageBrowserProps>) -> VirtualNode {
    let PageBrowserProps: PageBrowserProps = node.try_get_props().unwrap_or_default();
    let state: UseEuvBrowser = UseEuvBrowser::use_browser_state();
    html! {
        div {
            class: c_page_container()
            euv_header {
                icon: "🌐"
                title: "Browser APIs"
                subtitle: "Interact with browser storage, clipboard, window metrics, navigator info, location URL, and developer console — all through euv's typed hook APIs."
            }
            euv_card {
                title: "localStorage"
                p {
                    class: c_demo_text()
                    "Store, retrieve, and remove persistent key-value data. Data in localStorage survives page reloads and browser restarts."
                }
                div {
                    class: c_browser_api_row()
                    euv_field {
                        id: LOCAL_STORAGE_KEY_ID
                        name: LOCAL_STORAGE_KEY_NAME
                        label: "Key"
                        input_type: BROWSER_TEXT_TYPE
                        placeholder: LOCAL_STORAGE_KEY_PLACEHOLDER
                        autocomplete: BROWSER_AUTOCOMPLETE_OFF
                        value: state.get_local_key()
                        error: None
                    }
                    euv_field {
                        id: LOCAL_STORAGE_VALUE_ID
                        name: LOCAL_STORAGE_VALUE_NAME
                        label: "Value"
                        input_type: BROWSER_TEXT_TYPE
                        placeholder: LOCAL_STORAGE_VALUE_PLACEHOLDER
                        autocomplete: BROWSER_AUTOCOMPLETE_OFF
                        value: state.get_local_value()
                        error: None
                    }
                }
                div {
                    class: c_browser_api_actions()
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Set"
                        onclick: state.on_local_storage_set()
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Get"
                        onclick: state.on_local_storage_get()
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Remove"
                        onclick: state.on_local_storage_remove()
                    }
                }
                div {
                    class: c_browser_result_box()
                    span {
                        class: c_browser_result_label()
                        "Result: "
                    }
                    span {
                        class: c_browser_result_value()
                        state.get_local_result()
                    }
                }
            }
            euv_card {
                title: "sessionStorage"
                p {
                    class: c_demo_text()
                    "Store key-value data for the duration of the page session. Data is cleared when the tab or window is closed."
                }
                div {
                    class: c_browser_api_row()
                    euv_field {
                        id: SESSION_STORAGE_KEY_ID
                        name: SESSION_STORAGE_KEY_NAME
                        label: "Key"
                        input_type: BROWSER_TEXT_TYPE
                        placeholder: SESSION_STORAGE_KEY_PLACEHOLDER
                        autocomplete: BROWSER_AUTOCOMPLETE_OFF
                        value: state.get_session_key()
                        error: None
                    }
                    euv_field {
                        id: SESSION_STORAGE_VALUE_ID
                        name: SESSION_STORAGE_VALUE_NAME
                        label: "Value"
                        input_type: BROWSER_TEXT_TYPE
                        placeholder: SESSION_STORAGE_VALUE_PLACEHOLDER
                        autocomplete: BROWSER_AUTOCOMPLETE_OFF
                        value: state.get_session_value()
                        error: None
                    }
                }
                div {
                    class: c_browser_api_actions()
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Set"
                        onclick: state.on_session_storage_set()
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Get"
                        onclick: state.on_session_storage_get()
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Remove"
                        onclick: state.on_session_storage_remove()
                    }
                }
                div {
                    class: c_browser_result_box()
                    span {
                        class: c_browser_result_label()
                        "Result: "
                    }
                    span {
                        class: c_browser_result_value()
                        state.get_session_result()
                    }
                }
            }
            euv_card {
                title: "Clipboard API"
                p {
                    class: c_demo_text()
                    "Write text to the system clipboard or read the current clipboard contents. Requires a secure context (HTTPS or localhost)."
                }
                euv_field {
                    id: CLIPBOARD_TEXT_ID
                    name: CLIPBOARD_TEXT_NAME
                    label: "Text to copy"
                    input_type: BROWSER_TEXT_TYPE
                    placeholder: CLIPBOARD_TEXT_PLACEHOLDER
                    autocomplete: BROWSER_AUTOCOMPLETE_OFF
                    value: state.get_clipboard_text()
                    error: None
                }
                div {
                    class: c_browser_api_actions()
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Copy"
                        onclick: state.on_clipboard_copy()
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Paste"
                        onclick: state.on_clipboard_paste()
                    }
                }
                div {
                    class: c_browser_result_box()
                    span {
                        class: c_browser_result_label()
                        "Result: "
                    }
                    span {
                        class: c_browser_result_value()
                        state.get_clipboard_result()
                    }
                }
            }
            euv_card {
                title: "Window"
                p {
                    class: c_demo_text()
                    "Read the browser window's inner width and height in CSS pixels. Click Refresh Size after resizing the window."
                }
                div {
                    class: c_button_controls()
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Refresh Size"
                        onclick: state.on_window_refresh_size()
                    }
                }
                div {
                    class: c_browser_info_grid()
                    div {
                        class: c_browser_info_item()
                        span {
                            class: c_browser_info_label()
                            "Inner Size"
                        }
                        span {
                            class: c_browser_info_value()
                            state.get_window_size()
                        }
                    }
                }
            }
            euv_card {
                title: "Navigator"
                p {
                    class: c_demo_text()
                    "Read the browser's User-Agent string and preferred language. Useful for analytics, feature detection, and localization."
                }
                div {
                    class: c_browser_info_grid()
                    div {
                        class: c_browser_info_item()
                        span {
                            class: c_browser_info_label()
                            "User Agent"
                        }
                        span {
                            class: c_browser_info_value()
                            state.get_user_agent()
                        }
                    }
                    div {
                        class: c_browser_info_item()
                        span {
                            class: c_browser_info_label()
                            "Language"
                        }
                        span {
                            class: c_browser_info_value()
                            state.get_language()
                        }
                    }
                }
            }
            euv_card {
                title: "Location"
                p {
                    class: c_demo_text()
                    "Read the current page's full URL components: href, origin, and pathname. All values are read-only and update automatically on navigation."
                }
                div {
                    class: c_browser_info_grid()
                    div {
                        class: c_browser_info_item()
                        span {
                            class: c_browser_info_label()
                            "Href"
                        }
                        span {
                            class: c_browser_info_value()
                            state.get_location_url()
                        }
                    }
                    div {
                        class: c_browser_info_item()
                        span {
                            class: c_browser_info_label()
                            "Origin"
                        }
                        span {
                            class: c_browser_info_value()
                            state.get_location_origin_val()
                        }
                    }
                    div {
                        class: c_browser_info_item()
                        span {
                            class: c_browser_info_label()
                            "Pathname"
                        }
                        span {
                            class: c_browser_info_value()
                            state.get_location_pathname_val()
                        }
                    }
                }
            }
            euv_card {
                title: "Console"
                p {
                    class: c_demo_text()
                    "Send log, warning, and error messages to the browser developer console. Open DevTools (F12) to see the output."
                }
                euv_field {
                    id: CONSOLE_MESSAGE_ID
                    name: CONSOLE_MESSAGE_NAME
                    label: "Console message"
                    input_type: BROWSER_TEXT_TYPE
                    placeholder: CONSOLE_MESSAGE_PLACEHOLDER
                    autocomplete: BROWSER_AUTOCOMPLETE_OFF
                    value: state.get_console_input()
                    error: None
                }
                div {
                    class: c_browser_api_actions()
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Log"
                        onclick: UseEuvBrowser::on_console_log(state.get_console_input())
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Warn"
                        onclick: UseEuvBrowser::on_console_warn(state.get_console_input())
                    }
                    euv_button {
                        variant: EuvButtonVariant::Primary
                        label: "Error"
                        onclick: UseEuvBrowser::on_console_error(state.get_console_input())
                    }
                }
            }
        }
    }
}