
#include <AK/Array.h>
#include <LibJS/Runtime/NativeFunction.h>
#include <LibJS/Runtime/Object.h>
#include <LibJS/Runtime/PrimitiveString.h>
#include <LibJS/Runtime/ValueInlines.h>
#include <AK/Utf16String.h>
#include <LibWeb/Bindings/ExceptionOrUtils.h>
#include <LibWeb/Bindings/MainThreadVM.h>
#include <LibWeb/CSS/GeneratedCSSStyleProperties.h>
#include <LibWeb/CSS/CSSStyleProperties.h>
#include <LibWeb/HTML/Scripting/SimilarOriginWindowAgent.h>
#include <LibWeb/WebIDL/AbstractOperations.h>
#include <LibWeb/WebIDL/ExceptionOr.h>

namespace Web::Bindings {

namespace {

JS::ThrowCompletionOr<CSS::CSSStyleProperties*> impl_from(JS::VM& vm, JS::Value value)
{
    if (auto impl = value.as_if<CSS::CSSStyleProperties>())
        return impl.ptr();
    return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "CSSStyleProperties");
}

JS::ThrowCompletionOr<CSS::CSSStyleProperties*> impl_from(JS::VM& vm)
{
    auto this_value = vm.this_value();
    if (this_value.is_nullish())
        this_value = &vm.current_realm()->global_object();
    return impl_from(vm, this_value);
}

GC::Ref<JS::NativeFunction> create_getter(JS::Realm& realm, Utf16FlyString const& attribute_name, Utf16FlyString property_name)
{
    auto getter = [property_name = move(property_name)](JS::VM& vm) -> JS::ThrowCompletionOr<JS::Value> {
        auto* idl_object = TRY(impl_from(vm));

        auto result = TRY(throw_dom_exception_if_needed(vm, [&] {
            return idl_object->get_property_value(property_name);
        }));
        return JS::PrimitiveString::create(vm, Utf16String::from_utf8(result));
    };

    return JS::NativeFunction::create(realm, move(getter), 0, JS::PropertyKey { attribute_name }, &realm, "get"sv);
}

GC::Ref<JS::NativeFunction> create_setter(JS::Realm& realm, Utf16FlyString const& attribute_name, Utf16FlyString property_name)
{
    auto setter = [property_name = move(property_name)](JS::VM& vm) -> JS::ThrowCompletionOr<JS::Value> {
        auto* idl_object = TRY(impl_from(vm));

        auto value = vm.argument(0);
        String idl_value;
        if (!value.is_null())
            idl_value = TRY(WebIDL::to_string(vm, value));

        auto original_steps = [&]() -> JS::ThrowCompletionOr<JS::Value> {
            TRY(throw_dom_exception_if_needed(vm, [&] {
                return idl_object->set_property(property_name, idl_value, ""sv);
            }));
            return JS::js_undefined();
        };

        // For [CEReactions]: https://html.spec.whatwg.org/multipage/custom-elements.html#cereactions
        auto& reactions_stack = HTML::relevant_similar_origin_window_agent(*idl_object).custom_element_reactions_stack;
        reactions_stack.element_queue_stack.append({});

        auto value_or_exception = original_steps();

        auto queue = reactions_stack.element_queue_stack.take_last();
        Bindings::invoke_custom_element_reactions(queue);

        if (value_or_exception.is_error())
            return value_or_exception.release_error();
        return value_or_exception.release_value();
    };

    return JS::NativeFunction::create(realm, move(setter), 1, JS::PropertyKey { attribute_name }, &realm, "set"sv);
}

}

