aboutsummaryrefslogtreecommitdiffstats
path: root/vanilla/node_modules/cssstyle/lib
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
commit76cb9c2a39d477a64824a985ade40507e3bbade1 (patch)
tree41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/cssstyle/lib
parent819a39a21ac992b1393244a4c283bbb125208c69 (diff)
downloadneko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/cssstyle/lib')
-rw-r--r--vanilla/node_modules/cssstyle/lib/CSSStyleDeclaration.js649
-rw-r--r--vanilla/node_modules/cssstyle/lib/generated/allProperties.js653
-rw-r--r--vanilla/node_modules/cssstyle/lib/generated/implementedProperties.js1466
-rw-r--r--vanilla/node_modules/cssstyle/lib/generated/properties.js6637
-rw-r--r--vanilla/node_modules/cssstyle/lib/generated/propertyDefinitions.js13033
-rw-r--r--vanilla/node_modules/cssstyle/lib/normalize.js1574
-rw-r--r--vanilla/node_modules/cssstyle/lib/parsers.js871
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/background.js406
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundAttachment.js61
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundClip.js61
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundColor.js50
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundImage.js63
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundOrigin.js61
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundPosition.js204
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundRepeat.js93
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/backgroundSize.js126
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/border.js107
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderBottom.js100
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderBottomColor.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderBottomStyle.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderBottomWidth.js57
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderCollapse.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderColor.js110
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderLeft.js100
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderLeftColor.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderLeftStyle.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderLeftWidth.js57
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderRight.js100
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderRightColor.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderRightStyle.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderRightWidth.js57
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderSpacing.js65
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderStyle.js110
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderTop.js100
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderTopColor.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderTopStyle.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderTopWidth.js57
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/borderWidth.js111
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/bottom.js47
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/clear.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/clip.js73
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/color.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/display.js210
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/flex.js178
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/flexBasis.js52
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/flexGrow.js52
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/flexShrink.js52
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/float.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/floodColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/font.js302
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/fontFamily.js98
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/fontSize.js53
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/fontStyle.js69
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/fontVariant.js66
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/fontWeight.js57
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/height.js48
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/left.js47
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/lightingColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/lineHeight.js52
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/margin.js77
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/marginBottom.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/marginLeft.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/marginRight.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/marginTop.js54
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/opacity.js47
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/outlineColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/padding.js78
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/paddingBottom.js55
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/paddingLeft.js55
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/paddingRight.js55
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/paddingTop.js55
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/right.js47
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/stopColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/top.js47
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitTextFillColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js45
-rw-r--r--vanilla/node_modules/cssstyle/lib/properties/width.js48
-rw-r--r--vanilla/node_modules/cssstyle/lib/utils/allExtraProperties.js155
-rw-r--r--vanilla/node_modules/cssstyle/lib/utils/camelize.js37
-rw-r--r--vanilla/node_modules/cssstyle/lib/utils/propertyDescriptors.js55
-rw-r--r--vanilla/node_modules/cssstyle/lib/utils/strings.js173
88 files changed, 30992 insertions, 0 deletions
diff --git a/vanilla/node_modules/cssstyle/lib/CSSStyleDeclaration.js b/vanilla/node_modules/cssstyle/lib/CSSStyleDeclaration.js
new file mode 100644
index 0000000..ab1dcb1
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/CSSStyleDeclaration.js
@@ -0,0 +1,649 @@
+/**
+ * This is a fork from the CSS Style Declaration part of
+ * https://github.com/NV/CSSOM
+ */
+"use strict";
+
+const allProperties = require("./generated/allProperties");
+const implementedProperties = require("./generated/implementedProperties");
+const generatedProperties = require("./generated/properties");
+const {
+ borderProperties,
+ getPositionValue,
+ normalizeProperties,
+ prepareBorderProperties,
+ prepareProperties,
+ shorthandProperties
+} = require("./normalize");
+const {
+ hasVarFunc,
+ isGlobalKeyword,
+ parseCSS,
+ parsePropertyValue,
+ prepareValue
+} = require("./parsers");
+const allExtraProperties = require("./utils/allExtraProperties");
+const { dashedToCamelCase } = require("./utils/camelize");
+const { getPropertyDescriptor } = require("./utils/propertyDescriptors");
+const { asciiLowercase } = require("./utils/strings");
+
+/**
+ * @see https://drafts.csswg.org/cssom/#the-cssstyledeclaration-interface
+ */
+class CSSStyleDeclaration {
+ /**
+ * @param {Function} onChangeCallback
+ * @param {object} [opt]
+ * @param {object} [opt.context] - Window, Element or CSSRule.
+ */
+ constructor(onChangeCallback, opt = {}) {
+ // Make constructor and internals non-enumerable.
+ Object.defineProperties(this, {
+ constructor: {
+ enumerable: false,
+ writable: true
+ },
+
+ // Window
+ _global: {
+ value: globalThis,
+ enumerable: false,
+ writable: true
+ },
+
+ // Element
+ _ownerNode: {
+ value: null,
+ enumerable: false,
+ writable: true
+ },
+
+ // CSSRule
+ _parentNode: {
+ value: null,
+ enumerable: false,
+ writable: true
+ },
+
+ _onChange: {
+ value: null,
+ enumerable: false,
+ writable: true
+ },
+
+ _values: {
+ value: new Map(),
+ enumerable: false,
+ writable: true
+ },
+
+ _priorities: {
+ value: new Map(),
+ enumerable: false,
+ writable: true
+ },
+
+ _length: {
+ value: 0,
+ enumerable: false,
+ writable: true
+ },
+
+ _computed: {
+ value: false,
+ enumerable: false,
+ writable: true
+ },
+
+ _readonly: {
+ value: false,
+ enumerable: false,
+ writable: true
+ },
+
+ _setInProgress: {
+ value: false,
+ enumerable: false,
+ writable: true
+ }
+ });
+
+ const { context } = opt;
+ if (context) {
+ if (typeof context.getComputedStyle === "function") {
+ this._global = context;
+ this._computed = true;
+ this._readonly = true;
+ } else if (context.nodeType === 1 && Object.hasOwn(context, "style")) {
+ this._global = context.ownerDocument.defaultView;
+ this._ownerNode = context;
+ } else if (Object.hasOwn(context, "parentRule")) {
+ this._parentRule = context;
+ // Find Window from the owner node of the StyleSheet.
+ const window = context?.parentStyleSheet?.ownerNode?.ownerDocument?.defaultView;
+ if (window) {
+ this._global = window;
+ }
+ }
+ }
+ if (typeof onChangeCallback === "function") {
+ this._onChange = onChangeCallback;
+ }
+ }
+
+ get cssText() {
+ if (this._computed) {
+ return "";
+ }
+ const properties = new Map();
+ for (let i = 0; i < this._length; i++) {
+ const property = this[i];
+ const value = this.getPropertyValue(property);
+ const priority = this._priorities.get(property) ?? "";
+ if (shorthandProperties.has(property)) {
+ const { shorthandFor } = shorthandProperties.get(property);
+ for (const [longhand] of shorthandFor) {
+ if (priority || !this._priorities.get(longhand)) {
+ properties.delete(longhand);
+ }
+ }
+ }
+ properties.set(property, { property, value, priority });
+ }
+ const normalizedProperties = normalizeProperties(properties);
+ const parts = [];
+ for (const { property, value, priority } of normalizedProperties.values()) {
+ if (priority) {
+ parts.push(`${property}: ${value} !${priority};`);
+ } else {
+ parts.push(`${property}: ${value};`);
+ }
+ }
+ return parts.join(" ");
+ }
+
+ set cssText(val) {
+ if (this._readonly) {
+ const msg = "cssText can not be modified.";
+ const name = "NoModificationAllowedError";
+ throw new this._global.DOMException(msg, name);
+ }
+ Array.prototype.splice.call(this, 0, this._length);
+ this._values.clear();
+ this._priorities.clear();
+ if (this._parentRule || (this._ownerNode && this._setInProgress)) {
+ return;
+ }
+ try {
+ this._setInProgress = true;
+ const valueObj = parseCSS(
+ val,
+ {
+ context: "declarationList",
+ parseValue: false
+ },
+ true
+ );
+ if (valueObj?.children) {
+ const properties = new Map();
+ let shouldSkipNext = false;
+ for (const item of valueObj.children) {
+ if (item.type === "Atrule") {
+ continue;
+ }
+ if (item.type === "Rule") {
+ shouldSkipNext = true;
+ continue;
+ }
+ if (shouldSkipNext === true) {
+ shouldSkipNext = false;
+ continue;
+ }
+ const {
+ important,
+ property,
+ value: { value }
+ } = item;
+ if (typeof property === "string" && typeof value === "string") {
+ const priority = important ? "important" : "";
+ const isCustomProperty = property.startsWith("--");
+ if (isCustomProperty || hasVarFunc(value)) {
+ if (properties.has(property)) {
+ const { priority: itemPriority } = properties.get(property);
+ if (!itemPriority) {
+ properties.set(property, { property, value, priority });
+ }
+ } else {
+ properties.set(property, { property, value, priority });
+ }
+ } else {
+ const parsedValue = parsePropertyValue(property, value, {
+ globalObject: this._global
+ });
+ if (parsedValue) {
+ if (properties.has(property)) {
+ const { priority: itemPriority } = properties.get(property);
+ if (!itemPriority) {
+ properties.set(property, { property, value, priority });
+ }
+ } else {
+ properties.set(property, { property, value, priority });
+ }
+ } else {
+ this.removeProperty(property);
+ }
+ }
+ }
+ }
+ const parsedProperties = prepareProperties(properties, {
+ globalObject: this._global
+ });
+ for (const [property, item] of parsedProperties) {
+ const { priority, value } = item;
+ this._priorities.set(property, priority);
+ this.setProperty(property, value, priority);
+ }
+ }
+ } catch {
+ return;
+ } finally {
+ this._setInProgress = false;
+ }
+ if (typeof this._onChange === "function") {
+ this._onChange(this.cssText);
+ }
+ }
+
+ get length() {
+ return this._length;
+ }
+
+ // This deletes indices if the new length is less then the current length.
+ // If the new length is more, it does nothing, the new indices will be
+ // undefined until set.
+ set length(len) {
+ for (let i = len; i < this._length; i++) {
+ delete this[i];
+ }
+ this._length = len;
+ }
+
+ // Readonly
+ get parentRule() {
+ return this._parentRule;
+ }
+
+ get cssFloat() {
+ return this.getPropertyValue("float");
+ }
+
+ set cssFloat(value) {
+ this._setProperty("float", value);
+ }
+
+ /**
+ * @param {string} property
+ */
+ getPropertyPriority(property) {
+ return this._priorities.get(property) || "";
+ }
+
+ /**
+ * @param {string} property
+ */
+ getPropertyValue(property) {
+ if (this._values.has(property)) {
+ return this._values.get(property).toString();
+ }
+ return "";
+ }
+
+ /**
+ * @param {...number} args
+ */
+ item(...args) {
+ if (!args.length) {
+ const msg = "1 argument required, but only 0 present.";
+ throw new this._global.TypeError(msg);
+ }
+ const [value] = args;
+ const index = parseInt(value);
+ if (Number.isNaN(index) || index < 0 || index >= this._length) {
+ return "";
+ }
+ return this[index];
+ }
+
+ /**
+ * @param {string} property
+ */
+ removeProperty(property) {
+ if (this._readonly) {
+ const msg = `Property ${property} can not be modified.`;
+ const name = "NoModificationAllowedError";
+ throw new this._global.DOMException(msg, name);
+ }
+ if (!this._values.has(property)) {
+ return "";
+ }
+ const prevValue = this._values.get(property);
+ this._values.delete(property);
+ this._priorities.delete(property);
+ const index = Array.prototype.indexOf.call(this, property);
+ if (index >= 0) {
+ Array.prototype.splice.call(this, index, 1);
+ if (typeof this._onChange === "function") {
+ this._onChange(this.cssText);
+ }
+ }
+ return prevValue;
+ }
+
+ /**
+ * @param {string} prop
+ * @param {string} val
+ * @param {string} prior
+ */
+ setProperty(prop, val, prior) {
+ if (this._readonly) {
+ const msg = `Property ${prop} can not be modified.`;
+ const name = "NoModificationAllowedError";
+ throw new this._global.DOMException(msg, name);
+ }
+ const value = prepareValue(val);
+ if (value === "") {
+ this[prop] = "";
+ this.removeProperty(prop);
+ return;
+ }
+ const priority = prior === "important" ? "important" : "";
+ const isCustomProperty = prop.startsWith("--");
+ if (isCustomProperty) {
+ this._setProperty(prop, value, priority);
+ return;
+ }
+ const property = asciiLowercase(prop);
+ if (!allProperties.has(property) && !allExtraProperties.has(property)) {
+ return;
+ }
+ if (priority) {
+ this._priorities.set(property, priority);
+ } else {
+ this._priorities.delete(property);
+ }
+ this[property] = value;
+ }
+}
+
+// Internal methods
+Object.defineProperties(CSSStyleDeclaration.prototype, {
+ _setProperty: {
+ /**
+ * @param {string} property
+ * @param {string} val
+ * @param {string} priority
+ */
+ value(property, val, priority) {
+ if (typeof val !== "string") {
+ return;
+ }
+ if (val === "") {
+ this.removeProperty(property);
+ return;
+ }
+ let originalText = "";
+ if (typeof this._onChange === "function" && !this._setInProgress) {
+ originalText = this.cssText;
+ }
+ if (this._values.has(property)) {
+ const index = Array.prototype.indexOf.call(this, property);
+ // The property already exists but is not indexed into `this` so add it.
+ if (index < 0) {
+ this[this._length] = property;
+ this._length++;
+ }
+ } else {
+ // New property.
+ this[this._length] = property;
+ this._length++;
+ }
+ if (priority === "important") {
+ this._priorities.set(property, priority);
+ } else {
+ this._priorities.delete(property);
+ }
+ this._values.set(property, val);
+ if (
+ typeof this._onChange === "function" &&
+ !this._setInProgress &&
+ this.cssText !== originalText
+ ) {
+ this._onChange(this.cssText);
+ }
+ },
+ enumerable: false
+ },
+
+ _borderSetter: {
+ /**
+ * @param {string} prop
+ * @param {object|Array|string} val
+ * @param {string} prior
+ */
+ value(prop, val, prior) {
+ const properties = new Map();
+ if (prop === "border") {
+ let priority = "";
+ if (typeof prior === "string") {
+ priority = prior;
+ } else {
+ priority = this._priorities.get(prop) ?? "";
+ }
+ properties.set(prop, { propery: prop, value: val, priority });
+ } else {
+ for (let i = 0; i < this._length; i++) {
+ const property = this[i];
+ if (borderProperties.has(property)) {
+ const value = this.getPropertyValue(property);
+ const longhandPriority = this._priorities.get(property) ?? "";
+ let priority = longhandPriority;
+ if (prop === property && typeof prior === "string") {
+ priority = prior;
+ }
+ properties.set(property, { property, value, priority });
+ }
+ }
+ }
+ const parsedProperties = prepareBorderProperties(prop, val, prior, properties, {
+ globalObject: this._global
+ });
+ for (const [property, item] of parsedProperties) {
+ const { priority, value } = item;
+ this._setProperty(property, value, priority);
+ }
+ },
+ enumerable: false
+ },
+
+ _flexBoxSetter: {
+ /**
+ * @param {string} prop
+ * @param {string} val
+ * @param {string} prior
+ * @param {string} shorthandProperty
+ */
+ value(prop, val, prior, shorthandProperty) {
+ if (!shorthandProperty || !shorthandProperties.has(shorthandProperty)) {
+ return;
+ }
+ const shorthandPriority = this._priorities.get(shorthandProperty);
+ this.removeProperty(shorthandProperty);
+ let priority = "";
+ if (typeof prior === "string") {
+ priority = prior;
+ } else {
+ priority = this._priorities.get(prop) ?? "";
+ }
+ this.removeProperty(prop);
+ if (shorthandPriority && priority) {
+ this._setProperty(prop, val);
+ } else {
+ this._setProperty(prop, val, priority);
+ }
+ if (val && !hasVarFunc(val)) {
+ const longhandValues = [];
+ const shorthandItem = shorthandProperties.get(shorthandProperty);
+ let hasGlobalKeyword = false;
+ for (const [longhandProperty] of shorthandItem.shorthandFor) {
+ if (longhandProperty === prop) {
+ if (isGlobalKeyword(val)) {
+ hasGlobalKeyword = true;
+ }
+ longhandValues.push(val);
+ } else {
+ const longhandValue = this.getPropertyValue(longhandProperty);
+ const longhandPriority = this._priorities.get(longhandProperty) ?? "";
+ if (!longhandValue || longhandPriority !== priority) {
+ break;
+ }
+ if (isGlobalKeyword(longhandValue)) {
+ hasGlobalKeyword = true;
+ }
+ longhandValues.push(longhandValue);
+ }
+ }
+ if (longhandValues.length === shorthandItem.shorthandFor.size) {
+ if (hasGlobalKeyword) {
+ const [firstValue, ...restValues] = longhandValues;
+ if (restValues.every((value) => value === firstValue)) {
+ this._setProperty(shorthandProperty, firstValue, priority);
+ }
+ } else {
+ const parsedValue = shorthandItem.parse(longhandValues.join(" "));
+ const shorthandValue = Object.values(parsedValue).join(" ");
+ this._setProperty(shorthandProperty, shorthandValue, priority);
+ }
+ }
+ }
+ },
+ enumerable: false
+ },
+
+ _positionShorthandSetter: {
+ /**
+ * @param {string} prop
+ * @param {Array|string} val
+ * @param {string} prior
+ */
+ value(prop, val, prior) {
+ if (!shorthandProperties.has(prop)) {
+ return;
+ }
+ const shorthandValues = [];
+ if (Array.isArray(val)) {
+ shorthandValues.push(...val);
+ } else if (typeof val === "string") {
+ shorthandValues.push(val);
+ } else {
+ return;
+ }
+ let priority = "";
+ if (typeof prior === "string") {
+ priority = prior;
+ } else {
+ priority = this._priorities.get(prop) ?? "";
+ }
+ const { position, shorthandFor } = shorthandProperties.get(prop);
+ let hasPriority = false;
+ for (const [longhandProperty, longhandItem] of shorthandFor) {
+ const { position: longhandPosition } = longhandItem;
+ const longhandValue = getPositionValue(shorthandValues, longhandPosition);
+ if (priority) {
+ this._setProperty(longhandProperty, longhandValue, priority);
+ } else {
+ const longhandPriority = this._priorities.get(longhandProperty) ?? "";
+ if (longhandPriority) {
+ hasPriority = true;
+ } else {
+ this._setProperty(longhandProperty, longhandValue, priority);
+ }
+ }
+ }
+ if (hasPriority) {
+ this.removeProperty(prop);
+ } else {
+ const shorthandValue = getPositionValue(shorthandValues, position);
+ this._setProperty(prop, shorthandValue, priority);
+ }
+ },
+ enumerable: false
+ },
+
+ _positionLonghandSetter: {
+ /**
+ * @param {string} prop
+ * @param {string} val
+ * @param {string} prior
+ * @param {string} shorthandProperty
+ */
+ value(prop, val, prior, shorthandProperty) {
+ if (!shorthandProperty || !shorthandProperties.has(shorthandProperty)) {
+ return;
+ }
+ const shorthandPriority = this._priorities.get(shorthandProperty);
+ this.removeProperty(shorthandProperty);
+ let priority = "";
+ if (typeof prior === "string") {
+ priority = prior;
+ } else {
+ priority = this._priorities.get(prop) ?? "";
+ }
+ this.removeProperty(prop);
+ if (shorthandPriority && priority) {
+ this._setProperty(prop, val);
+ } else {
+ this._setProperty(prop, val, priority);
+ }
+ if (val && !hasVarFunc(val)) {
+ const longhandValues = [];
+ const { shorthandFor, position: shorthandPosition } =
+ shorthandProperties.get(shorthandProperty);
+ for (const [longhandProperty] of shorthandFor) {
+ const longhandValue = this.getPropertyValue(longhandProperty);
+ const longhandPriority = this._priorities.get(longhandProperty) ?? "";
+ if (!longhandValue || longhandPriority !== priority) {
+ return;
+ }
+ longhandValues.push(longhandValue);
+ }
+ if (longhandValues.length === shorthandFor.size) {
+ const replacedValue = getPositionValue(longhandValues, shorthandPosition);
+ this._setProperty(shorthandProperty, replacedValue);
+ }
+ }
+ },
+ enumerable: false
+ }
+});
+
+// Properties
+Object.defineProperties(CSSStyleDeclaration.prototype, generatedProperties);
+
+// Additional properties
+[...allProperties, ...allExtraProperties].forEach((property) => {
+ if (!implementedProperties.has(property)) {
+ const declaration = getPropertyDescriptor(property);
+ Object.defineProperty(CSSStyleDeclaration.prototype, property, declaration);
+ const camel = dashedToCamelCase(property);
+ Object.defineProperty(CSSStyleDeclaration.prototype, camel, declaration);
+ if (/^webkit[A-Z]/.test(camel)) {
+ const pascal = camel.replace(/^webkit/, "Webkit");
+ Object.defineProperty(CSSStyleDeclaration.prototype, pascal, declaration);
+ }
+ }
+});
+
+module.exports = {
+ CSSStyleDeclaration,
+ propertyList: Object.fromEntries(implementedProperties)
+};
diff --git a/vanilla/node_modules/cssstyle/lib/generated/allProperties.js b/vanilla/node_modules/cssstyle/lib/generated/allProperties.js
new file mode 100644
index 0000000..a7a8c6c
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/generated/allProperties.js
@@ -0,0 +1,653 @@
+"use strict";
+// autogenerated - 2025-08-02
+// https://www.w3.org/Style/CSS/all-properties.en.html
+
+module.exports = new Set([
+ "-webkit-line-clamp",
+ "accent-color",
+ "align-content",
+ "align-items",
+ "align-self",
+ "alignment-baseline",
+ "all",
+ "anchor-name",
+ "anchor-scope",
+ "animation",
+ "animation-composition",
+ "animation-delay",
+ "animation-direction",
+ "animation-duration",
+ "animation-fill-mode",
+ "animation-iteration-count",
+ "animation-name",
+ "animation-play-state",
+ "animation-range",
+ "animation-range-end",
+ "animation-range-start",
+ "animation-timeline",
+ "animation-timing-function",
+ "appearance",
+ "aspect-ratio",
+ "azimuth",
+ "backface-visibility",
+ "background",
+ "background-attachment",
+ "background-blend-mode",
+ "background-clip",
+ "background-color",
+ "background-image",
+ "background-origin",
+ "background-position",
+ "background-repeat",
+ "background-size",
+ "baseline-shift",
+ "baseline-source",
+ "block-ellipsis",
+ "block-size",
+ "block-step",
+ "block-step-align",
+ "block-step-insert",
+ "block-step-round",
+ "block-step-size",
+ "bookmark-label",
+ "bookmark-level",
+ "bookmark-state",
+ "border",
+ "border-block",
+ "border-block-color",
+ "border-block-end",
+ "border-block-end-color",
+ "border-block-end-radius",
+ "border-block-end-style",
+ "border-block-end-width",
+ "border-block-start",
+ "border-block-start-color",
+ "border-block-start-radius",
+ "border-block-start-style",
+ "border-block-start-width",
+ "border-block-style",
+ "border-block-width",
+ "border-bottom",
+ "border-bottom-color",
+ "border-bottom-left-radius",
+ "border-bottom-radius",
+ "border-bottom-right-radius",
+ "border-bottom-style",
+ "border-bottom-width",
+ "border-boundary",
+ "border-clip",
+ "border-clip-bottom",
+ "border-clip-left",
+ "border-clip-right",
+ "border-clip-top",
+ "border-collapse",
+ "border-color",
+ "border-end-end-radius",
+ "border-end-start-radius",
+ "border-image",
+ "border-image-outset",
+ "border-image-repeat",
+ "border-image-slice",
+ "border-image-source",
+ "border-image-width",
+ "border-inline",
+ "border-inline-color",
+ "border-inline-end",
+ "border-inline-end-color",
+ "border-inline-end-radius",
+ "border-inline-end-style",
+ "border-inline-end-width",
+ "border-inline-start",
+ "border-inline-start-color",
+ "border-inline-start-radius",
+ "border-inline-start-style",
+ "border-inline-start-width",
+ "border-inline-style",
+ "border-inline-width",
+ "border-left",
+ "border-left-color",
+ "border-left-radius",
+ "border-left-style",
+ "border-left-width",
+ "border-limit",
+ "border-radius",
+ "border-right",
+ "border-right-color",
+ "border-right-radius",
+ "border-right-style",
+ "border-right-width",
+ "border-shape",
+ "border-spacing",
+ "border-start-end-radius",
+ "border-start-start-radius",
+ "border-style",
+ "border-top",
+ "border-top-color",
+ "border-top-left-radius",
+ "border-top-radius",
+ "border-top-right-radius",
+ "border-top-style",
+ "border-top-width",
+ "border-width",
+ "bottom",
+ "box-decoration-break",
+ "box-shadow",
+ "box-shadow-blur",
+ "box-shadow-color",
+ "box-shadow-offset",
+ "box-shadow-position",
+ "box-shadow-spread",
+ "box-sizing",
+ "box-snap",
+ "break-after",
+ "break-before",
+ "break-inside",
+ "caption-side",
+ "caret",
+ "caret-color",
+ "caret-shape",
+ "clear",
+ "clip",
+ "clip-path",
+ "clip-rule",
+ "color",
+ "color-adjust",
+ "color-interpolation-filters",
+ "color-scheme",
+ "column-count",
+ "column-fill",
+ "column-gap",
+ "column-rule",
+ "column-rule-break",
+ "column-rule-color",
+ "column-rule-outset",
+ "column-rule-style",
+ "column-rule-width",
+ "column-span",
+ "column-width",
+ "columns",
+ "contain",
+ "contain-intrinsic-block-size",
+ "contain-intrinsic-height",
+ "contain-intrinsic-inline-size",
+ "contain-intrinsic-size",
+ "contain-intrinsic-width",
+ "container",
+ "container-name",
+ "container-type",
+ "content",
+ "content-visibility",
+ "continue",
+ "corner-block-end-shape",
+ "corner-block-start-shape",
+ "corner-bottom-left-shape",
+ "corner-bottom-right-shape",
+ "corner-bottom-shape",
+ "corner-end-end-shape",
+ "corner-end-start-shape",
+ "corner-inline-end-shape",
+ "corner-inline-start-shape",
+ "corner-left-shape",
+ "corner-right-shape",
+ "corner-shape",
+ "corner-start-end-shape",
+ "corner-start-start-shape",
+ "corner-top-left-shape",
+ "corner-top-right-shape",
+ "corner-top-shape",
+ "counter-increment",
+ "counter-reset",
+ "counter-set",
+ "cue",
+ "cue-after",
+ "cue-before",
+ "cursor",
+ "direction",
+ "display",
+ "dominant-baseline",
+ "dynamic-range-limit",
+ "elevation",
+ "empty-cells",
+ "fill",
+ "fill-break",
+ "fill-color",
+ "fill-image",
+ "fill-opacity",
+ "fill-origin",
+ "fill-position",
+ "fill-repeat",
+ "fill-rule",
+ "fill-size",
+ "filter",
+ "flex",
+ "flex-basis",
+ "flex-direction",
+ "flex-flow",
+ "flex-grow",
+ "flex-shrink",
+ "flex-wrap",
+ "float",
+ "float-defer",
+ "float-offset",
+ "float-reference",
+ "flood-color",
+ "flood-opacity",
+ "flow-from",
+ "flow-into",
+ "font",
+ "font-family",
+ "font-feature-settings",
+ "font-kerning",
+ "font-language-override",
+ "font-optical-sizing",
+ "font-palette",
+ "font-size",
+ "font-size-adjust",
+ "font-stretch",
+ "font-style",
+ "font-synthesis",
+ "font-synthesis-position",
+ "font-synthesis-small-caps",
+ "font-synthesis-style",
+ "font-synthesis-weight",
+ "font-variant",
+ "font-variant-alternates",
+ "font-variant-caps",
+ "font-variant-east-asian",
+ "font-variant-emoji",
+ "font-variant-ligatures",
+ "font-variant-numeric",
+ "font-variant-position",
+ "font-variation-settings",
+ "font-weight",
+ "font-width",
+ "footnote-display",
+ "footnote-policy",
+ "forced-color-adjust",
+ "gap",
+ "glyph-orientation-vertical",
+ "grid",
+ "grid-area",
+ "grid-auto-columns",
+ "grid-auto-flow",
+ "grid-auto-rows",
+ "grid-column",
+ "grid-column-end",
+ "grid-column-start",
+ "grid-row",
+ "grid-row-end",
+ "grid-row-start",
+ "grid-template",
+ "grid-template-areas",
+ "grid-template-columns",
+ "grid-template-rows",
+ "hanging-punctuation",
+ "height",
+ "hyphenate-character",
+ "hyphenate-limit-chars",
+ "hyphenate-limit-last",
+ "hyphenate-limit-lines",
+ "hyphenate-limit-zone",
+ "hyphens",
+ "image-orientation",
+ "image-rendering",
+ "image-resolution",
+ "initial-letter",
+ "initial-letter-align",
+ "initial-letter-wrap",
+ "inline-size",
+ "inline-sizing",
+ "inset",
+ "inset-block",
+ "inset-block-end",
+ "inset-block-start",
+ "inset-inline",
+ "inset-inline-end",
+ "inset-inline-start",
+ "interpolate-size",
+ "isolation",
+ "item-cross",
+ "item-direction",
+ "item-flow",
+ "item-pack",
+ "item-slack",
+ "item-track",
+ "item-wrap",
+ "justify-content",
+ "justify-items",
+ "justify-self",
+ "left",
+ "letter-spacing",
+ "lighting-color",
+ "line-break",
+ "line-clamp",
+ "line-fit-edge",
+ "line-grid",
+ "line-height",
+ "line-height-step",
+ "line-padding",
+ "line-snap",
+ "list-style",
+ "list-style-image",
+ "list-style-position",
+ "list-style-type",
+ "margin",
+ "margin-block",
+ "margin-block-end",
+ "margin-block-start",
+ "margin-bottom",
+ "margin-break",
+ "margin-inline",
+ "margin-inline-end",
+ "margin-inline-start",
+ "margin-left",
+ "margin-right",
+ "margin-top",
+ "margin-trim",
+ "marker",
+ "marker-end",
+ "marker-knockout-left",
+ "marker-knockout-right",
+ "marker-mid",
+ "marker-pattern",
+ "marker-segment",
+ "marker-side",
+ "marker-start",
+ "mask",
+ "mask-border",
+ "mask-border-mode",
+ "mask-border-outset",
+ "mask-border-repeat",
+ "mask-border-slice",
+ "mask-border-source",
+ "mask-border-width",
+ "mask-clip",
+ "mask-composite",
+ "mask-image",
+ "mask-mode",
+ "mask-origin",
+ "mask-position",
+ "mask-repeat",
+ "mask-size",
+ "mask-type",
+ "max-block-size",
+ "max-height",
+ "max-inline-size",
+ "max-lines",
+ "max-width",
+ "min-block-size",
+ "min-height",
+ "min-inline-size",
+ "min-intrinsic-sizing",
+ "min-width",
+ "mix-blend-mode",
+ "nav-down",
+ "nav-left",
+ "nav-right",
+ "nav-up",
+ "object-fit",
+ "object-position",
+ "offset",
+ "offset-anchor",
+ "offset-distance",
+ "offset-path",
+ "offset-position",
+ "offset-rotate",
+ "opacity",
+ "order",
+ "orphans",
+ "outline",
+ "outline-color",
+ "outline-offset",
+ "outline-style",
+ "outline-width",
+ "overflow",
+ "overflow-anchor",
+ "overflow-block",
+ "overflow-clip-margin",
+ "overflow-clip-margin-block",
+ "overflow-clip-margin-block-end",
+ "overflow-clip-margin-block-start",
+ "overflow-clip-margin-bottom",
+ "overflow-clip-margin-inline",
+ "overflow-clip-margin-inline-end",
+ "overflow-clip-margin-inline-start",
+ "overflow-clip-margin-left",
+ "overflow-clip-margin-right",
+ "overflow-clip-margin-top",
+ "overflow-inline",
+ "overflow-wrap",
+ "overflow-x",
+ "overflow-y",
+ "overlay",
+ "overscroll-behavior",
+ "overscroll-behavior-block",
+ "overscroll-behavior-inline",
+ "overscroll-behavior-x",
+ "overscroll-behavior-y",
+ "padding",
+ "padding-block",
+ "padding-block-end",
+ "padding-block-start",
+ "padding-bottom",
+ "padding-inline",
+ "padding-inline-end",
+ "padding-inline-start",
+ "padding-left",
+ "padding-right",
+ "padding-top",
+ "page",
+ "page-break-after",
+ "page-break-before",
+ "page-break-inside",
+ "pause",
+ "pause-after",
+ "pause-before",
+ "perspective",
+ "perspective-origin",
+ "pitch",
+ "pitch-range",
+ "place-content",
+ "place-items",
+ "place-self",
+ "play-during",
+ "position",
+ "position-anchor",
+ "position-area",
+ "position-try",
+ "position-try-fallbacks",
+ "position-try-order",
+ "position-visibility",
+ "print-color-adjust",
+ "quotes",
+ "reading-flow",
+ "region-fragment",
+ "resize",
+ "rest",
+ "rest-after",
+ "rest-before",
+ "richness",
+ "right",
+ "rotate",
+ "row-gap",
+ "row-rule",
+ "row-rule-break",
+ "row-rule-color",
+ "row-rule-outset",
+ "row-rule-style",
+ "row-rule-width",
+ "ruby-align",
+ "ruby-merge",
+ "ruby-overhang",
+ "ruby-position",
+ "rule",
+ "rule-break",
+ "rule-color",
+ "rule-outset",
+ "rule-paint-order",
+ "rule-style",
+ "rule-width",
+ "running",
+ "scale",
+ "scroll-behavior",
+ "scroll-margin",
+ "scroll-margin-block",
+ "scroll-margin-block-end",
+ "scroll-margin-block-start",
+ "scroll-margin-bottom",
+ "scroll-margin-inline",
+ "scroll-margin-inline-end",
+ "scroll-margin-inline-start",
+ "scroll-margin-left",
+ "scroll-margin-right",
+ "scroll-margin-top",
+ "scroll-marker-group",
+ "scroll-padding",
+ "scroll-padding-block",
+ "scroll-padding-block-end",
+ "scroll-padding-block-start",
+ "scroll-padding-bottom",
+ "scroll-padding-inline",
+ "scroll-padding-inline-end",
+ "scroll-padding-inline-start",
+ "scroll-padding-left",
+ "scroll-padding-right",
+ "scroll-padding-top",
+ "scroll-snap-align",
+ "scroll-snap-stop",
+ "scroll-snap-type",
+ "scroll-start-target",
+ "scroll-timeline",
+ "scroll-timeline-axis",
+ "scroll-timeline-name",
+ "scrollbar-color",
+ "scrollbar-gutter",
+ "scrollbar-width",
+ "shape-image-threshold",
+ "shape-inside",
+ "shape-margin",
+ "shape-outside",
+ "slider-orientation",
+ "spatial-navigation-action",
+ "spatial-navigation-contain",
+ "spatial-navigation-function",
+ "speak",
+ "speak-as",
+ "speak-header",
+ "speak-numeral",
+ "speak-punctuation",
+ "speech-rate",
+ "stress",
+ "string-set",
+ "stroke",
+ "stroke-align",
+ "stroke-alignment",
+ "stroke-break",
+ "stroke-color",
+ "stroke-dash-corner",
+ "stroke-dash-justify",
+ "stroke-dashadjust",
+ "stroke-dasharray",
+ "stroke-dashcorner",
+ "stroke-dashoffset",
+ "stroke-image",
+ "stroke-linecap",
+ "stroke-linejoin",
+ "stroke-miterlimit",
+ "stroke-opacity",
+ "stroke-origin",
+ "stroke-position",
+ "stroke-repeat",
+ "stroke-size",
+ "stroke-width",
+ "tab-size",
+ "table-layout",
+ "text-align",
+ "text-align-all",
+ "text-align-last",
+ "text-autospace",
+ "text-box",
+ "text-box-edge",
+ "text-box-trim",
+ "text-combine-upright",
+ "text-decoration",
+ "text-decoration-color",
+ "text-decoration-line",
+ "text-decoration-skip",
+ "text-decoration-skip-box",
+ "text-decoration-skip-ink",
+ "text-decoration-skip-inset",
+ "text-decoration-skip-self",
+ "text-decoration-skip-spaces",
+ "text-decoration-style",
+ "text-decoration-thickness",
+ "text-emphasis",
+ "text-emphasis-color",
+ "text-emphasis-position",
+ "text-emphasis-skip",
+ "text-emphasis-style",
+ "text-group-align",
+ "text-indent",
+ "text-justify",
+ "text-orientation",
+ "text-overflow",
+ "text-shadow",
+ "text-spacing",
+ "text-spacing-trim",
+ "text-transform",
+ "text-underline-offset",
+ "text-underline-position",
+ "text-wrap",
+ "text-wrap-mode",
+ "text-wrap-style",
+ "timeline-scope",
+ "top",
+ "transform",
+ "transform-box",
+ "transform-origin",
+ "transform-style",
+ "transition",
+ "transition-behavior",
+ "transition-delay",
+ "transition-duration",
+ "transition-property",
+ "transition-timing-function",
+ "translate",
+ "unicode-bidi",
+ "user-select",
+ "vertical-align",
+ "view-timeline",
+ "view-timeline-axis",
+ "view-timeline-inset",
+ "view-timeline-name",
+ "view-transition-class",
+ "view-transition-group",
+ "view-transition-name",
+ "visibility",
+ "voice-balance",
+ "voice-duration",
+ "voice-family",
+ "voice-pitch",
+ "voice-range",
+ "voice-rate",
+ "voice-stress",
+ "voice-volume",
+ "volume",
+ "white-space",
+ "white-space-collapse",
+ "white-space-trim",
+ "widows",
+ "width",
+ "will-change",
+ "word-break",
+ "word-space-transform",
+ "word-spacing",
+ "word-wrap",
+ "wrap-after",
+ "wrap-before",
+ "wrap-flow",
+ "wrap-inside",
+ "wrap-through",
+ "writing-mode",
+ "z-index"
+]);
diff --git a/vanilla/node_modules/cssstyle/lib/generated/implementedProperties.js b/vanilla/node_modules/cssstyle/lib/generated/implementedProperties.js
new file mode 100644
index 0000000..4d81c34
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/generated/implementedProperties.js
@@ -0,0 +1,1466 @@
+"use strict";
+// autogenerated - 2026-01-06
+
+module.exports = new Map([
+ [
+ "-webkit-border-after-color",
+ null
+ ],
+ [
+ "-webkit-border-before-color",
+ null
+ ],
+ [
+ "-webkit-border-end-color",
+ null
+ ],
+ [
+ "-webkit-border-start-color",
+ null
+ ],
+ [
+ "-webkit-column-rule-color",
+ null
+ ],
+ [
+ "-webkit-tap-highlight-color",
+ null
+ ],
+ [
+ "-webkit-text-emphasis-color",
+ null
+ ],
+ [
+ "-webkit-text-fill-color",
+ {
+ "name": "-webkit-text-fill-color",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-fill-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "an RGBA color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "media": "visual",
+ "styleDeclaration": [
+ "-webkit-text-fill-color",
+ "WebkitTextFillColor",
+ "webkitTextFillColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "-webkit-text-stroke-color",
+ {
+ "name": "-webkit-text-stroke-color",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-stroke-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "an RGBA color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "media": "visual",
+ "styleDeclaration": [
+ "-webkit-text-stroke-color",
+ "WebkitTextStrokeColor",
+ "webkitTextStrokeColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "background",
+ {
+ "name": "background",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "background"
+ ],
+ "syntax": "<bg-layer>#? , <final-bg-layer>",
+ "extended": []
+ }
+ ],
+ [
+ "background-attachment",
+ {
+ "name": "background-attachment",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-attachment",
+ "initial": "scroll",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "background-attachment",
+ "backgroundAttachment"
+ ],
+ "syntax": "<attachment>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-clip",
+ {
+ "name": "background-clip",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-clip",
+ "initial": "border-box",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-clip",
+ "backgroundClip"
+ ],
+ "syntax": "<bg-clip>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-color",
+ {
+ "name": "background-color",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-color",
+ "initial": "transparent",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "background-color",
+ "backgroundColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "background-image",
+ {
+ "name": "background-image",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-image",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either an <image> or the keyword none",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "background-image",
+ "backgroundImage"
+ ],
+ "syntax": "<bg-image>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-origin",
+ {
+ "name": "background-origin",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-origin",
+ "initial": "padding-box",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-origin",
+ "backgroundOrigin"
+ ],
+ "syntax": "<visual-box>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-position",
+ {
+ "name": "background-position",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position",
+ "initial": "0% 0%",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "refer to size of background positioning area minus size of background image; see text",
+ "computedValue": "a list, each item a pair of offsets (horizontal and vertical) from the top left origin, each offset given as a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-position",
+ "backgroundPosition"
+ ],
+ "syntax": "<bg-position>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-repeat",
+ {
+ "name": "background-repeat",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-repeat",
+ "initial": "repeat",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a pair of keywords, one per dimension",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "background-repeat",
+ "backgroundRepeat"
+ ],
+ "syntax": "<repeat-style>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-size",
+ {
+ "name": "background-size",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-size",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "see text",
+ "computedValue": "list, each item a pair of sizes (one per axis) each represented as either a keyword or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-size",
+ "backgroundSize"
+ ],
+ "syntax": "<bg-size>#",
+ "extended": []
+ }
+ ],
+ [
+ "border",
+ {
+ "name": "border",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom",
+ {
+ "name": "border-bottom",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-bottom",
+ "borderBottom"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-color",
+ {
+ "name": "border-bottom-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-bottom-color",
+ "borderBottomColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-style",
+ {
+ "name": "border-bottom-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-bottom-style",
+ "borderBottomStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-width",
+ {
+ "name": "border-bottom-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-bottom-width",
+ "borderBottomWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-collapse",
+ {
+ "name": "border-collapse",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-border-collapse",
+ "initial": "separate",
+ "appliesTo": "table grid boxes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "border-collapse",
+ "borderCollapse"
+ ],
+ "syntax": "separate | collapse",
+ "extended": []
+ }
+ ],
+ [
+ "border-color",
+ {
+ "name": "border-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-color",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-color",
+ "borderColor"
+ ],
+ "syntax": "[ <color> | <image-1D> ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "border-left",
+ {
+ "name": "border-left",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-left",
+ "borderLeft"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-color",
+ {
+ "name": "border-left-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-left-color",
+ "borderLeftColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-style",
+ {
+ "name": "border-left-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-left-style",
+ "borderLeftStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-width",
+ {
+ "name": "border-left-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-left-width",
+ "borderLeftWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right",
+ {
+ "name": "border-right",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-right",
+ "borderRight"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-color",
+ {
+ "name": "border-right-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-right-color",
+ "borderRightColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-style",
+ {
+ "name": "border-right-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-right-style",
+ "borderRightStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-width",
+ {
+ "name": "border-right-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-right-width",
+ "borderRightWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-spacing",
+ {
+ "name": "border-spacing",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-border-spacing",
+ "initial": "0px 0px",
+ "appliesTo": "table grid boxes when border-collapse is separate",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "two absolute lengths",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "border-spacing",
+ "borderSpacing"
+ ],
+ "syntax": "<length>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-style",
+ {
+ "name": "border-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-style",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-style",
+ "borderStyle"
+ ],
+ "syntax": "<'border-top-style'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "border-top",
+ {
+ "name": "border-top",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-top",
+ "borderTop"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-color",
+ {
+ "name": "border-top-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-top-color",
+ "borderTopColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-style",
+ {
+ "name": "border-top-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-top-style",
+ "borderTopStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-width",
+ {
+ "name": "border-top-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-top-width",
+ "borderTopWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-width",
+ {
+ "name": "border-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-width",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-width",
+ "borderWidth"
+ ],
+ "syntax": "<'border-top-width'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "bottom",
+ {
+ "name": "bottom",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-bottom",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "bottom"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "clear",
+ {
+ "name": "clear",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-clear",
+ "initial": "none",
+ "appliesTo": "block-level elements, floats, regions, pages",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "clear"
+ ],
+ "syntax": "inline-start | inline-end | block-start | block-end | left | right | top | bottom | both-inline | both-block | both | none",
+ "extended": []
+ }
+ ],
+ [
+ "clip",
+ {
+ "name": "clip",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-clip",
+ "initial": "auto",
+ "appliesTo": "Absolutely positioned elements. In SVG, it applies to elements which establish a new viewport, pattern elements and mask elements.",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "clip"
+ ],
+ "syntax": "<rect()> | auto",
+ "extended": []
+ }
+ ],
+ [
+ "color",
+ {
+ "name": "color",
+ "href": "https://drafts.csswg.org/css-color-4/#propdef-color",
+ "initial": "CanvasText",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "computed color, see resolving color values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "color"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "display",
+ {
+ "name": "display",
+ "href": "https://drafts.csswg.org/css-display-4/#propdef-display",
+ "initial": "inline",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "a pair of keywords representing the inner and outer display types plus optional list-item flag, or a <display-internal> or <display-box> keyword; see prose in a variety of specs for computation rules",
+ "canonicalOrder": "per grammar",
+ "animationType": "see § 2.9 Animating and Interpolating display",
+ "styleDeclaration": [
+ "display"
+ ],
+ "syntax": "[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy> | <display-outside> || [ <display-inside> | math ]",
+ "extended": [
+ "https://w3c.github.io/mathml-core/"
+ ]
+ }
+ ],
+ [
+ "flex",
+ {
+ "name": "flex",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex",
+ "initial": "0 1 auto",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "by computed value type",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "flex"
+ ],
+ "syntax": "none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]",
+ "extended": []
+ }
+ ],
+ [
+ "flex-basis",
+ {
+ "name": "flex-basis",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-basis",
+ "initial": "auto",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "relative to the flex container’s inner main size",
+ "computedValue": "specified keyword or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "flex-basis",
+ "flexBasis"
+ ],
+ "syntax": "content | <'width'>",
+ "extended": []
+ }
+ ],
+ [
+ "flex-grow",
+ {
+ "name": "flex-grow",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-grow",
+ "initial": "0",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified number",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "flex-grow",
+ "flexGrow"
+ ],
+ "syntax": "<number [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "flex-shrink",
+ {
+ "name": "flex-shrink",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-shrink",
+ "initial": "1",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "number",
+ "styleDeclaration": [
+ "flex-shrink",
+ "flexShrink"
+ ],
+ "syntax": "<number [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "float",
+ {
+ "name": "float",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-float",
+ "initial": "none",
+ "appliesTo": "all elements.",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "float"
+ ],
+ "syntax": "block-start | block-end | inline-start | inline-end | snap-block | <snap-block()> | snap-inline | <snap-inline()> | left | right | top | bottom | none | footnote",
+ "extended": [
+ "https://drafts.csswg.org/css-gcpm-3/"
+ ]
+ }
+ ],
+ [
+ "flood-color",
+ {
+ "name": "flood-color",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-flood-color",
+ "initial": "black",
+ "appliesTo": "feFlood and feDropShadow elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "flood-color",
+ "floodColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "font",
+ {
+ "name": "font",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font",
+ "initial": "see individual properties",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "see individual properties",
+ "styleDeclaration": [
+ "font"
+ ],
+ "syntax": "[ [ <'font-style'> || <font-variant-css2> || <'font-weight'> || <font-width-css3> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'># ] | <system-family-name>",
+ "extended": []
+ }
+ ],
+ [
+ "font-family",
+ {
+ "name": "font-family",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-family",
+ "initial": "depends on user agent",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "list, each item a string and/or <generic-family> keywords",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-family",
+ "fontFamily"
+ ],
+ "syntax": "[ <family-name> | <generic-family> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "font-size",
+ {
+ "name": "font-size",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-size",
+ "initial": "medium",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "refer to parent element’s font size",
+ "computedValue": "an absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "font-size",
+ "fontSize"
+ ],
+ "syntax": "<absolute-size> | <relative-size> | <length-percentage [0,∞]> | math",
+ "extended": []
+ }
+ ],
+ [
+ "font-style",
+ {
+ "name": "font-style",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-style",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword specified, plus angle in degrees if specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type;normal animates as oblique 0deg",
+ "styleDeclaration": [
+ "font-style",
+ "fontStyle"
+ ],
+ "syntax": "normal | italic | left | right | oblique <angle [-90deg,90deg]>?",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant",
+ {
+ "name": "font-variant",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant",
+ "fontVariant"
+ ],
+ "syntax": "normal | none | [ [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ] || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] || [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ] || [ <east-asian-variant-values> || <east-asian-width-values> || ruby ] || [ sub | super ] || [ text | emoji | unicode ] ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-weight",
+ {
+ "name": "font-weight",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-weight",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "a number, see below",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "font-weight",
+ "fontWeight"
+ ],
+ "syntax": "<font-weight-absolute> | bolder | lighter",
+ "extended": []
+ }
+ ],
+ [
+ "height",
+ {
+ "name": "height",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-height",
+ "initial": "auto",
+ "appliesTo": "all elements except non-replaced inlines",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type, recursing into fit-content()",
+ "logicalPropertyGroup": "size",
+ "styleDeclaration": [
+ "height"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "left",
+ {
+ "name": "left",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-left",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "left"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "lighting-color",
+ {
+ "name": "lighting-color",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-lighting-color",
+ "initial": "white",
+ "appliesTo": "feDiffuseLighting and feSpecularLighting elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "lighting-color",
+ "lightingColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "line-height",
+ {
+ "name": "line-height",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-line-height",
+ "initial": "normal",
+ "appliesTo": "non-replaced inline boxes and SVG text content elements",
+ "inherited": "yes",
+ "percentages": "computed relative to 1em",
+ "computedValue": "the specified keyword, a number, or a computed <length> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "line-height",
+ "lineHeight"
+ ],
+ "syntax": "normal | <number [0,∞]> | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "margin",
+ {
+ "name": "margin",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "margin"
+ ],
+ "syntax": "<'margin-top'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "margin-bottom",
+ {
+ "name": "margin-bottom",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-bottom",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-bottom",
+ "marginBottom"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-left",
+ {
+ "name": "margin-left",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-left",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-left",
+ "marginLeft"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-right",
+ {
+ "name": "margin-right",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-right",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-right",
+ "marginRight"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-top",
+ {
+ "name": "margin-top",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-top",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-top",
+ "marginTop"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "opacity",
+ {
+ "name": "opacity",
+ "href": "https://drafts.csswg.org/css-color-4/#propdef-opacity",
+ "initial": "1",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "map to the range [0,1]",
+ "computedValue": "specified number, clamped to the range [0,1]",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "opacity"
+ ],
+ "syntax": "<opacity-value>",
+ "extended": []
+ }
+ ],
+ [
+ "outline-color",
+ {
+ "name": "outline-color",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-outline-color",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see below",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "outline-color",
+ "outlineColor"
+ ],
+ "syntax": "auto | <'border-top-color'>",
+ "extended": []
+ }
+ ],
+ [
+ "padding",
+ {
+ "name": "padding",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "padding"
+ ],
+ "syntax": "<'padding-top'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "padding-bottom",
+ {
+ "name": "padding-bottom",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-bottom",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-bottom",
+ "paddingBottom"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-left",
+ {
+ "name": "padding-left",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-left",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-left",
+ "paddingLeft"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-right",
+ {
+ "name": "padding-right",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-right",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-right",
+ "paddingRight"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-top",
+ {
+ "name": "padding-top",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-top",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-top",
+ "paddingTop"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "right",
+ {
+ "name": "right",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-right",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "right"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "stop-color",
+ {
+ "name": "stop-color",
+ "href": "https://svgwg.org/svg2-draft/pservers.html#StopColorProperty",
+ "styleDeclaration": [
+ "stop-color",
+ "stopColor"
+ ],
+ "extended": []
+ }
+ ],
+ [
+ "top",
+ {
+ "name": "top",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-top",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "top"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "width",
+ {
+ "name": "width",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-width",
+ "initial": "auto",
+ "appliesTo": "all elements except non-replaced inlines",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type, recursing into fit-content()",
+ "logicalPropertyGroup": "size",
+ "styleDeclaration": [
+ "width"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ]
+]);
diff --git a/vanilla/node_modules/cssstyle/lib/generated/properties.js b/vanilla/node_modules/cssstyle/lib/generated/properties.js
new file mode 100644
index 0000000..8399ea6
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/generated/properties.js
@@ -0,0 +1,6637 @@
+"use strict";
+// autogenerated - 2026-01-06
+// https://www.w3.org/Style/CSS/all-properties.en.html
+
+var external_dependency_parsers_0 = require("../parsers.js");
+var backgroundImage_export_parse, backgroundImage_export_definition, backgroundImage_export_property;
+const backgroundImage_local_var_property = "background-image";
+const backgroundImage_local_var_shorthand = "background";
+backgroundImage_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundImage_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveGradientUrlValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundImage_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundImage_local_var_shorthand, "");
+ this._setProperty(backgroundImage_local_var_property, v);
+ } else {
+ const val = backgroundImage_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundImage_local_var_shorthand) && this._priorities.has(backgroundImage_local_var_property) ? this._priorities.get(backgroundImage_local_var_property) : "";
+ this._setProperty(backgroundImage_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundImage_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundImage_export_property = backgroundImage_local_var_property;
+var backgroundPosition_export_parse, backgroundPosition_export_definition, backgroundPosition_export_property;
+const backgroundPosition_local_var_property = "background-position";
+const backgroundPosition_local_var_shorthand = "background";
+const backgroundPosition_local_var_keyX = ["left", "right"];
+const backgroundPosition_local_var_keyY = ["top", "bottom"];
+const backgroundPosition_local_var_keywordsX = ["center", ...backgroundPosition_local_var_keyX];
+const backgroundPosition_local_var_keywordsY = ["center", ...backgroundPosition_local_var_keyY];
+const backgroundPosition_local_var_keywords = ["center", ...backgroundPosition_local_var_keyX, ...backgroundPosition_local_var_keyY];
+backgroundPosition_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundPosition_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ const [part1, part2, part3, part4] = value;
+ let parsedValue = "";
+ switch (value.length) {
+ case 1:
+ {
+ const val1 = part1.type === AST_TYPES.IDENTIFIER ? part1.name : external_dependency_parsers_0.resolveNumericValue([part1], {
+ type: "length"
+ });
+ if (val1) {
+ if (val1 === "center") {
+ parsedValue = `${val1} ${val1}`;
+ } else if (val1 === "top" || val1 === "bottom") {
+ parsedValue = `center ${val1}`;
+ } else {
+ parsedValue = `${val1} center`;
+ }
+ }
+ break;
+ }
+ case 2:
+ {
+ const val1 = part1.type === AST_TYPES.IDENTIFIER ? part1.name : external_dependency_parsers_0.resolveNumericValue([part1], {
+ type: "length"
+ });
+ const val2 = part2.type === AST_TYPES.IDENTIFIER ? part2.name : external_dependency_parsers_0.resolveNumericValue([part2], {
+ type: "length"
+ });
+ if (val1 && val2) {
+ if (backgroundPosition_local_var_keywordsX.includes(val1) && backgroundPosition_local_var_keywordsY.includes(val2)) {
+ parsedValue = `${val1} ${val2}`;
+ } else if (backgroundPosition_local_var_keywordsY.includes(val1) && backgroundPosition_local_var_keywordsX.includes(val2)) {
+ parsedValue = `${val2} ${val1}`;
+ } else if (backgroundPosition_local_var_keywordsX.includes(val1)) {
+ if (val2 === "center" || !backgroundPosition_local_var_keywordsX.includes(val2)) {
+ parsedValue = `${val1} ${val2}`;
+ }
+ } else if (backgroundPosition_local_var_keywordsY.includes(val2)) {
+ if (!backgroundPosition_local_var_keywordsY.includes(val1)) {
+ parsedValue = `${val1} ${val2}`;
+ }
+ } else if (!backgroundPosition_local_var_keywordsY.includes(val1) && !backgroundPosition_local_var_keywordsX.includes(val2)) {
+ parsedValue = `${val1} ${val2}`;
+ }
+ }
+ break;
+ }
+ case 3:
+ {
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER ? part2.name : external_dependency_parsers_0.resolveNumericValue([part2], {
+ type: "length"
+ });
+ const val3 = part3.type === AST_TYPES.IDENTIFIER ? part3.name : external_dependency_parsers_0.resolveNumericValue([part3], {
+ type: "length"
+ });
+ if (val1 && val2 && val3) {
+ let posX = "";
+ let offX = "";
+ let posY = "";
+ let offY = "";
+ if (backgroundPosition_local_var_keywordsX.includes(val1)) {
+ if (backgroundPosition_local_var_keyY.includes(val2)) {
+ if (!backgroundPosition_local_var_keywords.includes(val3)) {
+ posX = val1;
+ posY = val2;
+ offY = val3;
+ }
+ } else if (backgroundPosition_local_var_keyY.includes(val3)) {
+ if (!backgroundPosition_local_var_keywords.includes(val2)) {
+ posX = val1;
+ offX = val2;
+ posY = val3;
+ }
+ }
+ } else if (backgroundPosition_local_var_keywordsY.includes(val1)) {
+ if (backgroundPosition_local_var_keyX.includes(val2)) {
+ if (!backgroundPosition_local_var_keywords.includes(val3)) {
+ posX = val2;
+ offX = val3;
+ posY = val1;
+ }
+ } else if (backgroundPosition_local_var_keyX.includes(val3)) {
+ if (!backgroundPosition_local_var_keywords.includes(val2)) {
+ posX = val3;
+ posY = val1;
+ offY = val2;
+ }
+ }
+ }
+ if (posX && posY) {
+ if (offX) {
+ parsedValue = `${posX} ${offX} ${posY}`;
+ } else if (offY) {
+ parsedValue = `${posX} ${posY} ${offY}`;
+ }
+ }
+ }
+ break;
+ }
+ case 4:
+ {
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = external_dependency_parsers_0.resolveNumericValue([part2], {
+ type: "length"
+ });
+ const val3 = part3.type === AST_TYPES.IDENTIFIER && part3.name;
+ const val4 = external_dependency_parsers_0.resolveNumericValue([part4], {
+ type: "length"
+ });
+ if (val1 && val2 && val3 && val4) {
+ let posX = "";
+ let offX = "";
+ let posY = "";
+ let offY = "";
+ if (backgroundPosition_local_var_keywordsX.includes(val1) && backgroundPosition_local_var_keyY.includes(val3)) {
+ posX = val1;
+ offX = val2;
+ posY = val3;
+ offY = val4;
+ } else if (backgroundPosition_local_var_keyX.includes(val1) && backgroundPosition_local_var_keywordsY.includes(val3)) {
+ posX = val1;
+ offX = val2;
+ posY = val3;
+ offY = val4;
+ } else if (backgroundPosition_local_var_keyY.includes(val1) && backgroundPosition_local_var_keywordsX.includes(val3)) {
+ posX = val3;
+ offX = val4;
+ posY = val1;
+ offY = val2;
+ }
+ if (posX && offX && posY && offY) {
+ parsedValue = `${posX} ${offX} ${posY} ${offY}`;
+ }
+ }
+ break;
+ }
+ default:
+ }
+ if (parsedValue) {
+ parsedValues.push(parsedValue);
+ } else {
+ return;
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundPosition_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundPosition_local_var_shorthand, "");
+ this._setProperty(backgroundPosition_local_var_property, v);
+ } else {
+ const val = backgroundPosition_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundPosition_local_var_shorthand) && this._priorities.has(backgroundPosition_local_var_property) ? this._priorities.get(backgroundPosition_local_var_property) : "";
+ this._setProperty(backgroundPosition_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundPosition_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundPosition_export_property = backgroundPosition_local_var_property;
+var backgroundSize_export_parse, backgroundSize_export_definition, backgroundSize_export_property;
+const backgroundSize_local_var_property = "background-size";
+const backgroundSize_local_var_shorthand = "background";
+backgroundSize_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundSize_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ if (value.length === 1) {
+ const [{
+ isNumber,
+ name,
+ type,
+ value: itemValue
+ }] = value;
+ switch (type) {
+ case AST_TYPES.CALC:
+ {
+ if (isNumber) {
+ return;
+ }
+ parsedValues.push(`${name}(${itemValue})`);
+ break;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER:
+ {
+ parsedValues.push(name);
+ break;
+ }
+ default:
+ {
+ const parsedValue = external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ }
+ } else {
+ const [val1, val2] = value;
+ const parts = [];
+ if (val1.type === AST_TYPES.CALC && !val1.isNumber) {
+ parts.push(`${val1.name}(${val1.value})`);
+ } else if (val1.type === AST_TYPES.IDENTIFIER) {
+ parts.push(val1.name);
+ } else if (val1.type === AST_TYPES.DIMENSION) {
+ parts.push(`${val1.value}${val1.unit}`);
+ } else if (val1.type === AST_TYPES.PERCENTAGE) {
+ parts.push(`${val1.value}%`);
+ } else {
+ return;
+ }
+ switch (val2.type) {
+ case AST_TYPES.CALC:
+ {
+ if (val2.isNumber) {
+ return;
+ }
+ parts.push(`${val2.name}(${val2.value})`);
+ break;
+ }
+ case AST_TYPES.DIMENSION:
+ {
+ parts.push(`${val2.value}${val2.unit}`);
+ break;
+ }
+ case AST_TYPES.IDENTIFIER:
+ {
+ if (val2.name !== "auto") {
+ parts.push(val2.name);
+ }
+ break;
+ }
+ case AST_TYPES.PERCENTAGE:
+ {
+ parts.push(`${val2.value}%`);
+ break;
+ }
+ default:
+ {
+ return;
+ }
+ }
+ parsedValues.push(parts.join(" "));
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundSize_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundSize_local_var_shorthand, "");
+ this._setProperty(backgroundSize_local_var_property, v);
+ } else {
+ const val = backgroundSize_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundSize_local_var_shorthand) && this._priorities.has(backgroundSize_local_var_property) ? this._priorities.get(backgroundSize_local_var_property) : "";
+ this._setProperty(backgroundSize_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundSize_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundSize_export_property = backgroundSize_local_var_property;
+var backgroundRepeat_export_parse, backgroundRepeat_export_definition, backgroundRepeat_export_property;
+const backgroundRepeat_local_var_property = "background-repeat";
+const backgroundRepeat_local_var_shorthand = "background";
+backgroundRepeat_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundRepeat_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ let parsedValue = "";
+ switch (value.length) {
+ case 1:
+ {
+ const [part1] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ if (val1) {
+ parsedValue = val1;
+ }
+ break;
+ }
+ case 2:
+ {
+ const [part1, part2] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
+ if (val1 && val2) {
+ if (val1 === "repeat" && val2 === "no-repeat") {
+ parsedValue = "repeat-x";
+ } else if (val1 === "no-repeat" && val2 === "repeat") {
+ parsedValue = "repeat-y";
+ } else if (val1 === val2) {
+ parsedValue = val1;
+ } else {
+ parsedValue = `${val1} ${val2}`;
+ }
+ }
+ break;
+ }
+ default:
+ }
+ if (parsedValue) {
+ parsedValues.push(parsedValue);
+ } else {
+ return;
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundRepeat_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundRepeat_local_var_shorthand, "");
+ this._setProperty(backgroundRepeat_local_var_property, v);
+ } else {
+ const val = backgroundRepeat_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundRepeat_local_var_shorthand) && this._priorities.has(backgroundRepeat_local_var_property) ? this._priorities.get(backgroundRepeat_local_var_property) : "";
+ this._setProperty(backgroundRepeat_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundRepeat_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundRepeat_export_property = backgroundRepeat_local_var_property;
+var backgroundOrigin_export_parse, backgroundOrigin_export_definition, backgroundOrigin_export_property;
+const backgroundOrigin_local_var_property = "background-origin";
+const backgroundOrigin_local_var_shorthand = "background";
+backgroundOrigin_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundOrigin_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveKeywordValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundOrigin_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundOrigin_local_var_shorthand, "");
+ this._setProperty(backgroundOrigin_local_var_property, v);
+ } else {
+ const val = backgroundOrigin_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundOrigin_local_var_shorthand) && this._priorities.has(backgroundOrigin_local_var_property) ? this._priorities.get(backgroundOrigin_local_var_property) : "";
+ this._setProperty(backgroundOrigin_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundOrigin_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundOrigin_export_property = backgroundOrigin_local_var_property;
+var backgroundClip_export_parse, backgroundClip_export_definition, backgroundClip_export_property;
+const backgroundClip_local_var_property = "background-clip";
+const backgroundClip_local_var_shorthand = "background";
+backgroundClip_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundClip_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveKeywordValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundClip_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundClip_local_var_shorthand, "");
+ this._setProperty(backgroundClip_local_var_property, v);
+ } else {
+ const val = backgroundClip_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundClip_local_var_shorthand) && this._priorities.has(backgroundClip_local_var_property) ? this._priorities.get(backgroundClip_local_var_property) : "";
+ this._setProperty(backgroundClip_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundClip_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundClip_export_property = backgroundClip_local_var_property;
+var backgroundAttachment_export_parse, backgroundAttachment_export_definition, backgroundAttachment_export_property;
+const backgroundAttachment_local_var_property = "background-attachment";
+const backgroundAttachment_local_var_shorthand = "background";
+backgroundAttachment_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundAttachment_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveKeywordValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+backgroundAttachment_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundAttachment_local_var_shorthand, "");
+ this._setProperty(backgroundAttachment_local_var_property, v);
+ } else {
+ const val = backgroundAttachment_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundAttachment_local_var_shorthand) && this._priorities.has(backgroundAttachment_local_var_property) ? this._priorities.get(backgroundAttachment_local_var_property) : "";
+ this._setProperty(backgroundAttachment_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundAttachment_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundAttachment_export_property = backgroundAttachment_local_var_property;
+var backgroundColor_export_parse, backgroundColor_export_definition, backgroundColor_export_property;
+const backgroundColor_local_var_property = "background-color";
+const backgroundColor_local_var_shorthand = "background";
+backgroundColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(backgroundColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+backgroundColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(backgroundColor_local_var_shorthand, "");
+ this._setProperty(backgroundColor_local_var_property, v);
+ } else {
+ const val = backgroundColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(backgroundColor_local_var_shorthand) && this._priorities.has(backgroundColor_local_var_property) ? this._priorities.get(backgroundColor_local_var_property) : "";
+ this._setProperty(backgroundColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(backgroundColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+backgroundColor_export_property = backgroundColor_local_var_property;
+var background_export_initialValues, background_export_shorthandFor, background_export_parse, background_export_definition, background_export_property;
+const background_local_var_property = "background";
+background_export_initialValues = new Map([[{
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+}.property, "none"], [{
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+}.property, "0% 0%"], [{
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+}.property, "auto"], [{
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+}.property, "repeat"], [{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+}.property, "padding-box"], [{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+}.property, "border-box"], [{
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+}.property, "scroll"], [{
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+}.property, "transparent"]]);
+background_export_shorthandFor = new Map([[{
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+}.property, {
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+}], [{
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+}.property, {
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+}], [{
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+}.property, {
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+}], [{
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+}.property, {
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+}], [{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+}.property, {
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+}], [{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+}.property, {
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+}], [{
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+}.property, {
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+}], [{
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+}.property, {
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+}]]);
+background_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ } else if (external_dependency_parsers_0.hasCalcFunc(v)) {
+ v = external_dependency_parsers_0.resolveCalc(v);
+ }
+ if (!external_dependency_parsers_0.isValidPropertyValue(background_local_var_property, v)) {
+ return;
+ }
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const bgValues = [];
+ const l = values.length;
+ for (let i = 0; i < l; i++) {
+ let bg = {
+ [{
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property),
+ [{
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property),
+ [{
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property),
+ [{
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property),
+ [{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property),
+ [{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property),
+ [{
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+ }.property),
+ [{
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property)
+ };
+ if (l > 1 && i !== l - 1) {
+ bg = {
+ [{
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property),
+ [{
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property),
+ [{
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property),
+ [{
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property),
+ [{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property),
+ [{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property),
+ [{
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+ }.property]: background_export_initialValues.get({
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+ }.property)
+ };
+ }
+ const bgPosition = [];
+ const bgSize = [];
+ const bgRepeat = [];
+ const bgBox = [];
+ const bgParts = external_dependency_parsers_0.splitValue(values[i], {
+ delimiter: "/"
+ });
+ if (!bgParts.length || bgParts.length > 2) {
+ return;
+ }
+ const [bgPart1, bgPart2 = ""] = bgParts;
+ const parts1 = external_dependency_parsers_0.splitValue(bgPart1);
+ for (const part of parts1) {
+ let partValid = false;
+ for (const [longhand, value] of background_export_shorthandFor) {
+ if (external_dependency_parsers_0.isValidPropertyValue(longhand, part)) {
+ partValid = true;
+ switch (longhand) {
+ case {
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property:
+ case {
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bgBox.push(parsedValue);
+ }
+ break;
+ }
+ case {
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property:
+ {
+ if (i !== values.length - 1) {
+ return;
+ }
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ break;
+ }
+ case {
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bgPosition.push(parsedValue);
+ }
+ break;
+ }
+ case {
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bgRepeat.push(parsedValue);
+ }
+ break;
+ }
+ case {
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property:
+ {
+ break;
+ }
+ default:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ }
+ }
+ }
+ }
+ if (!partValid) {
+ return;
+ }
+ }
+ if (bgPart2) {
+ const parts2 = external_dependency_parsers_0.splitValue(bgPart2);
+ for (const part of parts2) {
+ let partValid = false;
+ for (const [longhand, value] of background_export_shorthandFor) {
+ if (external_dependency_parsers_0.isValidPropertyValue(longhand, part)) {
+ partValid = true;
+ switch (longhand) {
+ case {
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property:
+ case {
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bgBox.push(parsedValue);
+ }
+ break;
+ }
+ case {
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property:
+ {
+ if (i !== l - 1) {
+ return;
+ }
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ break;
+ }
+ case {
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property:
+ {
+ break;
+ }
+ case {
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bgRepeat.push(parsedValue);
+ }
+ break;
+ }
+ case {
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bgSize.push(parsedValue);
+ }
+ break;
+ }
+ default:
+ {
+ const parsedValue = value.parse(part, {
+ globalObject
+ });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ }
+ }
+ }
+ }
+ if (!partValid) {
+ return;
+ }
+ }
+ }
+ if (bgPosition.length) {
+ const {
+ parse: parser
+ } = background_export_shorthandFor.get({
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property);
+ const value = parser(bgPosition.join(" "), {
+ globalObject
+ });
+ if (value) {
+ bg[{
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property] = value;
+ }
+ }
+ if (bgSize.length) {
+ const {
+ parse: parser
+ } = background_export_shorthandFor.get({
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property);
+ const value = parser(bgSize.join(" "), {
+ globalObject
+ });
+ if (value) {
+ bg[{
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property] = value;
+ }
+ }
+ if (bgRepeat.length) {
+ const {
+ parse: parser
+ } = background_export_shorthandFor.get({
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property);
+ const value = parser(bgRepeat.join(" "), {
+ globalObject
+ });
+ if (value) {
+ bg[{
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property] = value;
+ }
+ }
+ if (bgBox.length) {
+ switch (bgBox.length) {
+ case 1:
+ {
+ const [value] = bgBox;
+ bg[{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property] = value;
+ bg[{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property] = value;
+ break;
+ }
+ case 2:
+ {
+ const [value1, value2] = bgBox;
+ bg[{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property] = value1;
+ bg[{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property] = value2;
+ break;
+ }
+ default:
+ {
+ return;
+ }
+ }
+ }
+ bgValues.push(bg);
+ }
+ return bgValues;
+};
+background_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (v === "" || external_dependency_parsers_0.hasVarFunc(v)) {
+ for (const [key] of background_export_shorthandFor) {
+ this._setProperty(key, "");
+ }
+ this._setProperty(background_local_var_property, v);
+ } else {
+ const bgValues = background_export_parse(v, {
+ globalObject: this._global
+ });
+ if (!Array.isArray(bgValues)) {
+ return;
+ }
+ const bgMap = new Map([[{
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property, []], [{
+ parse: backgroundPosition_export_parse,
+ definition: backgroundPosition_export_definition,
+ property: backgroundPosition_export_property
+ }.property, []], [{
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property, []], [{
+ parse: backgroundRepeat_export_parse,
+ definition: backgroundRepeat_export_definition,
+ property: backgroundRepeat_export_property
+ }.property, []], [{
+ parse: backgroundOrigin_export_parse,
+ definition: backgroundOrigin_export_definition,
+ property: backgroundOrigin_export_property
+ }.property, []], [{
+ parse: backgroundClip_export_parse,
+ definition: backgroundClip_export_definition,
+ property: backgroundClip_export_property
+ }.property, []], [{
+ parse: backgroundAttachment_export_parse,
+ definition: backgroundAttachment_export_definition,
+ property: backgroundAttachment_export_property
+ }.property, []], [{
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property, []]]);
+ const backgrounds = [];
+ for (const bgValue of bgValues) {
+ const bg = [];
+ for (const [longhand, value] of Object.entries(bgValue)) {
+ if (value) {
+ const arr = bgMap.get(longhand);
+ arr.push(value);
+ bgMap.set(longhand, arr);
+ if (value !== background_export_initialValues.get(longhand)) {
+ if (longhand === {
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property) {
+ bg.push(`/ ${value}`);
+ } else {
+ bg.push(value);
+ }
+ } else if (longhand === {
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property) {
+ if (v === "none") {
+ bg.push(value);
+ }
+ } else if (longhand === {
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property) {
+ if (v === "transparent") {
+ bg.push(value);
+ }
+ }
+ }
+ }
+ backgrounds.push(bg.join(" "));
+ }
+ const priority = this._priorities.get(background_local_var_property) ?? "";
+ for (const [longhand, value] of bgMap) {
+ this._setProperty(longhand, value.join(", "), priority);
+ }
+ this._setProperty(background_local_var_property, backgrounds.join(", "), priority);
+ }
+ },
+ get() {
+ const v = this.getPropertyValue(background_local_var_property);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ return v;
+ }
+ const bgMap = new Map();
+ let l = 0;
+ for (const [longhand] of background_export_shorthandFor) {
+ const val = this.getPropertyValue(longhand);
+ if (longhand === {
+ parse: backgroundImage_export_parse,
+ definition: backgroundImage_export_definition,
+ property: backgroundImage_export_property
+ }.property) {
+ if (val === "none" && v === "none" && this.getPropertyValue({
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property) === "transparent") {
+ return val;
+ }
+ if (val !== background_export_initialValues.get(longhand)) {
+ const imgValues = external_dependency_parsers_0.splitValue(val, {
+ delimiter: ","
+ });
+ l = imgValues.length;
+ bgMap.set(longhand, imgValues);
+ }
+ } else if (longhand === {
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property) {
+ if (val !== background_export_initialValues.get(longhand) || v.includes(val)) {
+ bgMap.set(longhand, [val]);
+ }
+ } else if (val !== background_export_initialValues.get(longhand)) {
+ bgMap.set(longhand, external_dependency_parsers_0.splitValue(val, {
+ delimiter: ","
+ }));
+ }
+ }
+ if (l === 0) {
+ const bgColArr = bgMap.get({
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property);
+ const background = bgColArr ? bgColArr[0] : null;
+ if (background) {
+ return background;
+ }
+ return "";
+ }
+ const bgValues = [];
+ for (let i = 0; i < l; i++) {
+ bgValues[i] = [];
+ }
+ for (const [longhand, values] of bgMap) {
+ for (let i = 0; i < l; i++) {
+ switch (longhand) {
+ case {
+ parse: backgroundColor_export_parse,
+ definition: backgroundColor_export_definition,
+ property: backgroundColor_export_property
+ }.property:
+ {
+ if (i === l - 1) {
+ const value = values[0];
+ if (external_dependency_parsers_0.hasVarFunc(value)) {
+ return "";
+ }
+ if (value && value !== background_export_initialValues.get(longhand)) {
+ const bgValue = bgValues[i];
+ bgValue.push(value);
+ }
+ }
+ break;
+ }
+ case {
+ parse: backgroundSize_export_parse,
+ definition: backgroundSize_export_definition,
+ property: backgroundSize_export_property
+ }.property:
+ {
+ const value = values[i];
+ if (external_dependency_parsers_0.hasVarFunc(value)) {
+ return "";
+ }
+ if (value && value !== background_export_initialValues.get(longhand)) {
+ const bgValue = bgValues[i];
+ bgValue.push(`/ ${value}`);
+ }
+ break;
+ }
+ default:
+ {
+ const value = values[i];
+ if (external_dependency_parsers_0.hasVarFunc(value)) {
+ return "";
+ }
+ if (value && value !== background_export_initialValues.get(longhand)) {
+ const bgValue = bgValues[i];
+ bgValue.push(value);
+ }
+ }
+ }
+ }
+ }
+ const backgrounds = [];
+ for (const bgValue of bgValues) {
+ backgrounds.push(bgValue.join(" "));
+ }
+ return backgrounds.join(", ");
+ },
+ enumerable: true,
+ configurable: true
+};
+background_export_property = background_local_var_property;
+var borderTopWidth_export_parse, borderTopWidth_export_definition, borderTopWidth_export_property;
+const borderTopWidth_local_var_property = "border-top-width";
+const borderTopWidth_local_var_lineShorthand = "border-width";
+const borderTopWidth_local_var_positionShorthand = "border-top";
+const borderTopWidth_local_var_shorthand = "border";
+borderTopWidth_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderTopWidth_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderTopWidth_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderTopWidth_local_var_property, v, "");
+ } else {
+ const val = borderTopWidth_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderTopWidth_local_var_shorthand);
+ const linePriority = this._priorities.get(borderTopWidth_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderTopWidth_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderTopWidth_local_var_property) ? this._priorities.get(borderTopWidth_local_var_property) : "";
+ this._borderSetter(borderTopWidth_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderTopWidth_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderTopWidth_export_property = borderTopWidth_local_var_property;
+var borderRightWidth_export_parse, borderRightWidth_export_definition, borderRightWidth_export_property;
+const borderRightWidth_local_var_property = "border-right-width";
+const borderRightWidth_local_var_lineShorthand = "border-width";
+const borderRightWidth_local_var_positionShorthand = "border-right";
+const borderRightWidth_local_var_shorthand = "border";
+borderRightWidth_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderRightWidth_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderRightWidth_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderRightWidth_local_var_property, v, "");
+ } else {
+ const val = borderRightWidth_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderRightWidth_local_var_shorthand);
+ const linePriority = this._priorities.get(borderRightWidth_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderRightWidth_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderRightWidth_local_var_property) ? this._priorities.get(borderRightWidth_local_var_property) : "";
+ this._borderSetter(borderRightWidth_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderRightWidth_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderRightWidth_export_property = borderRightWidth_local_var_property;
+var borderBottomWidth_export_parse, borderBottomWidth_export_definition, borderBottomWidth_export_property;
+const borderBottomWidth_local_var_property = "border-bottom-width";
+const borderBottomWidth_local_var_lineShorthand = "border-width";
+const borderBottomWidth_local_var_positionShorthand = "border-bottom";
+const borderBottomWidth_local_var_shorthand = "border";
+borderBottomWidth_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderBottomWidth_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderBottomWidth_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderBottomWidth_local_var_property, v, "");
+ } else {
+ const val = borderBottomWidth_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderBottomWidth_local_var_shorthand);
+ const linePriority = this._priorities.get(borderBottomWidth_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderBottomWidth_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderBottomWidth_local_var_property) ? this._priorities.get(borderBottomWidth_local_var_property) : "";
+ this._borderSetter(borderBottomWidth_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderBottomWidth_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderBottomWidth_export_property = borderBottomWidth_local_var_property;
+var borderLeftWidth_export_parse, borderLeftWidth_export_definition, borderLeftWidth_export_property;
+const borderLeftWidth_local_var_property = "border-left-width";
+const borderLeftWidth_local_var_lineShorthand = "border-width";
+const borderLeftWidth_local_var_positionShorthand = "border-left";
+const borderLeftWidth_local_var_shorthand = "border";
+borderLeftWidth_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderLeftWidth_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderLeftWidth_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderLeftWidth_local_var_property, v, "");
+ } else {
+ const val = borderLeftWidth_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderLeftWidth_local_var_shorthand);
+ const linePriority = this._priorities.get(borderLeftWidth_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderLeftWidth_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderLeftWidth_local_var_property) ? this._priorities.get(borderLeftWidth_local_var_property) : "";
+ this._borderSetter(borderLeftWidth_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderLeftWidth_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderLeftWidth_export_property = borderLeftWidth_local_var_property;
+var borderWidth_export_shorthandFor, borderWidth_export_parse, borderWidth_export_definition, borderWidth_export_property;
+const borderWidth_local_var_property = "border-width";
+const borderWidth_local_var_shorthand = "border";
+borderWidth_export_shorthandFor = new Map([[{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+}.property, {
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+}], [{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+}.property, {
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+}], [{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+}.property, {
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+}], [{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+}.property, {
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+}]]);
+borderWidth_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.parsePropertyValue(borderWidth_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = external_dependency_parsers_0.resolveNumericValue([value], {
+ length: values.length,
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ switch (parsedValues.length) {
+ case 1:
+ {
+ return parsedValues;
+ }
+ case 2:
+ {
+ const [val1, val2] = parsedValues;
+ if (val1 === val2) {
+ return [val1];
+ }
+ return parsedValues;
+ }
+ case 3:
+ {
+ const [val1, val2, val3] = parsedValues;
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return parsedValues;
+ }
+ case 4:
+ {
+ const [val1, val2, val3, val4] = parsedValues;
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return [val1, val2, val3];
+ }
+ return parsedValues;
+ }
+ default:
+ }
+ }
+};
+borderWidth_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderWidth_local_var_property, v, "");
+ } else {
+ const val = borderWidth_export_parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = !this._priorities.get(borderWidth_local_var_shorthand) && this._priorities.has(borderWidth_local_var_property) ? this._priorities.get(borderWidth_local_var_property) : "";
+ this._borderSetter(borderWidth_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderWidth_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderWidth_export_property = borderWidth_local_var_property;
+var borderTopStyle_export_parse, borderTopStyle_export_definition, borderTopStyle_export_property;
+const borderTopStyle_local_var_property = "border-top-style";
+const borderTopStyle_local_var_lineShorthand = "border-style";
+const borderTopStyle_local_var_positionShorthand = "border-top";
+const borderTopStyle_local_var_shorthand = "border";
+borderTopStyle_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderTopStyle_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderTopStyle_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderTopStyle_local_var_property, v, "");
+ } else {
+ const val = borderTopStyle_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderTopStyle_local_var_shorthand);
+ const linePriority = this._priorities.get(borderTopStyle_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderTopStyle_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderTopStyle_local_var_property) ? this._priorities.get(borderTopStyle_local_var_property) : "";
+ this._borderSetter(borderTopStyle_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderTopStyle_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderTopStyle_export_property = borderTopStyle_local_var_property;
+var borderRightStyle_export_parse, borderRightStyle_export_definition, borderRightStyle_export_property;
+const borderRightStyle_local_var_property = "border-right-style";
+const borderRightStyle_local_var_lineShorthand = "border-style";
+const borderRightStyle_local_var_positionShorthand = "border-right";
+const borderRightStyle_local_var_shorthand = "border";
+borderRightStyle_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderRightStyle_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderRightStyle_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderRightStyle_local_var_property, v, "");
+ } else {
+ const val = borderRightStyle_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderRightStyle_local_var_shorthand);
+ const linePriority = this._priorities.get(borderRightStyle_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderRightStyle_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderRightStyle_local_var_property) ? this._priorities.get(borderRightStyle_local_var_property) : "";
+ this._borderSetter(borderRightStyle_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderRightStyle_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderRightStyle_export_property = borderRightStyle_local_var_property;
+var borderBottomStyle_export_parse, borderBottomStyle_export_definition, borderBottomStyle_export_property;
+const borderBottomStyle_local_var_property = "border-bottom-style";
+const borderBottomStyle_local_var_lineShorthand = "border-style";
+const borderBottomStyle_local_var_positionShorthand = "border-bottom";
+const borderBottomStyle_local_var_shorthand = "border";
+borderBottomStyle_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderBottomStyle_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderBottomStyle_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderBottomStyle_local_var_property, v, "");
+ } else {
+ const val = borderBottomStyle_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderBottomStyle_local_var_shorthand);
+ const linePriority = this._priorities.get(borderBottomStyle_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderBottomStyle_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderBottomStyle_local_var_property) ? this._priorities.get(borderBottomStyle_local_var_property) : "";
+ this._borderSetter(borderBottomStyle_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderBottomStyle_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderBottomStyle_export_property = borderBottomStyle_local_var_property;
+var borderLeftStyle_export_parse, borderLeftStyle_export_definition, borderLeftStyle_export_property;
+const borderLeftStyle_local_var_property = "border-left-style";
+const borderLeftStyle_local_var_lineShorthand = "border-style";
+const borderLeftStyle_local_var_positionShorthand = "border-left";
+const borderLeftStyle_local_var_shorthand = "border";
+borderLeftStyle_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderLeftStyle_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderLeftStyle_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderLeftStyle_local_var_property, v, "");
+ } else {
+ const val = borderLeftStyle_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderLeftStyle_local_var_shorthand);
+ const linePriority = this._priorities.get(borderLeftStyle_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderLeftStyle_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderLeftStyle_local_var_property) ? this._priorities.get(borderLeftStyle_local_var_property) : "";
+ this._borderSetter(borderLeftStyle_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderLeftStyle_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderLeftStyle_export_property = borderLeftStyle_local_var_property;
+var borderStyle_export_shorthandFor, borderStyle_export_parse, borderStyle_export_definition, borderStyle_export_property;
+const borderStyle_local_var_property = "border-style";
+const borderStyle_local_var_shorthand = "border";
+borderStyle_export_shorthandFor = new Map([[{
+ parse: borderTopStyle_export_parse,
+ definition: borderTopStyle_export_definition,
+ property: borderTopStyle_export_property
+}.property, {
+ parse: borderTopStyle_export_parse,
+ definition: borderTopStyle_export_definition,
+ property: borderTopStyle_export_property
+}], [{
+ parse: borderRightStyle_export_parse,
+ definition: borderRightStyle_export_definition,
+ property: borderRightStyle_export_property
+}.property, {
+ parse: borderRightStyle_export_parse,
+ definition: borderRightStyle_export_definition,
+ property: borderRightStyle_export_property
+}], [{
+ parse: borderBottomStyle_export_parse,
+ definition: borderBottomStyle_export_definition,
+ property: borderBottomStyle_export_property
+}.property, {
+ parse: borderBottomStyle_export_parse,
+ definition: borderBottomStyle_export_definition,
+ property: borderBottomStyle_export_property
+}], [{
+ parse: borderLeftStyle_export_parse,
+ definition: borderLeftStyle_export_definition,
+ property: borderLeftStyle_export_property
+}.property, {
+ parse: borderLeftStyle_export_parse,
+ definition: borderLeftStyle_export_definition,
+ property: borderLeftStyle_export_property
+}]]);
+borderStyle_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.parsePropertyValue(borderStyle_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = external_dependency_parsers_0.resolveKeywordValue([value], {
+ length: values.length
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ switch (parsedValues.length) {
+ case 1:
+ {
+ return parsedValues;
+ }
+ case 2:
+ {
+ const [val1, val2] = parsedValues;
+ if (val1 === val2) {
+ return [val1];
+ }
+ return parsedValues;
+ }
+ case 3:
+ {
+ const [val1, val2, val3] = parsedValues;
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return parsedValues;
+ }
+ case 4:
+ {
+ const [val1, val2, val3, val4] = parsedValues;
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return [val1, val2, val3];
+ }
+ return parsedValues;
+ }
+ default:
+ }
+ }
+};
+borderStyle_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderStyle_local_var_property, v, "");
+ } else {
+ const val = borderStyle_export_parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = !this._priorities.get(borderStyle_local_var_shorthand) && this._priorities.has(borderStyle_local_var_property) ? this._priorities.get(borderStyle_local_var_property) : "";
+ this._borderSetter(borderStyle_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderStyle_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderStyle_export_property = borderStyle_local_var_property;
+var borderTopColor_export_parse, borderTopColor_export_definition, borderTopColor_export_property;
+const borderTopColor_local_var_property = "border-top-color";
+const borderTopColor_local_var_lineShorthand = "border-color";
+const borderTopColor_local_var_positionShorthand = "border-top";
+const borderTopColor_local_var_shorthand = "border";
+borderTopColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderTopColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderTopColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderTopColor_local_var_property, v, "");
+ } else {
+ const val = borderTopColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderTopColor_local_var_shorthand);
+ const linePriority = this._priorities.get(borderTopColor_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderTopColor_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderTopColor_local_var_property) ? this._priorities.get(borderTopColor_local_var_property) : "";
+ this._borderSetter(borderTopColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderTopColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderTopColor_export_property = borderTopColor_local_var_property;
+var borderRightColor_export_parse, borderRightColor_export_definition, borderRightColor_export_property;
+const borderRightColor_local_var_property = "border-right-color";
+const borderRightColor_local_var_lineShorthand = "border-color";
+const borderRightColor_local_var_positionShorthand = "border-right";
+const borderRightColor_local_var_shorthand = "border";
+borderRightColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderRightColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderRightColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderRightColor_local_var_property, v, "");
+ } else {
+ const val = borderRightColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderRightColor_local_var_shorthand);
+ const linePriority = this._priorities.get(borderRightColor_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderRightColor_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderRightColor_local_var_property) ? this._priorities.get(borderRightColor_local_var_property) : "";
+ this._borderSetter(borderRightColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderRightColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderRightColor_export_property = borderRightColor_local_var_property;
+var borderBottomColor_export_parse, borderBottomColor_export_definition, borderBottomColor_export_property;
+const borderBottomColor_local_var_property = "border-bottom-color";
+const borderBottomColor_local_var_lineShorthand = "border-color";
+const borderBottomColor_local_var_positionShorthand = "border-bottom";
+const borderBottomColor_local_var_shorthand = "border";
+borderBottomColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderBottomColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderBottomColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderBottomColor_local_var_property, v, "");
+ } else {
+ const val = borderBottomColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderBottomColor_local_var_shorthand);
+ const linePriority = this._priorities.get(borderBottomColor_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderBottomColor_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderBottomColor_local_var_property) ? this._priorities.get(borderBottomColor_local_var_property) : "";
+ this._borderSetter(borderBottomColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderBottomColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderBottomColor_export_property = borderBottomColor_local_var_property;
+var borderLeftColor_export_parse, borderLeftColor_export_definition, borderLeftColor_export_property;
+const borderLeftColor_local_var_property = "border-left-color";
+const borderLeftColor_local_var_lineShorthand = "border-color";
+const borderLeftColor_local_var_positionShorthand = "border-left";
+const borderLeftColor_local_var_shorthand = "border";
+borderLeftColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderLeftColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderLeftColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderLeftColor_local_var_property, v, "");
+ } else {
+ const val = borderLeftColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(borderLeftColor_local_var_shorthand);
+ const linePriority = this._priorities.get(borderLeftColor_local_var_lineShorthand);
+ const positionPriority = this._priorities.get(borderLeftColor_local_var_positionShorthand);
+ const priority = !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(borderLeftColor_local_var_property) ? this._priorities.get(borderLeftColor_local_var_property) : "";
+ this._borderSetter(borderLeftColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderLeftColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderLeftColor_export_property = borderLeftColor_local_var_property;
+var borderColor_export_shorthandFor, borderColor_export_parse, borderColor_export_definition, borderColor_export_property;
+const borderColor_local_var_property = "border-color";
+const borderColor_local_var_shorthand = "border";
+borderColor_export_shorthandFor = new Map([[{
+ parse: borderTopColor_export_parse,
+ definition: borderTopColor_export_definition,
+ property: borderTopColor_export_property
+}.property, {
+ parse: borderTopColor_export_parse,
+ definition: borderTopColor_export_definition,
+ property: borderTopColor_export_property
+}], [{
+ parse: borderRightColor_export_parse,
+ definition: borderRightColor_export_definition,
+ property: borderRightColor_export_property
+}.property, {
+ parse: borderRightColor_export_parse,
+ definition: borderRightColor_export_definition,
+ property: borderRightColor_export_property
+}], [{
+ parse: borderBottomColor_export_parse,
+ definition: borderBottomColor_export_definition,
+ property: borderBottomColor_export_property
+}.property, {
+ parse: borderBottomColor_export_parse,
+ definition: borderBottomColor_export_definition,
+ property: borderBottomColor_export_property
+}], [{
+ parse: borderLeftColor_export_parse,
+ definition: borderLeftColor_export_definition,
+ property: borderLeftColor_export_property
+}.property, {
+ parse: borderLeftColor_export_parse,
+ definition: borderLeftColor_export_definition,
+ property: borderLeftColor_export_property
+}]]);
+borderColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.parsePropertyValue(borderColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = external_dependency_parsers_0.resolveColorValue([value], {
+ length: values.length
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ switch (parsedValues.length) {
+ case 1:
+ {
+ return parsedValues;
+ }
+ case 2:
+ {
+ const [val1, val2] = parsedValues;
+ if (val1 === val2) {
+ return [val1];
+ }
+ return parsedValues;
+ }
+ case 3:
+ {
+ const [val1, val2, val3] = parsedValues;
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return parsedValues;
+ }
+ case 4:
+ {
+ const [val1, val2, val3, val4] = parsedValues;
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return [val1, val2, val3];
+ }
+ return parsedValues;
+ }
+ default:
+ }
+ }
+};
+borderColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderColor_local_var_property, v, "");
+ } else {
+ const val = borderColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = !this._priorities.get(borderColor_local_var_shorthand) && this._priorities.has(borderColor_local_var_property) ? this._priorities.get(borderColor_local_var_property) : "";
+ this._borderSetter(borderColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderColor_export_property = borderColor_local_var_property;
+var borderTop_export_initialValues, borderTop_export_shorthandFor, borderTop_export_parse, borderTop_export_definition, borderTop_export_property;
+const borderTop_local_var_property = "border-top";
+const borderTop_local_var_shorthand = "border";
+const borderTop_local_var_subProps = {
+ width: {
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+ }.property,
+ style: {
+ parse: borderTopStyle_export_parse,
+ definition: borderTopStyle_export_definition,
+ property: borderTopStyle_export_property
+ }.property,
+ color: {
+ parse: borderTopColor_export_parse,
+ definition: borderTopColor_export_definition,
+ property: borderTopColor_export_property
+ }.property
+};
+borderTop_export_initialValues = new Map([[{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+}.property, "medium"], [{
+ parse: borderTopStyle_export_parse,
+ definition: borderTopStyle_export_definition,
+ property: borderTopStyle_export_property
+}.property, "none"], [{
+ parse: borderTopColor_export_parse,
+ definition: borderTopColor_export_definition,
+ property: borderTopColor_export_property
+}.property, "currentcolor"]]);
+borderTop_export_shorthandFor = new Map([[{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+}.property, {
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+}], [{
+ parse: borderTopStyle_export_parse,
+ definition: borderTopStyle_export_definition,
+ property: borderTopStyle_export_property
+}.property, {
+ parse: borderTopStyle_export_parse,
+ definition: borderTopStyle_export_definition,
+ property: borderTopStyle_export_property
+}], [{
+ parse: borderTopColor_export_parse,
+ definition: borderTopColor_export_definition,
+ property: borderTopColor_export_property
+}.property, {
+ parse: borderTopColor_export_parse,
+ definition: borderTopColor_export_definition,
+ property: borderTopColor_export_property
+}]]);
+borderTop_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(borderTop_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveBorderShorthandValue(value, borderTop_local_var_subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = borderTop_export_shorthandFor.keys();
+ const obj = {
+ [{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+ }.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== borderTop_export_initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+ }.property] && obj[{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+ }.property] === "medium") {
+ delete obj[{
+ parse: borderTopWidth_export_parse,
+ definition: borderTopWidth_export_definition,
+ property: borderTopWidth_export_property
+ }.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+borderTop_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderTop_local_var_property, v, "");
+ } else {
+ const val = borderTop_export_parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority = !this._priorities.get(borderTop_local_var_shorthand) && this._priorities.has(borderTop_local_var_property) ? this._priorities.get(borderTop_local_var_property) : "";
+ this._borderSetter(borderTop_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderTop_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderTop_export_property = borderTop_local_var_property;
+var borderRight_export_initialValues, borderRight_export_shorthandFor, borderRight_export_parse, borderRight_export_definition, borderRight_export_property;
+const borderRight_local_var_property = "border-right";
+const borderRight_local_var_shorthand = "border";
+const borderRight_local_var_subProps = {
+ width: {
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+ }.property,
+ style: {
+ parse: borderRightStyle_export_parse,
+ definition: borderRightStyle_export_definition,
+ property: borderRightStyle_export_property
+ }.property,
+ color: {
+ parse: borderRightColor_export_parse,
+ definition: borderRightColor_export_definition,
+ property: borderRightColor_export_property
+ }.property
+};
+borderRight_export_initialValues = new Map([[{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+}.property, "medium"], [{
+ parse: borderRightStyle_export_parse,
+ definition: borderRightStyle_export_definition,
+ property: borderRightStyle_export_property
+}.property, "none"], [{
+ parse: borderRightColor_export_parse,
+ definition: borderRightColor_export_definition,
+ property: borderRightColor_export_property
+}.property, "currentcolor"]]);
+borderRight_export_shorthandFor = new Map([[{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+}.property, {
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+}], [{
+ parse: borderRightStyle_export_parse,
+ definition: borderRightStyle_export_definition,
+ property: borderRightStyle_export_property
+}.property, {
+ parse: borderRightStyle_export_parse,
+ definition: borderRightStyle_export_definition,
+ property: borderRightStyle_export_property
+}], [{
+ parse: borderRightColor_export_parse,
+ definition: borderRightColor_export_definition,
+ property: borderRightColor_export_property
+}.property, {
+ parse: borderRightColor_export_parse,
+ definition: borderRightColor_export_definition,
+ property: borderRightColor_export_property
+}]]);
+borderRight_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(borderRight_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveBorderShorthandValue(value, borderRight_local_var_subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = borderRight_export_shorthandFor.keys();
+ const obj = {
+ [{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+ }.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== borderRight_export_initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+ }.property] && obj[{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+ }.property] === "medium") {
+ delete obj[{
+ parse: borderRightWidth_export_parse,
+ definition: borderRightWidth_export_definition,
+ property: borderRightWidth_export_property
+ }.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+borderRight_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderRight_local_var_property, v, "");
+ } else {
+ const val = borderRight_export_parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority = !this._priorities.get(borderRight_local_var_shorthand) && this._priorities.has(borderRight_local_var_property) ? this._priorities.get(borderRight_local_var_property) : "";
+ this._borderSetter(borderRight_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderRight_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderRight_export_property = borderRight_local_var_property;
+var borderBottom_export_initialValues, borderBottom_export_shorthandFor, borderBottom_export_parse, borderBottom_export_definition, borderBottom_export_property;
+const borderBottom_local_var_property = "border-bottom";
+const borderBottom_local_var_shorthand = "border";
+const borderBottom_local_var_subProps = {
+ width: {
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+ }.property,
+ style: {
+ parse: borderBottomStyle_export_parse,
+ definition: borderBottomStyle_export_definition,
+ property: borderBottomStyle_export_property
+ }.property,
+ color: {
+ parse: borderBottomColor_export_parse,
+ definition: borderBottomColor_export_definition,
+ property: borderBottomColor_export_property
+ }.property
+};
+borderBottom_export_initialValues = new Map([[{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+}.property, "medium"], [{
+ parse: borderBottomStyle_export_parse,
+ definition: borderBottomStyle_export_definition,
+ property: borderBottomStyle_export_property
+}.property, "none"], [{
+ parse: borderBottomColor_export_parse,
+ definition: borderBottomColor_export_definition,
+ property: borderBottomColor_export_property
+}.property, "currentcolor"]]);
+borderBottom_export_shorthandFor = new Map([[{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+}.property, {
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+}], [{
+ parse: borderBottomStyle_export_parse,
+ definition: borderBottomStyle_export_definition,
+ property: borderBottomStyle_export_property
+}.property, {
+ parse: borderBottomStyle_export_parse,
+ definition: borderBottomStyle_export_definition,
+ property: borderBottomStyle_export_property
+}], [{
+ parse: borderBottomColor_export_parse,
+ definition: borderBottomColor_export_definition,
+ property: borderBottomColor_export_property
+}.property, {
+ parse: borderBottomColor_export_parse,
+ definition: borderBottomColor_export_definition,
+ property: borderBottomColor_export_property
+}]]);
+borderBottom_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(borderBottom_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveBorderShorthandValue(value, borderBottom_local_var_subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = borderBottom_export_shorthandFor.keys();
+ const obj = {
+ [{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+ }.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== borderBottom_export_initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+ }.property] && obj[{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+ }.property] === "medium") {
+ delete obj[{
+ parse: borderBottomWidth_export_parse,
+ definition: borderBottomWidth_export_definition,
+ property: borderBottomWidth_export_property
+ }.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+borderBottom_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderBottom_local_var_property, v, "");
+ } else {
+ const val = borderBottom_export_parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority = !this._priorities.get(borderBottom_local_var_shorthand) && this._priorities.has(borderBottom_local_var_property) ? this._priorities.get(borderBottom_local_var_property) : "";
+ this._borderSetter(borderBottom_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderBottom_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderBottom_export_property = borderBottom_local_var_property;
+var borderLeft_export_initialValues, borderLeft_export_shorthandFor, borderLeft_export_parse, borderLeft_export_definition, borderLeft_export_property;
+const borderLeft_local_var_property = "border-left";
+const borderLeft_local_var_shorthand = "border";
+const borderLeft_local_var_subProps = {
+ width: {
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+ }.property,
+ style: {
+ parse: borderLeftStyle_export_parse,
+ definition: borderLeftStyle_export_definition,
+ property: borderLeftStyle_export_property
+ }.property,
+ color: {
+ parse: borderLeftColor_export_parse,
+ definition: borderLeftColor_export_definition,
+ property: borderLeftColor_export_property
+ }.property
+};
+borderLeft_export_initialValues = new Map([[{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+}.property, "medium"], [{
+ parse: borderLeftStyle_export_parse,
+ definition: borderLeftStyle_export_definition,
+ property: borderLeftStyle_export_property
+}.property, "none"], [{
+ parse: borderLeftColor_export_parse,
+ definition: borderLeftColor_export_definition,
+ property: borderLeftColor_export_property
+}.property, "currentcolor"]]);
+borderLeft_export_shorthandFor = new Map([[{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+}.property, {
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+}], [{
+ parse: borderLeftStyle_export_parse,
+ definition: borderLeftStyle_export_definition,
+ property: borderLeftStyle_export_property
+}.property, {
+ parse: borderLeftStyle_export_parse,
+ definition: borderLeftStyle_export_definition,
+ property: borderLeftStyle_export_property
+}], [{
+ parse: borderLeftColor_export_parse,
+ definition: borderLeftColor_export_definition,
+ property: borderLeftColor_export_property
+}.property, {
+ parse: borderLeftColor_export_parse,
+ definition: borderLeftColor_export_definition,
+ property: borderLeftColor_export_property
+}]]);
+borderLeft_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(borderLeft_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveBorderShorthandValue(value, borderLeft_local_var_subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = borderLeft_export_shorthandFor.keys();
+ const obj = {
+ [{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+ }.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== borderLeft_export_initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+ }.property] && obj[{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+ }.property] === "medium") {
+ delete obj[{
+ parse: borderLeftWidth_export_parse,
+ definition: borderLeftWidth_export_definition,
+ property: borderLeftWidth_export_property
+ }.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+borderLeft_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(borderLeft_local_var_property, v, "");
+ } else {
+ const val = borderLeft_export_parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority = !this._priorities.get(borderLeft_local_var_shorthand) && this._priorities.has(borderLeft_local_var_property) ? this._priorities.get(borderLeft_local_var_property) : "";
+ this._borderSetter(borderLeft_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderLeft_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderLeft_export_property = borderLeft_local_var_property;
+var border_export_initialValues, border_export_shorthandFor, border_export_positionShorthandFor, border_export_parse, border_export_definition, border_export_property;
+const border_local_var_property = "border";
+const border_local_var_subProps = {
+ width: {
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+ }.property,
+ style: {
+ shorthandFor: borderStyle_export_shorthandFor,
+ parse: borderStyle_export_parse,
+ definition: borderStyle_export_definition,
+ property: borderStyle_export_property
+ }.property,
+ color: {
+ shorthandFor: borderColor_export_shorthandFor,
+ parse: borderColor_export_parse,
+ definition: borderColor_export_definition,
+ property: borderColor_export_property
+ }.property
+};
+border_export_initialValues = new Map([[{
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+}.property, "medium"], [{
+ shorthandFor: borderStyle_export_shorthandFor,
+ parse: borderStyle_export_parse,
+ definition: borderStyle_export_definition,
+ property: borderStyle_export_property
+}.property, "none"], [{
+ shorthandFor: borderColor_export_shorthandFor,
+ parse: borderColor_export_parse,
+ definition: borderColor_export_definition,
+ property: borderColor_export_property
+}.property, "currentcolor"]]);
+border_export_shorthandFor = new Map([[{
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+}.property, {
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+}], [{
+ shorthandFor: borderStyle_export_shorthandFor,
+ parse: borderStyle_export_parse,
+ definition: borderStyle_export_definition,
+ property: borderStyle_export_property
+}.property, {
+ shorthandFor: borderStyle_export_shorthandFor,
+ parse: borderStyle_export_parse,
+ definition: borderStyle_export_definition,
+ property: borderStyle_export_property
+}], [{
+ shorthandFor: borderColor_export_shorthandFor,
+ parse: borderColor_export_parse,
+ definition: borderColor_export_definition,
+ property: borderColor_export_property
+}.property, {
+ shorthandFor: borderColor_export_shorthandFor,
+ parse: borderColor_export_parse,
+ definition: borderColor_export_definition,
+ property: borderColor_export_property
+}]]);
+border_export_positionShorthandFor = new Map([[{
+ initialValues: borderTop_export_initialValues,
+ shorthandFor: borderTop_export_shorthandFor,
+ parse: borderTop_export_parse,
+ definition: borderTop_export_definition,
+ property: borderTop_export_property
+}.property, {
+ initialValues: borderTop_export_initialValues,
+ shorthandFor: borderTop_export_shorthandFor,
+ parse: borderTop_export_parse,
+ definition: borderTop_export_definition,
+ property: borderTop_export_property
+}], [{
+ initialValues: borderRight_export_initialValues,
+ shorthandFor: borderRight_export_shorthandFor,
+ parse: borderRight_export_parse,
+ definition: borderRight_export_definition,
+ property: borderRight_export_property
+}.property, {
+ initialValues: borderRight_export_initialValues,
+ shorthandFor: borderRight_export_shorthandFor,
+ parse: borderRight_export_parse,
+ definition: borderRight_export_definition,
+ property: borderRight_export_property
+}], [{
+ initialValues: borderBottom_export_initialValues,
+ shorthandFor: borderBottom_export_shorthandFor,
+ parse: borderBottom_export_parse,
+ definition: borderBottom_export_definition,
+ property: borderBottom_export_property
+}.property, {
+ initialValues: borderBottom_export_initialValues,
+ shorthandFor: borderBottom_export_shorthandFor,
+ parse: borderBottom_export_parse,
+ definition: borderBottom_export_definition,
+ property: borderBottom_export_property
+}], [{
+ initialValues: borderLeft_export_initialValues,
+ shorthandFor: borderLeft_export_shorthandFor,
+ parse: borderLeft_export_parse,
+ definition: borderLeft_export_definition,
+ property: borderLeft_export_property
+}.property, {
+ initialValues: borderLeft_export_initialValues,
+ shorthandFor: borderLeft_export_shorthandFor,
+ parse: borderLeft_export_parse,
+ definition: borderLeft_export_definition,
+ property: borderLeft_export_property
+}]]);
+border_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "" || external_dependency_parsers_0.hasVarFunc(v)) {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(border_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveBorderShorthandValue(value, border_local_var_subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = border_export_shorthandFor.keys();
+ const obj = {
+ [{
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+ }.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== border_export_initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[{
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+ }.property] && obj[{
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+ }.property] === "medium") {
+ delete obj[{
+ shorthandFor: borderWidth_export_shorthandFor,
+ parse: borderWidth_export_parse,
+ definition: borderWidth_export_definition,
+ property: borderWidth_export_property
+ }.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+border_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._borderSetter(border_local_var_property, v, "");
+ } else {
+ const val = border_export_parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority = this._priorities.get(border_local_var_property) ?? "";
+ this._borderSetter(border_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(border_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+border_export_property = border_local_var_property;
+var borderCollapse_export_parse, borderCollapse_export_definition, borderCollapse_export_property;
+const borderCollapse_local_var_property = "border-collapse";
+borderCollapse_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderCollapse_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderCollapse_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(borderCollapse_local_var_property, v);
+ } else {
+ const val = borderCollapse_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(borderCollapse_local_var_property) ?? "";
+ this._setProperty(borderCollapse_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderCollapse_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderCollapse_export_property = borderCollapse_local_var_property;
+var borderSpacing_export_parse, borderSpacing_export_definition, borderSpacing_export_property;
+const borderSpacing_local_var_property = "border-spacing";
+borderSpacing_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(borderSpacing_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ switch (value.length) {
+ case 1:
+ {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ }
+ case 2:
+ {
+ const [part1, part2] = value;
+ const val1 = external_dependency_parsers_0.resolveNumericValue([part1], {
+ type: "length"
+ });
+ const val2 = external_dependency_parsers_0.resolveNumericValue([part2], {
+ type: "length"
+ });
+ if (val1 && val2) {
+ return `${val1} ${val2}`;
+ }
+ break;
+ }
+ default:
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+borderSpacing_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(borderSpacing_local_var_property, v);
+ } else {
+ const val = borderSpacing_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(borderSpacing_local_var_property) ?? "";
+ this._setProperty(borderSpacing_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(borderSpacing_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+borderSpacing_export_property = borderSpacing_local_var_property;
+var bottom_export_parse, bottom_export_definition, bottom_export_property;
+const bottom_local_var_property = "bottom";
+bottom_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(bottom_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+bottom_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(bottom_local_var_property, v);
+ } else {
+ const val = bottom_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(bottom_local_var_property) ?? "";
+ this._setProperty(bottom_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(bottom_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+bottom_export_property = bottom_local_var_property;
+var clear_export_parse, clear_export_definition, clear_export_property;
+const clear_local_var_property = "clear";
+clear_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(clear_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+clear_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(clear_local_var_property, v);
+ } else {
+ const val = clear_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(clear_local_var_property) ?? "";
+ this._setProperty(clear_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(clear_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+clear_export_property = clear_local_var_property;
+var clip_export_parse, clip_export_definition, clip_export_property;
+// deprecated
+// @see https://drafts.csswg.org/css-masking-1/#clip-property
+
+const clip_local_var_property = "clip";
+clip_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const value = external_dependency_parsers_0.parsePropertyValue(clip_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const [{
+ name,
+ type,
+ value: itemValue
+ }] = value;
+ switch (type) {
+ case AST_TYPES.FUNCTION:
+ {
+ const values = external_dependency_parsers_0.splitValue(itemValue, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const item of values) {
+ const parsedValue = external_dependency_parsers_0.parseCSS(item, {
+ context: "value"
+ }, true);
+ const val = external_dependency_parsers_0.resolveNumericValue(parsedValue.children, {
+ type: "length"
+ });
+ if (val) {
+ parsedValues.push(val);
+ } else {
+ return;
+ }
+ }
+ return `${name}(${parsedValues.join(", ")})`;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER:
+ {
+ return name;
+ }
+ default:
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+clip_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(clip_local_var_property, v);
+ } else {
+ const val = clip_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(clip_local_var_property) ?? "";
+ this._setProperty(clip_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(clip_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+clip_export_property = clip_local_var_property;
+var color_export_parse, color_export_definition, color_export_property;
+const color_local_var_property = "color";
+color_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(color_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+color_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(color_local_var_property, v);
+ } else {
+ const val = color_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(color_local_var_property) ?? "";
+ this._setProperty(color_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(color_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+color_export_property = color_local_var_property;
+var display_export_parse, display_export_definition, display_export_property;
+const display_local_var_property = "display";
+
+/* keywords */
+const display_local_var_displayOutside = ["block", "inline", "run-in"];
+const display_local_var_displayFlow = ["flow", "flow-root"];
+display_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const value = external_dependency_parsers_0.parsePropertyValue(display_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ switch (value.length) {
+ case 1:
+ {
+ const [{
+ name,
+ type
+ }] = value;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD:
+ {
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER:
+ {
+ if (name === "flow") {
+ return "block";
+ }
+ return name;
+ }
+ default:
+ }
+ break;
+ }
+ case 2:
+ {
+ const [part1, part2] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
+ if (val1 && val2) {
+ let outerValue = "";
+ let innerValue = "";
+ if (val1 === "list-item") {
+ outerValue = val2;
+ innerValue = val1;
+ } else if (val2 === "list-item") {
+ outerValue = val1;
+ innerValue = val2;
+ } else if (display_local_var_displayOutside.includes(val1)) {
+ outerValue = val1;
+ innerValue = val2;
+ } else if (display_local_var_displayOutside.includes(val2)) {
+ outerValue = val2;
+ innerValue = val1;
+ }
+ if (innerValue === "list-item") {
+ switch (outerValue) {
+ case "block":
+ case "flow":
+ {
+ return innerValue;
+ }
+ case "flow-root":
+ case "inline":
+ case "run-in":
+ {
+ return `${outerValue} ${innerValue}`;
+ }
+ default:
+ }
+ } else if (outerValue === "block") {
+ switch (innerValue) {
+ case "flow":
+ {
+ return outerValue;
+ }
+ case "flow-root":
+ case "flex":
+ case "grid":
+ case "table":
+ {
+ return innerValue;
+ }
+ case "ruby":
+ {
+ return `${outerValue} ${innerValue}`;
+ }
+ default:
+ }
+ } else if (outerValue === "inline") {
+ switch (innerValue) {
+ case "flow":
+ {
+ return outerValue;
+ }
+ case "flow-root":
+ {
+ return `${outerValue}-block`;
+ }
+ case "flex":
+ case "grid":
+ case "table":
+ {
+ return `${outerValue}-${innerValue}`;
+ }
+ case "ruby":
+ {
+ return innerValue;
+ }
+ default:
+ }
+ } else if (outerValue === "run-in") {
+ switch (innerValue) {
+ case "flow":
+ {
+ return outerValue;
+ }
+ case "flow-root":
+ case "flex":
+ case "grid":
+ case "table":
+ case "ruby":
+ {
+ return `${outerValue} ${innerValue}`;
+ }
+ default:
+ }
+ }
+ }
+ break;
+ }
+ case 3:
+ {
+ const [part1, part2, part3] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
+ const val3 = part3.type === AST_TYPES.IDENTIFIER && part3.name;
+ if (val1 && val2 && part3) {
+ let outerValue = "";
+ let flowValue = "";
+ let listItemValue = "";
+ if (val1 === "list-item") {
+ listItemValue = val1;
+ if (display_local_var_displayFlow.includes(val2)) {
+ flowValue = val2;
+ outerValue = val3;
+ } else if (display_local_var_displayFlow.includes(val3)) {
+ flowValue = val3;
+ outerValue = val2;
+ }
+ } else if (val2 === "list-item") {
+ listItemValue = val2;
+ if (display_local_var_displayFlow.includes(val1)) {
+ flowValue = val1;
+ outerValue = val3;
+ } else if (display_local_var_displayFlow.includes(val3)) {
+ flowValue = val3;
+ outerValue = val1;
+ }
+ } else if (val3 === "list-item") {
+ listItemValue = val3;
+ if (display_local_var_displayFlow.includes(val1)) {
+ flowValue = val1;
+ outerValue = val2;
+ } else if (display_local_var_displayFlow.includes(val2)) {
+ flowValue = val2;
+ outerValue = val1;
+ }
+ }
+ if (outerValue && flowValue && listItemValue) {
+ switch (outerValue) {
+ case "block":
+ {
+ if (flowValue === "flow") {
+ return listItemValue;
+ }
+ return `${flowValue} ${listItemValue}`;
+ }
+ case "inline":
+ case "run-in":
+ {
+ if (flowValue === "flow") {
+ return `${outerValue} ${listItemValue}`;
+ }
+ return `${outerValue} ${flowValue} ${listItemValue}`;
+ }
+ }
+ }
+ }
+ break;
+ }
+ default:
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+display_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(display_local_var_property, v);
+ } else {
+ const val = display_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(display_local_var_property) ?? "";
+ this._setProperty(display_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(display_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+display_export_property = display_local_var_property;
+var flexGrow_export_parse, flexGrow_export_definition, flexGrow_export_property;
+const flexGrow_local_var_property = "flex-grow";
+const flexGrow_local_var_shorthand = "flex";
+flexGrow_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue("flex-grow", v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+flexGrow_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(flexGrow_local_var_shorthand, "");
+ this._setProperty(flexGrow_local_var_property, v);
+ } else {
+ const val = flexGrow_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(flexGrow_local_var_shorthand) && this._priorities.has(flexGrow_local_var_property) ? this._priorities.get(flexGrow_local_var_property) : "";
+ this._flexBoxSetter(flexGrow_local_var_property, val, priority, flexGrow_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(flexGrow_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+flexGrow_export_property = flexGrow_local_var_property;
+var flexShrink_export_parse, flexShrink_export_definition, flexShrink_export_property;
+const flexShrink_local_var_property = "flex-shrink";
+const flexShrink_local_var_shorthand = "flex";
+flexShrink_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(flexShrink_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+flexShrink_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(flexShrink_local_var_shorthand, "");
+ this._setProperty(flexShrink_local_var_property, v);
+ } else {
+ const val = flexShrink_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(flexShrink_local_var_shorthand) && this._priorities.has(flexShrink_local_var_property) ? this._priorities.get(flexShrink_local_var_property) : "";
+ this._flexBoxSetter(flexShrink_local_var_property, val, priority, flexShrink_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(flexShrink_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+flexShrink_export_property = flexShrink_local_var_property;
+var flexBasis_export_parse, flexBasis_export_definition, flexBasis_export_property;
+const flexBasis_local_var_property = "flex-basis";
+const flexBasis_local_var_shorthand = "flex";
+flexBasis_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(flexBasis_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+flexBasis_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(flexBasis_local_var_shorthand, "");
+ this._setProperty(flexBasis_local_var_property, v);
+ } else {
+ const val = flexBasis_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(flexBasis_local_var_shorthand) && this._priorities.has(flexBasis_local_var_property) ? this._priorities.get(flexBasis_local_var_property) : "";
+ this._flexBoxSetter(flexBasis_local_var_property, val, priority, flexBasis_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(flexBasis_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+flexBasis_export_property = flexBasis_local_var_property;
+var flex_export_initialValues, flex_export_shorthandFor, flex_export_parse, flex_export_definition, flex_export_property;
+const flex_local_var_property = "flex";
+flex_export_initialValues = new Map([[{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+}.property, "0"], [{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+}.property, "1"], [{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+}.property, "auto"]]);
+flex_export_shorthandFor = new Map([[{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+}.property, {
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+}], [{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+}.property, {
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+}], [{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+}.property, {
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+}]]);
+flex_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const value = external_dependency_parsers_0.parsePropertyValue(flex_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ const flex = {
+ [{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+ }.property]: "1",
+ [{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+ }.property]: "1",
+ [{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property]: "0%"
+ };
+ if (value.length === 1) {
+ const [{
+ isNumber,
+ name,
+ type,
+ unit,
+ value: itemValue
+ }] = value;
+ switch (type) {
+ case AST_TYPES.CALC:
+ {
+ if (isNumber) {
+ flex[{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+ }.property] = `${name}(${itemValue})`;
+ return flex;
+ }
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${name}(${itemValue})`;
+ return flex;
+ }
+ case AST_TYPES.DIMENSION:
+ {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${itemValue}${unit}`;
+ return flex;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ {
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER:
+ {
+ if (name === "none") {
+ return {
+ [{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+ }.property]: "0",
+ [{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+ }.property]: "0",
+ [{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property]: "auto"
+ };
+ }
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = name;
+ return flex;
+ }
+ case AST_TYPES.NUMBER:
+ {
+ flex[{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+ }.property] = itemValue;
+ return flex;
+ }
+ case AST_TYPES.PERCENTAGE:
+ {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${itemValue}%`;
+ return flex;
+ }
+ default:
+ }
+ } else {
+ const [val1, val2, val3] = value;
+ if (val1.type === AST_TYPES.CALC && val1.isNumber) {
+ flex[{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+ }.property] = `${val1.name}(${val1.value})`;
+ } else if (val1.type === AST_TYPES.NUMBER) {
+ flex[{
+ parse: flexGrow_export_parse,
+ definition: flexGrow_export_definition,
+ property: flexGrow_export_property
+ }.property] = val1.value;
+ } else {
+ return;
+ }
+ if (val3) {
+ if (val2.type === AST_TYPES.CALC && val2.isNumber) {
+ flex[{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+ }.property] = `${val2.name}(${val2.value})`;
+ } else if (val2.type === AST_TYPES.NUMBER) {
+ flex[{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+ }.property] = val2.value;
+ } else {
+ return;
+ }
+ if (val3.type === AST_TYPES.GLOBAL_KEYWORD || val3.type === AST_TYPES.IDENTIFIER) {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = val3.name;
+ } else if (val3.type === AST_TYPES.CALC && !val3.isNumber) {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${val3.name}(${val3.value})`;
+ } else if (val3.type === AST_TYPES.DIMENSION) {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${val3.value}${val3.unit}`;
+ } else if (val3.type === AST_TYPES.PERCENTAGE) {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${val3.value}%`;
+ } else {
+ return;
+ }
+ } else {
+ switch (val2.type) {
+ case AST_TYPES.CALC:
+ {
+ if (val2.isNumber) {
+ flex[{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+ }.property] = `${val2.name}(${val2.value})`;
+ } else {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${val2.name}(${val2.value})`;
+ }
+ break;
+ }
+ case AST_TYPES.DIMENSION:
+ {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${val2.value}${val2.unit}`;
+ break;
+ }
+ case AST_TYPES.NUMBER:
+ {
+ flex[{
+ parse: flexShrink_export_parse,
+ definition: flexShrink_export_definition,
+ property: flexShrink_export_property
+ }.property] = val2.value;
+ break;
+ }
+ case AST_TYPES.PERCENTAGE:
+ {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = `${val2.value}%`;
+ break;
+ }
+ case AST_TYPES.IDENTIFIER:
+ {
+ flex[{
+ parse: flexBasis_export_parse,
+ definition: flexBasis_export_definition,
+ property: flexBasis_export_property
+ }.property] = val2.name;
+ break;
+ }
+ default:
+ {
+ return;
+ }
+ }
+ }
+ return flex;
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+flex_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ for (const [longhand] of flex_export_shorthandFor) {
+ this._setProperty(longhand, "");
+ }
+ this._setProperty(flex_local_var_property, v);
+ } else {
+ const val = flex_export_parse(v, {
+ globalObject: this._global
+ });
+ const priority = this._priorities.get(flex_local_var_property) ?? "";
+ if (typeof val === "string") {
+ for (const [longhand] of flex_export_shorthandFor) {
+ this._setProperty(longhand, val, priority);
+ }
+ this._setProperty(flex_local_var_property, val, priority);
+ } else if (val) {
+ const values = [];
+ for (const [longhand, value] of Object.entries(val)) {
+ values.push(value);
+ this._setProperty(longhand, value, priority);
+ }
+ this._setProperty(flex_local_var_property, values.join(" "), priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(flex_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+flex_export_property = flex_local_var_property;
+var float_export_parse, float_export_definition, float_export_property;
+const float_local_var_property = "float";
+float_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(float_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+float_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(float_local_var_property, v);
+ } else {
+ const val = float_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(float_local_var_property) ?? "";
+ this._setProperty(float_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(float_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+float_export_property = float_local_var_property;
+var floodColor_export_parse, floodColor_export_definition, floodColor_export_property;
+const floodColor_local_var_property = "flood-color";
+floodColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(floodColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+floodColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(floodColor_local_var_property, v);
+ } else {
+ const val = floodColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(floodColor_local_var_property) ?? "";
+ this._setProperty(floodColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(floodColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+floodColor_export_property = floodColor_local_var_property;
+var fontStyle_export_parse, fontStyle_export_definition, fontStyle_export_property;
+const fontStyle_local_var_property = "font-style";
+const fontStyle_local_var_shorthand = "font";
+fontStyle_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const value = external_dependency_parsers_0.parsePropertyValue(fontStyle_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ if (value.length === 1) {
+ const [{
+ name,
+ type
+ }] = value;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER:
+ {
+ return name;
+ }
+ default:
+ }
+ } else if (value.length === 2) {
+ const [part1, part2] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = external_dependency_parsers_0.resolveNumericValue([part2], {
+ type: "angle"
+ });
+ if (val1 && val1 === "oblique" && val2) {
+ return `${val1} ${val2}`;
+ }
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+fontStyle_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(fontStyle_local_var_shorthand, "");
+ this._setProperty(fontStyle_local_var_property, v);
+ } else {
+ const val = fontStyle_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(fontStyle_local_var_shorthand) && this._priorities.has(fontStyle_local_var_property) ? this._priorities.get(fontStyle_local_var_property) : "";
+ this._setProperty(fontStyle_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(fontStyle_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+fontStyle_export_property = fontStyle_local_var_property;
+var fontVariant_export_parse, fontVariant_export_definition, fontVariant_export_property;
+const fontVariant_local_var_property = "font-variant";
+const fontVariant_local_var_shorthand = "font";
+fontVariant_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.splitValue(v);
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(fontVariant_local_var_property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveFunctionValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ if (parsedValues.length > 1) {
+ if (parsedValues.includes("normal") || parsedValues.includes("none")) {
+ return;
+ }
+ }
+ return parsedValues.join(" ");
+ }
+};
+fontVariant_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(fontVariant_local_var_shorthand, "");
+ this._setProperty(fontVariant_local_var_property, v);
+ } else {
+ const val = fontVariant_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(fontVariant_local_var_shorthand) && this._priorities.has(fontVariant_local_var_property) ? this._priorities.get(fontVariant_local_var_property) : "";
+ this._setProperty(fontVariant_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(fontVariant_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+fontVariant_export_property = fontVariant_local_var_property;
+var fontWeight_export_parse, fontWeight_export_definition, fontWeight_export_property;
+const fontWeight_local_var_property = "font-weight";
+const fontWeight_local_var_shorthand = "font";
+fontWeight_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(fontWeight_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 1,
+ max: 1000
+ });
+ if (!parsedValue) {
+ return;
+ }
+ return parsedValue;
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+fontWeight_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(fontWeight_local_var_shorthand, "");
+ this._setProperty(fontWeight_local_var_property, v);
+ } else {
+ const val = fontWeight_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(fontWeight_local_var_shorthand) && this._priorities.has(fontWeight_local_var_property) ? this._priorities.get(fontWeight_local_var_property) : "";
+ this._setProperty(fontWeight_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(fontWeight_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+fontWeight_export_property = fontWeight_local_var_property;
+var fontSize_export_parse, fontSize_export_definition, fontSize_export_property;
+const fontSize_local_var_property = "font-size";
+const fontSize_local_var_shorthand = "font";
+fontSize_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(fontSize_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+fontSize_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(fontSize_local_var_shorthand, "");
+ this._setProperty(fontSize_local_var_property, v);
+ } else {
+ const val = fontSize_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(fontSize_local_var_shorthand) && this._priorities.has(fontSize_local_var_property) ? this._priorities.get(fontSize_local_var_property) : "";
+ this._setProperty(fontSize_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(fontSize_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+fontSize_export_property = fontSize_local_var_property;
+var lineHeight_export_parse, lineHeight_export_definition, lineHeight_export_property;
+const lineHeight_local_var_property = "line-height";
+const lineHeight_local_var_shorthand = "font";
+lineHeight_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(lineHeight_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+lineHeight_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(lineHeight_local_var_shorthand, "");
+ this._setProperty(lineHeight_local_var_property, v);
+ } else {
+ const val = lineHeight_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(lineHeight_local_var_shorthand) && this._priorities.has(lineHeight_local_var_property) ? this._priorities.get(lineHeight_local_var_property) : "";
+ this._setProperty(lineHeight_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(lineHeight_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+lineHeight_export_property = lineHeight_local_var_property;
+var fontFamily_export_parse, fontFamily_export_definition, fontFamily_export_property;
+const fontFamily_local_var_property = "font-family";
+const fontFamily_local_var_shorthand = "font";
+fontFamily_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const values = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = external_dependency_parsers_0.parsePropertyValue(fontFamily_local_var_property, val, {
+ globalObject,
+ caseSensitive: true,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ if (value.length === 1) {
+ const [{
+ name,
+ type,
+ value: itemValue
+ }] = value;
+ switch (type) {
+ case AST_TYPES.FUNCTION:
+ {
+ parsedValues.push(`${name}(${itemValue})`);
+ break;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER:
+ {
+ if (name === "undefined") {
+ return;
+ }
+ parsedValues.push(name);
+ break;
+ }
+ case "String":
+ {
+ const parsedValue = itemValue.replaceAll("\\", "").replaceAll('"', '\\"');
+ parsedValues.push(`"${parsedValue}"`);
+ break;
+ }
+ default:
+ {
+ return;
+ }
+ }
+ } else {
+ const parts = [];
+ for (const item of value) {
+ const {
+ name,
+ type
+ } = item;
+ if (type !== AST_TYPES.IDENTIFIER) {
+ return;
+ }
+ parts.push(name);
+ }
+ const parsedValue = parts.join(" ").replaceAll("\\", "").replaceAll('"', '\\"');
+ parsedValues.push(`"${parsedValue}"`);
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+fontFamily_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(fontFamily_local_var_shorthand, "");
+ this._setProperty(fontFamily_local_var_property, v);
+ } else {
+ const val = fontFamily_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(fontFamily_local_var_shorthand) && this._priorities.has(fontFamily_local_var_property) ? this._priorities.get(fontFamily_local_var_property) : "";
+ this._setProperty(fontFamily_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(fontFamily_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+fontFamily_export_property = fontFamily_local_var_property;
+var font_export_shorthandFor, font_export_parse, font_export_definition, font_export_property;
+const font_local_var_property = "font";
+font_export_shorthandFor = new Map([[{
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+}.property, {
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+}], [{
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+}.property, {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+}], [{
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+}.property, {
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+}], [{
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+}.property, {
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+}], [{
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+}.property, {
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+}], [{
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+}.property, {
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+}]]);
+font_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ } else if (external_dependency_parsers_0.hasCalcFunc(v)) {
+ v = external_dependency_parsers_0.resolveCalc(v);
+ }
+ if (!external_dependency_parsers_0.isValidPropertyValue(font_local_var_property, v)) {
+ return;
+ }
+ const {
+ AST_TYPES
+ } = external_dependency_parsers_0;
+ const [fontBlock, ...families] = external_dependency_parsers_0.splitValue(v, {
+ delimiter: ","
+ });
+ const [fontBlockA, fontBlockB] = external_dependency_parsers_0.splitValue(fontBlock, {
+ delimiter: "/"
+ });
+ const font = {
+ [{
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+ }.property]: "normal",
+ [{
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.property]: "normal",
+ [{
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+ }.property]: "normal"
+ };
+ const fontFamilies = new Set();
+ if (fontBlockB) {
+ const [lineB, ...familiesB] = fontBlockB.trim().split(" ");
+ if (!lineB || !familiesB.length) {
+ return;
+ }
+ const lineHeightB = {
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.parse(lineB, {
+ global
+ });
+ if (typeof lineHeightB !== "string") {
+ return;
+ }
+ const familyB = {
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.parse(familiesB.join(" "), {
+ globalObject,
+ caseSensitive: true
+ });
+ if (typeof familyB === "string") {
+ fontFamilies.add(familyB);
+ } else {
+ return;
+ }
+ const parts = external_dependency_parsers_0.splitValue(fontBlockA.trim());
+ const properties = [{
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+ }.property, {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.property, {
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+ }.property, {
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.property];
+ for (const part of parts) {
+ if (part === "normal") {
+ continue;
+ } else {
+ for (const longhand of properties) {
+ switch (longhand) {
+ case {
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.property:
+ {
+ const parsedValue = {
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ font[longhand] = parsedValue;
+ }
+ break;
+ }
+ case {
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+ }.property:
+ case {
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+ }.property:
+ {
+ if (font[longhand] === "normal") {
+ const longhandItem = font_export_shorthandFor.get(longhand);
+ const parsedValue = longhandItem.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ font[longhand] = parsedValue;
+ }
+ }
+ break;
+ }
+ case {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.property:
+ {
+ if (font[longhand] === "normal") {
+ const parsedValue = {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ if (parsedValue === "small-cap") {
+ font[longhand] = parsedValue;
+ } else if (parsedValue !== "normal") {
+ return;
+ }
+ }
+ }
+ break;
+ }
+ default:
+ }
+ }
+ }
+ }
+ if (Object.hasOwn(font, {
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.property)) {
+ font[{
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.property] = lineHeightB;
+ } else {
+ return;
+ }
+ } else {
+ const revParts = external_dependency_parsers_0.splitValue(fontBlockA.trim()).toReversed();
+ if (revParts.length === 1) {
+ const [part] = revParts;
+ const value = external_dependency_parsers_0.parsePropertyValue(font_local_var_property, part, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const [{
+ name,
+ type
+ }] = value;
+ if (type === AST_TYPES.GLOBAL_KEYWORD) {
+ return {
+ [{
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+ }.property]: name,
+ [{
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.property]: name,
+ [{
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+ }.property]: name,
+ [{
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.property]: name,
+ [{
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.property]: name,
+ [{
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.property]: name
+ };
+ }
+ }
+ return;
+ }
+ const properties = [{
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+ }.property, {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.property, {
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+ }.property, {
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.property];
+ for (const longhand of properties) {
+ font[longhand] = "normal";
+ }
+ const revFontFamily = [];
+ let fontSizeA;
+ for (const part of revParts) {
+ if (fontSizeA) {
+ if (/^normal$/i.test(part)) {
+ continue;
+ } else {
+ for (const longhand of properties) {
+ switch (longhand) {
+ case {
+ parse: fontStyle_export_parse,
+ definition: fontStyle_export_definition,
+ property: fontStyle_export_property
+ }.property:
+ case {
+ parse: fontWeight_export_parse,
+ definition: fontWeight_export_definition,
+ property: fontWeight_export_property
+ }.property:
+ case {
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.property:
+ {
+ if (font[longhand] === "normal") {
+ const longhandItem = font_export_shorthandFor.get(longhand);
+ const parsedValue = longhandItem.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ font[longhand] = parsedValue;
+ }
+ }
+ break;
+ }
+ case {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.property:
+ {
+ if (font[longhand] === "normal") {
+ const parsedValue = {
+ parse: fontVariant_export_parse,
+ definition: fontVariant_export_definition,
+ property: fontVariant_export_property
+ }.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ if (parsedValue === "small-cap") {
+ font[longhand] = parsedValue;
+ } else if (parsedValue !== "normal") {
+ return;
+ }
+ }
+ }
+ break;
+ }
+ default:
+ }
+ }
+ }
+ } else {
+ const parsedFontSize = {
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.parse(part, {
+ globalObject
+ });
+ if (typeof parsedFontSize === "string") {
+ fontSizeA = parsedFontSize;
+ } else {
+ const parsedFontFamily = {
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.parse(part, {
+ globalObject,
+ caseSensitive: true
+ });
+ if (typeof parsedFontFamily === "string") {
+ revFontFamily.push(parsedFontFamily);
+ } else {
+ return;
+ }
+ }
+ }
+ }
+ const family = {
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.parse(revFontFamily.toReversed().join(" "), {
+ globalObject,
+ caseSensitive: true
+ });
+ if (fontSizeA && family) {
+ font[{
+ parse: fontSize_export_parse,
+ definition: fontSize_export_definition,
+ property: fontSize_export_property
+ }.property] = fontSizeA;
+ fontFamilies.add({
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.parse(family));
+ } else {
+ return;
+ }
+ }
+ for (const family of families) {
+ const parsedFontFamily = {
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.parse(family, {
+ globalObject,
+ caseSensitive: true
+ });
+ if (parsedFontFamily) {
+ fontFamilies.add(parsedFontFamily);
+ } else {
+ return;
+ }
+ }
+ font[{
+ parse: fontFamily_export_parse,
+ definition: fontFamily_export_definition,
+ property: fontFamily_export_property
+ }.property] = [...fontFamilies].join(", ");
+ return font;
+};
+font_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (v === "" || external_dependency_parsers_0.hasVarFunc(v)) {
+ for (const [key] of font_export_shorthandFor) {
+ this._setProperty(key, "");
+ }
+ this._setProperty(font_local_var_property, v);
+ } else {
+ const obj = font_export_parse(v, {
+ globalObject: this._global
+ });
+ if (!obj) {
+ return;
+ }
+ const priority = this._priorities.get(font_local_var_property) ?? "";
+ const str = new Set();
+ for (const [key] of font_export_shorthandFor) {
+ const val = obj[key];
+ if (typeof val === "string") {
+ this._setProperty(key, val, priority);
+ if (val && val !== "normal" && !str.has(val)) {
+ if (key === {
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.property) {
+ str.add(`/ ${val}`);
+ } else {
+ str.add(val);
+ }
+ }
+ }
+ }
+ this._setProperty(font_local_var_property, [...str].join(" "), priority);
+ }
+ },
+ get() {
+ const val = this.getPropertyValue(font_local_var_property);
+ if (external_dependency_parsers_0.hasVarFunc(val)) {
+ return val;
+ }
+ const str = new Set();
+ for (const [key] of font_export_shorthandFor) {
+ const v = this.getPropertyValue(key);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ return "";
+ }
+ if (v && v !== "normal" && !str.has(v)) {
+ if (key === {
+ parse: lineHeight_export_parse,
+ definition: lineHeight_export_definition,
+ property: lineHeight_export_property
+ }.property) {
+ str.add(`/ ${v}`);
+ } else {
+ str.add(`${v}`);
+ }
+ }
+ }
+ return [...str].join(" ");
+ },
+ enumerable: true,
+ configurable: true
+};
+font_export_property = font_local_var_property;
+var height_export_parse, height_export_definition, height_export_property;
+const height_local_var_property = "height";
+height_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(height_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+height_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(height_local_var_property, v);
+ } else {
+ const val = height_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(height_local_var_property) ?? "";
+ this._setProperty(height_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(height_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+height_export_property = height_local_var_property;
+var left_export_parse, left_export_definition, left_export_property;
+const left_local_var_property = "left";
+left_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(left_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+left_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(left_local_var_property, v);
+ } else {
+ const val = left_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(left_local_var_property) ?? "";
+ this._setProperty(left_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(left_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+left_export_property = left_local_var_property;
+var lightingColor_export_parse, lightingColor_export_definition, lightingColor_export_property;
+const lightingColor_local_var_property = "lighting-color";
+lightingColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(lightingColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+lightingColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(lightingColor_local_var_property, v);
+ } else {
+ const val = lightingColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(lightingColor_local_var_property) ?? "";
+ this._setProperty(lightingColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(lightingColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+lightingColor_export_property = lightingColor_local_var_property;
+var marginTop_export_position, marginTop_export_parse, marginTop_export_definition, marginTop_export_property;
+const marginTop_local_var_property = "margin-top";
+const marginTop_local_var_shorthand = "margin";
+marginTop_export_position = "top";
+marginTop_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(marginTop_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+marginTop_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(marginTop_local_var_shorthand, "");
+ this._setProperty(marginTop_local_var_property, v);
+ } else {
+ const val = marginTop_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(marginTop_local_var_shorthand) && this._priorities.has(marginTop_local_var_property) ? this._priorities.get(marginTop_local_var_property) : "";
+ this._positionLonghandSetter(marginTop_local_var_property, val, priority, marginTop_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(marginTop_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+marginTop_export_property = marginTop_local_var_property;
+var marginRight_export_position, marginRight_export_parse, marginRight_export_definition, marginRight_export_property;
+const marginRight_local_var_property = "margin-right";
+const marginRight_local_var_shorthand = "margin";
+marginRight_export_position = "right";
+marginRight_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(marginRight_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+marginRight_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(marginRight_local_var_shorthand, "");
+ this._setProperty(marginRight_local_var_property, v);
+ } else {
+ const val = marginRight_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(marginRight_local_var_shorthand) && this._priorities.has(marginRight_local_var_property) ? this._priorities.get(marginRight_local_var_property) : "";
+ this._positionLonghandSetter(marginRight_local_var_property, val, priority, marginRight_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(marginRight_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+marginRight_export_property = marginRight_local_var_property;
+var marginBottom_export_position, marginBottom_export_parse, marginBottom_export_definition, marginBottom_export_property;
+const marginBottom_local_var_property = "margin-bottom";
+const marginBottom_local_var_shorthand = "margin";
+marginBottom_export_position = "bottom";
+marginBottom_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(marginBottom_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+marginBottom_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(marginBottom_local_var_shorthand, "");
+ this._setProperty(marginBottom_local_var_property, v);
+ } else {
+ const val = marginBottom_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(marginBottom_local_var_shorthand) && this._priorities.has(marginBottom_local_var_property) ? this._priorities.get(marginBottom_local_var_property) : "";
+ this._positionLonghandSetter(marginBottom_local_var_property, val, priority, marginBottom_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(marginBottom_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+marginBottom_export_property = marginBottom_local_var_property;
+var marginLeft_export_position, marginLeft_export_parse, marginLeft_export_definition, marginLeft_export_property;
+const marginLeft_local_var_property = "margin-left";
+const marginLeft_local_var_shorthand = "margin";
+marginLeft_export_position = "left";
+marginLeft_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(marginLeft_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+marginLeft_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(marginLeft_local_var_shorthand, "");
+ this._setProperty(marginLeft_local_var_property, v);
+ } else {
+ const val = marginLeft_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(marginLeft_local_var_shorthand) && this._priorities.has(marginLeft_local_var_property) ? this._priorities.get(marginLeft_local_var_property) : "";
+ this._positionLonghandSetter(marginLeft_local_var_property, val, priority, marginLeft_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(marginLeft_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+marginLeft_export_property = marginLeft_local_var_property;
+var margin_export_position, margin_export_shorthandFor, margin_export_parse, margin_export_definition, margin_export_property;
+const margin_local_var_property = "margin";
+margin_export_position = "edges";
+margin_export_shorthandFor = new Map([[{
+ position: marginTop_export_position,
+ parse: marginTop_export_parse,
+ definition: marginTop_export_definition,
+ property: marginTop_export_property
+}.property, {
+ position: marginTop_export_position,
+ parse: marginTop_export_parse,
+ definition: marginTop_export_definition,
+ property: marginTop_export_property
+}], [{
+ position: marginRight_export_position,
+ parse: marginRight_export_parse,
+ definition: marginRight_export_definition,
+ property: marginRight_export_property
+}.property, {
+ position: marginRight_export_position,
+ parse: marginRight_export_parse,
+ definition: marginRight_export_definition,
+ property: marginRight_export_property
+}], [{
+ position: marginBottom_export_position,
+ parse: marginBottom_export_parse,
+ definition: marginBottom_export_definition,
+ property: marginBottom_export_property
+}.property, {
+ position: marginBottom_export_position,
+ parse: marginBottom_export_parse,
+ definition: marginBottom_export_definition,
+ property: marginBottom_export_property
+}], [{
+ position: marginLeft_export_position,
+ parse: marginLeft_export_parse,
+ definition: marginLeft_export_definition,
+ property: marginLeft_export_property
+}.property, {
+ position: marginLeft_export_position,
+ parse: marginLeft_export_parse,
+ definition: marginLeft_export_definition,
+ property: marginLeft_export_property
+}]]);
+margin_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.parsePropertyValue(margin_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = external_dependency_parsers_0.resolveNumericValue([value], {
+ length: values.length,
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ return parsedValues;
+ }
+};
+margin_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ for (const [longhand] of margin_export_shorthandFor) {
+ this._setProperty(longhand, "");
+ }
+ this._setProperty(margin_local_var_property, v);
+ } else {
+ const val = margin_export_parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = this._priorities.get(margin_local_var_property) ?? "";
+ this._positionShorthandSetter(margin_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(margin_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+margin_export_property = margin_local_var_property;
+var opacity_export_parse, opacity_export_definition, opacity_export_property;
+const opacity_local_var_property = "opacity";
+opacity_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(opacity_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ clamp: true
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+opacity_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(opacity_local_var_property, v);
+ } else {
+ const val = opacity_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(opacity_local_var_property) ?? "";
+ this._setProperty(opacity_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(opacity_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+opacity_export_property = opacity_local_var_property;
+var outlineColor_export_parse, outlineColor_export_definition, outlineColor_export_property;
+const outlineColor_local_var_property = "outline-color";
+outlineColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(outlineColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+outlineColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(outlineColor_local_var_property, v);
+ } else {
+ const val = outlineColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(outlineColor_local_var_property) ?? "";
+ this._setProperty(outlineColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(outlineColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+outlineColor_export_property = outlineColor_local_var_property;
+var paddingTop_export_position, paddingTop_export_parse, paddingTop_export_definition, paddingTop_export_property;
+const paddingTop_local_var_property = "padding-top";
+const paddingTop_local_var_shorthand = "padding";
+paddingTop_export_position = "top";
+paddingTop_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(paddingTop_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+paddingTop_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(paddingTop_local_var_shorthand, "");
+ this._setProperty(paddingTop_local_var_property, v);
+ } else {
+ const val = paddingTop_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(paddingTop_local_var_shorthand) && this._priorities.has(paddingTop_local_var_property) ? this._priorities.get(paddingTop_local_var_property) : "";
+ this._positionLonghandSetter(paddingTop_local_var_property, val, priority, paddingTop_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(paddingTop_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+paddingTop_export_property = paddingTop_local_var_property;
+var paddingRight_export_position, paddingRight_export_parse, paddingRight_export_definition, paddingRight_export_property;
+const paddingRight_local_var_property = "padding-right";
+const paddingRight_local_var_shorthand = "padding";
+paddingRight_export_position = "right";
+paddingRight_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(paddingRight_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+paddingRight_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(paddingRight_local_var_shorthand, "");
+ this._setProperty(paddingRight_local_var_property, v);
+ } else {
+ const val = paddingRight_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(paddingRight_local_var_shorthand) && this._priorities.has(paddingRight_local_var_property) ? this._priorities.get(paddingRight_local_var_property) : "";
+ this._positionLonghandSetter(paddingRight_local_var_property, val, priority, paddingRight_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(paddingRight_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+paddingRight_export_property = paddingRight_local_var_property;
+var paddingBottom_export_position, paddingBottom_export_parse, paddingBottom_export_definition, paddingBottom_export_property;
+const paddingBottom_local_var_property = "padding-bottom";
+const paddingBottom_local_var_shorthand = "padding";
+paddingBottom_export_position = "bottom";
+paddingBottom_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(paddingBottom_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+paddingBottom_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(paddingBottom_local_var_shorthand, "");
+ this._setProperty(paddingBottom_local_var_property, v);
+ } else {
+ const val = paddingBottom_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(paddingBottom_local_var_shorthand) && this._priorities.has(paddingBottom_local_var_property) ? this._priorities.get(paddingBottom_local_var_property) : "";
+ this._positionLonghandSetter(paddingBottom_local_var_property, val, priority, paddingBottom_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(paddingBottom_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+paddingBottom_export_property = paddingBottom_local_var_property;
+var paddingLeft_export_position, paddingLeft_export_parse, paddingLeft_export_definition, paddingLeft_export_property;
+const paddingLeft_local_var_property = "padding-left";
+const paddingLeft_local_var_shorthand = "padding";
+paddingLeft_export_position = "left";
+paddingLeft_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(paddingLeft_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+paddingLeft_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(paddingLeft_local_var_shorthand, "");
+ this._setProperty(paddingLeft_local_var_property, v);
+ } else {
+ const val = paddingLeft_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = !this._priorities.get(paddingLeft_local_var_shorthand) && this._priorities.has(paddingLeft_local_var_property) ? this._priorities.get(paddingLeft_local_var_property) : "";
+ this._positionLonghandSetter(paddingLeft_local_var_property, val, priority, paddingLeft_local_var_shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(paddingLeft_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+paddingLeft_export_property = paddingLeft_local_var_property;
+var padding_export_position, padding_export_shorthandFor, padding_export_parse, padding_export_definition, padding_export_property;
+const padding_local_var_property = "padding";
+padding_export_position = "edges";
+padding_export_shorthandFor = new Map([[{
+ position: paddingTop_export_position,
+ parse: paddingTop_export_parse,
+ definition: paddingTop_export_definition,
+ property: paddingTop_export_property
+}.property, {
+ position: paddingTop_export_position,
+ parse: paddingTop_export_parse,
+ definition: paddingTop_export_definition,
+ property: paddingTop_export_property
+}], [{
+ position: paddingRight_export_position,
+ parse: paddingRight_export_parse,
+ definition: paddingRight_export_definition,
+ property: paddingRight_export_property
+}.property, {
+ position: paddingRight_export_position,
+ parse: paddingRight_export_parse,
+ definition: paddingRight_export_definition,
+ property: paddingRight_export_property
+}], [{
+ position: paddingBottom_export_position,
+ parse: paddingBottom_export_parse,
+ definition: paddingBottom_export_definition,
+ property: paddingBottom_export_property
+}.property, {
+ position: paddingBottom_export_position,
+ parse: paddingBottom_export_parse,
+ definition: paddingBottom_export_definition,
+ property: paddingBottom_export_property
+}], [{
+ position: paddingLeft_export_position,
+ parse: paddingLeft_export_parse,
+ definition: paddingLeft_export_definition,
+ property: paddingLeft_export_property
+}.property, {
+ position: paddingLeft_export_position,
+ parse: paddingLeft_export_parse,
+ definition: paddingLeft_export_definition,
+ property: paddingLeft_export_property
+}]]);
+padding_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = external_dependency_parsers_0.parsePropertyValue(padding_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = external_dependency_parsers_0.resolveNumericValue([value], {
+ length: values.length,
+ min: 0,
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ return parsedValues;
+ }
+};
+padding_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ for (const [longhand] of padding_export_shorthandFor) {
+ this._setProperty(longhand, "");
+ }
+ this._setProperty(padding_local_var_property, v);
+ } else {
+ const val = padding_export_parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = this._priorities.get(padding_local_var_property) ?? "";
+ this._positionShorthandSetter(padding_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(padding_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+padding_export_property = padding_local_var_property;
+var right_export_parse, right_export_definition, right_export_property;
+const right_local_var_property = "right";
+right_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(right_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+right_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(right_local_var_property, v);
+ } else {
+ const val = right_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(right_local_var_property) ?? "";
+ this._setProperty(right_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(right_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+right_export_property = right_local_var_property;
+var stopColor_export_parse, stopColor_export_definition, stopColor_export_property;
+const stopColor_local_var_property = "stop-color";
+stopColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(stopColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+stopColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(stopColor_local_var_property, v);
+ } else {
+ const val = stopColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(stopColor_local_var_property) ?? "";
+ this._setProperty(stopColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(stopColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+stopColor_export_property = stopColor_local_var_property;
+var top_export_parse, top_export_definition, top_export_property;
+const top_local_var_property = "top";
+top_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(top_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+top_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(top_local_var_property, v);
+ } else {
+ const val = top_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(top_local_var_property) ?? "";
+ this._setProperty(top_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(top_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+top_export_property = top_local_var_property;
+var webkitBorderAfterColor_export_parse, webkitBorderAfterColor_export_definition, webkitBorderAfterColor_export_property;
+const webkitBorderAfterColor_local_var_property = "-webkit-border-after-color";
+webkitBorderAfterColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitBorderAfterColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitBorderAfterColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitBorderAfterColor_local_var_property, v);
+ } else {
+ const val = webkitBorderAfterColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitBorderAfterColor_local_var_property) ?? "";
+ this._setProperty(webkitBorderAfterColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitBorderAfterColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitBorderAfterColor_export_property = webkitBorderAfterColor_local_var_property;
+var webkitBorderBeforeColor_export_parse, webkitBorderBeforeColor_export_definition, webkitBorderBeforeColor_export_property;
+const webkitBorderBeforeColor_local_var_property = "-webkit-border-before-color";
+webkitBorderBeforeColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitBorderBeforeColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitBorderBeforeColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitBorderBeforeColor_local_var_property, v);
+ } else {
+ const val = webkitBorderBeforeColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitBorderBeforeColor_local_var_property) ?? "";
+ this._setProperty(webkitBorderBeforeColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitBorderBeforeColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitBorderBeforeColor_export_property = webkitBorderBeforeColor_local_var_property;
+var webkitBorderEndColor_export_parse, webkitBorderEndColor_export_definition, webkitBorderEndColor_export_property;
+const webkitBorderEndColor_local_var_property = "-webkit-border-end-color";
+webkitBorderEndColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitBorderEndColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitBorderEndColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitBorderEndColor_local_var_property, v);
+ } else {
+ const val = webkitBorderEndColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitBorderEndColor_local_var_property) ?? "";
+ this._setProperty(webkitBorderEndColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitBorderEndColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitBorderEndColor_export_property = webkitBorderEndColor_local_var_property;
+var webkitBorderStartColor_export_parse, webkitBorderStartColor_export_definition, webkitBorderStartColor_export_property;
+const webkitBorderStartColor_local_var_property = "-webkit-border-start-color";
+webkitBorderStartColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitBorderStartColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitBorderStartColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitBorderStartColor_local_var_property, v);
+ } else {
+ const val = webkitBorderStartColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitBorderStartColor_local_var_property) ?? "";
+ this._setProperty(webkitBorderStartColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitBorderStartColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitBorderStartColor_export_property = webkitBorderStartColor_local_var_property;
+var webkitColumnRuleColor_export_parse, webkitColumnRuleColor_export_definition, webkitColumnRuleColor_export_property;
+const webkitColumnRuleColor_local_var_property = "-webkit-column-rule-color";
+webkitColumnRuleColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitColumnRuleColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitColumnRuleColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitColumnRuleColor_local_var_property, v);
+ } else {
+ const val = webkitColumnRuleColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitColumnRuleColor_local_var_property) ?? "";
+ this._setProperty(webkitColumnRuleColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitColumnRuleColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitColumnRuleColor_export_property = webkitColumnRuleColor_local_var_property;
+var webkitTapHighlightColor_export_parse, webkitTapHighlightColor_export_definition, webkitTapHighlightColor_export_property;
+const webkitTapHighlightColor_local_var_property = "-webkit-tap-highlight-color";
+webkitTapHighlightColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitTapHighlightColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitTapHighlightColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitTapHighlightColor_local_var_property, v);
+ } else {
+ const val = webkitTapHighlightColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitTapHighlightColor_local_var_property) ?? "";
+ this._setProperty(webkitTapHighlightColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitTapHighlightColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitTapHighlightColor_export_property = webkitTapHighlightColor_local_var_property;
+var webkitTextEmphasisColor_export_parse, webkitTextEmphasisColor_export_definition, webkitTextEmphasisColor_export_property;
+const webkitTextEmphasisColor_local_var_property = "-webkit-text-emphasis-color";
+webkitTextEmphasisColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitTextEmphasisColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitTextEmphasisColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitTextEmphasisColor_local_var_property, v);
+ } else {
+ const val = webkitTextEmphasisColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitTextEmphasisColor_local_var_property) ?? "";
+ this._setProperty(webkitTextEmphasisColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitTextEmphasisColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitTextEmphasisColor_export_property = webkitTextEmphasisColor_local_var_property;
+var webkitTextFillColor_export_parse, webkitTextFillColor_export_definition, webkitTextFillColor_export_property;
+const webkitTextFillColor_local_var_property = "-webkit-text-fill-color";
+webkitTextFillColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitTextFillColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitTextFillColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitTextFillColor_local_var_property, v);
+ } else {
+ const val = webkitTextFillColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitTextFillColor_local_var_property) ?? "";
+ this._setProperty(webkitTextFillColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitTextFillColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitTextFillColor_export_property = webkitTextFillColor_local_var_property;
+var webkitTextStrokeColor_export_parse, webkitTextStrokeColor_export_definition, webkitTextStrokeColor_export_property;
+const webkitTextStrokeColor_local_var_property = "-webkit-text-stroke-color";
+webkitTextStrokeColor_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(webkitTextStrokeColor_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+webkitTextStrokeColor_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(webkitTextStrokeColor_local_var_property, v);
+ } else {
+ const val = webkitTextStrokeColor_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(webkitTextStrokeColor_local_var_property) ?? "";
+ this._setProperty(webkitTextStrokeColor_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(webkitTextStrokeColor_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+webkitTextStrokeColor_export_property = webkitTextStrokeColor_local_var_property;
+var width_export_parse, width_export_definition, width_export_property;
+const width_local_var_property = "width";
+width_export_parse = (v, opt = {}) => {
+ const {
+ globalObject
+ } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = external_dependency_parsers_0.parsePropertyValue(width_local_var_property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return external_dependency_parsers_0.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+width_export_definition = {
+ set(v) {
+ v = external_dependency_parsers_0.prepareValue(v);
+ if (external_dependency_parsers_0.hasVarFunc(v)) {
+ this._setProperty(width_local_var_property, v);
+ } else {
+ const val = width_export_parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(width_local_var_property) ?? "";
+ this._setProperty(width_local_var_property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(width_local_var_property);
+ },
+ enumerable: true,
+ configurable: true
+};
+width_export_property = width_local_var_property;
+module.exports = {
+ backgroundImage: backgroundImage_export_definition,
+ "background-image": backgroundImage_export_definition,
+ backgroundPosition: backgroundPosition_export_definition,
+ "background-position": backgroundPosition_export_definition,
+ backgroundSize: backgroundSize_export_definition,
+ "background-size": backgroundSize_export_definition,
+ backgroundRepeat: backgroundRepeat_export_definition,
+ "background-repeat": backgroundRepeat_export_definition,
+ backgroundOrigin: backgroundOrigin_export_definition,
+ "background-origin": backgroundOrigin_export_definition,
+ backgroundClip: backgroundClip_export_definition,
+ "background-clip": backgroundClip_export_definition,
+ backgroundAttachment: backgroundAttachment_export_definition,
+ "background-attachment": backgroundAttachment_export_definition,
+ backgroundColor: backgroundColor_export_definition,
+ "background-color": backgroundColor_export_definition,
+ background: background_export_definition,
+ borderTopWidth: borderTopWidth_export_definition,
+ "border-top-width": borderTopWidth_export_definition,
+ borderRightWidth: borderRightWidth_export_definition,
+ "border-right-width": borderRightWidth_export_definition,
+ borderBottomWidth: borderBottomWidth_export_definition,
+ "border-bottom-width": borderBottomWidth_export_definition,
+ borderLeftWidth: borderLeftWidth_export_definition,
+ "border-left-width": borderLeftWidth_export_definition,
+ borderWidth: borderWidth_export_definition,
+ "border-width": borderWidth_export_definition,
+ borderTopStyle: borderTopStyle_export_definition,
+ "border-top-style": borderTopStyle_export_definition,
+ borderRightStyle: borderRightStyle_export_definition,
+ "border-right-style": borderRightStyle_export_definition,
+ borderBottomStyle: borderBottomStyle_export_definition,
+ "border-bottom-style": borderBottomStyle_export_definition,
+ borderLeftStyle: borderLeftStyle_export_definition,
+ "border-left-style": borderLeftStyle_export_definition,
+ borderStyle: borderStyle_export_definition,
+ "border-style": borderStyle_export_definition,
+ borderTopColor: borderTopColor_export_definition,
+ "border-top-color": borderTopColor_export_definition,
+ borderRightColor: borderRightColor_export_definition,
+ "border-right-color": borderRightColor_export_definition,
+ borderBottomColor: borderBottomColor_export_definition,
+ "border-bottom-color": borderBottomColor_export_definition,
+ borderLeftColor: borderLeftColor_export_definition,
+ "border-left-color": borderLeftColor_export_definition,
+ borderColor: borderColor_export_definition,
+ "border-color": borderColor_export_definition,
+ borderTop: borderTop_export_definition,
+ "border-top": borderTop_export_definition,
+ borderRight: borderRight_export_definition,
+ "border-right": borderRight_export_definition,
+ borderBottom: borderBottom_export_definition,
+ "border-bottom": borderBottom_export_definition,
+ borderLeft: borderLeft_export_definition,
+ "border-left": borderLeft_export_definition,
+ border: border_export_definition,
+ borderCollapse: borderCollapse_export_definition,
+ "border-collapse": borderCollapse_export_definition,
+ borderSpacing: borderSpacing_export_definition,
+ "border-spacing": borderSpacing_export_definition,
+ bottom: bottom_export_definition,
+ clear: clear_export_definition,
+ clip: clip_export_definition,
+ color: color_export_definition,
+ display: display_export_definition,
+ flexGrow: flexGrow_export_definition,
+ "flex-grow": flexGrow_export_definition,
+ flexShrink: flexShrink_export_definition,
+ "flex-shrink": flexShrink_export_definition,
+ flexBasis: flexBasis_export_definition,
+ "flex-basis": flexBasis_export_definition,
+ flex: flex_export_definition,
+ float: float_export_definition,
+ floodColor: floodColor_export_definition,
+ "flood-color": floodColor_export_definition,
+ fontStyle: fontStyle_export_definition,
+ "font-style": fontStyle_export_definition,
+ fontVariant: fontVariant_export_definition,
+ "font-variant": fontVariant_export_definition,
+ fontWeight: fontWeight_export_definition,
+ "font-weight": fontWeight_export_definition,
+ fontSize: fontSize_export_definition,
+ "font-size": fontSize_export_definition,
+ lineHeight: lineHeight_export_definition,
+ "line-height": lineHeight_export_definition,
+ fontFamily: fontFamily_export_definition,
+ "font-family": fontFamily_export_definition,
+ font: font_export_definition,
+ height: height_export_definition,
+ left: left_export_definition,
+ lightingColor: lightingColor_export_definition,
+ "lighting-color": lightingColor_export_definition,
+ marginTop: marginTop_export_definition,
+ "margin-top": marginTop_export_definition,
+ marginRight: marginRight_export_definition,
+ "margin-right": marginRight_export_definition,
+ marginBottom: marginBottom_export_definition,
+ "margin-bottom": marginBottom_export_definition,
+ marginLeft: marginLeft_export_definition,
+ "margin-left": marginLeft_export_definition,
+ margin: margin_export_definition,
+ opacity: opacity_export_definition,
+ outlineColor: outlineColor_export_definition,
+ "outline-color": outlineColor_export_definition,
+ paddingTop: paddingTop_export_definition,
+ "padding-top": paddingTop_export_definition,
+ paddingRight: paddingRight_export_definition,
+ "padding-right": paddingRight_export_definition,
+ paddingBottom: paddingBottom_export_definition,
+ "padding-bottom": paddingBottom_export_definition,
+ paddingLeft: paddingLeft_export_definition,
+ "padding-left": paddingLeft_export_definition,
+ padding: padding_export_definition,
+ right: right_export_definition,
+ stopColor: stopColor_export_definition,
+ "stop-color": stopColor_export_definition,
+ top: top_export_definition,
+ webkitBorderAfterColor: webkitBorderAfterColor_export_definition,
+ "-webkit-border-after-color": webkitBorderAfterColor_export_definition,
+ "WebkitBorderAfterColor": webkitBorderAfterColor_export_definition,
+ webkitBorderBeforeColor: webkitBorderBeforeColor_export_definition,
+ "-webkit-border-before-color": webkitBorderBeforeColor_export_definition,
+ "WebkitBorderBeforeColor": webkitBorderBeforeColor_export_definition,
+ webkitBorderEndColor: webkitBorderEndColor_export_definition,
+ "-webkit-border-end-color": webkitBorderEndColor_export_definition,
+ "WebkitBorderEndColor": webkitBorderEndColor_export_definition,
+ webkitBorderStartColor: webkitBorderStartColor_export_definition,
+ "-webkit-border-start-color": webkitBorderStartColor_export_definition,
+ "WebkitBorderStartColor": webkitBorderStartColor_export_definition,
+ webkitColumnRuleColor: webkitColumnRuleColor_export_definition,
+ "-webkit-column-rule-color": webkitColumnRuleColor_export_definition,
+ "WebkitColumnRuleColor": webkitColumnRuleColor_export_definition,
+ webkitTapHighlightColor: webkitTapHighlightColor_export_definition,
+ "-webkit-tap-highlight-color": webkitTapHighlightColor_export_definition,
+ "WebkitTapHighlightColor": webkitTapHighlightColor_export_definition,
+ webkitTextEmphasisColor: webkitTextEmphasisColor_export_definition,
+ "-webkit-text-emphasis-color": webkitTextEmphasisColor_export_definition,
+ "WebkitTextEmphasisColor": webkitTextEmphasisColor_export_definition,
+ webkitTextFillColor: webkitTextFillColor_export_definition,
+ "-webkit-text-fill-color": webkitTextFillColor_export_definition,
+ "WebkitTextFillColor": webkitTextFillColor_export_definition,
+ webkitTextStrokeColor: webkitTextStrokeColor_export_definition,
+ "-webkit-text-stroke-color": webkitTextStrokeColor_export_definition,
+ "WebkitTextStrokeColor": webkitTextStrokeColor_export_definition,
+ width: width_export_definition
+};
diff --git a/vanilla/node_modules/cssstyle/lib/generated/propertyDefinitions.js b/vanilla/node_modules/cssstyle/lib/generated/propertyDefinitions.js
new file mode 100644
index 0000000..c55da00
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/generated/propertyDefinitions.js
@@ -0,0 +1,13033 @@
+"use strict";
+// autogenerated - 2026-01-06
+
+module.exports = new Map([
+ [
+ "-webkit-flex-wrap",
+ {
+ "name": "-webkit-flex-wrap",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-flex-wrap",
+ "legacyAliasOf": "flex-wrap",
+ "styleDeclaration": [
+ "-webkit-flex-wrap",
+ "WebkitFlexWrap",
+ "webkitFlexWrap"
+ ],
+ "extended": [],
+ "syntax": "nowrap | wrap | wrap-reverse"
+ }
+ ],
+ [
+ "-webkit-line-clamp",
+ {
+ "name": "-webkit-line-clamp",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef--webkit-line-clamp",
+ "initial": "none",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "-webkit-line-clamp",
+ "WebkitLineClamp",
+ "webkitLineClamp"
+ ],
+ "syntax": "none | <integer [1,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "-webkit-mask-box-image-outset",
+ {
+ "name": "-webkit-mask-box-image-outset",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-mask-box-image-outset",
+ "legacyAliasOf": "mask-border-outset",
+ "styleDeclaration": [
+ "-webkit-mask-box-image-outset",
+ "WebkitMaskBoxImageOutset",
+ "webkitMaskBoxImageOutset"
+ ],
+ "extended": [],
+ "syntax": "[ <length> | <number> ]{1,4}"
+ }
+ ],
+ [
+ "-webkit-mask-box-image-repeat",
+ {
+ "name": "-webkit-mask-box-image-repeat",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-mask-box-image-repeat",
+ "legacyAliasOf": "mask-border-repeat",
+ "styleDeclaration": [
+ "-webkit-mask-box-image-repeat",
+ "WebkitMaskBoxImageRepeat",
+ "webkitMaskBoxImageRepeat"
+ ],
+ "extended": [],
+ "syntax": "[ stretch | repeat | round | space ]{1,2}"
+ }
+ ],
+ [
+ "-webkit-mask-box-image-slice",
+ {
+ "name": "-webkit-mask-box-image-slice",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-mask-box-image-slice",
+ "legacyAliasOf": "mask-border-slice",
+ "styleDeclaration": [
+ "-webkit-mask-box-image-slice",
+ "WebkitMaskBoxImageSlice",
+ "webkitMaskBoxImageSlice"
+ ],
+ "extended": [],
+ "syntax": "[ <number> | <percentage> ]{1,4} fill?"
+ }
+ ],
+ [
+ "-webkit-mask-box-image-source",
+ {
+ "name": "-webkit-mask-box-image-source",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-mask-box-image-source",
+ "legacyAliasOf": "mask-border-source",
+ "styleDeclaration": [
+ "-webkit-mask-box-image-source",
+ "WebkitMaskBoxImageSource",
+ "webkitMaskBoxImageSource"
+ ],
+ "extended": [],
+ "syntax": "none | <image>"
+ }
+ ],
+ [
+ "-webkit-mask-box-image-width",
+ {
+ "name": "-webkit-mask-box-image-width",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-mask-box-image-width",
+ "legacyAliasOf": "mask-border-width",
+ "styleDeclaration": [
+ "-webkit-mask-box-image-width",
+ "WebkitMaskBoxImageWidth",
+ "webkitMaskBoxImageWidth"
+ ],
+ "extended": [],
+ "syntax": "[ <length-percentage> | <number> | auto ]{1,4}"
+ }
+ ],
+ [
+ "-webkit-text-fill-color",
+ {
+ "name": "-webkit-text-fill-color",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-fill-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "an RGBA color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "media": "visual",
+ "styleDeclaration": [
+ "-webkit-text-fill-color",
+ "WebkitTextFillColor",
+ "webkitTextFillColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "-webkit-text-size-adjust",
+ {
+ "name": "-webkit-text-size-adjust",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-size-adjust",
+ "legacyAliasOf": "text-size-adjust",
+ "styleDeclaration": [
+ "-webkit-text-size-adjust",
+ "WebkitTextSizeAdjust",
+ "webkitTextSizeAdjust"
+ ],
+ "extended": [],
+ "syntax": "auto | none | <percentage [0,∞]>"
+ }
+ ],
+ [
+ "-webkit-text-stroke",
+ {
+ "name": "-webkit-text-stroke",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-stroke",
+ "initial": "See individual properties",
+ "appliesTo": "See individual properties",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "See individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "See individual properties",
+ "media": "visual",
+ "styleDeclaration": [
+ "-webkit-text-stroke",
+ "WebkitTextStroke",
+ "webkitTextStroke"
+ ],
+ "syntax": "<line-width> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "-webkit-text-stroke-color",
+ {
+ "name": "-webkit-text-stroke-color",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-stroke-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "an RGBA color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "media": "visual",
+ "styleDeclaration": [
+ "-webkit-text-stroke-color",
+ "WebkitTextStrokeColor",
+ "webkitTextStrokeColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "-webkit-text-stroke-width",
+ {
+ "name": "-webkit-text-stroke-width",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-text-stroke-width",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "-webkit-text-stroke-width",
+ "WebkitTextStrokeWidth",
+ "webkitTextStrokeWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "-webkit-transform",
+ {
+ "name": "-webkit-transform",
+ "href": "https://compat.spec.whatwg.org/#propdef--webkit-transform",
+ "legacyAliasOf": "transform",
+ "styleDeclaration": [
+ "-webkit-transform",
+ "WebkitTransform",
+ "webkitTransform"
+ ],
+ "extended": [],
+ "syntax": "none | <transform-list>"
+ }
+ ],
+ [
+ "accent-color",
+ {
+ "name": "accent-color",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-accent-color",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the keyword auto or a computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "accent-color",
+ "accentColor"
+ ],
+ "syntax": "auto | <color>",
+ "extended": []
+ }
+ ],
+ [
+ "align-content",
+ {
+ "name": "align-content",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-align-content",
+ "initial": "normal",
+ "appliesTo": "block containers, multicol containers, flex containers, and grid containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "align-content",
+ "alignContent"
+ ],
+ "syntax": "normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>",
+ "extended": []
+ }
+ ],
+ [
+ "align-items",
+ {
+ "name": "align-items",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-align-items",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "align-items",
+ "alignItems"
+ ],
+ "syntax": "normal | stretch | <baseline-position> | <overflow-position>? <self-position> | anchor-center",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "align-self",
+ {
+ "name": "align-self",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-align-self",
+ "initial": "auto",
+ "appliesTo": "flex items, grid items, and absolutely-positioned boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "align-self",
+ "alignSelf"
+ ],
+ "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position> | anchor-center",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "alignment-baseline",
+ {
+ "name": "alignment-baseline",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-alignment-baseline",
+ "initial": "baseline",
+ "appliesTo": "inline-level boxes, flex items, grid items, table cells, and SVG text content elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "alignment-baseline",
+ "alignmentBaseline"
+ ],
+ "syntax": "baseline | text-bottom | alphabetic | ideographic | middle | central | mathematical | text-top",
+ "extended": []
+ }
+ ],
+ [
+ "all",
+ {
+ "name": "all",
+ "href": "https://drafts.csswg.org/css-cascade-5/#propdef-all",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "all"
+ ],
+ "syntax": "initial | inherit | unset | revert | revert-layer | revert-rule",
+ "extended": []
+ }
+ ],
+ [
+ "anchor-name",
+ {
+ "name": "anchor-name",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-anchor-name",
+ "initial": "none",
+ "appliesTo": "all elements that generate a principal box",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "anchor-name",
+ "anchorName"
+ ],
+ "syntax": "none | <dashed-ident>#",
+ "extended": []
+ }
+ ],
+ [
+ "anchor-scope",
+ {
+ "name": "anchor-scope",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-anchor-scope",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "anchor-scope",
+ "anchorScope"
+ ],
+ "syntax": "none | all | <dashed-ident>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation",
+ {
+ "name": "animation",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation"
+ ],
+ "syntax": "<single-animation>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-composition",
+ {
+ "name": "animation-composition",
+ "href": "https://drafts.csswg.org/css-animations-2/#propdef-animation-composition",
+ "initial": "replace",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-composition",
+ "animationComposition"
+ ],
+ "syntax": "<single-animation-composition>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-delay",
+ {
+ "name": "animation-delay",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-delay",
+ "initial": "0s",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a duration",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-delay",
+ "animationDelay"
+ ],
+ "syntax": "<time>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-direction",
+ {
+ "name": "animation-direction",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-direction",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-direction",
+ "animationDirection"
+ ],
+ "syntax": "<single-animation-direction>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-duration",
+ {
+ "name": "animation-duration",
+ "href": "https://drafts.csswg.org/css-animations-2/#propdef-animation-duration",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either a time or the keyword auto",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-duration",
+ "animationDuration"
+ ],
+ "syntax": "[ auto | <time [0s,∞]> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-fill-mode",
+ {
+ "name": "animation-fill-mode",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-fill-mode",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-fill-mode",
+ "animationFillMode"
+ ],
+ "syntax": "<single-animation-fill-mode>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-iteration-count",
+ {
+ "name": "animation-iteration-count",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-iteration-count",
+ "initial": "1",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either a number or the keyword infinite",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-iteration-count",
+ "animationIterationCount"
+ ],
+ "syntax": "<single-animation-iteration-count>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-name",
+ {
+ "name": "animation-name",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-name",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either a case-sensitive css identifier or the keyword none",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-name",
+ "animationName"
+ ],
+ "syntax": "[ none | <keyframes-name> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-play-state",
+ {
+ "name": "animation-play-state",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-play-state",
+ "initial": "running",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-play-state",
+ "animationPlayState"
+ ],
+ "syntax": "<single-animation-play-state>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-range",
+ {
+ "name": "animation-range",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-animation-range",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "animation-range",
+ "animationRange"
+ ],
+ "syntax": "[ <'animation-range-start'> <'animation-range-end'>? ]#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-range-end",
+ {
+ "name": "animation-range-end",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-animation-range-end",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "relative to the specified named timeline range if one was specified, else to the entire timeline",
+ "computedValue": "list, each item either the keyword normal or a timeline range and progress percentage",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-range-end",
+ "animationRangeEnd"
+ ],
+ "syntax": "[ normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-range-start",
+ {
+ "name": "animation-range-start",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-animation-range-start",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "relative to the specified named timeline range if one was specified, else to the entire timeline",
+ "computedValue": "list, each item either the keyword normal or a timeline range and progress percentage",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-range-start",
+ "animationRangeStart"
+ ],
+ "syntax": "[ normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-timeline",
+ {
+ "name": "animation-timeline",
+ "href": "https://drafts.csswg.org/css-animations-2/#propdef-animation-timeline",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either the keyword none, the keyword auto, a case-sensitive css identifier, a computed scroll() function, or a computed view() function",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-timeline",
+ "animationTimeline"
+ ],
+ "syntax": "<single-animation-timeline>#",
+ "extended": []
+ }
+ ],
+ [
+ "animation-timing-function",
+ {
+ "name": "animation-timing-function",
+ "href": "https://drafts.csswg.org/css-animations-1/#propdef-animation-timing-function",
+ "initial": "ease",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a computed <easing-function>",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "animation-timing-function",
+ "animationTimingFunction"
+ ],
+ "syntax": "<easing-function>#",
+ "extended": []
+ }
+ ],
+ [
+ "appearance",
+ {
+ "name": "appearance",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-appearance",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "appearance"
+ ],
+ "syntax": "none | auto | base | base-select | <compat-auto> | <compat-special> | base",
+ "extended": [
+ "https://drafts.csswg.org/css-forms-1/"
+ ]
+ }
+ ],
+ [
+ "aspect-ratio",
+ {
+ "name": "aspect-ratio",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-aspect-ratio",
+ "initial": "auto",
+ "appliesTo": "all elements except inline boxes and internal ruby or table boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword or a pair of numbers",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "aspect-ratio",
+ "aspectRatio"
+ ],
+ "syntax": "auto || <ratio>",
+ "extended": []
+ }
+ ],
+ [
+ "backface-visibility",
+ {
+ "name": "backface-visibility",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-backface-visibility",
+ "initial": "visible",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "backface-visibility",
+ "backfaceVisibility"
+ ],
+ "syntax": "visible | hidden",
+ "extended": []
+ }
+ ],
+ [
+ "background",
+ {
+ "name": "background",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "background"
+ ],
+ "syntax": "<bg-layer>#? , <final-bg-layer>",
+ "extended": []
+ }
+ ],
+ [
+ "background-attachment",
+ {
+ "name": "background-attachment",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-attachment",
+ "initial": "scroll",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "background-attachment",
+ "backgroundAttachment"
+ ],
+ "syntax": "<attachment>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-blend-mode",
+ {
+ "name": "background-blend-mode",
+ "href": "https://drafts.fxtf.org/compositing-2/#propdef-background-blend-mode",
+ "initial": "normal",
+ "appliesTo": "All HTML elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual",
+ "animatable": "no",
+ "styleDeclaration": [
+ "background-blend-mode",
+ "backgroundBlendMode"
+ ],
+ "syntax": "<mix-blend-mode>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-clip",
+ {
+ "name": "background-clip",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-clip",
+ "initial": "border-box",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-clip",
+ "backgroundClip"
+ ],
+ "syntax": "<bg-clip>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-color",
+ {
+ "name": "background-color",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-color",
+ "initial": "transparent",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "background-color",
+ "backgroundColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "background-image",
+ {
+ "name": "background-image",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-image",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either an <image> or the keyword none",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "background-image",
+ "backgroundImage"
+ ],
+ "syntax": "<bg-image>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-origin",
+ {
+ "name": "background-origin",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-origin",
+ "initial": "padding-box",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-origin",
+ "backgroundOrigin"
+ ],
+ "syntax": "<visual-box>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-position",
+ {
+ "name": "background-position",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position",
+ "initial": "0% 0%",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "refer to size of background positioning area minus size of background image; see text",
+ "computedValue": "a list, each item a pair of offsets (horizontal and vertical) from the top left origin, each offset given as a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-position",
+ "backgroundPosition"
+ ],
+ "syntax": "<bg-position>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-position-x",
+ {
+ "name": "background-position-x",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-x",
+ "initial": "0%",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "refer to width of background positioning area minus width of background image",
+ "computedValue": "A list, each item consisting of: an offset given as a computed <length-percentage> value, plus an origin keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "logicalPropertyGroup": "background-position",
+ "styleDeclaration": [
+ "background-position-x",
+ "backgroundPositionX"
+ ],
+ "syntax": "[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#",
+ "extended": []
+ }
+ ],
+ [
+ "background-position-y",
+ {
+ "name": "background-position-y",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-y",
+ "initial": "0%",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "refer to height of background positioning area minus height of background image",
+ "computedValue": "A list, each item consisting of: an offset given as a computed <length-percentage> value, plus an origin keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "logicalPropertyGroup": "background-position",
+ "styleDeclaration": [
+ "background-position-y",
+ "backgroundPositionY"
+ ],
+ "syntax": "[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#",
+ "extended": []
+ }
+ ],
+ [
+ "background-repeat",
+ {
+ "name": "background-repeat",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-repeat",
+ "initial": "repeat",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a pair of keywords, one per dimension",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "background-repeat",
+ "backgroundRepeat"
+ ],
+ "syntax": "<repeat-style>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-repeat-x",
+ {
+ "name": "background-repeat-x",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-repeat-x",
+ "initial": "repeat",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "background-repeat",
+ "styleDeclaration": [
+ "background-repeat-x",
+ "backgroundRepeatX"
+ ],
+ "syntax": "<repetition>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-repeat-y",
+ {
+ "name": "background-repeat-y",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-repeat-y",
+ "initial": "repeat",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "background-repeat",
+ "styleDeclaration": [
+ "background-repeat-y",
+ "backgroundRepeatY"
+ ],
+ "syntax": "<repetition>#",
+ "extended": []
+ }
+ ],
+ [
+ "background-size",
+ {
+ "name": "background-size",
+ "href": "https://drafts.csswg.org/css-backgrounds-4/#propdef-background-size",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "see text",
+ "computedValue": "list, each item a pair of sizes (one per axis) each represented as either a keyword or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "styleDeclaration": [
+ "background-size",
+ "backgroundSize"
+ ],
+ "syntax": "<bg-size>#",
+ "extended": []
+ }
+ ],
+ [
+ "baseline-shift",
+ {
+ "name": "baseline-shift",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-baseline-shift",
+ "initial": "0",
+ "appliesTo": "inline-level boxes and SVG text content elements",
+ "inherited": "no",
+ "percentages": "refer to the used value of line-height",
+ "computedValue": "the specified keyword or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "baseline-shift",
+ "baselineShift"
+ ],
+ "syntax": "<length-percentage> | sub | super | top | center | bottom",
+ "extended": []
+ }
+ ],
+ [
+ "baseline-source",
+ {
+ "name": "baseline-source",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-baseline-source",
+ "initial": "auto",
+ "appliesTo": "inline-level boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "baseline-source",
+ "baselineSource"
+ ],
+ "syntax": "auto | first | last",
+ "extended": []
+ }
+ ],
+ [
+ "block-ellipsis",
+ {
+ "name": "block-ellipsis",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-block-ellipsis",
+ "initial": "no-ellipsis",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "block-ellipsis",
+ "blockEllipsis"
+ ],
+ "syntax": "no-ellipsis | auto | <string>",
+ "extended": []
+ }
+ ],
+ [
+ "block-size",
+ {
+ "name": "block-size",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-block-size",
+ "initial": "auto",
+ "appliesTo": "Same as height and width",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as height, width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "size",
+ "styleDeclaration": [
+ "block-size",
+ "blockSize"
+ ],
+ "syntax": "<'width'>",
+ "extended": []
+ }
+ ],
+ [
+ "block-step",
+ {
+ "name": "block-step",
+ "href": "https://drafts.csswg.org/css-rhythm-1/#propdef-block-step",
+ "initial": "see individual properties",
+ "appliesTo": "block-level boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "block-step",
+ "blockStep"
+ ],
+ "syntax": "<'block-step-size'> || <'block-step-insert'> || <'block-step-align'> || <'block-step-round'>",
+ "extended": []
+ }
+ ],
+ [
+ "block-step-align",
+ {
+ "name": "block-step-align",
+ "href": "https://drafts.csswg.org/css-rhythm-1/#propdef-block-step-align",
+ "initial": "auto",
+ "appliesTo": "block-level boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "block-step-align",
+ "blockStepAlign"
+ ],
+ "syntax": "auto | center | start | end",
+ "extended": []
+ }
+ ],
+ [
+ "block-step-insert",
+ {
+ "name": "block-step-insert",
+ "href": "https://drafts.csswg.org/css-rhythm-1/#propdef-block-step-insert",
+ "initial": "margin-box",
+ "appliesTo": "block-level boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "block-step-insert",
+ "blockStepInsert"
+ ],
+ "syntax": "margin-box | padding-box | content-box",
+ "extended": []
+ }
+ ],
+ [
+ "block-step-round",
+ {
+ "name": "block-step-round",
+ "href": "https://drafts.csswg.org/css-rhythm-1/#propdef-block-step-round",
+ "initial": "up",
+ "appliesTo": "block-level boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "block-step-round",
+ "blockStepRound"
+ ],
+ "syntax": "up | down | nearest",
+ "extended": []
+ }
+ ],
+ [
+ "block-step-size",
+ {
+ "name": "block-step-size",
+ "href": "https://drafts.csswg.org/css-rhythm-1/#propdef-block-step-size",
+ "initial": "none",
+ "appliesTo": "block-level boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword or absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "block-step-size",
+ "blockStepSize"
+ ],
+ "syntax": "none | <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "bookmark-label",
+ {
+ "name": "bookmark-label",
+ "href": "https://drafts.csswg.org/css-content-3/#propdef-bookmark-label",
+ "initial": "content(text)",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "bookmark-label",
+ "bookmarkLabel"
+ ],
+ "syntax": "<content-list>",
+ "extended": []
+ }
+ ],
+ [
+ "bookmark-level",
+ {
+ "name": "bookmark-level",
+ "href": "https://drafts.csswg.org/css-content-3/#propdef-bookmark-level",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword none or the specified integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "bookmark-level",
+ "bookmarkLevel"
+ ],
+ "syntax": "none | <integer [1,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "bookmark-state",
+ {
+ "name": "bookmark-state",
+ "href": "https://drafts.csswg.org/css-content-3/#propdef-bookmark-state",
+ "initial": "open",
+ "appliesTo": "block-level elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "bookmark-state",
+ "bookmarkState"
+ ],
+ "syntax": "open | closed",
+ "extended": []
+ }
+ ],
+ [
+ "border",
+ {
+ "name": "border",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block",
+ {
+ "name": "border-block",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block",
+ "borderBlock"
+ ],
+ "syntax": "<'border-block-start'>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-color",
+ {
+ "name": "border-block-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-color",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-color",
+ "borderBlockColor"
+ ],
+ "syntax": "<'border-top-color'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-end",
+ {
+ "name": "border-block-end",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-end",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-end",
+ "borderBlockEnd"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-end-color",
+ {
+ "name": "border-block-end-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-end-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-block-end-color",
+ "borderBlockEndColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-end-radius",
+ {
+ "name": "border-block-end-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-end-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-end-radius",
+ "borderBlockEndRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-end-style",
+ {
+ "name": "border-block-end-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-end-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-block-end-style",
+ "borderBlockEndStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-end-width",
+ {
+ "name": "border-block-end-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-end-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-block-end-width",
+ "borderBlockEndWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-start",
+ {
+ "name": "border-block-start",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-start",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-start",
+ "borderBlockStart"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-start-color",
+ {
+ "name": "border-block-start-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-start-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-block-start-color",
+ "borderBlockStartColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-start-radius",
+ {
+ "name": "border-block-start-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-start-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-start-radius",
+ "borderBlockStartRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-start-style",
+ {
+ "name": "border-block-start-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-start-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-block-start-style",
+ "borderBlockStartStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-start-width",
+ {
+ "name": "border-block-start-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-start-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-block-start-width",
+ "borderBlockStartWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-style",
+ {
+ "name": "border-block-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-style",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-style",
+ "borderBlockStyle"
+ ],
+ "syntax": "<'border-top-style'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-block-width",
+ {
+ "name": "border-block-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-block-width",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-block-width",
+ "borderBlockWidth"
+ ],
+ "syntax": "<'border-top-width'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom",
+ {
+ "name": "border-bottom",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-bottom",
+ "borderBottom"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-color",
+ {
+ "name": "border-bottom-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-bottom-color",
+ "borderBottomColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-left-radius",
+ {
+ "name": "border-bottom-left-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-left-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-bottom-left-radius",
+ "borderBottomLeftRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-radius",
+ {
+ "name": "border-bottom-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-bottom-radius",
+ "borderBottomRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-right-radius",
+ {
+ "name": "border-bottom-right-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-right-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-bottom-right-radius",
+ "borderBottomRightRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-style",
+ {
+ "name": "border-bottom-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-bottom-style",
+ "borderBottomStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-bottom-width",
+ {
+ "name": "border-bottom-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-bottom-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-bottom-width",
+ "borderBottomWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-boundary",
+ {
+ "name": "border-boundary",
+ "href": "https://drafts.csswg.org/css-round-display-1/#propdef-border-boundary",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "border-boundary",
+ "borderBoundary"
+ ],
+ "syntax": "none | parent | display",
+ "extended": []
+ }
+ ],
+ [
+ "border-clip",
+ {
+ "name": "border-clip",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-clip",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-clip",
+ "borderClip"
+ ],
+ "syntax": "<'border-top-clip'>",
+ "extended": []
+ }
+ ],
+ [
+ "border-collapse",
+ {
+ "name": "border-collapse",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-border-collapse",
+ "initial": "separate",
+ "appliesTo": "table grid boxes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "border-collapse",
+ "borderCollapse"
+ ],
+ "syntax": "separate | collapse",
+ "extended": []
+ }
+ ],
+ [
+ "border-color",
+ {
+ "name": "border-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-color",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-color",
+ "borderColor"
+ ],
+ "syntax": "[ <color> | <image-1D> ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "border-end-end-radius",
+ {
+ "name": "border-end-end-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-end-end-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-end-end-radius",
+ "borderEndEndRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-end-start-radius",
+ {
+ "name": "border-end-start-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-end-start-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-end-start-radius",
+ "borderEndStartRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-image",
+ {
+ "name": "border-image",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-image",
+ "initial": "See individual properties",
+ "appliesTo": "See individual properties",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "See individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "See individual properties",
+ "styleDeclaration": [
+ "border-image",
+ "borderImage"
+ ],
+ "syntax": "<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>",
+ "extended": []
+ }
+ ],
+ [
+ "border-image-outset",
+ {
+ "name": "border-image-outset",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-image-outset",
+ "initial": "0",
+ "appliesTo": "All elements, except internal table elements when border-collapse is collapse",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "four values, each a number or absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "border-image-outset",
+ "borderImageOutset"
+ ],
+ "syntax": "[ <length [0,∞]> | <number [0,∞]> ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "border-image-repeat",
+ {
+ "name": "border-image-repeat",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-image-repeat",
+ "initial": "stretch",
+ "appliesTo": "All elements, except internal table elements when border-collapse is collapse",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "two keywords, one per axis",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "border-image-repeat",
+ "borderImageRepeat"
+ ],
+ "syntax": "[ stretch | repeat | round | space ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-image-slice",
+ {
+ "name": "border-image-slice",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-image-slice",
+ "initial": "100%",
+ "appliesTo": "All elements, except internal table elements when border-collapse is collapse",
+ "inherited": "no",
+ "percentages": "refer to size of the border image",
+ "computedValue": "four values, each either a number or percentage; plus a fill keyword if specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "border-image-slice",
+ "borderImageSlice"
+ ],
+ "syntax": "[<number [0,∞]> | <percentage [0,∞]>]{1,4} && fill?",
+ "extended": []
+ }
+ ],
+ [
+ "border-image-source",
+ {
+ "name": "border-image-source",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-image-source",
+ "initial": "none",
+ "appliesTo": "All elements, except internal table elements when border-collapse is collapse",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword none or the computed <image>",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "border-image-source",
+ "borderImageSource"
+ ],
+ "syntax": "none | <image>",
+ "extended": []
+ }
+ ],
+ [
+ "border-image-width",
+ {
+ "name": "border-image-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-image-width",
+ "initial": "1",
+ "appliesTo": "All elements, except internal table elements when border-collapse is collapse",
+ "inherited": "no",
+ "percentages": "Relative to width/height of the border image area",
+ "computedValue": "four values, each either a number, the keyword auto, or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "border-image-width",
+ "borderImageWidth"
+ ],
+ "syntax": "[ <length-percentage [0,∞]> | <number [0,∞]> | auto ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline",
+ {
+ "name": "border-inline",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline",
+ "borderInline"
+ ],
+ "syntax": "<'border-block-start'>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-color",
+ {
+ "name": "border-inline-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-color",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-color",
+ "borderInlineColor"
+ ],
+ "syntax": "<'border-top-color'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-end",
+ {
+ "name": "border-inline-end",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-end",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-end",
+ "borderInlineEnd"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-end-color",
+ {
+ "name": "border-inline-end-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-end-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-inline-end-color",
+ "borderInlineEndColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-end-radius",
+ {
+ "name": "border-inline-end-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-end-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-end-radius",
+ "borderInlineEndRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-end-style",
+ {
+ "name": "border-inline-end-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-end-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-inline-end-style",
+ "borderInlineEndStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-end-width",
+ {
+ "name": "border-inline-end-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-end-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-inline-end-width",
+ "borderInlineEndWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-start",
+ {
+ "name": "border-inline-start",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-start",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-start",
+ "borderInlineStart"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-start-color",
+ {
+ "name": "border-inline-start-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-start-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-inline-start-color",
+ "borderInlineStartColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-start-radius",
+ {
+ "name": "border-inline-start-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-start-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-start-radius",
+ "borderInlineStartRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-start-style",
+ {
+ "name": "border-inline-start-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-start-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-inline-start-style",
+ "borderInlineStartStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-start-width",
+ {
+ "name": "border-inline-start-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-start-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-inline-start-width",
+ "borderInlineStartWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-style",
+ {
+ "name": "border-inline-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-style",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-style",
+ "borderInlineStyle"
+ ],
+ "syntax": "<'border-top-style'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-inline-width",
+ {
+ "name": "border-inline-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-inline-width",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-inline-width",
+ "borderInlineWidth"
+ ],
+ "syntax": "<'border-top-width'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-left",
+ {
+ "name": "border-left",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-left",
+ "borderLeft"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-color",
+ {
+ "name": "border-left-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-left-color",
+ "borderLeftColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-radius",
+ {
+ "name": "border-left-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-left-radius",
+ "borderLeftRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-style",
+ {
+ "name": "border-left-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-left-style",
+ "borderLeftStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-left-width",
+ {
+ "name": "border-left-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-left-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-left-width",
+ "borderLeftWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-limit",
+ {
+ "name": "border-limit",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-limit",
+ "initial": "all",
+ "appliesTo": "all elements, except table element when border-collapse is collapse",
+ "inherited": "no",
+ "percentages": "relative to border-box",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "border-limit",
+ "borderLimit"
+ ],
+ "syntax": "all | [ sides | corners ] <length-percentage [0,∞]>? | [ top | right | bottom | left ] <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "border-radius",
+ {
+ "name": "border-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-radius",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-radius",
+ "borderRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,4} [ / <length-percentage [0,∞]>{1,4} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-right",
+ {
+ "name": "border-right",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-right",
+ "borderRight"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-color",
+ {
+ "name": "border-right-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-right-color",
+ "borderRightColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-radius",
+ {
+ "name": "border-right-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-right-radius",
+ "borderRightRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-style",
+ {
+ "name": "border-right-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-right-style",
+ "borderRightStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-right-width",
+ {
+ "name": "border-right-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-right-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-right-width",
+ "borderRightWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-shape",
+ {
+ "name": "border-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-shape",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "see prose",
+ "computedValue": "list, each item a computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "border-shape",
+ "borderShape"
+ ],
+ "syntax": "none | [ <basic-shape> <geometry-box>?]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-spacing",
+ {
+ "name": "border-spacing",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-border-spacing",
+ "initial": "0px 0px",
+ "appliesTo": "table grid boxes when border-collapse is separate",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "two absolute lengths",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "border-spacing",
+ "borderSpacing"
+ ],
+ "syntax": "<length>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "border-start-end-radius",
+ {
+ "name": "border-start-end-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-start-end-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-start-end-radius",
+ "borderStartEndRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-start-start-radius",
+ {
+ "name": "border-start-start-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-start-start-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-start-start-radius",
+ "borderStartStartRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-style",
+ {
+ "name": "border-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-style",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-style",
+ "borderStyle"
+ ],
+ "syntax": "<'border-top-style'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "border-top",
+ {
+ "name": "border-top",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top",
+ "initial": "See individual properties",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-top",
+ "borderTop"
+ ],
+ "syntax": "<line-width> || <line-style> || <color>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-color",
+ {
+ "name": "border-top-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the computed color and/or a one-dimensional image function",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "logicalPropertyGroup": "border-color",
+ "styleDeclaration": [
+ "border-top-color",
+ "borderTopColor"
+ ],
+ "syntax": "<color> | <image-1D>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-left-radius",
+ {
+ "name": "border-top-left-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-left-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-top-left-radius",
+ "borderTopLeftRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-radius",
+ {
+ "name": "border-top-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-top-radius",
+ "borderTopRadius"
+ ],
+ "syntax": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-right-radius",
+ {
+ "name": "border-top-right-radius",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-right-radius",
+ "initial": "0",
+ "appliesTo": "all elements (but see prose)",
+ "inherited": "no",
+ "percentages": "Refer to corresponding dimension of the border box.",
+ "computedValue": "pair of computed <length-percentage> values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-radius",
+ "styleDeclaration": [
+ "border-top-right-radius",
+ "borderTopRightRadius"
+ ],
+ "syntax": "<border-radius>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-style",
+ {
+ "name": "border-top-style",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-style",
+ "initial": "none",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "border-style",
+ "styleDeclaration": [
+ "border-top-style",
+ "borderTopStyle"
+ ],
+ "syntax": "<line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "border-top-width",
+ {
+ "name": "border-top-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-top-width",
+ "initial": "medium",
+ "appliesTo": "all elements except ruby base containers and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width; zero if the border style is none or hidden",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "logicalPropertyGroup": "border-width",
+ "styleDeclaration": [
+ "border-top-width",
+ "borderTopWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "border-width",
+ {
+ "name": "border-width",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-border-width",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "border-width",
+ "borderWidth"
+ ],
+ "syntax": "<'border-top-width'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "bottom",
+ {
+ "name": "bottom",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-bottom",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "bottom"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "box-decoration-break",
+ {
+ "name": "box-decoration-break",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-box-decoration-break",
+ "initial": "slice",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "box-decoration-break",
+ "boxDecorationBreak"
+ ],
+ "syntax": "slice | clone",
+ "extended": []
+ }
+ ],
+ [
+ "box-shadow",
+ {
+ "name": "box-shadow",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-box-shadow",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "see individual properties",
+ "styleDeclaration": [
+ "box-shadow",
+ "boxShadow"
+ ],
+ "syntax": "<spread-shadow>#",
+ "extended": []
+ }
+ ],
+ [
+ "box-shadow-blur",
+ {
+ "name": "box-shadow-blur",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-box-shadow-blur",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a <length>",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "box-shadow-blur",
+ "boxShadowBlur"
+ ],
+ "syntax": "<length [0,∞]>#",
+ "extended": []
+ }
+ ],
+ [
+ "box-shadow-color",
+ {
+ "name": "box-shadow-color",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-box-shadow-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "box-shadow-color",
+ "boxShadowColor"
+ ],
+ "syntax": "<color>#",
+ "extended": []
+ }
+ ],
+ [
+ "box-shadow-offset",
+ {
+ "name": "box-shadow-offset",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-box-shadow-offset",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item either none or a pair of offsets (horizontal and vertical) from the element‘s box",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, treating none as 0 0 when interpolated with non-none values.",
+ "styleDeclaration": [
+ "box-shadow-offset",
+ "boxShadowOffset"
+ ],
+ "syntax": "[ none | <length>{1,2} ]#",
+ "extended": []
+ }
+ ],
+ [
+ "box-shadow-position",
+ {
+ "name": "box-shadow-position",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-box-shadow-position",
+ "initial": "outset",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item one of the keywords",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "box-shadow-position",
+ "boxShadowPosition"
+ ],
+ "syntax": "[ outset | inset ]#",
+ "extended": []
+ }
+ ],
+ [
+ "box-shadow-spread",
+ {
+ "name": "box-shadow-spread",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-box-shadow-spread",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a <length>",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "box-shadow-spread",
+ "boxShadowSpread"
+ ],
+ "syntax": "<length>#",
+ "extended": []
+ }
+ ],
+ [
+ "box-sizing",
+ {
+ "name": "box-sizing",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-box-sizing",
+ "initial": "content-box",
+ "appliesTo": "all elements that accept width or height",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "box-sizing",
+ "boxSizing"
+ ],
+ "syntax": "content-box | border-box",
+ "extended": []
+ }
+ ],
+ [
+ "box-snap",
+ {
+ "name": "box-snap",
+ "href": "https://drafts.csswg.org/css-line-grid-1/#propdef-box-snap",
+ "initial": "none",
+ "appliesTo": "block-level boxes and internal table elements except table cells",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "box-snap",
+ "boxSnap"
+ ],
+ "syntax": "none | block-start | block-end | center | baseline | last-baseline",
+ "extended": []
+ }
+ ],
+ [
+ "break-after",
+ {
+ "name": "break-after",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-break-after",
+ "initial": "auto",
+ "appliesTo": "block-level boxes, grid items, flex items, table row groups, table rows (but see prose)",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "break-after",
+ "breakAfter"
+ ],
+ "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
+ "extended": []
+ }
+ ],
+ [
+ "break-before",
+ {
+ "name": "break-before",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-break-before",
+ "initial": "auto",
+ "appliesTo": "block-level boxes, grid items, flex items, table row groups, table rows (but see prose)",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "break-before",
+ "breakBefore"
+ ],
+ "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
+ "extended": []
+ }
+ ],
+ [
+ "break-inside",
+ {
+ "name": "break-inside",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-break-inside",
+ "initial": "auto",
+ "appliesTo": "all elements except inline-level boxes, internal ruby boxes, table column boxes, table column group boxes, absolutely-positioned boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "break-inside",
+ "breakInside"
+ ],
+ "syntax": "auto | avoid | avoid-page | avoid-column | avoid-region",
+ "extended": []
+ }
+ ],
+ [
+ "caption-side",
+ {
+ "name": "caption-side",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-caption-side",
+ "initial": "top",
+ "appliesTo": "table-caption boxes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "caption-side",
+ "captionSide"
+ ],
+ "syntax": "top | bottom",
+ "extended": []
+ }
+ ],
+ [
+ "caret",
+ {
+ "name": "caret",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-caret",
+ "initial": "auto",
+ "appliesTo": "text or elements that accept text input",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "caret"
+ ],
+ "syntax": "<'caret-color'> || <'caret-animation'> || <'caret-shape'>",
+ "extended": []
+ }
+ ],
+ [
+ "caret-color",
+ {
+ "name": "caret-color",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-caret-color",
+ "initial": "auto",
+ "appliesTo": "text or elements that accept text input",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "The computed value for auto is auto. For <color> values, see CSS Color 4 § 14. Resolving <color> Values.",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "caret-color",
+ "caretColor"
+ ],
+ "syntax": "auto | <color>",
+ "extended": []
+ }
+ ],
+ [
+ "caret-shape",
+ {
+ "name": "caret-shape",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-caret-shape",
+ "initial": "auto",
+ "appliesTo": "text or elements that accept text input",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "caret-shape",
+ "caretShape"
+ ],
+ "syntax": "auto | bar | block | underscore",
+ "extended": []
+ }
+ ],
+ [
+ "clear",
+ {
+ "name": "clear",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-clear",
+ "initial": "none",
+ "appliesTo": "block-level elements, floats, regions, pages",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "clear"
+ ],
+ "syntax": "inline-start | inline-end | block-start | block-end | left | right | top | bottom | both-inline | both-block | both | none",
+ "extended": []
+ }
+ ],
+ [
+ "clip",
+ {
+ "name": "clip",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-clip",
+ "initial": "auto",
+ "appliesTo": "Absolutely positioned elements. In SVG, it applies to elements which establish a new viewport, pattern elements and mask elements.",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "clip"
+ ],
+ "syntax": "<rect()> | auto",
+ "extended": []
+ }
+ ],
+ [
+ "clip-path",
+ {
+ "name": "clip-path",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-clip-path",
+ "initial": "none",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified, but with <url> values made absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "clip-path",
+ "clipPath"
+ ],
+ "syntax": "<clip-source> | [ <basic-shape> || <geometry-box> ] | none",
+ "extended": []
+ }
+ ],
+ [
+ "clip-rule",
+ {
+ "name": "clip-rule",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-clip-rule",
+ "initial": "nonzero",
+ "appliesTo": "Applies to SVG graphics elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "clip-rule",
+ "clipRule"
+ ],
+ "syntax": "nonzero | evenodd",
+ "extended": []
+ }
+ ],
+ [
+ "color",
+ {
+ "name": "color",
+ "href": "https://drafts.csswg.org/css-color-4/#propdef-color",
+ "initial": "CanvasText",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "computed color, see resolving color values",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "color"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "color-adjust",
+ {
+ "name": "color-adjust",
+ "href": "https://drafts.csswg.org/css-color-adjust-1/#propdef-color-adjust",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "color-adjust",
+ "colorAdjust"
+ ],
+ "syntax": "<'print-color-adjust'>",
+ "extended": []
+ }
+ ],
+ [
+ "color-interpolation",
+ {
+ "name": "color-interpolation",
+ "href": "https://svgwg.org/svg2-draft/painting.html#ColorInterpolationProperty",
+ "initial": "sRGB",
+ "appliesTo": "container elements, graphics elements, gradient elements, ‘use’ and ‘animate’",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "color-interpolation",
+ "colorInterpolation"
+ ],
+ "syntax": "auto | sRGB | linearRGB",
+ "extended": []
+ }
+ ],
+ [
+ "color-interpolation-filters",
+ {
+ "name": "color-interpolation-filters",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-color-interpolation-filters",
+ "initial": "linearRGB",
+ "appliesTo": "All filter primitives",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "color-interpolation-filters",
+ "colorInterpolationFilters"
+ ],
+ "syntax": "auto | sRGB | linearRGB",
+ "extended": []
+ }
+ ],
+ [
+ "color-scheme",
+ {
+ "name": "color-scheme",
+ "href": "https://drafts.csswg.org/css-color-adjust-1/#propdef-color-scheme",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword normal, or an ordered list of specified color scheme keywords",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "color-scheme",
+ "colorScheme"
+ ],
+ "syntax": "normal | [ light | dark | <custom-ident> ]+ && only?",
+ "extended": []
+ }
+ ],
+ [
+ "column-count",
+ {
+ "name": "column-count",
+ "href": "https://drafts.csswg.org/css-multicol-2/#propdef-column-count",
+ "initial": "auto",
+ "appliesTo": "block containers except table wrapper boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "column-count",
+ "columnCount"
+ ],
+ "syntax": "auto | <integer [1,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "column-fill",
+ {
+ "name": "column-fill",
+ "href": "https://drafts.csswg.org/css-multicol-2/#propdef-column-fill",
+ "initial": "balance",
+ "appliesTo": "multicol containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "column-fill",
+ "columnFill"
+ ],
+ "syntax": "auto | balance | balance-all",
+ "extended": []
+ }
+ ],
+ [
+ "column-gap",
+ {
+ "name": "column-gap",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-column-gap",
+ "initial": "normal",
+ "appliesTo": "multi-column containers, flex containers, grid containers",
+ "inherited": "no",
+ "percentages": "see § 8.3 Percentages In gap Properties",
+ "computedValue": "specified keyword, else a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "column-gap",
+ "columnGap"
+ ],
+ "syntax": "normal | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "column-rule",
+ {
+ "name": "column-rule",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-column-rule",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "column-rule",
+ "columnRule"
+ ],
+ "syntax": "<gap-rule-list> | <gap-auto-rule-list>",
+ "extended": []
+ }
+ ],
+ [
+ "column-rule-break",
+ {
+ "name": "column-rule-break",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-column-rule-break",
+ "initial": "spanning-item",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "column-rule-break",
+ "columnRuleBreak"
+ ],
+ "syntax": "none | spanning-item | intersection",
+ "extended": []
+ }
+ ],
+ [
+ "column-rule-color",
+ {
+ "name": "column-rule-color",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-column-rule-color",
+ "initial": "currentcolor",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list, see § 3.4.1 Interpolation behavior.",
+ "styleDeclaration": [
+ "column-rule-color",
+ "columnRuleColor"
+ ],
+ "syntax": "<line-color-list> | <auto-line-color-list>",
+ "extended": []
+ }
+ ],
+ [
+ "column-rule-outset",
+ {
+ "name": "column-rule-outset",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-column-rule-outset",
+ "initial": "50%",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "refer to the crossing gap width",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "column-rule-outset",
+ "columnRuleOutset"
+ ],
+ "syntax": "<length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "column-rule-style",
+ {
+ "name": "column-rule-style",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-column-rule-style",
+ "initial": "none",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "column-rule-style",
+ "columnRuleStyle"
+ ],
+ "syntax": "<line-style-list> | <auto-line-style-list>",
+ "extended": []
+ }
+ ],
+ [
+ "column-rule-width",
+ {
+ "name": "column-rule-width",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-column-rule-width",
+ "initial": "medium",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list of absolute lengths, snapped as a border width",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list, see § 3.4.1 Interpolation behavior.",
+ "styleDeclaration": [
+ "column-rule-width",
+ "columnRuleWidth"
+ ],
+ "syntax": "<line-width-list> | <auto-line-width-list>",
+ "extended": []
+ }
+ ],
+ [
+ "column-span",
+ {
+ "name": "column-span",
+ "href": "https://drafts.csswg.org/css-multicol-2/#propdef-column-span",
+ "initial": "none",
+ "appliesTo": "in-flow block-level elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "column-span",
+ "columnSpan"
+ ],
+ "syntax": "none | <integer [1,∞]> | all | auto",
+ "extended": []
+ }
+ ],
+ [
+ "column-width",
+ {
+ "name": "column-width",
+ "href": "https://drafts.csswg.org/css-multicol-2/#propdef-column-width",
+ "initial": "auto",
+ "appliesTo": "block containers except table wrapper boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword auto or an absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "column-width",
+ "columnWidth"
+ ],
+ "syntax": "auto | <length [0,∞]> | min-content | max-content | fit-content(<length-percentage>)",
+ "extended": [
+ "https://drafts.csswg.org/css-sizing-3/"
+ ]
+ }
+ ],
+ [
+ "columns",
+ {
+ "name": "columns",
+ "href": "https://drafts.csswg.org/css-multicol-2/#propdef-columns",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "columns"
+ ],
+ "syntax": "[ <'column-width'> || <'column-count'> ] [ / <'column-height'> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "contain",
+ {
+ "name": "contain",
+ "href": "https://drafts.csswg.org/css-contain-2/#propdef-contain",
+ "initial": "none",
+ "appliesTo": "See below",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or one or more of size, layout, paint",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "contain"
+ ],
+ "syntax": "none | strict | content | [ [size | inline-size] || layout || style || paint ] | view-transition",
+ "extended": [
+ "https://drafts.csswg.org/css-view-transitions-2/"
+ ]
+ }
+ ],
+ [
+ "contain-intrinsic-block-size",
+ {
+ "name": "contain-intrinsic-block-size",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-block-size",
+ "initial": "none",
+ "appliesTo": "elements with size containment",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified, with <length> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "contain-intrinsic-size",
+ "styleDeclaration": [
+ "contain-intrinsic-block-size",
+ "containIntrinsicBlockSize"
+ ],
+ "syntax": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "extended": []
+ }
+ ],
+ [
+ "contain-intrinsic-height",
+ {
+ "name": "contain-intrinsic-height",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-height",
+ "initial": "none",
+ "appliesTo": "elements with size containment",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified, with <length> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "contain-intrinsic-size",
+ "styleDeclaration": [
+ "contain-intrinsic-height",
+ "containIntrinsicHeight"
+ ],
+ "syntax": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "extended": []
+ }
+ ],
+ [
+ "contain-intrinsic-inline-size",
+ {
+ "name": "contain-intrinsic-inline-size",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-inline-size",
+ "initial": "none",
+ "appliesTo": "elements with size containment",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified, with <length> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "contain-intrinsic-size",
+ "styleDeclaration": [
+ "contain-intrinsic-inline-size",
+ "containIntrinsicInlineSize"
+ ],
+ "syntax": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "extended": []
+ }
+ ],
+ [
+ "contain-intrinsic-size",
+ {
+ "name": "contain-intrinsic-size",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-size",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "contain-intrinsic-size",
+ "containIntrinsicSize"
+ ],
+ "syntax": "[ [ auto | from-element ]? [ none | <length [0,∞]> ] ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "contain-intrinsic-width",
+ {
+ "name": "contain-intrinsic-width",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-width",
+ "initial": "none",
+ "appliesTo": "elements with size containment",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified, with <length> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "contain-intrinsic-size",
+ "styleDeclaration": [
+ "contain-intrinsic-width",
+ "containIntrinsicWidth"
+ ],
+ "syntax": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "extended": []
+ }
+ ],
+ [
+ "container",
+ {
+ "name": "container",
+ "href": "https://drafts.csswg.org/css-conditional-5/#propdef-container",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "container"
+ ],
+ "syntax": "<'container-name'> [ / <'container-type'> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "container-name",
+ {
+ "name": "container-name",
+ "href": "https://drafts.csswg.org/css-conditional-5/#propdef-container-name",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none, or an ordered list of identifiers",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "container-name",
+ "containerName"
+ ],
+ "syntax": "none | <custom-ident>+",
+ "extended": []
+ }
+ ],
+ [
+ "container-type",
+ {
+ "name": "container-type",
+ "href": "https://drafts.csswg.org/css-conditional-5/#propdef-container-type",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "container-type",
+ "containerType"
+ ],
+ "syntax": "normal | [ [ size | inline-size ] || scroll-state ]",
+ "extended": []
+ }
+ ],
+ [
+ "content",
+ {
+ "name": "content",
+ "href": "https://drafts.csswg.org/css-content-3/#propdef-content",
+ "initial": "normal",
+ "appliesTo": "all elements, tree-abiding pseudo-elements, and page margin boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "See prose below",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "content"
+ ],
+ "syntax": "normal | none | [ <content-replacement> | <content-list> ] [/ [ <string> | <counter> | <attr()> ]+ ]? | <element()>",
+ "extended": [
+ "https://drafts.csswg.org/css-gcpm-3/"
+ ]
+ }
+ ],
+ [
+ "content-visibility",
+ {
+ "name": "content-visibility",
+ "href": "https://drafts.csswg.org/css-contain-2/#propdef-content-visibility",
+ "initial": "visible",
+ "appliesTo": "elements for which size containment can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "see § 4.1 Animating and Interpolating content-visibility",
+ "styleDeclaration": [
+ "content-visibility",
+ "contentVisibility"
+ ],
+ "syntax": "visible | auto | hidden",
+ "extended": []
+ }
+ ],
+ [
+ "continue",
+ {
+ "name": "continue",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-continue",
+ "initial": "auto",
+ "appliesTo": "block containers and multicol containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "continue"
+ ],
+ "syntax": "auto | discard | collapse | -webkit-legacy | overflow | paginate | fragments",
+ "extended": [
+ "https://drafts.csswg.org/css-overflow-5/"
+ ]
+ }
+ ],
+ [
+ "corner-block-end-shape",
+ {
+ "name": "corner-block-end-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-block-end-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-block-end-shape",
+ "cornerBlockEndShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-block-start-shape",
+ {
+ "name": "corner-block-start-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-block-start-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-block-start-shape",
+ "cornerBlockStartShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-bottom-left-shape",
+ {
+ "name": "corner-bottom-left-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-bottom-left-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-bottom-left-shape",
+ "cornerBottomLeftShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-bottom-right-shape",
+ {
+ "name": "corner-bottom-right-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-bottom-right-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-bottom-right-shape",
+ "cornerBottomRightShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-bottom-shape",
+ {
+ "name": "corner-bottom-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-bottom-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-bottom-shape",
+ "cornerBottomShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-end-end-shape",
+ {
+ "name": "corner-end-end-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-end-end-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-end-end-shape",
+ "cornerEndEndShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-end-start-shape",
+ {
+ "name": "corner-end-start-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-end-start-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-end-start-shape",
+ "cornerEndStartShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-inline-end-shape",
+ {
+ "name": "corner-inline-end-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-inline-end-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-inline-end-shape",
+ "cornerInlineEndShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-inline-start-shape",
+ {
+ "name": "corner-inline-start-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-inline-start-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-inline-start-shape",
+ "cornerInlineStartShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-left-shape",
+ {
+ "name": "corner-left-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-left-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-left-shape",
+ "cornerLeftShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-right-shape",
+ {
+ "name": "corner-right-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-right-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-right-shape",
+ "cornerRightShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-shape",
+ {
+ "name": "corner-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-shape",
+ "cornerShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "corner-start-end-shape",
+ {
+ "name": "corner-start-end-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-start-end-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-start-end-shape",
+ "cornerStartEndShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-start-start-shape",
+ {
+ "name": "corner-start-start-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-start-start-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-start-start-shape",
+ "cornerStartStartShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-top-left-shape",
+ {
+ "name": "corner-top-left-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-top-left-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-top-left-shape",
+ "cornerTopLeftShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-top-right-shape",
+ {
+ "name": "corner-top-right-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-top-right-shape",
+ "initial": "round",
+ "appliesTo": "all elements where border-radius can apply",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the corresponding superellipse() value",
+ "canonicalOrder": "per grammar",
+ "animationType": "see superellipse interpolation",
+ "logicalPropertyGroup": "corner-shape",
+ "styleDeclaration": [
+ "corner-top-right-shape",
+ "cornerTopRightShape"
+ ],
+ "syntax": "<corner-shape-value>",
+ "extended": []
+ }
+ ],
+ [
+ "corner-top-shape",
+ {
+ "name": "corner-top-shape",
+ "href": "https://drafts.csswg.org/css-borders-4/#propdef-corner-top-shape",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "corner-top-shape",
+ "cornerTopShape"
+ ],
+ "syntax": "<'corner-top-left-shape'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "counter-increment",
+ {
+ "name": "counter-increment",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-counter-increment",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list, each item an identifier paired with an integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "counter-increment",
+ "counterIncrement"
+ ],
+ "syntax": "[ <counter-name> <integer>? ]+ | none",
+ "extended": []
+ }
+ ],
+ [
+ "counter-reset",
+ {
+ "name": "counter-reset",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-counter-reset",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list, each item an identifier or a reversed() function paired with an integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "counter-reset",
+ "counterReset"
+ ],
+ "syntax": "[ <counter-name> <integer>? | <reversed-counter-name> <integer>? ]+ | none",
+ "extended": []
+ }
+ ],
+ [
+ "counter-set",
+ {
+ "name": "counter-set",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-counter-set",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list, each item an identifier paired with an integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "counter-set",
+ "counterSet"
+ ],
+ "syntax": "[ <counter-name> <integer>? ]+ | none",
+ "extended": []
+ }
+ ],
+ [
+ "cue",
+ {
+ "name": "cue",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-cue",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "cue"
+ ],
+ "syntax": "<'cue-before'> <'cue-after'>?",
+ "extended": []
+ }
+ ],
+ [
+ "cue-after",
+ {
+ "name": "cue-after",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-cue-after",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "cue-after",
+ "cueAfter"
+ ],
+ "syntax": "<uri> <decibel>? | none",
+ "extended": []
+ }
+ ],
+ [
+ "cue-before",
+ {
+ "name": "cue-before",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-cue-before",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "cue-before",
+ "cueBefore"
+ ],
+ "syntax": "<uri> <decibel>? | none",
+ "extended": []
+ }
+ ],
+ [
+ "cursor",
+ {
+ "name": "cursor",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-cursor",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified, except with any relative URLs converted to absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "cursor"
+ ],
+ "syntax": "[<cursor-image>,]* <cursor-predefined>",
+ "extended": []
+ }
+ ],
+ [
+ "direction",
+ {
+ "name": "direction",
+ "href": "https://drafts.csswg.org/css-writing-modes-4/#propdef-direction",
+ "initial": "ltr",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "n/a",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "direction"
+ ],
+ "syntax": "ltr | rtl",
+ "extended": []
+ }
+ ],
+ [
+ "display",
+ {
+ "name": "display",
+ "href": "https://drafts.csswg.org/css-display-4/#propdef-display",
+ "initial": "inline",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "a pair of keywords representing the inner and outer display types plus optional list-item flag, or a <display-internal> or <display-box> keyword; see prose in a variety of specs for computation rules",
+ "canonicalOrder": "per grammar",
+ "animationType": "see § 2.9 Animating and Interpolating display",
+ "styleDeclaration": [
+ "display"
+ ],
+ "syntax": "[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy> | <display-outside> || [ <display-inside> | math ]",
+ "extended": [
+ "https://w3c.github.io/mathml-core/"
+ ]
+ }
+ ],
+ [
+ "dominant-baseline",
+ {
+ "name": "dominant-baseline",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-dominant-baseline",
+ "initial": "auto",
+ "appliesTo": "block containers, inline boxes, table rows, grid containers, flex containers, and SVG text content elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "dominant-baseline",
+ "dominantBaseline"
+ ],
+ "syntax": "auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top",
+ "extended": []
+ }
+ ],
+ [
+ "dynamic-range-limit",
+ {
+ "name": "dynamic-range-limit",
+ "href": "https://drafts.csswg.org/css-color-hdr-1/#propdef-dynamic-range-limit",
+ "initial": "no-limit",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "see Computed Value for dynamic-range-limit",
+ "canonicalOrder": "per grammar",
+ "animationType": "by dynamic-range-limit-mix()",
+ "styleDeclaration": [
+ "dynamic-range-limit",
+ "dynamicRangeLimit"
+ ],
+ "syntax": "standard | no-limit | constrained | <dynamic-range-limit-mix()>",
+ "extended": []
+ }
+ ],
+ [
+ "empty-cells",
+ {
+ "name": "empty-cells",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-empty-cells",
+ "initial": "show",
+ "appliesTo": "table-cell boxes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "empty-cells",
+ "emptyCells"
+ ],
+ "syntax": "show | hide",
+ "extended": []
+ }
+ ],
+ [
+ "fill",
+ {
+ "name": "fill",
+ "href": "https://svgwg.org/svg2-draft/painting.html#FillProperty",
+ "initial": "black",
+ "appliesTo": "shapes and text content elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified, but with <color> values computed and <url> values made absolute",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "fill"
+ ],
+ "syntax": "<paint>",
+ "extended": []
+ }
+ ],
+ [
+ "fill-break",
+ {
+ "name": "fill-break",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-break",
+ "initial": "bounding-box",
+ "appliesTo": "all elements",
+ "inherited": "yes?",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-break",
+ "fillBreak"
+ ],
+ "syntax": "bounding-box | slice | clone",
+ "extended": []
+ }
+ ],
+ [
+ "fill-color",
+ {
+ "name": "fill-color",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-color",
+ "initial": "currentcolor",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-color",
+ "fillColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "fill-image",
+ {
+ "name": "fill-image",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-image",
+ "initial": "none",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified, with any <image> computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-image",
+ "fillImage"
+ ],
+ "syntax": "<paint>#",
+ "extended": []
+ }
+ ],
+ [
+ "fill-opacity",
+ {
+ "name": "fill-opacity",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-opacity",
+ "initial": "1",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the specified value converted to a <number>, clamped to the range [0,1]",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-opacity",
+ "fillOpacity"
+ ],
+ "syntax": "<'opacity'>",
+ "extended": []
+ }
+ ],
+ [
+ "fill-origin",
+ {
+ "name": "fill-origin",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-origin",
+ "initial": "match-parent",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-origin",
+ "fillOrigin"
+ ],
+ "syntax": "match-parent | fill-box | stroke-box | content-box | padding-box | border-box",
+ "extended": []
+ }
+ ],
+ [
+ "fill-position",
+ {
+ "name": "fill-position",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-position",
+ "initial": "0% 0%",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "A list, each item consisting of: a pair of offsets (horizontal and vertical) from the top left origin each given as a combination of an absolute length and a percentage",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-position",
+ "fillPosition"
+ ],
+ "syntax": "<position>#",
+ "extended": []
+ }
+ ],
+ [
+ "fill-repeat",
+ {
+ "name": "fill-repeat",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-repeat",
+ "initial": "repeat",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "A list, each item consisting of: two keywords, one per dimension",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-repeat",
+ "fillRepeat"
+ ],
+ "syntax": "<repeat-style>#",
+ "extended": []
+ }
+ ],
+ [
+ "fill-rule",
+ {
+ "name": "fill-rule",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-rule",
+ "initial": "nonzero",
+ "appliesTo": "SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-rule",
+ "fillRule"
+ ],
+ "syntax": "nonzero | evenodd",
+ "extended": []
+ }
+ ],
+ [
+ "fill-size",
+ {
+ "name": "fill-size",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-fill-size",
+ "initial": "auto",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified, but with lengths made absolute and omitted auto keywords filled in",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "fill-size",
+ "fillSize"
+ ],
+ "syntax": "<bg-size>#",
+ "extended": []
+ }
+ ],
+ [
+ "filter",
+ {
+ "name": "filter",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-filter",
+ "initial": "none",
+ "appliesTo": "All elements. In SVG, it applies to container elements without the defs element, all graphics elements and the use element.",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "See prose in Animation of Filters.",
+ "media": "visual",
+ "styleDeclaration": [
+ "filter"
+ ],
+ "syntax": "none | <filter-value-list>",
+ "extended": []
+ }
+ ],
+ [
+ "flex",
+ {
+ "name": "flex",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex",
+ "initial": "0 1 auto",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "by computed value type",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "flex"
+ ],
+ "syntax": "none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]",
+ "extended": []
+ }
+ ],
+ [
+ "flex-basis",
+ {
+ "name": "flex-basis",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-basis",
+ "initial": "auto",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "relative to the flex container’s inner main size",
+ "computedValue": "specified keyword or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "flex-basis",
+ "flexBasis"
+ ],
+ "syntax": "content | <'width'>",
+ "extended": []
+ }
+ ],
+ [
+ "flex-direction",
+ {
+ "name": "flex-direction",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-direction",
+ "initial": "row",
+ "appliesTo": "flex containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "flex-direction",
+ "flexDirection"
+ ],
+ "syntax": "row | row-reverse | column | column-reverse",
+ "extended": []
+ }
+ ],
+ [
+ "flex-flow",
+ {
+ "name": "flex-flow",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-flow",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "flex-flow",
+ "flexFlow"
+ ],
+ "syntax": "<'flex-direction'> || <'flex-wrap'>",
+ "extended": []
+ }
+ ],
+ [
+ "flex-grow",
+ {
+ "name": "flex-grow",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-grow",
+ "initial": "0",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified number",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "flex-grow",
+ "flexGrow"
+ ],
+ "syntax": "<number [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "flex-shrink",
+ {
+ "name": "flex-shrink",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-shrink",
+ "initial": "1",
+ "appliesTo": "flex items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "number",
+ "styleDeclaration": [
+ "flex-shrink",
+ "flexShrink"
+ ],
+ "syntax": "<number [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "flex-wrap",
+ {
+ "name": "flex-wrap",
+ "href": "https://drafts.csswg.org/css-flexbox-1/#propdef-flex-wrap",
+ "initial": "nowrap",
+ "appliesTo": "flex containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "flex-wrap",
+ "flexWrap"
+ ],
+ "syntax": "nowrap | wrap | wrap-reverse",
+ "extended": []
+ }
+ ],
+ [
+ "float",
+ {
+ "name": "float",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-float",
+ "initial": "none",
+ "appliesTo": "all elements.",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "float"
+ ],
+ "syntax": "block-start | block-end | inline-start | inline-end | snap-block | <snap-block()> | snap-inline | <snap-inline()> | left | right | top | bottom | none | footnote",
+ "extended": [
+ "https://drafts.csswg.org/css-gcpm-3/"
+ ]
+ }
+ ],
+ [
+ "float-defer",
+ {
+ "name": "float-defer",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-float-defer",
+ "initial": "none",
+ "appliesTo": "floats",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword or integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "float-defer",
+ "floatDefer"
+ ],
+ "syntax": "<integer> | last | none",
+ "extended": []
+ }
+ ],
+ [
+ "float-offset",
+ {
+ "name": "float-offset",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-float-offset",
+ "initial": "0",
+ "appliesTo": "floats",
+ "inherited": "no",
+ "percentages": "see prose",
+ "computedValue": "computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "float-offset",
+ "floatOffset"
+ ],
+ "syntax": "<length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "float-reference",
+ {
+ "name": "float-reference",
+ "href": "https://drafts.csswg.org/css-page-floats-3/#propdef-float-reference",
+ "initial": "inline",
+ "appliesTo": "all elements.",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "float-reference",
+ "floatReference"
+ ],
+ "syntax": "inline | column | region | page",
+ "extended": []
+ }
+ ],
+ [
+ "flood-color",
+ {
+ "name": "flood-color",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-flood-color",
+ "initial": "black",
+ "appliesTo": "feFlood and feDropShadow elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "flood-color",
+ "floodColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "flood-opacity",
+ {
+ "name": "flood-opacity",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-flood-opacity",
+ "initial": "1",
+ "appliesTo": "feFlood and feDropShadow elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the specified value converted to a number, clamped to the range [0,1]",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "flood-opacity",
+ "floodOpacity"
+ ],
+ "syntax": "<'opacity'>",
+ "extended": []
+ }
+ ],
+ [
+ "flow-from",
+ {
+ "name": "flow-from",
+ "href": "https://drafts.csswg.org/css-regions-1/#propdef-flow-from",
+ "initial": "none",
+ "appliesTo": "Non-replaced block containers. This might be expanded in future versions of the specification to allow other types of containers to receive flow content.",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "flow-from",
+ "flowFrom"
+ ],
+ "syntax": "<custom-ident> | none",
+ "extended": []
+ }
+ ],
+ [
+ "flow-into",
+ {
+ "name": "flow-into",
+ "href": "https://drafts.csswg.org/css-regions-1/#propdef-flow-into",
+ "initial": "none",
+ "appliesTo": "All elements, but not pseudo-elements such as ::first-line, ::first-letter, ::before or ::after.",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "flow-into",
+ "flowInto"
+ ],
+ "syntax": "none | <custom-ident> [element | content]?",
+ "extended": []
+ }
+ ],
+ [
+ "font",
+ {
+ "name": "font",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font",
+ "initial": "see individual properties",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "see individual properties",
+ "styleDeclaration": [
+ "font"
+ ],
+ "syntax": "[ [ <'font-style'> || <font-variant-css2> || <'font-weight'> || <font-width-css3> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'># ] | <system-family-name>",
+ "extended": []
+ }
+ ],
+ [
+ "font-family",
+ {
+ "name": "font-family",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-family",
+ "initial": "depends on user agent",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "list, each item a string and/or <generic-family> keywords",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-family",
+ "fontFamily"
+ ],
+ "syntax": "[ <family-name> | <generic-family> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "font-feature-settings",
+ {
+ "name": "font-feature-settings",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-feature-settings",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-feature-settings",
+ "fontFeatureSettings"
+ ],
+ "syntax": "normal | <feature-tag-value>#",
+ "extended": []
+ }
+ ],
+ [
+ "font-kerning",
+ {
+ "name": "font-kerning",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-kerning",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-kerning",
+ "fontKerning"
+ ],
+ "syntax": "auto | normal | none",
+ "extended": []
+ }
+ ],
+ [
+ "font-language-override",
+ {
+ "name": "font-language-override",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-language-override",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified string or the keyword none",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-language-override",
+ "fontLanguageOverride"
+ ],
+ "syntax": "normal | <string>",
+ "extended": []
+ }
+ ],
+ [
+ "font-optical-sizing",
+ {
+ "name": "font-optical-sizing",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-optical-sizing",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-optical-sizing",
+ "fontOpticalSizing"
+ ],
+ "syntax": "auto | none",
+ "extended": []
+ }
+ ],
+ [
+ "font-palette",
+ {
+ "name": "font-palette",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-palette",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/a",
+ "computedValue": "specified keyword, identifier or <palette-mix()> function. <palette-mix()> must be simplified to a single keyword or identifier if resulting palette is equivalent.",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "font-palette",
+ "fontPalette"
+ ],
+ "syntax": "normal | light | dark | <palette-identifier> | <palette-mix()>",
+ "extended": []
+ }
+ ],
+ [
+ "font-size",
+ {
+ "name": "font-size",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-size",
+ "initial": "medium",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "refer to parent element’s font size",
+ "computedValue": "an absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "font-size",
+ "fontSize"
+ ],
+ "syntax": "<absolute-size> | <relative-size> | <length-percentage [0,∞]> | math",
+ "extended": []
+ }
+ ],
+ [
+ "font-size-adjust",
+ {
+ "name": "font-size-adjust",
+ "href": "https://drafts.csswg.org/css-fonts-5/#propdef-font-size-adjust",
+ "initial": "none",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the keyword none, or a pair of a metric keyword and a <number>",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete if the keywords differ, otherwise by computed value type",
+ "styleDeclaration": [
+ "font-size-adjust",
+ "fontSizeAdjust"
+ ],
+ "syntax": "none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <number [0,∞]> ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-stretch",
+ {
+ "name": "font-stretch",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-stretch",
+ "legacyAliasOf": "font-width",
+ "styleDeclaration": [
+ "font-stretch",
+ "fontStretch"
+ ],
+ "extended": [],
+ "syntax": "normal | <percentage [0,∞]> | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded"
+ }
+ ],
+ [
+ "font-style",
+ {
+ "name": "font-style",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-style",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword specified, plus angle in degrees if specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type;normal animates as oblique 0deg",
+ "styleDeclaration": [
+ "font-style",
+ "fontStyle"
+ ],
+ "syntax": "normal | italic | left | right | oblique <angle [-90deg,90deg]>?",
+ "extended": []
+ }
+ ],
+ [
+ "font-synthesis",
+ {
+ "name": "font-synthesis",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-synthesis",
+ "initial": "weight style small-caps position",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-synthesis",
+ "fontSynthesis"
+ ],
+ "syntax": "none | [ weight || style || small-caps || position]",
+ "extended": []
+ }
+ ],
+ [
+ "font-synthesis-position",
+ {
+ "name": "font-synthesis-position",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-synthesis-position",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-synthesis-position",
+ "fontSynthesisPosition"
+ ],
+ "syntax": "auto | none",
+ "extended": []
+ }
+ ],
+ [
+ "font-synthesis-small-caps",
+ {
+ "name": "font-synthesis-small-caps",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-synthesis-small-caps",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-synthesis-small-caps",
+ "fontSynthesisSmallCaps"
+ ],
+ "syntax": "auto | none",
+ "extended": []
+ }
+ ],
+ [
+ "font-synthesis-style",
+ {
+ "name": "font-synthesis-style",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-synthesis-style",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "font-synthesis-style",
+ "fontSynthesisStyle"
+ ],
+ "syntax": "auto | none | oblique-only",
+ "extended": []
+ }
+ ],
+ [
+ "font-synthesis-weight",
+ {
+ "name": "font-synthesis-weight",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-synthesis-weight",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "font-synthesis-weight",
+ "fontSynthesisWeight"
+ ],
+ "syntax": "auto | none",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant",
+ {
+ "name": "font-variant",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant",
+ "fontVariant"
+ ],
+ "syntax": "normal | none | [ [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ] || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] || [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ] || [ <east-asian-variant-values> || <east-asian-width-values> || ruby ] || [ sub | super ] || [ text | emoji | unicode ] ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-alternates",
+ {
+ "name": "font-variant-alternates",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-alternates",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-alternates",
+ "fontVariantAlternates"
+ ],
+ "syntax": "normal | [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-caps",
+ {
+ "name": "font-variant-caps",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-caps",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-caps",
+ "fontVariantCaps"
+ ],
+ "syntax": "normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-east-asian",
+ {
+ "name": "font-variant-east-asian",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-east-asian",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-east-asian",
+ "fontVariantEastAsian"
+ ],
+ "syntax": "normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-emoji",
+ {
+ "name": "font-variant-emoji",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-emoji",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "N/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-emoji",
+ "fontVariantEmoji"
+ ],
+ "syntax": "normal | text | emoji | unicode",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-ligatures",
+ {
+ "name": "font-variant-ligatures",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-ligatures",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-ligatures",
+ "fontVariantLigatures"
+ ],
+ "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-numeric",
+ {
+ "name": "font-variant-numeric",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-numeric",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-numeric",
+ "fontVariantNumeric"
+ ],
+ "syntax": "normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]",
+ "extended": []
+ }
+ ],
+ [
+ "font-variant-position",
+ {
+ "name": "font-variant-position",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variant-position",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "font-variant-position",
+ "fontVariantPosition"
+ ],
+ "syntax": "normal | sub | super",
+ "extended": []
+ }
+ ],
+ [
+ "font-variation-settings",
+ {
+ "name": "font-variation-settings",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-variation-settings",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword normal or a list, each item a string paired with a number",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "styleDeclaration": [
+ "font-variation-settings",
+ "fontVariationSettings"
+ ],
+ "syntax": "normal | [ <opentype-tag> <number> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "font-weight",
+ {
+ "name": "font-weight",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-weight",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "a number, see below",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "font-weight",
+ "fontWeight"
+ ],
+ "syntax": "<font-weight-absolute> | bolder | lighter",
+ "extended": []
+ }
+ ],
+ [
+ "font-width",
+ {
+ "name": "font-width",
+ "href": "https://drafts.csswg.org/css-fonts-4/#propdef-font-width",
+ "initial": "normal",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "Not resolved",
+ "computedValue": "a percentage, see below",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "font-width",
+ "fontWidth"
+ ],
+ "syntax": "normal | <percentage [0,∞]> | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded",
+ "extended": []
+ }
+ ],
+ [
+ "footnote-display",
+ {
+ "name": "footnote-display",
+ "href": "https://drafts.csswg.org/css-gcpm-3/#propdef-footnote-display",
+ "initial": "block",
+ "appliesTo": "elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "footnote-display",
+ "footnoteDisplay"
+ ],
+ "syntax": "block | inline | compact",
+ "extended": []
+ }
+ ],
+ [
+ "footnote-policy",
+ {
+ "name": "footnote-policy",
+ "href": "https://drafts.csswg.org/css-gcpm-3/#propdef-footnote-policy",
+ "initial": "auto",
+ "appliesTo": "elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "footnote-policy",
+ "footnotePolicy"
+ ],
+ "syntax": "auto | line | block",
+ "extended": []
+ }
+ ],
+ [
+ "forced-color-adjust",
+ {
+ "name": "forced-color-adjust",
+ "href": "https://drafts.csswg.org/css-color-adjust-1/#propdef-forced-color-adjust",
+ "initial": "auto",
+ "appliesTo": "all elements and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "forced-color-adjust",
+ "forcedColorAdjust"
+ ],
+ "syntax": "auto | none | preserve-parent-color",
+ "extended": []
+ }
+ ],
+ [
+ "gap",
+ {
+ "name": "gap",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-gap",
+ "initial": "see individual properties",
+ "appliesTo": "multi-column containers, flex containers, grid containers",
+ "inherited": "no",
+ "percentages": "refer to corresponding dimension of the content area",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "gap"
+ ],
+ "syntax": "<'row-gap'> <'column-gap'>?",
+ "extended": []
+ }
+ ],
+ [
+ "glyph-orientation-vertical",
+ {
+ "name": "glyph-orientation-vertical",
+ "href": "https://drafts.csswg.org/css-writing-modes-4/#propdef-glyph-orientation-vertical",
+ "initial": "n/a",
+ "appliesTo": "n/a",
+ "inherited": "n/a",
+ "percentages": "n/a",
+ "computedValue": "n/a",
+ "canonicalOrder": "n/a",
+ "animationType": "n/a",
+ "styleDeclaration": [
+ "glyph-orientation-vertical",
+ "glyphOrientationVertical"
+ ],
+ "syntax": "auto | 0deg | 90deg | 0 | 90",
+ "extended": []
+ }
+ ],
+ [
+ "grid",
+ {
+ "name": "grid",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid",
+ "initial": "none",
+ "appliesTo": "grid containers",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "grid"
+ ],
+ "syntax": "<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>",
+ "extended": []
+ }
+ ],
+ [
+ "grid-area",
+ {
+ "name": "grid-area",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-area",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "discrete",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "grid-area",
+ "gridArea"
+ ],
+ "syntax": "<grid-line> [ / <grid-line> ]{0,3}",
+ "extended": []
+ }
+ ],
+ [
+ "grid-auto-columns",
+ {
+ "name": "grid-auto-columns",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-auto-columns",
+ "initial": "auto",
+ "appliesTo": "grid containers",
+ "inherited": "no",
+ "percentages": "see Track Sizing",
+ "computedValue": "see Track Sizing",
+ "canonicalOrder": "per grammar",
+ "animationType": "if the list lengths match, by computed value type per item; discrete otherwise",
+ "styleDeclaration": [
+ "grid-auto-columns",
+ "gridAutoColumns"
+ ],
+ "syntax": "<track-size>+",
+ "extended": []
+ }
+ ],
+ [
+ "grid-auto-flow",
+ {
+ "name": "grid-auto-flow",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-auto-flow",
+ "initial": "row",
+ "appliesTo": "grid containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "grid-auto-flow",
+ "gridAutoFlow"
+ ],
+ "syntax": "[ row | column ] || dense",
+ "extended": []
+ }
+ ],
+ [
+ "grid-auto-rows",
+ {
+ "name": "grid-auto-rows",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-auto-rows",
+ "initial": "auto",
+ "appliesTo": "grid containers",
+ "inherited": "no",
+ "percentages": "see Track Sizing",
+ "computedValue": "see Track Sizing",
+ "canonicalOrder": "per grammar",
+ "animationType": "if the list lengths match, by computed value type per item; discrete otherwise",
+ "styleDeclaration": [
+ "grid-auto-rows",
+ "gridAutoRows"
+ ],
+ "syntax": "<track-size>+",
+ "extended": []
+ }
+ ],
+ [
+ "grid-column",
+ {
+ "name": "grid-column",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-column",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "discrete",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "grid-column",
+ "gridColumn"
+ ],
+ "syntax": "<grid-line> [ / <grid-line> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "grid-column-end",
+ {
+ "name": "grid-column-end",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-column-end",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword, identifier, and/or integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "grid-column-end",
+ "gridColumnEnd"
+ ],
+ "syntax": "<grid-line>",
+ "extended": []
+ }
+ ],
+ [
+ "grid-column-start",
+ {
+ "name": "grid-column-start",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-column-start",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword, identifier, and/or integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "grid-column-start",
+ "gridColumnStart"
+ ],
+ "syntax": "<grid-line>",
+ "extended": []
+ }
+ ],
+ [
+ "grid-row",
+ {
+ "name": "grid-row",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-row",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "discrete",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "grid-row",
+ "gridRow"
+ ],
+ "syntax": "<grid-line> [ / <grid-line> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "grid-row-end",
+ {
+ "name": "grid-row-end",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-row-end",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword, identifier, and/or integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "grid-row-end",
+ "gridRowEnd"
+ ],
+ "syntax": "<grid-line>",
+ "extended": []
+ }
+ ],
+ [
+ "grid-row-start",
+ {
+ "name": "grid-row-start",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-row-start",
+ "initial": "auto",
+ "appliesTo": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword, identifier, and/or integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "grid-row-start",
+ "gridRowStart"
+ ],
+ "syntax": "<grid-line>",
+ "extended": []
+ }
+ ],
+ [
+ "grid-template",
+ {
+ "name": "grid-template",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-template",
+ "initial": "none",
+ "appliesTo": "grid containers",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "grid-template",
+ "gridTemplate"
+ ],
+ "syntax": "none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "grid-template-areas",
+ {
+ "name": "grid-template-areas",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-template-areas",
+ "initial": "none",
+ "appliesTo": "grid containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list of string values",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "grid-template-areas",
+ "gridTemplateAreas"
+ ],
+ "syntax": "none | <string>+",
+ "extended": []
+ }
+ ],
+ [
+ "grid-template-columns",
+ {
+ "name": "grid-template-columns",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-template-columns",
+ "initial": "none",
+ "appliesTo": "grid containers",
+ "inherited": "no",
+ "percentages": "refer to corresponding dimension of the content area",
+ "computedValue": "the keyword none or a computed track list",
+ "canonicalOrder": "per grammar",
+ "animationType": "if the list lengths match, by computed value type per item in the computed track list (see § 7.2.5 Computed Value of a Track Listing and § 7.2.3.3 Interpolation/Combination of repeat()); discrete otherwise",
+ "styleDeclaration": [
+ "grid-template-columns",
+ "gridTemplateColumns"
+ ],
+ "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
+ "extended": []
+ }
+ ],
+ [
+ "grid-template-rows",
+ {
+ "name": "grid-template-rows",
+ "href": "https://drafts.csswg.org/css-grid-2/#propdef-grid-template-rows",
+ "initial": "none",
+ "appliesTo": "grid containers",
+ "inherited": "no",
+ "percentages": "refer to corresponding dimension of the content area",
+ "computedValue": "the keyword none or a computed track list",
+ "canonicalOrder": "per grammar",
+ "animationType": "if the list lengths match, by computed value type per item in the computed track list (see § 7.2.5 Computed Value of a Track Listing and § 7.2.3.3 Interpolation/Combination of repeat()); discrete otherwise",
+ "styleDeclaration": [
+ "grid-template-rows",
+ "gridTemplateRows"
+ ],
+ "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
+ "extended": []
+ }
+ ],
+ [
+ "hanging-punctuation",
+ {
+ "name": "hanging-punctuation",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hanging-punctuation",
+ "initial": "none",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "hanging-punctuation",
+ "hangingPunctuation"
+ ],
+ "syntax": "none | [ first || [ force-end | allow-end ] || last ]",
+ "extended": []
+ }
+ ],
+ [
+ "height",
+ {
+ "name": "height",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-height",
+ "initial": "auto",
+ "appliesTo": "all elements except non-replaced inlines",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type, recursing into fit-content()",
+ "logicalPropertyGroup": "size",
+ "styleDeclaration": [
+ "height"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "hyphenate-character",
+ {
+ "name": "hyphenate-character",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hyphenate-character",
+ "initial": "auto",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "hyphenate-character",
+ "hyphenateCharacter"
+ ],
+ "syntax": "auto | <string>",
+ "extended": []
+ }
+ ],
+ [
+ "hyphenate-limit-chars",
+ {
+ "name": "hyphenate-limit-chars",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-chars",
+ "initial": "auto",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "three values, each either the auto keyword or an integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "hyphenate-limit-chars",
+ "hyphenateLimitChars"
+ ],
+ "syntax": "[ auto | <integer> ]{1,3}",
+ "extended": []
+ }
+ ],
+ [
+ "hyphenate-limit-last",
+ {
+ "name": "hyphenate-limit-last",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-last",
+ "initial": "none",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "hyphenate-limit-last",
+ "hyphenateLimitLast"
+ ],
+ "syntax": "none | always | column | page | spread",
+ "extended": []
+ }
+ ],
+ [
+ "hyphenate-limit-lines",
+ {
+ "name": "hyphenate-limit-lines",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-lines",
+ "initial": "no-limit",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword or integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "hyphenate-limit-lines",
+ "hyphenateLimitLines"
+ ],
+ "syntax": "no-limit | <integer>",
+ "extended": []
+ }
+ ],
+ [
+ "hyphenate-limit-zone",
+ {
+ "name": "hyphenate-limit-zone",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-zone",
+ "initial": "0",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "refers to length of the line box",
+ "computedValue": "computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "hyphenate-limit-zone",
+ "hyphenateLimitZone"
+ ],
+ "syntax": "<length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "hyphens",
+ {
+ "name": "hyphens",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-hyphens",
+ "initial": "manual",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "hyphens"
+ ],
+ "syntax": "none | manual | auto",
+ "extended": []
+ }
+ ],
+ [
+ "image-orientation",
+ {
+ "name": "image-orientation",
+ "href": "https://drafts.csswg.org/css-images-3/#propdef-image-orientation",
+ "initial": "from-image",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the specified keyword, or an <angle>, rounded and normalized (see text), plus optionally a flip keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "image-orientation",
+ "imageOrientation"
+ ],
+ "syntax": "from-image | none | [ <angle> || flip ]",
+ "extended": []
+ }
+ ],
+ [
+ "image-rendering",
+ {
+ "name": "image-rendering",
+ "href": "https://drafts.csswg.org/css-images-3/#propdef-image-rendering",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "image-rendering",
+ "imageRendering"
+ ],
+ "syntax": "auto | smooth | high-quality | pixelated | crisp-edges",
+ "extended": []
+ }
+ ],
+ [
+ "image-resolution",
+ {
+ "name": "image-resolution",
+ "href": "https://drafts.csswg.org/css-images-4/#propdef-image-resolution",
+ "initial": "1dppx",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s) and/or <resolution> (possibly adjusted for snap, see below)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "image-resolution",
+ "imageResolution"
+ ],
+ "syntax": "[ from-image || <resolution> ] && snap?",
+ "extended": []
+ }
+ ],
+ [
+ "initial-letter",
+ {
+ "name": "initial-letter",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-initial-letter",
+ "initial": "normal",
+ "appliesTo": "certain inline-level boxes and ::first-letter and inside ::marker boxes (see prose)",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword normal or a number paired with an integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "initial-letter",
+ "initialLetter"
+ ],
+ "syntax": "normal | <number [1,∞]> <integer [1,∞]> | <number [1,∞]> && [ drop | raise ]?",
+ "extended": []
+ }
+ ],
+ [
+ "initial-letter-align",
+ {
+ "name": "initial-letter-align",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-initial-letter-align",
+ "initial": "alphabetic",
+ "appliesTo": "certain inline-level boxes and ::first-letter and inside ::marker boxes (see prose)",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "initial-letter-align",
+ "initialLetterAlign"
+ ],
+ "syntax": "[ border-box? [ alphabetic | ideographic | hanging | leading ]? ]!",
+ "extended": []
+ }
+ ],
+ [
+ "initial-letter-wrap",
+ {
+ "name": "initial-letter-wrap",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-initial-letter-wrap",
+ "initial": "none",
+ "appliesTo": "certain inline-level boxes and ::first-letter and inside ::marker boxes (see prose)",
+ "inherited": "yes",
+ "percentages": "relative to logical width of (last fragment of) initial letter",
+ "computedValue": "specified keyword or computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "initial-letter-wrap",
+ "initialLetterWrap"
+ ],
+ "syntax": "none | first | all | grid | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "inline-size",
+ {
+ "name": "inline-size",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-inline-size",
+ "initial": "auto",
+ "appliesTo": "Same as height and width",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as height, width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "size",
+ "styleDeclaration": [
+ "inline-size",
+ "inlineSize"
+ ],
+ "syntax": "<'width'>",
+ "extended": []
+ }
+ ],
+ [
+ "inline-sizing",
+ {
+ "name": "inline-sizing",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-inline-sizing",
+ "initial": "normal",
+ "appliesTo": "inline boxes, but not ruby container boxes nor internal ruby boxes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "inline-sizing",
+ "inlineSizing"
+ ],
+ "syntax": "normal | stretch",
+ "extended": []
+ }
+ ],
+ [
+ "inset",
+ {
+ "name": "inset",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "inset"
+ ],
+ "syntax": "<'top'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "inset-block",
+ {
+ "name": "inset-block",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset-block",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "inset-block",
+ "insetBlock"
+ ],
+ "syntax": "<'top'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "inset-block-end",
+ {
+ "name": "inset-block-end",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset-block-end",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "inset-block-end",
+ "insetBlockEnd"
+ ],
+ "syntax": "auto | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "inset-block-start",
+ {
+ "name": "inset-block-start",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset-block-start",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "inset-block-start",
+ "insetBlockStart"
+ ],
+ "syntax": "auto | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "inset-inline",
+ {
+ "name": "inset-inline",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset-inline",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "inset-inline",
+ "insetInline"
+ ],
+ "syntax": "<'top'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "inset-inline-end",
+ {
+ "name": "inset-inline-end",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset-inline-end",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "inset-inline-end",
+ "insetInlineEnd"
+ ],
+ "syntax": "auto | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "inset-inline-start",
+ {
+ "name": "inset-inline-start",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-inset-inline-start",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "inset-inline-start",
+ "insetInlineStart"
+ ],
+ "syntax": "auto | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "interpolate-size",
+ {
+ "name": "interpolate-size",
+ "href": "https://drafts.csswg.org/css-values-5/#propdef-interpolate-size",
+ "initial": "numeric-only",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "interpolate-size",
+ "interpolateSize"
+ ],
+ "syntax": "numeric-only | allow-keywords",
+ "extended": []
+ }
+ ],
+ [
+ "isolation",
+ {
+ "name": "isolation",
+ "href": "https://drafts.fxtf.org/compositing-2/#propdef-isolation",
+ "initial": "auto",
+ "appliesTo": "All elements. In SVG, it applies to container elements, graphics elements and graphics referencing elements. [SVG11]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual",
+ "animatable": "no",
+ "styleDeclaration": [
+ "isolation"
+ ],
+ "syntax": "<isolation-mode>",
+ "extended": []
+ }
+ ],
+ [
+ "item-cross",
+ {
+ "name": "item-cross",
+ "href": "https://drafts.csswg.org/css-grid-3/#propdef-item-cross",
+ "initial": "auto",
+ "appliesTo": "flex containers, grid containers, masonry containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "item-cross",
+ "itemCross"
+ ],
+ "syntax": "[ auto | nowrap | wrap ] || [ normal | reverse ] | wrap-reverse",
+ "extended": []
+ }
+ ],
+ [
+ "item-direction",
+ {
+ "name": "item-direction",
+ "href": "https://drafts.csswg.org/css-grid-3/#propdef-item-direction",
+ "initial": "auto",
+ "appliesTo": "flex containers, grid containers, masonry containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "item-direction",
+ "itemDirection"
+ ],
+ "syntax": "auto | row | column | row-reverse | column-reverse",
+ "extended": []
+ }
+ ],
+ [
+ "item-flow",
+ {
+ "name": "item-flow",
+ "href": "https://drafts.csswg.org/css-grid-3/#propdef-item-flow",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "item-flow",
+ "itemFlow"
+ ],
+ "syntax": "<'item-direction'> || <'item-wrap'> || <'item-pack'> || <'item-tolerance'>",
+ "extended": []
+ }
+ ],
+ [
+ "item-pack",
+ {
+ "name": "item-pack",
+ "href": "https://drafts.csswg.org/css-grid-3/#propdef-item-pack",
+ "initial": "normal",
+ "appliesTo": "flex containers, grid containers, masonry containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "item-pack",
+ "itemPack"
+ ],
+ "syntax": "normal | dense || balance",
+ "extended": []
+ }
+ ],
+ [
+ "item-track",
+ {
+ "name": "item-track",
+ "href": "https://drafts.csswg.org/css-grid-3/#propdef-item-track",
+ "initial": "auto",
+ "appliesTo": "flex containers, grid containers, masonry containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "item-track",
+ "itemTrack"
+ ],
+ "syntax": "auto | row | column | row-reverse | column-reverse",
+ "extended": []
+ }
+ ],
+ [
+ "item-wrap",
+ {
+ "name": "item-wrap",
+ "href": "https://drafts.csswg.org/css-grid-3/#propdef-item-wrap",
+ "initial": "auto",
+ "appliesTo": "flex containers, grid containers, masonry containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "item-wrap",
+ "itemWrap"
+ ],
+ "syntax": "[ auto | nowrap | wrap ] || [ normal | reverse ] | wrap-reverse",
+ "extended": []
+ }
+ ],
+ [
+ "justify-content",
+ {
+ "name": "justify-content",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-justify-content",
+ "initial": "normal",
+ "appliesTo": "multicol containers, flex containers, and grid containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "justify-content",
+ "justifyContent"
+ ],
+ "syntax": "normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]",
+ "extended": []
+ }
+ ],
+ [
+ "justify-items",
+ {
+ "name": "justify-items",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-justify-items",
+ "initial": "legacy",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s), except for legacy (see prose)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "justify-items",
+ "justifyItems"
+ ],
+ "syntax": "normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ] | anchor-center",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "justify-self",
+ {
+ "name": "justify-self",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-justify-self",
+ "initial": "auto",
+ "appliesTo": "block-level boxes, absolutely-positioned boxes, and grid items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "justify-self",
+ "justifySelf"
+ ],
+ "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | anchor-center",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "left",
+ {
+ "name": "left",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-left",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "left"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "letter-spacing",
+ {
+ "name": "letter-spacing",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-letter-spacing",
+ "initial": "normal",
+ "appliesTo": "inline boxes and text",
+ "inherited": "yes",
+ "percentages": "relative to computed font-size, i.e. 1em",
+ "computedValue": "an absolute length and/or a percentage",
+ "canonicalOrder": "n/a",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "letter-spacing",
+ "letterSpacing"
+ ],
+ "syntax": "normal | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "lighting-color",
+ {
+ "name": "lighting-color",
+ "href": "https://drafts.fxtf.org/filter-effects-1/#propdef-lighting-color",
+ "initial": "white",
+ "appliesTo": "feDiffuseLighting and feSpecularLighting elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "lighting-color",
+ "lightingColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "line-break",
+ {
+ "name": "line-break",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-line-break",
+ "initial": "auto",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "line-break",
+ "lineBreak"
+ ],
+ "syntax": "auto | loose | normal | strict | anywhere",
+ "extended": []
+ }
+ ],
+ [
+ "line-clamp",
+ {
+ "name": "line-clamp",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-line-clamp",
+ "initial": "none",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "line-clamp",
+ "lineClamp"
+ ],
+ "syntax": "none | [<integer [1,∞]> || <'block-ellipsis'>] -webkit-legacy?",
+ "extended": []
+ }
+ ],
+ [
+ "line-fit-edge",
+ {
+ "name": "line-fit-edge",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-line-fit-edge",
+ "initial": "leading",
+ "appliesTo": "inline boxes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "line-fit-edge",
+ "lineFitEdge"
+ ],
+ "syntax": "leading | <text-edge>",
+ "extended": []
+ }
+ ],
+ [
+ "line-grid",
+ {
+ "name": "line-grid",
+ "href": "https://drafts.csswg.org/css-line-grid-1/#propdef-line-grid",
+ "initial": "match-parent",
+ "appliesTo": "block, flex and grid containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "line-grid",
+ "lineGrid"
+ ],
+ "syntax": "match-parent | create",
+ "extended": []
+ }
+ ],
+ [
+ "line-height",
+ {
+ "name": "line-height",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-line-height",
+ "initial": "normal",
+ "appliesTo": "non-replaced inline boxes and SVG text content elements",
+ "inherited": "yes",
+ "percentages": "computed relative to 1em",
+ "computedValue": "the specified keyword, a number, or a computed <length> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "line-height",
+ "lineHeight"
+ ],
+ "syntax": "normal | <number [0,∞]> | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "line-height-step",
+ {
+ "name": "line-height-step",
+ "href": "https://drafts.csswg.org/css-rhythm-1/#propdef-line-height-step",
+ "initial": "0",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "line-height-step",
+ "lineHeightStep"
+ ],
+ "syntax": "<length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "line-padding",
+ {
+ "name": "line-padding",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-line-padding",
+ "initial": "0",
+ "appliesTo": "inline boxes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "line-padding",
+ "linePadding"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "line-snap",
+ {
+ "name": "line-snap",
+ "href": "https://drafts.csswg.org/css-line-grid-1/#propdef-line-snap",
+ "initial": "none",
+ "appliesTo": "block container elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "line-snap",
+ "lineSnap"
+ ],
+ "syntax": "none | baseline | contain",
+ "extended": []
+ }
+ ],
+ [
+ "list-style",
+ {
+ "name": "list-style",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-list-style",
+ "initial": "see individual properties",
+ "appliesTo": "list items",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "list-style",
+ "listStyle"
+ ],
+ "syntax": "<'list-style-position'> || <'list-style-image'> || <'list-style-type'>",
+ "extended": []
+ }
+ ],
+ [
+ "list-style-image",
+ {
+ "name": "list-style-image",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-list-style-image",
+ "initial": "none",
+ "appliesTo": "list items",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword noneor the computed <image>",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "list-style-image",
+ "listStyleImage"
+ ],
+ "syntax": "<image> | none",
+ "extended": []
+ }
+ ],
+ [
+ "list-style-position",
+ {
+ "name": "list-style-position",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-list-style-position",
+ "initial": "outside",
+ "appliesTo": "list items",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "keyword, but see prose",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "list-style-position",
+ "listStylePosition"
+ ],
+ "syntax": "inside | outside",
+ "extended": []
+ }
+ ],
+ [
+ "list-style-type",
+ {
+ "name": "list-style-type",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-list-style-type",
+ "initial": "disc",
+ "appliesTo": "list items",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "list-style-type",
+ "listStyleType"
+ ],
+ "syntax": "<counter-style> | <string> | none",
+ "extended": []
+ }
+ ],
+ [
+ "margin",
+ {
+ "name": "margin",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "margin"
+ ],
+ "syntax": "<'margin-top'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "margin-block",
+ {
+ "name": "margin-block",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-margin-block",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "margin-block",
+ "marginBlock"
+ ],
+ "syntax": "<'margin-top'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "margin-block-end",
+ {
+ "name": "margin-block-end",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-margin-block-end",
+ "initial": "0",
+ "appliesTo": "Same as margin-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding margin-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-block-end",
+ "marginBlockEnd"
+ ],
+ "syntax": "<'margin-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "margin-block-start",
+ {
+ "name": "margin-block-start",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-margin-block-start",
+ "initial": "0",
+ "appliesTo": "Same as margin-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding margin-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-block-start",
+ "marginBlockStart"
+ ],
+ "syntax": "<'margin-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "margin-bottom",
+ {
+ "name": "margin-bottom",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-bottom",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-bottom",
+ "marginBottom"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-break",
+ {
+ "name": "margin-break",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-margin-break",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "margin-break",
+ "marginBreak"
+ ],
+ "syntax": "auto | keep | discard",
+ "extended": []
+ }
+ ],
+ [
+ "margin-inline",
+ {
+ "name": "margin-inline",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-margin-inline",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "margin-inline",
+ "marginInline"
+ ],
+ "syntax": "<'margin-top'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "margin-inline-end",
+ {
+ "name": "margin-inline-end",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-margin-inline-end",
+ "initial": "0",
+ "appliesTo": "Same as margin-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding margin-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-inline-end",
+ "marginInlineEnd"
+ ],
+ "syntax": "<'margin-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "margin-inline-start",
+ {
+ "name": "margin-inline-start",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-margin-inline-start",
+ "initial": "0",
+ "appliesTo": "Same as margin-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding margin-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-inline-start",
+ "marginInlineStart"
+ ],
+ "syntax": "<'margin-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "margin-left",
+ {
+ "name": "margin-left",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-left",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-left",
+ "marginLeft"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-right",
+ {
+ "name": "margin-right",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-right",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-right",
+ "marginRight"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-top",
+ {
+ "name": "margin-top",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-top",
+ "initial": "0",
+ "appliesTo": "all elements except internal table elements, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "margin",
+ "styleDeclaration": [
+ "margin-top",
+ "marginTop"
+ ],
+ "syntax": "<length-percentage> | auto | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "margin-trim",
+ {
+ "name": "margin-trim",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-margin-trim",
+ "initial": "none",
+ "appliesTo": "block containers, multi-column containers, flex containers, grid containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "a set of zero to four keywords indicating which sides to trim",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "margin-trim",
+ "marginTrim"
+ ],
+ "syntax": "none | [ block || inline ] | [ block-start || inline-start || block-end || inline-end ]",
+ "extended": []
+ }
+ ],
+ [
+ "marker",
+ {
+ "name": "marker",
+ "href": "https://svgwg.org/svg2-draft/painting.html#MarkerProperty",
+ "initial": "not defined for shorthand properties",
+ "appliesTo": "shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "see individual properties",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "marker"
+ ],
+ "syntax": "none | <marker-ref>",
+ "extended": []
+ }
+ ],
+ [
+ "marker-end",
+ {
+ "name": "marker-end",
+ "href": "https://svgwg.org/svg2-draft/painting.html#MarkerEndProperty",
+ "initial": "none",
+ "appliesTo": "shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified, but with <url> values (that are part of a <marker-ref>) made absolute",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "marker-end",
+ "markerEnd"
+ ],
+ "syntax": "none | <marker-ref>",
+ "extended": []
+ }
+ ],
+ [
+ "marker-mid",
+ {
+ "name": "marker-mid",
+ "href": "https://svgwg.org/svg2-draft/painting.html#MarkerMidProperty",
+ "initial": "none",
+ "appliesTo": "shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified, but with <url> values (that are part of a <marker-ref>) made absolute",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "marker-mid",
+ "markerMid"
+ ],
+ "syntax": "none | <marker-ref>",
+ "extended": []
+ }
+ ],
+ [
+ "marker-side",
+ {
+ "name": "marker-side",
+ "href": "https://drafts.csswg.org/css-lists-3/#propdef-marker-side",
+ "initial": "match-self",
+ "appliesTo": "list items",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "marker-side",
+ "markerSide"
+ ],
+ "syntax": "match-self | match-parent",
+ "extended": []
+ }
+ ],
+ [
+ "marker-start",
+ {
+ "name": "marker-start",
+ "href": "https://svgwg.org/svg2-draft/painting.html#MarkerStartProperty",
+ "initial": "none",
+ "appliesTo": "shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified, but with <url> values (that are part of a <marker-ref>) made absolute",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "marker-start",
+ "markerStart"
+ ],
+ "syntax": "none | <marker-ref>",
+ "extended": []
+ }
+ ],
+ [
+ "mask",
+ {
+ "name": "mask",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask",
+ "initial": "see individual properties",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "see individual properties",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask"
+ ],
+ "syntax": "<mask-layer>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border",
+ {
+ "name": "mask-border",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border",
+ "initial": "See individual properties",
+ "appliesTo": "See individual properties",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "See individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "See individual properties",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border",
+ "maskBorder"
+ ],
+ "syntax": "<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border-mode",
+ {
+ "name": "mask-border-mode",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border-mode",
+ "initial": "alpha",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border-mode",
+ "maskBorderMode"
+ ],
+ "syntax": "luminance | alpha",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border-outset",
+ {
+ "name": "mask-border-outset",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border-outset",
+ "initial": "0",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "all <length>s made absolute, otherwise as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border-outset",
+ "maskBorderOutset"
+ ],
+ "syntax": "[ <length> | <number> ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border-repeat",
+ {
+ "name": "mask-border-repeat",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border-repeat",
+ "initial": "stretch",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border-repeat",
+ "maskBorderRepeat"
+ ],
+ "syntax": "[ stretch | repeat | round | space ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border-slice",
+ {
+ "name": "mask-border-slice",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border-slice",
+ "initial": "0",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "refer to size of the mask border image",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border-slice",
+ "maskBorderSlice"
+ ],
+ "syntax": "[ <number> | <percentage> ]{1,4} fill?",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border-source",
+ {
+ "name": "mask-border-source",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border-source",
+ "initial": "none",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "they keyword none or the computed <image>",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border-source",
+ "maskBorderSource"
+ ],
+ "syntax": "none | <image>",
+ "extended": []
+ }
+ ],
+ [
+ "mask-border-width",
+ {
+ "name": "mask-border-width",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-border-width",
+ "initial": "auto",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "relative to width/height of the mask border image area",
+ "computedValue": "all <length>s made absolute, otherwise as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-border-width",
+ "maskBorderWidth"
+ ],
+ "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "mask-clip",
+ {
+ "name": "mask-clip",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-clip",
+ "initial": "border-box",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-clip",
+ "maskClip"
+ ],
+ "syntax": "[ <coord-box> | no-clip ]#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-composite",
+ {
+ "name": "mask-composite",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-composite",
+ "initial": "add",
+ "appliesTo": "All elements. In SVG, it applies to container elements without the defs element and all graphics elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-composite",
+ "maskComposite"
+ ],
+ "syntax": "<compositing-operator>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-image",
+ {
+ "name": "mask-image",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-image",
+ "initial": "none",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item the keyword none, a computed <image>, or a computed <url>",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-image",
+ "maskImage"
+ ],
+ "syntax": "<mask-reference>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-mode",
+ {
+ "name": "mask-mode",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-mode",
+ "initial": "match-source",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-mode",
+ "maskMode"
+ ],
+ "syntax": "<masking-mode>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-origin",
+ {
+ "name": "mask-origin",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-origin",
+ "initial": "border-box",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-origin",
+ "maskOrigin"
+ ],
+ "syntax": "<coord-box>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-position",
+ {
+ "name": "mask-position",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-position",
+ "initial": "0% 0%",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "refer to size of mask painting area minus size of mask layer image; see text background-position [CSS3BG]",
+ "computedValue": "list, each item consists of two keywords representing the origin and two offsets from that origin, each given as an absolute length (if given a <length>), otherwise as a percentage.",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-position",
+ "maskPosition"
+ ],
+ "syntax": "<position>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-repeat",
+ {
+ "name": "mask-repeat",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-repeat",
+ "initial": "repeat",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item a pair of keywords, one per dimension",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-repeat",
+ "maskRepeat"
+ ],
+ "syntax": "<repeat-style>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-size",
+ {
+ "name": "mask-size",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-size",
+ "initial": "auto",
+ "appliesTo": "All elements. In SVG, it applies to container elements excluding the defs element, all graphics elements and the use element",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list, each item as specified, but with lengths made absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-size",
+ "maskSize"
+ ],
+ "syntax": "<bg-size>#",
+ "extended": []
+ }
+ ],
+ [
+ "mask-type",
+ {
+ "name": "mask-type",
+ "href": "https://drafts.fxtf.org/css-masking-1/#propdef-mask-type",
+ "initial": "luminance",
+ "appliesTo": "mask elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "mask-type",
+ "maskType"
+ ],
+ "syntax": "luminance | alpha",
+ "extended": []
+ }
+ ],
+ [
+ "max-block-size",
+ {
+ "name": "max-block-size",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-max-block-size",
+ "initial": "none",
+ "appliesTo": "same as height and width",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as max-height, max-width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "max-size",
+ "styleDeclaration": [
+ "max-block-size",
+ "maxBlockSize"
+ ],
+ "syntax": "<'max-width'>",
+ "extended": []
+ }
+ ],
+ [
+ "max-height",
+ {
+ "name": "max-height",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-max-height",
+ "initial": "none",
+ "appliesTo": "all elements that accept width or height",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, recursing into fit-content()",
+ "logicalPropertyGroup": "max-size",
+ "styleDeclaration": [
+ "max-height",
+ "maxHeight"
+ ],
+ "syntax": "none | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "max-inline-size",
+ {
+ "name": "max-inline-size",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-max-inline-size",
+ "initial": "none",
+ "appliesTo": "same as height and width",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as max-height, max-width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "max-size",
+ "styleDeclaration": [
+ "max-inline-size",
+ "maxInlineSize"
+ ],
+ "syntax": "<'max-width'>",
+ "extended": []
+ }
+ ],
+ [
+ "max-lines",
+ {
+ "name": "max-lines",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-max-lines",
+ "initial": "none",
+ "appliesTo": "block containers which are also either line-clamp containers or fragmentation containers that capture region breaks",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword none or an integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "max-lines",
+ "maxLines"
+ ],
+ "syntax": "none | <integer [1,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "max-width",
+ {
+ "name": "max-width",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-max-width",
+ "initial": "none",
+ "appliesTo": "all elements that accept width or height",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, recursing into fit-content()",
+ "logicalPropertyGroup": "max-size",
+ "styleDeclaration": [
+ "max-width",
+ "maxWidth"
+ ],
+ "syntax": "none | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "min-block-size",
+ {
+ "name": "min-block-size",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-min-block-size",
+ "initial": "0",
+ "appliesTo": "same as height and width",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as min-height, min-width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "min-size",
+ "styleDeclaration": [
+ "min-block-size",
+ "minBlockSize"
+ ],
+ "syntax": "<'min-width'>",
+ "extended": []
+ }
+ ],
+ [
+ "min-height",
+ {
+ "name": "min-height",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-min-height",
+ "initial": "auto",
+ "appliesTo": "all elements that accept width or height",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, recursing into fit-content()",
+ "logicalPropertyGroup": "min-size",
+ "styleDeclaration": [
+ "min-height",
+ "minHeight"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "min-inline-size",
+ {
+ "name": "min-inline-size",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-min-inline-size",
+ "initial": "0",
+ "appliesTo": "same as height and width",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as min-height, min-width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "min-size",
+ "styleDeclaration": [
+ "min-inline-size",
+ "minInlineSize"
+ ],
+ "syntax": "<'min-width'>",
+ "extended": []
+ }
+ ],
+ [
+ "min-intrinsic-sizing",
+ {
+ "name": "min-intrinsic-sizing",
+ "href": "https://drafts.csswg.org/css-sizing-4/#propdef-min-intrinsic-sizing",
+ "initial": "legacy",
+ "appliesTo": "all elements except inline boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "min-intrinsic-sizing",
+ "minIntrinsicSizing"
+ ],
+ "syntax": "legacy | zero-if-scroll || zero-if-extrinsic",
+ "extended": []
+ }
+ ],
+ [
+ "min-width",
+ {
+ "name": "min-width",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-min-width",
+ "initial": "auto",
+ "appliesTo": "all elements that accept width or height",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, recursing into fit-content()",
+ "logicalPropertyGroup": "min-size",
+ "styleDeclaration": [
+ "min-width",
+ "minWidth"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "mix-blend-mode",
+ {
+ "name": "mix-blend-mode",
+ "href": "https://drafts.fxtf.org/compositing-2/#propdef-mix-blend-mode",
+ "initial": "normal",
+ "appliesTo": "All elements. In SVG, it applies to container elements, graphics elements and graphics referencing elements. [SVG11]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual",
+ "animatable": "no",
+ "styleDeclaration": [
+ "mix-blend-mode",
+ "mixBlendMode"
+ ],
+ "syntax": "<blend-mode> | plus-darker | plus-lighter",
+ "extended": []
+ }
+ ],
+ [
+ "nav-down",
+ {
+ "name": "nav-down",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-nav-down",
+ "initial": "auto",
+ "appliesTo": "all enabled elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "nav-down",
+ "navDown"
+ ],
+ "syntax": "auto | <id> [ current | root | <target-name> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "nav-left",
+ {
+ "name": "nav-left",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-nav-left",
+ "initial": "auto",
+ "appliesTo": "all enabled elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "nav-left",
+ "navLeft"
+ ],
+ "syntax": "auto | <id> [ current | root | <target-name> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "nav-right",
+ {
+ "name": "nav-right",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-nav-right",
+ "initial": "auto",
+ "appliesTo": "all enabled elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "nav-right",
+ "navRight"
+ ],
+ "syntax": "auto | <id> [ current | root | <target-name> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "nav-up",
+ {
+ "name": "nav-up",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-nav-up",
+ "initial": "auto",
+ "appliesTo": "all enabled elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "nav-up",
+ "navUp"
+ ],
+ "syntax": "auto | <id> [ current | root | <target-name> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "object-fit",
+ {
+ "name": "object-fit",
+ "href": "https://drafts.csswg.org/css-images-4/#propdef-object-fit",
+ "initial": "fill",
+ "appliesTo": "replaced elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "object-fit",
+ "objectFit"
+ ],
+ "syntax": "fill | none | [contain | cover] || scale-down",
+ "extended": []
+ }
+ ],
+ [
+ "object-position",
+ {
+ "name": "object-position",
+ "href": "https://drafts.csswg.org/css-images-3/#propdef-object-position",
+ "initial": "50% 50%",
+ "appliesTo": "replaced elements",
+ "inherited": "no",
+ "percentages": "refer to width and height of element itself",
+ "computedValue": "as for background-position",
+ "canonicalOrder": "the horizontal component of the <position>, followed by the vertical component",
+ "animationType": "as for background-position",
+ "styleDeclaration": [
+ "object-position",
+ "objectPosition"
+ ],
+ "syntax": "<position>",
+ "extended": []
+ }
+ ],
+ [
+ "offset",
+ {
+ "name": "offset",
+ "href": "https://drafts.fxtf.org/motion-1/#propdef-offset",
+ "initial": "see individual properties",
+ "appliesTo": "transformable elements",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "offset"
+ ],
+ "syntax": "[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?",
+ "extended": []
+ }
+ ],
+ [
+ "offset-anchor",
+ {
+ "name": "offset-anchor",
+ "href": "https://drafts.fxtf.org/motion-1/#propdef-offset-anchor",
+ "initial": "auto",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "relative to the width and the height of the element’s reference box",
+ "computedValue": "the auto keyword or a computed <position>",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "offset-anchor",
+ "offsetAnchor"
+ ],
+ "syntax": "auto | <position>",
+ "extended": []
+ }
+ ],
+ [
+ "offset-distance",
+ {
+ "name": "offset-distance",
+ "href": "https://drafts.fxtf.org/motion-1/#propdef-offset-distance",
+ "initial": "0",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "relative to the offset path length",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "offset-distance",
+ "offsetDistance"
+ ],
+ "syntax": "<length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "offset-path",
+ {
+ "name": "offset-path",
+ "href": "https://drafts.fxtf.org/motion-1/#propdef-offset-path",
+ "initial": "none",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "offset-path",
+ "offsetPath"
+ ],
+ "syntax": "none | <offset-path> || <coord-box>",
+ "extended": []
+ }
+ ],
+ [
+ "offset-position",
+ {
+ "name": "offset-position",
+ "href": "https://drafts.fxtf.org/motion-1/#propdef-offset-position",
+ "initial": "normal",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "Refer to the size of containing block",
+ "computedValue": "The normal or auto keywords, or a computed <position>",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "offset-position",
+ "offsetPosition"
+ ],
+ "syntax": "normal | auto | <position>",
+ "extended": []
+ }
+ ],
+ [
+ "offset-rotate",
+ {
+ "name": "offset-rotate",
+ "href": "https://drafts.fxtf.org/motion-1/#propdef-offset-rotate",
+ "initial": "auto",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "computed <angle> value, optionally preceded by auto",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "offset-rotate",
+ "offsetRotate"
+ ],
+ "syntax": "[ auto | reverse ] || <angle>",
+ "extended": []
+ }
+ ],
+ [
+ "opacity",
+ {
+ "name": "opacity",
+ "href": "https://drafts.csswg.org/css-color-4/#propdef-opacity",
+ "initial": "1",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "map to the range [0,1]",
+ "computedValue": "specified number, clamped to the range [0,1]",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "opacity"
+ ],
+ "syntax": "<opacity-value>",
+ "extended": []
+ }
+ ],
+ [
+ "order",
+ {
+ "name": "order",
+ "href": "https://drafts.csswg.org/css-display-4/#propdef-order",
+ "initial": "0",
+ "appliesTo": "flex items and grid items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "order"
+ ],
+ "syntax": "<integer>",
+ "extended": []
+ }
+ ],
+ [
+ "orphans",
+ {
+ "name": "orphans",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-orphans",
+ "initial": "2",
+ "appliesTo": "block containers that establish an inline formatting context",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "orphans"
+ ],
+ "syntax": "<integer [1,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "outline",
+ {
+ "name": "outline",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-outline",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "outline"
+ ],
+ "syntax": "<'outline-width'> || <'outline-style'> || <'outline-color'>",
+ "extended": []
+ }
+ ],
+ [
+ "outline-color",
+ {
+ "name": "outline-color",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-outline-color",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see below",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "outline-color",
+ "outlineColor"
+ ],
+ "syntax": "auto | <'border-top-color'>",
+ "extended": []
+ }
+ ],
+ [
+ "outline-offset",
+ {
+ "name": "outline-offset",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-outline-offset",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "outline-offset",
+ "outlineOffset"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "outline-style",
+ {
+ "name": "outline-style",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-outline-style",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "outline-style",
+ "outlineStyle"
+ ],
+ "syntax": "auto | <outline-line-style>",
+ "extended": []
+ }
+ ],
+ [
+ "outline-width",
+ {
+ "name": "outline-width",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-outline-width",
+ "initial": "medium",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "absolute length, snapped as a border width",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "outline-width",
+ "outlineWidth"
+ ],
+ "syntax": "<line-width>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow",
+ {
+ "name": "overflow",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-overflow",
+ "initial": "visible",
+ "appliesTo": "block containers [CSS2], flex containers [CSS3-FLEXBOX], and grid containers [CSS3-GRID-LAYOUT]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "discrete",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "overflow"
+ ],
+ "syntax": "<'overflow-block'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-anchor",
+ {
+ "name": "overflow-anchor",
+ "href": "https://drafts.csswg.org/css-scroll-anchoring-1/#propdef-overflow-anchor",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "overflow-anchor",
+ "overflowAnchor"
+ ],
+ "syntax": "auto | none",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-block",
+ {
+ "name": "overflow-block",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-overflow-block",
+ "initial": "visible",
+ "appliesTo": "block containers [CSS2], flex containers [CSS3-FLEXBOX], grid containers [CSS3-GRID-LAYOUT]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "usually specified value, but see text",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overflow",
+ "styleDeclaration": [
+ "overflow-block",
+ "overflowBlock"
+ ],
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin",
+ {
+ "name": "overflow-clip-margin",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "overflow-clip-margin",
+ "overflowClipMargin"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-block",
+ {
+ "name": "overflow-clip-margin-block",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-block",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "overflow-clip-margin-block",
+ "overflowClipMarginBlock"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-block-end",
+ {
+ "name": "overflow-clip-margin-block-end",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-block-end",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-block-end",
+ "overflowClipMarginBlockEnd"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-block-start",
+ {
+ "name": "overflow-clip-margin-block-start",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-block-start",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-block-start",
+ "overflowClipMarginBlockStart"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-bottom",
+ {
+ "name": "overflow-clip-margin-bottom",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-bottom",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-bottom",
+ "overflowClipMarginBottom"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-inline",
+ {
+ "name": "overflow-clip-margin-inline",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-inline",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "overflow-clip-margin-inline",
+ "overflowClipMarginInline"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-inline-end",
+ {
+ "name": "overflow-clip-margin-inline-end",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-inline-end",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-inline-end",
+ "overflowClipMarginInlineEnd"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-inline-start",
+ {
+ "name": "overflow-clip-margin-inline-start",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-inline-start",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-inline-start",
+ "overflowClipMarginInlineStart"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-left",
+ {
+ "name": "overflow-clip-margin-left",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-left",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-left",
+ "overflowClipMarginLeft"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-right",
+ {
+ "name": "overflow-clip-margin-right",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-right",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-right",
+ "overflowClipMarginRight"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-clip-margin-top",
+ {
+ "name": "overflow-clip-margin-top",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-overflow-clip-margin-top",
+ "initial": "0px",
+ "appliesTo": "boxes to which overflow applies",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "the computed <length> and a <visual-box> keyword",
+ "animationType": "per computed value if the <visual-box> values match; otherwise discrete",
+ "canonicalOrder": "per grammar",
+ "logicalPropertyGroup": "overflow-clip-margin",
+ "styleDeclaration": [
+ "overflow-clip-margin-top",
+ "overflowClipMarginTop"
+ ],
+ "syntax": "<visual-box> || <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-inline",
+ {
+ "name": "overflow-inline",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-overflow-inline",
+ "initial": "visible",
+ "appliesTo": "block containers [CSS2], flex containers [CSS3-FLEXBOX], grid containers [CSS3-GRID-LAYOUT]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "usually specified value, but see text",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overflow",
+ "styleDeclaration": [
+ "overflow-inline",
+ "overflowInline"
+ ],
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-wrap",
+ {
+ "name": "overflow-wrap",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-overflow-wrap",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "overflow-wrap",
+ "overflowWrap"
+ ],
+ "syntax": "normal | break-word | anywhere",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-x",
+ {
+ "name": "overflow-x",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-overflow-x",
+ "initial": "visible",
+ "appliesTo": "block containers [CSS2], flex containers [CSS3-FLEXBOX], grid containers [CSS3-GRID-LAYOUT]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "usually specified value, but see text",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overflow",
+ "styleDeclaration": [
+ "overflow-x",
+ "overflowX"
+ ],
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overflow-y",
+ {
+ "name": "overflow-y",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-overflow-y",
+ "initial": "visible",
+ "appliesTo": "block containers [CSS2], flex containers [CSS3-FLEXBOX], grid containers [CSS3-GRID-LAYOUT]",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "usually specified value, but see text",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overflow",
+ "styleDeclaration": [
+ "overflow-y",
+ "overflowY"
+ ],
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overlay",
+ {
+ "name": "overlay",
+ "href": "https://drafts.csswg.org/css-position-4/#propdef-overlay",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "see prose",
+ "styleDeclaration": [
+ "overlay"
+ ],
+ "syntax": "none | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overscroll-behavior",
+ {
+ "name": "overscroll-behavior",
+ "href": "https://drafts.csswg.org/css-overscroll-1/#propdef-overscroll-behavior",
+ "initial": "auto auto",
+ "appliesTo": "scroll container elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "overscroll-behavior",
+ "overscrollBehavior"
+ ],
+ "syntax": "[ contain | none | auto ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "overscroll-behavior-block",
+ {
+ "name": "overscroll-behavior-block",
+ "href": "https://drafts.csswg.org/css-overscroll-1/#propdef-overscroll-behavior-block",
+ "initial": "auto",
+ "appliesTo": "scroll container elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overscroll-behavior",
+ "media": "visual",
+ "styleDeclaration": [
+ "overscroll-behavior-block",
+ "overscrollBehaviorBlock"
+ ],
+ "syntax": "contain | none | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overscroll-behavior-inline",
+ {
+ "name": "overscroll-behavior-inline",
+ "href": "https://drafts.csswg.org/css-overscroll-1/#propdef-overscroll-behavior-inline",
+ "initial": "auto",
+ "appliesTo": "scroll container elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overscroll-behavior",
+ "media": "visual",
+ "styleDeclaration": [
+ "overscroll-behavior-inline",
+ "overscrollBehaviorInline"
+ ],
+ "syntax": "contain | none | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overscroll-behavior-x",
+ {
+ "name": "overscroll-behavior-x",
+ "href": "https://drafts.csswg.org/css-overscroll-1/#propdef-overscroll-behavior-x",
+ "initial": "auto",
+ "appliesTo": "scroll container elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overscroll-behavior",
+ "media": "visual",
+ "styleDeclaration": [
+ "overscroll-behavior-x",
+ "overscrollBehaviorX"
+ ],
+ "syntax": "contain | none | auto",
+ "extended": []
+ }
+ ],
+ [
+ "overscroll-behavior-y",
+ {
+ "name": "overscroll-behavior-y",
+ "href": "https://drafts.csswg.org/css-overscroll-1/#propdef-overscroll-behavior-y",
+ "initial": "auto",
+ "appliesTo": "scroll container elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "logicalPropertyGroup": "overscroll-behavior",
+ "media": "visual",
+ "styleDeclaration": [
+ "overscroll-behavior-y",
+ "overscrollBehaviorY"
+ ],
+ "syntax": "contain | none | auto",
+ "extended": []
+ }
+ ],
+ [
+ "padding",
+ {
+ "name": "padding",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "padding"
+ ],
+ "syntax": "<'padding-top'>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "padding-block",
+ {
+ "name": "padding-block",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-padding-block",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "padding-block",
+ "paddingBlock"
+ ],
+ "syntax": "<'padding-top'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "padding-block-end",
+ {
+ "name": "padding-block-end",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-padding-block-end",
+ "initial": "0",
+ "appliesTo": "Same as padding-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding padding-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-block-end",
+ "paddingBlockEnd"
+ ],
+ "syntax": "<'padding-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-block-start",
+ {
+ "name": "padding-block-start",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-padding-block-start",
+ "initial": "0",
+ "appliesTo": "Same as padding-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding padding-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-block-start",
+ "paddingBlockStart"
+ ],
+ "syntax": "<'padding-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-bottom",
+ {
+ "name": "padding-bottom",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-bottom",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-bottom",
+ "paddingBottom"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-inline",
+ {
+ "name": "padding-inline",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-padding-inline",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "padding-inline",
+ "paddingInline"
+ ],
+ "syntax": "<'padding-top'>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "padding-inline-end",
+ {
+ "name": "padding-inline-end",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-padding-inline-end",
+ "initial": "0",
+ "appliesTo": "Same as padding-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding padding-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-inline-end",
+ "paddingInlineEnd"
+ ],
+ "syntax": "<'padding-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-inline-start",
+ {
+ "name": "padding-inline-start",
+ "href": "https://drafts.csswg.org/css-logical-1/#propdef-padding-inline-start",
+ "initial": "0",
+ "appliesTo": "Same as padding-top",
+ "inherited": "no",
+ "percentages": "As for the corresponding physical property",
+ "computedValue": "Same as corresponding padding-* properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-inline-start",
+ "paddingInlineStart"
+ ],
+ "syntax": "<'padding-top'>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-left",
+ {
+ "name": "padding-left",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-left",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-left",
+ "paddingLeft"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-right",
+ {
+ "name": "padding-right",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-right",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-right",
+ "paddingRight"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "padding-top",
+ {
+ "name": "padding-top",
+ "href": "https://drafts.csswg.org/css-box-4/#propdef-padding-top",
+ "initial": "0",
+ "appliesTo": "all elements except: internal table elements other than table cells, ruby base containers, and ruby annotation containers",
+ "inherited": "no",
+ "percentages": "refer to logical width of containing block",
+ "computedValue": "a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "padding",
+ "styleDeclaration": [
+ "padding-top",
+ "paddingTop"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "page",
+ {
+ "name": "page",
+ "href": "https://drafts.csswg.org/css-page-3/#propdef-page",
+ "initial": "auto",
+ "appliesTo": "boxes that create class A break points",
+ "inherited": "no (but see prose)",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "page"
+ ],
+ "syntax": "auto | <custom-ident>",
+ "extended": []
+ }
+ ],
+ [
+ "page-break-after",
+ {
+ "name": "page-break-after",
+ "href": "https://drafts.csswg.org/css2/#propdef-page-break-after",
+ "initial": "auto",
+ "appliesTo": "block-level elements (but see text)",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual, paged",
+ "styleDeclaration": [
+ "page-break-after",
+ "pageBreakAfter"
+ ],
+ "syntax": "auto | always | avoid | left | right | inherit",
+ "extended": []
+ }
+ ],
+ [
+ "page-break-before",
+ {
+ "name": "page-break-before",
+ "href": "https://drafts.csswg.org/css2/#propdef-page-break-before",
+ "initial": "auto",
+ "appliesTo": "block-level elements (but see text)",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual, paged",
+ "styleDeclaration": [
+ "page-break-before",
+ "pageBreakBefore"
+ ],
+ "syntax": "auto | always | avoid | left | right | inherit",
+ "extended": []
+ }
+ ],
+ [
+ "page-break-inside",
+ {
+ "name": "page-break-inside",
+ "href": "https://drafts.csswg.org/css2/#propdef-page-break-inside",
+ "initial": "auto",
+ "appliesTo": "block-level elements (but see text)",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual, paged",
+ "styleDeclaration": [
+ "page-break-inside",
+ "pageBreakInside"
+ ],
+ "syntax": "avoid | auto | inherit",
+ "extended": []
+ }
+ ],
+ [
+ "pause",
+ {
+ "name": "pause",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-pause",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "pause"
+ ],
+ "syntax": "<'pause-before'> <'pause-after'>?",
+ "extended": []
+ }
+ ],
+ [
+ "pause-after",
+ {
+ "name": "pause-after",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-pause-after",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "pause-after",
+ "pauseAfter"
+ ],
+ "syntax": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "extended": []
+ }
+ ],
+ [
+ "pause-before",
+ {
+ "name": "pause-before",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-pause-before",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "pause-before",
+ "pauseBefore"
+ ],
+ "syntax": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "extended": []
+ }
+ ],
+ [
+ "perspective",
+ {
+ "name": "perspective",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-perspective",
+ "initial": "none",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword none or an absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "perspective"
+ ],
+ "syntax": "none | <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "perspective-origin",
+ {
+ "name": "perspective-origin",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-perspective-origin",
+ "initial": "50% 50%",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "refer to the size of the reference box",
+ "computedValue": "see background-position",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "perspective-origin",
+ "perspectiveOrigin"
+ ],
+ "syntax": "<position>",
+ "extended": []
+ }
+ ],
+ [
+ "place-content",
+ {
+ "name": "place-content",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-place-content",
+ "initial": "normal",
+ "appliesTo": "see individual properties",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "place-content",
+ "placeContent"
+ ],
+ "syntax": "<'align-content'> <'justify-content'>?",
+ "extended": []
+ }
+ ],
+ [
+ "place-items",
+ {
+ "name": "place-items",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-place-items",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "place-items",
+ "placeItems"
+ ],
+ "syntax": "<'align-items'> <'justify-items'>?",
+ "extended": []
+ }
+ ],
+ [
+ "place-self",
+ {
+ "name": "place-self",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-place-self",
+ "initial": "auto",
+ "appliesTo": "see individual properties",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "place-self",
+ "placeSelf"
+ ],
+ "syntax": "<'align-self'> <'justify-self'>?",
+ "extended": []
+ }
+ ],
+ [
+ "pointer-events",
+ {
+ "name": "pointer-events",
+ "href": "https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty",
+ "initial": "auto",
+ "appliesTo": "container elements, graphics elements and ‘use’",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "pointer-events",
+ "pointerEvents"
+ ],
+ "syntax": "auto | bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none",
+ "extended": []
+ }
+ ],
+ [
+ "position",
+ {
+ "name": "position",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-position",
+ "initial": "static",
+ "appliesTo": "all elements except table-column-group and table-column",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "position"
+ ],
+ "syntax": "static | relative | absolute | sticky | fixed | <running()>",
+ "extended": [
+ "https://drafts.csswg.org/css-gcpm-3/"
+ ]
+ }
+ ],
+ [
+ "position-anchor",
+ {
+ "name": "position-anchor",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-position-anchor",
+ "initial": "auto",
+ "appliesTo": "absolutely positioned boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "position-anchor",
+ "positionAnchor"
+ ],
+ "syntax": "auto | <anchor-name>",
+ "extended": []
+ }
+ ],
+ [
+ "position-area",
+ {
+ "name": "position-area",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-position-area",
+ "initial": "none",
+ "appliesTo": "positioned boxes with a default anchor box",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a pair of keywords, see § 3.1.3 Computed Value and Serialization of <position-area>",
+ "canonicalOrder": "per grammar",
+ "animationType": "TBD",
+ "styleDeclaration": [
+ "position-area",
+ "positionArea"
+ ],
+ "syntax": "none | <position-area>",
+ "extended": []
+ }
+ ],
+ [
+ "position-try",
+ {
+ "name": "position-try",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-position-try",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "position-try",
+ "positionTry"
+ ],
+ "syntax": "<'position-try-order'>? <'position-try-fallbacks'>",
+ "extended": []
+ }
+ ],
+ [
+ "position-try-fallbacks",
+ {
+ "name": "position-try-fallbacks",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-position-try-fallbacks",
+ "initial": "none",
+ "appliesTo": "absolutely positioned boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "position-try-fallbacks",
+ "positionTryFallbacks"
+ ],
+ "syntax": "none | [ [<dashed-ident> || <try-tactic>] | <position-area> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "position-try-order",
+ {
+ "name": "position-try-order",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-position-try-order",
+ "initial": "normal",
+ "appliesTo": "absolutely positioned boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "position-try-order",
+ "positionTryOrder"
+ ],
+ "syntax": "normal | <try-size>",
+ "extended": []
+ }
+ ],
+ [
+ "position-visibility",
+ {
+ "name": "position-visibility",
+ "href": "https://drafts.csswg.org/css-anchor-position-1/#propdef-position-visibility",
+ "initial": "anchors-visible",
+ "appliesTo": "absolutely positioned boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "position-visibility",
+ "positionVisibility"
+ ],
+ "syntax": "always | [ anchors-valid || anchors-visible || no-overflow ]",
+ "extended": []
+ }
+ ],
+ [
+ "print-color-adjust",
+ {
+ "name": "print-color-adjust",
+ "href": "https://drafts.csswg.org/css-color-adjust-1/#propdef-print-color-adjust",
+ "initial": "economy",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "print-color-adjust",
+ "printColorAdjust"
+ ],
+ "syntax": "economy | exact",
+ "extended": []
+ }
+ ],
+ [
+ "quotes",
+ {
+ "name": "quotes",
+ "href": "https://drafts.csswg.org/css-content-3/#propdef-quotes",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword none, the keyword auto or match-parent, or a list, each item a pair of string values",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "quotes"
+ ],
+ "syntax": "auto | none | match-parent | [ <string> <string> ]+",
+ "extended": []
+ }
+ ],
+ [
+ "reading-flow",
+ {
+ "name": "reading-flow",
+ "href": "https://drafts.csswg.org/css-display-4/#propdef-reading-flow",
+ "initial": "normal",
+ "appliesTo": "block, flex and grid containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "reading-flow",
+ "readingFlow"
+ ],
+ "syntax": "normal | source-order | flex-visual | flex-flow | grid-rows | grid-columns | grid-order",
+ "extended": []
+ }
+ ],
+ [
+ "region-fragment",
+ {
+ "name": "region-fragment",
+ "href": "https://drafts.csswg.org/css-regions-1/#propdef-region-fragment",
+ "initial": "auto",
+ "appliesTo": "CSS Regions",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "region-fragment",
+ "regionFragment"
+ ],
+ "syntax": "auto | break",
+ "extended": []
+ }
+ ],
+ [
+ "resize",
+ {
+ "name": "resize",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-resize",
+ "initial": "none",
+ "appliesTo": "elements that are scroll containers and optionally replaced elements such as images, videos, and iframes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "resize"
+ ],
+ "syntax": "none | both | horizontal | vertical | block | inline",
+ "extended": []
+ }
+ ],
+ [
+ "rest",
+ {
+ "name": "rest",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-rest",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rest"
+ ],
+ "syntax": "<'rest-before'> <'rest-after'>?",
+ "extended": []
+ }
+ ],
+ [
+ "rest-after",
+ {
+ "name": "rest-after",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-rest-after",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rest-after",
+ "restAfter"
+ ],
+ "syntax": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "extended": []
+ }
+ ],
+ [
+ "rest-before",
+ {
+ "name": "rest-before",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-rest-before",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rest-before",
+ "restBefore"
+ ],
+ "syntax": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "extended": []
+ }
+ ],
+ [
+ "right",
+ {
+ "name": "right",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-right",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "right"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "rotate",
+ {
+ "name": "rotate",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-rotate",
+ "initial": "none",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none, or an <angle> with an axis consisting of a list of three <number>s",
+ "canonicalOrder": "per grammar",
+ "animationType": "as SLERP, but see below for none",
+ "styleDeclaration": [
+ "rotate"
+ ],
+ "syntax": "none | <angle> | [ x | y | z | <number>{3} ] && <angle>",
+ "extended": []
+ }
+ ],
+ [
+ "row-gap",
+ {
+ "name": "row-gap",
+ "href": "https://drafts.csswg.org/css-align-3/#propdef-row-gap",
+ "initial": "normal",
+ "appliesTo": "multi-column containers, flex containers, grid containers",
+ "inherited": "no",
+ "percentages": "see § 8.3 Percentages In gap Properties",
+ "computedValue": "specified keyword, else a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "row-gap",
+ "rowGap"
+ ],
+ "syntax": "normal | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "row-rule",
+ {
+ "name": "row-rule",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-row-rule",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "row-rule",
+ "rowRule"
+ ],
+ "syntax": "<gap-rule-list> | <gap-auto-rule-list>",
+ "extended": []
+ }
+ ],
+ [
+ "row-rule-break",
+ {
+ "name": "row-rule-break",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-row-rule-break",
+ "initial": "spanning-item",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "row-rule-break",
+ "rowRuleBreak"
+ ],
+ "syntax": "none | spanning-item | intersection",
+ "extended": []
+ }
+ ],
+ [
+ "row-rule-color",
+ {
+ "name": "row-rule-color",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-row-rule-color",
+ "initial": "currentcolor",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list, see § 3.4.1 Interpolation behavior.",
+ "styleDeclaration": [
+ "row-rule-color",
+ "rowRuleColor"
+ ],
+ "syntax": "<line-color-list> | <auto-line-color-list>",
+ "extended": []
+ }
+ ],
+ [
+ "row-rule-outset",
+ {
+ "name": "row-rule-outset",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-row-rule-outset",
+ "initial": "50%",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "refer to the crossing gap width",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "row-rule-outset",
+ "rowRuleOutset"
+ ],
+ "syntax": "<length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "row-rule-style",
+ {
+ "name": "row-rule-style",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-row-rule-style",
+ "initial": "none",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "row-rule-style",
+ "rowRuleStyle"
+ ],
+ "syntax": "<line-style-list> | <auto-line-style-list>",
+ "extended": []
+ }
+ ],
+ [
+ "row-rule-width",
+ {
+ "name": "row-rule-width",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-row-rule-width",
+ "initial": "medium",
+ "appliesTo": "grid containers, flex containers, multicol containers, and masonry containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "list of absolute lengths, snapped as a border width",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list, see § 3.4.1 Interpolation behavior.",
+ "styleDeclaration": [
+ "row-rule-width",
+ "rowRuleWidth"
+ ],
+ "syntax": "<line-width-list> | <auto-line-width-list>",
+ "extended": []
+ }
+ ],
+ [
+ "ruby-align",
+ {
+ "name": "ruby-align",
+ "href": "https://drafts.csswg.org/css-ruby-1/#propdef-ruby-align",
+ "initial": "space-around",
+ "appliesTo": "ruby bases, ruby annotations, ruby base containers, ruby annotation containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "ruby-align",
+ "rubyAlign"
+ ],
+ "syntax": "start | center | space-between | space-around",
+ "extended": []
+ }
+ ],
+ [
+ "ruby-merge",
+ {
+ "name": "ruby-merge",
+ "href": "https://drafts.csswg.org/css-ruby-1/#propdef-ruby-merge",
+ "initial": "separate",
+ "appliesTo": "interlinear ruby annotation containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "ruby-merge",
+ "rubyMerge"
+ ],
+ "syntax": "separate | merge | auto",
+ "extended": []
+ }
+ ],
+ [
+ "ruby-overhang",
+ {
+ "name": "ruby-overhang",
+ "href": "https://drafts.csswg.org/css-ruby-1/#propdef-ruby-overhang",
+ "initial": "auto",
+ "appliesTo": "ruby annotation containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "ruby-overhang",
+ "rubyOverhang"
+ ],
+ "syntax": "auto | none",
+ "extended": []
+ }
+ ],
+ [
+ "ruby-position",
+ {
+ "name": "ruby-position",
+ "href": "https://drafts.csswg.org/css-ruby-1/#propdef-ruby-position",
+ "initial": "alternate",
+ "appliesTo": "ruby annotation containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "ruby-position",
+ "rubyPosition"
+ ],
+ "syntax": "[ alternate || [ over | under ] ] | inter-character",
+ "extended": []
+ }
+ ],
+ [
+ "rule",
+ {
+ "name": "rule",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-rule",
+ "initial": "see individual properties",
+ "appliesTo": "Same as column-rule and row-rule",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rule"
+ ],
+ "syntax": "<'column-rule'>",
+ "extended": []
+ }
+ ],
+ [
+ "rule-break",
+ {
+ "name": "rule-break",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-rule-break",
+ "initial": "see individual properties",
+ "appliesTo": "Same as column-rule-break and row-rule-break",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rule-break",
+ "ruleBreak"
+ ],
+ "syntax": "<'column-rule-break'>",
+ "extended": []
+ }
+ ],
+ [
+ "rule-color",
+ {
+ "name": "rule-color",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-rule-color",
+ "initial": "see individual properties",
+ "appliesTo": "Same as column-rule-color and row-rule-color",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rule-color",
+ "ruleColor"
+ ],
+ "syntax": "<'column-rule-color'>",
+ "extended": []
+ }
+ ],
+ [
+ "rule-outset",
+ {
+ "name": "rule-outset",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-rule-outset",
+ "initial": "see individual properties",
+ "appliesTo": "Same as column-rule-outset and row-rule-outset",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rule-outset",
+ "ruleOutset"
+ ],
+ "syntax": "<'column-rule-outset'>",
+ "extended": []
+ }
+ ],
+ [
+ "rule-style",
+ {
+ "name": "rule-style",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-rule-style",
+ "initial": "see individual properties",
+ "appliesTo": "Same as column-rule-style and row-rule-style",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rule-style",
+ "ruleStyle"
+ ],
+ "syntax": "<'column-rule-style'>",
+ "extended": []
+ }
+ ],
+ [
+ "rule-width",
+ {
+ "name": "rule-width",
+ "href": "https://drafts.csswg.org/css-gaps-1/#propdef-rule-width",
+ "initial": "see individual properties",
+ "appliesTo": "Same as column-rule-width and row-rule-width",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "rule-width",
+ "ruleWidth"
+ ],
+ "syntax": "<'column-rule-width'>",
+ "extended": []
+ }
+ ],
+ [
+ "scale",
+ {
+ "name": "scale",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-scale",
+ "initial": "none",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none, or a list of 3 <number>s",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, but see below for none",
+ "styleDeclaration": [
+ "scale"
+ ],
+ "syntax": "none | [ <number> | <percentage> ]{1,3}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-behavior",
+ {
+ "name": "scroll-behavior",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-scroll-behavior",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "scroll-behavior",
+ "scrollBehavior"
+ ],
+ "syntax": "auto | smooth",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin",
+ {
+ "name": "scroll-margin",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "per side, an absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "scroll-margin",
+ "scrollMargin"
+ ],
+ "syntax": "<length>{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-block",
+ {
+ "name": "scroll-margin-block",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-block",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "see individual properties",
+ "animationType": "by computed value type",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "scroll-margin-block",
+ "scrollMarginBlock"
+ ],
+ "syntax": "<length>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-block-end",
+ {
+ "name": "scroll-margin-block-end",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-block-end",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-block-end",
+ "scrollMarginBlockEnd"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-block-start",
+ {
+ "name": "scroll-margin-block-start",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-block-start",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-block-start",
+ "scrollMarginBlockStart"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-bottom",
+ {
+ "name": "scroll-margin-bottom",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-bottom",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-bottom",
+ "scrollMarginBottom"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-inline",
+ {
+ "name": "scroll-margin-inline",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-inline",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "see individual properties",
+ "animationType": "by computed value type",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "scroll-margin-inline",
+ "scrollMarginInline"
+ ],
+ "syntax": "<length>{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-inline-end",
+ {
+ "name": "scroll-margin-inline-end",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-inline-end",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-inline-end",
+ "scrollMarginInlineEnd"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-inline-start",
+ {
+ "name": "scroll-margin-inline-start",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-inline-start",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-inline-start",
+ "scrollMarginInlineStart"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-left",
+ {
+ "name": "scroll-margin-left",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-left",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-left",
+ "scrollMarginLeft"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-right",
+ {
+ "name": "scroll-margin-right",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-right",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-right",
+ "scrollMarginRight"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-margin-top",
+ {
+ "name": "scroll-margin-top",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-margin-top",
+ "initial": "0",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-margin",
+ "styleDeclaration": [
+ "scroll-margin-top",
+ "scrollMarginTop"
+ ],
+ "syntax": "<length>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-marker-group",
+ {
+ "name": "scroll-marker-group",
+ "href": "https://drafts.csswg.org/css-overflow-5/#propdef-scroll-marker-group",
+ "initial": "none",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "scroll-marker-group",
+ "scrollMarkerGroup"
+ ],
+ "syntax": "none | before | after",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding",
+ {
+ "name": "scroll-padding",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the corresponding dimension of the scroll container’s scrollport",
+ "computedValue": "per side, either the keyword auto or a computed <length-percentage> value",
+ "animationType": "by computed value type",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "scroll-padding",
+ "scrollPadding"
+ ],
+ "syntax": "[ auto | <length-percentage [0,∞]> ]{1,4}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-block",
+ {
+ "name": "scroll-padding-block",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "see individual properties",
+ "animationType": "by computed value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "scroll-padding-block",
+ "scrollPaddingBlock"
+ ],
+ "syntax": "[ auto | <length-percentage [0,∞]> ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-block-end",
+ {
+ "name": "scroll-padding-block-end",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block-end",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-block-end",
+ "scrollPaddingBlockEnd"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-block-start",
+ {
+ "name": "scroll-padding-block-start",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block-start",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-block-start",
+ "scrollPaddingBlockStart"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-bottom",
+ {
+ "name": "scroll-padding-bottom",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-bottom",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-bottom",
+ "scrollPaddingBottom"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-inline",
+ {
+ "name": "scroll-padding-inline",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "see individual properties",
+ "animationType": "by computed value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "scroll-padding-inline",
+ "scrollPaddingInline"
+ ],
+ "syntax": "[ auto | <length-percentage [0,∞]> ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-inline-end",
+ {
+ "name": "scroll-padding-inline-end",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline-end",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-inline-end",
+ "scrollPaddingInlineEnd"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-inline-start",
+ {
+ "name": "scroll-padding-inline-start",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline-start",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-inline-start",
+ "scrollPaddingInlineStart"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-left",
+ {
+ "name": "scroll-padding-left",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-left",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-left",
+ "scrollPaddingLeft"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-right",
+ {
+ "name": "scroll-padding-right",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-right",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-right",
+ "scrollPaddingRight"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-padding-top",
+ {
+ "name": "scroll-padding-top",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-top",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "relative to the scroll container’s scrollport",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "scroll-padding",
+ "styleDeclaration": [
+ "scroll-padding-top",
+ "scrollPaddingTop"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-snap-align",
+ {
+ "name": "scroll-snap-align",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-snap-align",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "two keywords",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "scroll-snap-align",
+ "scrollSnapAlign"
+ ],
+ "syntax": "[ none | start | end | center ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-snap-stop",
+ {
+ "name": "scroll-snap-stop",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-snap-stop",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "scroll-snap-stop",
+ "scrollSnapStop"
+ ],
+ "syntax": "normal | always",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-snap-type",
+ {
+ "name": "scroll-snap-type",
+ "href": "https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-snap-type",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "scroll-snap-type",
+ "scrollSnapType"
+ ],
+ "syntax": "none | [ x | y | block | inline | both ] [ mandatory | proximity ]?",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-timeline",
+ {
+ "name": "scroll-timeline",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-scroll-timeline",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "not animatable",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "scroll-timeline",
+ "scrollTimeline"
+ ],
+ "syntax": "[ <'scroll-timeline-name'> <'scroll-timeline-axis'>? ]#",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-timeline-axis",
+ {
+ "name": "scroll-timeline-axis",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-scroll-timeline-axis",
+ "initial": "block",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "a list of the keywords specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "scroll-timeline-axis",
+ "scrollTimelineAxis"
+ ],
+ "syntax": "[ block | inline | x | y ]#",
+ "extended": []
+ }
+ ],
+ [
+ "scroll-timeline-name",
+ {
+ "name": "scroll-timeline-name",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-scroll-timeline-name",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list of CSS identifiers",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "scroll-timeline-name",
+ "scrollTimelineName"
+ ],
+ "syntax": "[ none | <dashed-ident> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "scrollbar-color",
+ {
+ "name": "scrollbar-color",
+ "href": "https://drafts.csswg.org/css-scrollbars-1/#propdef-scrollbar-color",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword or two computed colors",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "scrollbar-color",
+ "scrollbarColor"
+ ],
+ "syntax": "auto | <color>{2}",
+ "extended": []
+ }
+ ],
+ [
+ "scrollbar-gutter",
+ {
+ "name": "scrollbar-gutter",
+ "href": "https://drafts.csswg.org/css-overflow-3/#propdef-scrollbar-gutter",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "scrollbar-gutter",
+ "scrollbarGutter"
+ ],
+ "syntax": "auto | stable && both-edges?",
+ "extended": []
+ }
+ ],
+ [
+ "scrollbar-width",
+ {
+ "name": "scrollbar-width",
+ "href": "https://drafts.csswg.org/css-scrollbars-1/#propdef-scrollbar-width",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "scrollbar-width",
+ "scrollbarWidth"
+ ],
+ "syntax": "auto | thin | none",
+ "extended": []
+ }
+ ],
+ [
+ "shape-image-threshold",
+ {
+ "name": "shape-image-threshold",
+ "href": "https://drafts.csswg.org/css-shapes-1/#propdef-shape-image-threshold",
+ "initial": "0",
+ "appliesTo": "floats",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified number, clamped to the range [0,1]",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "shape-image-threshold",
+ "shapeImageThreshold"
+ ],
+ "syntax": "<opacity-value>",
+ "extended": []
+ }
+ ],
+ [
+ "shape-inside",
+ {
+ "name": "shape-inside",
+ "href": "https://drafts.csswg.org/css-shapes-2/#propdef-shape-inside",
+ "initial": "auto",
+ "appliesTo": "block-level elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "computed lengths for <basic-shape>, the absolute URL for <url>, otherwise as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "as defined for <basic-shape>, otherwise discrete",
+ "styleDeclaration": [
+ "shape-inside",
+ "shapeInside"
+ ],
+ "syntax": "auto | outside-shape | [ <basic-shape> || shape-box ] | <image> | display",
+ "extended": []
+ }
+ ],
+ [
+ "shape-margin",
+ {
+ "name": "shape-margin",
+ "href": "https://drafts.csswg.org/css-shapes-1/#propdef-shape-margin",
+ "initial": "0",
+ "appliesTo": "floats and initial letter boxes",
+ "inherited": "no",
+ "percentages": "refer to the inline size of the containing block",
+ "computedValue": "computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "shape-margin",
+ "shapeMargin"
+ ],
+ "syntax": "<length-percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "shape-outside",
+ {
+ "name": "shape-outside",
+ "href": "https://drafts.csswg.org/css-shapes-1/#propdef-shape-outside",
+ "initial": "none",
+ "appliesTo": "floats and initial letter boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as defined for <basic-shape> (with <shape-box> following, if supplied); else the computed <image>; else the keyword as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "as defined for <basic-shape>, otherwise discrete",
+ "styleDeclaration": [
+ "shape-outside",
+ "shapeOutside"
+ ],
+ "syntax": "none | [ <basic-shape> || <shape-box> ] | <image>",
+ "extended": []
+ }
+ ],
+ [
+ "shape-rendering",
+ {
+ "name": "shape-rendering",
+ "href": "https://svgwg.org/svg2-draft/painting.html#ShapeRenderingProperty",
+ "initial": "auto",
+ "appliesTo": "shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "shape-rendering",
+ "shapeRendering"
+ ],
+ "syntax": "auto | optimizeSpeed | crispEdges | geometricPrecision",
+ "extended": []
+ }
+ ],
+ [
+ "slider-orientation",
+ {
+ "name": "slider-orientation",
+ "href": "https://drafts.csswg.org/css-forms-1/#propdef-slider-orientation",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "slider-orientation",
+ "sliderOrientation"
+ ],
+ "syntax": "auto | left-to-right | right-to-left | top-to-bottom | bottom-to-top",
+ "extended": []
+ }
+ ],
+ [
+ "spatial-navigation-action",
+ {
+ "name": "spatial-navigation-action",
+ "href": "https://drafts.csswg.org/css-nav-1/#propdef-spatial-navigation-action",
+ "initial": "auto",
+ "appliesTo": "scroll containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "spatial-navigation-action",
+ "spatialNavigationAction"
+ ],
+ "syntax": "auto | focus | scroll",
+ "extended": []
+ }
+ ],
+ [
+ "spatial-navigation-contain",
+ {
+ "name": "spatial-navigation-contain",
+ "href": "https://drafts.csswg.org/css-nav-1/#propdef-spatial-navigation-contain",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "spatial-navigation-contain",
+ "spatialNavigationContain"
+ ],
+ "syntax": "auto | contain",
+ "extended": []
+ }
+ ],
+ [
+ "spatial-navigation-function",
+ {
+ "name": "spatial-navigation-function",
+ "href": "https://drafts.csswg.org/css-nav-1/#propdef-spatial-navigation-function",
+ "initial": "normal",
+ "appliesTo": "spatial navigation containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "spatial-navigation-function",
+ "spatialNavigationFunction"
+ ],
+ "syntax": "normal | grid",
+ "extended": []
+ }
+ ],
+ [
+ "speak",
+ {
+ "name": "speak",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-speak",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "speak"
+ ],
+ "syntax": "auto | never | always",
+ "extended": []
+ }
+ ],
+ [
+ "speak-as",
+ {
+ "name": "speak-as",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-speak-as",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "speak-as",
+ "speakAs"
+ ],
+ "syntax": "normal | spell-out || digits || [ literal-punctuation | no-punctuation ]",
+ "extended": []
+ }
+ ],
+ [
+ "stop-color",
+ {
+ "name": "stop-color",
+ "href": "https://svgwg.org/svg2-draft/pservers.html#StopColorProperty",
+ "styleDeclaration": [
+ "stop-color",
+ "stopColor"
+ ],
+ "extended": []
+ }
+ ],
+ [
+ "stop-opacity",
+ {
+ "name": "stop-opacity",
+ "href": "https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty",
+ "styleDeclaration": [
+ "stop-opacity",
+ "stopOpacity"
+ ],
+ "extended": []
+ }
+ ],
+ [
+ "string-set",
+ {
+ "name": "string-set",
+ "href": "https://drafts.csswg.org/css-content-3/#propdef-string-set",
+ "initial": "none",
+ "appliesTo": "all elements, but not pseudo-elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword none or a list, each item an identifier paired with a list of string values",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "string-set",
+ "stringSet"
+ ],
+ "syntax": "none | [ <custom-ident> <string>+ ]#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke",
+ {
+ "name": "stroke",
+ "href": "https://svgwg.org/svg2-draft/painting.html#StrokeProperty",
+ "initial": "none",
+ "appliesTo": "shapes and text content elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified, but with <color> values computed and <url> values made absolute",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "stroke"
+ ],
+ "syntax": "<paint>",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-align",
+ {
+ "name": "stroke-align",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-align",
+ "initial": "center",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-align",
+ "strokeAlign"
+ ],
+ "syntax": "center | inset | outset",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-alignment",
+ {
+ "name": "stroke-alignment",
+ "href": "https://svgwg.org/specs/strokes/#StrokeAlignmentProperty",
+ "initial": "center",
+ "appliesTo": "shapes and text content elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computed value": "as specified",
+ "animatable": "yes",
+ "styleDeclaration": [
+ "stroke-alignment",
+ "strokeAlignment"
+ ],
+ "syntax": "center | inner | outer",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-break",
+ {
+ "name": "stroke-break",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-break",
+ "initial": "bounding-box",
+ "appliesTo": "all elements",
+ "inherited": "?",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-break",
+ "strokeBreak"
+ ],
+ "syntax": "bounding-box | slice | clone",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-color",
+ {
+ "name": "stroke-color",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-color",
+ "initial": "transparent",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-color",
+ "strokeColor"
+ ],
+ "syntax": "<color>#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-dash-corner",
+ {
+ "name": "stroke-dash-corner",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-dash-corner",
+ "initial": "none",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value, with lengths made absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value if <length>, otherwise discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-dash-corner",
+ "strokeDashCorner"
+ ],
+ "syntax": "none | <length>",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-dash-justify",
+ {
+ "name": "stroke-dash-justify",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-dash-justify",
+ "initial": "none",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value, with lengths made absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-dash-justify",
+ "strokeDashJustify"
+ ],
+ "syntax": "none | [ stretch | compress ] || [ dashes || gaps ]",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-dashadjust",
+ {
+ "name": "stroke-dashadjust",
+ "href": "https://svgwg.org/specs/strokes/#StrokeDashadjustProperty",
+ "initial": "none",
+ "appliesTo": "shapes and text content elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computed value": "as specified",
+ "animatable": "yes",
+ "styleDeclaration": [
+ "stroke-dashadjust",
+ "strokeDashadjust"
+ ],
+ "syntax": "none | [stretch | compress] [dashes | gaps]?",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-dasharray",
+ {
+ "name": "stroke-dasharray",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-dasharray",
+ "initial": "none",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "relative to the scaled viewport size",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-dasharray",
+ "strokeDasharray"
+ ],
+ "syntax": "none | [<length-percentage> | <number>]+#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-dashcorner",
+ {
+ "name": "stroke-dashcorner",
+ "href": "https://svgwg.org/specs/strokes/#StrokeDashcornerProperty",
+ "initial": "none",
+ "appliesTo": "shapes and text content elements",
+ "inherited": "yes",
+ "percentages": "refer to the size of the current viewport (see Units)",
+ "media": "visual",
+ "computed value": "absolute length or keyword specified",
+ "animatable": "yes",
+ "styleDeclaration": [
+ "stroke-dashcorner",
+ "strokeDashcorner"
+ ],
+ "syntax": "none | <length>",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-dashoffset",
+ {
+ "name": "stroke-dashoffset",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-dashoffset",
+ "initial": "0",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "relative to the scaled viewport size",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-dashoffset",
+ "strokeDashoffset"
+ ],
+ "syntax": "<length-percentage> | <number>",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-image",
+ {
+ "name": "stroke-image",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-image",
+ "initial": "none",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified, with any <image> computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-image",
+ "strokeImage"
+ ],
+ "syntax": "<paint>#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-linecap",
+ {
+ "name": "stroke-linecap",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-linecap",
+ "initial": "butt",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-linecap",
+ "strokeLinecap"
+ ],
+ "syntax": "butt | round | square",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-linejoin",
+ {
+ "name": "stroke-linejoin",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-linejoin",
+ "initial": "miter",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-linejoin",
+ "strokeLinejoin"
+ ],
+ "syntax": "[ crop | arcs | miter ] || [ bevel | round | fallback ]",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-miterlimit",
+ {
+ "name": "stroke-miterlimit",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-miterlimit",
+ "initial": "4",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "a number",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-miterlimit",
+ "strokeMiterlimit"
+ ],
+ "syntax": "<number>",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-opacity",
+ {
+ "name": "stroke-opacity",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-opacity",
+ "initial": "1",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the specified value converted to a <number>, clamped to the range [0,1]",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-opacity",
+ "strokeOpacity"
+ ],
+ "syntax": "<'opacity'>",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-origin",
+ {
+ "name": "stroke-origin",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-origin",
+ "initial": "match-parent",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-origin",
+ "strokeOrigin"
+ ],
+ "syntax": "match-parent | fill-box | stroke-box | content-box | padding-box | border-box",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-position",
+ {
+ "name": "stroke-position",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-position",
+ "initial": "0% 0%",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "A list, each item consisting of: a pair of offsets (horizontal and vertical) from the top left origin each given as a combination of an absolute length and a percentage",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-position",
+ "strokePosition"
+ ],
+ "syntax": "<position>#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-repeat",
+ {
+ "name": "stroke-repeat",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-repeat",
+ "initial": "repeat",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "A list, each item consisting of: two keywords, one per dimension",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-repeat",
+ "strokeRepeat"
+ ],
+ "syntax": "<repeat-style>#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-size",
+ {
+ "name": "stroke-size",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-size",
+ "initial": "auto",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "as specified, but with lengths made absolute and omitted auto keywords filled in",
+ "canonicalOrder": "per grammar",
+ "animationType": "repeatable list",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-size",
+ "strokeSize"
+ ],
+ "syntax": "<bg-size>#",
+ "extended": []
+ }
+ ],
+ [
+ "stroke-width",
+ {
+ "name": "stroke-width",
+ "href": "https://drafts.fxtf.org/fill-stroke-3/#propdef-stroke-width",
+ "initial": "1px",
+ "appliesTo": "text and SVG shapes",
+ "inherited": "yes",
+ "percentages": "relative to the scaled viewport size",
+ "computedValue": "the absolute length, or percentage",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "media": "visual",
+ "styleDeclaration": [
+ "stroke-width",
+ "strokeWidth"
+ ],
+ "syntax": "[<length-percentage> | <number>]#",
+ "extended": []
+ }
+ ],
+ [
+ "tab-size",
+ {
+ "name": "tab-size",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-tab-size",
+ "initial": "8",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the specified number or absolute length",
+ "canonicalOrder": "n/a",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "tab-size",
+ "tabSize"
+ ],
+ "syntax": "<number [0,∞]> | <length [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "table-layout",
+ {
+ "name": "table-layout",
+ "href": "https://drafts.csswg.org/css-tables-3/#propdef-table-layout",
+ "initial": "auto",
+ "appliesTo": "table grid boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "table-layout",
+ "tableLayout"
+ ],
+ "syntax": "auto | fixed",
+ "extended": []
+ }
+ ],
+ [
+ "text-align",
+ {
+ "name": "text-align",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-align",
+ "initial": "start",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "discrete",
+ "canonicalOrder": "n/a",
+ "styleDeclaration": [
+ "text-align",
+ "textAlign"
+ ],
+ "syntax": "start | end | left | right | center | <string> | justify | match-parent | justify-all",
+ "extended": []
+ }
+ ],
+ [
+ "text-align-all",
+ {
+ "name": "text-align-all",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-align-all",
+ "initial": "start",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "keyword as specified, except for match-parent which computes as defined above",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-align-all",
+ "textAlignAll"
+ ],
+ "syntax": "start | end | left | right | center | <string> | justify | match-parent",
+ "extended": []
+ }
+ ],
+ [
+ "text-align-last",
+ {
+ "name": "text-align-last",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-align-last",
+ "initial": "auto",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "keyword as specified, except for match-parent which computes as defined above",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-align-last",
+ "textAlignLast"
+ ],
+ "syntax": "auto | start | end | left | right | center | justify | match-parent",
+ "extended": []
+ }
+ ],
+ [
+ "text-anchor",
+ {
+ "name": "text-anchor",
+ "href": "https://svgwg.org/svg2-draft/text.html#TextAnchorProperty",
+ "initial": "start",
+ "appliesTo": "text content elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-anchor",
+ "textAnchor"
+ ],
+ "syntax": "start | middle | end",
+ "extended": []
+ }
+ ],
+ [
+ "text-autospace",
+ {
+ "name": "text-autospace",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-autospace",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-autospace",
+ "textAutospace"
+ ],
+ "syntax": "normal | <autospace> | auto",
+ "extended": []
+ }
+ ],
+ [
+ "text-box",
+ {
+ "name": "text-box",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-text-box",
+ "initial": "normal",
+ "appliesTo": "block containers, multi-column containers, and inline boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-box",
+ "textBox"
+ ],
+ "syntax": "normal | <'text-box-trim'> || <'text-box-edge'>",
+ "extended": []
+ }
+ ],
+ [
+ "text-box-edge",
+ {
+ "name": "text-box-edge",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-text-box-edge",
+ "initial": "auto",
+ "appliesTo": "block containers and inline boxes",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-box-edge",
+ "textBoxEdge"
+ ],
+ "syntax": "auto | <text-edge>",
+ "extended": []
+ }
+ ],
+ [
+ "text-box-trim",
+ {
+ "name": "text-box-trim",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-text-box-trim",
+ "initial": "none",
+ "appliesTo": "block containers, multi-column containers, and inline boxes",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-box-trim",
+ "textBoxTrim"
+ ],
+ "syntax": "none | trim-start | trim-end | trim-both",
+ "extended": []
+ }
+ ],
+ [
+ "text-combine-upright",
+ {
+ "name": "text-combine-upright",
+ "href": "https://drafts.csswg.org/css-writing-modes-4/#propdef-text-combine-upright",
+ "initial": "none",
+ "appliesTo": "inline boxes and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword, plus integer if digits",
+ "canonicalOrder": "n/a",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "text-combine-upright",
+ "textCombineUpright"
+ ],
+ "syntax": "none | all | [ digits <integer [2,4]>? ]",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration",
+ {
+ "name": "text-decoration",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "text-decoration",
+ "textDecoration"
+ ],
+ "syntax": "<'text-decoration-line'> || <'text-decoration-thickness'> || <'text-decoration-style'> || <'text-decoration-color'>",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-color",
+ {
+ "name": "text-decoration-color",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-color",
+ "initial": "currentcolor",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "text-decoration-color",
+ "textDecorationColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-line",
+ {
+ "name": "text-decoration-line",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-line",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no (but see prose, above)",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-line",
+ "textDecorationLine"
+ ],
+ "syntax": "none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-skip",
+ {
+ "name": "text-decoration-skip",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-skip",
+ "initial": "See individual properties",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "See individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-skip",
+ "textDecorationSkip"
+ ],
+ "syntax": "none | auto",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-skip-box",
+ {
+ "name": "text-decoration-skip-box",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-skip-box",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-skip-box",
+ "textDecorationSkipBox"
+ ],
+ "syntax": "none | all",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-skip-ink",
+ {
+ "name": "text-decoration-skip-ink",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-skip-ink",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-skip-ink",
+ "textDecorationSkipInk"
+ ],
+ "syntax": "auto | none | all",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-skip-self",
+ {
+ "name": "text-decoration-skip-self",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-skip-self",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s) except for skip-all, see below",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-skip-self",
+ "textDecorationSkipSelf"
+ ],
+ "syntax": "auto | skip-all | [ skip-underline || skip-overline || skip-line-through ] | no-skip",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-skip-spaces",
+ {
+ "name": "text-decoration-skip-spaces",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-skip-spaces",
+ "initial": "start end",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-skip-spaces",
+ "textDecorationSkipSpaces"
+ ],
+ "syntax": "none | all | [ start || end ]",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-style",
+ {
+ "name": "text-decoration-style",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-style",
+ "initial": "solid",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-decoration-style",
+ "textDecorationStyle"
+ ],
+ "syntax": "solid | double | dotted | dashed | wavy",
+ "extended": []
+ }
+ ],
+ [
+ "text-decoration-thickness",
+ {
+ "name": "text-decoration-thickness",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-decoration-thickness",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "text-decoration-thickness",
+ "textDecorationThickness"
+ ],
+ "syntax": "auto | from-font | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "text-emphasis",
+ {
+ "name": "text-emphasis",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-emphasis",
+ "initial": "see individual properties",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "text-emphasis",
+ "textEmphasis"
+ ],
+ "syntax": "<'text-emphasis-style'> || <'text-emphasis-color'>",
+ "extended": []
+ }
+ ],
+ [
+ "text-emphasis-color",
+ {
+ "name": "text-emphasis-color",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-emphasis-color",
+ "initial": "currentcolor",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "computed color",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "text-emphasis-color",
+ "textEmphasisColor"
+ ],
+ "syntax": "<color>",
+ "extended": []
+ }
+ ],
+ [
+ "text-emphasis-position",
+ {
+ "name": "text-emphasis-position",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-emphasis-position",
+ "initial": "over right",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-emphasis-position",
+ "textEmphasisPosition"
+ ],
+ "syntax": "[ over | under ] && [ right | left ]?",
+ "extended": []
+ }
+ ],
+ [
+ "text-emphasis-skip",
+ {
+ "name": "text-emphasis-skip",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-emphasis-skip",
+ "initial": "spaces punctuation",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-emphasis-skip",
+ "textEmphasisSkip"
+ ],
+ "syntax": "spaces || punctuation || symbols || narrow",
+ "extended": []
+ }
+ ],
+ [
+ "text-emphasis-style",
+ {
+ "name": "text-emphasis-style",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-emphasis-style",
+ "initial": "none",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "the keyword none, a pair of keywords representing the shape and fill, or a string",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-emphasis-style",
+ "textEmphasisStyle"
+ ],
+ "syntax": "none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>",
+ "extended": []
+ }
+ ],
+ [
+ "text-group-align",
+ {
+ "name": "text-group-align",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-group-align",
+ "initial": "none",
+ "appliesTo": "block containers",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-group-align",
+ "textGroupAlign"
+ ],
+ "syntax": "none | start | end | left | right | center",
+ "extended": []
+ }
+ ],
+ [
+ "text-indent",
+ {
+ "name": "text-indent",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-indent",
+ "initial": "0",
+ "appliesTo": "block containers",
+ "inherited": "yes",
+ "percentages": "refers to block container’s own inline-axis inner size",
+ "computedValue": "computed <length-percentage> value, plus any specified keywords",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "text-indent",
+ "textIndent"
+ ],
+ "syntax": "[ <length-percentage> ] && hanging? && each-line?",
+ "extended": []
+ }
+ ],
+ [
+ "text-justify",
+ {
+ "name": "text-justify",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-justify",
+ "initial": "auto",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword (except for the distribute legacy value)",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-justify",
+ "textJustify"
+ ],
+ "syntax": "[ auto | none | inter-word | inter-character | ruby ] || no-compress",
+ "extended": []
+ }
+ ],
+ [
+ "text-orientation",
+ {
+ "name": "text-orientation",
+ "href": "https://drafts.csswg.org/css-writing-modes-4/#propdef-text-orientation",
+ "initial": "mixed",
+ "appliesTo": "all elements except table row groups, rows, column groups, and columns; and text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "n/a",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "text-orientation",
+ "textOrientation"
+ ],
+ "syntax": "mixed | upright | sideways",
+ "extended": []
+ }
+ ],
+ [
+ "text-overflow",
+ {
+ "name": "text-overflow",
+ "href": "https://drafts.csswg.org/css-overflow-4/#propdef-text-overflow",
+ "initial": "clip",
+ "appliesTo": "block containers",
+ "inherited": "no",
+ "percentages": "refer to the width of the line box",
+ "computedValue": "as specified, with lengths made absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "text-overflow",
+ "textOverflow"
+ ],
+ "syntax": "[ clip | ellipsis | <string> | fade | <fade()> ]{1,2}",
+ "extended": []
+ }
+ ],
+ [
+ "text-rendering",
+ {
+ "name": "text-rendering",
+ "href": "https://svgwg.org/svg2-draft/painting.html#TextRenderingProperty",
+ "initial": "auto",
+ "appliesTo": "‘text’",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-rendering",
+ "textRendering"
+ ],
+ "syntax": "auto | optimizeSpeed | optimizeLegibility | geometricPrecision",
+ "extended": []
+ }
+ ],
+ [
+ "text-shadow",
+ {
+ "name": "text-shadow",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-shadow",
+ "initial": "none",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "either the keyword none or a list, each item consisting of four absolute lengths plus a computed color and optionally also an inset keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "as shadow list",
+ "styleDeclaration": [
+ "text-shadow",
+ "textShadow"
+ ],
+ "syntax": "none | <shadow>#",
+ "extended": []
+ }
+ ],
+ [
+ "text-spacing",
+ {
+ "name": "text-spacing",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-spacing",
+ "initial": "see individual properties",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "animationType": "discrete",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "text-spacing",
+ "textSpacing"
+ ],
+ "syntax": "none | auto | <spacing-trim> || <autospace>",
+ "extended": []
+ }
+ ],
+ [
+ "text-spacing-trim",
+ {
+ "name": "text-spacing-trim",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-spacing-trim",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-spacing-trim",
+ "textSpacingTrim"
+ ],
+ "syntax": "<spacing-trim> | auto",
+ "extended": []
+ }
+ ],
+ [
+ "text-transform",
+ {
+ "name": "text-transform",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-transform",
+ "initial": "none",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-transform",
+ "textTransform"
+ ],
+ "syntax": "none | [capitalize | uppercase | lowercase ] || full-width || full-size-kana | math-auto",
+ "extended": []
+ }
+ ],
+ [
+ "text-underline-offset",
+ {
+ "name": "text-underline-offset",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-underline-offset",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "text-underline-offset",
+ "textUnderlineOffset"
+ ],
+ "syntax": "auto | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "text-underline-position",
+ {
+ "name": "text-underline-position",
+ "href": "https://drafts.csswg.org/css-text-decor-4/#propdef-text-underline-position",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-underline-position",
+ "textUnderlinePosition"
+ ],
+ "syntax": "auto | [ from-font | under ] || [ left | right ]",
+ "extended": []
+ }
+ ],
+ [
+ "text-wrap",
+ {
+ "name": "text-wrap",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-wrap",
+ "initial": "wrap",
+ "appliesTo": "see individual properties",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "animationType": "see individual properties",
+ "styleDeclaration": [
+ "text-wrap",
+ "textWrap"
+ ],
+ "syntax": "<'text-wrap-mode'> || <'text-wrap-style'>",
+ "extended": []
+ }
+ ],
+ [
+ "text-wrap-mode",
+ {
+ "name": "text-wrap-mode",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-wrap-mode",
+ "initial": "wrap",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-wrap-mode",
+ "textWrapMode"
+ ],
+ "syntax": "wrap | nowrap",
+ "extended": []
+ }
+ ],
+ [
+ "text-wrap-style",
+ {
+ "name": "text-wrap-style",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-text-wrap-style",
+ "initial": "auto",
+ "appliesTo": "block containers hat establish an inline formatting context",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "text-wrap-style",
+ "textWrapStyle"
+ ],
+ "syntax": "auto | balance | stable | pretty | avoid-orphans",
+ "extended": []
+ }
+ ],
+ [
+ "timeline-scope",
+ {
+ "name": "timeline-scope",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-timeline-scope",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list of CSS identifiers",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "timeline-scope",
+ "timelineScope"
+ ],
+ "syntax": "none | all | <dashed-ident>#",
+ "extended": []
+ }
+ ],
+ [
+ "top",
+ {
+ "name": "top",
+ "href": "https://drafts.csswg.org/css-position-3/#propdef-top",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "refer to size of containing block; see prose",
+ "computedValue": "the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "logicalPropertyGroup": "inset",
+ "styleDeclaration": [
+ "top"
+ ],
+ "syntax": "auto | <length-percentage> | <anchor()> | <anchor-size()>",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/"
+ ]
+ }
+ ],
+ [
+ "transform",
+ {
+ "name": "transform",
+ "href": "https://drafts.csswg.org/css-transforms-1/#propdef-transform",
+ "initial": "none",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "refer to the size of reference box",
+ "computedValue": "as specified, but with lengths made absolute",
+ "canonicalOrder": "per grammar",
+ "animationType": "transform list, see interpolation rules",
+ "styleDeclaration": [
+ "transform"
+ ],
+ "syntax": "none | <transform-list>",
+ "extended": []
+ }
+ ],
+ [
+ "transform-box",
+ {
+ "name": "transform-box",
+ "href": "https://drafts.csswg.org/css-transforms-1/#propdef-transform-box",
+ "initial": "view-box",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "transform-box",
+ "transformBox"
+ ],
+ "syntax": "content-box | border-box | fill-box | stroke-box | view-box",
+ "extended": []
+ }
+ ],
+ [
+ "transform-origin",
+ {
+ "name": "transform-origin",
+ "href": "https://drafts.csswg.org/css-transforms-1/#propdef-transform-origin",
+ "initial": "50% 50%",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "refer to the size of reference box",
+ "computedValue": "see background-position",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value",
+ "styleDeclaration": [
+ "transform-origin",
+ "transformOrigin"
+ ],
+ "syntax": "[ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] <length>? | [ [ center | left | right ] && [ center | top | bottom ] ] <length>?",
+ "extended": []
+ }
+ ],
+ [
+ "transform-style",
+ {
+ "name": "transform-style",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-transform-style",
+ "initial": "flat",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "usedValue": "flat if a grouping property is present, specified keyword otherwise",
+ "styleDeclaration": [
+ "transform-style",
+ "transformStyle"
+ ],
+ "syntax": "flat | preserve-3d",
+ "extended": []
+ }
+ ],
+ [
+ "transition",
+ {
+ "name": "transition",
+ "href": "https://drafts.csswg.org/css-transitions-1/#propdef-transition",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "not animatable",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "transition"
+ ],
+ "syntax": "<single-transition>#",
+ "extended": []
+ }
+ ],
+ [
+ "transition-behavior",
+ {
+ "name": "transition-behavior",
+ "href": "https://drafts.csswg.org/css-transitions-2/#propdef-transition-behavior",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "transition-behavior",
+ "transitionBehavior"
+ ],
+ "syntax": "<transition-behavior-value>#",
+ "extended": []
+ }
+ ],
+ [
+ "transition-delay",
+ {
+ "name": "transition-delay",
+ "href": "https://drafts.csswg.org/css-transitions-1/#propdef-transition-delay",
+ "initial": "0s",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a duration",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "transition-delay",
+ "transitionDelay"
+ ],
+ "syntax": "<time>#",
+ "extended": []
+ }
+ ],
+ [
+ "transition-duration",
+ {
+ "name": "transition-duration",
+ "href": "https://drafts.csswg.org/css-transitions-1/#propdef-transition-duration",
+ "initial": "0s",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "list, each item a duration",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "transition-duration",
+ "transitionDuration"
+ ],
+ "syntax": "<time [0s,∞]>#",
+ "extended": []
+ }
+ ],
+ [
+ "transition-property",
+ {
+ "name": "transition-property",
+ "href": "https://drafts.csswg.org/css-transitions-1/#propdef-transition-property",
+ "initial": "all",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "the keyword none else a list of identifiers",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "transition-property",
+ "transitionProperty"
+ ],
+ "syntax": "none | <single-transition-property>#",
+ "extended": []
+ }
+ ],
+ [
+ "transition-timing-function",
+ {
+ "name": "transition-timing-function",
+ "href": "https://drafts.csswg.org/css-transitions-1/#propdef-transition-timing-function",
+ "initial": "ease",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "transition-timing-function",
+ "transitionTimingFunction"
+ ],
+ "syntax": "<easing-function>#",
+ "extended": []
+ }
+ ],
+ [
+ "translate",
+ {
+ "name": "translate",
+ "href": "https://drafts.csswg.org/css-transforms-2/#propdef-translate",
+ "initial": "none",
+ "appliesTo": "transformable elements",
+ "inherited": "no",
+ "percentages": "relative to the width of the reference box (for the first value) or the height (for the second value)",
+ "computedValue": "the keyword none or a pair of computed <length-percentage> values and an absolute length",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value, but see below for none",
+ "styleDeclaration": [
+ "translate"
+ ],
+ "syntax": "none | <length-percentage> [ <length-percentage> <length>? ]?",
+ "extended": []
+ }
+ ],
+ [
+ "unicode-bidi",
+ {
+ "name": "unicode-bidi",
+ "href": "https://drafts.csswg.org/css-writing-modes-4/#propdef-unicode-bidi",
+ "initial": "normal",
+ "appliesTo": "all elements, but see prose",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "unicode-bidi",
+ "unicodeBidi"
+ ],
+ "syntax": "normal | embed | isolate | bidi-override | isolate-override | plaintext",
+ "extended": []
+ }
+ ],
+ [
+ "user-select",
+ {
+ "name": "user-select",
+ "href": "https://drafts.csswg.org/css-ui-4/#propdef-user-select",
+ "initial": "auto",
+ "appliesTo": "all elements, and optionally to the ::before and ::after pseudo-elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "user-select",
+ "userSelect"
+ ],
+ "syntax": "auto | text | none | contain | all",
+ "extended": []
+ }
+ ],
+ [
+ "vector-effect",
+ {
+ "name": "vector-effect",
+ "href": "https://svgwg.org/svg2-draft/coords.html#VectorEffectProperty",
+ "initial": "none",
+ "appliesTo": "graphics elements and ‘use’",
+ "inherited": "no",
+ "percentages": "N/A",
+ "media": "visual",
+ "computedValue": "as specified",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "vector-effect",
+ "vectorEffect"
+ ],
+ "syntax": "none | non-scaling-stroke | non-scaling-size | non-rotation | fixed-position",
+ "extended": []
+ }
+ ],
+ [
+ "vertical-align",
+ {
+ "name": "vertical-align",
+ "href": "https://drafts.csswg.org/css-inline-3/#propdef-vertical-align",
+ "initial": "baseline",
+ "appliesTo": "see individual properties",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "vertical-align",
+ "verticalAlign"
+ ],
+ "syntax": "[ first | last] || <'alignment-baseline'> || <'baseline-shift'>",
+ "extended": []
+ }
+ ],
+ [
+ "view-timeline",
+ {
+ "name": "view-timeline",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-view-timeline",
+ "initial": "see individual properties",
+ "appliesTo": "all elements",
+ "inherited": "see individual properties",
+ "percentages": "see individual properties",
+ "computedValue": "see individual properties",
+ "animationType": "see individual properties",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "view-timeline",
+ "viewTimeline"
+ ],
+ "syntax": "[ <'view-timeline-name'> [ <'view-timeline-axis'> || <'view-timeline-inset'> ]? ]#",
+ "extended": []
+ }
+ ],
+ [
+ "view-timeline-axis",
+ {
+ "name": "view-timeline-axis",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-view-timeline-axis",
+ "initial": "block",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "a list of the keywords specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "view-timeline-axis",
+ "viewTimelineAxis"
+ ],
+ "syntax": "[ block | inline | x | y ]#",
+ "extended": []
+ }
+ ],
+ [
+ "view-timeline-inset",
+ {
+ "name": "view-timeline-inset",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-view-timeline-inset",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "relative to the corresponding dimension of the relevant scrollport",
+ "computedValue": "a list consisting of two-value pairs representing the start and end insets each as either the keyword auto or a computed <length-percentage> value",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "view-timeline-inset",
+ "viewTimelineInset"
+ ],
+ "syntax": "[ [ auto | <length-percentage> ]{1,2} ]#",
+ "extended": []
+ }
+ ],
+ [
+ "view-timeline-name",
+ {
+ "name": "view-timeline-name",
+ "href": "https://drafts.csswg.org/scroll-animations-1/#propdef-view-timeline-name",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "the keyword none or a list of CSS identifiers",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "view-timeline-name",
+ "viewTimelineName"
+ ],
+ "syntax": "[ none | <dashed-ident> ]#",
+ "extended": []
+ }
+ ],
+ [
+ "view-transition-class",
+ {
+ "name": "view-transition-class",
+ "href": "https://drafts.csswg.org/css-view-transitions-2/#propdef-view-transition-class",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "view-transition-class",
+ "viewTransitionClass"
+ ],
+ "syntax": "none | <custom-ident>+",
+ "extended": []
+ }
+ ],
+ [
+ "view-transition-group",
+ {
+ "name": "view-transition-group",
+ "href": "https://drafts.csswg.org/css-view-transitions-2/#propdef-view-transition-group",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "view-transition-group",
+ "viewTransitionGroup"
+ ],
+ "syntax": "normal | contain | nearest | <custom-ident>",
+ "extended": []
+ }
+ ],
+ [
+ "view-transition-name",
+ {
+ "name": "view-transition-name",
+ "href": "https://drafts.csswg.org/css-view-transitions-2/#propdef-view-transition-name",
+ "initial": "none",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "view-transition-name",
+ "viewTransitionName"
+ ],
+ "syntax": "none | <custom-ident>",
+ "extended": []
+ }
+ ],
+ [
+ "visibility",
+ {
+ "name": "visibility",
+ "href": "https://drafts.csswg.org/css-display-4/#propdef-visibility",
+ "initial": "visible",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "media": "visual",
+ "styleDeclaration": [
+ "visibility"
+ ],
+ "syntax": "visible | hidden | force-hidden | collapse",
+ "extended": []
+ }
+ ],
+ [
+ "voice-balance",
+ {
+ "name": "voice-balance",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-balance",
+ "initial": "center",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "the specified value resolved to a <number> between -100 and 100 (inclusive)",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-balance",
+ "voiceBalance"
+ ],
+ "syntax": "<number> | left | center | right | leftwards | rightwards",
+ "extended": []
+ }
+ ],
+ [
+ "voice-duration",
+ {
+ "name": "voice-duration",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-duration",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-duration",
+ "voiceDuration"
+ ],
+ "syntax": "auto | <time [0s,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "voice-family",
+ {
+ "name": "voice-family",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-family",
+ "initial": "implementation-dependent",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-family",
+ "voiceFamily"
+ ],
+ "syntax": "[[<family-name> | <generic-voice>],]* [<family-name> | <generic-voice>] | preserve",
+ "extended": []
+ }
+ ],
+ [
+ "voice-pitch",
+ {
+ "name": "voice-pitch",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-pitch",
+ "initial": "medium",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "refer to inherited value",
+ "computedValue": "one of the predefined pitch keywords if only the keyword is specified by itself, otherwise an absolute frequency calculated by converting the keyword value (if any) to a fixed frequency based on the current voice-family and by applying the specified relative offset (if any)",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-pitch",
+ "voicePitch"
+ ],
+ "syntax": "<frequency [0Hz,∞]> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]]",
+ "extended": []
+ }
+ ],
+ [
+ "voice-range",
+ {
+ "name": "voice-range",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-range",
+ "initial": "medium",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "refer to inherited value",
+ "computedValue": "one of the predefined pitch keywords if only the keyword is specified by itself, otherwise an absolute frequency calculated by converting the keyword value (if any) to a fixed frequency based on the current voice-family and by applying the specified relative offset (if any)",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-range",
+ "voiceRange"
+ ],
+ "syntax": "<frequency [0Hz,∞]> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]]",
+ "extended": []
+ }
+ ],
+ [
+ "voice-rate",
+ {
+ "name": "voice-rate",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-rate",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "refer to default value",
+ "computedValue": "a keyword value, and optionally also a percentage relative to the keyword (if not 100%)",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-rate",
+ "voiceRate"
+ ],
+ "syntax": "[normal | x-slow | slow | medium | fast | x-fast] || <percentage [0,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "voice-stress",
+ {
+ "name": "voice-stress",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-stress",
+ "initial": "normal",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-stress",
+ "voiceStress"
+ ],
+ "syntax": "normal | strong | moderate | none | reduced",
+ "extended": []
+ }
+ ],
+ [
+ "voice-volume",
+ {
+ "name": "voice-volume",
+ "href": "https://drafts.csswg.org/css-speech-1/#propdef-voice-volume",
+ "initial": "medium",
+ "appliesTo": "all elements",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "silent, or a keyword value and optionally also a decibel offset (if not zero)",
+ "canonicalOrder": "per grammar",
+ "styleDeclaration": [
+ "voice-volume",
+ "voiceVolume"
+ ],
+ "syntax": "silent | [[x-soft | soft | medium | loud | x-loud] || <decibel>]",
+ "extended": []
+ }
+ ],
+ [
+ "white-space",
+ {
+ "name": "white-space",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-white-space",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "see individual properties",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "white-space",
+ "whiteSpace"
+ ],
+ "syntax": "normal | pre | pre-wrap | pre-line | <'white-space-collapse'> || <'text-wrap-mode'> || <'white-space-trim'>",
+ "extended": []
+ }
+ ],
+ [
+ "white-space-collapse",
+ {
+ "name": "white-space-collapse",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-white-space-collapse",
+ "initial": "collapse",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "white-space-collapse",
+ "whiteSpaceCollapse"
+ ],
+ "syntax": "collapse | discard | preserve | preserve-breaks | preserve-spaces | break-spaces",
+ "extended": []
+ }
+ ],
+ [
+ "white-space-trim",
+ {
+ "name": "white-space-trim",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-white-space-trim",
+ "initial": "none",
+ "appliesTo": "inline boxes and block containers",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword(s)",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "white-space-trim",
+ "whiteSpaceTrim"
+ ],
+ "syntax": "none | discard-before || discard-after || discard-inner",
+ "extended": []
+ }
+ ],
+ [
+ "widows",
+ {
+ "name": "widows",
+ "href": "https://drafts.csswg.org/css-break-4/#propdef-widows",
+ "initial": "2",
+ "appliesTo": "block containers that establish an inline formatting context",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified integer",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "widows"
+ ],
+ "syntax": "<integer [1,∞]>",
+ "extended": []
+ }
+ ],
+ [
+ "width",
+ {
+ "name": "width",
+ "href": "https://drafts.csswg.org/css-sizing-3/#propdef-width",
+ "initial": "auto",
+ "appliesTo": "all elements except non-replaced inlines",
+ "inherited": "no",
+ "percentages": "relative to width/height of containing block",
+ "computedValue": "as specified, with <length-percentage> values computed",
+ "canonicalOrder": "per grammar",
+ "animationType": "by computed value type, recursing into fit-content()",
+ "logicalPropertyGroup": "size",
+ "styleDeclaration": [
+ "width"
+ ],
+ "syntax": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content(<length-percentage [0,∞]>) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain",
+ "extended": [
+ "https://drafts.csswg.org/css-anchor-position-1/",
+ "https://drafts.csswg.org/css-sizing-4/"
+ ]
+ }
+ ],
+ [
+ "will-change",
+ {
+ "name": "will-change",
+ "href": "https://drafts.csswg.org/css-will-change-1/#propdef-will-change",
+ "initial": "auto",
+ "appliesTo": "all elements",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "per grammar",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "will-change",
+ "willChange"
+ ],
+ "syntax": "auto | <animateable-feature>#",
+ "extended": []
+ }
+ ],
+ [
+ "word-break",
+ {
+ "name": "word-break",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-word-break",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "word-break",
+ "wordBreak"
+ ],
+ "syntax": "normal | break-all | keep-all | manual | auto-phrase | break-word",
+ "extended": []
+ }
+ ],
+ [
+ "word-space-transform",
+ {
+ "name": "word-space-transform",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-word-space-transform",
+ "initial": "none",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "word-space-transform",
+ "wordSpaceTransform"
+ ],
+ "syntax": "none | [ space | ideographic-space ] && auto-phrase?",
+ "extended": []
+ }
+ ],
+ [
+ "word-spacing",
+ {
+ "name": "word-spacing",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-word-spacing",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "relative to computed font-size, i.e. 1em",
+ "computedValue": "an absolute length and/or a percentage",
+ "canonicalOrder": "n/a",
+ "animationType": "by computed value type",
+ "styleDeclaration": [
+ "word-spacing",
+ "wordSpacing"
+ ],
+ "syntax": "normal | <length-percentage>",
+ "extended": []
+ }
+ ],
+ [
+ "word-wrap",
+ {
+ "name": "word-wrap",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-word-wrap",
+ "initial": "normal",
+ "appliesTo": "text",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "n/a",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "word-wrap",
+ "wordWrap"
+ ],
+ "syntax": "normal | break-word | anywhere",
+ "extended": []
+ }
+ ],
+ [
+ "wrap-after",
+ {
+ "name": "wrap-after",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-wrap-after",
+ "initial": "auto",
+ "appliesTo": "inline-level boxes and flex items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "wrap-after",
+ "wrapAfter"
+ ],
+ "syntax": "auto | avoid | avoid-line | avoid-flex | line | flex",
+ "extended": []
+ }
+ ],
+ [
+ "wrap-before",
+ {
+ "name": "wrap-before",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-wrap-before",
+ "initial": "auto",
+ "appliesTo": "inline-level boxes and flex items",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "wrap-before",
+ "wrapBefore"
+ ],
+ "syntax": "auto | avoid | avoid-line | avoid-flex | line | flex",
+ "extended": []
+ }
+ ],
+ [
+ "wrap-flow",
+ {
+ "name": "wrap-flow",
+ "href": "https://drafts.csswg.org/css-exclusions-1/#propdef-wrap-flow",
+ "initial": "auto",
+ "appliesTo": "block-level elements.",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified except for element’s whose float computed value is not none, in which case the computed value is auto.",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "wrap-flow",
+ "wrapFlow"
+ ],
+ "syntax": "auto | both | start | end | minimum | maximum | clear",
+ "extended": []
+ }
+ ],
+ [
+ "wrap-inside",
+ {
+ "name": "wrap-inside",
+ "href": "https://drafts.csswg.org/css-text-4/#propdef-wrap-inside",
+ "initial": "auto",
+ "appliesTo": "inline boxes",
+ "inherited": "no",
+ "percentages": "n/a",
+ "computedValue": "specified keyword",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "wrap-inside",
+ "wrapInside"
+ ],
+ "syntax": "auto | avoid",
+ "extended": []
+ }
+ ],
+ [
+ "wrap-through",
+ {
+ "name": "wrap-through",
+ "href": "https://drafts.csswg.org/css-exclusions-1/#propdef-wrap-through",
+ "initial": "wrap",
+ "appliesTo": "block-level elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "animationType": "discrete",
+ "styleDeclaration": [
+ "wrap-through",
+ "wrapThrough"
+ ],
+ "syntax": "wrap | none",
+ "extended": []
+ }
+ ],
+ [
+ "writing-mode",
+ {
+ "name": "writing-mode",
+ "href": "https://drafts.csswg.org/css-writing-modes-4/#propdef-writing-mode",
+ "initial": "horizontal-tb",
+ "appliesTo": "All elements except table row groups, table column groups, table rows, table columns, ruby base containers, ruby annotation containers",
+ "inherited": "yes",
+ "percentages": "n/a",
+ "computedValue": "specified value",
+ "canonicalOrder": "n/a",
+ "animationType": "not animatable",
+ "styleDeclaration": [
+ "writing-mode",
+ "writingMode"
+ ],
+ "syntax": "horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr",
+ "extended": []
+ }
+ ],
+ [
+ "z-index",
+ {
+ "name": "z-index",
+ "href": "https://drafts.csswg.org/css2/#propdef-z-index",
+ "initial": "auto",
+ "appliesTo": "positioned elements",
+ "inherited": "no",
+ "percentages": "N/A",
+ "computedValue": "as specified",
+ "canonicalOrder": "per grammar",
+ "media": "visual",
+ "styleDeclaration": [
+ "z-index",
+ "zIndex"
+ ],
+ "syntax": "auto | <integer> | inherit",
+ "extended": []
+ }
+ ]
+]);
diff --git a/vanilla/node_modules/cssstyle/lib/normalize.js b/vanilla/node_modules/cssstyle/lib/normalize.js
new file mode 100644
index 0000000..bc39b70
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/normalize.js
@@ -0,0 +1,1574 @@
+"use strict";
+
+const propertyDefinitions = require("./generated/propertyDefinitions");
+const { hasVarFunc, isGlobalKeyword, isValidPropertyValue, splitValue } = require("./parsers");
+const background = require("./properties/background");
+const backgroundColor = require("./properties/backgroundColor");
+const backgroundSize = require("./properties/backgroundSize");
+const border = require("./properties/border");
+const borderWidth = require("./properties/borderWidth");
+const borderStyle = require("./properties/borderStyle");
+const borderColor = require("./properties/borderColor");
+const borderTop = require("./properties/borderTop");
+const borderRight = require("./properties/borderRight");
+const borderBottom = require("./properties/borderBottom");
+const borderLeft = require("./properties/borderLeft");
+const flex = require("./properties/flex");
+const font = require("./properties/font");
+const margin = require("./properties/margin");
+const padding = require("./properties/padding");
+
+/* constants */
+const BORDER_IMAGE = "border-image";
+const TOP = "top";
+const RIGHT = "right";
+const BOTTOM = "bottom";
+const LEFT = "left";
+const WIDTH = "width";
+const STYLE = "style";
+const COLOR = "color";
+const NONE = "none";
+const TRBL_INDICES = {
+ [TOP]: 0,
+ [RIGHT]: 1,
+ [BOTTOM]: 2,
+ [LEFT]: 3
+};
+
+/* shorthands */
+const shorthandProperties = new Map([
+ [background.property, background],
+ [
+ border.property,
+ {
+ definition: border.definition,
+ parse: border.parse,
+ shorthandFor: new Map([
+ ...border.shorthandFor,
+ ...border.positionShorthandFor,
+ [BORDER_IMAGE, null]
+ ])
+ }
+ ],
+ [borderWidth.property, borderWidth],
+ [borderStyle.property, borderStyle],
+ [borderColor.property, borderColor],
+ [borderTop.property, borderTop],
+ [borderRight.property, borderRight],
+ [borderBottom.property, borderBottom],
+ [borderLeft.property, borderLeft],
+ ["flex", flex],
+ ["font", font],
+ ["margin", margin],
+ ["padding", padding]
+]);
+
+/* borders */
+const borderProperties = new Set([
+ border.property,
+ BORDER_IMAGE,
+ ...border.shorthandFor.keys(),
+ ...border.positionShorthandFor.keys(),
+ ...borderTop.shorthandFor.keys(),
+ ...borderRight.shorthandFor.keys(),
+ ...borderBottom.shorthandFor.keys(),
+ ...borderLeft.shorthandFor.keys()
+]);
+const borderPositions = new Set([TOP, RIGHT, BOTTOM, LEFT]);
+const borderLines = new Set([WIDTH, STYLE, COLOR]);
+
+/**
+ * Ensures consistent object shape.
+ *
+ * @param {string} property - The property name.
+ * @param {string} [value=""] - The property value.
+ * @param {string} [priority=""] - The priority.
+ * @returns {Object} The property item object.
+ */
+const createPropertyItem = (property, value = "", priority = "") => ({
+ property,
+ value,
+ priority
+});
+
+/**
+ * Retrieves a property item from the map or creates a default one if it doesn't exist.
+ *
+ * @param {string} property - The name of the property.
+ * @param {Map} properties - The map containing all properties.
+ * @returns {Object} The property item containing name, value, and priority.
+ */
+const getPropertyItem = (property, properties) => {
+ const propertyItem = properties.get(property) ?? createPropertyItem(property);
+ return propertyItem;
+};
+
+/**
+ * Calculates the value for a specific position (top, right, bottom, left)
+ * based on the array of values provided for a shorthand property.
+ *
+ * @param {string[]} positionValues - The values extracted from the shorthand property.
+ * @param {string} position - The specific position (top, right, bottom, left) to retrieve.
+ * @returns {string} The calculated value for the position.
+ */
+const getPositionValue = (positionValues, position) => {
+ const [val1, val2, val3, val4] = positionValues;
+ const index = TRBL_INDICES[position] ?? -1;
+ // If a specific position (top, right, bottom, left) is requested.
+ if (index !== -1) {
+ switch (positionValues.length) {
+ case 2: {
+ // Index 0 (Top) & 2 (Bottom) -> val1
+ // Index 1 (Right) & 3 (Left) -> val2
+ return index % 2 === 0 ? val1 : val2;
+ }
+ case 3: {
+ // Index 0 (Top) -> val1
+ // Index 1 (Right) & 3 (Left) -> val2
+ // Index 2 (Bottom) -> val3
+ if (index === 2) {
+ return val3;
+ }
+ return index % 2 === 0 ? val1 : val2;
+ }
+ case 4: {
+ return positionValues[index];
+ }
+ case 1:
+ default: {
+ return val1;
+ }
+ }
+ }
+ // Fallback logic for when no specific position is requested.
+ switch (positionValues.length) {
+ case 2: {
+ if (val1 === val2) {
+ return val1;
+ }
+ return `${val1} ${val2}`;
+ }
+ case 3: {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return val1;
+ }
+ return `${val1} ${val2}`;
+ }
+ return `${val1} ${val2} ${val3}`;
+ }
+ case 4: {
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return val1;
+ }
+ return `${val1} ${val2}`;
+ }
+ return `${val1} ${val2} ${val3}`;
+ }
+ return `${val1} ${val2} ${val3} ${val4}`;
+ }
+ case 1:
+ default: {
+ return val1;
+ }
+ }
+};
+
+/**
+ * Replaces the background shorthand property based on individual longhand values.
+ *
+ * @param {string} property - The specific background longhand property being updated.
+ * @param {Map} properties - The map of all properties.
+ * @param {Object} opt - Parsing options including global object and configurations.
+ * @returns {string} The constructed background shorthand string.
+ */
+const replaceBackgroundShorthand = (property, properties, opt) => {
+ const { value: propertyValue } = properties.get(property);
+ const parsedValue = background.shorthandFor.get(property).parse(propertyValue, opt);
+ const values = splitValue(parsedValue, {
+ delimiter: ","
+ });
+ const { value: shorthandValue } = properties.get(background.property);
+ const bgValues = background.parse(shorthandValue, opt);
+ const bgLength = bgValues.length;
+ if (property === backgroundColor.property) {
+ bgValues[bgLength - 1][property] = parsedValue[0];
+ } else {
+ for (let i = 0; i < bgLength; i++) {
+ bgValues[i][property] = values[i];
+ }
+ }
+ const backgrounds = [];
+ for (const bgValue of bgValues) {
+ const bg = [];
+ for (const [longhand, value] of Object.entries(bgValue)) {
+ if (!value || value === background.initialValues.get(longhand)) {
+ continue;
+ }
+ if (longhand === backgroundSize.property) {
+ bg.push(`/ ${value}`);
+ } else {
+ bg.push(value);
+ }
+ }
+ backgrounds.push(bg.join(" "));
+ }
+ return backgrounds.join(", ");
+};
+
+/**
+ * Checks if a property value matches the value within a border shorthand.
+ *
+ * @param {string} property - The property to check.
+ * @param {string} value - The value to compare.
+ * @param {string} shorthandValue - The shorthand string to parse and compare against.
+ * @param {Object} [opt={}] - Parsing options.
+ * @returns {boolean} True if the value matches the shorthand's value.
+ */
+const matchesBorderShorthandValue = (property, value, shorthandValue, opt = {}) => {
+ const { globalObject, options } = opt;
+ const obj = border.parse(shorthandValue, {
+ globalObject,
+ options
+ });
+ if (Object.hasOwn(obj, property)) {
+ return value === obj[property];
+ }
+ return value === border.initialValues.get(property);
+};
+
+/**
+ * Replaces or updates a value within a border shorthand string.
+ *
+ * @param {string} value - The new value to insert.
+ * @param {string} shorthandValue - The existing shorthand string.
+ * @param {Object} [opt={}] - Parsing options.
+ * @returns {string} The updated border shorthand string.
+ */
+const replaceBorderShorthandValue = (value, shorthandValue, opt = {}) => {
+ const { globalObject, options } = opt;
+ const borderFirstInitialKey = border.initialValues.keys().next().value;
+ const borderFirstInitialValue = border.initialValues.get(borderFirstInitialKey);
+ const parseOpt = {
+ globalObject,
+ options
+ };
+ const valueObj = border.parse(value, parseOpt);
+ const shorthandObj = shorthandValue
+ ? border.parse(shorthandValue, parseOpt)
+ : {
+ [borderFirstInitialKey]: borderFirstInitialValue
+ };
+ const keys = border.shorthandFor.keys();
+ for (const key of keys) {
+ const initialValue = border.initialValues.get(key);
+ let parsedValue = initialValue;
+ if (Object.hasOwn(valueObj, key)) {
+ parsedValue = valueObj[key];
+ }
+ if (parsedValue === initialValue) {
+ if (key === borderFirstInitialKey) {
+ if (!Object.hasOwn(shorthandObj, key)) {
+ shorthandObj[key] = parsedValue;
+ }
+ } else {
+ delete shorthandObj[key];
+ }
+ } else {
+ shorthandObj[key] = parsedValue;
+ if (
+ shorthandObj[borderFirstInitialKey] &&
+ shorthandObj[borderFirstInitialKey] === borderFirstInitialValue
+ ) {
+ delete shorthandObj[borderFirstInitialKey];
+ }
+ }
+ }
+ return Object.values(shorthandObj).join(" ");
+};
+
+/**
+ * Replaces a value at a specific position (top, right, bottom, left) within a position shorthand.
+ *
+ * @param {string} value - The new value to set.
+ * @param {string[]} positionValues - The array of existing position values.
+ * @param {string} position - The position to update.
+ * @returns {string} The updated shorthand string.
+ */
+const replacePositionValue = (value, positionValues, position) => {
+ const index = TRBL_INDICES[position] ?? -1;
+ let currentValues = positionValues;
+ if (index !== -1) {
+ // Loop for reducing array length (instead of recursion)
+ while (true) {
+ const [val1, val2, val3, val4] = currentValues;
+ switch (currentValues.length) {
+ case 2: {
+ if (val1 === val2) {
+ currentValues = [val1];
+ continue;
+ }
+ switch (index) {
+ // Top
+ case 0: {
+ if (val1 === value) {
+ return currentValues.join(" ");
+ }
+ return `${value} ${val2} ${val1}`;
+ }
+ // Right
+ case 1: {
+ if (val2 === value) {
+ return currentValues.join(" ");
+ }
+ return `${val1} ${value} ${val1} ${val2}`;
+ }
+ // Bottom
+ case 2: {
+ if (val1 === value) {
+ return currentValues.join(" ");
+ }
+ return `${val1} ${val2} ${value}`;
+ }
+ // Left
+ case 3:
+ default: {
+ if (val2 === value) {
+ return currentValues.join(" ");
+ }
+ return `${val1} ${val2} ${val1} ${value}`;
+ }
+ }
+ }
+ case 3: {
+ if (val1 === val3) {
+ currentValues = [val1, val2];
+ continue;
+ }
+ switch (index) {
+ // Top
+ case 0: {
+ if (val1 === value) {
+ return currentValues.join(" ");
+ } else if (val3 === value) {
+ return `${value} ${val2}`;
+ }
+ return `${value} ${val2} ${val3}`;
+ }
+ // Right
+ case 1: {
+ if (val2 === value) {
+ return currentValues.join(" ");
+ }
+ return `${val1} ${value} ${val3} ${val2}`;
+ }
+ // Bottom
+ case 2: {
+ if (val3 === value) {
+ return currentValues.join(" ");
+ } else if (val1 === value) {
+ return `${val1} ${val2}`;
+ }
+ return `${val1} ${val2} ${value}`;
+ }
+ // Left
+ case 3:
+ default: {
+ if (val2 === value) {
+ return currentValues.join(" ");
+ }
+ return `${val1} ${val2} ${val3} ${value}`;
+ }
+ }
+ }
+ case 4: {
+ if (val2 === val4) {
+ currentValues = [val1, val2, val3];
+ continue;
+ }
+ switch (index) {
+ // Top
+ case 0: {
+ if (val1 === value) {
+ return currentValues.join(" ");
+ }
+ return `${value} ${val2} ${val3} ${val4}`;
+ }
+ // Right
+ case 1: {
+ if (val2 === value) {
+ return currentValues.join(" ");
+ } else if (val4 === value) {
+ return `${val1} ${value} ${val3}`;
+ }
+ return `${val1} ${value} ${val3} ${val4}`;
+ }
+ // Bottom
+ case 2: {
+ if (val3 === value) {
+ return currentValues.join(" ");
+ }
+ return `${val1} ${val2} ${value} ${val4}`;
+ }
+ // Left
+ case 3:
+ default: {
+ if (val4 === value) {
+ return currentValues.join(" ");
+ } else if (val2 === value) {
+ return `${val1} ${val2} ${val3}`;
+ }
+ return `${val1} ${val2} ${val3} ${value}`;
+ }
+ }
+ }
+ case 1:
+ default: {
+ const [val] = currentValues;
+ if (val === value) {
+ return currentValues.join(" ");
+ }
+ switch (index) {
+ // Top
+ case 0: {
+ return `${value} ${val} ${val}`;
+ }
+ // Right
+ case 1: {
+ return `${val} ${value} ${val} ${val}`;
+ }
+ // Bottom
+ case 2: {
+ return `${val} ${val} ${value}`;
+ }
+ // Left
+ case 3:
+ default: {
+ return `${val} ${val} ${val} ${value}`;
+ }
+ }
+ }
+ }
+ }
+ }
+ // Fallback logic for when no specific position is requested.
+ const [val1, val2, val3, val4] = currentValues;
+ switch (currentValues.length) {
+ case 2: {
+ if (val1 === val2) {
+ return val1;
+ }
+ return `${val1} ${val2}`;
+ }
+ case 3: {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return val1;
+ }
+ return `${val1} ${val2}`;
+ }
+ return `${val1} ${val2} ${val3}`;
+ }
+ case 4: {
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return val1;
+ }
+ return `${val1} ${val2}`;
+ }
+ return `${val1} ${val2} ${val3}`;
+ }
+ return `${val1} ${val2} ${val3} ${val4}`;
+ }
+ case 1:
+ default: {
+ return val1;
+ }
+ }
+};
+
+/**
+ * Handles border property preparation when the value is a string.
+ *
+ * @param {Object} params - The parameters object.
+ * @param {string} params.property - The property name.
+ * @param {string} params.value - The property value.
+ * @param {string} params.priority - The property priority.
+ * @param {Map} params.properties - The map of properties.
+ * @param {Object} params.parts - The split property name parts.
+ * @param {Object} params.opt - Parsing options.
+ * @param {Map} params.borderItems - The map to store processed border items.
+ */
+const prepareBorderStringValue = ({
+ property,
+ value,
+ priority,
+ properties,
+ parts,
+ opt,
+ borderItems
+}) => {
+ const { prop1, prop2, prop3 } = parts;
+ const { globalObject, options } = opt;
+ const parseOpt = {
+ globalObject,
+ options
+ };
+ const shorthandItem = getPropertyItem(border.property, properties);
+ const imageItem = getPropertyItem(BORDER_IMAGE, properties);
+ // Handle longhand properties.
+ if (prop3) {
+ const lineProperty = `${prop1}-${prop3}`;
+ const lineItem = getPropertyItem(lineProperty, properties);
+ const positionProperty = `${prop1}-${prop2}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ const longhandProperty = `${prop1}-${prop2}-${prop3}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ longhandItem.value = value;
+ longhandItem.priority = priority;
+ const propertyValue = hasVarFunc(value) ? "" : value;
+ if (propertyValue === "") {
+ shorthandItem.value = "";
+ lineItem.value = "";
+ positionItem.value = "";
+ } else if (isGlobalKeyword(propertyValue)) {
+ if (shorthandItem.value !== propertyValue) {
+ shorthandItem.value = "";
+ }
+ if (lineItem.value !== propertyValue) {
+ lineItem.value = "";
+ }
+ if (positionItem.value !== propertyValue) {
+ positionItem.value = "";
+ }
+ } else {
+ if (
+ shorthandItem.value &&
+ !matchesBorderShorthandValue(lineProperty, propertyValue, shorthandItem.value, parseOpt)
+ ) {
+ shorthandItem.value = "";
+ }
+ if (lineItem.value) {
+ lineItem.value = replacePositionValue(propertyValue, splitValue(lineItem.value), prop2);
+ }
+ if (
+ positionItem.value &&
+ !matchesBorderShorthandValue(lineProperty, propertyValue, positionItem.value, parseOpt)
+ ) {
+ positionItem.value = "";
+ }
+ }
+ borderItems.set(border.property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ borderItems.set(lineProperty, lineItem);
+ borderItems.set(positionProperty, positionItem);
+ borderItems.set(longhandProperty, longhandItem);
+ // Handle side-specific border shorthands (border-top, border-right, border-bottom, border-left).
+ } else if (prop2 && borderPositions.has(prop2)) {
+ const lineWidthProperty = `${prop1}-width`;
+ const lineWidthItem = getPropertyItem(lineWidthProperty, properties);
+ const lineStyleProperty = `${prop1}-style`;
+ const lineStyleItem = getPropertyItem(lineStyleProperty, properties);
+ const lineColorProperty = `${prop1}-color`;
+ const lineColorItem = getPropertyItem(lineColorProperty, properties);
+ const positionProperty = `${prop1}-${prop2}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ positionItem.value = value;
+ positionItem.priority = priority;
+ const propertyValue = hasVarFunc(value) ? "" : value;
+ if (propertyValue === "") {
+ shorthandItem.value = "";
+ lineWidthItem.value = "";
+ lineStyleItem.value = "";
+ lineColorItem.value = "";
+ } else if (isGlobalKeyword(propertyValue)) {
+ if (shorthandItem.value !== propertyValue) {
+ shorthandItem.value = "";
+ }
+ if (lineWidthItem.value !== propertyValue) {
+ lineWidthItem.value = "";
+ }
+ if (lineStyleItem.value !== propertyValue) {
+ lineStyleItem.value = "";
+ }
+ if (lineColorItem.value !== propertyValue) {
+ lineColorItem.value = "";
+ }
+ } else {
+ if (
+ shorthandItem.value &&
+ !matchesBorderShorthandValue(property, propertyValue, shorthandItem.value, parseOpt)
+ ) {
+ shorthandItem.value = "";
+ }
+ if (
+ lineWidthItem.value &&
+ isValidPropertyValue(lineWidthProperty, propertyValue, globalObject)
+ ) {
+ lineWidthItem.value = propertyValue;
+ }
+ if (
+ lineStyleItem.value &&
+ isValidPropertyValue(lineStyleProperty, propertyValue, globalObject)
+ ) {
+ lineStyleItem.value = propertyValue;
+ }
+ if (
+ lineColorItem.value &&
+ isValidPropertyValue(lineColorProperty, propertyValue, globalObject)
+ ) {
+ lineColorItem.value = propertyValue;
+ }
+ }
+ for (const line of borderLines) {
+ const longhandProperty = `${prop1}-${prop2}-${line}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ longhandItem.value = propertyValue;
+ longhandItem.priority = priority;
+ borderItems.set(longhandProperty, longhandItem);
+ }
+ borderItems.set(border.property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ borderItems.set(lineWidthProperty, lineWidthItem);
+ borderItems.set(lineStyleProperty, lineStyleItem);
+ borderItems.set(lineColorProperty, lineColorItem);
+ borderItems.set(positionProperty, positionItem);
+ // Handle property-specific border shorthands (border-width, border-style, border-color).
+ } else if (prop2 && borderLines.has(prop2)) {
+ const lineProperty = `${prop1}-${prop2}`;
+ const lineItem = getPropertyItem(lineProperty, properties);
+ lineItem.value = value;
+ lineItem.priority = priority;
+ const propertyValue = hasVarFunc(value) ? "" : value;
+ if (propertyValue === "") {
+ shorthandItem.value = "";
+ } else if (isGlobalKeyword(propertyValue)) {
+ if (shorthandItem.value !== propertyValue) {
+ shorthandItem.value = "";
+ }
+ }
+ for (const position of borderPositions) {
+ const positionProperty = `${prop1}-${position}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ const longhandProperty = `${prop1}-${position}-${prop2}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ if (propertyValue) {
+ positionItem.value = replaceBorderShorthandValue(
+ propertyValue,
+ positionItem.value,
+ parseOpt
+ );
+ } else {
+ positionItem.value = "";
+ }
+ longhandItem.value = propertyValue;
+ longhandItem.priority = priority;
+ borderItems.set(positionProperty, positionItem);
+ borderItems.set(longhandProperty, longhandItem);
+ }
+ borderItems.set(border.property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ borderItems.set(lineProperty, lineItem);
+ // Handle border shorthand.
+ } else {
+ const propertyValue = hasVarFunc(value) ? "" : value;
+ imageItem.value = propertyValue ? NONE : "";
+ for (const line of borderLines) {
+ const lineProperty = `${prop1}-${line}`;
+ const lineItem = getPropertyItem(lineProperty, properties);
+ lineItem.value = propertyValue;
+ lineItem.priority = priority;
+ borderItems.set(lineProperty, lineItem);
+ }
+ for (const position of borderPositions) {
+ const positionProperty = `${prop1}-${position}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ positionItem.value = propertyValue;
+ positionItem.priority = priority;
+ borderItems.set(positionProperty, positionItem);
+ for (const line of borderLines) {
+ const longhandProperty = `${positionProperty}-${line}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ longhandItem.value = propertyValue;
+ longhandItem.priority = priority;
+ borderItems.set(longhandProperty, longhandItem);
+ }
+ }
+ borderItems.set(property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ }
+};
+
+/**
+ * Handles border property preparation when the value is an array.
+ *
+ * @param {Object} params - The parameters object.
+ * @param {Array} params.value - The property value.
+ * @param {string} params.priority - The property priority.
+ * @param {Map} params.properties - The map of properties.
+ * @param {Object} params.parts - The split property name parts.
+ * @param {Object} params.opt - Parsing options.
+ * @param {Map} params.borderItems - The map to store processed border items.
+ */
+const prepareBorderArrayValue = ({ value, priority, properties, parts, opt, borderItems }) => {
+ const { prop1, prop2 } = parts;
+ const { globalObject, options } = opt;
+ const parseOpt = {
+ globalObject,
+ options
+ };
+ if (!value.length || !borderLines.has(prop2)) {
+ return;
+ }
+ const shorthandItem = getPropertyItem(border.property, properties);
+ const imageItem = getPropertyItem(BORDER_IMAGE, properties);
+ const lineProperty = `${prop1}-${prop2}`;
+ const lineItem = getPropertyItem(lineProperty, properties);
+ if (value.length === 1) {
+ const [propertyValue] = value;
+ if (shorthandItem.value) {
+ if (hasVarFunc(shorthandItem.value)) {
+ shorthandItem.value = "";
+ } else if (propertyValue) {
+ shorthandItem.value = replaceBorderShorthandValue(
+ propertyValue,
+ shorthandItem.value,
+ parseOpt
+ );
+ }
+ }
+ } else {
+ shorthandItem.value = "";
+ }
+ lineItem.value = value.join(" ");
+ lineItem.priority = priority;
+ const positionValues = {};
+ const [val1, val2, val3, val4] = value;
+ switch (value.length) {
+ case 2: {
+ positionValues.top = val1;
+ positionValues.right = val2;
+ positionValues.bottom = val1;
+ positionValues.left = val2;
+ break;
+ }
+ case 3: {
+ positionValues.top = val1;
+ positionValues.right = val2;
+ positionValues.bottom = val3;
+ positionValues.left = val2;
+ break;
+ }
+ case 4: {
+ positionValues.top = val1;
+ positionValues.right = val2;
+ positionValues.bottom = val3;
+ positionValues.left = val4;
+ break;
+ }
+ case 1:
+ default: {
+ positionValues.top = val1;
+ positionValues.right = val1;
+ positionValues.bottom = val1;
+ positionValues.left = val1;
+ }
+ }
+ for (const position of borderPositions) {
+ const positionProperty = `${prop1}-${position}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ if (positionItem.value && positionValues[position]) {
+ positionItem.value = replaceBorderShorthandValue(
+ positionValues[position],
+ positionItem.value,
+ parseOpt
+ );
+ }
+ const longhandProperty = `${positionProperty}-${prop2}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ longhandItem.value = positionValues[position];
+ longhandItem.priority = priority;
+ borderItems.set(positionProperty, positionItem);
+ borderItems.set(longhandProperty, longhandItem);
+ }
+ borderItems.set(border.property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ borderItems.set(lineProperty, lineItem);
+};
+
+/**
+ * Handles border property preparation when the value is an object.
+ *
+ * @param {Object} params - The parameters object.
+ * @param {string} params.property - The property name.
+ * @param {Object} params.value - The property value.
+ * @param {string} params.priority - The property priority.
+ * @param {Map} params.properties - The map of properties.
+ * @param {Object} params.parts - The split property name parts.
+ * @param {Object} params.opt - Parsing options.
+ * @param {Map} params.borderItems - The map to store processed border items.
+ */
+const prepareBorderObjectValue = ({
+ property,
+ value,
+ priority,
+ properties,
+ parts,
+ opt,
+ borderItems
+}) => {
+ const { prop1, prop2 } = parts;
+ const { globalObject, options } = opt;
+ const parseOpt = {
+ globalObject,
+ options
+ };
+ const imageItem = getPropertyItem(BORDER_IMAGE, properties);
+ // Handle position shorthands.
+ if (prop2) {
+ if (!borderPositions.has(prop2)) {
+ return;
+ }
+ const shorthandItem = getPropertyItem(border.property, properties);
+ const lineWidthProperty = `${prop1}-width`;
+ const lineWidthItem = getPropertyItem(lineWidthProperty, properties);
+ const lineStyleProperty = `${prop1}-style`;
+ const lineStyleItem = getPropertyItem(lineStyleProperty, properties);
+ const lineColorProperty = `${prop1}-color`;
+ const lineColorItem = getPropertyItem(lineColorProperty, properties);
+ const positionProperty = `${prop1}-${prop2}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ if (shorthandItem.value) {
+ for (const positionValue of Object.values(value)) {
+ if (!matchesBorderShorthandValue(property, positionValue, shorthandItem.value, parseOpt)) {
+ shorthandItem.value = "";
+ break;
+ }
+ }
+ }
+ positionItem.value = Object.values(value).join(" ");
+ positionItem.priority = priority;
+ for (const line of borderLines) {
+ const longhandProperty = `${prop1}-${prop2}-${line}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ const itemValue = Object.hasOwn(value, longhandProperty)
+ ? value[longhandProperty]
+ : border.initialValues.get(`${prop1}-${line}`);
+ if (line === WIDTH && lineWidthItem.value) {
+ lineWidthItem.value = replacePositionValue(
+ itemValue,
+ splitValue(lineWidthItem.value),
+ prop2
+ );
+ } else if (line === STYLE && lineStyleItem.value) {
+ lineStyleItem.value = replacePositionValue(
+ itemValue,
+ splitValue(lineStyleItem.value),
+ prop2
+ );
+ } else if (line === COLOR && lineColorItem.value) {
+ lineColorItem.value = replacePositionValue(
+ itemValue,
+ splitValue(lineColorItem.value),
+ prop2
+ );
+ }
+ longhandItem.value = itemValue;
+ longhandItem.priority = priority;
+ borderItems.set(longhandProperty, longhandItem);
+ }
+ borderItems.set(border.property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ borderItems.set(lineWidthProperty, lineWidthItem);
+ borderItems.set(lineStyleProperty, lineStyleItem);
+ borderItems.set(lineColorProperty, lineColorItem);
+ borderItems.set(positionProperty, positionItem);
+ // Handle border shorthand.
+ } else {
+ const shorthandItem = getPropertyItem(prop1, properties);
+ const lineWidthProperty = `${prop1}-width`;
+ const lineWidthItem = getPropertyItem(lineWidthProperty, properties);
+ const lineStyleProperty = `${prop1}-style`;
+ const lineStyleItem = getPropertyItem(lineStyleProperty, properties);
+ const lineColorProperty = `${prop1}-color`;
+ const lineColorItem = getPropertyItem(lineColorProperty, properties);
+ const propertyValue = Object.values(value).join(" ");
+ shorthandItem.value = propertyValue;
+ shorthandItem.priority = priority;
+ imageItem.value = propertyValue ? NONE : "";
+ if (Object.hasOwn(value, lineWidthProperty)) {
+ lineWidthItem.value = value[lineWidthProperty];
+ } else {
+ lineWidthItem.value = border.initialValues.get(lineWidthProperty);
+ }
+ lineWidthItem.priority = priority;
+ if (Object.hasOwn(value, lineStyleProperty)) {
+ lineStyleItem.value = value[lineStyleProperty];
+ } else {
+ lineStyleItem.value = border.initialValues.get(lineStyleProperty);
+ }
+ lineStyleItem.priority = priority;
+ if (Object.hasOwn(value, lineColorProperty)) {
+ lineColorItem.value = value[lineColorProperty];
+ } else {
+ lineColorItem.value = border.initialValues.get(lineColorProperty);
+ }
+ lineColorItem.priority = priority;
+ for (const position of borderPositions) {
+ const positionProperty = `${prop1}-${position}`;
+ const positionItem = getPropertyItem(positionProperty, properties);
+ positionItem.value = propertyValue;
+ positionItem.priority = priority;
+ for (const line of borderLines) {
+ const longhandProperty = `${positionProperty}-${line}`;
+ const longhandItem = getPropertyItem(longhandProperty, properties);
+ const lineProperty = `${prop1}-${line}`;
+ if (Object.hasOwn(value, lineProperty)) {
+ longhandItem.value = value[lineProperty];
+ } else {
+ longhandItem.value = border.initialValues.get(lineProperty);
+ }
+ longhandItem.priority = priority;
+ borderItems.set(longhandProperty, longhandItem);
+ }
+ borderItems.set(positionProperty, positionItem);
+ }
+ borderItems.set(property, shorthandItem);
+ borderItems.set(BORDER_IMAGE, imageItem);
+ borderItems.set(lineWidthProperty, lineWidthItem);
+ borderItems.set(lineStyleProperty, lineStyleItem);
+ borderItems.set(lineColorProperty, lineColorItem);
+ }
+};
+
+/**
+ * Prepares border properties by splitting shorthands and handling updates.
+ *
+ * @param {string} property - The border property name.
+ * @param {string|Array|Object} value - The value of the property.
+ * @param {string} priority - The priority of the property (e.g., "important").
+ * @param {Map} properties - The map of all properties.
+ * @param {Object} [opt={}] - Parsing options.
+ * @returns {Map|undefined} A map of expanded or updated border properties.
+ */
+const prepareBorderProperties = (property, value, priority, properties, opt = {}) => {
+ if (typeof property !== "string" || value === null) {
+ return;
+ }
+ if (!property.startsWith(border.property)) {
+ return;
+ }
+ let prop2, prop3;
+ if (property.length > border.property.length) {
+ // Check if next char is '-'
+ if (property.charCodeAt(border.property.length) !== 45) {
+ return;
+ }
+ // property is like "border-..."
+ const remainder = property.substring(border.property.length + 1);
+ const hyphenIndex = remainder.indexOf("-");
+ if (hyphenIndex !== -1) {
+ prop2 = remainder.substring(0, hyphenIndex);
+ prop3 = remainder.substring(hyphenIndex + 1);
+ } else {
+ prop2 = remainder;
+ }
+ }
+ if (
+ (borderPositions.has(prop2) && prop3 && !borderLines.has(prop3)) ||
+ (borderLines.has(prop2) && prop3)
+ ) {
+ return;
+ }
+ const parts = {
+ prop1: border.property,
+ prop2,
+ prop3
+ };
+ const borderItems = new Map();
+ if (typeof value === "string") {
+ prepareBorderStringValue({
+ property,
+ value,
+ priority,
+ properties,
+ parts,
+ opt,
+ borderItems
+ });
+ } else if (Array.isArray(value)) {
+ prepareBorderArrayValue({
+ value,
+ priority,
+ properties,
+ parts,
+ opt,
+ borderItems
+ });
+ } else if (value && typeof value === "object") {
+ prepareBorderObjectValue({
+ property,
+ value,
+ priority,
+ properties,
+ parts,
+ opt,
+ borderItems
+ });
+ }
+ if (!borderItems.has(border.property)) {
+ return;
+ }
+ const borderProps = new Map([[border.property, borderItems.get(border.property)]]);
+ for (const line of borderLines) {
+ const lineProperty = `${border.property}-${line}`;
+ const lineItem = borderItems.get(lineProperty) ?? getPropertyItem(lineProperty, properties);
+ borderProps.set(lineProperty, lineItem);
+ }
+ for (const position of borderPositions) {
+ const positionProperty = `${border.property}-${position}`;
+ const positionItem =
+ borderItems.get(positionProperty) ?? getPropertyItem(positionProperty, properties);
+ borderProps.set(positionProperty, positionItem);
+ for (const line of borderLines) {
+ const longhandProperty = `${border.property}-${position}-${line}`;
+ const longhandItem =
+ borderItems.get(longhandProperty) ?? getPropertyItem(longhandProperty, properties);
+ borderProps.set(longhandProperty, longhandItem);
+ }
+ }
+ const borderImageItem = borderItems.get(BORDER_IMAGE) ?? createPropertyItem(BORDER_IMAGE);
+ borderProps.set(BORDER_IMAGE, borderImageItem);
+ return borderProps;
+};
+
+/**
+ * Generates a border line shorthand property if all line components are present.
+ *
+ * @param {Map} items - The map of collected property items.
+ * @param {string} property - The shorthand property name to generate.
+ * @param {string} [priority=""] - The priority of the property.
+ * @returns {Array} A key-value pair for the generated property.
+ */
+const generateBorderLineShorthand = (items, property, priority = "") => {
+ const values = [];
+ for (const [, item] of items) {
+ const { value: itemValue } = item;
+ values.push(itemValue);
+ }
+ const value = getPositionValue(values);
+ return [property, createPropertyItem(property, value, priority)];
+};
+
+/**
+ * Generates a border position shorthand property if all position components are present.
+ *
+ * @param {Map} items - The map of collected property items.
+ * @param {string} property - The shorthand property name to generate.
+ * @param {string} [priority=""] - The priority of the property.
+ * @returns {Array} A key-value pair for the generated property.
+ */
+const generateBorderPositionShorthand = (items, property, priority = "") => {
+ const values = [];
+ for (const [, item] of items) {
+ const { value: itemValue } = item;
+ values.push(itemValue);
+ }
+ const value = values.join(" ");
+ return [property, createPropertyItem(property, value, priority)];
+};
+
+/**
+ * Generates a border shorthand property if all components match.
+ *
+ * @param {Array} items - The collection of property values.
+ * @param {string} property - The shorthand property name to generate.
+ * @param {string} [priority=""] - The priority of the property.
+ * @returns {Array|undefined} A key-value pair for the generated property or undefined.
+ */
+const generateBorderShorthand = (items, property, priority = "") => {
+ const values = new Set(items);
+ if (values.size === 1) {
+ const value = values.keys().next().value;
+ return [property, createPropertyItem(property, value, priority)];
+ }
+};
+
+const borderCollectionConfig = {
+ [WIDTH]: {
+ shorthand: borderWidth.property,
+ generator: generateBorderLineShorthand
+ },
+ [STYLE]: {
+ shorthand: borderStyle.property,
+ generator: generateBorderLineShorthand
+ },
+ [COLOR]: {
+ shorthand: borderColor.property,
+ generator: generateBorderLineShorthand
+ },
+ [TOP]: {
+ shorthand: borderTop.property,
+ generator: generateBorderPositionShorthand
+ },
+ [RIGHT]: {
+ shorthand: borderRight.property,
+ generator: generateBorderPositionShorthand
+ },
+ [BOTTOM]: {
+ shorthand: borderBottom.property,
+ generator: generateBorderPositionShorthand
+ },
+ [LEFT]: {
+ shorthand: borderLeft.property,
+ generator: generateBorderPositionShorthand
+ }
+};
+
+/**
+ * Processes and consolidates border-related longhands into shorthands where possible.
+ *
+ * @param {Map} properties - The map of current properties.
+ * @returns {Map} The updated map with consolidated border properties.
+ */
+const prepareBorderShorthands = (properties) => {
+ const borderCollections = {};
+ for (const key of Object.keys(borderCollectionConfig)) {
+ borderCollections[key] = {
+ ...borderCollectionConfig[key],
+ items: new Map(),
+ priorityItems: new Map()
+ };
+ }
+ for (const [property, item] of properties) {
+ const { priority, value } = item;
+ let positionPart, linePart;
+ // We can assume property starts with "border-"
+ const firstHyphen = property.indexOf("-");
+ if (firstHyphen !== -1) {
+ const remainder = property.substring(firstHyphen + 1);
+ const secondHyphen = remainder.indexOf("-");
+ if (secondHyphen !== -1) {
+ positionPart = remainder.substring(0, secondHyphen);
+ linePart = remainder.substring(secondHyphen + 1);
+ } else {
+ positionPart = remainder;
+ linePart = undefined;
+ }
+ }
+ if (linePart && borderCollections[linePart]) {
+ const collection = borderCollections[linePart];
+ if (priority) {
+ collection.priorityItems.set(property, { property, value, priority });
+ } else {
+ collection.items.set(property, { property, value, priority });
+ }
+ }
+ if (positionPart && borderCollections[positionPart]) {
+ const collection = borderCollections[positionPart];
+ if (priority) {
+ collection.priorityItems.set(property, { property, value, priority });
+ } else {
+ collection.items.set(property, { property, value, priority });
+ }
+ }
+ }
+ const shorthandItems = [];
+ const shorthandPriorityItems = [];
+ for (const [key, collection] of Object.entries(borderCollections)) {
+ const { shorthand, generator, items, priorityItems } = collection;
+ const requiredSize = borderLines.has(key) ? 4 : 3;
+ if (items.size === requiredSize) {
+ const [property, item] = generator(items, shorthand) ?? [];
+ if (property && item) {
+ properties.set(property, item);
+ if (borderPositions.has(key) && properties.has(BORDER_IMAGE)) {
+ const { value: imageValue } = properties.get(BORDER_IMAGE);
+ if (imageValue === NONE) {
+ shorthandItems.push(item.value);
+ }
+ }
+ }
+ } else if (priorityItems.size === requiredSize) {
+ const [property, item] = generator(priorityItems, shorthand, "important") ?? [];
+ if (property && item) {
+ properties.set(property, item);
+ if (borderPositions.has(key) && properties.has(BORDER_IMAGE)) {
+ const { value: imageValue } = properties.get(BORDER_IMAGE);
+ if (imageValue === NONE) {
+ shorthandPriorityItems.push(item.value);
+ }
+ }
+ }
+ }
+ }
+ const mixedPriorities = shorthandItems.length && shorthandPriorityItems.length;
+ const imageItem = createPropertyItem(BORDER_IMAGE, NONE);
+ if (shorthandItems.length === 4) {
+ const [property, item] = generateBorderShorthand(shorthandItems, border.property) ?? [];
+ if (property && item) {
+ properties.set(property, item);
+ properties.delete(BORDER_IMAGE);
+ properties.set(BORDER_IMAGE, imageItem);
+ }
+ } else if (shorthandPriorityItems.length === 4) {
+ const [property, item] =
+ generateBorderShorthand(shorthandPriorityItems, border.property, "important") ?? [];
+ if (property && item) {
+ properties.set(property, item);
+ properties.delete(BORDER_IMAGE);
+ properties.set(BORDER_IMAGE, imageItem);
+ }
+ } else if (properties.has(BORDER_IMAGE)) {
+ const { value: imageValue } = properties.get(BORDER_IMAGE);
+ if (imageValue === NONE) {
+ if (mixedPriorities) {
+ properties.delete(BORDER_IMAGE);
+ properties.set(BORDER_IMAGE, imageItem);
+ } else {
+ properties.delete(BORDER_IMAGE);
+ }
+ }
+ }
+ if (mixedPriorities) {
+ const items = [];
+ const priorityItems = [];
+ for (const item of properties) {
+ const [, { priority }] = item;
+ if (priority) {
+ priorityItems.push(item);
+ } else {
+ items.push(item);
+ }
+ }
+ const firstPropertyKey = properties.keys().next().value;
+ const { priority: firstPropertyPriority } = properties.get(firstPropertyKey);
+ if (firstPropertyPriority) {
+ return new Map([...priorityItems, ...items]);
+ }
+ return new Map([...items, ...priorityItems]);
+ }
+ if (properties.has(BORDER_IMAGE)) {
+ properties.delete(BORDER_IMAGE);
+ properties.set(BORDER_IMAGE, imageItem);
+ }
+ return properties;
+};
+
+/**
+ * Processes shorthand properties from the shorthands map.
+ *
+ * @param {Map} shorthands - The map containing shorthand property groups.
+ * @returns {Map} A map of processed shorthand properties.
+ */
+const processShorthandProperties = (shorthands) => {
+ const shorthandItems = new Map();
+ for (const [property, item] of shorthands) {
+ const shorthandItem = shorthandProperties.get(property);
+ if (item.size === shorthandItem.shorthandFor.size && shorthandItem.position) {
+ const positionValues = [];
+ let priority = "";
+ for (const { value: longhandValue, priority: longhandPriority } of item.values()) {
+ positionValues.push(longhandValue);
+ if (longhandPriority) {
+ priority = longhandPriority;
+ }
+ }
+ const value = getPositionValue(positionValues, shorthandItem.position);
+ shorthandItems.set(property, createPropertyItem(property, value, priority));
+ }
+ }
+ return shorthandItems;
+};
+
+/**
+ * Updates the longhand properties map with a new property item.
+ * If a property with normal priority already exists, it will be overwritten by the new item.
+ * If the existing property has "important" priority, it will not be overwritten.
+ *
+ * @param {string} property - The CSS property name.
+ * @param {Object} item - The property item object containing value and priority.
+ * @param {Map} longhandProperties - The map of longhand properties to update.
+ */
+const updateLonghandProperties = (property, item, longhandProperties) => {
+ if (longhandProperties.has(property)) {
+ const { priority: longhandPriority } = longhandProperties.get(property);
+ if (!longhandPriority) {
+ longhandProperties.delete(property);
+ longhandProperties.set(property, item);
+ }
+ } else {
+ longhandProperties.set(property, item);
+ }
+};
+
+/**
+ * Processes border properties from the borders map, expanding and normalizing them.
+ *
+ * @param {Map} borders - The map containing accumulated border properties.
+ * @param {Object} parseOpt - Options for parsing values.
+ * @returns {Map} A map of fully processed and normalized border properties.
+ */
+const processBorderProperties = (borders, parseOpt) => {
+ const longhandProperties = new Map();
+ for (const [property, item] of borders) {
+ if (shorthandProperties.has(property)) {
+ const { value, priority } = item;
+ if (property === border.property) {
+ const lineItems = border.parse(value, parseOpt);
+ for (const [key, initialValue] of border.initialValues) {
+ if (!Object.hasOwn(lineItems, key)) {
+ lineItems[key] = initialValue;
+ }
+ }
+ for (const lineProperty of Object.keys(lineItems)) {
+ let namePart, linePart;
+ const hyphenIndex = lineProperty.indexOf("-");
+ if (hyphenIndex !== -1) {
+ namePart = lineProperty.substring(0, hyphenIndex);
+ linePart = lineProperty.substring(hyphenIndex + 1);
+ } else {
+ // fallback for safety, though lineProperty from border.parse keys
+ // should have hyphen
+ namePart = lineProperty;
+ linePart = "";
+ }
+ const lineValue = lineItems[lineProperty];
+ for (const position of borderPositions) {
+ const longhandProperty = `${namePart}-${position}-${linePart}`;
+ const longhandItem = createPropertyItem(longhandProperty, lineValue, priority);
+ updateLonghandProperties(longhandProperty, longhandItem, longhandProperties);
+ }
+ }
+ if (value) {
+ longhandProperties.set(BORDER_IMAGE, createPropertyItem(BORDER_IMAGE, NONE, priority));
+ }
+ } else {
+ const shorthandItem = shorthandProperties.get(property);
+ const parsedItem = shorthandItem.parse(value, parseOpt);
+ if (Array.isArray(parsedItem)) {
+ let namePart, linePart;
+ const hyphenIndex = property.indexOf("-");
+ if (hyphenIndex !== -1) {
+ namePart = property.substring(0, hyphenIndex);
+ linePart = property.substring(hyphenIndex + 1);
+ } else {
+ namePart = property;
+ }
+ for (const position of borderPositions) {
+ const longhandProperty = `${namePart}-${position}-${linePart}`;
+ const longhandValue = getPositionValue(parsedItem, position);
+ const longhandItem = createPropertyItem(longhandProperty, longhandValue, priority);
+ updateLonghandProperties(longhandProperty, longhandItem, longhandProperties);
+ }
+ } else if (parsedItem) {
+ for (const [key, initialValue] of shorthandItem.initialValues) {
+ if (!Object.hasOwn(parsedItem, key)) {
+ parsedItem[key] = initialValue;
+ }
+ }
+ for (const longhandProperty of Object.keys(parsedItem)) {
+ const longhandValue = parsedItem[longhandProperty];
+ const longhandItem = createPropertyItem(longhandProperty, longhandValue, priority);
+ updateLonghandProperties(longhandProperty, longhandItem, longhandProperties);
+ }
+ }
+ }
+ } else if (longhandProperties.has(property)) {
+ const { priority } = longhandProperties.get(property);
+ if (!priority) {
+ longhandProperties.delete(property);
+ longhandProperties.set(property, item);
+ }
+ } else {
+ longhandProperties.set(property, item);
+ }
+ }
+ const borderItems = prepareBorderShorthands(longhandProperties);
+ return borderItems;
+};
+
+/**
+ * Normalize and prepare CSS properties, handling shorthands and longhands.
+ *
+ * @param {Map} properties - The initial map of properties.
+ * @param {Object} [opt={}] - Parsing options.
+ * @returns {Map} The normalized map of properties.
+ */
+const prepareProperties = (properties, opt = {}) => {
+ const { globalObject, options } = opt;
+ const parseOpt = {
+ globalObject,
+ options
+ };
+ const parsedProperties = new Map();
+ const shorthands = new Map();
+ const borders = new Map();
+ let hasPrecedingBackground = false;
+ for (const [property, item] of properties) {
+ const { value, priority } = item;
+ const { logicalPropertyGroup: shorthandProperty } = propertyDefinitions.get(property) ?? {};
+ if (borderProperties.has(property)) {
+ borders.set(property, { property, value, priority });
+ } else if (shorthandProperties.has(shorthandProperty)) {
+ if (!shorthands.has(shorthandProperty)) {
+ shorthands.set(shorthandProperty, new Map());
+ }
+ const longhandItems = shorthands.get(shorthandProperty);
+ if (longhandItems.size) {
+ const firstPropertyKey = longhandItems.keys().next().value;
+ const { priority: firstPropertyPriority } = longhandItems.get(firstPropertyKey);
+ if (priority === firstPropertyPriority) {
+ longhandItems.set(property, { property, value, priority });
+ shorthands.set(shorthandProperty, longhandItems);
+ } else {
+ parsedProperties.delete(shorthandProperty);
+ }
+ } else {
+ longhandItems.set(property, { property, value, priority });
+ shorthands.set(shorthandProperty, longhandItems);
+ }
+ parsedProperties.set(property, item);
+ } else if (shorthandProperties.has(property)) {
+ const shorthandItem = shorthandProperties.get(property);
+ const parsedValues = shorthandItem.parse(value, parseOpt);
+ let omitShorthandProperty = false;
+ if (Array.isArray(parsedValues)) {
+ const [parsedValue] = parsedValues;
+ if (typeof parsedValue === "string") {
+ for (const [longhandProperty, longhandItem] of shorthandItem.shorthandFor) {
+ if (!priority && properties.has(longhandProperty)) {
+ const { priority: longhandPriority } = properties.get(longhandProperty);
+ if (longhandPriority) {
+ omitShorthandProperty = true;
+ continue;
+ }
+ }
+ const { position } = longhandItem;
+ const longhandValue = getPositionValue([parsedValue], position);
+ parsedProperties.set(
+ longhandProperty,
+ createPropertyItem(longhandProperty, longhandValue, priority)
+ );
+ }
+ } else if (parsedValue) {
+ for (const longhandProperty of Object.keys(parsedValue)) {
+ const longhandValue = parsedValue[longhandProperty];
+ parsedProperties.set(
+ longhandProperty,
+ createPropertyItem(longhandProperty, longhandValue, priority)
+ );
+ }
+ }
+ } else if (parsedValues && typeof parsedValues !== "string") {
+ for (const longhandProperty of Object.keys(parsedValues)) {
+ const longhandValue = parsedValues[longhandProperty];
+ parsedProperties.set(
+ longhandProperty,
+ createPropertyItem(longhandProperty, longhandValue, priority)
+ );
+ }
+ }
+ if (!omitShorthandProperty) {
+ if (property === background.property) {
+ hasPrecedingBackground = true;
+ }
+ parsedProperties.set(property, createPropertyItem(property, value, priority));
+ }
+ } else {
+ parsedProperties.set(property, createPropertyItem(property, value, priority));
+ if (hasPrecedingBackground) {
+ const { value: shorthandValue, priority: shorthandPriority } = properties.get(
+ background.property
+ );
+ if ((!shorthandPriority || priority) && !hasVarFunc(shorthandValue)) {
+ const replacedShorthandValue = replaceBackgroundShorthand(
+ property,
+ parsedProperties,
+ parseOpt
+ );
+ properties.delete(background.property);
+ properties.set(
+ background.property,
+ createPropertyItem(background.property, replacedShorthandValue, shorthandPriority)
+ );
+ }
+ }
+ }
+ }
+ if (shorthands.size) {
+ const shorthandItems = processShorthandProperties(shorthands);
+ for (const [property, item] of shorthandItems) {
+ parsedProperties.set(property, item);
+ }
+ }
+ if (borders.size) {
+ const borderItems = processBorderProperties(borders, parseOpt);
+ for (const [property, item] of borderItems) {
+ parsedProperties.set(property, item);
+ }
+ }
+ return parsedProperties;
+};
+
+/**
+ * Cleans up redundancy in border properties by removing longhands that are covered by shorthands.
+ *
+ * @param {Map} properties - The map of properties to normalize.
+ * @returns {Map} The normalized properties map.
+ */
+const normalizeProperties = (properties) => {
+ if (properties.has(border.property)) {
+ for (const line of borderLines) {
+ properties.delete(`${border.property}-${line}`);
+ }
+ for (const position of borderPositions) {
+ properties.delete(`${border.property}-${position}`);
+ for (const line of borderLines) {
+ properties.delete(`${border.property}-${position}-${line}`);
+ }
+ }
+ properties.delete(`${border.property}-image`);
+ }
+ for (const line of borderLines) {
+ const lineProperty = `${border.property}-${line}`;
+ if (properties.has(lineProperty)) {
+ for (const position of borderPositions) {
+ const positionProperty = `${border.property}-${position}`;
+ const longhandProperty = `${border.property}-${position}-${line}`;
+ properties.delete(positionProperty);
+ properties.delete(longhandProperty);
+ }
+ }
+ }
+ for (const position of borderPositions) {
+ const positionProperty = `${border.property}-${position}`;
+ if (properties.has(positionProperty)) {
+ const longhandProperties = [];
+ for (const line of borderLines) {
+ const longhandProperty = `${border.property}-${position}-${line}`;
+ longhandProperties.push(longhandProperty);
+ }
+ if (longhandProperties.length === 3) {
+ for (const longhandProperty of longhandProperties) {
+ properties.delete(longhandProperty);
+ }
+ } else {
+ properties.delete(positionProperty);
+ }
+ }
+ }
+ return properties;
+};
+
+module.exports = {
+ borderProperties,
+ getPositionValue,
+ normalizeProperties,
+ prepareBorderProperties,
+ prepareProperties,
+ shorthandProperties
+};
diff --git a/vanilla/node_modules/cssstyle/lib/parsers.js b/vanilla/node_modules/cssstyle/lib/parsers.js
new file mode 100644
index 0000000..ad6951d
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/parsers.js
@@ -0,0 +1,871 @@
+"use strict";
+
+const {
+ resolve: resolveColor,
+ utils: { cssCalc, resolveGradient, splitValue }
+} = require("@asamuzakjp/css-color");
+const { next: syntaxes } = require("@csstools/css-syntax-patches-for-csstree");
+const csstree = require("css-tree");
+const { LRUCache } = require("lru-cache");
+const { asciiLowercase } = require("./utils/strings");
+
+// CSS global keywords
+// @see https://drafts.csswg.org/css-cascade-5/#defaulting-keywords
+const GLOBAL_KEYS = new Set(["initial", "inherit", "unset", "revert", "revert-layer"]);
+
+// System colors
+// @see https://drafts.csswg.org/css-color/#css-system-colors
+// @see https://drafts.csswg.org/css-color/#deprecated-system-colors
+const SYS_COLORS = new Set([
+ "accentcolor",
+ "accentcolortext",
+ "activeborder",
+ "activecaption",
+ "activetext",
+ "appworkspace",
+ "background",
+ "buttonborder",
+ "buttonface",
+ "buttonhighlight",
+ "buttonshadow",
+ "buttontext",
+ "canvas",
+ "canvastext",
+ "captiontext",
+ "field",
+ "fieldtext",
+ "graytext",
+ "highlight",
+ "highlighttext",
+ "inactiveborder",
+ "inactivecaption",
+ "inactivecaptiontext",
+ "infobackground",
+ "infotext",
+ "linktext",
+ "mark",
+ "marktext",
+ "menu",
+ "menutext",
+ "scrollbar",
+ "selecteditem",
+ "selecteditemtext",
+ "threeddarkshadow",
+ "threedface",
+ "threedhighlight",
+ "threedlightshadow",
+ "threedshadow",
+ "visitedtext",
+ "window",
+ "windowframe",
+ "windowtext"
+]);
+
+// AST node types
+const AST_TYPES = Object.freeze({
+ CALC: "Calc",
+ DIMENSION: "Dimension",
+ FUNCTION: "Function",
+ GLOBAL_KEYWORD: "GlobalKeyword",
+ HASH: "Hash",
+ IDENTIFIER: "Identifier",
+ NUMBER: "Number",
+ PERCENTAGE: "Percentage",
+ STRING: "String",
+ URL: "Url"
+});
+
+// Regular expressions
+const CALC_FUNC_NAMES =
+ "(?:a?(?:cos|sin|tan)|abs|atan2|calc|clamp|exp|hypot|log|max|min|mod|pow|rem|round|sign|sqrt)";
+const calcRegEx = new RegExp(`^${CALC_FUNC_NAMES}\\(`);
+const calcContainedRegEx = new RegExp(`(?<=[*/\\s(])${CALC_FUNC_NAMES}\\(`);
+const calcNameRegEx = new RegExp(`^${CALC_FUNC_NAMES}$`);
+const varRegEx = /^var\(/;
+const varContainedRegEx = /(?<=[*/\s(])var\(/;
+
+// Patched css-tree
+const cssTree = csstree.fork(syntaxes);
+
+// Instance of the LRU Cache. Stores up to 4096 items.
+const lruCache = new LRUCache({
+ max: 4096
+});
+
+/**
+ * Prepares a stringified value.
+ *
+ * @param {string|number|null|undefined} value - The value to prepare.
+ * @returns {string} The prepared value.
+ */
+const prepareValue = (value) => {
+ // `null` is converted to an empty string.
+ // @see https://webidl.spec.whatwg.org/#LegacyNullToEmptyString
+ if (value === null) {
+ return "";
+ }
+ return `${value}`.trim();
+};
+
+/**
+ * Checks if the value is a global keyword.
+ *
+ * @param {string} val - The value to check.
+ * @returns {boolean} True if the value is a global keyword, false otherwise.
+ */
+const isGlobalKeyword = (val) => {
+ return GLOBAL_KEYS.has(asciiLowercase(val));
+};
+
+/**
+ * Checks if the value starts with or contains a CSS var() function.
+ *
+ * @param {string} val - The value to check.
+ * @returns {boolean} True if the value contains a var() function, false otherwise.
+ */
+const hasVarFunc = (val) => {
+ return varRegEx.test(val) || varContainedRegEx.test(val);
+};
+
+/**
+ * Checks if the value starts with or contains CSS calc() or math functions.
+ *
+ * @param {string} val - The value to check.
+ * @returns {boolean} True if the value contains calc() or math functions, false otherwise.
+ */
+const hasCalcFunc = (val) => {
+ return calcRegEx.test(val) || calcContainedRegEx.test(val);
+};
+
+/**
+ * Parses a CSS string into an AST.
+ *
+ * @param {string} val - The CSS string to parse.
+ * @param {object} opt - The options for parsing.
+ * @param {boolean} [toObject=false] - Whether to return a plain object.
+ * @returns {object} The AST or a plain object.
+ */
+const parseCSS = (val, opt, toObject = false) => {
+ val = prepareValue(val);
+ const ast = cssTree.parse(val, opt);
+ if (toObject) {
+ return cssTree.toPlainObject(ast);
+ }
+ return ast;
+};
+
+/**
+ * Checks if the value is a valid property value.
+ * Returns false for custom properties or values containing var().
+ *
+ * @param {string} prop - The property name.
+ * @param {string} val - The property value.
+ * @returns {boolean} True if the value is valid, false otherwise.
+ */
+const isValidPropertyValue = (prop, val) => {
+ val = prepareValue(val);
+ if (val === "") {
+ return true;
+ }
+ // cssTree.lexer does not support deprecated system colors
+ // @see https://github.com/w3c/webref/issues/1519#issuecomment-3120290261
+ // @see https://github.com/w3c/webref/issues/1647
+ if (SYS_COLORS.has(asciiLowercase(val))) {
+ if (/^(?:-webkit-)?(?:[a-z][a-z\d]*-)*color$/i.test(prop)) {
+ return true;
+ }
+ return false;
+ }
+ const cacheKey = `isValidPropertyValue_${prop}_${val}`;
+ const cachedValue = lruCache.get(cacheKey);
+ if (typeof cachedValue === "boolean") {
+ return cachedValue;
+ }
+ let result;
+ try {
+ const ast = parseCSS(val, {
+ context: "value"
+ });
+ const { error, matched } = cssTree.lexer.matchProperty(prop, ast);
+ result = error === null && matched !== null;
+ } catch {
+ result = false;
+ }
+ lruCache.set(cacheKey, result);
+ return result;
+};
+
+/**
+ * Resolves CSS math functions.
+ *
+ * @param {string} val - The value to resolve.
+ * @param {object} [opt={ format: "specifiedValue" }] - The options for resolving.
+ * @returns {string|undefined} The resolved value.
+ */
+const resolveCalc = (val, opt = { format: "specifiedValue" }) => {
+ val = prepareValue(val);
+ if (val === "" || hasVarFunc(val) || !hasCalcFunc(val)) {
+ return val;
+ }
+ const cacheKey = `resolveCalc_${val}`;
+ const cachedValue = lruCache.get(cacheKey);
+ if (typeof cachedValue === "string") {
+ return cachedValue;
+ }
+ const obj = parseCSS(val, { context: "value" }, true);
+ if (!obj?.children) {
+ return;
+ }
+ const { children: items } = obj;
+ const values = [];
+ for (const item of items) {
+ const { type: itemType, name: itemName, value: itemValue } = item;
+ if (itemType === AST_TYPES.FUNCTION) {
+ const value = cssTree
+ .generate(item)
+ .replace(/\)(?!\)|\s|,)/g, ") ")
+ .trim();
+ if (calcNameRegEx.test(itemName)) {
+ const newValue = cssCalc(value, opt);
+ values.push(newValue);
+ } else {
+ values.push(value);
+ }
+ } else if (itemType === AST_TYPES.STRING) {
+ values.push(`"${itemValue}"`);
+ } else {
+ values.push(itemName ?? itemValue);
+ }
+ }
+ const resolvedValue = values.join(" ");
+ lruCache.set(cacheKey, resolvedValue);
+ return resolvedValue;
+};
+
+/**
+ * Parses a property value.
+ * Returns a string or an array of parsed objects.
+ *
+ * @param {string} prop - The property name.
+ * @param {string} val - The property value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|Array<object>|undefined} The parsed value.
+ */
+const parsePropertyValue = (prop, val, opt = {}) => {
+ const { caseSensitive, inArray } = opt;
+ val = prepareValue(val);
+ if (val === "" || hasVarFunc(val)) {
+ return val;
+ } else if (hasCalcFunc(val)) {
+ const calculatedValue = resolveCalc(val, {
+ format: "specifiedValue"
+ });
+ if (typeof calculatedValue !== "string") {
+ return;
+ }
+ val = calculatedValue;
+ }
+ const cacheKey = `parsePropertyValue_${prop}_${val}_${caseSensitive}`;
+ const cachedValue = lruCache.get(cacheKey);
+ if (cachedValue === false) {
+ return;
+ } else if (inArray) {
+ if (Array.isArray(cachedValue)) {
+ return cachedValue;
+ }
+ } else if (typeof cachedValue === "string") {
+ return cachedValue;
+ }
+ let parsedValue;
+ const lowerCasedValue = asciiLowercase(val);
+ if (GLOBAL_KEYS.has(lowerCasedValue)) {
+ if (inArray) {
+ parsedValue = [
+ {
+ type: AST_TYPES.GLOBAL_KEYWORD,
+ name: lowerCasedValue
+ }
+ ];
+ } else {
+ parsedValue = lowerCasedValue;
+ }
+ } else if (SYS_COLORS.has(lowerCasedValue)) {
+ if (/^(?:(?:-webkit-)?(?:[a-z][a-z\d]*-)*color|border)$/i.test(prop)) {
+ if (inArray) {
+ parsedValue = [
+ {
+ type: AST_TYPES.IDENTIFIER,
+ name: lowerCasedValue
+ }
+ ];
+ } else {
+ parsedValue = lowerCasedValue;
+ }
+ } else {
+ parsedValue = false;
+ }
+ } else {
+ try {
+ const ast = parseCSS(val, {
+ context: "value"
+ });
+ const { error, matched } = cssTree.lexer.matchProperty(prop, ast);
+ if (error || !matched) {
+ parsedValue = false;
+ } else if (inArray) {
+ const obj = cssTree.toPlainObject(ast);
+ const items = obj.children;
+ const values = [];
+ for (const item of items) {
+ const { children, name, type, value, unit } = item;
+ switch (type) {
+ case AST_TYPES.DIMENSION: {
+ values.push({
+ type,
+ value,
+ unit: asciiLowercase(unit)
+ });
+ break;
+ }
+ case AST_TYPES.FUNCTION: {
+ const css = cssTree
+ .generate(item)
+ .replace(/\)(?!\)|\s|,)/g, ") ")
+ .trim();
+ const raw = items.length === 1 ? val : css;
+ // Remove "${name}(" from the start and ")" from the end
+ const itemValue = raw.slice(name.length + 1, -1).trim();
+ if (name === "calc") {
+ if (children.length === 1) {
+ const [child] = children;
+ if (child.type === AST_TYPES.NUMBER) {
+ values.push({
+ type: AST_TYPES.CALC,
+ isNumber: true,
+ value: `${parseFloat(child.value)}`,
+ name,
+ raw
+ });
+ } else {
+ values.push({
+ type: AST_TYPES.CALC,
+ isNumber: false,
+ value: `${asciiLowercase(itemValue)}`,
+ name,
+ raw
+ });
+ }
+ } else {
+ values.push({
+ type: AST_TYPES.CALC,
+ isNumber: false,
+ value: asciiLowercase(itemValue),
+ name,
+ raw
+ });
+ }
+ } else {
+ values.push({
+ type,
+ name,
+ value: asciiLowercase(itemValue),
+ raw
+ });
+ }
+ break;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ if (caseSensitive) {
+ values.push(item);
+ } else {
+ values.push({
+ type,
+ name: asciiLowercase(name)
+ });
+ }
+ break;
+ }
+ default: {
+ values.push(item);
+ }
+ }
+ }
+ parsedValue = values;
+ } else {
+ parsedValue = val;
+ }
+ } catch {
+ parsedValue = false;
+ }
+ }
+ lruCache.set(cacheKey, parsedValue);
+ if (parsedValue === false) {
+ return;
+ }
+ return parsedValue;
+};
+
+/**
+ * Parses a numeric value (number, dimension, percentage).
+ * Helper function for parseNumber, parseLength, etc.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @param {Function} validateType - Function to validate the node type.
+ * @returns {object|undefined} The parsed result containing num and unit, or undefined.
+ */
+const parseNumericValue = (val, opt, validateType) => {
+ const [item] = val;
+ const { type, value, unit } = item ?? {};
+ if (!validateType(type, value, unit)) {
+ return;
+ }
+ const { clamp } = opt || {};
+ const max = opt?.max ?? Number.INFINITY;
+ const min = opt?.min ?? Number.NEGATIVE_INFINITY;
+ let num = parseFloat(value);
+ if (clamp) {
+ if (num > max) {
+ num = max;
+ } else if (num < min) {
+ num = min;
+ }
+ } else if (num > max || num < min) {
+ return;
+ }
+ return {
+ num,
+ unit: unit ? asciiLowercase(unit) : null,
+ type
+ };
+};
+
+/**
+ * Parses a <number> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The parsed number.
+ */
+const parseNumber = (val, opt = {}) => {
+ const res = parseNumericValue(val, opt, (type) => type === AST_TYPES.NUMBER);
+ if (!res) {
+ return;
+ }
+ return `${res.num}`;
+};
+
+/**
+ * Parses a <length> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The parsed length.
+ */
+const parseLength = (val, opt = {}) => {
+ const res = parseNumericValue(
+ val,
+ opt,
+ (type, value) => type === AST_TYPES.DIMENSION || (type === AST_TYPES.NUMBER && value === "0")
+ );
+ if (!res) {
+ return;
+ }
+ const { num, unit } = res;
+ if (num === 0 && !unit) {
+ return `${num}px`;
+ } else if (unit) {
+ return `${num}${unit}`;
+ }
+};
+
+/**
+ * Parses a <percentage> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The parsed percentage.
+ */
+const parsePercentage = (val, opt = {}) => {
+ const res = parseNumericValue(
+ val,
+ opt,
+ (type, value) => type === AST_TYPES.PERCENTAGE || (type === AST_TYPES.NUMBER && value === "0")
+ );
+ if (!res) {
+ return;
+ }
+ const { num } = res;
+ return `${num}%`;
+};
+
+/**
+ * Parses an <angle> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The parsed angle.
+ */
+const parseAngle = (val, opt = {}) => {
+ const res = parseNumericValue(
+ val,
+ opt,
+ (type, value) => type === AST_TYPES.DIMENSION || (type === AST_TYPES.NUMBER && value === "0")
+ );
+ if (!res) {
+ return;
+ }
+ const { num, unit } = res;
+ if (unit) {
+ if (!/^(?:deg|g?rad|turn)$/i.test(unit)) {
+ return;
+ }
+ return `${num}${unit}`;
+ } else if (num === 0) {
+ return `${num}deg`;
+ }
+};
+
+/**
+ * Parses a <url> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @returns {string|undefined} The parsed url.
+ */
+const parseUrl = (val) => {
+ const [item] = val;
+ const { type, value } = item ?? {};
+ if (type !== AST_TYPES.URL) {
+ return;
+ }
+ const str = value.replace(/\\\\/g, "\\").replaceAll('"', '\\"');
+ return `url("${str}")`;
+};
+
+/**
+ * Parses a <string> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @returns {string|undefined} The parsed string.
+ */
+const parseString = (val) => {
+ const [item] = val;
+ const { type, value } = item ?? {};
+ if (type !== AST_TYPES.STRING) {
+ return;
+ }
+ const str = value.replace(/\\\\/g, "\\").replaceAll('"', '\\"');
+ return `"${str}"`;
+};
+
+/**
+ * Parses a <color> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @returns {string|undefined} The parsed color.
+ */
+const parseColor = (val) => {
+ const [item] = val;
+ const { name, type, value } = item ?? {};
+ switch (type) {
+ case AST_TYPES.FUNCTION: {
+ const res = resolveColor(`${name}(${value})`, {
+ format: "specifiedValue"
+ });
+ if (res) {
+ return res;
+ }
+ break;
+ }
+ case AST_TYPES.HASH: {
+ const res = resolveColor(`#${value}`, {
+ format: "specifiedValue"
+ });
+ if (res) {
+ return res;
+ }
+ break;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ if (SYS_COLORS.has(name)) {
+ return name;
+ }
+ const res = resolveColor(name, {
+ format: "specifiedValue"
+ });
+ if (res) {
+ return res;
+ }
+ break;
+ }
+ default:
+ }
+};
+
+/**
+ * Parses a <gradient> value.
+ *
+ * @param {Array<object>} val - The AST value.
+ * @returns {string|undefined} The parsed gradient.
+ */
+const parseGradient = (val) => {
+ const [item] = val;
+ const { name, type, value } = item ?? {};
+ if (type !== AST_TYPES.FUNCTION) {
+ return;
+ }
+ const res = resolveGradient(`${name}(${value})`, {
+ format: "specifiedValue"
+ });
+ if (res) {
+ return res;
+ }
+};
+
+/**
+ * Resolves a keyword value.
+ *
+ * @param {Array<object>} value - The AST node array containing the keyword value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The resolved keyword or undefined.
+ */
+const resolveKeywordValue = (value, opt = {}) => {
+ const [{ name, type }] = value;
+ const { length } = opt;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ if (length > 1) {
+ return;
+ }
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ return name;
+ }
+ default:
+ }
+};
+
+/**
+ * Resolves a function value.
+ *
+ * @param {Array<object>} value - The AST node array containing the function value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The resolved function or undefined.
+ */
+const resolveFunctionValue = (value, opt = {}) => {
+ const [{ name, type, value: itemValue }] = value;
+ const { length } = opt;
+ switch (type) {
+ case AST_TYPES.FUNCTION: {
+ return `${name}(${itemValue})`;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ if (length > 1) {
+ return;
+ }
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ return name;
+ }
+ default:
+ }
+};
+
+/**
+ * Resolves a length or percentage or number value.
+ *
+ * @param {Array<object>} value - The AST node array containing the value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The resolved length/percentage/number or undefined.
+ */
+const resolveNumericValue = (value, opt = {}) => {
+ const [{ name, type: itemType, value: itemValue }] = value;
+ const { length, type } = opt;
+ switch (itemType) {
+ case AST_TYPES.CALC: {
+ return `${name}(${itemValue})`;
+ }
+ case AST_TYPES.DIMENSION: {
+ if (type === "angle") {
+ return parseAngle(value, opt);
+ }
+ return parseLength(value, opt);
+ }
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ if (length > 1) {
+ return;
+ }
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ return name;
+ }
+ case AST_TYPES.NUMBER: {
+ switch (type) {
+ case "angle": {
+ return parseAngle(value, opt);
+ }
+ case "length": {
+ return parseLength(value, opt);
+ }
+ case "percentage": {
+ return parsePercentage(value, opt);
+ }
+ default: {
+ return parseNumber(value, opt);
+ }
+ }
+ }
+ case AST_TYPES.PERCENTAGE: {
+ return parsePercentage(value, opt);
+ }
+ default:
+ }
+};
+
+/**
+ * Resolves a color value.
+ *
+ * @param {Array<object>} value - The AST node array containing the color value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The resolved color or undefined.
+ */
+const resolveColorValue = (value, opt = {}) => {
+ const [{ name, type }] = value;
+ const { length } = opt;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ if (length > 1) {
+ return;
+ }
+ return name;
+ }
+ default: {
+ return parseColor(value, opt);
+ }
+ }
+};
+
+/**
+ * Resolves a gradient or URL value.
+ *
+ * @param {Array<object>} value - The AST node array containing the color value.
+ * @param {object} [opt={}] - The options for parsing.
+ * @returns {string|undefined} The resolved gradient/url or undefined.
+ */
+const resolveGradientUrlValue = (value, opt = {}) => {
+ const [{ name, type }] = value;
+ const { length } = opt;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ if (length > 1) {
+ return;
+ }
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ return name;
+ }
+ case AST_TYPES.URL: {
+ return parseUrl(value, opt);
+ }
+ default: {
+ return parseGradient(value, opt);
+ }
+ }
+};
+
+/**
+ * Resolves a border shorthand value.
+ *
+ * @param {Array<object>} value - The AST node array containing the shorthand value.
+ * @param {object} subProps - The sub properties object.
+ * @param {Map} parsedValues - The Map of parsed values.
+ * @returns {Array|string|undefined} - The resolved [prop, value] pair, keyword or undefined.
+ */
+const resolveBorderShorthandValue = (value, subProps, parsedValues) => {
+ const [{ isNumber, name, type, value: itemValue }] = value;
+ const { color: colorProp, style: styleProp, width: widthProp } = subProps;
+ switch (type) {
+ case AST_TYPES.CALC: {
+ if (isNumber || parsedValues.has(widthProp)) {
+ return;
+ }
+ return [widthProp, `${name}(${itemValue}`];
+ }
+ case AST_TYPES.DIMENSION:
+ case AST_TYPES.NUMBER: {
+ if (parsedValues.has(widthProp)) {
+ return;
+ }
+ const parsedValue = parseLength(value, { min: 0 });
+ if (!parsedValue) {
+ return;
+ }
+ return [widthProp, parsedValue];
+ }
+ case AST_TYPES.FUNCTION:
+ case AST_TYPES.HASH: {
+ if (parsedValues.has(colorProp)) {
+ return;
+ }
+ const parsedValue = parseColor(value);
+ if (!parsedValue) {
+ return;
+ }
+ return [colorProp, parsedValue];
+ }
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ if (isValidPropertyValue(widthProp, name)) {
+ if (parsedValues.has(widthProp)) {
+ return;
+ }
+ return [widthProp, name];
+ } else if (isValidPropertyValue(styleProp, name)) {
+ if (parsedValues.has(styleProp)) {
+ return;
+ }
+ return [styleProp, name];
+ } else if (isValidPropertyValue(colorProp, name)) {
+ if (parsedValues.has(colorProp)) {
+ return;
+ }
+ return [colorProp, name];
+ }
+ break;
+ }
+ default:
+ }
+};
+
+module.exports = {
+ AST_TYPES,
+ hasCalcFunc,
+ hasVarFunc,
+ isGlobalKeyword,
+ isValidPropertyValue,
+ parseAngle,
+ parseCSS,
+ parseColor,
+ parseGradient,
+ parseLength,
+ parseNumber,
+ parsePercentage,
+ parsePropertyValue,
+ parseString,
+ parseUrl,
+ prepareValue,
+ resolveBorderShorthandValue,
+ resolveCalc,
+ resolveColorValue,
+ resolveFunctionValue,
+ resolveGradientUrlValue,
+ resolveKeywordValue,
+ resolveNumericValue,
+ splitValue
+};
diff --git a/vanilla/node_modules/cssstyle/lib/properties/background.js b/vanilla/node_modules/cssstyle/lib/properties/background.js
new file mode 100644
index 0000000..cf4acb4
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/background.js
@@ -0,0 +1,406 @@
+"use strict";
+
+const parsers = require("../parsers");
+const backgroundImage = require("./backgroundImage");
+const backgroundPosition = require("./backgroundPosition");
+const backgroundSize = require("./backgroundSize");
+const backgroundRepeat = require("./backgroundRepeat");
+const backgroundOrigin = require("./backgroundOrigin");
+const backgroundClip = require("./backgroundClip");
+const backgroundAttachment = require("./backgroundAttachment");
+const backgroundColor = require("./backgroundColor");
+
+const property = "background";
+
+module.exports.initialValues = new Map([
+ [backgroundImage.property, "none"],
+ [backgroundPosition.property, "0% 0%"],
+ [backgroundSize.property, "auto"],
+ [backgroundRepeat.property, "repeat"],
+ [backgroundOrigin.property, "padding-box"],
+ [backgroundClip.property, "border-box"],
+ [backgroundAttachment.property, "scroll"],
+ [backgroundColor.property, "transparent"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [backgroundImage.property, backgroundImage],
+ [backgroundPosition.property, backgroundPosition],
+ [backgroundSize.property, backgroundSize],
+ [backgroundRepeat.property, backgroundRepeat],
+ [backgroundOrigin.property, backgroundOrigin],
+ [backgroundClip.property, backgroundClip],
+ [backgroundAttachment.property, backgroundAttachment],
+ [backgroundColor.property, backgroundColor]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ } else if (parsers.hasCalcFunc(v)) {
+ v = parsers.resolveCalc(v);
+ }
+ if (!parsers.isValidPropertyValue(property, v)) {
+ return;
+ }
+ const values = parsers.splitValue(v, {
+ delimiter: ","
+ });
+ const bgValues = [];
+ const l = values.length;
+ for (let i = 0; i < l; i++) {
+ let bg = {
+ [backgroundImage.property]: module.exports.initialValues.get(backgroundImage.property),
+ [backgroundPosition.property]: module.exports.initialValues.get(backgroundPosition.property),
+ [backgroundSize.property]: module.exports.initialValues.get(backgroundSize.property),
+ [backgroundRepeat.property]: module.exports.initialValues.get(backgroundRepeat.property),
+ [backgroundOrigin.property]: module.exports.initialValues.get(backgroundOrigin.property),
+ [backgroundClip.property]: module.exports.initialValues.get(backgroundClip.property),
+ [backgroundAttachment.property]: module.exports.initialValues.get(
+ backgroundAttachment.property
+ ),
+ [backgroundColor.property]: module.exports.initialValues.get(backgroundColor.property)
+ };
+ if (l > 1 && i !== l - 1) {
+ bg = {
+ [backgroundImage.property]: module.exports.initialValues.get(backgroundImage.property),
+ [backgroundPosition.property]: module.exports.initialValues.get(
+ backgroundPosition.property
+ ),
+ [backgroundSize.property]: module.exports.initialValues.get(backgroundSize.property),
+ [backgroundRepeat.property]: module.exports.initialValues.get(backgroundRepeat.property),
+ [backgroundOrigin.property]: module.exports.initialValues.get(backgroundOrigin.property),
+ [backgroundClip.property]: module.exports.initialValues.get(backgroundClip.property),
+ [backgroundAttachment.property]: module.exports.initialValues.get(
+ backgroundAttachment.property
+ )
+ };
+ }
+ const bgPosition = [];
+ const bgSize = [];
+ const bgRepeat = [];
+ const bgBox = [];
+ const bgParts = parsers.splitValue(values[i], {
+ delimiter: "/"
+ });
+ if (!bgParts.length || bgParts.length > 2) {
+ return;
+ }
+ const [bgPart1, bgPart2 = ""] = bgParts;
+ const parts1 = parsers.splitValue(bgPart1);
+ for (const part of parts1) {
+ let partValid = false;
+ for (const [longhand, value] of module.exports.shorthandFor) {
+ if (parsers.isValidPropertyValue(longhand, part)) {
+ partValid = true;
+ switch (longhand) {
+ case backgroundClip.property:
+ case backgroundOrigin.property: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bgBox.push(parsedValue);
+ }
+ break;
+ }
+ case backgroundColor.property: {
+ if (i !== values.length - 1) {
+ return;
+ }
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ break;
+ }
+ case backgroundPosition.property: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bgPosition.push(parsedValue);
+ }
+ break;
+ }
+ case backgroundRepeat.property: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bgRepeat.push(parsedValue);
+ }
+ break;
+ }
+ case backgroundSize.property: {
+ break;
+ }
+ default: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ }
+ }
+ }
+ }
+ if (!partValid) {
+ return;
+ }
+ }
+ if (bgPart2) {
+ const parts2 = parsers.splitValue(bgPart2);
+ for (const part of parts2) {
+ let partValid = false;
+ for (const [longhand, value] of module.exports.shorthandFor) {
+ if (parsers.isValidPropertyValue(longhand, part)) {
+ partValid = true;
+ switch (longhand) {
+ case backgroundClip.property:
+ case backgroundOrigin.property: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bgBox.push(parsedValue);
+ }
+ break;
+ }
+ case backgroundColor.property: {
+ if (i !== l - 1) {
+ return;
+ }
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ break;
+ }
+ case backgroundPosition.property: {
+ break;
+ }
+ case backgroundRepeat.property: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bgRepeat.push(parsedValue);
+ }
+ break;
+ }
+ case backgroundSize.property: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bgSize.push(parsedValue);
+ }
+ break;
+ }
+ default: {
+ const parsedValue = value.parse(part, { globalObject });
+ if (parsedValue) {
+ bg[longhand] = parsedValue;
+ }
+ }
+ }
+ }
+ }
+ if (!partValid) {
+ return;
+ }
+ }
+ }
+ if (bgPosition.length) {
+ const { parse: parser } = module.exports.shorthandFor.get(backgroundPosition.property);
+ const value = parser(bgPosition.join(" "), { globalObject });
+ if (value) {
+ bg[backgroundPosition.property] = value;
+ }
+ }
+ if (bgSize.length) {
+ const { parse: parser } = module.exports.shorthandFor.get(backgroundSize.property);
+ const value = parser(bgSize.join(" "), { globalObject });
+ if (value) {
+ bg[backgroundSize.property] = value;
+ }
+ }
+ if (bgRepeat.length) {
+ const { parse: parser } = module.exports.shorthandFor.get(backgroundRepeat.property);
+ const value = parser(bgRepeat.join(" "), { globalObject });
+ if (value) {
+ bg[backgroundRepeat.property] = value;
+ }
+ }
+ if (bgBox.length) {
+ switch (bgBox.length) {
+ case 1: {
+ const [value] = bgBox;
+ bg[backgroundOrigin.property] = value;
+ bg[backgroundClip.property] = value;
+ break;
+ }
+ case 2: {
+ const [value1, value2] = bgBox;
+ bg[backgroundOrigin.property] = value1;
+ bg[backgroundClip.property] = value2;
+ break;
+ }
+ default: {
+ return;
+ }
+ }
+ }
+ bgValues.push(bg);
+ }
+ return bgValues;
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (v === "" || parsers.hasVarFunc(v)) {
+ for (const [key] of module.exports.shorthandFor) {
+ this._setProperty(key, "");
+ }
+ this._setProperty(property, v);
+ } else {
+ const bgValues = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (!Array.isArray(bgValues)) {
+ return;
+ }
+ const bgMap = new Map([
+ [backgroundImage.property, []],
+ [backgroundPosition.property, []],
+ [backgroundSize.property, []],
+ [backgroundRepeat.property, []],
+ [backgroundOrigin.property, []],
+ [backgroundClip.property, []],
+ [backgroundAttachment.property, []],
+ [backgroundColor.property, []]
+ ]);
+ const backgrounds = [];
+ for (const bgValue of bgValues) {
+ const bg = [];
+ for (const [longhand, value] of Object.entries(bgValue)) {
+ if (value) {
+ const arr = bgMap.get(longhand);
+ arr.push(value);
+ bgMap.set(longhand, arr);
+ if (value !== module.exports.initialValues.get(longhand)) {
+ if (longhand === backgroundSize.property) {
+ bg.push(`/ ${value}`);
+ } else {
+ bg.push(value);
+ }
+ } else if (longhand === backgroundImage.property) {
+ if (v === "none") {
+ bg.push(value);
+ }
+ } else if (longhand === backgroundColor.property) {
+ if (v === "transparent") {
+ bg.push(value);
+ }
+ }
+ }
+ }
+ backgrounds.push(bg.join(" "));
+ }
+ const priority = this._priorities.get(property) ?? "";
+ for (const [longhand, value] of bgMap) {
+ this._setProperty(longhand, value.join(", "), priority);
+ }
+ this._setProperty(property, backgrounds.join(", "), priority);
+ }
+ },
+ get() {
+ const v = this.getPropertyValue(property);
+ if (parsers.hasVarFunc(v)) {
+ return v;
+ }
+ const bgMap = new Map();
+ let l = 0;
+ for (const [longhand] of module.exports.shorthandFor) {
+ const val = this.getPropertyValue(longhand);
+ if (longhand === backgroundImage.property) {
+ if (
+ val === "none" &&
+ v === "none" &&
+ this.getPropertyValue(backgroundColor.property) === "transparent"
+ ) {
+ return val;
+ }
+ if (val !== module.exports.initialValues.get(longhand)) {
+ const imgValues = parsers.splitValue(val, {
+ delimiter: ","
+ });
+ l = imgValues.length;
+ bgMap.set(longhand, imgValues);
+ }
+ } else if (longhand === backgroundColor.property) {
+ if (val !== module.exports.initialValues.get(longhand) || v.includes(val)) {
+ bgMap.set(longhand, [val]);
+ }
+ } else if (val !== module.exports.initialValues.get(longhand)) {
+ bgMap.set(
+ longhand,
+ parsers.splitValue(val, {
+ delimiter: ","
+ })
+ );
+ }
+ }
+ if (l === 0) {
+ const bgColArr = bgMap.get(backgroundColor.property);
+ const background = bgColArr ? bgColArr[0] : null;
+ if (background) {
+ return background;
+ }
+ return "";
+ }
+ const bgValues = [];
+ for (let i = 0; i < l; i++) {
+ bgValues[i] = [];
+ }
+ for (const [longhand, values] of bgMap) {
+ for (let i = 0; i < l; i++) {
+ switch (longhand) {
+ case backgroundColor.property: {
+ if (i === l - 1) {
+ const value = values[0];
+ if (parsers.hasVarFunc(value)) {
+ return "";
+ }
+ if (value && value !== module.exports.initialValues.get(longhand)) {
+ const bgValue = bgValues[i];
+ bgValue.push(value);
+ }
+ }
+ break;
+ }
+ case backgroundSize.property: {
+ const value = values[i];
+ if (parsers.hasVarFunc(value)) {
+ return "";
+ }
+ if (value && value !== module.exports.initialValues.get(longhand)) {
+ const bgValue = bgValues[i];
+ bgValue.push(`/ ${value}`);
+ }
+ break;
+ }
+ default: {
+ const value = values[i];
+ if (parsers.hasVarFunc(value)) {
+ return "";
+ }
+ if (value && value !== module.exports.initialValues.get(longhand)) {
+ const bgValue = bgValues[i];
+ bgValue.push(value);
+ }
+ }
+ }
+ }
+ }
+ const backgrounds = [];
+ for (const bgValue of bgValues) {
+ backgrounds.push(bgValue.join(" "));
+ }
+ return backgrounds.join(", ");
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundAttachment.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundAttachment.js
new file mode 100644
index 0000000..32b3aff
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundAttachment.js
@@ -0,0 +1,61 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-attachment";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v, { delimiter: "," });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveKeywordValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundClip.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundClip.js
new file mode 100644
index 0000000..80407bc
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundClip.js
@@ -0,0 +1,61 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-clip";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v, { delimiter: "," });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveKeywordValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundColor.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundColor.js
new file mode 100644
index 0000000..7d3bf99
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundColor.js
@@ -0,0 +1,50 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-color";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundImage.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundImage.js
new file mode 100644
index 0000000..8959685
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundImage.js
@@ -0,0 +1,63 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-image";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v, { delimiter: "," });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveGradientUrlValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundOrigin.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundOrigin.js
new file mode 100644
index 0000000..a1fe9ac
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundOrigin.js
@@ -0,0 +1,61 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-origin";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v, { delimiter: "," });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveKeywordValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundPosition.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundPosition.js
new file mode 100644
index 0000000..23c6c68
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundPosition.js
@@ -0,0 +1,204 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-position";
+const shorthand = "background";
+const keyX = ["left", "right"];
+const keyY = ["top", "bottom"];
+const keywordsX = ["center", ...keyX];
+const keywordsY = ["center", ...keyY];
+const keywords = ["center", ...keyX, ...keyY];
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const values = parsers.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ const [part1, part2, part3, part4] = value;
+ let parsedValue = "";
+ switch (value.length) {
+ case 1: {
+ const val1 =
+ part1.type === AST_TYPES.IDENTIFIER
+ ? part1.name
+ : parsers.resolveNumericValue([part1], { type: "length" });
+ if (val1) {
+ if (val1 === "center") {
+ parsedValue = `${val1} ${val1}`;
+ } else if (val1 === "top" || val1 === "bottom") {
+ parsedValue = `center ${val1}`;
+ } else {
+ parsedValue = `${val1} center`;
+ }
+ }
+ break;
+ }
+ case 2: {
+ const val1 =
+ part1.type === AST_TYPES.IDENTIFIER
+ ? part1.name
+ : parsers.resolveNumericValue([part1], { type: "length" });
+ const val2 =
+ part2.type === AST_TYPES.IDENTIFIER
+ ? part2.name
+ : parsers.resolveNumericValue([part2], { type: "length" });
+ if (val1 && val2) {
+ if (keywordsX.includes(val1) && keywordsY.includes(val2)) {
+ parsedValue = `${val1} ${val2}`;
+ } else if (keywordsY.includes(val1) && keywordsX.includes(val2)) {
+ parsedValue = `${val2} ${val1}`;
+ } else if (keywordsX.includes(val1)) {
+ if (val2 === "center" || !keywordsX.includes(val2)) {
+ parsedValue = `${val1} ${val2}`;
+ }
+ } else if (keywordsY.includes(val2)) {
+ if (!keywordsY.includes(val1)) {
+ parsedValue = `${val1} ${val2}`;
+ }
+ } else if (!keywordsY.includes(val1) && !keywordsX.includes(val2)) {
+ parsedValue = `${val1} ${val2}`;
+ }
+ }
+ break;
+ }
+ case 3: {
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 =
+ part2.type === AST_TYPES.IDENTIFIER
+ ? part2.name
+ : parsers.resolveNumericValue([part2], { type: "length" });
+ const val3 =
+ part3.type === AST_TYPES.IDENTIFIER
+ ? part3.name
+ : parsers.resolveNumericValue([part3], { type: "length" });
+ if (val1 && val2 && val3) {
+ let posX = "";
+ let offX = "";
+ let posY = "";
+ let offY = "";
+ if (keywordsX.includes(val1)) {
+ if (keyY.includes(val2)) {
+ if (!keywords.includes(val3)) {
+ posX = val1;
+ posY = val2;
+ offY = val3;
+ }
+ } else if (keyY.includes(val3)) {
+ if (!keywords.includes(val2)) {
+ posX = val1;
+ offX = val2;
+ posY = val3;
+ }
+ }
+ } else if (keywordsY.includes(val1)) {
+ if (keyX.includes(val2)) {
+ if (!keywords.includes(val3)) {
+ posX = val2;
+ offX = val3;
+ posY = val1;
+ }
+ } else if (keyX.includes(val3)) {
+ if (!keywords.includes(val2)) {
+ posX = val3;
+ posY = val1;
+ offY = val2;
+ }
+ }
+ }
+ if (posX && posY) {
+ if (offX) {
+ parsedValue = `${posX} ${offX} ${posY}`;
+ } else if (offY) {
+ parsedValue = `${posX} ${posY} ${offY}`;
+ }
+ }
+ }
+ break;
+ }
+ case 4: {
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = parsers.resolveNumericValue([part2], { type: "length" });
+ const val3 = part3.type === AST_TYPES.IDENTIFIER && part3.name;
+ const val4 = parsers.resolveNumericValue([part4], { type: "length" });
+ if (val1 && val2 && val3 && val4) {
+ let posX = "";
+ let offX = "";
+ let posY = "";
+ let offY = "";
+ if (keywordsX.includes(val1) && keyY.includes(val3)) {
+ posX = val1;
+ offX = val2;
+ posY = val3;
+ offY = val4;
+ } else if (keyX.includes(val1) && keywordsY.includes(val3)) {
+ posX = val1;
+ offX = val2;
+ posY = val3;
+ offY = val4;
+ } else if (keyY.includes(val1) && keywordsX.includes(val3)) {
+ posX = val3;
+ offX = val4;
+ posY = val1;
+ offY = val2;
+ }
+ if (posX && offX && posY && offY) {
+ parsedValue = `${posX} ${offX} ${posY} ${offY}`;
+ }
+ }
+ break;
+ }
+ default:
+ }
+ if (parsedValue) {
+ parsedValues.push(parsedValue);
+ } else {
+ return;
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundRepeat.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundRepeat.js
new file mode 100644
index 0000000..6bb9ddd
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundRepeat.js
@@ -0,0 +1,93 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-repeat";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const values = parsers.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ let parsedValue = "";
+ switch (value.length) {
+ case 1: {
+ const [part1] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ if (val1) {
+ parsedValue = val1;
+ }
+ break;
+ }
+ case 2: {
+ const [part1, part2] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
+ if (val1 && val2) {
+ if (val1 === "repeat" && val2 === "no-repeat") {
+ parsedValue = "repeat-x";
+ } else if (val1 === "no-repeat" && val2 === "repeat") {
+ parsedValue = "repeat-y";
+ } else if (val1 === val2) {
+ parsedValue = val1;
+ } else {
+ parsedValue = `${val1} ${val2}`;
+ }
+ }
+ break;
+ }
+ default:
+ }
+ if (parsedValue) {
+ parsedValues.push(parsedValue);
+ } else {
+ return;
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/backgroundSize.js b/vanilla/node_modules/cssstyle/lib/properties/backgroundSize.js
new file mode 100644
index 0000000..be31044
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/backgroundSize.js
@@ -0,0 +1,126 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "background-size";
+const shorthand = "background";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const values = parsers.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ if (value.length === 1) {
+ const [{ isNumber, name, type, value: itemValue }] = value;
+ switch (type) {
+ case AST_TYPES.CALC: {
+ if (isNumber) {
+ return;
+ }
+ parsedValues.push(`${name}(${itemValue})`);
+ break;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER: {
+ parsedValues.push(name);
+ break;
+ }
+ default: {
+ const parsedValue = parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ }
+ } else {
+ const [val1, val2] = value;
+ const parts = [];
+ if (val1.type === AST_TYPES.CALC && !val1.isNumber) {
+ parts.push(`${val1.name}(${val1.value})`);
+ } else if (val1.type === AST_TYPES.IDENTIFIER) {
+ parts.push(val1.name);
+ } else if (val1.type === AST_TYPES.DIMENSION) {
+ parts.push(`${val1.value}${val1.unit}`);
+ } else if (val1.type === AST_TYPES.PERCENTAGE) {
+ parts.push(`${val1.value}%`);
+ } else {
+ return;
+ }
+ switch (val2.type) {
+ case AST_TYPES.CALC: {
+ if (val2.isNumber) {
+ return;
+ }
+ parts.push(`${val2.name}(${val2.value})`);
+ break;
+ }
+ case AST_TYPES.DIMENSION: {
+ parts.push(`${val2.value}${val2.unit}`);
+ break;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ if (val2.name !== "auto") {
+ parts.push(val2.name);
+ }
+ break;
+ }
+ case AST_TYPES.PERCENTAGE: {
+ parts.push(`${val2.value}%`);
+ break;
+ }
+ default: {
+ return;
+ }
+ }
+ parsedValues.push(parts.join(" "));
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/border.js b/vanilla/node_modules/cssstyle/lib/properties/border.js
new file mode 100644
index 0000000..889bd5a
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/border.js
@@ -0,0 +1,107 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderWidth = require("./borderWidth");
+const borderStyle = require("./borderStyle");
+const borderColor = require("./borderColor");
+const borderTop = require("./borderTop");
+const borderRight = require("./borderRight");
+const borderBottom = require("./borderBottom");
+const borderLeft = require("./borderLeft");
+
+const property = "border";
+
+const subProps = {
+ width: borderWidth.property,
+ style: borderStyle.property,
+ color: borderColor.property
+};
+
+module.exports.initialValues = new Map([
+ [borderWidth.property, "medium"],
+ [borderStyle.property, "none"],
+ [borderColor.property, "currentcolor"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [borderWidth.property, borderWidth],
+ [borderStyle.property, borderStyle],
+ [borderColor.property, borderColor]
+]);
+
+module.exports.positionShorthandFor = new Map([
+ [borderTop.property, borderTop],
+ [borderRight.property, borderRight],
+ [borderBottom.property, borderBottom],
+ [borderLeft.property, borderLeft]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "" || parsers.hasVarFunc(v)) {
+ return v;
+ }
+ const values = parsers.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveBorderShorthandValue(value, subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = module.exports.shorthandFor.keys();
+ const obj = {
+ [borderWidth.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== module.exports.initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[borderWidth.property] && obj[borderWidth.property] === "medium") {
+ delete obj[borderWidth.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderBottom.js b/vanilla/node_modules/cssstyle/lib/properties/borderBottom.js
new file mode 100644
index 0000000..7cb2892
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderBottom.js
@@ -0,0 +1,100 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderBottomWidth = require("./borderBottomWidth");
+const borderBottomStyle = require("./borderBottomStyle");
+const borderBottomColor = require("./borderBottomColor");
+
+const property = "border-bottom";
+const shorthand = "border";
+
+const subProps = {
+ width: borderBottomWidth.property,
+ style: borderBottomStyle.property,
+ color: borderBottomColor.property
+};
+
+module.exports.initialValues = new Map([
+ [borderBottomWidth.property, "medium"],
+ [borderBottomStyle.property, "none"],
+ [borderBottomColor.property, "currentcolor"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [borderBottomWidth.property, borderBottomWidth],
+ [borderBottomStyle.property, borderBottomStyle],
+ [borderBottomColor.property, borderBottomColor]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveBorderShorthandValue(value, subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = module.exports.shorthandFor.keys();
+ const obj = {
+ [borderBottomWidth.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== module.exports.initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[borderBottomWidth.property] && obj[borderBottomWidth.property] === "medium") {
+ delete obj[borderBottomWidth.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderBottomColor.js b/vanilla/node_modules/cssstyle/lib/properties/borderBottomColor.js
new file mode 100644
index 0000000..b458fd4
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderBottomColor.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-bottom-color";
+const lineShorthand = "border-color";
+const positionShorthand = "border-bottom";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderBottomStyle.js b/vanilla/node_modules/cssstyle/lib/properties/borderBottomStyle.js
new file mode 100644
index 0000000..b54b6a9
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderBottomStyle.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-bottom-style";
+const lineShorthand = "border-style";
+const positionShorthand = "border-bottom";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderBottomWidth.js b/vanilla/node_modules/cssstyle/lib/properties/borderBottomWidth.js
new file mode 100644
index 0000000..3200365
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderBottomWidth.js
@@ -0,0 +1,57 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-bottom-width";
+const lineShorthand = "border-width";
+const positionShorthand = "border-bottom";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderCollapse.js b/vanilla/node_modules/cssstyle/lib/properties/borderCollapse.js
new file mode 100644
index 0000000..f77c445
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderCollapse.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-collapse";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderColor.js b/vanilla/node_modules/cssstyle/lib/properties/borderColor.js
new file mode 100644
index 0000000..232d34c
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderColor.js
@@ -0,0 +1,110 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderTopColor = require("./borderTopColor");
+const borderRightColor = require("./borderRightColor");
+const borderBottomColor = require("./borderBottomColor");
+const borderLeftColor = require("./borderLeftColor");
+
+const property = "border-color";
+const shorthand = "border";
+
+module.exports.shorthandFor = new Map([
+ [borderTopColor.property, borderTopColor],
+ [borderRightColor.property, borderRightColor],
+ [borderBottomColor.property, borderBottomColor],
+ [borderLeftColor.property, borderLeftColor]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = parsers.resolveColorValue([value], {
+ length: values.length
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ switch (parsedValues.length) {
+ case 1: {
+ return parsedValues;
+ }
+ case 2: {
+ const [val1, val2] = parsedValues;
+ if (val1 === val2) {
+ return [val1];
+ }
+ return parsedValues;
+ }
+ case 3: {
+ const [val1, val2, val3] = parsedValues;
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return parsedValues;
+ }
+ case 4: {
+ const [val1, val2, val3, val4] = parsedValues;
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return [val1, val2, val3];
+ }
+ return parsedValues;
+ }
+ default:
+ }
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderLeft.js b/vanilla/node_modules/cssstyle/lib/properties/borderLeft.js
new file mode 100644
index 0000000..7c40f58
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderLeft.js
@@ -0,0 +1,100 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderLeftWidth = require("./borderLeftWidth");
+const borderLeftStyle = require("./borderLeftStyle");
+const borderLeftColor = require("./borderLeftColor");
+
+const property = "border-left";
+const shorthand = "border";
+
+const subProps = {
+ width: borderLeftWidth.property,
+ style: borderLeftStyle.property,
+ color: borderLeftColor.property
+};
+
+module.exports.initialValues = new Map([
+ [borderLeftWidth.property, "medium"],
+ [borderLeftStyle.property, "none"],
+ [borderLeftColor.property, "currentcolor"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [borderLeftWidth.property, borderLeftWidth],
+ [borderLeftStyle.property, borderLeftStyle],
+ [borderLeftColor.property, borderLeftColor]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveBorderShorthandValue(value, subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = module.exports.shorthandFor.keys();
+ const obj = {
+ [borderLeftWidth.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== module.exports.initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[borderLeftWidth.property] && obj[borderLeftWidth.property] === "medium") {
+ delete obj[borderLeftWidth.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderLeftColor.js b/vanilla/node_modules/cssstyle/lib/properties/borderLeftColor.js
new file mode 100644
index 0000000..7cb630e
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderLeftColor.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-left-color";
+const lineShorthand = "border-color";
+const positionShorthand = "border-left";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderLeftStyle.js b/vanilla/node_modules/cssstyle/lib/properties/borderLeftStyle.js
new file mode 100644
index 0000000..8fa5761
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderLeftStyle.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-left-style";
+const lineShorthand = "border-style";
+const positionShorthand = "border-left";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderLeftWidth.js b/vanilla/node_modules/cssstyle/lib/properties/borderLeftWidth.js
new file mode 100644
index 0000000..74dd03f
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderLeftWidth.js
@@ -0,0 +1,57 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-left-width";
+const lineShorthand = "border-width";
+const positionShorthand = "border-left";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderRight.js b/vanilla/node_modules/cssstyle/lib/properties/borderRight.js
new file mode 100644
index 0000000..43c2878
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderRight.js
@@ -0,0 +1,100 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderRightWidth = require("./borderRightWidth");
+const borderRightStyle = require("./borderRightStyle");
+const borderRightColor = require("./borderRightColor");
+
+const property = "border-right";
+const shorthand = "border";
+
+const subProps = {
+ width: borderRightWidth.property,
+ style: borderRightStyle.property,
+ color: borderRightColor.property
+};
+
+module.exports.initialValues = new Map([
+ [borderRightWidth.property, "medium"],
+ [borderRightStyle.property, "none"],
+ [borderRightColor.property, "currentcolor"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [borderRightWidth.property, borderRightWidth],
+ [borderRightStyle.property, borderRightStyle],
+ [borderRightColor.property, borderRightColor]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveBorderShorthandValue(value, subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = module.exports.shorthandFor.keys();
+ const obj = {
+ [borderRightWidth.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== module.exports.initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[borderRightWidth.property] && obj[borderRightWidth.property] === "medium") {
+ delete obj[borderRightWidth.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderRightColor.js b/vanilla/node_modules/cssstyle/lib/properties/borderRightColor.js
new file mode 100644
index 0000000..9071c50
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderRightColor.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-right-color";
+const lineShorthand = "border-color";
+const positionShorthand = "border-right";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderRightStyle.js b/vanilla/node_modules/cssstyle/lib/properties/borderRightStyle.js
new file mode 100644
index 0000000..09ffe48
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderRightStyle.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-right-style";
+const lineShorthand = "border-style";
+const positionShorthand = "border-right";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderRightWidth.js b/vanilla/node_modules/cssstyle/lib/properties/borderRightWidth.js
new file mode 100644
index 0000000..b56ab28
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderRightWidth.js
@@ -0,0 +1,57 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-right-width";
+const lineShorthand = "border-width";
+const positionShorthand = "border-right";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderSpacing.js b/vanilla/node_modules/cssstyle/lib/properties/borderSpacing.js
new file mode 100644
index 0000000..3bba0be
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderSpacing.js
@@ -0,0 +1,65 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-spacing";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ switch (value.length) {
+ case 1: {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ }
+ case 2: {
+ const [part1, part2] = value;
+ const val1 = parsers.resolveNumericValue([part1], {
+ type: "length"
+ });
+ const val2 = parsers.resolveNumericValue([part2], {
+ type: "length"
+ });
+ if (val1 && val2) {
+ return `${val1} ${val2}`;
+ }
+ break;
+ }
+ default:
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderStyle.js b/vanilla/node_modules/cssstyle/lib/properties/borderStyle.js
new file mode 100644
index 0000000..2cf8836
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderStyle.js
@@ -0,0 +1,110 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderTopStyle = require("./borderTopStyle");
+const borderRightStyle = require("./borderRightStyle");
+const borderBottomStyle = require("./borderBottomStyle");
+const borderLeftStyle = require("./borderLeftStyle");
+
+const property = "border-style";
+const shorthand = "border";
+
+module.exports.shorthandFor = new Map([
+ [borderTopStyle.property, borderTopStyle],
+ [borderRightStyle.property, borderRightStyle],
+ [borderBottomStyle.property, borderBottomStyle],
+ [borderLeftStyle.property, borderLeftStyle]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = parsers.resolveKeywordValue([value], {
+ length: values.length
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ switch (parsedValues.length) {
+ case 1: {
+ return parsedValues;
+ }
+ case 2: {
+ const [val1, val2] = parsedValues;
+ if (val1 === val2) {
+ return [val1];
+ }
+ return parsedValues;
+ }
+ case 3: {
+ const [val1, val2, val3] = parsedValues;
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return parsedValues;
+ }
+ case 4: {
+ const [val1, val2, val3, val4] = parsedValues;
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return [val1, val2, val3];
+ }
+ return parsedValues;
+ }
+ default:
+ }
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderTop.js b/vanilla/node_modules/cssstyle/lib/properties/borderTop.js
new file mode 100644
index 0000000..29f649d
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderTop.js
@@ -0,0 +1,100 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderTopWidth = require("./borderTopWidth");
+const borderTopStyle = require("./borderTopStyle");
+const borderTopColor = require("./borderTopColor");
+
+const property = "border-top";
+const shorthand = "border";
+
+const subProps = {
+ width: borderTopWidth.property,
+ style: borderTopStyle.property,
+ color: borderTopColor.property
+};
+
+module.exports.initialValues = new Map([
+ [borderTopWidth.property, "medium"],
+ [borderTopStyle.property, "none"],
+ [borderTopColor.property, "currentcolor"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [borderTopWidth.property, borderTopWidth],
+ [borderTopStyle.property, borderTopStyle],
+ [borderTopColor.property, borderTopColor]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v);
+ const parsedValues = new Map();
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveBorderShorthandValue(value, subProps, parsedValues);
+ if (typeof parsedValue === "string") {
+ return parsedValue;
+ } else if (Array.isArray(parsedValue)) {
+ const [key, resolvedVal] = parsedValue;
+ parsedValues.set(key, resolvedVal);
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.size) {
+ const keys = module.exports.shorthandFor.keys();
+ const obj = {
+ [borderTopWidth.property]: "medium"
+ };
+ for (const key of keys) {
+ if (parsedValues.has(key)) {
+ const parsedValue = parsedValues.get(key);
+ if (parsedValue !== module.exports.initialValues.get(key)) {
+ obj[key] = parsedValues.get(key);
+ if (obj[borderTopWidth.property] && obj[borderTopWidth.property] === "medium") {
+ delete obj[borderTopWidth.property];
+ }
+ }
+ }
+ }
+ return obj;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (val || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderTopColor.js b/vanilla/node_modules/cssstyle/lib/properties/borderTopColor.js
new file mode 100644
index 0000000..3c22b90
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderTopColor.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-top-color";
+const lineShorthand = "border-color";
+const positionShorthand = "border-top";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderTopStyle.js b/vanilla/node_modules/cssstyle/lib/properties/borderTopStyle.js
new file mode 100644
index 0000000..c0bdf0e
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderTopStyle.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-top-style";
+const lineShorthand = "border-style";
+const positionShorthand = "border-top";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderTopWidth.js b/vanilla/node_modules/cssstyle/lib/properties/borderTopWidth.js
new file mode 100644
index 0000000..177fe83
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderTopWidth.js
@@ -0,0 +1,57 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "border-top-width";
+const lineShorthand = "border-width";
+const positionShorthand = "border-top";
+const shorthand = "border";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const shorthandPriority = this._priorities.get(shorthand);
+ const linePriority = this._priorities.get(lineShorthand);
+ const positionPriority = this._priorities.get(positionShorthand);
+ const priority =
+ !(shorthandPriority || linePriority || positionPriority) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/borderWidth.js b/vanilla/node_modules/cssstyle/lib/properties/borderWidth.js
new file mode 100644
index 0000000..1306f2e
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/borderWidth.js
@@ -0,0 +1,111 @@
+"use strict";
+
+const parsers = require("../parsers");
+const borderTopWidth = require("./borderTopWidth");
+const borderRightWidth = require("./borderRightWidth");
+const borderBottomWidth = require("./borderBottomWidth");
+const borderLeftWidth = require("./borderLeftWidth");
+
+const property = "border-width";
+const shorthand = "border";
+
+module.exports.shorthandFor = new Map([
+ [borderTopWidth.property, borderTopWidth],
+ [borderRightWidth.property, borderRightWidth],
+ [borderBottomWidth.property, borderBottomWidth],
+ [borderLeftWidth.property, borderLeftWidth]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = parsers.resolveNumericValue([value], {
+ length: values.length,
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ switch (parsedValues.length) {
+ case 1: {
+ return parsedValues;
+ }
+ case 2: {
+ const [val1, val2] = parsedValues;
+ if (val1 === val2) {
+ return [val1];
+ }
+ return parsedValues;
+ }
+ case 3: {
+ const [val1, val2, val3] = parsedValues;
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return parsedValues;
+ }
+ case 4: {
+ const [val1, val2, val3, val4] = parsedValues;
+ if (val2 === val4) {
+ if (val1 === val3) {
+ if (val1 === val2) {
+ return [val1];
+ }
+ return [val1, val2];
+ }
+ return [val1, val2, val3];
+ }
+ return parsedValues;
+ }
+ default:
+ }
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._borderSetter(property, v, "");
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._borderSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/bottom.js b/vanilla/node_modules/cssstyle/lib/properties/bottom.js
new file mode 100644
index 0000000..af7bc58
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/bottom.js
@@ -0,0 +1,47 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "bottom";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/clear.js b/vanilla/node_modules/cssstyle/lib/properties/clear.js
new file mode 100644
index 0000000..28e9ef3
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/clear.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "clear";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/clip.js b/vanilla/node_modules/cssstyle/lib/properties/clip.js
new file mode 100644
index 0000000..a3db772
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/clip.js
@@ -0,0 +1,73 @@
+"use strict";
+// deprecated
+// @see https://drafts.csswg.org/css-masking-1/#clip-property
+
+const parsers = require("../parsers");
+
+const property = "clip";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const [{ name, type, value: itemValue }] = value;
+ switch (type) {
+ case AST_TYPES.FUNCTION: {
+ const values = parsers.splitValue(itemValue, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const item of values) {
+ const parsedValue = parsers.parseCSS(item, { context: "value" }, true);
+ const val = parsers.resolveNumericValue(parsedValue.children, {
+ type: "length"
+ });
+ if (val) {
+ parsedValues.push(val);
+ } else {
+ return;
+ }
+ }
+ return `${name}(${parsedValues.join(", ")})`;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER: {
+ return name;
+ }
+ default:
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/color.js b/vanilla/node_modules/cssstyle/lib/properties/color.js
new file mode 100644
index 0000000..d0ad35c
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/color.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/display.js b/vanilla/node_modules/cssstyle/lib/properties/display.js
new file mode 100644
index 0000000..d331d54
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/display.js
@@ -0,0 +1,210 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "display";
+
+/* keywords */
+const displayOutside = ["block", "inline", "run-in"];
+const displayFlow = ["flow", "flow-root"];
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ switch (value.length) {
+ case 1: {
+ const [{ name, type }] = value;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ if (name === "flow") {
+ return "block";
+ }
+ return name;
+ }
+ default:
+ }
+ break;
+ }
+ case 2: {
+ const [part1, part2] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
+ if (val1 && val2) {
+ let outerValue = "";
+ let innerValue = "";
+ if (val1 === "list-item") {
+ outerValue = val2;
+ innerValue = val1;
+ } else if (val2 === "list-item") {
+ outerValue = val1;
+ innerValue = val2;
+ } else if (displayOutside.includes(val1)) {
+ outerValue = val1;
+ innerValue = val2;
+ } else if (displayOutside.includes(val2)) {
+ outerValue = val2;
+ innerValue = val1;
+ }
+ if (innerValue === "list-item") {
+ switch (outerValue) {
+ case "block":
+ case "flow": {
+ return innerValue;
+ }
+ case "flow-root":
+ case "inline":
+ case "run-in": {
+ return `${outerValue} ${innerValue}`;
+ }
+ default:
+ }
+ } else if (outerValue === "block") {
+ switch (innerValue) {
+ case "flow": {
+ return outerValue;
+ }
+ case "flow-root":
+ case "flex":
+ case "grid":
+ case "table": {
+ return innerValue;
+ }
+ case "ruby": {
+ return `${outerValue} ${innerValue}`;
+ }
+ default:
+ }
+ } else if (outerValue === "inline") {
+ switch (innerValue) {
+ case "flow": {
+ return outerValue;
+ }
+ case "flow-root": {
+ return `${outerValue}-block`;
+ }
+ case "flex":
+ case "grid":
+ case "table": {
+ return `${outerValue}-${innerValue}`;
+ }
+ case "ruby": {
+ return innerValue;
+ }
+ default:
+ }
+ } else if (outerValue === "run-in") {
+ switch (innerValue) {
+ case "flow": {
+ return outerValue;
+ }
+ case "flow-root":
+ case "flex":
+ case "grid":
+ case "table":
+ case "ruby": {
+ return `${outerValue} ${innerValue}`;
+ }
+ default:
+ }
+ }
+ }
+ break;
+ }
+ case 3: {
+ const [part1, part2, part3] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
+ const val3 = part3.type === AST_TYPES.IDENTIFIER && part3.name;
+ if (val1 && val2 && part3) {
+ let outerValue = "";
+ let flowValue = "";
+ let listItemValue = "";
+ if (val1 === "list-item") {
+ listItemValue = val1;
+ if (displayFlow.includes(val2)) {
+ flowValue = val2;
+ outerValue = val3;
+ } else if (displayFlow.includes(val3)) {
+ flowValue = val3;
+ outerValue = val2;
+ }
+ } else if (val2 === "list-item") {
+ listItemValue = val2;
+ if (displayFlow.includes(val1)) {
+ flowValue = val1;
+ outerValue = val3;
+ } else if (displayFlow.includes(val3)) {
+ flowValue = val3;
+ outerValue = val1;
+ }
+ } else if (val3 === "list-item") {
+ listItemValue = val3;
+ if (displayFlow.includes(val1)) {
+ flowValue = val1;
+ outerValue = val2;
+ } else if (displayFlow.includes(val2)) {
+ flowValue = val2;
+ outerValue = val1;
+ }
+ }
+ if (outerValue && flowValue && listItemValue) {
+ switch (outerValue) {
+ case "block": {
+ if (flowValue === "flow") {
+ return listItemValue;
+ }
+ return `${flowValue} ${listItemValue}`;
+ }
+ case "inline":
+ case "run-in": {
+ if (flowValue === "flow") {
+ return `${outerValue} ${listItemValue}`;
+ }
+ return `${outerValue} ${flowValue} ${listItemValue}`;
+ }
+ }
+ }
+ }
+ break;
+ }
+ default:
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/flex.js b/vanilla/node_modules/cssstyle/lib/properties/flex.js
new file mode 100644
index 0000000..084e99d
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/flex.js
@@ -0,0 +1,178 @@
+"use strict";
+
+const parsers = require("../parsers");
+const flexGrow = require("./flexGrow");
+const flexShrink = require("./flexShrink");
+const flexBasis = require("./flexBasis");
+
+const property = "flex";
+
+module.exports.initialValues = new Map([
+ [flexGrow.property, "0"],
+ [flexShrink.property, "1"],
+ [flexBasis.property, "auto"]
+]);
+
+module.exports.shorthandFor = new Map([
+ [flexGrow.property, flexGrow],
+ [flexShrink.property, flexShrink],
+ [flexBasis.property, flexBasis]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ const flex = {
+ [flexGrow.property]: "1",
+ [flexShrink.property]: "1",
+ [flexBasis.property]: "0%"
+ };
+ if (value.length === 1) {
+ const [{ isNumber, name, type, unit, value: itemValue }] = value;
+ switch (type) {
+ case AST_TYPES.CALC: {
+ if (isNumber) {
+ flex[flexGrow.property] = `${name}(${itemValue})`;
+ return flex;
+ }
+ flex[flexBasis.property] = `${name}(${itemValue})`;
+ return flex;
+ }
+ case AST_TYPES.DIMENSION: {
+ flex[flexBasis.property] = `${itemValue}${unit}`;
+ return flex;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD: {
+ return name;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ if (name === "none") {
+ return {
+ [flexGrow.property]: "0",
+ [flexShrink.property]: "0",
+ [flexBasis.property]: "auto"
+ };
+ }
+ flex[flexBasis.property] = name;
+ return flex;
+ }
+ case AST_TYPES.NUMBER: {
+ flex[flexGrow.property] = itemValue;
+ return flex;
+ }
+ case AST_TYPES.PERCENTAGE: {
+ flex[flexBasis.property] = `${itemValue}%`;
+ return flex;
+ }
+ default:
+ }
+ } else {
+ const [val1, val2, val3] = value;
+ if (val1.type === AST_TYPES.CALC && val1.isNumber) {
+ flex[flexGrow.property] = `${val1.name}(${val1.value})`;
+ } else if (val1.type === AST_TYPES.NUMBER) {
+ flex[flexGrow.property] = val1.value;
+ } else {
+ return;
+ }
+ if (val3) {
+ if (val2.type === AST_TYPES.CALC && val2.isNumber) {
+ flex[flexShrink.property] = `${val2.name}(${val2.value})`;
+ } else if (val2.type === AST_TYPES.NUMBER) {
+ flex[flexShrink.property] = val2.value;
+ } else {
+ return;
+ }
+ if (val3.type === AST_TYPES.GLOBAL_KEYWORD || val3.type === AST_TYPES.IDENTIFIER) {
+ flex[flexBasis.property] = val3.name;
+ } else if (val3.type === AST_TYPES.CALC && !val3.isNumber) {
+ flex[flexBasis.property] = `${val3.name}(${val3.value})`;
+ } else if (val3.type === AST_TYPES.DIMENSION) {
+ flex[flexBasis.property] = `${val3.value}${val3.unit}`;
+ } else if (val3.type === AST_TYPES.PERCENTAGE) {
+ flex[flexBasis.property] = `${val3.value}%`;
+ } else {
+ return;
+ }
+ } else {
+ switch (val2.type) {
+ case AST_TYPES.CALC: {
+ if (val2.isNumber) {
+ flex[flexShrink.property] = `${val2.name}(${val2.value})`;
+ } else {
+ flex[flexBasis.property] = `${val2.name}(${val2.value})`;
+ }
+ break;
+ }
+ case AST_TYPES.DIMENSION: {
+ flex[flexBasis.property] = `${val2.value}${val2.unit}`;
+ break;
+ }
+ case AST_TYPES.NUMBER: {
+ flex[flexShrink.property] = val2.value;
+ break;
+ }
+ case AST_TYPES.PERCENTAGE: {
+ flex[flexBasis.property] = `${val2.value}%`;
+ break;
+ }
+ case AST_TYPES.IDENTIFIER: {
+ flex[flexBasis.property] = val2.name;
+ break;
+ }
+ default: {
+ return;
+ }
+ }
+ }
+ return flex;
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ for (const [longhand] of module.exports.shorthandFor) {
+ this._setProperty(longhand, "");
+ }
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ const priority = this._priorities.get(property) ?? "";
+ if (typeof val === "string") {
+ for (const [longhand] of module.exports.shorthandFor) {
+ this._setProperty(longhand, val, priority);
+ }
+ this._setProperty(property, val, priority);
+ } else if (val) {
+ const values = [];
+ for (const [longhand, value] of Object.entries(val)) {
+ values.push(value);
+ this._setProperty(longhand, value, priority);
+ }
+ this._setProperty(property, values.join(" "), priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/flexBasis.js b/vanilla/node_modules/cssstyle/lib/properties/flexBasis.js
new file mode 100644
index 0000000..68bebc2
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/flexBasis.js
@@ -0,0 +1,52 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "flex-basis";
+const shorthand = "flex";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._flexBoxSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/flexGrow.js b/vanilla/node_modules/cssstyle/lib/properties/flexGrow.js
new file mode 100644
index 0000000..7789021
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/flexGrow.js
@@ -0,0 +1,52 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "flex-grow";
+const shorthand = "flex";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue("flex-grow", v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._flexBoxSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/flexShrink.js b/vanilla/node_modules/cssstyle/lib/properties/flexShrink.js
new file mode 100644
index 0000000..ed0abb4
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/flexShrink.js
@@ -0,0 +1,52 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "flex-shrink";
+const shorthand = "flex";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._flexBoxSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/float.js b/vanilla/node_modules/cssstyle/lib/properties/float.js
new file mode 100644
index 0000000..7080260
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/float.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "float";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveKeywordValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/floodColor.js b/vanilla/node_modules/cssstyle/lib/properties/floodColor.js
new file mode 100644
index 0000000..7ef4fe8
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/floodColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "flood-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/font.js b/vanilla/node_modules/cssstyle/lib/properties/font.js
new file mode 100644
index 0000000..17897f3
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/font.js
@@ -0,0 +1,302 @@
+"use strict";
+
+const parsers = require("../parsers");
+const fontStyle = require("./fontStyle");
+const fontVariant = require("./fontVariant");
+const fontWeight = require("./fontWeight");
+const fontSize = require("./fontSize");
+const lineHeight = require("./lineHeight");
+const fontFamily = require("./fontFamily");
+
+const property = "font";
+
+module.exports.shorthandFor = new Map([
+ [fontStyle.property, fontStyle],
+ [fontVariant.property, fontVariant],
+ [fontWeight.property, fontWeight],
+ [fontSize.property, fontSize],
+ [lineHeight.property, lineHeight],
+ [fontFamily.property, fontFamily]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ } else if (parsers.hasCalcFunc(v)) {
+ v = parsers.resolveCalc(v);
+ }
+ if (!parsers.isValidPropertyValue(property, v)) {
+ return;
+ }
+ const { AST_TYPES } = parsers;
+ const [fontBlock, ...families] = parsers.splitValue(v, {
+ delimiter: ","
+ });
+ const [fontBlockA, fontBlockB] = parsers.splitValue(fontBlock, {
+ delimiter: "/"
+ });
+ const font = {
+ [fontStyle.property]: "normal",
+ [fontVariant.property]: "normal",
+ [fontWeight.property]: "normal"
+ };
+ const fontFamilies = new Set();
+ if (fontBlockB) {
+ const [lineB, ...familiesB] = fontBlockB.trim().split(" ");
+ if (!lineB || !familiesB.length) {
+ return;
+ }
+ const lineHeightB = lineHeight.parse(lineB, {
+ global
+ });
+ if (typeof lineHeightB !== "string") {
+ return;
+ }
+ const familyB = fontFamily.parse(familiesB.join(" "), {
+ globalObject,
+ caseSensitive: true
+ });
+ if (typeof familyB === "string") {
+ fontFamilies.add(familyB);
+ } else {
+ return;
+ }
+ const parts = parsers.splitValue(fontBlockA.trim());
+ const properties = [
+ fontStyle.property,
+ fontVariant.property,
+ fontWeight.property,
+ fontSize.property
+ ];
+ for (const part of parts) {
+ if (part === "normal") {
+ continue;
+ } else {
+ for (const longhand of properties) {
+ switch (longhand) {
+ case fontSize.property: {
+ const parsedValue = fontSize.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ font[longhand] = parsedValue;
+ }
+ break;
+ }
+ case fontStyle.property:
+ case fontWeight.property: {
+ if (font[longhand] === "normal") {
+ const longhandItem = module.exports.shorthandFor.get(longhand);
+ const parsedValue = longhandItem.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ font[longhand] = parsedValue;
+ }
+ }
+ break;
+ }
+ case fontVariant.property: {
+ if (font[longhand] === "normal") {
+ const parsedValue = fontVariant.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ if (parsedValue === "small-cap") {
+ font[longhand] = parsedValue;
+ } else if (parsedValue !== "normal") {
+ return;
+ }
+ }
+ }
+ break;
+ }
+ default:
+ }
+ }
+ }
+ }
+ if (Object.hasOwn(font, fontSize.property)) {
+ font[lineHeight.property] = lineHeightB;
+ } else {
+ return;
+ }
+ } else {
+ const revParts = parsers.splitValue(fontBlockA.trim()).toReversed();
+ if (revParts.length === 1) {
+ const [part] = revParts;
+ const value = parsers.parsePropertyValue(property, part, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const [{ name, type }] = value;
+ if (type === AST_TYPES.GLOBAL_KEYWORD) {
+ return {
+ [fontStyle.property]: name,
+ [fontVariant.property]: name,
+ [fontWeight.property]: name,
+ [fontSize.property]: name,
+ [lineHeight.property]: name,
+ [fontFamily.property]: name
+ };
+ }
+ }
+ return;
+ }
+ const properties = [
+ fontStyle.property,
+ fontVariant.property,
+ fontWeight.property,
+ lineHeight.property
+ ];
+ for (const longhand of properties) {
+ font[longhand] = "normal";
+ }
+ const revFontFamily = [];
+ let fontSizeA;
+ for (const part of revParts) {
+ if (fontSizeA) {
+ if (/^normal$/i.test(part)) {
+ continue;
+ } else {
+ for (const longhand of properties) {
+ switch (longhand) {
+ case fontStyle.property:
+ case fontWeight.property:
+ case lineHeight.property: {
+ if (font[longhand] === "normal") {
+ const longhandItem = module.exports.shorthandFor.get(longhand);
+ const parsedValue = longhandItem.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ font[longhand] = parsedValue;
+ }
+ }
+ break;
+ }
+ case fontVariant.property: {
+ if (font[longhand] === "normal") {
+ const parsedValue = fontVariant.parse(part, {
+ globalObject
+ });
+ if (typeof parsedValue === "string") {
+ if (parsedValue === "small-cap") {
+ font[longhand] = parsedValue;
+ } else if (parsedValue !== "normal") {
+ return;
+ }
+ }
+ }
+ break;
+ }
+ default:
+ }
+ }
+ }
+ } else {
+ const parsedFontSize = fontSize.parse(part, {
+ globalObject
+ });
+ if (typeof parsedFontSize === "string") {
+ fontSizeA = parsedFontSize;
+ } else {
+ const parsedFontFamily = fontFamily.parse(part, {
+ globalObject,
+ caseSensitive: true
+ });
+ if (typeof parsedFontFamily === "string") {
+ revFontFamily.push(parsedFontFamily);
+ } else {
+ return;
+ }
+ }
+ }
+ }
+ const family = fontFamily.parse(revFontFamily.toReversed().join(" "), {
+ globalObject,
+ caseSensitive: true
+ });
+ if (fontSizeA && family) {
+ font[fontSize.property] = fontSizeA;
+ fontFamilies.add(fontFamily.parse(family));
+ } else {
+ return;
+ }
+ }
+ for (const family of families) {
+ const parsedFontFamily = fontFamily.parse(family, {
+ globalObject,
+ caseSensitive: true
+ });
+ if (parsedFontFamily) {
+ fontFamilies.add(parsedFontFamily);
+ } else {
+ return;
+ }
+ }
+ font[fontFamily.property] = [...fontFamilies].join(", ");
+ return font;
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (v === "" || parsers.hasVarFunc(v)) {
+ for (const [key] of module.exports.shorthandFor) {
+ this._setProperty(key, "");
+ }
+ this._setProperty(property, v);
+ } else {
+ const obj = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (!obj) {
+ return;
+ }
+ const priority = this._priorities.get(property) ?? "";
+ const str = new Set();
+ for (const [key] of module.exports.shorthandFor) {
+ const val = obj[key];
+ if (typeof val === "string") {
+ this._setProperty(key, val, priority);
+ if (val && val !== "normal" && !str.has(val)) {
+ if (key === lineHeight.property) {
+ str.add(`/ ${val}`);
+ } else {
+ str.add(val);
+ }
+ }
+ }
+ }
+ this._setProperty(property, [...str].join(" "), priority);
+ }
+ },
+ get() {
+ const val = this.getPropertyValue(property);
+ if (parsers.hasVarFunc(val)) {
+ return val;
+ }
+ const str = new Set();
+ for (const [key] of module.exports.shorthandFor) {
+ const v = this.getPropertyValue(key);
+ if (parsers.hasVarFunc(v)) {
+ return "";
+ }
+ if (v && v !== "normal" && !str.has(v)) {
+ if (key === lineHeight.property) {
+ str.add(`/ ${v}`);
+ } else {
+ str.add(`${v}`);
+ }
+ }
+ }
+ return [...str].join(" ");
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/fontFamily.js b/vanilla/node_modules/cssstyle/lib/properties/fontFamily.js
new file mode 100644
index 0000000..e3fc7ee
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/fontFamily.js
@@ -0,0 +1,98 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "font-family";
+const shorthand = "font";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const values = parsers.splitValue(v, {
+ delimiter: ","
+ });
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ caseSensitive: true,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ if (value.length === 1) {
+ const [{ name, type, value: itemValue }] = value;
+ switch (type) {
+ case AST_TYPES.FUNCTION: {
+ parsedValues.push(`${name}(${itemValue})`);
+ break;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER: {
+ if (name === "undefined") {
+ return;
+ }
+ parsedValues.push(name);
+ break;
+ }
+ case "String": {
+ const parsedValue = itemValue.replaceAll("\\", "").replaceAll('"', '\\"');
+ parsedValues.push(`"${parsedValue}"`);
+ break;
+ }
+ default: {
+ return;
+ }
+ }
+ } else {
+ const parts = [];
+ for (const item of value) {
+ const { name, type } = item;
+ if (type !== AST_TYPES.IDENTIFIER) {
+ return;
+ }
+ parts.push(name);
+ }
+ const parsedValue = parts.join(" ").replaceAll("\\", "").replaceAll('"', '\\"');
+ parsedValues.push(`"${parsedValue}"`);
+ }
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ } else {
+ return;
+ }
+ }
+ if (parsedValues.length) {
+ return parsedValues.join(", ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/fontSize.js b/vanilla/node_modules/cssstyle/lib/properties/fontSize.js
new file mode 100644
index 0000000..80b015e
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/fontSize.js
@@ -0,0 +1,53 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "font-size";
+const shorthand = "font";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/fontStyle.js b/vanilla/node_modules/cssstyle/lib/properties/fontStyle.js
new file mode 100644
index 0000000..f07a17d
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/fontStyle.js
@@ -0,0 +1,69 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "font-style";
+const shorthand = "font";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const { AST_TYPES } = parsers;
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length) {
+ if (value.length === 1) {
+ const [{ name, type }] = value;
+ switch (type) {
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER: {
+ return name;
+ }
+ default:
+ }
+ } else if (value.length === 2) {
+ const [part1, part2] = value;
+ const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
+ const val2 = parsers.resolveNumericValue([part2], {
+ type: "angle"
+ });
+ if (val1 && val1 === "oblique" && val2) {
+ return `${val1} ${val2}`;
+ }
+ }
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/fontVariant.js b/vanilla/node_modules/cssstyle/lib/properties/fontVariant.js
new file mode 100644
index 0000000..515b75e
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/fontVariant.js
@@ -0,0 +1,66 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "font-variant";
+const shorthand = "font";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.splitValue(v);
+ const parsedValues = [];
+ for (const val of values) {
+ const value = parsers.parsePropertyValue(property, val, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveFunctionValue(value);
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ } else if (typeof value === "string") {
+ parsedValues.push(value);
+ }
+ }
+ if (parsedValues.length) {
+ if (parsedValues.length > 1) {
+ if (parsedValues.includes("normal") || parsedValues.includes("none")) {
+ return;
+ }
+ }
+ return parsedValues.join(" ");
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/fontWeight.js b/vanilla/node_modules/cssstyle/lib/properties/fontWeight.js
new file mode 100644
index 0000000..8087e07
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/fontWeight.js
@@ -0,0 +1,57 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "font-weight";
+const shorthand = "font";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ const parsedValue = parsers.resolveNumericValue(value, {
+ min: 1,
+ max: 1000
+ });
+ if (!parsedValue) {
+ return;
+ }
+ return parsedValue;
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/height.js b/vanilla/node_modules/cssstyle/lib/properties/height.js
new file mode 100644
index 0000000..1e3bd78
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/height.js
@@ -0,0 +1,48 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "height";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/left.js b/vanilla/node_modules/cssstyle/lib/properties/left.js
new file mode 100644
index 0000000..8cea211
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/left.js
@@ -0,0 +1,47 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "left";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/lightingColor.js b/vanilla/node_modules/cssstyle/lib/properties/lightingColor.js
new file mode 100644
index 0000000..a007bd5
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/lightingColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "lighting-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/lineHeight.js b/vanilla/node_modules/cssstyle/lib/properties/lineHeight.js
new file mode 100644
index 0000000..e1f4b37
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/lineHeight.js
@@ -0,0 +1,52 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "line-height";
+const shorthand = "font";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/margin.js b/vanilla/node_modules/cssstyle/lib/properties/margin.js
new file mode 100644
index 0000000..ffb8704
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/margin.js
@@ -0,0 +1,77 @@
+"use strict";
+
+const parsers = require("../parsers");
+const marginTop = require("./marginTop");
+const marginRight = require("./marginRight");
+const marginBottom = require("./marginBottom");
+const marginLeft = require("./marginLeft");
+
+const property = "margin";
+
+module.exports.position = "edges";
+
+module.exports.shorthandFor = new Map([
+ [marginTop.property, marginTop],
+ [marginRight.property, marginRight],
+ [marginBottom.property, marginBottom],
+ [marginLeft.property, marginLeft]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = parsers.resolveNumericValue([value], {
+ length: values.length,
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ return parsedValues;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ for (const [longhand] of module.exports.shorthandFor) {
+ this._setProperty(longhand, "");
+ }
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._positionShorthandSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/marginBottom.js b/vanilla/node_modules/cssstyle/lib/properties/marginBottom.js
new file mode 100644
index 0000000..c3b1e0b
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/marginBottom.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "margin-bottom";
+const shorthand = "margin";
+
+module.exports.position = "bottom";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/marginLeft.js b/vanilla/node_modules/cssstyle/lib/properties/marginLeft.js
new file mode 100644
index 0000000..f70fe4a
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/marginLeft.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "margin-left";
+const shorthand = "margin";
+
+module.exports.position = "left";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/marginRight.js b/vanilla/node_modules/cssstyle/lib/properties/marginRight.js
new file mode 100644
index 0000000..8ec0234
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/marginRight.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "margin-right";
+const shorthand = "margin";
+
+module.exports.position = "right";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/marginTop.js b/vanilla/node_modules/cssstyle/lib/properties/marginTop.js
new file mode 100644
index 0000000..af8f842
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/marginTop.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "margin-top";
+const shorthand = "margin";
+
+module.exports.position = "top";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/opacity.js b/vanilla/node_modules/cssstyle/lib/properties/opacity.js
new file mode 100644
index 0000000..119fd28
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/opacity.js
@@ -0,0 +1,47 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "opacity";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ clamp: true
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/outlineColor.js b/vanilla/node_modules/cssstyle/lib/properties/outlineColor.js
new file mode 100644
index 0000000..6e44b5a
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/outlineColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "outline-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/padding.js b/vanilla/node_modules/cssstyle/lib/properties/padding.js
new file mode 100644
index 0000000..0168aa6
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/padding.js
@@ -0,0 +1,78 @@
+"use strict";
+
+const parsers = require("../parsers");
+const paddingTop = require("./paddingTop");
+const paddingRight = require("./paddingRight");
+const paddingBottom = require("./paddingBottom");
+const paddingLeft = require("./paddingLeft");
+
+const property = "padding";
+
+module.exports.position = "edges";
+
+module.exports.shorthandFor = new Map([
+ [paddingTop.property, paddingTop],
+ [paddingRight.property, paddingRight],
+ [paddingBottom.property, paddingBottom],
+ [paddingLeft.property, paddingLeft]
+]);
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const values = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ const parsedValues = [];
+ if (Array.isArray(values) && values.length) {
+ if (values.length > 4) {
+ return;
+ }
+ for (const value of values) {
+ const parsedValue = parsers.resolveNumericValue([value], {
+ length: values.length,
+ min: 0,
+ type: "length"
+ });
+ if (!parsedValue) {
+ return;
+ }
+ parsedValues.push(parsedValue);
+ }
+ } else if (typeof values === "string") {
+ parsedValues.push(values);
+ }
+ if (parsedValues.length) {
+ return parsedValues;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ for (const [longhand] of module.exports.shorthandFor) {
+ this._setProperty(longhand, "");
+ }
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (Array.isArray(val) || typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._positionShorthandSetter(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/paddingBottom.js b/vanilla/node_modules/cssstyle/lib/properties/paddingBottom.js
new file mode 100644
index 0000000..0b03592
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/paddingBottom.js
@@ -0,0 +1,55 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "padding-bottom";
+const shorthand = "padding";
+
+module.exports.position = "bottom";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/paddingLeft.js b/vanilla/node_modules/cssstyle/lib/properties/paddingLeft.js
new file mode 100644
index 0000000..1b6b13e
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/paddingLeft.js
@@ -0,0 +1,55 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "padding-left";
+const shorthand = "padding";
+
+module.exports.position = "left";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/paddingRight.js b/vanilla/node_modules/cssstyle/lib/properties/paddingRight.js
new file mode 100644
index 0000000..f7088bd
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/paddingRight.js
@@ -0,0 +1,55 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "padding-right";
+const shorthand = "padding";
+
+module.exports.position = "right";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/paddingTop.js b/vanilla/node_modules/cssstyle/lib/properties/paddingTop.js
new file mode 100644
index 0000000..32e9f76
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/paddingTop.js
@@ -0,0 +1,55 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "padding-top";
+const shorthand = "padding";
+
+module.exports.position = "top";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(shorthand, "");
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority =
+ !this._priorities.get(shorthand) && this._priorities.has(property)
+ ? this._priorities.get(property)
+ : "";
+ this._positionLonghandSetter(property, val, priority, shorthand);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/right.js b/vanilla/node_modules/cssstyle/lib/properties/right.js
new file mode 100644
index 0000000..a28687a
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/right.js
@@ -0,0 +1,47 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "right";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/stopColor.js b/vanilla/node_modules/cssstyle/lib/properties/stopColor.js
new file mode 100644
index 0000000..4ab8871
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/stopColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "stop-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/top.js b/vanilla/node_modules/cssstyle/lib/properties/top.js
new file mode 100644
index 0000000..29794a8
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/top.js
@@ -0,0 +1,47 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "top";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js
new file mode 100644
index 0000000..7190ec3
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-border-after-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js
new file mode 100644
index 0000000..f6008ff
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-border-before-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js
new file mode 100644
index 0000000..3870118
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-border-end-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js
new file mode 100644
index 0000000..96bec13
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-border-start-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js
new file mode 100644
index 0000000..087695f
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-column-rule-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js
new file mode 100644
index 0000000..abda140
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-tap-highlight-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js
new file mode 100644
index 0000000..049babe
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-text-emphasis-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitTextFillColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitTextFillColor.js
new file mode 100644
index 0000000..027835d
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitTextFillColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-text-fill-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js b/vanilla/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js
new file mode 100644
index 0000000..e4f7224
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "-webkit-text-stroke-color";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveColorValue(value);
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/properties/width.js b/vanilla/node_modules/cssstyle/lib/properties/width.js
new file mode 100644
index 0000000..91d5a1a
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/properties/width.js
@@ -0,0 +1,48 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const property = "width";
+
+module.exports.parse = (v, opt = {}) => {
+ const { globalObject } = opt;
+ if (v === "") {
+ return v;
+ }
+ const value = parsers.parsePropertyValue(property, v, {
+ globalObject,
+ inArray: true
+ });
+ if (Array.isArray(value) && value.length === 1) {
+ return parsers.resolveNumericValue(value, {
+ min: 0,
+ type: "length"
+ });
+ } else if (typeof value === "string") {
+ return value;
+ }
+};
+
+module.exports.definition = {
+ set(v) {
+ v = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(v)) {
+ this._setProperty(property, v);
+ } else {
+ const val = module.exports.parse(v, {
+ globalObject: this._global
+ });
+ if (typeof val === "string") {
+ const priority = this._priorities.get(property) ?? "";
+ this._setProperty(property, val, priority);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+};
+
+module.exports.property = property;
diff --git a/vanilla/node_modules/cssstyle/lib/utils/allExtraProperties.js b/vanilla/node_modules/cssstyle/lib/utils/allExtraProperties.js
new file mode 100644
index 0000000..a8d8711
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/utils/allExtraProperties.js
@@ -0,0 +1,155 @@
+"use strict";
+
+/**
+ * This file contains all implemented properties that are not a part of any
+ * current specifications or drafts, but are handled by browsers nevertheless.
+ */
+
+const webkitProperties = [
+ "background-composite",
+ "border-after",
+ "border-after-color",
+ "border-after-style",
+ "border-after-width",
+ "border-before",
+ "border-before-color",
+ "border-before-style",
+ "border-before-width",
+ "border-end",
+ "border-end-color",
+ "border-end-style",
+ "border-end-width",
+ "border-fit",
+ "border-horizontal-spacing",
+ "border-start",
+ "border-start-color",
+ "border-start-style",
+ "border-start-width",
+ "border-vertical-spacing",
+ "color-correction",
+ "column-axis",
+ "column-break-after",
+ "column-break-before",
+ "column-break-inside",
+ "column-rule-color",
+ "flex-align",
+ "flex-item-align",
+ "flex-line-pack",
+ "flex-order",
+ "flex-pack",
+ "flex-wrap",
+ "font-size-delta",
+ "font-smoothing",
+ "highlight",
+ "hyphenate-limit-after",
+ "hyphenate-limit-before",
+ "locale",
+ "logical-height",
+ "logical-width",
+ "margin-after",
+ "margin-after-collapse",
+ "margin-before",
+ "margin-before-collapse",
+ "margin-bottom-collapse",
+ "margin-collapse",
+ "margin-end",
+ "margin-start",
+ "margin-top-collapse",
+ "marquee",
+ "marquee-direction",
+ "marquee-increment",
+ "marquee-repetition",
+ "marquee-speed",
+ "marquee-style",
+ "mask-attachment",
+ "mask-box-image-outset",
+ "mask-box-image-repeat",
+ "mask-box-image-slice",
+ "mask-box-image-source",
+ "mask-box-image-width",
+ "mask-position-x",
+ "mask-position-y",
+ "mask-repeat-x",
+ "mask-repeat-y",
+ "match-nearest-mail-blockquote-color",
+ "max-logical-height",
+ "max-logical-width",
+ "min-logical-height",
+ "min-logical-width",
+ "nbsp-mode",
+ "overflow-scrolling",
+ "padding-after",
+ "padding-before",
+ "padding-end",
+ "padding-start",
+ "perspective-origin-x",
+ "perspective-origin-y",
+ "region-break-after",
+ "region-break-before",
+ "region-break-inside",
+ "region-overflow",
+ "rtl-ordering",
+ "svg-shadow",
+ "tap-highlight-color",
+ "text-decorations-in-effect",
+ "text-emphasis-color",
+ "text-fill-color",
+ "text-security",
+ "text-size-adjust",
+ "text-stroke",
+ "text-stroke-color",
+ "text-stroke-width",
+ "transform",
+ "transform-origin-x",
+ "transform-origin-y",
+ "transform-origin-z",
+ "user-drag",
+ "user-modify",
+ "wrap",
+ "wrap-margin",
+ "wrap-padding",
+ "wrap-shape-inside",
+ "wrap-shape-outside",
+ "zoom"
+].map((prop) => `-webkit-${prop}`);
+
+module.exports = new Set([
+ "background-position-x",
+ "background-position-y",
+ "background-repeat-x",
+ "background-repeat-y",
+ "color-interpolation",
+ "color-profile",
+ "color-rendering",
+ "enable-background",
+ "glyph-orientation-horizontal",
+ "kerning",
+ "marker-offset",
+ "marks",
+ "pointer-events",
+ "shape-rendering",
+ "size",
+ "src",
+ "stop-color",
+ "stop-opacity",
+ "text-anchor",
+ "text-line-through",
+ "text-line-through-color",
+ "text-line-through-mode",
+ "text-line-through-style",
+ "text-line-through-width",
+ "text-overline",
+ "text-overline-color",
+ "text-overline-mode",
+ "text-overline-style",
+ "text-overline-width",
+ "text-rendering",
+ "text-underline",
+ "text-underline-color",
+ "text-underline-mode",
+ "text-underline-style",
+ "text-underline-width",
+ "unicode-range",
+ "vector-effect",
+ ...webkitProperties
+]);
diff --git a/vanilla/node_modules/cssstyle/lib/utils/camelize.js b/vanilla/node_modules/cssstyle/lib/utils/camelize.js
new file mode 100644
index 0000000..19aaf7d
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/utils/camelize.js
@@ -0,0 +1,37 @@
+"use strict";
+
+const { asciiLowercase } = require("./strings");
+
+// Utility to translate from `border-width` to `borderWidth`.
+// NOTE: For values prefixed with webkit, e.g. `-webkit-foo`, we need to provide
+// both `webkitFoo` and `WebkitFoo`. Here we only return `webkitFoo`.
+exports.dashedToCamelCase = function (dashed) {
+ if (dashed.startsWith("--")) {
+ return dashed;
+ }
+ let camel = "";
+ let nextCap = false;
+ // skip leading hyphen in vendor prefixed value, e.g. -webkit-foo
+ let i = /^-webkit-/.test(dashed) ? 1 : 0;
+ for (; i < dashed.length; i++) {
+ if (dashed[i] !== "-") {
+ camel += nextCap ? dashed[i].toUpperCase() : dashed[i];
+ nextCap = false;
+ } else {
+ nextCap = true;
+ }
+ }
+ return camel;
+};
+
+// Utility to translate from `borderWidth` to `border-width`.
+exports.camelCaseToDashed = function (camelCase) {
+ if (camelCase.startsWith("--")) {
+ return camelCase;
+ }
+ const dashed = asciiLowercase(camelCase.replace(/(?<=[a-z])[A-Z]/g, "-$&"));
+ if (/^webkit-/.test(dashed)) {
+ return `-${dashed}`;
+ }
+ return dashed;
+};
diff --git a/vanilla/node_modules/cssstyle/lib/utils/propertyDescriptors.js b/vanilla/node_modules/cssstyle/lib/utils/propertyDescriptors.js
new file mode 100644
index 0000000..f568d84
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/utils/propertyDescriptors.js
@@ -0,0 +1,55 @@
+"use strict";
+
+const parsers = require("../parsers");
+
+const { AST_TYPES } = parsers;
+
+const getPropertyDescriptor = (property) => ({
+ set(v) {
+ const value = parsers.prepareValue(v);
+ if (parsers.hasVarFunc(value)) {
+ this._setProperty(property, value);
+ } else {
+ const parsedValue = parsers.parsePropertyValue(property, v, {
+ globalObject: this._global,
+ inArray: true
+ });
+ if (Array.isArray(parsedValue)) {
+ if (parsedValue.length === 1) {
+ const [{ name, type, value: itemValue }] = parsedValue;
+ switch (type) {
+ case AST_TYPES.CALC: {
+ this._setProperty(property, `${name}(${itemValue})`);
+ break;
+ }
+ case AST_TYPES.GLOBAL_KEYWORD:
+ case AST_TYPES.IDENTIFIER: {
+ // Set the normalized name for keywords or identifiers.
+ this._setProperty(property, name);
+ break;
+ }
+ default: {
+ // Set the prepared value for Dimension, Function, etc.
+ this._setProperty(property, value);
+ }
+ }
+ } else {
+ // Set the prepared value for lists containing multiple values.
+ this._setProperty(property, value);
+ }
+ } else if (typeof parsedValue === "string") {
+ // Empty string.
+ this._setProperty(property, parsedValue);
+ }
+ }
+ },
+ get() {
+ return this.getPropertyValue(property);
+ },
+ enumerable: true,
+ configurable: true
+});
+
+module.exports = {
+ getPropertyDescriptor
+};
diff --git a/vanilla/node_modules/cssstyle/lib/utils/strings.js b/vanilla/node_modules/cssstyle/lib/utils/strings.js
new file mode 100644
index 0000000..c0227e0
--- /dev/null
+++ b/vanilla/node_modules/cssstyle/lib/utils/strings.js
@@ -0,0 +1,173 @@
+// Forked from https://github.com/jsdom/jsdom/blob/main/lib/jsdom/living/helpers/strings.js
+
+"use strict";
+
+// https://infra.spec.whatwg.org/#ascii-whitespace
+const asciiWhitespaceRe = /^[\t\n\f\r ]$/;
+exports.asciiWhitespaceRe = asciiWhitespaceRe;
+
+// https://infra.spec.whatwg.org/#ascii-lowercase
+exports.asciiLowercase = (s) => {
+ if (!/[^\x00-\x7f]/.test(s)) {
+ return s.toLowerCase();
+ }
+ const len = s.length;
+ const out = new Array(len);
+ for (let i = 0; i < len; i++) {
+ const code = s.charCodeAt(i);
+ // If the character is between 'A' (65) and 'Z' (90), convert using bitwise OR with 32
+ out[i] = code >= 65 && code <= 90 ? String.fromCharCode(code | 32) : s[i];
+ }
+ return out.join("");
+};
+
+// https://infra.spec.whatwg.org/#ascii-uppercase
+exports.asciiUppercase = (s) => {
+ if (!/[^\x00-\x7f]/.test(s)) {
+ return s.toUpperCase();
+ }
+ const len = s.length;
+ const out = new Array(len);
+ for (let i = 0; i < len; i++) {
+ const code = s.charCodeAt(i);
+ // If the character is between 'a' (97) and 'z' (122), convert using bitwise AND with ~32
+ out[i] = code >= 97 && code <= 122 ? String.fromCharCode(code & ~32) : s[i];
+ }
+ return out.join("");
+};
+
+// https://infra.spec.whatwg.org/#strip-newlines
+exports.stripNewlines = (s) => {
+ return s.replace(/[\n\r]+/g, "");
+};
+
+// https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace
+exports.stripLeadingAndTrailingASCIIWhitespace = (s) => {
+ return s.replace(/^[ \t\n\f\r]+/, "").replace(/[ \t\n\f\r]+$/, "");
+};
+
+// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+exports.stripAndCollapseASCIIWhitespace = (s) => {
+ return s
+ .replace(/[ \t\n\f\r]+/g, " ")
+ .replace(/^[ \t\n\f\r]+/, "")
+ .replace(/[ \t\n\f\r]+$/, "");
+};
+
+// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-simple-colour
+exports.isValidSimpleColor = (s) => {
+ return /^#[a-fA-F\d]{6}$/.test(s);
+};
+
+// https://infra.spec.whatwg.org/#ascii-case-insensitive
+exports.asciiCaseInsensitiveMatch = (a, b) => {
+ if (a.length !== b.length) {
+ return false;
+ }
+
+ for (let i = 0; i < a.length; ++i) {
+ if ((a.charCodeAt(i) | 32) !== (b.charCodeAt(i) | 32)) {
+ return false;
+ }
+ }
+
+ return true;
+};
+
+// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-integers
+// Error is represented as null.
+const parseInteger = (exports.parseInteger = (input) => {
+ // The implementation here is slightly different from the spec's. We want to use parseInt(), but parseInt() trims
+ // Unicode whitespace in addition to just ASCII ones, so we make sure that the trimmed prefix contains only ASCII
+ // whitespace ourselves.
+ const numWhitespace = input.length - input.trimStart().length;
+ if (/[^\t\n\f\r ]/.test(input.slice(0, numWhitespace))) {
+ return null;
+ }
+ // We don't allow hexadecimal numbers here.
+ // eslint-disable-next-line radix
+ const value = parseInt(input, 10);
+ if (Number.isNaN(value)) {
+ return null;
+ }
+ // parseInt() returns -0 for "-0". Normalize that here.
+ return value === 0 ? 0 : value;
+});
+
+// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-non-negative-integers
+// Error is represented as null.
+exports.parseNonNegativeInteger = (input) => {
+ const value = parseInteger(input);
+ if (value === null) {
+ return null;
+ }
+ if (value < 0) {
+ return null;
+ }
+ return value;
+};
+
+// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-floating-point-number
+const floatingPointNumRe = /^-?(?:\d+|\d*\.\d+)(?:[eE][-+]?\d+)?$/;
+exports.isValidFloatingPointNumber = (str) => floatingPointNumRe.test(str);
+
+// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-floating-point-number-values
+// Error is represented as null.
+exports.parseFloatingPointNumber = (str) => {
+ // The implementation here is slightly different from the spec's. We need to use parseFloat() in order to retain
+ // accuracy, but parseFloat() trims Unicode whitespace in addition to just ASCII ones, so we make sure that the
+ // trimmed prefix contains only ASCII whitespace ourselves.
+ const numWhitespace = str.length - str.trimStart().length;
+ if (/[^\t\n\f\r ]/.test(str.slice(0, numWhitespace))) {
+ return null;
+ }
+ const parsed = parseFloat(str);
+ return isFinite(parsed) ? parsed : null;
+};
+
+// https://infra.spec.whatwg.org/#split-on-ascii-whitespace
+exports.splitOnASCIIWhitespace = (str) => {
+ let position = 0;
+ const tokens = [];
+ while (position < str.length && asciiWhitespaceRe.test(str[position])) {
+ position++;
+ }
+ if (position === str.length) {
+ return tokens;
+ }
+ while (position < str.length) {
+ const start = position;
+ while (position < str.length && !asciiWhitespaceRe.test(str[position])) {
+ position++;
+ }
+ tokens.push(str.slice(start, position));
+ while (position < str.length && asciiWhitespaceRe.test(str[position])) {
+ position++;
+ }
+ }
+ return tokens;
+};
+
+// https://infra.spec.whatwg.org/#split-on-commas
+exports.splitOnCommas = (str) => {
+ let position = 0;
+ const tokens = [];
+ while (position < str.length) {
+ let start = position;
+ while (position < str.length && str[position] !== ",") {
+ position++;
+ }
+ let end = position;
+ while (start < str.length && asciiWhitespaceRe.test(str[start])) {
+ start++;
+ }
+ while (end > start && asciiWhitespaceRe.test(str[end - 1])) {
+ end--;
+ }
+ tokens.push(str.slice(start, end));
+ if (position < str.length) {
+ position++;
+ }
+ }
+ return tokens;
+};