diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs
index cc0e3c3..51ecdb5 100644
--- a/maud_macros/src/parse.rs
+++ b/maud_macros/src/parse.rs
@@ -557,10 +557,21 @@ impl<'cx, 'a, 'i> Parser<'cx, 'a, 'i> {
             },
             _ => return Err(FatalError),
         };
-        while let [minus!(), ident!(_, name), ..] = *self.input {
-            self.shift(2);
-            s.push('-');
-            s.push_str(&name.name.as_str());
+        let mut expect_ident = false;
+        loop {
+            expect_ident = match *self.input {
+                [minus!(), ..] => {
+                    self.shift(1);
+                    s.push('-');
+                    true
+                },
+                [ident!(_, name), ..] if expect_ident => {
+                    self.shift(1);
+                    s.push_str(&name.name.as_str());
+                    false
+                },
+                _ => break,
+            };
         }
         Ok(s)
     }
diff --git a/maud_macros/tests/basic_syntax.rs b/maud_macros/tests/basic_syntax.rs
index 949b5d4..28c080c 100644
--- a/maud_macros/tests/basic_syntax.rs
+++ b/maud_macros/tests/basic_syntax.rs
@@ -130,6 +130,13 @@ fn classes_shorthand() {
     assert_eq!(s, r#"<p>Hi, <span class="name here">Lyra</span>!</p>"#);
 }
 
+#[test]
+fn hyphens_in_class_names() {
+    let mut s = String::new();
+    html!(s, p.rocks-these.are--my--rocks "yes").unwrap();
+    assert_eq!(s, r#"<p class="rocks-these are--my--rocks">yes</p>"#);
+}
+
 #[test]
 fn ids_shorthand() {
     let mut s = String::new();