Skip to content

Commit c5f4782

Browse files
committed
Support lab(), lch(), oklab(), and oklch() colors in the native CSS parser
Implements the remaining CSS Color 4 Lab-family color functions in the Fabric CSS color parser, following the spec: modern syntax only, percentage references, <hue> units, the `none` keyword for missing components, and parse-time clamping of lightness and chroma. Colors outside of sRGB are gamut mapped with the CSS Color 4 OKLCh chroma-reduction algorithm rather than clipped per channel, which preserves lightness and hue.
1 parent 5e6b108 commit c5f4782

11 files changed

Lines changed: 885 additions & 17 deletions

‎packages/react-native/ReactCommon/react/renderer/css/CSSColorFunction.h‎

Lines changed: 408 additions & 2 deletions
Large diffs are not rendered by default.

‎packages/react-native/ReactCommon/react/renderer/css/tests/CSSColorTest.cpp‎

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,180 @@ TEST(CSSColor, hwb_values) {
483483
EXPECT_TRUE(std::holds_alternative<std::monostate>(valueEndingWithComma));
484484
}
485485

486+
namespace {
487+
488+
void expectColor(std::string_view input, int r, int g, int b, int a) {
489+
auto value = parseCSSProperty<CSSColor>(input);
490+
ASSERT_TRUE(std::holds_alternative<CSSColor>(value)) << input;
491+
EXPECT_EQ(static_cast<int>(std::get<CSSColor>(value).r), r) << input;
492+
EXPECT_EQ(static_cast<int>(std::get<CSSColor>(value).g), g) << input;
493+
EXPECT_EQ(static_cast<int>(std::get<CSSColor>(value).b), b) << input;
494+
EXPECT_EQ(static_cast<int>(std::get<CSSColor>(value).a), a) << input;
495+
}
496+
497+
void expectInvalid(std::string_view input) {
498+
EXPECT_TRUE(
499+
std::holds_alternative<std::monostate>(parseCSSProperty<CSSColor>(input)))
500+
<< input;
501+
}
502+
503+
} // namespace
504+
505+
// Expected values in the lab(), lch(), oklab(), and oklch() tests match the
506+
// CSS Color 4 reference conversions and gamut mapping, as implemented by the
507+
// ColorAide library (https://github.com/facelessuser/coloraide).
508+
509+
TEST(CSSColor, oklch_values) {
510+
expectColor("oklch(0.628 0.2577 29.23)", 255, 0, 0, 255);
511+
expectColor("oklch(1 0 0)", 255, 255, 255, 255);
512+
expectColor("oklch(0 0 0)", 0, 0, 0, 255);
513+
expectColor("oklch(0.5 0 0)", 99, 99, 99, 255);
514+
515+
// Tailwind CSS v4 palette: blue-500, green-500, orange-500
516+
expectColor("oklch(62.3% 0.214 259.815)", 43, 127, 255, 255);
517+
expectColor("oklch(72.3% 0.219 149.579)", 0, 201, 80, 255);
518+
expectColor("oklch(70.5% 0.213 47.604)", 255, 105, 0, 255);
519+
520+
// 100% lightness is 1, and 100% chroma is 0.4
521+
expectColor("oklch(50% 50% 180)", 0, 119, 102, 255);
522+
523+
expectColor("OKLCH(0.7 0.1 30)", 213, 134, 121, 255);
524+
expectColor(" oklch( 0.7 0.1 30 /0.5 ) ", 213, 134, 121, 128);
525+
}
526+
527+
TEST(CSSColor, oklch_hue_values) {
528+
expectColor("oklch(0.7 0.1 30)", 213, 134, 121, 255);
529+
expectColor("oklch(0.7 0.1 30deg)", 213, 134, 121, 255);
530+
expectColor("oklch(0.7 0.1 0.5236rad)", 213, 134, 121, 255);
531+
expectColor("oklch(0.7 0.1 33.3333grad)", 213, 134, 121, 255);
532+
expectColor("oklch(0.7 0.1 0.083333turn)", 213, 134, 121, 255);
533+
expectColor("oklch(0.7 0.1 390)", 213, 134, 121, 255);
534+
expectColor("oklch(0.7 0.1 -330)", 213, 134, 121, 255);
535+
536+
// Hue has no effect on an achromatic color
537+
expectColor("oklch(0.5 0 180)", 99, 99, 99, 255);
538+
}
539+
540+
TEST(CSSColor, oklab_values) {
541+
expectColor("oklab(0.5 0.1 -0.1)", 129, 69, 154, 255);
542+
expectColor("oklab(0.62796 0.22486 0.12585)", 255, 0, 0, 255);
543+
expectColor("oklab(1 0 0)", 255, 255, 255, 255);
544+
545+
// 100% lightness is 1, and 100% of a and b is 0.4
546+
expectColor("oklab(50% 25% -25%)", 129, 69, 154, 255);
547+
548+
expectColor("Oklab(0.5 0.1 -0.1 / 0.5)", 129, 69, 154, 128);
549+
}
550+
551+
TEST(CSSColor, lab_values) {
552+
expectColor("lab(50 0 0)", 119, 119, 119, 255);
553+
expectColor("lab(100 0 0)", 255, 255, 255, 255);
554+
expectColor("lab(0 0 0)", 0, 0, 0, 255);
555+
expectColor("lab(54.29 80.8 69.89)", 255, 0, 0, 255);
556+
expectColor("lab(50 40 30)", 187, 88, 70, 255);
557+
558+
// 100% lightness is 100, and 100% of a and b is 125
559+
expectColor("lab(50% 40% 20%)", 199, 76, 80, 255);
560+
561+
expectColor("LAB(50 40 30)", 187, 88, 70, 255);
562+
}
563+
564+
TEST(CSSColor, lch_values) {
565+
expectColor("lch(50 0 0)", 119, 119, 119, 255);
566+
expectColor("lch(54.29 106.84 40.85)", 255, 0, 0, 255);
567+
expectColor("lch(50 60 120)", 84, 132, 4, 255);
568+
569+
// 100% lightness is 100, and 100% chroma is 150
570+
expectColor("lch(50% 40% 90)", 137, 118, 0, 255);
571+
572+
expectColor("lch(50 60 120deg / 25%)", 84, 132, 4, 64);
573+
}
574+
575+
TEST(CSSColor, lab_family_alpha_values) {
576+
expectColor("oklch(0.7 0.1 30 / 0.5)", 213, 134, 121, 128);
577+
expectColor("oklch(0.7 0.1 30 / 50%)", 213, 134, 121, 128);
578+
expectColor("oklch(0.7 0.1 30 / 1.5)", 213, 134, 121, 255);
579+
expectColor("oklch(0.7 0.1 30 / -0.5)", 213, 134, 121, 0);
580+
}
581+
582+
TEST(CSSColor, lab_family_none_components) {
583+
// A missing component resolves to zero
584+
expectColor("oklch(none 0.1 30)", 0, 0, 0, 255);
585+
expectColor("oklch(0.7 none 30)", 158, 158, 158, 255);
586+
expectColor("oklch(0.5 0 none)", 99, 99, 99, 255);
587+
expectColor("oklch(0.7 0.1 30 / none)", 213, 134, 121, 0);
588+
expectColor("oklab(0.5 none none)", 99, 99, 99, 255);
589+
expectColor("lab(50 none 30)", 132, 118, 67, 255);
590+
expectColor("lch(50 60 none)", 206, 63, 122, 255);
591+
}
592+
593+
TEST(CSSColor, lab_family_clamped_components) {
594+
// Lightness is clamped to [0%, 100%]
595+
expectColor("oklch(1.5 0.1 30)", 255, 255, 255, 255);
596+
expectColor("oklch(150% 0.1 30)", 255, 255, 255, 255);
597+
expectColor("oklch(-0.5 0.1 30)", 0, 0, 0, 255);
598+
expectColor("lab(150 0 0)", 255, 255, 255, 255);
599+
expectColor("lab(-10 0 0)", 0, 0, 0, 255);
600+
601+
// Negative chroma is clamped to zero
602+
expectColor("oklch(0.5 -0.1 30)", 99, 99, 99, 255);
603+
expectColor("lch(50 -60 120)", 119, 119, 119, 255);
604+
}
605+
606+
TEST(CSSColor, lab_family_gamut_mapping) {
607+
// Colors outside of sRGB reduce chroma until clipping is imperceptible,
608+
// preserving lightness and hue. Clipping each channel on its own would
609+
// instead give rgb(255, 0, 0) for this orange.
610+
expectColor("oklab(0.7 0.4 0.4)", 255, 97, 0, 255);
611+
expectColor("oklch(0.7 0.4 145)", 0, 195, 0, 255);
612+
expectColor("oklch(0.9 0.3 100)", 255, 223, 0, 255);
613+
expectColor("lab(50 150 -150)", 184, 100, 255, 255);
614+
expectColor("lch(50 200 300)", 30, 143, 255, 255);
615+
616+
// Extreme chroma still converges
617+
expectColor("oklch(0.5 10000000000 30)", 195, 0, 0, 255);
618+
expectColor("lch(50 1000000 30)", 255, 255, 255, 255);
619+
}
620+
621+
TEST(CSSColor, lab_family_invalid_values) {
622+
// No legacy comma-separated syntax
623+
expectInvalid("oklch(0.7, 0.1, 30)");
624+
expectInvalid("oklab(0.5, 0.1, -0.1)");
625+
expectInvalid("lab(50, 40, 30)");
626+
expectInvalid("lch(50, 60, 120)");
627+
628+
// Wrong number of components
629+
expectInvalid("oklch()");
630+
expectInvalid("oklch(0.7)");
631+
expectInvalid("oklch(0.7 0.1)");
632+
expectInvalid("oklab(0.5 0.1)");
633+
expectInvalid("lab(50 40)");
634+
expectInvalid("oklch(0.7 0.1 30 / 0.5 0.5)");
635+
636+
// Alpha must follow a solidus
637+
expectInvalid("oklch(0.7 0.1 30 0.5)");
638+
expectInvalid("oklab(0.5 0.1 -0.1 0.5)");
639+
expectInvalid("oklch(0.7 0.1 30 /)");
640+
641+
// Stray commas
642+
expectInvalid("oklch(0.7 0.1 30,)");
643+
expectInvalid("oklch(,0.7 0.1 30)");
644+
expectInvalid("lab(50 40 30 / 0.5,)");
645+
646+
// Components of the wrong type
647+
expectInvalid("oklch(30deg 0.1 30)");
648+
expectInvalid("oklch(0.7 0.1deg 30)");
649+
expectInvalid("oklch(0.7 0.1 30%)");
650+
expectInvalid("oklch(0.7 0.1 auto)");
651+
expectInvalid("oklch(0.7 0.1 30 / 30deg)");
652+
expectInvalid("oklab(0.5 0.1 30deg)");
653+
expectInvalid("lch(50 60deg 120)");
654+
expectInvalid("lch(50 60 120%)");
655+
656+
// A hue which overflows when converted to degrees
657+
expectInvalid("oklch(0.7 0.1 1e38rad)");
658+
}
659+
486660
TEST(CSSColor, constexpr_values) {
487661
[[maybe_unused]] constexpr auto emptyValue = parseCSSProperty<CSSColor>("");
488662

‎scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api‎

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5865,6 +5865,10 @@ enum facebook::react::CSSAngleUnit : uint8_t {
58655865
Turn,
58665866
}
58675867

5868+
enum facebook::react::CSSColorNoneKeyword : std::underlying_type_t<facebook::react::CSSKeyword> {
5869+
None,
5870+
}
5871+
58685872
enum facebook::react::CSSDelimiter {
58695873
Comma,
58705874
CommaOrWhitespace,
@@ -10063,19 +10067,26 @@ bool facebook::react::HostPlatformViewTraitsInitializer::formsView(const faceboo
1006310067
bool facebook::react::HostPlatformViewTraitsInitializer::isKeyboardFocusable(const facebook::react::ViewProps& viewProps);
1006410068

1006510069

10066-
const char* facebook::react::exceptions::gUnexpectedNativeTypeExceptionClass;
10067-
template <typename T>
10068-
void facebook::react::exceptions::throwIfObjectAlreadyConsumed(const T& t, const char* msg);
10069-
10070-
10070+
bool facebook::react::detail::isInSrgbGamut(const std::array<double, 3>& srgb);
1007110071
constexpr bool facebook::react::detail::isHexDigit(char c);
1007210072
constexpr bool facebook::react::detail::isValidHexColor(std::string_view hex);
1007310073
constexpr float facebook::react::detail::hueToRgb(float p, float q, float t);
10074+
constexpr float facebook::react::detail::labLightnessReference(facebook::react::detail::CSSLabColorSpace colorSpace);
10075+
constexpr std::array<double, 3> facebook::react::detail::multiplyMatrix3(const std::array<std::array<double, 3>, 3>& matrix, const std::array<double, 3>& vector);
1007410076
constexpr std::optional<float> facebook::react::detail::normalizeNumberComponent(const std::variant<std::monostate, facebook::react::CSSNumber>& component);
1007510077
constexpr uint8_t facebook::react::detail::clamp255Component(float f);
1007610078
constexpr uint8_t facebook::react::detail::clampAlpha(std::optional<float> alpha);
1007710079
constexpr uint8_t facebook::react::detail::hexToNumeric(std::string_view hex, facebook::react::detail::HexColorType hexType);
10080+
double facebook::react::detail::deltaEOK(const std::array<double, 3>& reference, const std::array<double, 3>& sample);
1007810081
float facebook::react::detail::normalizeHue(float hue);
10082+
std::array<double, 3> facebook::react::detail::clipToSrgbGamut(const std::array<double, 3>& srgb);
10083+
std::array<double, 3> facebook::react::detail::gamutMapOklabToSrgb(const std::array<double, 3>& oklab);
10084+
std::array<double, 3> facebook::react::detail::labColorSpaceToOklab(facebook::react::detail::CSSLabColorSpace colorSpace, double lightness, double a, double b);
10085+
std::array<double, 3> facebook::react::detail::labToOklab(double l, double a, double b);
10086+
std::array<double, 3> facebook::react::detail::oklabToSrgb(const std::array<double, 3>& oklab);
10087+
std::array<double, 3> facebook::react::detail::oklabToXyzD65(const std::array<double, 3>& oklab);
10088+
std::array<double, 3> facebook::react::detail::srgbToOklab(const std::array<double, 3>& srgb);
10089+
std::array<double, 3> facebook::react::detail::xyzD65ToOklab(const std::array<double, 3>& xyz);
1007910090
std::optional<float> facebook::react::detail::normalizeHueComponent(const std::variant<std::monostate, facebook::react::CSSNumber, facebook::react::CSSAngle>& component);
1008010091
std::tuple<uint8_t, uint8_t, uint8_t> facebook::react::detail::hslToRgb(float h, float s, float l);
1008110092
std::tuple<uint8_t, uint8_t, uint8_t> facebook::react::detail::hwbToRgb(float h, float w, float b);
@@ -10088,24 +10099,40 @@ constexpr std::optional<facebook::react::CSSColor> facebook::react::detail::pars
1008810099
template <typename CSSColor>
1008910100
constexpr std::optional<facebook::react::CSSColor> facebook::react::detail::parseRgbFunction(facebook::react::CSSValueParser& parser);
1009010101
template <typename CSSColor>
10102+
facebook::react::CSSColor facebook::react::detail::oklabToCSSColor(const std::array<double, 3>& oklab, uint8_t alpha);
10103+
template <typename CSSColor>
1009110104
std::optional<facebook::react::CSSColor> facebook::react::detail::parseHslFunction(facebook::react::CSSValueParser& parser);
1009210105
template <typename CSSColor>
1009310106
std::optional<facebook::react::CSSColor> facebook::react::detail::parseHwbFunction(facebook::react::CSSValueParser& parser);
1009410107
template <typename CSSColor>
10108+
std::optional<facebook::react::CSSColor> facebook::react::detail::parseLabFunction(facebook::react::CSSValueParser& parser, facebook::react::detail::CSSLabColorSpace colorSpace);
10109+
template <typename CSSColor>
10110+
std::optional<facebook::react::CSSColor> facebook::react::detail::parseLchFunction(facebook::react::CSSValueParser& parser, facebook::react::detail::CSSLabColorSpace colorSpace);
10111+
template <typename CSSColor>
1009510112
std::optional<facebook::react::CSSColor> facebook::react::detail::parseLegacyHslFunction(facebook::react::CSSValueParser& parser);
1009610113
template <typename CSSColor>
1009710114
std::optional<facebook::react::CSSColor> facebook::react::detail::parseModernHslFunction(facebook::react::CSSValueParser& parser);
10115+
template <typename ComponentVariantT>
10116+
constexpr std::optional<float> facebook::react::detail::normalizeComponentOrNone(const ComponentVariantT& component, float percentReference);
10117+
template <typename ComponentVariantT>
10118+
constexpr std::optional<float> facebook::react::detail::normalizeHueDegreesOrNone(const ComponentVariantT& component);
1009810119
template <typename T, typename C>
1009910120
C facebook::react::detail::memberFunctionClass(T C::*);
1010010121
template <typename... ComponentT>
1010110122
constexpr std::optional<float> facebook::react::detail::normalizeComponent(const std::variant<std::monostate, ComponentT...>& component, float baseValue);
10123+
uint8_t facebook::react::detail::parseSolidusAlphaComponent(facebook::react::CSSValueParser& parser);
1010210124

1010310125
class facebook::react::detail::OwnedBytesBuffer : public facebook::jsi::MutableBuffer {
1010410126
public OwnedBytesBuffer(std::vector<uint8_t> bytes) noexcept;
1010510127
public virtual size_t size() const override;
1010610128
public virtual uint8_t* data() override;
1010710129
}
1010810130

10131+
enum facebook::react::detail::CSSLabColorSpace {
10132+
CIELab,
10133+
OKLab,
10134+
}
10135+
1010910136
enum facebook::react::detail::HexColorType {
1011010137
Long,
1011110138
Short,
@@ -10491,6 +10518,11 @@ template <typename T>
1049110518
concept facebook::react::detail::css::keywords::hasWrapReverse = (CSSKeywordSet<T> && requires() { T::WrapReverse; });
1049210519

1049310520

10521+
const char* facebook::react::exceptions::gUnexpectedNativeTypeExceptionClass;
10522+
template <typename T>
10523+
void facebook::react::exceptions::throwIfObjectAlreadyConsumed(const T& t, const char* msg);
10524+
10525+
1049410526
constexpr facebook::react::Color facebook::react::HostPlatformColor::UndefinedColor;
1049510527

1049610528

‎scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api‎

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5675,6 +5675,10 @@ enum facebook::react::CSSAngleUnit : uint8_t {
56755675
Turn,
56765676
}
56775677

5678+
enum facebook::react::CSSColorNoneKeyword : std::underlying_type_t<facebook::react::CSSKeyword> {
5679+
None,
5680+
}
5681+
56785682
enum facebook::react::CSSDelimiter {
56795683
Comma,
56805684
CommaOrWhitespace,
@@ -9679,19 +9683,26 @@ bool facebook::react::HostPlatformViewTraitsInitializer::formsView(const faceboo
96799683
bool facebook::react::HostPlatformViewTraitsInitializer::isKeyboardFocusable(const facebook::react::ViewProps& viewProps);
96809684

96819685

9682-
const char* facebook::react::exceptions::gUnexpectedNativeTypeExceptionClass;
9683-
template <typename T>
9684-
void facebook::react::exceptions::throwIfObjectAlreadyConsumed(const T& t, const char* msg);
9685-
9686-
9686+
bool facebook::react::detail::isInSrgbGamut(const std::array<double, 3>& srgb);
96879687
constexpr bool facebook::react::detail::isHexDigit(char c);
96889688
constexpr bool facebook::react::detail::isValidHexColor(std::string_view hex);
96899689
constexpr float facebook::react::detail::hueToRgb(float p, float q, float t);
9690+
constexpr float facebook::react::detail::labLightnessReference(facebook::react::detail::CSSLabColorSpace colorSpace);
9691+
constexpr std::array<double, 3> facebook::react::detail::multiplyMatrix3(const std::array<std::array<double, 3>, 3>& matrix, const std::array<double, 3>& vector);
96909692
constexpr std::optional<float> facebook::react::detail::normalizeNumberComponent(const std::variant<std::monostate, facebook::react::CSSNumber>& component);
96919693
constexpr uint8_t facebook::react::detail::clamp255Component(float f);
96929694
constexpr uint8_t facebook::react::detail::clampAlpha(std::optional<float> alpha);
96939695
constexpr uint8_t facebook::react::detail::hexToNumeric(std::string_view hex, facebook::react::detail::HexColorType hexType);
9696+
double facebook::react::detail::deltaEOK(const std::array<double, 3>& reference, const std::array<double, 3>& sample);
96949697
float facebook::react::detail::normalizeHue(float hue);
9698+
std::array<double, 3> facebook::react::detail::clipToSrgbGamut(const std::array<double, 3>& srgb);
9699+
std::array<double, 3> facebook::react::detail::gamutMapOklabToSrgb(const std::array<double, 3>& oklab);
9700+
std::array<double, 3> facebook::react::detail::labColorSpaceToOklab(facebook::react::detail::CSSLabColorSpace colorSpace, double lightness, double a, double b);
9701+
std::array<double, 3> facebook::react::detail::labToOklab(double l, double a, double b);
9702+
std::array<double, 3> facebook::react::detail::oklabToSrgb(const std::array<double, 3>& oklab);
9703+
std::array<double, 3> facebook::react::detail::oklabToXyzD65(const std::array<double, 3>& oklab);
9704+
std::array<double, 3> facebook::react::detail::srgbToOklab(const std::array<double, 3>& srgb);
9705+
std::array<double, 3> facebook::react::detail::xyzD65ToOklab(const std::array<double, 3>& xyz);
96959706
std::optional<float> facebook::react::detail::normalizeHueComponent(const std::variant<std::monostate, facebook::react::CSSNumber, facebook::react::CSSAngle>& component);
96969707
std::tuple<uint8_t, uint8_t, uint8_t> facebook::react::detail::hslToRgb(float h, float s, float l);
96979708
std::tuple<uint8_t, uint8_t, uint8_t> facebook::react::detail::hwbToRgb(float h, float w, float b);
@@ -9704,24 +9715,40 @@ constexpr std::optional<facebook::react::CSSColor> facebook::react::detail::pars
97049715
template <typename CSSColor>
97059716
constexpr std::optional<facebook::react::CSSColor> facebook::react::detail::parseRgbFunction(facebook::react::CSSValueParser& parser);
97069717
template <typename CSSColor>
9718+
facebook::react::CSSColor facebook::react::detail::oklabToCSSColor(const std::array<double, 3>& oklab, uint8_t alpha);
9719+
template <typename CSSColor>
97079720
std::optional<facebook::react::CSSColor> facebook::react::detail::parseHslFunction(facebook::react::CSSValueParser& parser);
97089721
template <typename CSSColor>
97099722
std::optional<facebook::react::CSSColor> facebook::react::detail::parseHwbFunction(facebook::react::CSSValueParser& parser);
97109723
template <typename CSSColor>
9724+
std::optional<facebook::react::CSSColor> facebook::react::detail::parseLabFunction(facebook::react::CSSValueParser& parser, facebook::react::detail::CSSLabColorSpace colorSpace);
9725+
template <typename CSSColor>
9726+
std::optional<facebook::react::CSSColor> facebook::react::detail::parseLchFunction(facebook::react::CSSValueParser& parser, facebook::react::detail::CSSLabColorSpace colorSpace);
9727+
template <typename CSSColor>
97119728
std::optional<facebook::react::CSSColor> facebook::react::detail::parseLegacyHslFunction(facebook::react::CSSValueParser& parser);
97129729
template <typename CSSColor>
97139730
std::optional<facebook::react::CSSColor> facebook::react::detail::parseModernHslFunction(facebook::react::CSSValueParser& parser);
9731+
template <typename ComponentVariantT>
9732+
constexpr std::optional<float> facebook::react::detail::normalizeComponentOrNone(const ComponentVariantT& component, float percentReference);
9733+
template <typename ComponentVariantT>
9734+
constexpr std::optional<float> facebook::react::detail::normalizeHueDegreesOrNone(const ComponentVariantT& component);
97149735
template <typename T, typename C>
97159736
C facebook::react::detail::memberFunctionClass(T C::*);
97169737
template <typename... ComponentT>
97179738
constexpr std::optional<float> facebook::react::detail::normalizeComponent(const std::variant<std::monostate, ComponentT...>& component, float baseValue);
9739+
uint8_t facebook::react::detail::parseSolidusAlphaComponent(facebook::react::CSSValueParser& parser);
97189740

97199741
class facebook::react::detail::OwnedBytesBuffer : public facebook::jsi::MutableBuffer {
97209742
public OwnedBytesBuffer(std::vector<uint8_t> bytes) noexcept;
97219743
public virtual size_t size() const override;
97229744
public virtual uint8_t* data() override;
97239745
}
97249746

9747+
enum facebook::react::detail::CSSLabColorSpace {
9748+
CIELab,
9749+
OKLab,
9750+
}
9751+
97259752
enum facebook::react::detail::HexColorType {
97269753
Long,
97279754
Short,
@@ -10107,6 +10134,11 @@ template <typename T>
1010710134
concept facebook::react::detail::css::keywords::hasWrapReverse = (CSSKeywordSet<T> && requires() { T::WrapReverse; });
1010810135

1010910136

10137+
const char* facebook::react::exceptions::gUnexpectedNativeTypeExceptionClass;
10138+
template <typename T>
10139+
void facebook::react::exceptions::throwIfObjectAlreadyConsumed(const T& t, const char* msg);
10140+
10141+
1011010142
constexpr facebook::react::Color facebook::react::HostPlatformColor::UndefinedColor;
1011110143

1011210144

0 commit comments

Comments
 (0)