pub mod attributes;
pub mod elements;
#[cfg(feature = "mathml")]
pub mod mathml;
pub mod svg;
pub use attributes::*;
macro_rules! define_validation_elements {
(
kind = $kind:path,
globals = $globals:path,
{
$(
$(#[$meta:meta])*
$name:ident $(
{
$(
$(#[$attr_meta:meta])*
$attr:ident
)*
}
)?
)*
}
) => {
$(
$(#[$meta])*
#[expect(
non_camel_case_types,
reason = "camel case types will be interpreted as components"
)]
#[derive(::core::fmt::Debug, ::core::clone::Clone, ::core::marker::Copy)]
pub struct $name;
$(
#[allow(non_upper_case_globals)]
impl $name {
$(
$(#[$attr_meta])*
pub const $attr: $crate::validation::Attribute = $crate::validation::Attribute;
)*
}
)?
impl $crate::validation::Element for $name {
type Kind = $kind;
}
impl $globals for $name {}
)*
};
}
use define_validation_elements;
pub trait Element {
type Kind: ElementKind;
}
pub trait ElementKind: sealed::Sealed {}
#[derive(Debug, Clone, Copy)]
pub struct Normal;
impl ElementKind for Normal {}
#[derive(Debug, Clone, Copy)]
pub struct Void;
impl ElementKind for Void {}
#[derive(Debug, Clone, Copy)]
pub struct Xml;
impl ElementKind for Xml {}
mod sealed {
use super::{Normal, Void, Xml};
pub trait Sealed {}
impl Sealed for Normal {}
impl Sealed for Void {}
impl Sealed for Xml {}
}
#[derive(Debug, Clone, Copy)]
pub struct Attribute;
#[macro_export]
macro_rules! define_events {
() => {};
($event:ident $(,)?) => {
#[doc(hidden)]
#[allow(missing_docs, non_upper_case_globals)]
pub const $event: $crate::validation::Attribute = $crate::validation::Attribute;
};
($event:ident, $($rest:tt)*) => {
$crate::define_events! { $event }
$crate::define_events! { $($rest)* }
};
(
$event:ident => $component:ident {
$(
$(#[$field_meta:meta])*
$field:ident : $ty:ty $(= $default:expr)?
),* $(,)?
}
$(, $($rest:tt)*)?
) => {
$crate::define_events! { $event }
#[allow(missing_docs)]
#[derive($crate::macros::Cheers)]
pub struct $component<'target> {
$(
$(#[$field_meta])*
$(#[prop(default($default))])?
pub $field: $ty,
)*
#[prop(default($crate::EventTarget::This))]
pub target: $crate::EventTarget<'target>,
#[prop(default(true))]
pub bubbles: bool,
#[prop(default(false))]
pub cancelable: bool,
#[prop(default(false))]
pub composed: bool,
}
impl<'target> $crate::prelude::Render<$crate::prelude::DatastarSource> for $component<'target> {
fn render_to(&self, buffer: &mut $crate::prelude::Buffer<$crate::prelude::DatastarSource>) {
#[derive($crate::__internal::serde::Serialize)]
struct EventDetail<'detail> {
$(
$field: &'detail $ty,
)*
}
let detail = EventDetail {
$(
$field: &self.$field,
)*
};
$crate::__internal::__render_custom_event_to_js(
buffer,
stringify!($event),
Some(&detail),
&self.target,
self.bubbles,
self.cancelable,
self.composed,
);
}
}
impl<'target> $crate::prelude::Render for $component<'target> {
fn render_to(&self, buffer: &mut $crate::prelude::Buffer<$crate::prelude::Element>) {
$crate::__internal::__render_custom_event_component(self, buffer);
}
}
$(
$crate::define_events! { $($rest)* }
)?
};
($event:ident => $component:ident $(, $($rest:tt)*)?) => {
$crate::define_events! { $event }
#[allow(missing_docs)]
#[derive($crate::macros::Cheers)]
pub struct $component<'target> {
#[prop(default($crate::EventTarget::This))]
pub target: $crate::EventTarget<'target>,
#[prop(default(true))]
pub bubbles: bool,
#[prop(default(false))]
pub cancelable: bool,
#[prop(default(false))]
pub composed: bool,
}
impl<'target> $crate::prelude::Render<$crate::prelude::DatastarSource> for $component<'target> {
fn render_to(&self, buffer: &mut $crate::prelude::Buffer<$crate::prelude::DatastarSource>) {
$crate::__internal::__render_custom_event_to_js::<()>(
buffer,
stringify!($event),
None,
&self.target,
self.bubbles,
self.cancelable,
self.composed,
);
}
}
impl<'target> $crate::prelude::Render for $component<'target> {
fn render_to(&self, buffer: &mut $crate::prelude::Buffer<$crate::prelude::Element>) {
$crate::__internal::__render_custom_event_component(self, buffer);
}
}
$(
$crate::define_events! { $($rest)* }
)?
};
}