void GeneratedCSSStyleProperties::initialize(JS::Realm& realm, JS::Object& object)
{
    [[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable | JS::Attribute::Configurable | JS::Attribute::Writable;

    struct Property {
        StringView attribute_name;
        StringView property_name;
    };

    static constexpr auto properties = Array {
        Property { "MozAppearance"sv, "-moz-appearance"sv },
        Property { "-moz-appearance"sv, "-moz-appearance"sv },
        Property { "WebkitAlignContent"sv, "-webkit-align-content"sv },
        Property { "webkitAlignContent"sv, "-webkit-align-content"sv },
        Property { "-webkit-align-content"sv, "-webkit-align-content"sv },
        Property { "WebkitAlignItems"sv, "-webkit-align-items"sv },
        Property { "webkitAlignItems"sv, "-webkit-align-items"sv },
        Property { "-webkit-align-items"sv, "-webkit-align-items"sv },
        Property { "WebkitAlignSelf"sv, "-webkit-align-self"sv },
        Property { "webkitAlignSelf"sv, "-webkit-align-self"sv },
        Property { "-webkit-align-self"sv, "-webkit-align-self"sv },
        Property { "WebkitAnimation"sv, "-webkit-animation"sv },
        Property { "webkitAnimation"sv, "-webkit-animation"sv },
        Property { "-webkit-animation"sv, "-webkit-animation"sv },
        Property { "WebkitAnimationDelay"sv, "-webkit-animation-delay"sv },
        Property { "webkitAnimationDelay"sv, "-webkit-animation-delay"sv },
        Property { "-webkit-animation-delay"sv, "-webkit-animation-delay"sv },
        Property { "WebkitAnimationDirection"sv, "-webkit-animation-direction"sv },
        Property { "webkitAnimationDirection"sv, "-webkit-animation-direction"sv },
        Property { "-webkit-animation-direction"sv, "-webkit-animation-direction"sv },
        Property { "WebkitAnimationDuration"sv, "-webkit-animation-duration"sv },
        Property { "webkitAnimationDuration"sv, "-webkit-animation-duration"sv },
        Property { "-webkit-animation-duration"sv, "-webkit-animation-duration"sv },
        Property { "WebkitAnimationFillMode"sv, "-webkit-animation-fill-mode"sv },
        Property { "webkitAnimationFillMode"sv, "-webkit-animation-fill-mode"sv },
        Property { "-webkit-animation-fill-mode"sv, "-webkit-animation-fill-mode"sv },
        Property { "WebkitAnimationIterationCount"sv, "-webkit-animation-iteration-count"sv },
        Property { "webkitAnimationIterationCount"sv, "-webkit-animation-iteration-count"sv },
        Property { "-webkit-animation-iteration-count"sv, "-webkit-animation-iteration-count"sv },
        Property { "WebkitAnimationName"sv, "-webkit-animation-name"sv },
        Property { "webkitAnimationName"sv, "-webkit-animation-name"sv },
        Property { "-webkit-animation-name"sv, "-webkit-animation-name"sv },
        Property { "WebkitAnimationPlayState"sv, "-webkit-animation-play-state"sv },
        Property { "webkitAnimationPlayState"sv, "-webkit-animation-play-state"sv },
        Property { "-webkit-animation-play-state"sv, "-webkit-animation-play-state"sv },
        Property { "WebkitAnimationTimingFunction"sv, "-webkit-animation-timing-function"sv },
        Property { "webkitAnimationTimingFunction"sv, "-webkit-animation-timing-function"sv },
        Property { "-webkit-animation-timing-function"sv, "-webkit-animation-timing-function"sv },
        Property { "WebkitAppearance"sv, "-webkit-appearance"sv },
        Property { "webkitAppearance"sv, "-webkit-appearance"sv },
        Property { "-webkit-appearance"sv, "-webkit-appearance"sv },
        Property { "WebkitBackgroundClip"sv, "-webkit-background-clip"sv },
        Property { "webkitBackgroundClip"sv, "-webkit-background-clip"sv },
        Property { "-webkit-background-clip"sv, "-webkit-background-clip"sv },
        Property { "WebkitBackgroundOrigin"sv, "-webkit-background-origin"sv },
        Property { "webkitBackgroundOrigin"sv, "-webkit-background-origin"sv },
        Property { "-webkit-background-origin"sv, "-webkit-background-origin"sv },
        Property { "WebkitBackgroundSize"sv, "-webkit-background-size"sv },
        Property { "webkitBackgroundSize"sv, "-webkit-background-size"sv },
        Property { "-webkit-background-size"sv, "-webkit-background-size"sv },
        Property { "WebkitBorderBottomLeftRadius"sv, "-webkit-border-bottom-left-radius"sv },
        Property { "webkitBorderBottomLeftRadius"sv, "-webkit-border-bottom-left-radius"sv },
        Property { "-webkit-border-bottom-left-radius"sv, "-webkit-border-bottom-left-radius"sv },
        Property { "WebkitBorderBottomRightRadius"sv, "-webkit-border-bottom-right-radius"sv },
        Property { "webkitBorderBottomRightRadius"sv, "-webkit-border-bottom-right-radius"sv },
        Property { "-webkit-border-bottom-right-radius"sv, "-webkit-border-bottom-right-radius"sv },
        Property { "WebkitBorderRadius"sv, "-webkit-border-radius"sv },
        Property { "webkitBorderRadius"sv, "-webkit-border-radius"sv },
        Property { "-webkit-border-radius"sv, "-webkit-border-radius"sv },
        Property { "WebkitBorderTopLeftRadius"sv, "-webkit-border-top-left-radius"sv },
        Property { "webkitBorderTopLeftRadius"sv, "-webkit-border-top-left-radius"sv },
        Property { "-webkit-border-top-left-radius"sv, "-webkit-border-top-left-radius"sv },
        Property { "WebkitBorderTopRightRadius"sv, "-webkit-border-top-right-radius"sv },
        Property { "webkitBorderTopRightRadius"sv, "-webkit-border-top-right-radius"sv },
        Property { "-webkit-border-top-right-radius"sv, "-webkit-border-top-right-radius"sv },
        Property { "WebkitBoxAlign"sv, "-webkit-box-align"sv },
        Property { "webkitBoxAlign"sv, "-webkit-box-align"sv },
        Property { "-webkit-box-align"sv, "-webkit-box-align"sv },
        Property { "WebkitBoxFlex"sv, "-webkit-box-flex"sv },
        Property { "webkitBoxFlex"sv, "-webkit-box-flex"sv },
        Property { "-webkit-box-flex"sv, "-webkit-box-flex"sv },
        Property { "WebkitBoxOrdinalGroup"sv, "-webkit-box-ordinal-group"sv },
        Property { "webkitBoxOrdinalGroup"sv, "-webkit-box-ordinal-group"sv },
        Property { "-webkit-box-ordinal-group"sv, "-webkit-box-ordinal-group"sv },
        Property { "WebkitBoxOrient"sv, "-webkit-box-orient"sv },
        Property { "webkitBoxOrient"sv, "-webkit-box-orient"sv },
        Property { "-webkit-box-orient"sv, "-webkit-box-orient"sv },
        Property { "WebkitBoxPack"sv, "-webkit-box-pack"sv },
        Property { "webkitBoxPack"sv, "-webkit-box-pack"sv },
        Property { "-webkit-box-pack"sv, "-webkit-box-pack"sv },
        Property { "WebkitBoxShadow"sv, "-webkit-box-shadow"sv },
        Property { "webkitBoxShadow"sv, "-webkit-box-shadow"sv },
        Property { "-webkit-box-shadow"sv, "-webkit-box-shadow"sv },
        Property { "WebkitBoxSizing"sv, "-webkit-box-sizing"sv },
        Property { "webkitBoxSizing"sv, "-webkit-box-sizing"sv },
        Property { "-webkit-box-sizing"sv, "-webkit-box-sizing"sv },
        Property { "WebkitFilter"sv, "-webkit-filter"sv },
        Property { "webkitFilter"sv, "-webkit-filter"sv },
        Property { "-webkit-filter"sv, "-webkit-filter"sv },
        Property { "WebkitFlex"sv, "-webkit-flex"sv },
        Property { "webkitFlex"sv, "-webkit-flex"sv },
        Property { "-webkit-flex"sv, "-webkit-flex"sv },
        Property { "WebkitFlexBasis"sv, "-webkit-flex-basis"sv },
        Property { "webkitFlexBasis"sv, "-webkit-flex-basis"sv },
        Property { "-webkit-flex-basis"sv, "-webkit-flex-basis"sv },
        Property { "WebkitFlexDirection"sv, "-webkit-flex-direction"sv },
        Property { "webkitFlexDirection"sv, "-webkit-flex-direction"sv },
        Property { "-webkit-flex-direction"sv, "-webkit-flex-direction"sv },
        Property { "WebkitFlexFlow"sv, "-webkit-flex-flow"sv },
        Property { "webkitFlexFlow"sv, "-webkit-flex-flow"sv },
        Property { "-webkit-flex-flow"sv, "-webkit-flex-flow"sv },
        Property { "WebkitFlexGrow"sv, "-webkit-flex-grow"sv },
        Property { "webkitFlexGrow"sv, "-webkit-flex-grow"sv },
        Property { "-webkit-flex-grow"sv, "-webkit-flex-grow"sv },
        Property { "WebkitFlexShrink"sv, "-webkit-flex-shrink"sv },
        Property { "webkitFlexShrink"sv, "-webkit-flex-shrink"sv },
        Property { "-webkit-flex-shrink"sv, "-webkit-flex-shrink"sv },
        Property { "WebkitFlexWrap"sv, "-webkit-flex-wrap"sv },
        Property { "webkitFlexWrap"sv, "-webkit-flex-wrap"sv },
        Property { "-webkit-flex-wrap"sv, "-webkit-flex-wrap"sv },
        Property { "WebkitJustifyContent"sv, "-webkit-justify-content"sv },
        Property { "webkitJustifyContent"sv, "-webkit-justify-content"sv },
        Property { "-webkit-justify-content"sv, "-webkit-justify-content"sv },
        Property { "WebkitMask"sv, "-webkit-mask"sv },
        Property { "webkitMask"sv, "-webkit-mask"sv },
        Property { "-webkit-mask"sv, "-webkit-mask"sv },
        Property { "WebkitMaskClip"sv, "-webkit-mask-clip"sv },
        Property { "webkitMaskClip"sv, "-webkit-mask-clip"sv },
        Property { "-webkit-mask-clip"sv, "-webkit-mask-clip"sv },
        Property { "WebkitMaskComposite"sv, "-webkit-mask-composite"sv },
        Property { "webkitMaskComposite"sv, "-webkit-mask-composite"sv },
        Property { "-webkit-mask-composite"sv, "-webkit-mask-composite"sv },
        Property { "WebkitMaskImage"sv, "-webkit-mask-image"sv },
        Property { "webkitMaskImage"sv, "-webkit-mask-image"sv },
        Property { "-webkit-mask-image"sv, "-webkit-mask-image"sv },
        Property { "WebkitMaskOrigin"sv, "-webkit-mask-origin"sv },
        Property { "webkitMaskOrigin"sv, "-webkit-mask-origin"sv },
        Property { "-webkit-mask-origin"sv, "-webkit-mask-origin"sv },
        Property { "WebkitMaskPosition"sv, "-webkit-mask-position"sv },
        Property { "webkitMaskPosition"sv, "-webkit-mask-position"sv },
        Property { "-webkit-mask-position"sv, "-webkit-mask-position"sv },
        Property { "WebkitMaskRepeat"sv, "-webkit-mask-repeat"sv },
        Property { "webkitMaskRepeat"sv, "-webkit-mask-repeat"sv },
        Property { "-webkit-mask-repeat"sv, "-webkit-mask-repeat"sv },
        Property { "WebkitMaskSize"sv, "-webkit-mask-size"sv },
        Property { "webkitMaskSize"sv, "-webkit-mask-size"sv },
        Property { "-webkit-mask-size"sv, "-webkit-mask-size"sv },
        Property { "WebkitOrder"sv, "-webkit-order"sv },
        Property { "webkitOrder"sv, "-webkit-order"sv },
        Property { "-webkit-order"sv, "-webkit-order"sv },
        Property { "WebkitPerspective"sv, "-webkit-perspective"sv },
        Property { "webkitPerspective"sv, "-webkit-perspective"sv },
        Property { "-webkit-perspective"sv, "-webkit-perspective"sv },
        Property { "WebkitPerspectiveOrigin"sv, "-webkit-perspective-origin"sv },
        Property { "webkitPerspectiveOrigin"sv, "-webkit-perspective-origin"sv },
        Property { "-webkit-perspective-origin"sv, "-webkit-perspective-origin"sv },
        Property { "WebkitTextFillColor"sv, "-webkit-text-fill-color"sv },
        Property { "webkitTextFillColor"sv, "-webkit-text-fill-color"sv },
        Property { "-webkit-text-fill-color"sv, "-webkit-text-fill-color"sv },
        Property { "WebkitTransform"sv, "-webkit-transform"sv },
        Property { "webkitTransform"sv, "-webkit-transform"sv },
        Property { "-webkit-transform"sv, "-webkit-transform"sv },
        Property { "WebkitTransformOrigin"sv, "-webkit-transform-origin"sv },
        Property { "webkitTransformOrigin"sv, "-webkit-transform-origin"sv },
        Property { "-webkit-transform-origin"sv, "-webkit-transform-origin"sv },
        Property { "WebkitTransformStyle"sv, "-webkit-transform-style"sv },
        Property { "webkitTransformStyle"sv, "-webkit-transform-style"sv },
        Property { "-webkit-transform-style"sv, "-webkit-transform-style"sv },
        Property { "WebkitTransition"sv, "-webkit-transition"sv },
        Property { "webkitTransition"sv, "-webkit-transition"sv },
        Property { "-webkit-transition"sv, "-webkit-transition"sv },
        Property { "WebkitTransitionDelay"sv, "-webkit-transition-delay"sv },
        Property { "webkitTransitionDelay"sv, "-webkit-transition-delay"sv },
        Property { "-webkit-transition-delay"sv, "-webkit-transition-delay"sv },
        Property { "WebkitTransitionDuration"sv, "-webkit-transition-duration"sv },
        Property { "webkitTransitionDuration"sv, "-webkit-transition-duration"sv },
        Property { "-webkit-transition-duration"sv, "-webkit-transition-duration"sv },
        Property { "WebkitTransitionProperty"sv, "-webkit-transition-property"sv },
        Property { "webkitTransitionProperty"sv, "-webkit-transition-property"sv },
        Property { "-webkit-transition-property"sv, "-webkit-transition-property"sv },
        Property { "WebkitTransitionTimingFunction"sv, "-webkit-transition-timing-function"sv },
        Property { "webkitTransitionTimingFunction"sv, "-webkit-transition-timing-function"sv },
        Property { "-webkit-transition-timing-function"sv, "-webkit-transition-timing-function"sv },
        Property { "WebkitUserSelect"sv, "-webkit-user-select"sv },
        Property { "webkitUserSelect"sv, "-webkit-user-select"sv },
        Property { "-webkit-user-select"sv, "-webkit-user-select"sv },
        Property { "accentColor"sv, "accent-color"sv },
        Property { "accent-color"sv, "accent-color"sv },
        Property { "alignContent"sv, "align-content"sv },
        Property { "align-content"sv, "align-content"sv },
        Property { "alignItems"sv, "align-items"sv },
        Property { "align-items"sv, "align-items"sv },
        Property { "alignSelf"sv, "align-self"sv },
        Property { "align-self"sv, "align-self"sv },
        Property { "all"sv, "all"sv },
        Property { "anchorName"sv, "anchor-name"sv },
        Property { "anchor-name"sv, "anchor-name"sv },
        Property { "anchorScope"sv, "anchor-scope"sv },
        Property { "anchor-scope"sv, "anchor-scope"sv },
        Property { "animation"sv, "animation"sv },
        Property { "animationComposition"sv, "animation-composition"sv },
        Property { "animation-composition"sv, "animation-composition"sv },
        Property { "animationDelay"sv, "animation-delay"sv },
        Property { "animation-delay"sv, "animation-delay"sv },
        Property { "animationDirection"sv, "animation-direction"sv },
        Property { "animation-direction"sv, "animation-direction"sv },
        Property { "animationDuration"sv, "animation-duration"sv },
        Property { "animation-duration"sv, "animation-duration"sv },
        Property { "animationFillMode"sv, "animation-fill-mode"sv },
        Property { "animation-fill-mode"sv, "animation-fill-mode"sv },
        Property { "animationIterationCount"sv, "animation-iteration-count"sv },
        Property { "animation-iteration-count"sv, "animation-iteration-count"sv },
        Property { "animationName"sv, "animation-name"sv },
        Property { "animation-name"sv, "animation-name"sv },
        Property { "animationPlayState"sv, "animation-play-state"sv },
        Property { "animation-play-state"sv, "animation-play-state"sv },
        Property { "animationTimeline"sv, "animation-timeline"sv },
        Property { "animation-timeline"sv, "animation-timeline"sv },
        Property { "animationTimingFunction"sv, "animation-timing-function"sv },
        Property { "animation-timing-function"sv, "animation-timing-function"sv },
        Property { "appearance"sv, "appearance"sv },
        Property { "aspectRatio"sv, "aspect-ratio"sv },
        Property { "aspect-ratio"sv, "aspect-ratio"sv },
        Property { "backdropFilter"sv, "backdrop-filter"sv },
        Property { "backdrop-filter"sv, "backdrop-filter"sv },
        Property { "background"sv, "background"sv },
        Property { "backgroundAttachment"sv, "background-attachment"sv },
        Property { "background-attachment"sv, "background-attachment"sv },
        Property { "backgroundBlendMode"sv, "background-blend-mode"sv },
        Property { "background-blend-mode"sv, "background-blend-mode"sv },
        Property { "backgroundClip"sv, "background-clip"sv },
        Property { "background-clip"sv, "background-clip"sv },
        Property { "backgroundColor"sv, "background-color"sv },
        Property { "background-color"sv, "background-color"sv },
        Property { "backgroundImage"sv, "background-image"sv },
        Property { "background-image"sv, "background-image"sv },
        Property { "backgroundOrigin"sv, "background-origin"sv },
        Property { "background-origin"sv, "background-origin"sv },
        Property { "backgroundPosition"sv, "background-position"sv },
        Property { "background-position"sv, "background-position"sv },
        Property { "backgroundPositionX"sv, "background-position-x"sv },
        Property { "background-position-x"sv, "background-position-x"sv },
        Property { "backgroundPositionY"sv, "background-position-y"sv },
        Property { "background-position-y"sv, "background-position-y"sv },
        Property { "backgroundRepeat"sv, "background-repeat"sv },
        Property { "background-repeat"sv, "background-repeat"sv },
        Property { "backgroundSize"sv, "background-size"sv },
        Property { "background-size"sv, "background-size"sv },
        Property { "blockSize"sv, "block-size"sv },
        Property { "block-size"sv, "block-size"sv },
        Property { "border"sv, "border"sv },
        Property { "borderBlock"sv, "border-block"sv },
        Property { "border-block"sv, "border-block"sv },
        Property { "borderBlockColor"sv, "border-block-color"sv },
        Property { "border-block-color"sv, "border-block-color"sv },
        Property { "borderBlockEnd"sv, "border-block-end"sv },
        Property { "border-block-end"sv, "border-block-end"sv },
        Property { "borderBlockEndColor"sv, "border-block-end-color"sv },
        Property { "border-block-end-color"sv, "border-block-end-color"sv },
        Property { "borderBlockEndStyle"sv, "border-block-end-style"sv },
        Property { "border-block-end-style"sv, "border-block-end-style"sv },
        Property { "borderBlockEndWidth"sv, "border-block-end-width"sv },
        Property { "border-block-end-width"sv, "border-block-end-width"sv },
        Property { "borderBlockStart"sv, "border-block-start"sv },
        Property { "border-block-start"sv, "border-block-start"sv },
        Property { "borderBlockStartColor"sv, "border-block-start-color"sv },
        Property { "border-block-start-color"sv, "border-block-start-color"sv },
        Property { "borderBlockStartStyle"sv, "border-block-start-style"sv },
        Property { "border-block-start-style"sv, "border-block-start-style"sv },
        Property { "borderBlockStartWidth"sv, "border-block-start-width"sv },
        Property { "border-block-start-width"sv, "border-block-start-width"sv },
        Property { "borderBlockStyle"sv, "border-block-style"sv },
        Property { "border-block-style"sv, "border-block-style"sv },
        Property { "borderBlockWidth"sv, "border-block-width"sv },
        Property { "border-block-width"sv, "border-block-width"sv },
        Property { "borderBottom"sv, "border-bottom"sv },
        Property { "border-bottom"sv, "border-bottom"sv },
        Property { "borderBottomColor"sv, "border-bottom-color"sv },
        Property { "border-bottom-color"sv, "border-bottom-color"sv },
        Property { "borderBottomLeftRadius"sv, "border-bottom-left-radius"sv },
        Property { "border-bottom-left-radius"sv, "border-bottom-left-radius"sv },
        Property { "borderBottomRightRadius"sv, "border-bottom-right-radius"sv },
        Property { "border-bottom-right-radius"sv, "border-bottom-right-radius"sv },
        Property { "borderBottomStyle"sv, "border-bottom-style"sv },
        Property { "border-bottom-style"sv, "border-bottom-style"sv },
        Property { "borderBottomWidth"sv, "border-bottom-width"sv },
        Property { "border-bottom-width"sv, "border-bottom-width"sv },
        Property { "borderCollapse"sv, "border-collapse"sv },
        Property { "border-collapse"sv, "border-collapse"sv },
        Property { "borderColor"sv, "border-color"sv },
        Property { "border-color"sv, "border-color"sv },
        Property { "borderEndEndRadius"sv, "border-end-end-radius"sv },
        Property { "border-end-end-radius"sv, "border-end-end-radius"sv },
        Property { "borderEndStartRadius"sv, "border-end-start-radius"sv },
        Property { "border-end-start-radius"sv, "border-end-start-radius"sv },
        Property { "borderImage"sv, "border-image"sv },
        Property { "border-image"sv, "border-image"sv },
        Property { "borderImageOutset"sv, "border-image-outset"sv },
        Property { "border-image-outset"sv, "border-image-outset"sv },
        Property { "borderImageRepeat"sv, "border-image-repeat"sv },
        Property { "border-image-repeat"sv, "border-image-repeat"sv },
        Property { "borderImageSlice"sv, "border-image-slice"sv },
        Property { "border-image-slice"sv, "border-image-slice"sv },
        Property { "borderImageSource"sv, "border-image-source"sv },
        Property { "border-image-source"sv, "border-image-source"sv },
        Property { "borderImageWidth"sv, "border-image-width"sv },
        Property { "border-image-width"sv, "border-image-width"sv },
        Property { "borderInline"sv, "border-inline"sv },
        Property { "border-inline"sv, "border-inline"sv },
        Property { "borderInlineColor"sv, "border-inline-color"sv },
        Property { "border-inline-color"sv, "border-inline-color"sv },
        Property { "borderInlineEnd"sv, "border-inline-end"sv },
        Property { "border-inline-end"sv, "border-inline-end"sv },
        Property { "borderInlineEndColor"sv, "border-inline-end-color"sv },
        Property { "border-inline-end-color"sv, "border-inline-end-color"sv },
        Property { "borderInlineEndStyle"sv, "border-inline-end-style"sv },
        Property { "border-inline-end-style"sv, "border-inline-end-style"sv },
        Property { "borderInlineEndWidth"sv, "border-inline-end-width"sv },
        Property { "border-inline-end-width"sv, "border-inline-end-width"sv },
        Property { "borderInlineStart"sv, "border-inline-start"sv },
        Property { "border-inline-start"sv, "border-inline-start"sv },
        Property { "borderInlineStartColor"sv, "border-inline-start-color"sv },
        Property { "border-inline-start-color"sv, "border-inline-start-color"sv },
        Property { "borderInlineStartStyle"sv, "border-inline-start-style"sv },
        Property { "border-inline-start-style"sv, "border-inline-start-style"sv },
        Property { "borderInlineStartWidth"sv, "border-inline-start-width"sv },
        Property { "border-inline-start-width"sv, "border-inline-start-width"sv },
        Property { "borderInlineStyle"sv, "border-inline-style"sv },
        Property { "border-inline-style"sv, "border-inline-style"sv },
        Property { "borderInlineWidth"sv, "border-inline-width"sv },
        Property { "border-inline-width"sv, "border-inline-width"sv },
        Property { "borderLeft"sv, "border-left"sv },
        Property { "border-left"sv, "border-left"sv },
        Property { "borderLeftColor"sv, "border-left-color"sv },
        Property { "border-left-color"sv, "border-left-color"sv },
        Property { "borderLeftStyle"sv, "border-left-style"sv },
        Property { "border-left-style"sv, "border-left-style"sv },
        Property { "borderLeftWidth"sv, "border-left-width"sv },
        Property { "border-left-width"sv, "border-left-width"sv },
        Property { "borderRadius"sv, "border-radius"sv },
        Property { "border-radius"sv, "border-radius"sv },
        Property { "borderRight"sv, "border-right"sv },
        Property { "border-right"sv, "border-right"sv },
        Property { "borderRightColor"sv, "border-right-color"sv },
        Property { "border-right-color"sv, "border-right-color"sv },
        Property { "borderRightStyle"sv, "border-right-style"sv },
        Property { "border-right-style"sv, "border-right-style"sv },
        Property { "borderRightWidth"sv, "border-right-width"sv },
        Property { "border-right-width"sv, "border-right-width"sv },
        Property { "borderSpacing"sv, "border-spacing"sv },
        Property { "border-spacing"sv, "border-spacing"sv },
        Property { "borderStartEndRadius"sv, "border-start-end-radius"sv },
        Property { "border-start-end-radius"sv, "border-start-end-radius"sv },
        Property { "borderStartStartRadius"sv, "border-start-start-radius"sv },
        Property { "border-start-start-radius"sv, "border-start-start-radius"sv },
        Property { "borderStyle"sv, "border-style"sv },
        Property { "border-style"sv, "border-style"sv },
        Property { "borderTop"sv, "border-top"sv },
        Property { "border-top"sv, "border-top"sv },
        Property { "borderTopColor"sv, "border-top-color"sv },
        Property { "border-top-color"sv, "border-top-color"sv },
        Property { "borderTopLeftRadius"sv, "border-top-left-radius"sv },
        Property { "border-top-left-radius"sv, "border-top-left-radius"sv },
        Property { "borderTopRightRadius"sv, "border-top-right-radius"sv },
        Property { "border-top-right-radius"sv, "border-top-right-radius"sv },
        Property { "borderTopStyle"sv, "border-top-style"sv },
        Property { "border-top-style"sv, "border-top-style"sv },
        Property { "borderTopWidth"sv, "border-top-width"sv },
        Property { "border-top-width"sv, "border-top-width"sv },
        Property { "borderWidth"sv, "border-width"sv },
        Property { "border-width"sv, "border-width"sv },
        Property { "bottom"sv, "bottom"sv },
        Property { "boxShadow"sv, "box-shadow"sv },
        Property { "box-shadow"sv, "box-shadow"sv },
        Property { "boxSizing"sv, "box-sizing"sv },
        Property { "box-sizing"sv, "box-sizing"sv },
        Property { "captionSide"sv, "caption-side"sv },
        Property { "caption-side"sv, "caption-side"sv },
        Property { "caretColor"sv, "caret-color"sv },
        Property { "caret-color"sv, "caret-color"sv },
        Property { "clear"sv, "clear"sv },
        Property { "clip"sv, "clip"sv },
        Property { "clipPath"sv, "clip-path"sv },
        Property { "clip-path"sv, "clip-path"sv },
        Property { "clipRule"sv, "clip-rule"sv },
        Property { "clip-rule"sv, "clip-rule"sv },
        Property { "color"sv, "color"sv },
        Property { "colorInterpolation"sv, "color-interpolation"sv },
        Property { "color-interpolation"sv, "color-interpolation"sv },
        Property { "colorInterpolationFilters"sv, "color-interpolation-filters"sv },
        Property { "color-interpolation-filters"sv, "color-interpolation-filters"sv },
        Property { "colorScheme"sv, "color-scheme"sv },
        Property { "color-scheme"sv, "color-scheme"sv },
        Property { "columnCount"sv, "column-count"sv },
        Property { "column-count"sv, "column-count"sv },
        Property { "columnGap"sv, "column-gap"sv },
        Property { "column-gap"sv, "column-gap"sv },
        Property { "columnHeight"sv, "column-height"sv },
        Property { "column-height"sv, "column-height"sv },
        Property { "columnSpan"sv, "column-span"sv },
        Property { "column-span"sv, "column-span"sv },
        Property { "columnWidth"sv, "column-width"sv },
        Property { "column-width"sv, "column-width"sv },
        Property { "columns"sv, "columns"sv },
        Property { "contain"sv, "contain"sv },
        Property { "container"sv, "container"sv },
        Property { "containerName"sv, "container-name"sv },
        Property { "container-name"sv, "container-name"sv },
        Property { "containerType"sv, "container-type"sv },
        Property { "container-type"sv, "container-type"sv },
        Property { "content"sv, "content"sv },
        Property { "contentVisibility"sv, "content-visibility"sv },
        Property { "content-visibility"sv, "content-visibility"sv },
        Property { "cornerBlockEndShape"sv, "corner-block-end-shape"sv },
        Property { "corner-block-end-shape"sv, "corner-block-end-shape"sv },
        Property { "cornerBlockStartShape"sv, "corner-block-start-shape"sv },
        Property { "corner-block-start-shape"sv, "corner-block-start-shape"sv },
        Property { "cornerBottomLeftShape"sv, "corner-bottom-left-shape"sv },
        Property { "corner-bottom-left-shape"sv, "corner-bottom-left-shape"sv },
        Property { "cornerBottomRightShape"sv, "corner-bottom-right-shape"sv },
        Property { "corner-bottom-right-shape"sv, "corner-bottom-right-shape"sv },
        Property { "cornerBottomShape"sv, "corner-bottom-shape"sv },
        Property { "corner-bottom-shape"sv, "corner-bottom-shape"sv },
        Property { "cornerEndEndShape"sv, "corner-end-end-shape"sv },
        Property { "corner-end-end-shape"sv, "corner-end-end-shape"sv },
        Property { "cornerEndStartShape"sv, "corner-end-start-shape"sv },
        Property { "corner-end-start-shape"sv, "corner-end-start-shape"sv },
        Property { "cornerInlineEndShape"sv, "corner-inline-end-shape"sv },
        Property { "corner-inline-end-shape"sv, "corner-inline-end-shape"sv },
        Property { "cornerInlineStartShape"sv, "corner-inline-start-shape"sv },
        Property { "corner-inline-start-shape"sv, "corner-inline-start-shape"sv },
        Property { "cornerLeftShape"sv, "corner-left-shape"sv },
        Property { "corner-left-shape"sv, "corner-left-shape"sv },
        Property { "cornerRightShape"sv, "corner-right-shape"sv },
        Property { "corner-right-shape"sv, "corner-right-shape"sv },
        Property { "cornerShape"sv, "corner-shape"sv },
        Property { "corner-shape"sv, "corner-shape"sv },
        Property { "cornerStartEndShape"sv, "corner-start-end-shape"sv },
        Property { "corner-start-end-shape"sv, "corner-start-end-shape"sv },
        Property { "cornerStartStartShape"sv, "corner-start-start-shape"sv },
        Property { "corner-start-start-shape"sv, "corner-start-start-shape"sv },
        Property { "cornerTopLeftShape"sv, "corner-top-left-shape"sv },
        Property { "corner-top-left-shape"sv, "corner-top-left-shape"sv },
        Property { "cornerTopRightShape"sv, "corner-top-right-shape"sv },
        Property { "corner-top-right-shape"sv, "corner-top-right-shape"sv },
        Property { "cornerTopShape"sv, "corner-top-shape"sv },
        Property { "corner-top-shape"sv, "corner-top-shape"sv },
        Property { "counterIncrement"sv, "counter-increment"sv },
        Property { "counter-increment"sv, "counter-increment"sv },
        Property { "counterReset"sv, "counter-reset"sv },
        Property { "counter-reset"sv, "counter-reset"sv },
        Property { "counterSet"sv, "counter-set"sv },
        Property { "counter-set"sv, "counter-set"sv },
        Property { "cursor"sv, "cursor"sv },
        Property { "cx"sv, "cx"sv },
        Property { "cy"sv, "cy"sv },
        Property { "direction"sv, "direction"sv },
        Property { "display"sv, "display"sv },
        Property { "dominantBaseline"sv, "dominant-baseline"sv },
        Property { "dominant-baseline"sv, "dominant-baseline"sv },
        Property { "emptyCells"sv, "empty-cells"sv },
        Property { "empty-cells"sv, "empty-cells"sv },
        Property { "fill"sv, "fill"sv },
        Property { "fillOpacity"sv, "fill-opacity"sv },
        Property { "fill-opacity"sv, "fill-opacity"sv },
        Property { "fillRule"sv, "fill-rule"sv },
        Property { "fill-rule"sv, "fill-rule"sv },
        Property { "filter"sv, "filter"sv },
        Property { "flex"sv, "flex"sv },
        Property { "flexBasis"sv, "flex-basis"sv },
        Property { "flex-basis"sv, "flex-basis"sv },
        Property { "flexDirection"sv, "flex-direction"sv },
        Property { "flex-direction"sv, "flex-direction"sv },
        Property { "flexFlow"sv, "flex-flow"sv },
        Property { "flex-flow"sv, "flex-flow"sv },
        Property { "flexGrow"sv, "flex-grow"sv },
        Property { "flex-grow"sv, "flex-grow"sv },
        Property { "flexShrink"sv, "flex-shrink"sv },
        Property { "flex-shrink"sv, "flex-shrink"sv },
        Property { "flexWrap"sv, "flex-wrap"sv },
        Property { "flex-wrap"sv, "flex-wrap"sv },
        Property { "float"sv, "float"sv },
        Property { "floodColor"sv, "flood-color"sv },
        Property { "flood-color"sv, "flood-color"sv },
        Property { "floodOpacity"sv, "flood-opacity"sv },
        Property { "flood-opacity"sv, "flood-opacity"sv },
        Property { "font"sv, "font"sv },
        Property { "fontFamily"sv, "font-family"sv },
        Property { "font-family"sv, "font-family"sv },
        Property { "fontFeatureSettings"sv, "font-feature-settings"sv },
        Property { "font-feature-settings"sv, "font-feature-settings"sv },
        Property { "fontKerning"sv, "font-kerning"sv },
        Property { "font-kerning"sv, "font-kerning"sv },
        Property { "fontLanguageOverride"sv, "font-language-override"sv },
        Property { "font-language-override"sv, "font-language-override"sv },
        Property { "fontOpticalSizing"sv, "font-optical-sizing"sv },
        Property { "font-optical-sizing"sv, "font-optical-sizing"sv },
        Property { "fontSize"sv, "font-size"sv },
        Property { "font-size"sv, "font-size"sv },
        Property { "fontStretch"sv, "font-stretch"sv },
        Property { "font-stretch"sv, "font-stretch"sv },
        Property { "fontStyle"sv, "font-style"sv },
        Property { "font-style"sv, "font-style"sv },
        Property { "fontVariant"sv, "font-variant"sv },
        Property { "font-variant"sv, "font-variant"sv },
        Property { "fontVariantAlternates"sv, "font-variant-alternates"sv },
        Property { "font-variant-alternates"sv, "font-variant-alternates"sv },
        Property { "fontVariantCaps"sv, "font-variant-caps"sv },
        Property { "font-variant-caps"sv, "font-variant-caps"sv },
        Property { "fontVariantEastAsian"sv, "font-variant-east-asian"sv },
        Property { "font-variant-east-asian"sv, "font-variant-east-asian"sv },
        Property { "fontVariantEmoji"sv, "font-variant-emoji"sv },
        Property { "font-variant-emoji"sv, "font-variant-emoji"sv },
        Property { "fontVariantLigatures"sv, "font-variant-ligatures"sv },
        Property { "font-variant-ligatures"sv, "font-variant-ligatures"sv },
        Property { "fontVariantNumeric"sv, "font-variant-numeric"sv },
        Property { "font-variant-numeric"sv, "font-variant-numeric"sv },
        Property { "fontVariantPosition"sv, "font-variant-position"sv },
        Property { "font-variant-position"sv, "font-variant-position"sv },
        Property { "fontVariationSettings"sv, "font-variation-settings"sv },
        Property { "font-variation-settings"sv, "font-variation-settings"sv },
        Property { "fontWeight"sv, "font-weight"sv },
        Property { "font-weight"sv, "font-weight"sv },
        Property { "fontWidth"sv, "font-width"sv },
        Property { "font-width"sv, "font-width"sv },
        Property { "gap"sv, "gap"sv },
        Property { "grid"sv, "grid"sv },
        Property { "gridArea"sv, "grid-area"sv },
        Property { "grid-area"sv, "grid-area"sv },
        Property { "gridAutoColumns"sv, "grid-auto-columns"sv },
        Property { "grid-auto-columns"sv, "grid-auto-columns"sv },
        Property { "gridAutoFlow"sv, "grid-auto-flow"sv },
        Property { "grid-auto-flow"sv, "grid-auto-flow"sv },
        Property { "gridAutoRows"sv, "grid-auto-rows"sv },
        Property { "grid-auto-rows"sv, "grid-auto-rows"sv },
        Property { "gridColumn"sv, "grid-column"sv },
        Property { "grid-column"sv, "grid-column"sv },
        Property { "gridColumnEnd"sv, "grid-column-end"sv },
        Property { "grid-column-end"sv, "grid-column-end"sv },
        Property { "gridColumnGap"sv, "grid-column-gap"sv },
        Property { "grid-column-gap"sv, "grid-column-gap"sv },
        Property { "gridColumnStart"sv, "grid-column-start"sv },
        Property { "grid-column-start"sv, "grid-column-start"sv },
        Property { "gridGap"sv, "grid-gap"sv },
        Property { "grid-gap"sv, "grid-gap"sv },
        Property { "gridRow"sv, "grid-row"sv },
        Property { "grid-row"sv, "grid-row"sv },
        Property { "gridRowEnd"sv, "grid-row-end"sv },
        Property { "grid-row-end"sv, "grid-row-end"sv },
        Property { "gridRowGap"sv, "grid-row-gap"sv },
        Property { "grid-row-gap"sv, "grid-row-gap"sv },
        Property { "gridRowStart"sv, "grid-row-start"sv },
        Property { "grid-row-start"sv, "grid-row-start"sv },
        Property { "gridTemplate"sv, "grid-template"sv },
        Property { "grid-template"sv, "grid-template"sv },
        Property { "gridTemplateAreas"sv, "grid-template-areas"sv },
        Property { "grid-template-areas"sv, "grid-template-areas"sv },
        Property { "gridTemplateColumns"sv, "grid-template-columns"sv },
        Property { "grid-template-columns"sv, "grid-template-columns"sv },
        Property { "gridTemplateRows"sv, "grid-template-rows"sv },
        Property { "grid-template-rows"sv, "grid-template-rows"sv },
        Property { "height"sv, "height"sv },
        Property { "imageRendering"sv, "image-rendering"sv },
        Property { "image-rendering"sv, "image-rendering"sv },
        Property { "inlineSize"sv, "inline-size"sv },
        Property { "inline-size"sv, "inline-size"sv },
        Property { "inset"sv, "inset"sv },
        Property { "insetBlock"sv, "inset-block"sv },
        Property { "inset-block"sv, "inset-block"sv },
        Property { "insetBlockEnd"sv, "inset-block-end"sv },
        Property { "inset-block-end"sv, "inset-block-end"sv },
        Property { "insetBlockStart"sv, "inset-block-start"sv },
        Property { "inset-block-start"sv, "inset-block-start"sv },
        Property { "insetInline"sv, "inset-inline"sv },
        Property { "inset-inline"sv, "inset-inline"sv },
        Property { "insetInlineEnd"sv, "inset-inline-end"sv },
        Property { "inset-inline-end"sv, "inset-inline-end"sv },
        Property { "insetInlineStart"sv, "inset-inline-start"sv },
        Property { "inset-inline-start"sv, "inset-inline-start"sv },
        Property { "isolation"sv, "isolation"sv },
        Property { "justifyContent"sv, "justify-content"sv },
        Property { "justify-content"sv, "justify-content"sv },
        Property { "justifyItems"sv, "justify-items"sv },
        Property { "justify-items"sv, "justify-items"sv },
        Property { "justifySelf"sv, "justify-self"sv },
        Property { "justify-self"sv, "justify-self"sv },
        Property { "left"sv, "left"sv },
        Property { "letterSpacing"sv, "letter-spacing"sv },
        Property { "letter-spacing"sv, "letter-spacing"sv },
        Property { "lineHeight"sv, "line-height"sv },
        Property { "line-height"sv, "line-height"sv },
        Property { "listStyle"sv, "list-style"sv },
        Property { "list-style"sv, "list-style"sv },
        Property { "listStyleImage"sv, "list-style-image"sv },
        Property { "list-style-image"sv, "list-style-image"sv },
        Property { "listStylePosition"sv, "list-style-position"sv },
        Property { "list-style-position"sv, "list-style-position"sv },
        Property { "listStyleType"sv, "list-style-type"sv },
        Property { "list-style-type"sv, "list-style-type"sv },
        Property { "margin"sv, "margin"sv },
        Property { "marginBlock"sv, "margin-block"sv },
        Property { "margin-block"sv, "margin-block"sv },
        Property { "marginBlockEnd"sv, "margin-block-end"sv },
        Property { "margin-block-end"sv, "margin-block-end"sv },
        Property { "marginBlockStart"sv, "margin-block-start"sv },
        Property { "margin-block-start"sv, "margin-block-start"sv },
        Property { "marginBottom"sv, "margin-bottom"sv },
        Property { "margin-bottom"sv, "margin-bottom"sv },
        Property { "marginInline"sv, "margin-inline"sv },
        Property { "margin-inline"sv, "margin-inline"sv },
        Property { "marginInlineEnd"sv, "margin-inline-end"sv },
        Property { "margin-inline-end"sv, "margin-inline-end"sv },
        Property { "marginInlineStart"sv, "margin-inline-start"sv },
        Property { "margin-inline-start"sv, "margin-inline-start"sv },
        Property { "marginLeft"sv, "margin-left"sv },
        Property { "margin-left"sv, "margin-left"sv },
        Property { "marginRight"sv, "margin-right"sv },
        Property { "margin-right"sv, "margin-right"sv },
        Property { "marginTop"sv, "margin-top"sv },
        Property { "margin-top"sv, "margin-top"sv },
        Property { "mask"sv, "mask"sv },
        Property { "maskClip"sv, "mask-clip"sv },
        Property { "mask-clip"sv, "mask-clip"sv },
        Property { "maskComposite"sv, "mask-composite"sv },
        Property { "mask-composite"sv, "mask-composite"sv },
        Property { "maskImage"sv, "mask-image"sv },
        Property { "mask-image"sv, "mask-image"sv },
        Property { "maskMode"sv, "mask-mode"sv },
        Property { "mask-mode"sv, "mask-mode"sv },
        Property { "maskOrigin"sv, "mask-origin"sv },
        Property { "mask-origin"sv, "mask-origin"sv },
        Property { "maskPosition"sv, "mask-position"sv },
        Property { "mask-position"sv, "mask-position"sv },
        Property { "maskRepeat"sv, "mask-repeat"sv },
        Property { "mask-repeat"sv, "mask-repeat"sv },
        Property { "maskSize"sv, "mask-size"sv },
        Property { "mask-size"sv, "mask-size"sv },
        Property { "maskType"sv, "mask-type"sv },
        Property { "mask-type"sv, "mask-type"sv },
        Property { "mathDepth"sv, "math-depth"sv },
        Property { "math-depth"sv, "math-depth"sv },
        Property { "mathShift"sv, "math-shift"sv },
        Property { "math-shift"sv, "math-shift"sv },
        Property { "mathStyle"sv, "math-style"sv },
        Property { "math-style"sv, "math-style"sv },
        Property { "maxBlockSize"sv, "max-block-size"sv },
        Property { "max-block-size"sv, "max-block-size"sv },
        Property { "maxHeight"sv, "max-height"sv },
        Property { "max-height"sv, "max-height"sv },
        Property { "maxInlineSize"sv, "max-inline-size"sv },
        Property { "max-inline-size"sv, "max-inline-size"sv },
        Property { "maxWidth"sv, "max-width"sv },
        Property { "max-width"sv, "max-width"sv },
        Property { "minBlockSize"sv, "min-block-size"sv },
        Property { "min-block-size"sv, "min-block-size"sv },
        Property { "minHeight"sv, "min-height"sv },
        Property { "min-height"sv, "min-height"sv },
        Property { "minInlineSize"sv, "min-inline-size"sv },
        Property { "min-inline-size"sv, "min-inline-size"sv },
        Property { "minWidth"sv, "min-width"sv },
        Property { "min-width"sv, "min-width"sv },
        Property { "mixBlendMode"sv, "mix-blend-mode"sv },
        Property { "mix-blend-mode"sv, "mix-blend-mode"sv },
        Property { "objectFit"sv, "object-fit"sv },
        Property { "object-fit"sv, "object-fit"sv },
        Property { "objectPosition"sv, "object-position"sv },
        Property { "object-position"sv, "object-position"sv },
        Property { "opacity"sv, "opacity"sv },
        Property { "order"sv, "order"sv },
        Property { "orphans"sv, "orphans"sv },
        Property { "outline"sv, "outline"sv },
        Property { "outlineColor"sv, "outline-color"sv },
        Property { "outline-color"sv, "outline-color"sv },
        Property { "outlineOffset"sv, "outline-offset"sv },
        Property { "outline-offset"sv, "outline-offset"sv },
        Property { "outlineStyle"sv, "outline-style"sv },
        Property { "outline-style"sv, "outline-style"sv },
        Property { "outlineWidth"sv, "outline-width"sv },
        Property { "outline-width"sv, "outline-width"sv },
        Property { "overflow"sv, "overflow"sv },
        Property { "overflowBlock"sv, "overflow-block"sv },
        Property { "overflow-block"sv, "overflow-block"sv },
        Property { "overflowClipMargin"sv, "overflow-clip-margin"sv },
        Property { "overflow-clip-margin"sv, "overflow-clip-margin"sv },
        Property { "overflowClipMarginBlock"sv, "overflow-clip-margin-block"sv },
        Property { "overflow-clip-margin-block"sv, "overflow-clip-margin-block"sv },
        Property { "overflowClipMarginBlockEnd"sv, "overflow-clip-margin-block-end"sv },
        Property { "overflow-clip-margin-block-end"sv, "overflow-clip-margin-block-end"sv },
        Property { "overflowClipMarginBlockStart"sv, "overflow-clip-margin-block-start"sv },
        Property { "overflow-clip-margin-block-start"sv, "overflow-clip-margin-block-start"sv },
        Property { "overflowClipMarginBottom"sv, "overflow-clip-margin-bottom"sv },
        Property { "overflow-clip-margin-bottom"sv, "overflow-clip-margin-bottom"sv },
        Property { "overflowClipMarginInline"sv, "overflow-clip-margin-inline"sv },
        Property { "overflow-clip-margin-inline"sv, "overflow-clip-margin-inline"sv },
        Property { "overflowClipMarginInlineEnd"sv, "overflow-clip-margin-inline-end"sv },
        Property { "overflow-clip-margin-inline-end"sv, "overflow-clip-margin-inline-end"sv },
        Property { "overflowClipMarginInlineStart"sv, "overflow-clip-margin-inline-start"sv },
        Property { "overflow-clip-margin-inline-start"sv, "overflow-clip-margin-inline-start"sv },
        Property { "overflowClipMarginLeft"sv, "overflow-clip-margin-left"sv },
        Property { "overflow-clip-margin-left"sv, "overflow-clip-margin-left"sv },
        Property { "overflowClipMarginRight"sv, "overflow-clip-margin-right"sv },
        Property { "overflow-clip-margin-right"sv, "overflow-clip-margin-right"sv },
        Property { "overflowClipMarginTop"sv, "overflow-clip-margin-top"sv },
        Property { "overflow-clip-margin-top"sv, "overflow-clip-margin-top"sv },
        Property { "overflowInline"sv, "overflow-inline"sv },
        Property { "overflow-inline"sv, "overflow-inline"sv },
        Property { "overflowWrap"sv, "overflow-wrap"sv },
        Property { "overflow-wrap"sv, "overflow-wrap"sv },
        Property { "overflowX"sv, "overflow-x"sv },
        Property { "overflow-x"sv, "overflow-x"sv },
        Property { "overflowY"sv, "overflow-y"sv },
        Property { "overflow-y"sv, "overflow-y"sv },
        Property { "padding"sv, "padding"sv },
        Property { "paddingBlock"sv, "padding-block"sv },
        Property { "padding-block"sv, "padding-block"sv },
        Property { "paddingBlockEnd"sv, "padding-block-end"sv },
        Property { "padding-block-end"sv, "padding-block-end"sv },
        Property { "paddingBlockStart"sv, "padding-block-start"sv },
        Property { "padding-block-start"sv, "padding-block-start"sv },
        Property { "paddingBottom"sv, "padding-bottom"sv },
        Property { "padding-bottom"sv, "padding-bottom"sv },
        Property { "paddingInline"sv, "padding-inline"sv },
        Property { "padding-inline"sv, "padding-inline"sv },
        Property { "paddingInlineEnd"sv, "padding-inline-end"sv },
        Property { "padding-inline-end"sv, "padding-inline-end"sv },
        Property { "paddingInlineStart"sv, "padding-inline-start"sv },
        Property { "padding-inline-start"sv, "padding-inline-start"sv },
        Property { "paddingLeft"sv, "padding-left"sv },
        Property { "padding-left"sv, "padding-left"sv },
        Property { "paddingRight"sv, "padding-right"sv },
        Property { "padding-right"sv, "padding-right"sv },
        Property { "paddingTop"sv, "padding-top"sv },
        Property { "padding-top"sv, "padding-top"sv },
        Property { "paintOrder"sv, "paint-order"sv },
        Property { "paint-order"sv, "paint-order"sv },
        Property { "perspective"sv, "perspective"sv },
        Property { "perspectiveOrigin"sv, "perspective-origin"sv },
        Property { "perspective-origin"sv, "perspective-origin"sv },
        Property { "placeContent"sv, "place-content"sv },
        Property { "place-content"sv, "place-content"sv },
        Property { "placeItems"sv, "place-items"sv },
        Property { "place-items"sv, "place-items"sv },
        Property { "placeSelf"sv, "place-self"sv },
        Property { "place-self"sv, "place-self"sv },
        Property { "pointerEvents"sv, "pointer-events"sv },
        Property { "pointer-events"sv, "pointer-events"sv },
        Property { "position"sv, "position"sv },
        Property { "positionAnchor"sv, "position-anchor"sv },
        Property { "position-anchor"sv, "position-anchor"sv },
        Property { "positionArea"sv, "position-area"sv },
        Property { "position-area"sv, "position-area"sv },
        Property { "positionTryFallbacks"sv, "position-try-fallbacks"sv },
        Property { "position-try-fallbacks"sv, "position-try-fallbacks"sv },
        Property { "positionTryOrder"sv, "position-try-order"sv },
        Property { "position-try-order"sv, "position-try-order"sv },
        Property { "positionVisibility"sv, "position-visibility"sv },
        Property { "position-visibility"sv, "position-visibility"sv },
        Property { "quotes"sv, "quotes"sv },
        Property { "r"sv, "r"sv },
        Property { "resize"sv, "resize"sv },
        Property { "right"sv, "right"sv },
        Property { "rotate"sv, "rotate"sv },
        Property { "rowGap"sv, "row-gap"sv },
        Property { "row-gap"sv, "row-gap"sv },
        Property { "rx"sv, "rx"sv },
        Property { "ry"sv, "ry"sv },
        Property { "scale"sv, "scale"sv },
        Property { "scrollBehavior"sv, "scroll-behavior"sv },
        Property { "scroll-behavior"sv, "scroll-behavior"sv },
        Property { "scrollMargin"sv, "scroll-margin"sv },
        Property { "scroll-margin"sv, "scroll-margin"sv },
        Property { "scrollMarginBlock"sv, "scroll-margin-block"sv },
        Property { "scroll-margin-block"sv, "scroll-margin-block"sv },
        Property { "scrollMarginBlockEnd"sv, "scroll-margin-block-end"sv },
        Property { "scroll-margin-block-end"sv, "scroll-margin-block-end"sv },
        Property { "scrollMarginBlockStart"sv, "scroll-margin-block-start"sv },
        Property { "scroll-margin-block-start"sv, "scroll-margin-block-start"sv },
        Property { "scrollMarginBottom"sv, "scroll-margin-bottom"sv },
        Property { "scroll-margin-bottom"sv, "scroll-margin-bottom"sv },
        Property { "scrollMarginInline"sv, "scroll-margin-inline"sv },
        Property { "scroll-margin-inline"sv, "scroll-margin-inline"sv },
        Property { "scrollMarginInlineEnd"sv, "scroll-margin-inline-end"sv },
        Property { "scroll-margin-inline-end"sv, "scroll-margin-inline-end"sv },
        Property { "scrollMarginInlineStart"sv, "scroll-margin-inline-start"sv },
        Property { "scroll-margin-inline-start"sv, "scroll-margin-inline-start"sv },
        Property { "scrollMarginLeft"sv, "scroll-margin-left"sv },
        Property { "scroll-margin-left"sv, "scroll-margin-left"sv },
        Property { "scrollMarginRight"sv, "scroll-margin-right"sv },
        Property { "scroll-margin-right"sv, "scroll-margin-right"sv },
        Property { "scrollMarginTop"sv, "scroll-margin-top"sv },
        Property { "scroll-margin-top"sv, "scroll-margin-top"sv },
        Property { "scrollPadding"sv, "scroll-padding"sv },
        Property { "scroll-padding"sv, "scroll-padding"sv },
        Property { "scrollPaddingBlock"sv, "scroll-padding-block"sv },
        Property { "scroll-padding-block"sv, "scroll-padding-block"sv },
        Property { "scrollPaddingBlockEnd"sv, "scroll-padding-block-end"sv },
        Property { "scroll-padding-block-end"sv, "scroll-padding-block-end"sv },
        Property { "scrollPaddingBlockStart"sv, "scroll-padding-block-start"sv },
        Property { "scroll-padding-block-start"sv, "scroll-padding-block-start"sv },
        Property { "scrollPaddingBottom"sv, "scroll-padding-bottom"sv },
        Property { "scroll-padding-bottom"sv, "scroll-padding-bottom"sv },
        Property { "scrollPaddingInline"sv, "scroll-padding-inline"sv },
        Property { "scroll-padding-inline"sv, "scroll-padding-inline"sv },
        Property { "scrollPaddingInlineEnd"sv, "scroll-padding-inline-end"sv },
        Property { "scroll-padding-inline-end"sv, "scroll-padding-inline-end"sv },
        Property { "scrollPaddingInlineStart"sv, "scroll-padding-inline-start"sv },
        Property { "scroll-padding-inline-start"sv, "scroll-padding-inline-start"sv },
        Property { "scrollPaddingLeft"sv, "scroll-padding-left"sv },
        Property { "scroll-padding-left"sv, "scroll-padding-left"sv },
        Property { "scrollPaddingRight"sv, "scroll-padding-right"sv },
        Property { "scroll-padding-right"sv, "scroll-padding-right"sv },
        Property { "scrollPaddingTop"sv, "scroll-padding-top"sv },
        Property { "scroll-padding-top"sv, "scroll-padding-top"sv },
        Property { "scrollTimeline"sv, "scroll-timeline"sv },
        Property { "scroll-timeline"sv, "scroll-timeline"sv },
        Property { "scrollTimelineAxis"sv, "scroll-timeline-axis"sv },
        Property { "scroll-timeline-axis"sv, "scroll-timeline-axis"sv },
        Property { "scrollTimelineName"sv, "scroll-timeline-name"sv },
        Property { "scroll-timeline-name"sv, "scroll-timeline-name"sv },
        Property { "scrollbarColor"sv, "scrollbar-color"sv },
        Property { "scrollbar-color"sv, "scrollbar-color"sv },
        Property { "scrollbarGutter"sv, "scrollbar-gutter"sv },
        Property { "scrollbar-gutter"sv, "scrollbar-gutter"sv },
        Property { "scrollbarWidth"sv, "scrollbar-width"sv },
        Property { "scrollbar-width"sv, "scrollbar-width"sv },
        Property { "shapeImageThreshold"sv, "shape-image-threshold"sv },
        Property { "shape-image-threshold"sv, "shape-image-threshold"sv },
        Property { "shapeMargin"sv, "shape-margin"sv },
        Property { "shape-margin"sv, "shape-margin"sv },
        Property { "shapeOutside"sv, "shape-outside"sv },
        Property { "shape-outside"sv, "shape-outside"sv },
        Property { "shapeRendering"sv, "shape-rendering"sv },
        Property { "shape-rendering"sv, "shape-rendering"sv },
        Property { "stopColor"sv, "stop-color"sv },
        Property { "stop-color"sv, "stop-color"sv },
        Property { "stopOpacity"sv, "stop-opacity"sv },
        Property { "stop-opacity"sv, "stop-opacity"sv },
        Property { "stroke"sv, "stroke"sv },
        Property { "strokeDasharray"sv, "stroke-dasharray"sv },
        Property { "stroke-dasharray"sv, "stroke-dasharray"sv },
        Property { "strokeDashoffset"sv, "stroke-dashoffset"sv },
        Property { "stroke-dashoffset"sv, "stroke-dashoffset"sv },
        Property { "strokeLinecap"sv, "stroke-linecap"sv },
        Property { "stroke-linecap"sv, "stroke-linecap"sv },
        Property { "strokeLinejoin"sv, "stroke-linejoin"sv },
        Property { "stroke-linejoin"sv, "stroke-linejoin"sv },
        Property { "strokeMiterlimit"sv, "stroke-miterlimit"sv },
        Property { "stroke-miterlimit"sv, "stroke-miterlimit"sv },
        Property { "strokeOpacity"sv, "stroke-opacity"sv },
        Property { "stroke-opacity"sv, "stroke-opacity"sv },
        Property { "strokeWidth"sv, "stroke-width"sv },
        Property { "stroke-width"sv, "stroke-width"sv },
        Property { "tabSize"sv, "tab-size"sv },
        Property { "tab-size"sv, "tab-size"sv },
        Property { "tableLayout"sv, "table-layout"sv },
        Property { "table-layout"sv, "table-layout"sv },
        Property { "textAlign"sv, "text-align"sv },
        Property { "text-align"sv, "text-align"sv },
        Property { "textAnchor"sv, "text-anchor"sv },
        Property { "text-anchor"sv, "text-anchor"sv },
        Property { "textDecoration"sv, "text-decoration"sv },
        Property { "text-decoration"sv, "text-decoration"sv },
        Property { "textDecorationColor"sv, "text-decoration-color"sv },
        Property { "text-decoration-color"sv, "text-decoration-color"sv },
        Property { "textDecorationLine"sv, "text-decoration-line"sv },
        Property { "text-decoration-line"sv, "text-decoration-line"sv },
        Property { "textDecorationSkipInk"sv, "text-decoration-skip-ink"sv },
        Property { "text-decoration-skip-ink"sv, "text-decoration-skip-ink"sv },
        Property { "textDecorationStyle"sv, "text-decoration-style"sv },
        Property { "text-decoration-style"sv, "text-decoration-style"sv },
        Property { "textDecorationThickness"sv, "text-decoration-thickness"sv },
        Property { "text-decoration-thickness"sv, "text-decoration-thickness"sv },
        Property { "textIndent"sv, "text-indent"sv },
        Property { "text-indent"sv, "text-indent"sv },
        Property { "textJustify"sv, "text-justify"sv },
        Property { "text-justify"sv, "text-justify"sv },
        Property { "textOverflow"sv, "text-overflow"sv },
        Property { "text-overflow"sv, "text-overflow"sv },
        Property { "textRendering"sv, "text-rendering"sv },
        Property { "text-rendering"sv, "text-rendering"sv },
        Property { "textShadow"sv, "text-shadow"sv },
        Property { "text-shadow"sv, "text-shadow"sv },
        Property { "textTransform"sv, "text-transform"sv },
        Property { "text-transform"sv, "text-transform"sv },
        Property { "textUnderlineOffset"sv, "text-underline-offset"sv },
        Property { "text-underline-offset"sv, "text-underline-offset"sv },
        Property { "textUnderlinePosition"sv, "text-underline-position"sv },
        Property { "text-underline-position"sv, "text-underline-position"sv },
        Property { "textWrap"sv, "text-wrap"sv },
        Property { "text-wrap"sv, "text-wrap"sv },
        Property { "textWrapMode"sv, "text-wrap-mode"sv },
        Property { "text-wrap-mode"sv, "text-wrap-mode"sv },
        Property { "textWrapStyle"sv, "text-wrap-style"sv },
        Property { "text-wrap-style"sv, "text-wrap-style"sv },
        Property { "timelineScope"sv, "timeline-scope"sv },
        Property { "timeline-scope"sv, "timeline-scope"sv },
        Property { "top"sv, "top"sv },
        Property { "touchAction"sv, "touch-action"sv },
        Property { "touch-action"sv, "touch-action"sv },
        Property { "transform"sv, "transform"sv },
        Property { "transformBox"sv, "transform-box"sv },
        Property { "transform-box"sv, "transform-box"sv },
        Property { "transformOrigin"sv, "transform-origin"sv },
        Property { "transform-origin"sv, "transform-origin"sv },
        Property { "transformStyle"sv, "transform-style"sv },
        Property { "transform-style"sv, "transform-style"sv },
        Property { "transition"sv, "transition"sv },
        Property { "transitionBehavior"sv, "transition-behavior"sv },
        Property { "transition-behavior"sv, "transition-behavior"sv },
        Property { "transitionDelay"sv, "transition-delay"sv },
        Property { "transition-delay"sv, "transition-delay"sv },
        Property { "transitionDuration"sv, "transition-duration"sv },
        Property { "transition-duration"sv, "transition-duration"sv },
        Property { "transitionProperty"sv, "transition-property"sv },
        Property { "transition-property"sv, "transition-property"sv },
        Property { "transitionTimingFunction"sv, "transition-timing-function"sv },
        Property { "transition-timing-function"sv, "transition-timing-function"sv },
        Property { "translate"sv, "translate"sv },
        Property { "unicodeBidi"sv, "unicode-bidi"sv },
        Property { "unicode-bidi"sv, "unicode-bidi"sv },
        Property { "userSelect"sv, "user-select"sv },
        Property { "user-select"sv, "user-select"sv },
        Property { "verticalAlign"sv, "vertical-align"sv },
        Property { "vertical-align"sv, "vertical-align"sv },
        Property { "viewTimeline"sv, "view-timeline"sv },
        Property { "view-timeline"sv, "view-timeline"sv },
        Property { "viewTimelineAxis"sv, "view-timeline-axis"sv },
        Property { "view-timeline-axis"sv, "view-timeline-axis"sv },
        Property { "viewTimelineInset"sv, "view-timeline-inset"sv },
        Property { "view-timeline-inset"sv, "view-timeline-inset"sv },
        Property { "viewTimelineName"sv, "view-timeline-name"sv },
        Property { "view-timeline-name"sv, "view-timeline-name"sv },
        Property { "viewTransitionName"sv, "view-transition-name"sv },
        Property { "view-transition-name"sv, "view-transition-name"sv },
        Property { "visibility"sv, "visibility"sv },
        Property { "whiteSpace"sv, "white-space"sv },
        Property { "white-space"sv, "white-space"sv },
        Property { "whiteSpaceCollapse"sv, "white-space-collapse"sv },
        Property { "white-space-collapse"sv, "white-space-collapse"sv },
        Property { "whiteSpaceTrim"sv, "white-space-trim"sv },
        Property { "white-space-trim"sv, "white-space-trim"sv },
        Property { "widows"sv, "widows"sv },
        Property { "width"sv, "width"sv },
        Property { "willChange"sv, "will-change"sv },
        Property { "will-change"sv, "will-change"sv },
        Property { "wordBreak"sv, "word-break"sv },
        Property { "word-break"sv, "word-break"sv },
        Property { "wordSpacing"sv, "word-spacing"sv },
        Property { "word-spacing"sv, "word-spacing"sv },
        Property { "wordWrap"sv, "word-wrap"sv },
        Property { "word-wrap"sv, "word-wrap"sv },
        Property { "writingMode"sv, "writing-mode"sv },
        Property { "writing-mode"sv, "writing-mode"sv },
        Property { "x"sv, "x"sv },
        Property { "y"sv, "y"sv },
        Property { "zIndex"sv, "z-index"sv },
        Property { "z-index"sv, "z-index"sv },

    };

    for (auto property : properties) {
        auto attribute_name = Utf16FlyString::from_utf8(property.attribute_name);
        auto property_name = Utf16FlyString::from_utf8(property.property_name);
        auto native_getter = create_getter(realm, attribute_name, property_name);
        auto native_setter = create_setter(realm, attribute_name, property_name);
        object.define_direct_accessor(attribute_name, native_getter, native_setter, default_attributes);
    }
}

} // namespace Web::Bindings
