facet_html/
elements.rs

1//! Typed HTML element definitions.
2//!
3//! This module provides Facet-derived types for all standard HTML5 elements.
4//! Each element type includes its valid attributes and can contain child elements.
5//!
6//! # Organization
7//!
8//! Elements are organized by category:
9//! - **Document**: `Html`, `Head`, `Body`
10//! - **Metadata**: `Title`, `Base`, `Link`, `Meta`, `Style`
11//! - **Sections**: `Header`, `Footer`, `Main`, `Article`, `Section`, `Nav`, `Aside`
12//! - **Headings**: `H1`, `H2`, `H3`, `H4`, `H5`, `H6`
13//! - **Grouping**: `P`, `Div`, `Span`, `Pre`, `Blockquote`, `Ol`, `Ul`, `Li`, etc.
14//! - **Text-level**: `A`, `Em`, `Strong`, `Code`, `Br`, `Wbr`, etc.
15//! - **Embedded**: `Img`, `Iframe`, `Video`, `Audio`, `Source`, `Picture`
16//! - **Tables**: `Table`, `Thead`, `Tbody`, `Tr`, `Th`, `Td`, etc.
17//! - **Forms**: `Form`, `Input`, `Button`, `Select`, `Option`, `Textarea`, `Label`
18//! - **Interactive**: `Details`, `Summary`, `Dialog`
19//! - **Scripting**: `Script`, `Noscript`, `Template`, `Canvas`
20
21use facet::Facet;
22// Note: We use xml::elements here because Rust doesn't allow referencing macro-generated
23// attributes from the same crate (rust-lang/rust#52234). The deserializer's is_elements()
24// helper handles both xml::elements and html::elements equivalently.
25use facet_xml as xml;
26
27// =============================================================================
28// Global Attributes (common to all HTML elements)
29// =============================================================================
30
31/// Global attributes that can appear on any HTML element.
32///
33/// This includes standard HTML global attributes and common event handlers.
34/// Unknown attributes (like data-*, aria-*, and less common event handlers)
35/// are currently ignored during parsing.
36#[derive(Debug, Clone, PartialEq, Default, Facet)]
37#[facet(default)]
38pub struct GlobalAttrs {
39    // Standard global attributes
40    /// Unique identifier for the element.
41    #[facet(xml::attribute, default)]
42    pub id: Option<String>,
43    /// CSS class names.
44    #[facet(xml::attribute, default)]
45    pub class: Option<String>,
46    /// Inline CSS styles.
47    #[facet(xml::attribute, default)]
48    pub style: Option<String>,
49    /// Advisory title/tooltip.
50    /// Note: Named `tooltip` in Rust to avoid collision with `<title>` child element in Head.
51    /// Serializes as the `title` HTML attribute.
52    #[facet(xml::attribute, default, rename = "title")]
53    pub tooltip: Option<String>,
54    /// Language of the element's content.
55    #[facet(xml::attribute, default)]
56    pub lang: Option<String>,
57    /// Text directionality (ltr, rtl, auto).
58    #[facet(xml::attribute, default)]
59    pub dir: Option<String>,
60    /// Whether the element is hidden.
61    #[facet(xml::attribute, default)]
62    pub hidden: Option<String>,
63    /// Tab order of the element.
64    #[facet(xml::attribute, default)]
65    pub tabindex: Option<String>,
66    /// Access key for the element.
67    #[facet(xml::attribute, default)]
68    pub accesskey: Option<String>,
69    /// Whether the element is draggable.
70    #[facet(xml::attribute, default)]
71    pub draggable: Option<String>,
72    /// Whether the element is editable.
73    #[facet(xml::attribute, default)]
74    pub contenteditable: Option<String>,
75    /// Whether spellchecking is enabled.
76    #[facet(xml::attribute, default)]
77    pub spellcheck: Option<String>,
78    /// Whether the element should be translated.
79    #[facet(xml::attribute, default)]
80    pub translate: Option<String>,
81    /// ARIA role.
82    #[facet(xml::attribute, default)]
83    pub role: Option<String>,
84
85    // Common event handlers (most frequently used)
86    /// Script to run on mouse click.
87    #[facet(xml::attribute, default)]
88    pub onclick: Option<String>,
89    /// Script to run on mouse double-click.
90    #[facet(xml::attribute, default)]
91    pub ondblclick: Option<String>,
92    /// Script to run when mouse button is pressed.
93    #[facet(xml::attribute, default)]
94    pub onmousedown: Option<String>,
95    /// Script to run when mouse pointer moves over element.
96    #[facet(xml::attribute, default)]
97    pub onmouseover: Option<String>,
98    /// Script to run when mouse pointer moves out of element.
99    #[facet(xml::attribute, default)]
100    pub onmouseout: Option<String>,
101    /// Script to run when mouse button is released.
102    #[facet(xml::attribute, default)]
103    pub onmouseup: Option<String>,
104    /// Script to run when mouse enters element.
105    #[facet(xml::attribute, default)]
106    pub onmouseenter: Option<String>,
107    /// Script to run when mouse leaves element.
108    #[facet(xml::attribute, default)]
109    pub onmouseleave: Option<String>,
110    /// Script to run when key is pressed down.
111    #[facet(xml::attribute, default)]
112    pub onkeydown: Option<String>,
113    /// Script to run when key is released.
114    #[facet(xml::attribute, default)]
115    pub onkeyup: Option<String>,
116    /// Script to run when element receives focus.
117    #[facet(xml::attribute, default)]
118    pub onfocus: Option<String>,
119    /// Script to run when element loses focus.
120    #[facet(xml::attribute, default)]
121    pub onblur: Option<String>,
122    /// Script to run when value changes.
123    #[facet(xml::attribute, default)]
124    pub onchange: Option<String>,
125    /// Script to run on input.
126    #[facet(xml::attribute, default)]
127    pub oninput: Option<String>,
128    /// Script to run when form is submitted.
129    #[facet(xml::attribute, default)]
130    pub onsubmit: Option<String>,
131    /// Script to run when resource is loaded.
132    #[facet(xml::attribute, default)]
133    pub onload: Option<String>,
134    /// Script to run when error occurs.
135    #[facet(xml::attribute, default)]
136    pub onerror: Option<String>,
137    /// Script to run when element is scrolled.
138    #[facet(xml::attribute, default)]
139    pub onscroll: Option<String>,
140    /// Script to run on context menu (right-click).
141    #[facet(xml::attribute, default)]
142    pub oncontextmenu: Option<String>,
143
144    // Catch-all for unknown attributes (data-*, aria-*, less common events, etc.)
145    /// Extra attributes not explicitly modeled.
146    /// Includes data-* attributes, aria-* attributes, and less common event handlers.
147    /// Keys are the full attribute names as they appear in HTML.
148    #[facet(flatten, default)]
149    pub extra: std::collections::HashMap<String, String>,
150}
151
152// =============================================================================
153// Document Structure
154// =============================================================================
155
156/// The root HTML document element.
157#[derive(Debug, Clone, PartialEq, Default, Facet)]
158#[facet(rename = "html")]
159pub struct Html {
160    /// Global attributes.
161    #[facet(flatten, default)]
162    pub attrs: GlobalAttrs,
163    /// Document head.
164    #[facet(default)]
165    pub head: Option<Head>,
166    /// Document body.
167    #[facet(default)]
168    pub body: Option<Body>,
169}
170
171/// The document head containing metadata.
172#[derive(Debug, Clone, PartialEq, Default, Facet)]
173#[facet(rename = "head")]
174pub struct Head {
175    /// Global attributes.
176    #[facet(flatten, default)]
177    pub attrs: GlobalAttrs,
178    /// Document title.
179    #[facet(default)]
180    pub title: Option<Title>,
181    /// Base URL element.
182    #[facet(default)]
183    pub base: Option<Base>,
184    /// Linked resources (stylesheets, icons, etc.).
185    #[facet(xml::elements, default)]
186    pub link: Vec<Link>,
187    /// Metadata elements.
188    #[facet(xml::elements, default)]
189    pub meta: Vec<Meta>,
190    /// Inline styles.
191    #[facet(xml::elements, default)]
192    pub style: Vec<Style>,
193    /// Scripts.
194    #[facet(xml::elements, default)]
195    pub script: Vec<Script>,
196}
197
198/// The document body containing visible content.
199#[derive(Debug, Clone, PartialEq, Default, Facet)]
200#[facet(rename = "body")]
201pub struct Body {
202    /// Global attributes.
203    #[facet(flatten, default)]
204    pub attrs: GlobalAttrs,
205    /// Child elements (mixed content).
206    #[facet(xml::elements, default)]
207    #[facet(recursive_type)]
208    pub children: Vec<FlowContent>,
209}
210
211// =============================================================================
212// Metadata Elements
213// =============================================================================
214
215/// The document title.
216#[derive(Debug, Clone, PartialEq, Default, Facet)]
217#[facet(rename = "title")]
218pub struct Title {
219    /// Global attributes.
220    #[facet(flatten, default)]
221    pub attrs: GlobalAttrs,
222    /// Text content of the title.
223    #[facet(xml::text, default)]
224    pub text: String,
225}
226
227/// Base URL for relative URLs.
228#[derive(Debug, Clone, PartialEq, Default, Facet)]
229#[facet(rename = "base")]
230pub struct Base {
231    /// Global attributes.
232    #[facet(flatten, default)]
233    pub attrs: GlobalAttrs,
234    /// Base URL.
235    #[facet(default)]
236    pub href: Option<String>,
237    /// Default browsing context.
238    #[facet(default)]
239    pub target: Option<String>,
240}
241
242/// External resource link.
243#[derive(Debug, Clone, PartialEq, Default, Facet)]
244#[facet(rename = "link")]
245pub struct Link {
246    /// Global attributes.
247    #[facet(flatten, default)]
248    pub attrs: GlobalAttrs,
249    /// URL of the linked resource.
250    #[facet(default)]
251    pub href: Option<String>,
252    /// Relationship type.
253    #[facet(default)]
254    pub rel: Option<String>,
255    /// MIME type of the resource.
256    #[facet(default, rename = "type")]
257    pub type_: Option<String>,
258    /// Media query for the resource.
259    #[facet(default)]
260    pub media: Option<String>,
261    /// Integrity hash.
262    #[facet(default)]
263    pub integrity: Option<String>,
264    /// Crossorigin attribute.
265    #[facet(default)]
266    pub crossorigin: Option<String>,
267    /// Resource sizes (for icons).
268    #[facet(default)]
269    pub sizes: Option<String>,
270    /// Alternative stylesheet title.
271    #[facet(default, rename = "as")]
272    pub as_: Option<String>,
273}
274
275/// Document metadata.
276#[derive(Debug, Clone, PartialEq, Default, Facet)]
277#[facet(rename = "meta")]
278pub struct Meta {
279    /// Global attributes.
280    #[facet(flatten, default)]
281    pub attrs: GlobalAttrs,
282    /// Metadata name.
283    #[facet(default)]
284    pub name: Option<String>,
285    /// Metadata content.
286    #[facet(default)]
287    pub content: Option<String>,
288    /// Character encoding.
289    #[facet(default)]
290    pub charset: Option<String>,
291    /// Pragma directive.
292    #[facet(default, rename = "http-equiv")]
293    pub http_equiv: Option<String>,
294    /// Property (for Open Graph, etc.).
295    #[facet(default)]
296    pub property: Option<String>,
297}
298
299/// Inline stylesheet.
300#[derive(Debug, Clone, PartialEq, Default, Facet)]
301#[facet(rename = "style")]
302pub struct Style {
303    /// Global attributes.
304    #[facet(flatten, default)]
305    pub attrs: GlobalAttrs,
306    /// Media query.
307    #[facet(default)]
308    pub media: Option<String>,
309    /// MIME type.
310    #[facet(default, rename = "type")]
311    pub type_: Option<String>,
312    /// CSS content.
313    #[facet(default)]
314    pub text: String,
315}
316
317// =============================================================================
318// Section Elements
319// =============================================================================
320
321/// Page header.
322#[derive(Debug, Clone, PartialEq, Default, Facet)]
323#[facet(rename = "header")]
324pub struct Header {
325    /// Global attributes.
326    #[facet(flatten, default)]
327    pub attrs: GlobalAttrs,
328    /// Child elements.
329    #[facet(xml::elements, default)]
330    #[facet(recursive_type)]
331    pub children: Vec<FlowContent>,
332}
333
334/// Page or section footer.
335#[derive(Debug, Clone, PartialEq, Default, Facet)]
336#[facet(rename = "footer")]
337pub struct Footer {
338    /// Global attributes.
339    #[facet(flatten, default)]
340    pub attrs: GlobalAttrs,
341    /// Child elements.
342    #[facet(xml::elements, default)]
343    #[facet(recursive_type)]
344    pub children: Vec<FlowContent>,
345}
346
347/// Main content area.
348#[derive(Debug, Clone, PartialEq, Default, Facet)]
349#[facet(rename = "main")]
350pub struct Main {
351    /// Global attributes.
352    #[facet(flatten, default)]
353    pub attrs: GlobalAttrs,
354    /// Child elements.
355    #[facet(xml::elements, default)]
356    #[facet(recursive_type)]
357    pub children: Vec<FlowContent>,
358}
359
360/// Self-contained article.
361#[derive(Debug, Clone, PartialEq, Default, Facet)]
362#[facet(rename = "article")]
363pub struct Article {
364    /// Global attributes.
365    #[facet(flatten, default)]
366    pub attrs: GlobalAttrs,
367    /// Child elements.
368    #[facet(xml::elements, default)]
369    #[facet(recursive_type)]
370    pub children: Vec<FlowContent>,
371}
372
373/// Generic section.
374#[derive(Debug, Clone, PartialEq, Default, Facet)]
375#[facet(rename = "section")]
376pub struct Section {
377    /// Global attributes.
378    #[facet(flatten, default)]
379    pub attrs: GlobalAttrs,
380    /// Child elements.
381    #[facet(xml::elements, default)]
382    #[facet(recursive_type)]
383    pub children: Vec<FlowContent>,
384}
385
386/// Navigation section.
387#[derive(Debug, Clone, PartialEq, Default, Facet)]
388#[facet(rename = "nav")]
389pub struct Nav {
390    /// Global attributes.
391    #[facet(flatten, default)]
392    pub attrs: GlobalAttrs,
393    /// Child elements.
394    #[facet(xml::elements, default)]
395    #[facet(recursive_type)]
396    pub children: Vec<FlowContent>,
397}
398
399/// Sidebar content.
400#[derive(Debug, Clone, PartialEq, Default, Facet)]
401#[facet(rename = "aside")]
402pub struct Aside {
403    /// Global attributes.
404    #[facet(flatten, default)]
405    pub attrs: GlobalAttrs,
406    /// Child elements.
407    #[facet(xml::elements, default)]
408    #[facet(recursive_type)]
409    pub children: Vec<FlowContent>,
410}
411
412/// Address/contact information.
413#[derive(Debug, Clone, PartialEq, Default, Facet)]
414#[facet(rename = "address")]
415pub struct Address {
416    /// Global attributes.
417    #[facet(flatten, default)]
418    pub attrs: GlobalAttrs,
419    /// Child elements.
420    #[facet(xml::elements, default)]
421    #[facet(recursive_type)]
422    pub children: Vec<FlowContent>,
423}
424
425// =============================================================================
426// Heading Elements
427// =============================================================================
428
429/// Level 1 heading.
430#[derive(Debug, Clone, PartialEq, Default, Facet)]
431#[facet(rename = "h1")]
432pub struct H1 {
433    /// Global attributes.
434    #[facet(flatten, default)]
435    pub attrs: GlobalAttrs,
436    /// Child elements.
437    #[facet(xml::elements, default)]
438    #[facet(recursive_type)]
439    pub children: Vec<PhrasingContent>,
440}
441
442/// Level 2 heading.
443#[derive(Debug, Clone, PartialEq, Default, Facet)]
444#[facet(rename = "h2")]
445pub struct H2 {
446    /// Global attributes.
447    #[facet(flatten, default)]
448    pub attrs: GlobalAttrs,
449    /// Child elements.
450    #[facet(xml::elements, default)]
451    #[facet(recursive_type)]
452    pub children: Vec<PhrasingContent>,
453}
454
455/// Level 3 heading.
456#[derive(Debug, Clone, PartialEq, Default, Facet)]
457#[facet(rename = "h3")]
458pub struct H3 {
459    /// Global attributes.
460    #[facet(flatten, default)]
461    pub attrs: GlobalAttrs,
462    /// Child elements.
463    #[facet(xml::elements, default)]
464    #[facet(recursive_type)]
465    pub children: Vec<PhrasingContent>,
466}
467
468/// Level 4 heading.
469#[derive(Debug, Clone, PartialEq, Default, Facet)]
470#[facet(rename = "h4")]
471pub struct H4 {
472    /// Global attributes.
473    #[facet(flatten, default)]
474    pub attrs: GlobalAttrs,
475    /// Child elements.
476    #[facet(xml::elements, default)]
477    #[facet(recursive_type)]
478    pub children: Vec<PhrasingContent>,
479}
480
481/// Level 5 heading.
482#[derive(Debug, Clone, PartialEq, Default, Facet)]
483#[facet(rename = "h5")]
484pub struct H5 {
485    /// Global attributes.
486    #[facet(flatten, default)]
487    pub attrs: GlobalAttrs,
488    /// Child elements.
489    #[facet(xml::elements, default)]
490    #[facet(recursive_type)]
491    pub children: Vec<PhrasingContent>,
492}
493
494/// Level 6 heading.
495#[derive(Debug, Clone, PartialEq, Default, Facet)]
496#[facet(rename = "h6")]
497pub struct H6 {
498    /// Global attributes.
499    #[facet(flatten, default)]
500    pub attrs: GlobalAttrs,
501    /// Child elements.
502    #[facet(xml::elements, default)]
503    #[facet(recursive_type)]
504    pub children: Vec<PhrasingContent>,
505}
506
507// =============================================================================
508// Grouping Content
509// =============================================================================
510
511/// Paragraph.
512#[derive(Debug, Clone, PartialEq, Default, Facet)]
513#[facet(rename = "p")]
514pub struct P {
515    /// Global attributes.
516    #[facet(flatten, default)]
517    pub attrs: GlobalAttrs,
518    /// Child elements.
519    #[facet(xml::elements, default)]
520    #[facet(recursive_type)]
521    pub children: Vec<PhrasingContent>,
522}
523
524/// Generic container (block).
525#[derive(Debug, Clone, PartialEq, Default, Facet)]
526#[facet(rename = "div")]
527pub struct Div {
528    /// Global attributes.
529    #[facet(flatten, default)]
530    pub attrs: GlobalAttrs,
531    /// Child elements.
532    #[facet(xml::elements, default)]
533    #[facet(recursive_type)]
534    pub children: Vec<FlowContent>,
535}
536
537/// Generic container (inline).
538#[derive(Debug, Clone, PartialEq, Default, Facet)]
539#[facet(rename = "span")]
540pub struct Span {
541    /// Global attributes.
542    #[facet(flatten, default)]
543    pub attrs: GlobalAttrs,
544    /// Child elements.
545    #[facet(xml::elements, default)]
546    #[facet(recursive_type)]
547    pub children: Vec<PhrasingContent>,
548}
549
550/// Preformatted text.
551#[derive(Debug, Clone, PartialEq, Default, Facet)]
552#[facet(rename = "pre")]
553pub struct Pre {
554    /// Global attributes.
555    #[facet(flatten, default)]
556    pub attrs: GlobalAttrs,
557    /// Child elements.
558    #[facet(xml::elements, default)]
559    #[facet(recursive_type)]
560    pub children: Vec<PhrasingContent>,
561}
562
563/// Block quotation.
564#[derive(Debug, Clone, PartialEq, Default, Facet)]
565#[facet(rename = "blockquote")]
566pub struct Blockquote {
567    /// Global attributes.
568    #[facet(flatten, default)]
569    pub attrs: GlobalAttrs,
570    /// Citation URL.
571    #[facet(default)]
572    pub cite: Option<String>,
573    /// Child elements.
574    #[facet(xml::elements, default)]
575    #[facet(recursive_type)]
576    pub children: Vec<FlowContent>,
577}
578
579/// Ordered list.
580#[derive(Debug, Clone, PartialEq, Default, Facet)]
581#[facet(rename = "ol")]
582pub struct Ol {
583    /// Global attributes.
584    #[facet(flatten, default)]
585    pub attrs: GlobalAttrs,
586    /// Starting number.
587    #[facet(default)]
588    pub start: Option<String>,
589    /// Numbering type (1, a, A, i, I).
590    #[facet(default, rename = "type")]
591    pub type_: Option<String>,
592    /// Reversed order.
593    #[facet(default)]
594    pub reversed: Option<String>,
595    /// List items.
596    #[facet(default)]
597    pub li: Vec<Li>,
598}
599
600/// Unordered list.
601#[derive(Debug, Clone, PartialEq, Default, Facet)]
602#[facet(rename = "ul")]
603pub struct Ul {
604    /// Global attributes.
605    #[facet(flatten, default)]
606    pub attrs: GlobalAttrs,
607    /// List items.
608    #[facet(default)]
609    pub li: Vec<Li>,
610}
611
612/// List item.
613#[derive(Debug, Clone, PartialEq, Default, Facet)]
614#[facet(rename = "li")]
615pub struct Li {
616    /// Global attributes.
617    #[facet(flatten, default)]
618    pub attrs: GlobalAttrs,
619    /// Value (for ol).
620    #[facet(default)]
621    pub value: Option<String>,
622    /// Child elements.
623    #[facet(xml::elements, default)]
624    #[facet(recursive_type)]
625    pub children: Vec<FlowContent>,
626}
627
628/// Description list.
629#[derive(Debug, Clone, PartialEq, Default, Facet)]
630#[facet(rename = "dl")]
631pub struct Dl {
632    /// Global attributes.
633    #[facet(flatten, default)]
634    pub attrs: GlobalAttrs,
635    /// Terms and descriptions (mixed dt/dd).
636    #[facet(default)]
637    pub dt: Vec<Dt>,
638    /// Descriptions.
639    #[facet(default)]
640    pub dd: Vec<Dd>,
641}
642
643/// Description term.
644#[derive(Debug, Clone, PartialEq, Default, Facet)]
645#[facet(rename = "dt")]
646pub struct Dt {
647    /// Global attributes.
648    #[facet(flatten, default)]
649    pub attrs: GlobalAttrs,
650    /// Child elements.
651    #[facet(xml::elements, default)]
652    #[facet(recursive_type)]
653    pub children: Vec<FlowContent>,
654}
655
656/// Description details.
657#[derive(Debug, Clone, PartialEq, Default, Facet)]
658#[facet(rename = "dd")]
659pub struct Dd {
660    /// Global attributes.
661    #[facet(flatten, default)]
662    pub attrs: GlobalAttrs,
663    /// Child elements.
664    #[facet(xml::elements, default)]
665    #[facet(recursive_type)]
666    pub children: Vec<FlowContent>,
667}
668
669/// Figure with optional caption.
670#[derive(Debug, Clone, PartialEq, Default, Facet)]
671#[facet(rename = "figure")]
672pub struct Figure {
673    /// Global attributes.
674    #[facet(flatten, default)]
675    pub attrs: GlobalAttrs,
676    /// Figure caption.
677    #[facet(default)]
678    pub figcaption: Option<Figcaption>,
679    /// Child elements.
680    #[facet(xml::elements, default)]
681    #[facet(recursive_type)]
682    pub children: Vec<FlowContent>,
683}
684
685/// Figure caption.
686#[derive(Debug, Clone, PartialEq, Default, Facet)]
687#[facet(rename = "figcaption")]
688pub struct Figcaption {
689    /// Global attributes.
690    #[facet(flatten, default)]
691    pub attrs: GlobalAttrs,
692    /// Child elements.
693    #[facet(xml::elements, default)]
694    #[facet(recursive_type)]
695    pub children: Vec<FlowContent>,
696}
697
698/// Horizontal rule (thematic break).
699#[derive(Debug, Clone, PartialEq, Default, Facet)]
700#[facet(rename = "hr")]
701pub struct Hr {
702    /// Global attributes.
703    #[facet(flatten, default)]
704    pub attrs: GlobalAttrs,
705}
706
707// =============================================================================
708// Text-level Semantics
709// =============================================================================
710
711/// Hyperlink.
712#[derive(Debug, Clone, PartialEq, Default, Facet)]
713#[facet(rename = "a")]
714pub struct A {
715    /// Global attributes.
716    #[facet(flatten, default)]
717    pub attrs: GlobalAttrs,
718    /// URL.
719    #[facet(default)]
720    pub href: Option<String>,
721    /// Target browsing context.
722    #[facet(default)]
723    pub target: Option<String>,
724    /// Relationship.
725    #[facet(default)]
726    pub rel: Option<String>,
727    /// Download filename.
728    #[facet(default)]
729    pub download: Option<String>,
730    /// MIME type hint.
731    #[facet(default, rename = "type")]
732    pub type_: Option<String>,
733    /// Language of linked resource.
734    #[facet(default)]
735    pub hreflang: Option<String>,
736    /// Referrer policy.
737    #[facet(default)]
738    pub referrerpolicy: Option<String>,
739    /// Child elements.
740    #[facet(xml::elements, default)]
741    #[facet(recursive_type)]
742    pub children: Vec<PhrasingContent>,
743}
744
745/// Emphasis.
746#[derive(Debug, Clone, PartialEq, Default, Facet)]
747#[facet(rename = "em")]
748pub struct Em {
749    /// Global attributes.
750    #[facet(flatten, default)]
751    pub attrs: GlobalAttrs,
752    /// Child elements.
753    #[facet(xml::elements, default)]
754    #[facet(recursive_type)]
755    pub children: Vec<PhrasingContent>,
756}
757
758/// Strong importance.
759#[derive(Debug, Clone, PartialEq, Default, Facet)]
760#[facet(rename = "strong")]
761pub struct Strong {
762    /// Global attributes.
763    #[facet(flatten, default)]
764    pub attrs: GlobalAttrs,
765    /// Child elements.
766    #[facet(xml::elements, default)]
767    #[facet(recursive_type)]
768    pub children: Vec<PhrasingContent>,
769}
770
771/// Small print.
772#[derive(Debug, Clone, PartialEq, Default, Facet)]
773#[facet(rename = "small")]
774pub struct Small {
775    /// Global attributes.
776    #[facet(flatten, default)]
777    pub attrs: GlobalAttrs,
778    /// Child elements.
779    #[facet(xml::elements, default)]
780    #[facet(recursive_type)]
781    pub children: Vec<PhrasingContent>,
782}
783
784/// Strikethrough (no longer accurate).
785#[derive(Debug, Clone, PartialEq, Default, Facet)]
786#[facet(rename = "s")]
787pub struct S {
788    /// Global attributes.
789    #[facet(flatten, default)]
790    pub attrs: GlobalAttrs,
791    /// Child elements.
792    #[facet(xml::elements, default)]
793    #[facet(recursive_type)]
794    pub children: Vec<PhrasingContent>,
795}
796
797/// Citation.
798#[derive(Debug, Clone, PartialEq, Default, Facet)]
799#[facet(rename = "cite")]
800pub struct Cite {
801    /// Global attributes.
802    #[facet(flatten, default)]
803    pub attrs: GlobalAttrs,
804    /// Child elements.
805    #[facet(xml::elements, default)]
806    #[facet(recursive_type)]
807    pub children: Vec<PhrasingContent>,
808}
809
810/// Inline quotation.
811#[derive(Debug, Clone, PartialEq, Default, Facet)]
812#[facet(rename = "q")]
813pub struct Q {
814    /// Global attributes.
815    #[facet(flatten, default)]
816    pub attrs: GlobalAttrs,
817    /// Citation URL.
818    #[facet(default)]
819    pub cite: Option<String>,
820    /// Child elements.
821    #[facet(xml::elements, default)]
822    #[facet(recursive_type)]
823    pub children: Vec<PhrasingContent>,
824}
825
826/// Definition term.
827#[derive(Debug, Clone, PartialEq, Default, Facet)]
828#[facet(rename = "dfn")]
829pub struct Dfn {
830    /// Global attributes.
831    #[facet(flatten, default)]
832    pub attrs: GlobalAttrs,
833    /// Child elements.
834    #[facet(xml::elements, default)]
835    #[facet(recursive_type)]
836    pub children: Vec<PhrasingContent>,
837}
838
839/// Abbreviation.
840#[derive(Debug, Clone, PartialEq, Default, Facet)]
841#[facet(rename = "abbr")]
842pub struct Abbr {
843    /// Global attributes.
844    #[facet(flatten, default)]
845    pub attrs: GlobalAttrs,
846    /// Child elements.
847    #[facet(xml::elements, default)]
848    #[facet(recursive_type)]
849    pub children: Vec<PhrasingContent>,
850}
851
852/// Ruby annotation (for East Asian typography).
853#[derive(Debug, Clone, PartialEq, Default, Facet)]
854#[facet(rename = "ruby")]
855pub struct Ruby {
856    /// Global attributes.
857    #[facet(flatten, default)]
858    pub attrs: GlobalAttrs,
859    /// Child elements.
860    #[facet(xml::elements, default)]
861    #[facet(recursive_type)]
862    pub children: Vec<PhrasingContent>,
863}
864
865/// Data with machine-readable value.
866#[derive(Debug, Clone, PartialEq, Default, Facet)]
867#[facet(rename = "data")]
868pub struct Data {
869    /// Global attributes.
870    #[facet(flatten, default)]
871    pub attrs: GlobalAttrs,
872    /// Machine-readable value.
873    #[facet(default)]
874    pub value: Option<String>,
875    /// Child elements.
876    #[facet(xml::elements, default)]
877    #[facet(recursive_type)]
878    pub children: Vec<PhrasingContent>,
879}
880
881/// Time.
882#[derive(Debug, Clone, PartialEq, Default, Facet)]
883#[facet(rename = "time")]
884pub struct Time {
885    /// Global attributes.
886    #[facet(flatten, default)]
887    pub attrs: GlobalAttrs,
888    /// Machine-readable datetime.
889    #[facet(default)]
890    pub datetime: Option<String>,
891    /// Child elements.
892    #[facet(xml::elements, default)]
893    #[facet(recursive_type)]
894    pub children: Vec<PhrasingContent>,
895}
896
897/// Code fragment.
898#[derive(Debug, Clone, PartialEq, Default, Facet)]
899#[facet(rename = "code")]
900pub struct Code {
901    /// Global attributes.
902    #[facet(flatten, default)]
903    pub attrs: GlobalAttrs,
904    /// Child elements.
905    #[facet(xml::elements, default)]
906    #[facet(recursive_type)]
907    pub children: Vec<PhrasingContent>,
908}
909
910/// Variable.
911#[derive(Debug, Clone, PartialEq, Default, Facet)]
912#[facet(rename = "var")]
913pub struct Var {
914    /// Global attributes.
915    #[facet(flatten, default)]
916    pub attrs: GlobalAttrs,
917    /// Child elements.
918    #[facet(xml::elements, default)]
919    #[facet(recursive_type)]
920    pub children: Vec<PhrasingContent>,
921}
922
923/// Sample output.
924#[derive(Debug, Clone, PartialEq, Default, Facet)]
925#[facet(rename = "samp")]
926pub struct Samp {
927    /// Global attributes.
928    #[facet(flatten, default)]
929    pub attrs: GlobalAttrs,
930    /// Child elements.
931    #[facet(xml::elements, default)]
932    #[facet(recursive_type)]
933    pub children: Vec<PhrasingContent>,
934}
935
936/// Keyboard input.
937#[derive(Debug, Clone, PartialEq, Default, Facet)]
938#[facet(rename = "kbd")]
939pub struct Kbd {
940    /// Global attributes.
941    #[facet(flatten, default)]
942    pub attrs: GlobalAttrs,
943    /// Child elements.
944    #[facet(xml::elements, default)]
945    #[facet(recursive_type)]
946    pub children: Vec<PhrasingContent>,
947}
948
949/// Subscript.
950#[derive(Debug, Clone, PartialEq, Default, Facet)]
951#[facet(rename = "sub")]
952pub struct Sub {
953    /// Global attributes.
954    #[facet(flatten, default)]
955    pub attrs: GlobalAttrs,
956    /// Child elements.
957    #[facet(xml::elements, default)]
958    #[facet(recursive_type)]
959    pub children: Vec<PhrasingContent>,
960}
961
962/// Superscript.
963#[derive(Debug, Clone, PartialEq, Default, Facet)]
964#[facet(rename = "sup")]
965pub struct Sup {
966    /// Global attributes.
967    #[facet(flatten, default)]
968    pub attrs: GlobalAttrs,
969    /// Child elements.
970    #[facet(xml::elements, default)]
971    #[facet(recursive_type)]
972    pub children: Vec<PhrasingContent>,
973}
974
975/// Italic.
976#[derive(Debug, Clone, PartialEq, Default, Facet)]
977#[facet(rename = "i")]
978pub struct I {
979    /// Global attributes.
980    #[facet(flatten, default)]
981    pub attrs: GlobalAttrs,
982    /// Child elements.
983    #[facet(xml::elements, default)]
984    #[facet(recursive_type)]
985    pub children: Vec<PhrasingContent>,
986}
987
988/// Bold.
989#[derive(Debug, Clone, PartialEq, Default, Facet)]
990#[facet(rename = "b")]
991pub struct B {
992    /// Global attributes.
993    #[facet(flatten, default)]
994    pub attrs: GlobalAttrs,
995    /// Child elements.
996    #[facet(xml::elements, default)]
997    #[facet(recursive_type)]
998    pub children: Vec<PhrasingContent>,
999}
1000
1001/// Underline.
1002#[derive(Debug, Clone, PartialEq, Default, Facet)]
1003#[facet(rename = "u")]
1004pub struct U {
1005    /// Global attributes.
1006    #[facet(flatten, default)]
1007    pub attrs: GlobalAttrs,
1008    /// Child elements.
1009    #[facet(xml::elements, default)]
1010    #[facet(recursive_type)]
1011    pub children: Vec<PhrasingContent>,
1012}
1013
1014/// Highlighted text.
1015#[derive(Debug, Clone, PartialEq, Default, Facet)]
1016#[facet(rename = "mark")]
1017pub struct Mark {
1018    /// Global attributes.
1019    #[facet(flatten, default)]
1020    pub attrs: GlobalAttrs,
1021    /// Child elements.
1022    #[facet(xml::elements, default)]
1023    #[facet(recursive_type)]
1024    pub children: Vec<PhrasingContent>,
1025}
1026
1027/// Bidirectional isolation.
1028#[derive(Debug, Clone, PartialEq, Default, Facet)]
1029#[facet(rename = "bdi")]
1030pub struct Bdi {
1031    /// Global attributes.
1032    #[facet(flatten, default)]
1033    pub attrs: GlobalAttrs,
1034    /// Child elements.
1035    #[facet(xml::elements, default)]
1036    #[facet(recursive_type)]
1037    pub children: Vec<PhrasingContent>,
1038}
1039
1040/// Bidirectional override.
1041#[derive(Debug, Clone, PartialEq, Default, Facet)]
1042#[facet(rename = "bdo")]
1043pub struct Bdo {
1044    /// Global attributes.
1045    #[facet(flatten, default)]
1046    pub attrs: GlobalAttrs,
1047    /// Child elements.
1048    #[facet(xml::elements, default)]
1049    #[facet(recursive_type)]
1050    pub children: Vec<PhrasingContent>,
1051}
1052
1053/// Line break.
1054#[derive(Debug, Clone, PartialEq, Default, Facet)]
1055#[facet(rename = "br")]
1056pub struct Br {
1057    /// Global attributes.
1058    #[facet(flatten, default)]
1059    pub attrs: GlobalAttrs,
1060}
1061
1062/// Word break opportunity.
1063#[derive(Debug, Clone, PartialEq, Default, Facet)]
1064#[facet(rename = "wbr")]
1065pub struct Wbr {
1066    /// Global attributes.
1067    #[facet(flatten, default)]
1068    pub attrs: GlobalAttrs,
1069}
1070
1071// =============================================================================
1072// Embedded Content
1073// =============================================================================
1074
1075/// Image.
1076#[derive(Debug, Clone, PartialEq, Default, Facet)]
1077#[facet(rename = "img")]
1078pub struct Img {
1079    /// Global attributes.
1080    #[facet(flatten, default)]
1081    pub attrs: GlobalAttrs,
1082    /// Image URL.
1083    #[facet(default)]
1084    pub src: Option<String>,
1085    /// Alternative text.
1086    #[facet(default)]
1087    pub alt: Option<String>,
1088    /// Width.
1089    #[facet(default)]
1090    pub width: Option<String>,
1091    /// Height.
1092    #[facet(default)]
1093    pub height: Option<String>,
1094    /// Srcset for responsive images.
1095    #[facet(default)]
1096    pub srcset: Option<String>,
1097    /// Sizes attribute.
1098    #[facet(default)]
1099    pub sizes: Option<String>,
1100    /// Loading behavior.
1101    #[facet(default)]
1102    pub loading: Option<String>,
1103    /// Decoding hint.
1104    #[facet(default)]
1105    pub decoding: Option<String>,
1106    /// Crossorigin.
1107    #[facet(default)]
1108    pub crossorigin: Option<String>,
1109    /// Referrer policy.
1110    #[facet(default)]
1111    pub referrerpolicy: Option<String>,
1112    /// Usemap reference.
1113    #[facet(default)]
1114    pub usemap: Option<String>,
1115    /// Whether this is a server-side image map.
1116    #[facet(default)]
1117    pub ismap: Option<String>,
1118}
1119
1120/// Inline frame.
1121#[derive(Debug, Clone, PartialEq, Default, Facet)]
1122#[facet(rename = "iframe")]
1123pub struct Iframe {
1124    /// Global attributes.
1125    #[facet(flatten, default)]
1126    pub attrs: GlobalAttrs,
1127    /// URL.
1128    #[facet(default)]
1129    pub src: Option<String>,
1130    /// Srcdoc content.
1131    #[facet(default)]
1132    pub srcdoc: Option<String>,
1133    /// Frame name.
1134    #[facet(default)]
1135    pub name: Option<String>,
1136    /// Width.
1137    #[facet(default)]
1138    pub width: Option<String>,
1139    /// Height.
1140    #[facet(default)]
1141    pub height: Option<String>,
1142    /// Sandbox restrictions.
1143    #[facet(default)]
1144    pub sandbox: Option<String>,
1145    /// Feature policy.
1146    #[facet(default)]
1147    pub allow: Option<String>,
1148    /// Fullscreen allowed.
1149    #[facet(default)]
1150    pub allowfullscreen: Option<String>,
1151    /// Loading behavior.
1152    #[facet(default)]
1153    pub loading: Option<String>,
1154    /// Referrer policy.
1155    #[facet(default)]
1156    pub referrerpolicy: Option<String>,
1157}
1158
1159/// Embedded object.
1160#[derive(Debug, Clone, PartialEq, Default, Facet)]
1161#[facet(rename = "object")]
1162pub struct Object {
1163    /// Global attributes.
1164    #[facet(flatten, default)]
1165    pub attrs: GlobalAttrs,
1166    /// Data URL.
1167    #[facet(default)]
1168    pub data: Option<String>,
1169    /// MIME type.
1170    #[facet(default, rename = "type")]
1171    pub type_: Option<String>,
1172    /// Name.
1173    #[facet(default)]
1174    pub name: Option<String>,
1175    /// Width.
1176    #[facet(default)]
1177    pub width: Option<String>,
1178    /// Height.
1179    #[facet(default)]
1180    pub height: Option<String>,
1181    /// Usemap reference.
1182    #[facet(default)]
1183    pub usemap: Option<String>,
1184    /// Fallback content.
1185    #[facet(xml::elements, default)]
1186    #[facet(recursive_type)]
1187    pub children: Vec<FlowContent>,
1188}
1189
1190/// Video player.
1191#[derive(Debug, Clone, PartialEq, Default, Facet)]
1192#[facet(rename = "video")]
1193pub struct Video {
1194    /// Global attributes.
1195    #[facet(flatten, default)]
1196    pub attrs: GlobalAttrs,
1197    /// Video URL.
1198    #[facet(default)]
1199    pub src: Option<String>,
1200    /// Poster image.
1201    #[facet(default)]
1202    pub poster: Option<String>,
1203    /// Width.
1204    #[facet(default)]
1205    pub width: Option<String>,
1206    /// Height.
1207    #[facet(default)]
1208    pub height: Option<String>,
1209    /// Show controls.
1210    #[facet(default)]
1211    pub controls: Option<String>,
1212    /// Autoplay.
1213    #[facet(default)]
1214    pub autoplay: Option<String>,
1215    /// Loop playback.
1216    #[facet(default, rename = "loop")]
1217    pub loop_: Option<String>,
1218    /// Muted by default.
1219    #[facet(default)]
1220    pub muted: Option<String>,
1221    /// Preload behavior.
1222    #[facet(default)]
1223    pub preload: Option<String>,
1224    /// Plays inline (iOS).
1225    #[facet(default)]
1226    pub playsinline: Option<String>,
1227    /// Crossorigin.
1228    #[facet(default)]
1229    pub crossorigin: Option<String>,
1230    /// Source elements.
1231    #[facet(default)]
1232    pub source: Vec<Source>,
1233    /// Track elements.
1234    #[facet(default)]
1235    pub track: Vec<Track>,
1236}
1237
1238/// Audio player.
1239#[derive(Debug, Clone, PartialEq, Default, Facet)]
1240#[facet(rename = "audio")]
1241pub struct Audio {
1242    /// Global attributes.
1243    #[facet(flatten, default)]
1244    pub attrs: GlobalAttrs,
1245    /// Audio URL.
1246    #[facet(default)]
1247    pub src: Option<String>,
1248    /// Show controls.
1249    #[facet(default)]
1250    pub controls: Option<String>,
1251    /// Autoplay.
1252    #[facet(default)]
1253    pub autoplay: Option<String>,
1254    /// Loop playback.
1255    #[facet(default, rename = "loop")]
1256    pub loop_: Option<String>,
1257    /// Muted by default.
1258    #[facet(default)]
1259    pub muted: Option<String>,
1260    /// Preload behavior.
1261    #[facet(default)]
1262    pub preload: Option<String>,
1263    /// Crossorigin.
1264    #[facet(default)]
1265    pub crossorigin: Option<String>,
1266    /// Source elements.
1267    #[facet(default)]
1268    pub source: Vec<Source>,
1269}
1270
1271/// Media source.
1272#[derive(Debug, Clone, PartialEq, Default, Facet)]
1273#[facet(rename = "source")]
1274pub struct Source {
1275    /// Global attributes.
1276    #[facet(flatten, default)]
1277    pub attrs: GlobalAttrs,
1278    /// URL.
1279    #[facet(default)]
1280    pub src: Option<String>,
1281    /// MIME type.
1282    #[facet(default, rename = "type")]
1283    pub type_: Option<String>,
1284    /// Srcset (for picture).
1285    #[facet(default)]
1286    pub srcset: Option<String>,
1287    /// Sizes.
1288    #[facet(default)]
1289    pub sizes: Option<String>,
1290    /// Media query.
1291    #[facet(default)]
1292    pub media: Option<String>,
1293    /// Width.
1294    #[facet(default)]
1295    pub width: Option<String>,
1296    /// Height.
1297    #[facet(default)]
1298    pub height: Option<String>,
1299}
1300
1301/// Text track for video/audio.
1302#[derive(Debug, Clone, PartialEq, Default, Facet)]
1303#[facet(rename = "track")]
1304pub struct Track {
1305    /// Global attributes.
1306    #[facet(flatten, default)]
1307    pub attrs: GlobalAttrs,
1308    /// URL.
1309    #[facet(default)]
1310    pub src: Option<String>,
1311    /// Track kind.
1312    #[facet(default)]
1313    pub kind: Option<String>,
1314    /// Language.
1315    #[facet(default)]
1316    pub srclang: Option<String>,
1317    /// Label.
1318    #[facet(default)]
1319    pub label: Option<String>,
1320    /// Default track.
1321    #[facet(default)]
1322    pub default: Option<String>,
1323}
1324
1325/// Picture element for art direction.
1326#[derive(Debug, Clone, PartialEq, Default, Facet)]
1327#[facet(rename = "picture")]
1328pub struct Picture {
1329    /// Global attributes.
1330    #[facet(flatten, default)]
1331    pub attrs: GlobalAttrs,
1332    /// Source elements.
1333    #[facet(default)]
1334    pub source: Vec<Source>,
1335    /// Fallback image.
1336    #[facet(default)]
1337    pub img: Option<Img>,
1338}
1339
1340/// Canvas for graphics.
1341#[derive(Debug, Clone, PartialEq, Default, Facet)]
1342#[facet(rename = "canvas")]
1343pub struct Canvas {
1344    /// Global attributes.
1345    #[facet(flatten, default)]
1346    pub attrs: GlobalAttrs,
1347    /// Width.
1348    #[facet(default)]
1349    pub width: Option<String>,
1350    /// Height.
1351    #[facet(default)]
1352    pub height: Option<String>,
1353    /// Fallback content.
1354    #[facet(xml::elements, default)]
1355    #[facet(recursive_type)]
1356    pub children: Vec<FlowContent>,
1357}
1358
1359/// SVG root element (simplified).
1360#[derive(Debug, Clone, PartialEq, Default, Facet)]
1361#[facet(rename = "svg")]
1362pub struct Svg {
1363    /// Global attributes.
1364    #[facet(flatten, default)]
1365    pub attrs: GlobalAttrs,
1366    /// Width.
1367    #[facet(default)]
1368    pub width: Option<String>,
1369    /// Height.
1370    #[facet(default)]
1371    pub height: Option<String>,
1372    /// ViewBox.
1373    #[facet(default, rename = "viewBox")]
1374    pub view_box: Option<String>,
1375    /// Xmlns.
1376    #[facet(default)]
1377    pub xmlns: Option<String>,
1378    /// Preserve aspect ratio.
1379    #[facet(default, rename = "preserveAspectRatio")]
1380    pub preserve_aspect_ratio: Option<String>,
1381}
1382
1383// =============================================================================
1384// Table Elements
1385// =============================================================================
1386
1387/// Table.
1388#[derive(Debug, Clone, PartialEq, Default, Facet)]
1389#[facet(rename = "table")]
1390pub struct Table {
1391    /// Global attributes.
1392    #[facet(flatten, default)]
1393    pub attrs: GlobalAttrs,
1394    /// Caption.
1395    #[facet(default)]
1396    pub caption: Option<Caption>,
1397    /// Column groups.
1398    #[facet(default)]
1399    pub colgroup: Vec<Colgroup>,
1400    /// Table head.
1401    #[facet(default)]
1402    pub thead: Option<Thead>,
1403    /// Table body sections.
1404    #[facet(default)]
1405    pub tbody: Vec<Tbody>,
1406    /// Table foot.
1407    #[facet(default)]
1408    pub tfoot: Option<Tfoot>,
1409    /// Direct rows (when no thead/tbody/tfoot).
1410    #[facet(default)]
1411    pub tr: Vec<Tr>,
1412}
1413
1414/// Table caption.
1415#[derive(Debug, Clone, PartialEq, Default, Facet)]
1416#[facet(rename = "caption")]
1417pub struct Caption {
1418    /// Global attributes.
1419    #[facet(flatten, default)]
1420    pub attrs: GlobalAttrs,
1421    /// Child elements.
1422    #[facet(xml::elements, default)]
1423    #[facet(recursive_type)]
1424    pub children: Vec<FlowContent>,
1425}
1426
1427/// Column group.
1428#[derive(Debug, Clone, PartialEq, Default, Facet)]
1429#[facet(rename = "colgroup")]
1430pub struct Colgroup {
1431    /// Global attributes.
1432    #[facet(flatten, default)]
1433    pub attrs: GlobalAttrs,
1434    /// Number of columns spanned.
1435    #[facet(default)]
1436    pub span: Option<String>,
1437    /// Column definitions.
1438    #[facet(default)]
1439    pub col: Vec<Col>,
1440}
1441
1442/// Table column.
1443#[derive(Debug, Clone, PartialEq, Default, Facet)]
1444#[facet(rename = "col")]
1445pub struct Col {
1446    /// Global attributes.
1447    #[facet(flatten, default)]
1448    pub attrs: GlobalAttrs,
1449    /// Number of columns spanned.
1450    #[facet(default)]
1451    pub span: Option<String>,
1452}
1453
1454/// Table head.
1455#[derive(Debug, Clone, PartialEq, Default, Facet)]
1456#[facet(rename = "thead")]
1457pub struct Thead {
1458    /// Global attributes.
1459    #[facet(flatten, default)]
1460    pub attrs: GlobalAttrs,
1461    /// Rows.
1462    #[facet(default)]
1463    pub tr: Vec<Tr>,
1464}
1465
1466/// Table body.
1467#[derive(Debug, Clone, PartialEq, Default, Facet)]
1468#[facet(rename = "tbody")]
1469pub struct Tbody {
1470    /// Global attributes.
1471    #[facet(flatten, default)]
1472    pub attrs: GlobalAttrs,
1473    /// Rows.
1474    #[facet(default)]
1475    pub tr: Vec<Tr>,
1476}
1477
1478/// Table foot.
1479#[derive(Debug, Clone, PartialEq, Default, Facet)]
1480#[facet(rename = "tfoot")]
1481pub struct Tfoot {
1482    /// Global attributes.
1483    #[facet(flatten, default)]
1484    pub attrs: GlobalAttrs,
1485    /// Rows.
1486    #[facet(default)]
1487    pub tr: Vec<Tr>,
1488}
1489
1490/// Table row.
1491#[derive(Debug, Clone, PartialEq, Default, Facet)]
1492#[facet(rename = "tr")]
1493pub struct Tr {
1494    /// Global attributes.
1495    #[facet(flatten, default)]
1496    pub attrs: GlobalAttrs,
1497    /// Header cells.
1498    #[facet(default)]
1499    pub th: Vec<Th>,
1500    /// Data cells.
1501    #[facet(default)]
1502    pub td: Vec<Td>,
1503}
1504
1505/// Table header cell.
1506#[derive(Debug, Clone, PartialEq, Default, Facet)]
1507#[facet(rename = "th")]
1508pub struct Th {
1509    /// Global attributes.
1510    #[facet(flatten, default)]
1511    pub attrs: GlobalAttrs,
1512    /// Number of columns spanned.
1513    #[facet(default)]
1514    pub colspan: Option<String>,
1515    /// Number of rows spanned.
1516    #[facet(default)]
1517    pub rowspan: Option<String>,
1518    /// Header scope.
1519    #[facet(default)]
1520    pub scope: Option<String>,
1521    /// Headers this cell relates to.
1522    #[facet(default)]
1523    pub headers: Option<String>,
1524    /// Abbreviation.
1525    #[facet(default)]
1526    pub abbr: Option<String>,
1527    /// Child elements.
1528    #[facet(xml::elements, default)]
1529    #[facet(recursive_type)]
1530    pub children: Vec<FlowContent>,
1531}
1532
1533/// Table data cell.
1534#[derive(Debug, Clone, PartialEq, Default, Facet)]
1535#[facet(rename = "td")]
1536pub struct Td {
1537    /// Global attributes.
1538    #[facet(flatten, default)]
1539    pub attrs: GlobalAttrs,
1540    /// Number of columns spanned.
1541    #[facet(default)]
1542    pub colspan: Option<String>,
1543    /// Number of rows spanned.
1544    #[facet(default)]
1545    pub rowspan: Option<String>,
1546    /// Headers this cell relates to.
1547    #[facet(default)]
1548    pub headers: Option<String>,
1549    /// Child elements.
1550    #[facet(xml::elements, default)]
1551    #[facet(recursive_type)]
1552    pub children: Vec<FlowContent>,
1553}
1554
1555// =============================================================================
1556// Form Elements
1557// =============================================================================
1558
1559/// Form.
1560#[derive(Debug, Clone, PartialEq, Default, Facet)]
1561#[facet(rename = "form")]
1562pub struct Form {
1563    /// Global attributes.
1564    #[facet(flatten, default)]
1565    pub attrs: GlobalAttrs,
1566    /// Form action URL.
1567    #[facet(default)]
1568    pub action: Option<String>,
1569    /// HTTP method.
1570    #[facet(default)]
1571    pub method: Option<String>,
1572    /// Encoding type.
1573    #[facet(default)]
1574    pub enctype: Option<String>,
1575    /// Target.
1576    #[facet(default)]
1577    pub target: Option<String>,
1578    /// Form name.
1579    #[facet(default)]
1580    pub name: Option<String>,
1581    /// Autocomplete.
1582    #[facet(default)]
1583    pub autocomplete: Option<String>,
1584    /// Disable validation.
1585    #[facet(default)]
1586    pub novalidate: Option<String>,
1587    /// Accept-charset.
1588    #[facet(default, rename = "accept-charset")]
1589    pub accept_charset: Option<String>,
1590    /// Child elements.
1591    #[facet(xml::elements, default)]
1592    #[facet(recursive_type)]
1593    pub children: Vec<FlowContent>,
1594}
1595
1596/// Input control.
1597#[derive(Debug, Clone, PartialEq, Default, Facet)]
1598#[facet(rename = "input")]
1599pub struct Input {
1600    /// Global attributes.
1601    #[facet(flatten, default)]
1602    pub attrs: GlobalAttrs,
1603    /// Input type.
1604    #[facet(default, rename = "type")]
1605    pub type_: Option<String>,
1606    /// Name.
1607    #[facet(default)]
1608    pub name: Option<String>,
1609    /// Value.
1610    #[facet(default)]
1611    pub value: Option<String>,
1612    /// Placeholder.
1613    #[facet(default)]
1614    pub placeholder: Option<String>,
1615    /// Required.
1616    #[facet(default)]
1617    pub required: Option<String>,
1618    /// Disabled.
1619    #[facet(default)]
1620    pub disabled: Option<String>,
1621    /// Readonly.
1622    #[facet(default)]
1623    pub readonly: Option<String>,
1624    /// Checked (for checkboxes/radios).
1625    #[facet(default)]
1626    pub checked: Option<String>,
1627    /// Autocomplete.
1628    #[facet(default)]
1629    pub autocomplete: Option<String>,
1630    /// Autofocus.
1631    #[facet(default)]
1632    pub autofocus: Option<String>,
1633    /// Min value.
1634    #[facet(default)]
1635    pub min: Option<String>,
1636    /// Max value.
1637    #[facet(default)]
1638    pub max: Option<String>,
1639    /// Step.
1640    #[facet(default)]
1641    pub step: Option<String>,
1642    /// Pattern.
1643    #[facet(default)]
1644    pub pattern: Option<String>,
1645    /// Size.
1646    #[facet(default)]
1647    pub size: Option<String>,
1648    /// Maxlength.
1649    #[facet(default)]
1650    pub maxlength: Option<String>,
1651    /// Minlength.
1652    #[facet(default)]
1653    pub minlength: Option<String>,
1654    /// Multiple values allowed.
1655    #[facet(default)]
1656    pub multiple: Option<String>,
1657    /// Accept (for file inputs).
1658    #[facet(default)]
1659    pub accept: Option<String>,
1660    /// Alt text (for image inputs).
1661    #[facet(default)]
1662    pub alt: Option<String>,
1663    /// Src (for image inputs).
1664    #[facet(default)]
1665    pub src: Option<String>,
1666    /// Width (for image inputs).
1667    #[facet(default)]
1668    pub width: Option<String>,
1669    /// Height (for image inputs).
1670    #[facet(default)]
1671    pub height: Option<String>,
1672    /// List datalist reference.
1673    #[facet(default)]
1674    pub list: Option<String>,
1675    /// Form override.
1676    #[facet(default)]
1677    pub form: Option<String>,
1678    /// Form action override.
1679    #[facet(default)]
1680    pub formaction: Option<String>,
1681    /// Form method override.
1682    #[facet(default)]
1683    pub formmethod: Option<String>,
1684    /// Form enctype override.
1685    #[facet(default)]
1686    pub formenctype: Option<String>,
1687    /// Form target override.
1688    #[facet(default)]
1689    pub formtarget: Option<String>,
1690    /// Form novalidate override.
1691    #[facet(default)]
1692    pub formnovalidate: Option<String>,
1693}
1694
1695/// Button.
1696#[derive(Debug, Clone, PartialEq, Default, Facet)]
1697#[facet(rename = "button")]
1698pub struct Button {
1699    /// Global attributes.
1700    #[facet(flatten, default)]
1701    pub attrs: GlobalAttrs,
1702    /// Button type.
1703    #[facet(default, rename = "type")]
1704    pub type_: Option<String>,
1705    /// Name.
1706    #[facet(default)]
1707    pub name: Option<String>,
1708    /// Value.
1709    #[facet(default)]
1710    pub value: Option<String>,
1711    /// Disabled.
1712    #[facet(default)]
1713    pub disabled: Option<String>,
1714    /// Autofocus.
1715    #[facet(default)]
1716    pub autofocus: Option<String>,
1717    /// Form override.
1718    #[facet(default)]
1719    pub form: Option<String>,
1720    /// Form action override.
1721    #[facet(default)]
1722    pub formaction: Option<String>,
1723    /// Form method override.
1724    #[facet(default)]
1725    pub formmethod: Option<String>,
1726    /// Form enctype override.
1727    #[facet(default)]
1728    pub formenctype: Option<String>,
1729    /// Form target override.
1730    #[facet(default)]
1731    pub formtarget: Option<String>,
1732    /// Form novalidate override.
1733    #[facet(default)]
1734    pub formnovalidate: Option<String>,
1735    /// Child elements.
1736    #[facet(xml::elements, default)]
1737    #[facet(recursive_type)]
1738    pub children: Vec<PhrasingContent>,
1739}
1740
1741/// Select dropdown.
1742#[derive(Debug, Clone, PartialEq, Default, Facet)]
1743#[facet(rename = "select")]
1744pub struct Select {
1745    /// Global attributes.
1746    #[facet(flatten, default)]
1747    pub attrs: GlobalAttrs,
1748    /// Name.
1749    #[facet(default)]
1750    pub name: Option<String>,
1751    /// Multiple selection.
1752    #[facet(default)]
1753    pub multiple: Option<String>,
1754    /// Size (visible options).
1755    #[facet(default)]
1756    pub size: Option<String>,
1757    /// Required.
1758    #[facet(default)]
1759    pub required: Option<String>,
1760    /// Disabled.
1761    #[facet(default)]
1762    pub disabled: Option<String>,
1763    /// Autofocus.
1764    #[facet(default)]
1765    pub autofocus: Option<String>,
1766    /// Autocomplete.
1767    #[facet(default)]
1768    pub autocomplete: Option<String>,
1769    /// Form override.
1770    #[facet(default)]
1771    pub form: Option<String>,
1772    /// Options.
1773    #[facet(default)]
1774    pub option: Vec<OptionElement>,
1775    /// Option groups.
1776    #[facet(default)]
1777    pub optgroup: Vec<Optgroup>,
1778}
1779
1780/// Option in a select.
1781#[derive(Debug, Clone, PartialEq, Default, Facet)]
1782#[facet(rename = "option")]
1783pub struct OptionElement {
1784    /// Global attributes.
1785    #[facet(flatten, default)]
1786    pub attrs: GlobalAttrs,
1787    /// Value.
1788    #[facet(default)]
1789    pub value: Option<String>,
1790    /// Selected.
1791    #[facet(default)]
1792    pub selected: Option<String>,
1793    /// Disabled.
1794    #[facet(default)]
1795    pub disabled: Option<String>,
1796    /// Label.
1797    #[facet(default)]
1798    pub label: Option<String>,
1799    /// Text content.
1800    #[facet(xml::text, default)]
1801    pub text: String,
1802}
1803
1804/// Option group.
1805#[derive(Debug, Clone, PartialEq, Default, Facet)]
1806#[facet(rename = "optgroup")]
1807pub struct Optgroup {
1808    /// Global attributes.
1809    #[facet(flatten, default)]
1810    pub attrs: GlobalAttrs,
1811    /// Label.
1812    #[facet(default)]
1813    pub label: Option<String>,
1814    /// Disabled.
1815    #[facet(default)]
1816    pub disabled: Option<String>,
1817    /// Options.
1818    #[facet(default)]
1819    pub option: Vec<OptionElement>,
1820}
1821
1822/// Textarea.
1823#[derive(Debug, Clone, PartialEq, Default, Facet)]
1824#[facet(rename = "textarea")]
1825pub struct Textarea {
1826    /// Global attributes.
1827    #[facet(flatten, default)]
1828    pub attrs: GlobalAttrs,
1829    /// Name.
1830    #[facet(default)]
1831    pub name: Option<String>,
1832    /// Rows.
1833    #[facet(default)]
1834    pub rows: Option<String>,
1835    /// Cols.
1836    #[facet(default)]
1837    pub cols: Option<String>,
1838    /// Placeholder.
1839    #[facet(default)]
1840    pub placeholder: Option<String>,
1841    /// Required.
1842    #[facet(default)]
1843    pub required: Option<String>,
1844    /// Disabled.
1845    #[facet(default)]
1846    pub disabled: Option<String>,
1847    /// Readonly.
1848    #[facet(default)]
1849    pub readonly: Option<String>,
1850    /// Autofocus.
1851    #[facet(default)]
1852    pub autofocus: Option<String>,
1853    /// Autocomplete.
1854    #[facet(default)]
1855    pub autocomplete: Option<String>,
1856    /// Maxlength.
1857    #[facet(default)]
1858    pub maxlength: Option<String>,
1859    /// Minlength.
1860    #[facet(default)]
1861    pub minlength: Option<String>,
1862    /// Wrap.
1863    #[facet(default)]
1864    pub wrap: Option<String>,
1865    /// Form override.
1866    #[facet(default)]
1867    pub form: Option<String>,
1868    /// Text content.
1869    #[facet(xml::text, default)]
1870    pub text: String,
1871}
1872
1873/// Form label.
1874#[derive(Debug, Clone, PartialEq, Default, Facet)]
1875#[facet(rename = "label")]
1876pub struct Label {
1877    /// Global attributes.
1878    #[facet(flatten, default)]
1879    pub attrs: GlobalAttrs,
1880    /// Associated control ID.
1881    #[facet(default, rename = "for")]
1882    pub for_: Option<String>,
1883    /// Child elements.
1884    #[facet(xml::elements, default)]
1885    #[facet(recursive_type)]
1886    pub children: Vec<PhrasingContent>,
1887}
1888
1889/// Fieldset grouping.
1890#[derive(Debug, Clone, PartialEq, Default, Facet)]
1891#[facet(rename = "fieldset")]
1892pub struct Fieldset {
1893    /// Global attributes.
1894    #[facet(flatten, default)]
1895    pub attrs: GlobalAttrs,
1896    /// Name.
1897    #[facet(default)]
1898    pub name: Option<String>,
1899    /// Disabled.
1900    #[facet(default)]
1901    pub disabled: Option<String>,
1902    /// Form override.
1903    #[facet(default)]
1904    pub form: Option<String>,
1905    /// Legend.
1906    #[facet(default)]
1907    pub legend: Option<Legend>,
1908    /// Child elements.
1909    #[facet(xml::elements, default)]
1910    #[facet(recursive_type)]
1911    pub children: Vec<FlowContent>,
1912}
1913
1914/// Fieldset legend.
1915#[derive(Debug, Clone, PartialEq, Default, Facet)]
1916#[facet(rename = "legend")]
1917pub struct Legend {
1918    /// Global attributes.
1919    #[facet(flatten, default)]
1920    pub attrs: GlobalAttrs,
1921    /// Child elements.
1922    #[facet(xml::elements, default)]
1923    #[facet(recursive_type)]
1924    pub children: Vec<PhrasingContent>,
1925}
1926
1927/// Datalist.
1928#[derive(Debug, Clone, PartialEq, Default, Facet)]
1929#[facet(rename = "datalist")]
1930pub struct Datalist {
1931    /// Global attributes.
1932    #[facet(flatten, default)]
1933    pub attrs: GlobalAttrs,
1934    /// Options.
1935    #[facet(default)]
1936    pub option: Vec<OptionElement>,
1937}
1938
1939/// Output.
1940#[derive(Debug, Clone, PartialEq, Default, Facet)]
1941#[facet(rename = "output")]
1942pub struct Output {
1943    /// Global attributes.
1944    #[facet(flatten, default)]
1945    pub attrs: GlobalAttrs,
1946    /// Associated controls.
1947    #[facet(default, rename = "for")]
1948    pub for_: Option<String>,
1949    /// Name.
1950    #[facet(default)]
1951    pub name: Option<String>,
1952    /// Form override.
1953    #[facet(default)]
1954    pub form: Option<String>,
1955    /// Child elements.
1956    #[facet(xml::elements, default)]
1957    #[facet(recursive_type)]
1958    pub children: Vec<PhrasingContent>,
1959}
1960
1961/// Progress indicator.
1962#[derive(Debug, Clone, PartialEq, Default, Facet)]
1963#[facet(rename = "progress")]
1964pub struct Progress {
1965    /// Global attributes.
1966    #[facet(flatten, default)]
1967    pub attrs: GlobalAttrs,
1968    /// Current value.
1969    #[facet(default)]
1970    pub value: Option<String>,
1971    /// Maximum value.
1972    #[facet(default)]
1973    pub max: Option<String>,
1974    /// Fallback content.
1975    #[facet(xml::elements, default)]
1976    #[facet(recursive_type)]
1977    pub children: Vec<PhrasingContent>,
1978}
1979
1980/// Meter/gauge.
1981#[derive(Debug, Clone, PartialEq, Default, Facet)]
1982#[facet(rename = "meter")]
1983pub struct Meter {
1984    /// Global attributes.
1985    #[facet(flatten, default)]
1986    pub attrs: GlobalAttrs,
1987    /// Current value.
1988    #[facet(default)]
1989    pub value: Option<String>,
1990    /// Minimum value.
1991    #[facet(default)]
1992    pub min: Option<String>,
1993    /// Maximum value.
1994    #[facet(default)]
1995    pub max: Option<String>,
1996    /// Low threshold.
1997    #[facet(default)]
1998    pub low: Option<String>,
1999    /// High threshold.
2000    #[facet(default)]
2001    pub high: Option<String>,
2002    /// Optimum value.
2003    #[facet(default)]
2004    pub optimum: Option<String>,
2005    /// Fallback content.
2006    #[facet(xml::elements, default)]
2007    #[facet(recursive_type)]
2008    pub children: Vec<PhrasingContent>,
2009}
2010
2011// =============================================================================
2012// Interactive Elements
2013// =============================================================================
2014
2015/// Details disclosure widget.
2016#[derive(Debug, Clone, PartialEq, Default, Facet)]
2017#[facet(rename = "details")]
2018pub struct Details {
2019    /// Global attributes.
2020    #[facet(flatten, default)]
2021    pub attrs: GlobalAttrs,
2022    /// Open state.
2023    #[facet(default)]
2024    pub open: Option<String>,
2025    /// Summary.
2026    #[facet(default)]
2027    pub summary: Option<Summary>,
2028    /// Child elements.
2029    #[facet(xml::elements, default)]
2030    #[facet(recursive_type)]
2031    pub children: Vec<FlowContent>,
2032}
2033
2034/// Details summary.
2035#[derive(Debug, Clone, PartialEq, Default, Facet)]
2036#[facet(rename = "summary")]
2037pub struct Summary {
2038    /// Global attributes.
2039    #[facet(flatten, default)]
2040    pub attrs: GlobalAttrs,
2041    /// Child elements.
2042    #[facet(xml::elements, default)]
2043    #[facet(recursive_type)]
2044    pub children: Vec<PhrasingContent>,
2045}
2046
2047/// Dialog box.
2048#[derive(Debug, Clone, PartialEq, Default, Facet)]
2049#[facet(rename = "dialog")]
2050pub struct Dialog {
2051    /// Global attributes.
2052    #[facet(flatten, default)]
2053    pub attrs: GlobalAttrs,
2054    /// Open state.
2055    #[facet(default)]
2056    pub open: Option<String>,
2057    /// Child elements.
2058    #[facet(xml::elements, default)]
2059    #[facet(recursive_type)]
2060    pub children: Vec<FlowContent>,
2061}
2062
2063// =============================================================================
2064// Scripting Elements
2065// =============================================================================
2066
2067/// Script.
2068#[derive(Debug, Clone, PartialEq, Default, Facet)]
2069#[facet(rename = "script")]
2070pub struct Script {
2071    /// Global attributes.
2072    #[facet(flatten, default)]
2073    pub attrs: GlobalAttrs,
2074    /// Script URL.
2075    #[facet(default)]
2076    pub src: Option<String>,
2077    /// MIME type.
2078    #[facet(default, rename = "type")]
2079    pub type_: Option<String>,
2080    /// Async loading.
2081    #[facet(default, rename = "async")]
2082    pub async_: Option<String>,
2083    /// Defer loading.
2084    #[facet(default)]
2085    pub defer: Option<String>,
2086    /// Crossorigin.
2087    #[facet(default)]
2088    pub crossorigin: Option<String>,
2089    /// Integrity hash.
2090    #[facet(default)]
2091    pub integrity: Option<String>,
2092    /// Referrer policy.
2093    #[facet(default)]
2094    pub referrerpolicy: Option<String>,
2095    /// Nomodule flag.
2096    #[facet(default)]
2097    pub nomodule: Option<String>,
2098    /// Inline script content.
2099    #[facet(default)]
2100    pub text: String,
2101}
2102
2103/// Noscript fallback.
2104#[derive(Debug, Clone, PartialEq, Default, Facet)]
2105#[facet(rename = "noscript")]
2106pub struct Noscript {
2107    /// Global attributes.
2108    #[facet(flatten, default)]
2109    pub attrs: GlobalAttrs,
2110    /// Child elements.
2111    #[facet(xml::elements, default)]
2112    #[facet(recursive_type)]
2113    pub children: Vec<FlowContent>,
2114}
2115
2116/// Template.
2117#[derive(Debug, Clone, PartialEq, Default, Facet)]
2118#[facet(rename = "template")]
2119pub struct Template {
2120    /// Global attributes.
2121    #[facet(flatten, default)]
2122    pub attrs: GlobalAttrs,
2123    /// Child elements.
2124    #[facet(xml::elements, default)]
2125    #[facet(recursive_type)]
2126    pub children: Vec<FlowContent>,
2127}
2128
2129/// Slot for web components.
2130#[derive(Debug, Clone, PartialEq, Default, Facet)]
2131#[facet(rename = "slot")]
2132pub struct Slot {
2133    /// Global attributes.
2134    #[facet(flatten, default)]
2135    pub attrs: GlobalAttrs,
2136    /// Slot name.
2137    #[facet(default)]
2138    pub name: Option<String>,
2139    /// Child elements.
2140    #[facet(xml::elements, default)]
2141    #[facet(recursive_type)]
2142    pub children: Vec<FlowContent>,
2143}
2144
2145// =============================================================================
2146// Content Categories (Enums for mixed content)
2147// =============================================================================
2148
2149/// Flow content - most block and inline elements.
2150#[derive(Debug, Clone, PartialEq, Facet)]
2151#[repr(u8)]
2152#[allow(clippy::large_enum_variant)] // DOM-like structures naturally have large variants
2153pub enum FlowContent {
2154    /// Text node (for mixed content).
2155    #[facet(rename = "_text")]
2156    Text(String),
2157
2158    // Sections
2159    /// Header element.
2160    #[facet(rename = "header")]
2161    Header(Header),
2162    /// Footer element.
2163    #[facet(rename = "footer")]
2164    Footer(Footer),
2165    /// Main element.
2166    #[facet(rename = "main")]
2167    Main(Main),
2168    /// Article element.
2169    #[facet(rename = "article")]
2170    Article(Article),
2171    /// Section element.
2172    #[facet(rename = "section")]
2173    Section(Section),
2174    /// Nav element.
2175    #[facet(rename = "nav")]
2176    Nav(Nav),
2177    /// Aside element.
2178    #[facet(rename = "aside")]
2179    Aside(Aside),
2180    /// Address element.
2181    #[facet(rename = "address")]
2182    Address(Address),
2183
2184    // Headings
2185    /// H1 element.
2186    #[facet(rename = "h1")]
2187    H1(H1),
2188    /// H2 element.
2189    #[facet(rename = "h2")]
2190    H2(H2),
2191    /// H3 element.
2192    #[facet(rename = "h3")]
2193    H3(H3),
2194    /// H4 element.
2195    #[facet(rename = "h4")]
2196    H4(H4),
2197    /// H5 element.
2198    #[facet(rename = "h5")]
2199    H5(H5),
2200    /// H6 element.
2201    #[facet(rename = "h6")]
2202    H6(H6),
2203
2204    // Grouping
2205    /// P element.
2206    #[facet(rename = "p")]
2207    P(P),
2208    /// Div element.
2209    #[facet(rename = "div")]
2210    Div(Div),
2211    /// Pre element.
2212    #[facet(rename = "pre")]
2213    Pre(Pre),
2214    /// Blockquote element.
2215    #[facet(rename = "blockquote")]
2216    Blockquote(Blockquote),
2217    /// Ol element.
2218    #[facet(rename = "ol")]
2219    Ol(Ol),
2220    /// Ul element.
2221    #[facet(rename = "ul")]
2222    Ul(Ul),
2223    /// Dl element.
2224    #[facet(rename = "dl")]
2225    Dl(Dl),
2226    /// Figure element.
2227    #[facet(rename = "figure")]
2228    Figure(Figure),
2229    /// Hr element.
2230    #[facet(rename = "hr")]
2231    Hr(Hr),
2232
2233    // Phrasing (inline)
2234    /// A element.
2235    #[facet(rename = "a")]
2236    A(A),
2237    /// Span element.
2238    #[facet(rename = "span")]
2239    Span(Span),
2240    /// Em element.
2241    #[facet(rename = "em")]
2242    Em(Em),
2243    /// Strong element.
2244    #[facet(rename = "strong")]
2245    Strong(Strong),
2246    /// Code element.
2247    #[facet(rename = "code")]
2248    Code(Code),
2249    /// Img element.
2250    #[facet(rename = "img")]
2251    Img(Img),
2252    /// Br element.
2253    #[facet(rename = "br")]
2254    Br(Br),
2255
2256    // Tables
2257    /// Table element.
2258    #[facet(rename = "table")]
2259    Table(Table),
2260
2261    // Forms
2262    /// Form element.
2263    #[facet(rename = "form")]
2264    Form(Form),
2265    /// Input element.
2266    #[facet(rename = "input")]
2267    Input(Input),
2268    /// Button element.
2269    #[facet(rename = "button")]
2270    Button(Button),
2271    /// Select element.
2272    #[facet(rename = "select")]
2273    Select(Select),
2274    /// Textarea element.
2275    #[facet(rename = "textarea")]
2276    Textarea(Textarea),
2277    /// Label element.
2278    #[facet(rename = "label")]
2279    Label(Label),
2280    /// Fieldset element.
2281    #[facet(rename = "fieldset")]
2282    Fieldset(Fieldset),
2283
2284    // Interactive
2285    /// Details element.
2286    #[facet(rename = "details")]
2287    Details(Details),
2288    /// Dialog element.
2289    #[facet(rename = "dialog")]
2290    Dialog(Dialog),
2291
2292    // Embedded
2293    /// Iframe element.
2294    #[facet(rename = "iframe")]
2295    Iframe(Iframe),
2296    /// Video element.
2297    #[facet(rename = "video")]
2298    Video(Video),
2299    /// Audio element.
2300    #[facet(rename = "audio")]
2301    Audio(Audio),
2302    /// Picture element.
2303    #[facet(rename = "picture")]
2304    Picture(Picture),
2305    /// Canvas element.
2306    #[facet(rename = "canvas")]
2307    Canvas(Canvas),
2308    /// Svg element.
2309    #[facet(rename = "svg")]
2310    Svg(Svg),
2311
2312    // Scripting
2313    /// Script element.
2314    #[facet(rename = "script")]
2315    Script(Script),
2316    /// Noscript element.
2317    #[facet(rename = "noscript")]
2318    Noscript(Noscript),
2319    /// Template element.
2320    #[facet(rename = "template")]
2321    Template(Template),
2322}
2323
2324/// Phrasing content - inline elements and text.
2325#[derive(Debug, Clone, PartialEq, Facet)]
2326#[repr(u8)]
2327#[allow(clippy::large_enum_variant)] // DOM-like structures naturally have large variants
2328pub enum PhrasingContent {
2329    /// Text node (for mixed content).
2330    #[facet(rename = "_text")]
2331    Text(String),
2332    /// A element.
2333    #[facet(rename = "a")]
2334    A(A),
2335    /// Span element.
2336    #[facet(rename = "span")]
2337    Span(Span),
2338    /// Em element.
2339    #[facet(rename = "em")]
2340    Em(Em),
2341    /// Strong element.
2342    #[facet(rename = "strong")]
2343    Strong(Strong),
2344    /// Small element.
2345    #[facet(rename = "small")]
2346    Small(Small),
2347    /// S element.
2348    #[facet(rename = "s")]
2349    S(S),
2350    /// Cite element.
2351    #[facet(rename = "cite")]
2352    Cite(Cite),
2353    /// Q element.
2354    #[facet(rename = "q")]
2355    Q(Q),
2356    /// Dfn element.
2357    #[facet(rename = "dfn")]
2358    Dfn(Dfn),
2359    /// Abbr element.
2360    #[facet(rename = "abbr")]
2361    Abbr(Abbr),
2362    /// Data element.
2363    #[facet(rename = "data")]
2364    Data(Data),
2365    /// Time element.
2366    #[facet(rename = "time")]
2367    Time(Time),
2368    /// Code element.
2369    #[facet(rename = "code")]
2370    Code(Code),
2371    /// Var element.
2372    #[facet(rename = "var")]
2373    Var(Var),
2374    /// Samp element.
2375    #[facet(rename = "samp")]
2376    Samp(Samp),
2377    /// Kbd element.
2378    #[facet(rename = "kbd")]
2379    Kbd(Kbd),
2380    /// Sub element.
2381    #[facet(rename = "sub")]
2382    Sub(Sub),
2383    /// Sup element.
2384    #[facet(rename = "sup")]
2385    Sup(Sup),
2386    /// I element.
2387    #[facet(rename = "i")]
2388    I(I),
2389    /// B element.
2390    #[facet(rename = "b")]
2391    B(B),
2392    /// U element.
2393    #[facet(rename = "u")]
2394    U(U),
2395    /// Mark element.
2396    #[facet(rename = "mark")]
2397    Mark(Mark),
2398    /// Bdi element.
2399    #[facet(rename = "bdi")]
2400    Bdi(Bdi),
2401    /// Bdo element.
2402    #[facet(rename = "bdo")]
2403    Bdo(Bdo),
2404    /// Br element.
2405    #[facet(rename = "br")]
2406    Br(Br),
2407    /// Wbr element.
2408    #[facet(rename = "wbr")]
2409    Wbr(Wbr),
2410    /// Img element.
2411    #[facet(rename = "img")]
2412    Img(Img),
2413    /// Input element.
2414    #[facet(rename = "input")]
2415    Input(Input),
2416    /// Button element.
2417    #[facet(rename = "button")]
2418    Button(Button),
2419    /// Select element.
2420    #[facet(rename = "select")]
2421    Select(Select),
2422    /// Textarea element.
2423    #[facet(rename = "textarea")]
2424    Textarea(Textarea),
2425    /// Label element.
2426    #[facet(rename = "label")]
2427    Label(Label),
2428    /// Output element.
2429    #[facet(rename = "output")]
2430    Output(Output),
2431    /// Progress element.
2432    #[facet(rename = "progress")]
2433    Progress(Progress),
2434    /// Meter element.
2435    #[facet(rename = "meter")]
2436    Meter(Meter),
2437    /// Script element.
2438    #[facet(rename = "script")]
2439    Script(Script),
2440}