public CssSizeLength(string value)
        {
            value        = value?.ToLowerInvariant() ?? throw new ArgumentNullException(nameof(value));
            _stringValue = value;

            if (value.StartsWith("calc", StringComparison.OrdinalIgnoreCase))
            {
                _stringValue = value;
                _value       = null;
                _unit        = CssSizeLengthUnit.Calc;
                return;
            }

            var index = value
                        .Select((c, i) => ((char c, int i)?)(c, i))
                        .FirstOrDefault(x => !(x.Value.c == '.' || x.Value.c >= '0' && x.Value.c <= '9'))
                        ?.i
                        ?? value.Length;

            if (index == 0)
            {
                throw new FormatException();
            }

            _value = int.Parse(value.Substring(0, index), CultureInfo.InvariantCulture);

            if (index == value.Length)
            {
                _unit        = CssSizeLengthUnit.Px;
                _stringValue = null;
                return;
            }

            var unit = value.Substring(index).Trim();

            if (!Enum.TryParse(unit, ignoreCase: true, out _unit))
            {
                _unit = unit switch
                {
                    "%" => CssSizeLengthUnit.Percent,
                    _ => throw new FormatException(),
                };
            }
        }
 private CssSizeLength(int value, CssSizeLengthUnit unit)
 {
     _value       = value;
     _stringValue = null;
     _unit        = unit;
 }