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