diff --git a/packages/yew-macro/src/html_tree/html_element.rs b/packages/yew-macro/src/html_tree/html_element.rs index a1aadbda7e2..62b5fd231fe 100644 --- a/packages/yew-macro/src/html_tree/html_element.rs +++ b/packages/yew-macro/src/html_tree/html_element.rs @@ -370,17 +370,19 @@ impl ToTokens for HtmlElement { tokens.extend(match &name { TagName::Lit(dashedname) => { let name_span = dashedname.span(); - let name = dashedname.to_ascii_lowercase_string(); + let name = dashedname.to_string(); + let lowercase_name = dashedname.to_ascii_lowercase_string(); if !is_normalised_element_name(&dashedname.to_string()) { emit_warning!( name_span.clone(), format!( - "The tag '{dashedname}' is not matching its normalized form '{name}'. If you want \ + "The tag '{dashedname}' is not matching its normalized form '{lowercase_name}'. If you want \ to keep this form, change this to a dynamic tag `@{{\"{dashedname}\"}}`." ) ) } - let node = match &*name { + // Use lowercase for compile-time checks but preserve original casing in output + let node = match &*lowercase_name { "input" => { let value = value(); let checked = checked(); diff --git a/packages/yew/src/virtual_dom/vtag.rs b/packages/yew/src/virtual_dom/vtag.rs index 96875e0ae38..33021d9dcfa 100644 --- a/packages/yew/src/virtual_dom/vtag.rs +++ b/packages/yew/src/virtual_dom/vtag.rs @@ -158,8 +158,9 @@ impl VTag { /// Creates a new [VTag] instance with `tag` name (cannot be changed later in DOM). pub fn new(tag: impl Into) -> Self { let tag = tag.into(); + let lowercase_tag = tag.to_ascii_lowercase(); Self::new_base( - match &*tag.to_ascii_lowercase() { + match &*lowercase_tag { "input" => VTagInner::Input(Default::default()), "textarea" => VTagInner::Textarea(Default::default()), _ => VTagInner::Other { @@ -537,7 +538,8 @@ mod feat_ssr { let _ = w.write_str(""); } VTagInner::Other { tag, children } => { - if !VOID_ELEMENTS.contains(&tag.as_ref()) { + let lowercase_tag = tag.to_ascii_lowercase(); + if !VOID_ELEMENTS.contains(&lowercase_tag.as_ref()) { children .render_into_stream(w, parent_scope, hydratable, tag.into()) .await;