Explorar el Código

improve and unify element macro

= hace 2 años
padre
commit
c961bf0779
Se han modificado 1 ficheros con 540 adiciones y 508 borrados
  1. 540 508
      packages/html/src/elements.rs

+ 540 - 508
packages/html/src/elements.rs

@@ -4,58 +4,124 @@ use crate::{GlobalAttributes, SvgAttributes};
 
 pub type AttributeDiscription = (&'static str, Option<&'static str>, bool);
 
-macro_rules! builder_constructors {
+macro_rules! impl_attribute {
     (
-        $(
-            $(#[$attr:meta])*
-            $name:ident {
-                $(
-                    $(#[$attr_method:meta])*
-                    $fil:ident: $vil:ident,
-                )*
-            };
-         )*
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident (DEFAULT),
     ) => {
-        $(
-            #[allow(non_camel_case_types)]
-            $(#[$attr])*
-            pub struct $name;
+        pub const $fil: AttributeDiscription = (stringify!($fil), None, false);
+    };
 
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident ($name:literal),
+    ) => {
+        pub const $fil: AttributeDiscription = ($name, None, false);
+    };
 
-            impl $name {
-                pub const TAG_NAME: &'static str = stringify!($name);
-                pub const NAME_SPACE: Option<&'static str> = None;
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident (volatile),
+    ) => {
+        pub const $fil: AttributeDiscription = (stringify!($fil), None, true);
+    };
 
-                $(
-                    pub const $fil: AttributeDiscription = (stringify!($fil), None, false);
-                )*
-            }
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident (in $ns:ident),
+    ) => {
+        pub const $fil: AttributeDiscription = (stringify!($fil), Some(stringify!($ns)), false)
+    };
 
-            impl GlobalAttributes for $name {}
-        )*
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident (in $ns:ident : volatile),
+    ) => {
+        pub const $fil: AttributeDiscription = (stringify!($fil), Some(stringify!($ns)), true)
     };
+}
 
