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;