canonrs-core 0.1.0

CanonRS core types, traits and primitives
//! @canon-level: strict
//! @canon-owner: primitives-team
//! InputOtp Primitive - HTML puro + ARIA

use leptos::prelude::*;
use crate::meta::DisabledState;

#[component]
pub fn InputOtpPrimitive(
    #[prop(into, default = String::new())] class: String,
    #[prop(into, default = String::new())] name: String,
    #[prop(into, default = String::new())] value: String,
    #[prop(default = DisabledState::Enabled)] disabled: DisabledState,
    #[prop(default = 1u32)] maxlength: u32,
    #[prop(into, default = String::new())] pattern: String,
    #[prop(into, default = String::new())] inputmode: String,
    #[prop(into, default = String::new())] autocomplete: String,
) -> impl IntoView {
    let uid_otp = crate::infra::uid::generate("otp");
    view! {
        <input
            data-rs-input-otp=""
            data-rs-uid=uid_otp
            data-rs-interaction="init"
            data-rs-disabled=if disabled.disabled() { Some("disabled") } else { None }
            type="text"
            name={if name.is_empty() { None } else { Some(name) }}
            value=value
            disabled=disabled.disabled()
            maxlength=maxlength.to_string()
            pattern={if pattern.is_empty() { None } else { Some(pattern) }}
            inputmode={if inputmode.is_empty() { None } else { Some(inputmode) }}
            autocomplete={if autocomplete.is_empty() { None } else { Some(autocomplete) }}
            aria-disabled=disabled.aria_disabled()
            class=class
        />
    }
}

#[component]
pub fn InputOtpContainerPrimitive(
    children: Children,
    #[prop(into, default = String::new())] class: String,
    #[prop(optional)] disabled: Option<bool>,
) -> impl IntoView {
    view! {
        <div
            data-rs-input-otp-container=""
            data-rs-disabled=disabled.filter(|&d| d).map(|_| "disabled")
            class=class
        >
            {children()}
        </div>
    }
}

#[component]
pub fn InputOtpSlotsPrimitive(
    children: Children,
) -> impl IntoView {
    view! { <div data-rs-input-otp-slots="">{children()}</div> }
}