AngleSharp by Florian Rappl

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

.NET API 1,168,384 bytes

 CssPerspectiveOriginProperty

More information available at: https://developer.mozilla.org/en-US/docs/Web/CSS/perspective-origin Gets the position of the abscissa of the vanishing point. Gets the position of the ordinate of the vanishing point.
using AngleSharp.Css; using AngleSharp.Css.Values; using AngleSharp.Extensions; using System; namespace AngleSharp.Dom.Css { internal sealed class CssPerspectiveOriginProperty : CssProperty { private static readonly IValueConverter<Point> Converter = Converters.LengthOrPercentConverter.To((Length m) => new Point(m, m)).Or(Keywords.Left, new Point(Length.Zero, Length.Half)).Or(Keywords.Center, new Point(Length.Half, Length.Half)) .Or(Keywords.Right, new Point(Length.Full, Length.Half)) .Or(Keywords.Top, new Point(Length.Half, Length.Zero)) .Or(Keywords.Bottom, new Point(Length.Half, Length.Full)) .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))); internal CssPerspectiveOriginProperty(CssStyleDeclaration rule) : base(PropertyNames.PerspectiveOrigin, rule, PropertyFlags.Animatable) { } protected override object GetDefault(IElement element) { return Point.Center; } protected override object Compute(IElement element) { return Converter.Convert(base.Value); } protected override bool IsValid(ICssValue value) { return Converter.Validate(value); } } }