diff --git a/packages/react-native/ReactCommon/react/renderer/css/CSSTokenizer.h b/packages/react-native/ReactCommon/react/renderer/css/CSSTokenizer.h index c5e28c75e6e..487a09cf06e 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/CSSTokenizer.h +++ b/packages/react-native/ReactCommon/react/renderer/css/CSSTokenizer.h @@ -163,7 +163,9 @@ class CSSTokenizer { int32_t exponentSign = 1.0; int32_t exponentPart = 0; - if (peek() == 'e' || peek() == 'E') { + if ((peek() == 'e' || peek() == 'E') && + (isDigit(peek(1)) || + ((peek(1) == '+' || peek(1) == '-') && isDigit(peek(2))))) { advance(); if (peek() == '+' || peek() == '-') { if (peek() == '-') { diff --git a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSLengthTest.cpp b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSLengthTest.cpp index c991ba5197b..d7346c5ffc2 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSLengthTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSLengthTest.cpp @@ -44,6 +44,11 @@ TEST(CSSLength, length_values) { auto pctValue = parseCSSProperty("-40%"); EXPECT_TRUE(std::holds_alternative(pctValue)); + + auto negativeValue = parseCSSProperty("-20em"); + EXPECT_TRUE(std::holds_alternative(negativeValue)); + EXPECT_EQ(std::get(negativeValue).value, -20.0f); + EXPECT_EQ(std::get(negativeValue).unit, CSSLengthUnit::Em); } TEST(CSSLength, parse_constexpr) { diff --git a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSTokenizerTest.cpp b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSTokenizerTest.cpp index 3d44b58f9f4..cfcc7b59c97 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSTokenizerTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSTokenizerTest.cpp @@ -112,6 +112,11 @@ TEST(CSSTokenizer, dimension_values) { ".3xyz", CSSToken{CSSTokenType::Dimension, 0.3, "xyz"}, CSSToken{CSSTokenType::EndOfFile}); + + EXPECT_TOKENS( + "-0.5em", + CSSToken{CSSTokenType::Dimension, -0.5, "em"}, + CSSToken{CSSTokenType::EndOfFile}); } TEST(CSSTokenizer, percent_values) {