diff --git a/responsive.go b/responsive.go index a24640a..6a580a4 100644 --- a/responsive.go +++ b/responsive.go @@ -212,6 +212,9 @@ func (r *Responsive) renderWithPath(ctx *Context, path string) string { keys := slices.Collect(maps.Keys(r.attrs)) slices.Sort(keys) for _, key := range keys { + if key == "data-variant" { + continue + } b.WriteByte(' ') b.WriteString(escapeHTML(key)) b.WriteString(`="`) diff --git a/responsive_test.go b/responsive_test.go index 6e12857..8fca329 100644 --- a/responsive_test.go +++ b/responsive_test.go @@ -158,6 +158,26 @@ func TestResponsive_Attributes(t *testing.T) { } } +func TestResponsive_ReservedVariantAttributeIsIgnored(t *testing.T) { + ctx := NewContext() + r := Attr(NewResponsive(). + Variant("desktop", NewLayout("C").C(Raw("main"))), + "data-variant", "override", + ) + + got := r.Render(ctx) + + if count := strings.Count(got, `data-variant=`); count != 1 { + t.Fatalf("responsive wrapper should emit exactly one data-variant attribute, got %d in:\n%s", count, got) + } + if !strings.Contains(got, `data-variant="desktop"`) { + t.Fatalf("responsive wrapper should preserve its own variant name, got:\n%s", got) + } + if strings.Contains(got, `data-variant="override"`) { + t.Fatalf("responsive wrapper should ignore reserved data-variant attrs, got:\n%s", got) + } +} + func TestVariantSelector(t *testing.T) { tests := []struct { name string