-    ( $(
+macro_rules! impl_element {
+    (
         $(#[$attr:meta])*
-        $name:ident <> $namespace:tt {
-            $($fil:ident: $vil:ident,)*
-        };
-    )* ) => {
-        $(
-            #[allow(non_camel_case_types)]
-            $(#[$attr])*
-            pub struct $name;
+        $name:ident None {
+            $(
+                $(#[$attr_method:meta])*
+                $fil:ident: $vil:ident $extra:tt,
+            )*
+        }
+    ) => {
+        #[allow(non_camel_case_types)]
+        $(#[$attr])*
+        pub struct $name;
+
 
-            impl SvgAttributes for $name {}
+        impl $name {
+            pub const TAG_NAME: &'static str = stringify!($name);
+            pub const NAME_SPACE: Option<&'static str> = None;
 
-            impl $name {
-                pub const TAG_NAME: &'static str = stringify!($name);
-                pub const NAME_SPACE: Option<&'static str> = Some($namespace);
+            $(
+                impl_attribute!(
+                    $(#[$attr_method])*
+                    $fil: $vil ($extra),
+                );
+            )*
+        }
+
+        impl GlobalAttributes for $name {}
+    };
 
+    (
+        $(#[$attr:meta])*
+        $name:ident $namespace:tt {
+            $(
+                $(#[$attr_method:meta])*
+                $fil:ident: $vil:ident $extra:tt,
+            )*
+        }
+    ) => {
+        #[allow(non_camel_case_types)]
+        $(#[$attr])*
+        pub struct $name;
+
+        impl SvgAttributes for $name {}
+
+        impl $name {
+            pub const TAG_NAME: &'static str = stringify!($name);
+            pub const NAME_SPACE: Option<&'static str> = Some($namespace);
+
+            $(
+                impl_attribute!(
+                    $(#[$attr_method])*
+                    $fil: $vil in $namespace $extra
+                );
+            )*
+        }
+    }
+}
+
+macro_rules! builder_constructors {
+    (
+        $(
+            $(#[$attr:meta])*
+            $name:ident $namespace:tt {
                 $(
-                    pub const $fil: AttributeDiscription = (stringify!($fil), Some(stringify!($namespace)), false)
+                    $(#[$attr_method:meta])*
+                    $fil:ident: $vil:ident $extra:tt,
                 )*
-            }
+            };
+         )*
+    ) => {
+        $(
+            impl_element!(
+                $(#[$attr])*
+                $name $namespace {
+                    $(
+                        $(#[$attr_method])*
+                        $fil: $vil $extra,
+                    )*
+                }
+            );
         )*
     };
 }
@@ -75,63 +141,63 @@ builder_constructors! {
     /// [`<base>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base)
     /// element.
     ///
-    base {
-        href: Uri,
-        target: Target,
+    base None {
+        href: Uri DEFAULT,
+        target: Target DEFAULT,
     };
 
     /// Build a
     /// [`<head>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head)
     /// element.
-    head {};
+    head None {};
 
     /// Build a
     /// [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link)
     /// element.
-    link {
+    link None {
         // as: Mime,
-        crossorigin: CrossOrigin,
-        href: Uri,
-        hreflang: LanguageTag,
-        media: String, // FIXME media query
-        rel: LinkType,
-        sizes: String, // FIXME
-        title: String, // FIXME
-        r#type: Mime,
-        integrity: String,
+        crossorigin: CrossOrigin DEFAULT,
+        href: Uri DEFAULT,
+        hreflang: LanguageTag DEFAULT,
+        media: String DEFAULT, // FIXME media query
+        rel: LinkType DEFAULT,
+        sizes: String DEFAULT, // FIXME
+        title: String DEFAULT, // FIXME
+        r#type: Mime DEFAULT,
+        integrity: String DEFAULT,
     };
 
     /// Build a
     /// [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta)
     /// element.
-    meta {
-        charset: String, // FIXME IANA standard names
-        content: String,
-        http_equiv: HTTPEquiv,
-        name: Metadata,
+    meta None {
+        charset: String DEFAULT, // FIXME IANA standard names
+        content: String DEFAULT,
+        http_equiv: HTTPEquiv DEFAULT,
+        name: Metadata DEFAULT,
     };
 
     /// Build a
     /// [`<style>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style)
     /// element.
-    style {
-        r#type: Mime,
-        media: String, // FIXME media query
-        nonce: Nonce,
-        title: String, // FIXME
+    style None {
+        r#type: Mime DEFAULT,
+        media: String DEFAULT, // FIXME media query
+        nonce: Nonce DEFAULT,
+        title: String DEFAULT, // FIXME
     };
 
     /// Build a
     /// [`<title>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title)
     /// element.
-    title { };
+    title None { };
 
     // Sectioning root
 
     /// Build a
     /// [`<body>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body)
     /// element.
-    body {};
+    body None {};
 
     // ------------------
     // Content sectioning
@@ -140,27 +206,27 @@ builder_constructors! {
     /// Build a
     /// [`<address>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address)
     /// element.
-    address {};
+    address None {};
 
     /// Build a
     /// [`<article>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article)
     /// element.
-    article {};
+    article None {};
 
     /// Build a
     /// [`<aside>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside)
     /// element.
-    aside {};
+    aside None {};
 
     /// Build a
     /// [`<footer>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer)
     /// element.
-    footer {};
+    footer None {};
 
     /// Build a
     /// [`<header>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header)
     /// element.
-    header {};
+    header None {};
 
     /// Build a
     /// [`<h1>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h1)
@@ -180,7 +246,7 @@ builder_constructors! {
     /// rsx!(h1 { "A header element" })
     /// LazyNodes::new(|f| f.el(h1).children([f.text("A header element")]).finish())
     /// ```
-    h1 {};
+    h1 None {};
 
     /// Build a
     /// [`<h2>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h2)
@@ -199,7 +265,7 @@ builder_constructors! {
     /// rsx!(h2 { "A header element" })
     /// LazyNodes::new(|f| f.el(h2).children([f.text("A header element")]).finish())
     /// ```
-    h2 {};
+    h2 None {};
 
     /// Build a
     /// [`<h3>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h3)
@@ -211,50 +277,50 @@ builder_constructors! {
     /// - The most important heading is <h1> and the least important heading is <h6>.
     /// - The <h1> heading is the first heading in the document.
     /// - The <h1> heading is usually a large bolded font.
-    h3 {};
+    h3 None {};
 
     /// Build a
     /// [`<h4>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h4)
     /// element.
-    h4 {};
+    h4 None {};
 
     /// Build a
     /// [`<h5>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h5)
     /// element.
-    h5 {};
+    h5 None {};
 
     /// Build a
     /// [`<h6>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h6)
     /// element.
-    h6 {};
+    h6 None {};
 
     /// Build a
     /// [`<main>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main)
     /// element.
-    main {};
+    main None {};
 
     /// Build a
     /// [`<nav>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav)
     /// element.
-    nav {};
+    nav None {};
 
     /// Build a
     /// [`<section>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section)
     /// element.
-    section {};
+    section None {};
 
     // Text content
 
     /// Build a
     /// [`<blockquote>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote)
     /// element.
-    blockquote {
-        cite: Uri,
+    blockquote None {
+        cite: Uri DEFAULT,
     };
     /// Build a
     /// [`<dd>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd)
     /// element.
-    dd {};
+    dd None {};
 
     /// Build a
     /// [`<div>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div)
@@ -280,63 +346,63 @@ builder_constructors! {
     /// ## References:
     /// - <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div>
     /// - <https://www.w3schools.com/tags/tag_div.asp>
-    div {};
+    div None {};
 
     /// Build a
     /// [`<dl>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl)
     /// element.
-    dl {};
+    dl None {};
 
     /// Build a
     /// [`<dt>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt)
     /// element.
-    dt {};
+    dt None {};
 
     /// Build a
     /// [`<figcaption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption)
     /// element.
-    figcaption {};
+    figcaption None {};
 
     /// Build a
     /// [`<figure>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure)
     /// element.
-    figure {};
+    figure None {};
 
     /// Build a
     /// [`<hr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr)
     /// element.
-    hr {};
+    hr None {};
 
     /// Build a
     /// [`<li>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li)
     /// element.
-    li {
-        value: isize,
+    li None {
+        value: isize DEFAULT,
     };
 
     /// Build a
     /// [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol)
     /// element.
-    ol {
-        reversed: Bool,
-        start: isize,
-        r#type: OrderedListType,
+    ol None {
+        reversed: Bool DEFAULT,
+        start: isize DEFAULT,
+        r#type: OrderedListType DEFAULT,
     };
 
     /// Build a
     /// [`<p>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p)
     /// element.
-    p {};
+    p None {};
 
     /// Build a
     /// [`<pre>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre)
     /// element.
-    pre {};
+    pre None {};
 
     /// Build a
     /// [`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul)
     /// element.
-    ul {};
+    ul None {};
 
 
     // Inline text semantics
@@ -344,173 +410,173 @@ builder_constructors! {
     /// Build a
     /// [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a)
     /// element.
-    a {
-        download: String,
-        href: Uri,
-        hreflang: LanguageTag,
-        target: Target,
-        r#type: Mime,
+    a None {
+        download: String DEFAULT,
+        href: Uri DEFAULT,
+        hreflang: LanguageTag DEFAULT,
+        target: Target DEFAULT,
+        r#type: Mime DEFAULT,
         // ping: SpacedList<Uri>,
         // rel: SpacedList<LinkType>,
-        ping: SpacedList,
-        rel: SpacedList,
+        ping: SpacedList DEFAULT,
+        rel: SpacedList DEFAULT,
     };
 
     /// Build a
     /// [`<abbr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr)
     /// element.
-    abbr {};
+    abbr None {};
 
     /// Build a
     /// [`<b>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b)
     /// element.
-    b {};
+    b None {};
 
     /// Build a
     /// [`<bdi>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdi)
     /// element.
-    bdi {};
+    bdi None {};
 
     /// Build a
     /// [`<bdo>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo)
     /// element.
-    bdo {};
+    bdo None {};
 
     /// Build a
     /// [`<br>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br)
     /// element.
-    br {};
+    br None {};
 
     /// Build a
     /// [`<cite>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite)
     /// element.
-    cite {};
+    cite None {};
 
     /// Build a
     /// [`<code>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code)
     /// element.
-    code {
-        language: String,
+    code None {
+        language: String DEFAULT,
     };
 
     /// Build a
     /// [`<data>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data)
     /// element.
-    data {
-        value: String,
+    data None {
+        value: String DEFAULT,
     };
 
     /// Build a
     /// [`<dfn>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn)
     /// element.
-    dfn {};
+    dfn None {};
 
     /// Build a
     /// [`<em>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em)
     /// element.
-    em {};
+    em None {};
 
     /// Build a
     /// [`<i>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i)
     /// element.
-    i {};
+    i None {};
 
     /// Build a
     /// [`<kbd>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd)
     /// element.
-    kbd {};
+    kbd None {};
 
     /// Build a
     /// [`<mark>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark)
     /// element.
-    mark {};
+    mark None {};
 
     /// Build a
     /// [`<menu>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu)
     /// element.
-    menu {};
+    menu None {};
 
     /// Build a
     /// [`<q>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q)
     /// element.
-    q {
-        cite: Uri,
+    q None {
+        cite: Uri DEFAULT,
     };
 
 
     /// Build a
     /// [`<rp>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rp)
     /// element.
-    rp {};
+    rp None {};
 
 
     /// Build a
     /// [`<rt>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt)
     /// element.
-    rt {};
+    rt None {};
 
 
     /// Build a
     /// [`<ruby>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby)
     /// element.
-    ruby {};
+    ruby None {};
 
     /// Build a
     /// [`<s>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s)
     /// element.
-    s {};
+    s None {};
 
     /// Build a
     /// [`<samp>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp)
     /// element.
-    samp {};
+    samp None {};
 
     /// Build a
     /// [`<small>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small)
     /// element.
-    small {};
+    small None {};
 
     /// Build a
     /// [`<span>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)
     /// element.
-    span {};
+    span None {};
 
     /// Build a
     /// [`<strong>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong)
     /// element.
-    strong {};
+    strong None {};
 
     /// Build a
     /// [`<sub>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub)
     /// element.
-    sub {};
+    sub None {};
 
     /// Build a
     /// [`<sup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup)
     /// element.
-    sup {};
+    sup None {};
 
     /// Build a
     /// [`<time>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time)
     /// element.
-    time {
-        datetime: Datetime,
+    time None {
+        datetime: Datetime DEFAULT,
     };
 
     /// Build a
     /// [`<u>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u)
     /// element.
-    u {};
+    u None {};
 
     /// Build a
     /// [`<var>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var)
     /// element.
-    var {};
+    var None {};
 
     /// Build a
     /// [`<wbr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr)
     /// element.
-    wbr {};
+    wbr None {};
 
 
     // Image and multimedia
@@ -518,14 +584,14 @@ builder_constructors! {
     /// Build a
     /// [`<area>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area)
     /// element.
-    area {
-        alt: String,
-        coords: String, // TODO could perhaps be validated
-        download: Bool,
-        href: Uri,
-        hreflang: LanguageTag,
-        shape: AreaShape,
-        target: Target,
+    area None {
+        alt: String DEFAULT,
+        coords: String DEFAULT, // TODO could perhaps be validated
+        download: Bool DEFAULT,
+        href: Uri DEFAULT,
+        hreflang: LanguageTag DEFAULT,
+        shape: AreaShape DEFAULT,
+        target: Target DEFAULT,
         // ping: SpacedList<Uri>,
         // rel: SpacedSet<LinkType>,
     };
@@ -533,66 +599,66 @@ builder_constructors! {
     /// Build a
     /// [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio)
     /// element.
-    audio {
-        autoplay: Bool,
-        controls: Bool,
-        crossorigin: CrossOrigin,
-        muted: Bool,
-        preload: Preload,
-        src: Uri,
-        r#loop: Bool,
+    audio None {
+        autoplay: Bool DEFAULT,
+        controls: Bool DEFAULT,
+        crossorigin: CrossOrigin DEFAULT,
+        muted: Bool DEFAULT,
+        preload: Preload DEFAULT,
+        src: Uri DEFAULT,
+        r#loop: Bool DEFAULT,
     };
 
     /// Build a
     /// [`<img>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img)
     /// element.
-    img {
-        alt: String,
-        crossorigin: CrossOrigin,
-        decoding: ImageDecoding,
-        height: usize,
-        ismap: Bool,
-        src: Uri,
-        srcset: String, // FIXME this is much more complicated
-        usemap: String, // FIXME should be a fragment starting with '#'
-        width: usize,
-        referrerpolicy: String,
+    img None {
+        alt: String DEFAULT,
+        crossorigin: CrossOrigin DEFAULT,
+        decoding: ImageDecoding DEFAULT,
+        height: usize DEFAULT,
+        ismap: Bool DEFAULT,
+        src: Uri DEFAULT,
+        srcset: String DEFAULT, // FIXME this is much more complicated
+        usemap: String DEFAULT, // FIXME should be a fragment starting with '#'
+        width: usize DEFAULT,
+        referrerpolicy: String DEFAULT,
         // sizes: SpacedList<String>, // FIXME it's not really just a string
     };
 
     /// Build a
     /// [`<map>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map)
     /// element.
-    map {
-        name: Id,
+    map None {
+        name: Id DEFAULT,
     };
 
     /// Build a
     /// [`<track>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track)
     /// element.
-    track {
-        default: Bool,
-        kind: VideoKind,
-        label: String,
-        src: Uri,
-        srclang: LanguageTag,
+    track None {
+        default: Bool DEFAULT,
+        kind: VideoKind DEFAULT,
+        label: String DEFAULT,
+        src: Uri DEFAULT,
+        srclang: LanguageTag DEFAULT,
     };
 
     /// Build a
     /// [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video)
     /// element.
-    video {
-        autoplay: Bool,
-        controls: Bool,
-        crossorigin: CrossOrigin,
-        height: usize,
-        r#loop: Bool,
-        muted: Bool,
-        preload: Preload,
-        playsinline: Bool,
-        poster: Uri,
-        src: Uri,
-        width: usize,
+    video None {
+        autoplay: Bool DEFAULT,
+        controls: Bool DEFAULT,
+        crossorigin: CrossOrigin DEFAULT,
+        height: usize DEFAULT,
+        r#loop: Bool DEFAULT,
+        muted: Bool DEFAULT,
+        preload: Preload DEFAULT,
+        playsinline: Bool DEFAULT,
+        poster: Uri DEFAULT,
+        src: Uri DEFAULT,
+        width: usize DEFAULT,
     };
 
 
@@ -601,70 +667,70 @@ builder_constructors! {
     /// Build a
     /// [`<embed>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed)
     /// element.
-    embed {
-        height: usize,
-        src: Uri,
-        r#type: Mime,
-        width: usize,
+    embed None {
+        height: usize DEFAULT,
+        src: Uri DEFAULT,
+        r#type: Mime DEFAULT,
+        width: usize DEFAULT,
     };
 
     /// Build a
     /// [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)
     /// element.
-    iframe {
-        allow: FeaturePolicy,
-        allowfullscreen: Bool,
-        allowpaymentrequest: Bool,
-        height: usize,
-        name: Id,
-        referrerpolicy: ReferrerPolicy,
-        src: Uri,
-        srcdoc: Uri,
-        width: usize,
-
-        marginWidth: String,
-        align: String,
-        longdesc: String,
-
-        scrolling: String,
-        marginHeight: String,
-        frameBorder: String,
+    iframe None {
+        allow: FeaturePolicy DEFAULT,
+        allowfullscreen: Bool DEFAULT,
+        allowpaymentrequest: Bool DEFAULT,
+        height: usize DEFAULT,
+        name: Id DEFAULT,
+        referrerpolicy: ReferrerPolicy DEFAULT,
+        src: Uri DEFAULT,
+        srcdoc: Uri DEFAULT,
+        width: usize DEFAULT,
+
+        marginWidth: String DEFAULT,
+        align: String DEFAULT,
+        longdesc: String DEFAULT,
+
+        scrolling: String DEFAULT,
+        marginHeight: String DEFAULT,
+        frameBorder: String DEFAULT,
         // sandbox: SpacedSet<Sandbox>,
     };
 
     /// Build a
     /// [`<object>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object)
     /// element.
-    object {
-        data: Uri,
-        form: Id,
-        height: usize,
-        name: Id,
-        r#type: Mime,
-        typemustmatch: Bool,
-        usemap: String, // TODO should be a fragment starting with '#'
-        width: usize,
+    object None {
+        data: Uri DEFAULT,
+        form: Id DEFAULT,
+        height: usize DEFAULT,
+        name: Id DEFAULT,
+        r#type: Mime DEFAULT,
+        typemustmatch: Bool DEFAULT,
+        usemap: String DEFAULT, // TODO should be a fragment starting with '#'
+        width: usize DEFAULT,
     };
 
     /// Build a
     /// [`<param>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param)
     /// element.
-    param {
-        name: String,
-        value: String,
+    param None {
+        name: String DEFAULT,
+        value: String DEFAULT,
     };
 
     /// Build a
     /// [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture)
     /// element.
-    picture {};
+    picture None {};
 
     /// Build a
     /// [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source)
     /// element.
-    source {
-        src: Uri,
-        r#type: Mime,
+    source None {
+        src: Uri DEFAULT,
+        r#type: Mime DEFAULT,
     };
 
 
@@ -673,15 +739,15 @@ builder_constructors! {
     /// Build a
     /// [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas)
     /// element.
-    canvas {
-        height: usize,
-        width: usize,
+    canvas None {
+        height: usize DEFAULT,
+        width: usize DEFAULT,
     };
 
     /// Build a
     /// [`<noscript>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript)
     /// element.
-    noscript {};
+    noscript None {};
 
     /// Build a
     /// [`<script>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script)
@@ -690,11 +756,11 @@ builder_constructors! {
     /// The [`script`] HTML element is used to embed executable code or data; this is typically used to embed or refer to
     /// JavaScript code. The [`script`] element can also be used with other languages, such as WebGL's GLSL shader
     /// programming language and JSON.
-    script {
+    script None {
         /// Normal script elements pass minimal information to the window.onerror for scripts which do not pass the
         /// standard CORS checks. To allow error logging for sites which use a separate domain for static media, use
         /// this attribute. See CORS settings attributes for a more descriptive explanation of its valid arguments.
-        crossorigin: CrossOrigin,
+        crossorigin: CrossOrigin DEFAULT,
 
         /// This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the
         /// document has been parsed, but before firing DOMContentLoaded.
@@ -715,13 +781,17 @@ builder_constructors! {
         ///
         /// This attribute allows the elimination of parser-blocking JavaScript where the browser would have to load and
         /// evaluate scripts before continuing to parse. async has a similar effect in this case.
-        defer: Bool,
-        integrity: Integrity,
-        nomodule: Bool,
-        nonce: Nonce,
-        src: Uri,
-        text: String,
-
+        defer: Bool DEFAULT,
+        integrity: Integrity DEFAULT,
+        nomodule: Bool DEFAULT,
+        nonce: Nonce DEFAULT,
+        src: Uri DEFAULT,
+        text: String DEFAULT,
+
+        // r#async: Bool,
+        // r#type: String, // TODO could be an enum
+        r#type: String "type",
+        r#script: String "script",
     };
 
 
@@ -730,17 +800,17 @@ builder_constructors! {
     /// Build a
     /// [`<del>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del)
     /// element.
-    del {
-        cite: Uri,
-        datetime: Datetime,
+    del None {
+        cite: Uri DEFAULT,
+        datetime: Datetime DEFAULT,
     };
 
     /// Build a
     /// [`<ins>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins)
     /// element.
-    ins {
-        cite: Uri,
-        datetime: Datetime,
+    ins None {
+        cite: Uri DEFAULT,
+        datetime: Datetime DEFAULT,
     };
 
 
@@ -749,66 +819,66 @@ builder_constructors! {
     /// Build a
     /// [`<caption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption)
     /// element.
-    caption {};
+    caption None {};
 
     /// Build a
     /// [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col)
     /// element.
-    col {
-        span: usize,
+    col None {
+        span: usize DEFAULT,
     };
 
     /// Build a
     /// [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup)
     /// element.
-    colgroup {
-        span: usize,
+    colgroup None {
+        span: usize DEFAULT,
     };
 
     /// Build a
     /// [`<table>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table)
     /// element.
-    table {};
+    table None {};
 
     /// Build a
     /// [`<tbody>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody)
     /// element.
-    tbody {};
+    tbody None {};
 
     /// Build a
     /// [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td)
     /// element.
-    td {
-        colspan: usize,
-        rowspan: usize,
+    td None {
+        colspan: usize DEFAULT,
+        rowspan: usize DEFAULT,
         // headers: SpacedSet<Id>,
     };
 
     /// Build a
     /// [`<tfoot>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot)
     /// element.
-    tfoot {};
+    tfoot None {};
 
     /// Build a
     /// [`<th>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th)
     /// element.
-    th {
-        abbr: String,
-        colspan: usize,
-        rowspan: usize,
-        scope: TableHeaderScope,
+    th None {
+        abbr: String DEFAULT,
+        colspan: usize DEFAULT,
+        rowspan: usize DEFAULT,
+        scope: TableHeaderScope DEFAULT,
         // headers: SpacedSet<Id>,
     };
 
     /// Build a
     /// [`<thead>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead)
     /// element.
-    thead {};
+    thead None {};
 
     /// Build a
     /// [`<tr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr)
     /// element.
-    tr {};
+    tr None {};
 
 
     // Forms
@@ -816,183 +886,212 @@ builder_constructors! {
     /// Build a
     /// [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button)
     /// element.
-    button {
-        autofocus: Bool,
-        disabled: Bool,
-        form: Id,
-        formaction: Uri,
-        formenctype: FormEncodingType,
-        formmethod: FormMethod,
-        formnovalidate: Bool,
-        formtarget: Target,
-        name: Id,
-        value: String,
+    button None {
+        autofocus: Bool DEFAULT,
+        disabled: Bool DEFAULT,
+        form: Id DEFAULT,
+        formaction: Uri DEFAULT,
+        formenctype: FormEncodingType DEFAULT,
+        formmethod: FormMethod DEFAULT,
+        formnovalidate: Bool DEFAULT,
+        formtarget: Target DEFAULT,
+        name: Id DEFAULT,
+        value: String DEFAULT,
+        r#type: String "type",
     };
 
     /// Build a
     /// [`<datalist>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist)
     /// element.
-    datalist {};
+    datalist None {};
 
     /// Build a
     /// [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset)
     /// element.
-    fieldset {};
+    fieldset None {};
 
     /// Build a
     /// [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form)
     /// element.
-    form {
+    form None {
         // accept-charset: SpacedList<CharacterEncoding>,
-        action: Uri,
-        autocomplete: OnOff,
-        enctype: FormEncodingType,
-        method: FormMethod,
-        name: Id,
-        novalidate: Bool,
-        target: Target,
+        action: Uri DEFAULT,
+        autocomplete: OnOff DEFAULT,
+        enctype: FormEncodingType DEFAULT,
+        method: FormMethod DEFAULT,
+        name: Id DEFAULT,
+        novalidate: Bool DEFAULT,
+        target: Target DEFAULT,
     };
 
     /// Build a
     /// [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input)
     /// element.
-    input {
-        accept: String,
-        alt: String,
-        autocomplete: String,
-        autofocus: Bool,
-        capture: String,
-        checked: Bool,
-        disabled: Bool,
-        form: Id,
-        formaction: Uri,
-        formenctype: FormEncodingType,
-        formmethod: FormDialogMethod,
-        formnovalidate: Bool,
-        formtarget: Target,
-        height: isize,
-        list: Id,
-        max: String,
-        maxlength: usize,
-        min: String,
-        minlength: usize,
-        multiple: Bool,
-        name: Id,
-        pattern: String,
-        placeholder: String,
-        readonly: Bool,
-        required: Bool,
-        size: usize,
-        spellcheck: Bool,
-        src: Uri,
-        step: String,
-        tabindex: usize,
-        width: isize,
-
-        // Manual implementations below...
-        // r#type: InputType,
+    input None {
+        accept: String DEFAULT,
+        alt: String DEFAULT,
+        autocomplete: String DEFAULT,
+        autofocus: Bool DEFAULT,
+        capture: String DEFAULT,
+        checked: Bool DEFAULT,
+        disabled: Bool DEFAULT,
+        form: Id DEFAULT,
+        formaction: Uri DEFAULT,
+        formenctype: FormEncodingType DEFAULT,
+        formmethod: FormDialogMethod DEFAULT,
+        formnovalidate: Bool DEFAULT,
+        formtarget: Target DEFAULT,
+        height: isize DEFAULT,
+        list: Id DEFAULT,
+        max: String DEFAULT,
+        maxlength: usize DEFAULT,
+        min: String DEFAULT,
+        minlength: usize DEFAULT,
+        multiple: Bool DEFAULT,
+        name: Id DEFAULT,
+        pattern: String DEFAULT,
+        placeholder: String DEFAULT,
+        readonly: Bool DEFAULT,
+        required: Bool DEFAULT,
+        size: usize DEFAULT,
+        spellcheck: Bool DEFAULT,
+        src: Uri DEFAULT,
+        step: String DEFAULT,
+        tabindex: usize DEFAULT,
+        width: isize DEFAULT,
+
+        /// The type of input
+        ///
+        /// Here are the different input types you can use in HTML:
+        ///
+        /// - `button`
+        /// - `checkbox`
+        /// - `color`
+        /// - `date`
+        /// - `datetime-local`
+        /// - `email`
+        /// - `file`
+        /// - `hidden`
+        /// - `image`
+        /// - `month`
+        /// - `number`
+        /// - `password`
+        /// - `radio`
+        /// - `range`
+        /// - `reset`
+        /// - `search`
+        /// - `submit`
+        /// - `tel`
+        /// - `text`
+        /// - `time`
+        /// - `url`
+        /// - `week`
+
+        r#type: InputType "type",
         // value: String,
+        value: String volatile,
     };
 
     /// Build a
     /// [`<label>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label)
     /// element.
-    label {
-        form: Id,
-        // r#for: Id,
+    label None {
+        form: Id DEFAULT,
+        r#for: Id "for",
     };
 
     /// Build a
     /// [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend)
     /// element.
-    legend {};
+    legend None {};
 
     /// Build a
     /// [`<meter>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter)
     /// element.
-    meter {
-        value: isize,
-        min: isize,
-        max: isize,
-        low: isize,
-        high: isize,
-        optimum: isize,
-        form: Id,
+    meter None {
+        value: isize DEFAULT,
+        min: isize DEFAULT,
+        max: isize DEFAULT,
+        low: isize DEFAULT,
+        high: isize DEFAULT,
+        optimum: isize DEFAULT,
+        form: Id DEFAULT,
     };
 
     /// Build a
     /// [`<optgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup)
     /// element.
-    optgroup {
-        disabled: Bool,
-        label: String,
+    optgroup None {
+        disabled: Bool DEFAULT,
+        label: String DEFAULT,
     };
 
     /// Build a
     /// [`<option>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
     /// element.
-    option {
-        disabled: Bool,
-        label: String,
+    option None {
+        disabled: Bool DEFAULT,
+        label: String DEFAULT,
 
 
-        value: String,
+        value: String DEFAULT,
 
-        // defined below
-        // selected: Bool,
+        selected: Bool volatile,
     };
 
     /// Build a
     /// [`<output>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output)
     /// element.
-    output {
-        form: Id,
-        name: Id,
+    output None {
+        form: Id DEFAULT,
+        name: Id DEFAULT,
         // r#for: SpacedSet<Id>,
     };
 
     /// Build a
     /// [`<progress>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress)
     /// element.
-    progress {
-        max: f64,
-        value: f64,
+    progress None {
+        max: f64 DEFAULT,
+        value: f64 DEFAULT,
     };
 
     /// Build a
     /// [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select)
     /// element.
-    select {
+    select None {
         // defined below
         // value: String,
-        autocomplete: String,
-        autofocus: Bool,
-        disabled: Bool,
-        form: Id,
-        multiple: Bool,
-        name: Id,
-        required: Bool,
-        size: usize,
+        autocomplete: String DEFAULT,
+        autofocus: Bool DEFAULT,
+        disabled: Bool DEFAULT,
+        form: Id DEFAULT,
+        multiple: Bool DEFAULT,
+        name: Id DEFAULT,
+        required: Bool DEFAULT,
+        size: usize DEFAULT,
+        value: String volatile,
     };
 
     /// Build a
     /// [`<textarea>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea)
     /// element.
-    textarea {
-        autocomplete: OnOff,
-        autofocus: Bool,
-        cols: usize,
-        disabled: Bool,
-        form: Id,
-        maxlength: usize,
-        minlength: usize,
-        name: Id,
-        placeholder: String,
-        readonly: Bool,
-        required: Bool,
-        rows: usize,
-        spellcheck: BoolOrDefault,
-        wrap: Wrap,
+    textarea None {
+        autocomplete: OnOff DEFAULT,
+        autofocus: Bool DEFAULT,
+        cols: usize DEFAULT,
+        disabled: Bool DEFAULT,
+        form: Id DEFAULT,
+        maxlength: usize DEFAULT,
+        minlength: usize DEFAULT,
+        name: Id DEFAULT,
+        placeholder: String DEFAULT,
+        readonly: Bool DEFAULT,
+        required: Bool DEFAULT,
+        rows: usize DEFAULT,
+        spellcheck: BoolOrDefault DEFAULT,
+        wrap: Wrap DEFAULT,
+        value: Strign volatile,
     };
 
 
@@ -1001,437 +1100,370 @@ builder_constructors! {
     /// Build a
     /// [`<details>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details)
     /// element.
-    details {
-        open: Bool,
+    details None {
+        open: Bool DEFAULT,
     };
 
     /// Build dialog
     /// [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog)
     /// element.
-    dialog {
-        open: Bool,
+    dialog None {
+        open: Bool DEFAULT,
     };
 
     /// Build a
     /// [`<summary>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary)
     /// element.
-    summary {};
+    summary None {};
 
     // Web components
 
     /// Build a
     /// [`<slot>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot)
     /// element.
-    slot {};
+    slot None {};
 
     /// Build a
     /// [`<template>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)
     /// element.
-    template {};
-}
-
-impl input {
-    /// The type of input
-    ///
-    /// Here are the different input types you can use in HTML:
-    ///
-    /// - `button`
-    /// - `checkbox`
-    /// - `color`
-    /// - `date`
-    /// - `datetime-local`
-    /// - `email`
-    /// - `file`
-    /// - `hidden`
-    /// - `image`
-    /// - `month`
-    /// - `number`
-    /// - `password`
-    /// - `radio`
-    /// - `range`
-    /// - `reset`
-    /// - `search`
-    /// - `submit`
-    /// - `tel`
-    /// - `text`
-    /// - `time`
-    /// - `url`
-    /// - `week`
-
-    pub const r#type: AttributeDiscription = ("type", None, false);
-
-    pub const value: AttributeDiscription = ("value", None, true);
-}
-
-/*
-volatile attributes
-*/
-
-impl script {
-    // r#async: Bool,
-    // r#type: String, // TODO could be an enum
-
-    pub const r#type: AttributeDiscription = ("type", None, false);
-
-    pub const r#script: AttributeDiscription = ("script", None, false);
-}
-
-impl button {
-    pub const r#type: AttributeDiscription = ("type", None, false);
-}
+    template None {};
 
-impl select {
-    pub const value: AttributeDiscription = ("value", None, true);
-}
-
-impl option {
-    pub const selected: AttributeDiscription = ("selected", None, true);
-}
-
-impl textarea {
-    pub const value: AttributeDiscription = ("value", None, true);
-}
-impl label {
-    pub const r#for: AttributeDiscription = ("for", None, false);
-}
-
-builder_constructors! {
     // SVG components
     /// Build a
     /// [`<svg>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg)
     /// element.
-    svg <> "http://www.w3.org/2000/svg" { };
+    svg "http://www.w3.org/2000/svg" { };
 
 
     // /// Build a
     // /// [`<a>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/a)
     // /// element.
-    // a <> "http://www.w3.org/2000/svg" {};
+    // a "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<animate>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/animate)
     /// element.
-    animate <> "http://www.w3.org/2000/svg" {};
+    animate "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<animateMotion>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/animateMotion)
     /// element.
-    animateMotion <> "http://www.w3.org/2000/svg" {};
+    animateMotion "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<animateTransform>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/animateTransform)
     /// element.
-    animateTransform <> "http://www.w3.org/2000/svg" {};
+    animateTransform "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<circle>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle)
     /// element.
-    circle <> "http://www.w3.org/2000/svg" {};
+    circle "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<clipPath>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/clipPath)
     /// element.
-    clipPath <> "http://www.w3.org/2000/svg" {};
+    clipPath "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<defs>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/defs)
     /// element.
-    defs <> "http://www.w3.org/2000/svg" {};
+    defs "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<desc>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/desc)
     /// element.
-    desc <> "http://www.w3.org/2000/svg" {};
+    desc "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<discard>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/discard)
     /// element.
-    discard <> "http://www.w3.org/2000/svg" {};
+    discard "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<ellipse>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse)
     /// element.
-    ellipse <> "http://www.w3.org/2000/svg" {};
+    ellipse "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feBlend>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feBlend)
     /// element.
-    feBlend <> "http://www.w3.org/2000/svg" {};
+    feBlend "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feColorMatrix>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feColorMatrix)
     /// element.
-    feColorMatrix <> "http://www.w3.org/2000/svg" {};
+    feColorMatrix "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feComponentTransfer>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feComponentTransfer)
     /// element.
-    feComponentTransfer <> "http://www.w3.org/2000/svg" {};
+    feComponentTransfer "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feComposite>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feComposite)
     /// element.
-    feComposite <> "http://www.w3.org/2000/svg" {};
+    feComposite "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feConvolveMatrix>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feConvolveMatrix)
     /// element.
-    feConvolveMatrix <> "http://www.w3.org/2000/svg" {};
+    feConvolveMatrix "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feDiffuseLighting>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feDiffuseLighting)
     /// element.
-    feDiffuseLighting <> "http://www.w3.org/2000/svg" {};
+    feDiffuseLighting "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feDisplacementMap>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feDisplacementMap)
     /// element.
-    feDisplacementMap <> "http://www.w3.org/2000/svg" {};
+    feDisplacementMap "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feDistantLight>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feDistantLight)
     /// element.
-    feDistantLight <> "http://www.w3.org/2000/svg" {};
+    feDistantLight "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feDropShadow>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feDropShadow)
     /// element.
-    feDropShadow <> "http://www.w3.org/2000/svg" {};
+    feDropShadow "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feFlood>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feFlood)
     /// element.
-    feFlood <> "http://www.w3.org/2000/svg" {};
+    feFlood "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feFuncA>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feFuncA)
     /// element.
-    feFuncA <> "http://www.w3.org/2000/svg" {};
+    feFuncA "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feFuncB>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feFuncB)
     /// element.
-    feFuncB <> "http://www.w3.org/2000/svg" {};
+    feFuncB "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feFuncG>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feFuncG)
     /// element.
-    feFuncG <> "http://www.w3.org/2000/svg" {};
+    feFuncG "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feFuncR>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feFuncR)
     /// element.
-    feFuncR <> "http://www.w3.org/2000/svg" {};
+    feFuncR "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feGaussianBlur>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feGaussianBlur)
     /// element.
-    feGaussianBlur <> "http://www.w3.org/2000/svg" {};
+    feGaussianBlur "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feImage>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feImage)
     /// element.
-    feImage <> "http://www.w3.org/2000/svg" {};
+    feImage "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feMerge>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feMerge)
     /// element.
-    feMerge <> "http://www.w3.org/2000/svg" {};
+    feMerge "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feMergeNode>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feMergeNode)
     /// element.
-    feMergeNode <> "http://www.w3.org/2000/svg" {};
+    feMergeNode "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feMorphology>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feMorphology)
     /// element.
-    feMorphology <> "http://www.w3.org/2000/svg" {};
+    feMorphology "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feOffset>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feOffset)
     /// element.
-    feOffset <> "http://www.w3.org/2000/svg" {};
+    feOffset "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<fePointLight>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/fePointLight)
     /// element.
-    fePointLight <> "http://www.w3.org/2000/svg" {};
+    fePointLight "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feSpecularLighting>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feSpecularLighting)
     /// element.
-    feSpecularLighting <> "http://www.w3.org/2000/svg" {};
+    feSpecularLighting "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feSpotLight>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feSpotLight)
     /// element.
-    feSpotLight <> "http://www.w3.org/2000/svg" {};
+    feSpotLight "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feTile>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feTile)
     /// element.
-    feTile <> "http://www.w3.org/2000/svg" {};
+    feTile "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<feTurbulence>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feTurbulence)
     /// element.
-    feTurbulence <> "http://www.w3.org/2000/svg" {};
+    feTurbulence "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<filter>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/filter)
     /// element.
-    filter <> "http://www.w3.org/2000/svg" {};
+    filter "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<foreignObject>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject)
     /// element.
-    foreignObject <> "http://www.w3.org/2000/svg" {};
+    foreignObject "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<g>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/g)
     /// element.
-    g <> "http://www.w3.org/2000/svg" {};
+    g "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<hatch>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/hatch)
     /// element.
-    hatch <> "http://www.w3.org/2000/svg" {};
+    hatch "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<hatchpath>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/hatchpath)
     /// element.
-    hatchpath <> "http://www.w3.org/2000/svg" {};
+    hatchpath "http://www.w3.org/2000/svg" {};
 
     // /// Build a
     // /// [`<image>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/image)
     // /// element.
-    // image <> "http://www.w3.org/2000/svg" {};
+    // image "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<line>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line)
     /// element.
-    line <> "http://www.w3.org/2000/svg" {};
+    line "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<linearGradient>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/linearGradient)
     /// element.
-    linearGradient <> "http://www.w3.org/2000/svg" {};
+    linearGradient "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<marker>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/marker)
     /// element.
-    marker <> "http://www.w3.org/2000/svg" {};
+    marker "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<mask>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/mask)
     /// element.
-    mask <> "http://www.w3.org/2000/svg" {};
+    mask "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<metadata>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/metadata)
     /// element.
-    metadata <> "http://www.w3.org/2000/svg" {};
+    metadata "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<mpath>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/mpath)
     /// element.
-    mpath <> "http://www.w3.org/2000/svg" {};
+    mpath "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<path>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path)
     /// element.
-    path <> "http://www.w3.org/2000/svg" {};
+    path "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<pattern>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/pattern)
     /// element.
-    pattern <> "http://www.w3.org/2000/svg" {};
+    pattern "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<polygon>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon)
     /// element.
-    polygon <> "http://www.w3.org/2000/svg" {};
+    polygon "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<polyline>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline)
     /// element.
-    polyline <> "http://www.w3.org/2000/svg" {};
+    polyline "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<radialGradient>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/radialGradient)
     /// element.
-    radialGradient <> "http://www.w3.org/2000/svg" {};
+    radialGradient "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<rect>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect)
     /// element.
-    rect <> "http://www.w3.org/2000/svg" {};
+    rect "http://www.w3.org/2000/svg" {};
 
     // /// Build a
     // /// [`<script>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/script)
     // /// element.
-    // script <> "http://www.w3.org/2000/svg" {};
+    // script "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<set>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/set)
     /// element.
-    set <> "http://www.w3.org/2000/svg" {};
+    set "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<stop>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/stop)
     /// element.
-    stop <> "http://www.w3.org/2000/svg" {};
+    stop "http://www.w3.org/2000/svg" {};
 
     // /// Build a
     // /// [`<style>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/style)
     // /// element.
-    // style <> "http://www.w3.org/2000/svg" {};
+    // style "http://www.w3.org/2000/svg" {};
 
     // /// Build a
     // /// [`<svg>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg)
     // /// element.
-    // svg <> "http://www.w3.org/2000/svg" {};
+    // svg "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<switch>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/switch)
     /// element.
-    switch <> "http://www.w3.org/2000/svg" {};
+    switch "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<symbol>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/symbol)
     /// element.
-    symbol <> "http://www.w3.org/2000/svg" {};
+    symbol "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<text>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/text)
     /// element.
-    text <> "http://www.w3.org/2000/svg" {};
+    text "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<textPath>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath)
     /// element.
-    textPath <> "http://www.w3.org/2000/svg" {};
+    textPath "http://www.w3.org/2000/svg" {};
 
     // /// Build a
     // /// [`<title>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title)
     // /// element.
-    // title <> "http://www.w3.org/2000/svg" {};
+    // title "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<tspan>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/tspan)
     /// element.
-    tspan <> "http://www.w3.org/2000/svg" {};
+    tspan "http://www.w3.org/2000/svg" {};
 
     /// Build a
     /// [`<view>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/view)
     /// element.
-    view <> "http://www.w3.org/2000/svg" {};
+    view "http://www.w3.org/2000/svg" {};
 
     // /// Build a
     // /// [`<use>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use)
     // /// element.
-    // use <> "http://www.w3.org/2000/svg" {};
+    // use "http://www.w3.org/2000/svg" {};
 
 
 }