AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.1" />

.NET API 1,172,480 bytes

 CssTransformOriginProperty

More information available at: https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin
using AngleSharp.Css; using AngleSharp.Css.Values; using AngleSharp.Extensions; using System; namespace AngleSharp.Dom.Css { internal sealed class CssTransformOriginProperty : CssProperty, ICssTransformOriginProperty, ICssProperty { internal static readonly Point Default = Point.Center; internal static IValueConverter<Tuple<Point, Length>> Converter = Converters.WithOrder(Converters.LengthOrPercentConverter.To((Length m) => new Point(m, m)).Or(Keywords.Center, Point.Center).Or(Converters.WithAny(Converters.LengthOrPercentConverter.Or(Keywords.Left, Length.Zero).Or(Keywords.Right, Length.Full).Or(Keywords.Center, Length.Half) .Option(Length.Half), Converters.LengthOrPercentConverter.Or(Keywords.Top, Length.Zero).Or(Keywords.Bottom, Length.Full).Or(Keywords.Center, Length.Half) .Option(Length.Half)).To((Tuple<Length, Length> m) => new Point(m.Item1, m.Item2))) .Or(Converters.WithAny(Converters.LengthOrPercentConverter.Or(Keywords.Top, Length.Zero).Or(Keywords.Bottom, Length.Full).Or(Keywords.Center, Length.Half) .Option(Length.Half), Converters.LengthOrPercentConverter.Or(Keywords.Left, Length.Zero).Or(Keywords.Right, Length.Full).Or(Keywords.Center, Length.Half) .Option(Length.Half)).To((Tuple<Length, Length> m) => new Point(m.Item1, m.Item2))) .Required(), Converters.LengthConverter.Option(Length.Zero)); private Length _x; private Length _y; private Length _z; public Length X => _x; public Length Y => _y; public Length Z => _z; internal CssTransformOriginProperty(CssStyleDeclaration rule) : base(PropertyNames.TransformOrigin, rule, PropertyFlags.Animatable) { Reset(); } public void SetPosition(Length x, Length y, Length z) { _x = x; _y = y; _z = z; } internal override void Reset() { Point default = Default; _x = default.X; default = Default; _y = default.Y; _z = Length.Zero; } protected override bool IsValid(ICssValue value) { return Converter.TryConvert(value, delegate(Tuple<Point, Length> m) { Point item = m.Item1; Length x = item.X; item = m.Item1; SetPosition(x, item.Y, m.Item2); }); } } }