diff --git a/src/grammar/rules.pest b/src/grammar/rules.pest
index 3d91f3a..c4fbffd 100644
--- a/src/grammar/rules.pest
+++ b/src/grammar/rules.pest
@@ -42,7 +42,8 @@ comment_if_end = _{ chevron_left_bang ~ "[" ~ ^"endif" ~ "]" ~ comment_tag_end }
attr = { attr_key ~ (equal ~ WSP* ~ (attr_non_quoted | attr_quoted ))? }
attr_quoted = ${PUSH(quote) ~ attr_value ~ POP }
attr_non_quoted = @{ !quote ~ (!(WSP | chevron_right) ~ ANY)* }
-attr_key = { WSP* ~ ASCII_ALPHA ~ text_chars* ~ WSP* }
+attr_key = { WSP* ~ attr_key_start ~ text_chars* ~ WSP* }
+attr_key_start = _{ ASCII_ALPHA | "@" | ":" }
attr_value = { WSP* ~ (!PEEK ~ ANY)* ~ WSP* }
//
diff --git a/tests/element_attributes.rs b/tests/element_attributes.rs
index 2994111..bd2a3f9 100644
--- a/tests/element_attributes.rs
+++ b/tests/element_attributes.rs
@@ -29,6 +29,15 @@ fn it_can_parse_attribute_key_mixed_case_symbols() -> Result<()> {
assert_json_snapshot!(dom);
Ok(())
}
+
+#[test]
+fn it_can_parse_vue_style_attribute_shorthand() -> Result<()> {
+ let html = "