From 67888a864fab60d467094d4870811a99ded2e82f Mon Sep 17 00:00:00 2001 From: Yusuke Abe Date: Wed, 8 May 2024 23:26:22 +0900 Subject: [PATCH] feat(biome_css_analyzer): noUnknownProperty (#2755) Co-authored-by: Emanuele Stoppa --- .../biome_configuration/src/linter/rules.rs | 71 +- crates/biome_css_analyze/src/keywords.rs | 4156 ++++++++++++++++- crates/biome_css_analyze/src/lint/nursery.rs | 2 + .../src/lint/nursery/no_unknown_property.rs | 95 + crates/biome_css_analyze/src/options.rs | 2 + crates/biome_css_analyze/src/utils.rs | 29 +- .../nursery/noUnknownProperty/invalid.css | 7 + .../noUnknownProperty/invalid.css.snap | 52 + .../specs/nursery/noUnknownProperty/valid.css | 44 + .../nursery/noUnknownProperty/valid.css.snap | 52 + .../src/categories.rs | 3 +- .../@biomejs/backend-jsonrpc/src/workspace.ts | 7 +- .../@biomejs/biome/configuration_schema.json | 7 + 13 files changed, 4495 insertions(+), 32 deletions(-) create mode 100644 crates/biome_css_analyze/src/lint/nursery/no_unknown_property.rs create mode 100644 crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css create mode 100644 crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css.snap create mode 100644 crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css create mode 100644 crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css.snap diff --git a/crates/biome_configuration/src/linter/rules.rs b/crates/biome_configuration/src/linter/rules.rs index 1f5fc7f6b25b..277a382d2821 100644 --- a/crates/biome_configuration/src/linter/rules.rs +++ b/crates/biome_configuration/src/linter/rules.rs @@ -2705,6 +2705,9 @@ pub struct Nursery { #[doc = "Disallow unknown CSS value functions."] #[serde(skip_serializing_if = "Option::is_none")] pub no_unknown_function: Option>, + #[doc = "Disallow unknown properties."] + #[serde(skip_serializing_if = "Option::is_none")] + pub no_unknown_property: Option>, #[doc = "Disallow unknown pseudo-element selectors."] #[serde(skip_serializing_if = "Option::is_none")] pub no_unknown_selector_pseudo_element: @@ -2781,6 +2784,7 @@ impl Nursery { "noRestrictedImports", "noUndeclaredDependencies", "noUnknownFunction", + "noUnknownProperty", "noUnknownSelectorPseudoElement", "noUnknownUnit", "noUnmatchableAnbSelector", @@ -2823,10 +2827,10 @@ impl Nursery { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[11]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[12]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[18]), - RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[19]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[20]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[21]), - RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[28]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[22]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[29]), ]; const ALL_RULES_AS_FILTERS: &'static [RuleFilter<'static>] = &[ RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0]), @@ -2860,6 +2864,7 @@ impl Nursery { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[28]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[29]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[30]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31]), ]; #[doc = r" Retrieves the recommended rules"] pub(crate) fn is_recommended_true(&self) -> bool { @@ -2971,66 +2976,71 @@ impl Nursery { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[18])); } } - if let Some(rule) = self.no_unknown_selector_pseudo_element.as_ref() { + if let Some(rule) = self.no_unknown_property.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[19])); } } - if let Some(rule) = self.no_unknown_unit.as_ref() { + if let Some(rule) = self.no_unknown_selector_pseudo_element.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[20])); } } - if let Some(rule) = self.no_unmatchable_anb_selector.as_ref() { + if let Some(rule) = self.no_unknown_unit.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[21])); } } - if let Some(rule) = self.no_useless_string_concat.as_ref() { + if let Some(rule) = self.no_unmatchable_anb_selector.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[22])); } } - if let Some(rule) = self.no_useless_undefined_initialization.as_ref() { + if let Some(rule) = self.no_useless_string_concat.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[23])); } } - if let Some(rule) = self.use_array_literals.as_ref() { + if let Some(rule) = self.no_useless_undefined_initialization.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[24])); } } - if let Some(rule) = self.use_consistent_builtin_instantiation.as_ref() { + if let Some(rule) = self.use_array_literals.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[25])); } } - if let Some(rule) = self.use_default_switch_clause.as_ref() { + if let Some(rule) = self.use_consistent_builtin_instantiation.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[26])); } } - if let Some(rule) = self.use_explicit_length_check.as_ref() { + if let Some(rule) = self.use_default_switch_clause.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[27])); } } - if let Some(rule) = self.use_generic_font_names.as_ref() { + if let Some(rule) = self.use_explicit_length_check.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[28])); } } - if let Some(rule) = self.use_import_restrictions.as_ref() { + if let Some(rule) = self.use_generic_font_names.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[29])); } } - if let Some(rule) = self.use_sorted_classes.as_ref() { + if let Some(rule) = self.use_import_restrictions.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[30])); } } + if let Some(rule) = self.use_sorted_classes.as_ref() { + if rule.is_enabled() { + index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31])); + } + } index_set } pub(crate) fn get_disabled_rules(&self) -> IndexSet { @@ -3130,66 +3140,71 @@ impl Nursery { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[18])); } } - if let Some(rule) = self.no_unknown_selector_pseudo_element.as_ref() { + if let Some(rule) = self.no_unknown_property.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[19])); } } - if let Some(rule) = self.no_unknown_unit.as_ref() { + if let Some(rule) = self.no_unknown_selector_pseudo_element.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[20])); } } - if let Some(rule) = self.no_unmatchable_anb_selector.as_ref() { + if let Some(rule) = self.no_unknown_unit.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[21])); } } - if let Some(rule) = self.no_useless_string_concat.as_ref() { + if let Some(rule) = self.no_unmatchable_anb_selector.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[22])); } } - if let Some(rule) = self.no_useless_undefined_initialization.as_ref() { + if let Some(rule) = self.no_useless_string_concat.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[23])); } } - if let Some(rule) = self.use_array_literals.as_ref() { + if let Some(rule) = self.no_useless_undefined_initialization.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[24])); } } - if let Some(rule) = self.use_consistent_builtin_instantiation.as_ref() { + if let Some(rule) = self.use_array_literals.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[25])); } } - if let Some(rule) = self.use_default_switch_clause.as_ref() { + if let Some(rule) = self.use_consistent_builtin_instantiation.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[26])); } } - if let Some(rule) = self.use_explicit_length_check.as_ref() { + if let Some(rule) = self.use_default_switch_clause.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[27])); } } - if let Some(rule) = self.use_generic_font_names.as_ref() { + if let Some(rule) = self.use_explicit_length_check.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[28])); } } - if let Some(rule) = self.use_import_restrictions.as_ref() { + if let Some(rule) = self.use_generic_font_names.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[29])); } } - if let Some(rule) = self.use_sorted_classes.as_ref() { + if let Some(rule) = self.use_import_restrictions.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[30])); } } + if let Some(rule) = self.use_sorted_classes.as_ref() { + if rule.is_disabled() { + index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31])); + } + } index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] @@ -3302,6 +3317,10 @@ impl Nursery { .no_unknown_function .as_ref() .map(|conf| (conf.level(), conf.get_options())), + "noUnknownProperty" => self + .no_unknown_property + .as_ref() + .map(|conf| (conf.level(), conf.get_options())), "noUnknownSelectorPseudoElement" => self .no_unknown_selector_pseudo_element .as_ref() diff --git a/crates/biome_css_analyze/src/keywords.rs b/crates/biome_css_analyze/src/keywords.rs index 8998688e3074..4989e8a60aca 100644 --- a/crates/biome_css_analyze/src/keywords.rs +++ b/crates/biome_css_analyze/src/keywords.rs @@ -857,11 +857,4116 @@ pub const OTHER_PSEUDO_ELEMENTS: [&str; 18] = [ pub const VENDER_PREFIXES: [&str; 4] = ["-webkit-", "-moz-", "-ms-", "-o-"]; +// https://github.com/known-css/known-css-properties/blob/master/source/w3c.json +pub const KNOWN_PROPERTIES: [&str; 588] = [ + "-webkit-line-clamp", + "accent-color", + "align-content", + "align-items", + "align-self", + "alignment-baseline", + "all", + "anchor-default", + "anchor-name", + "anchor-scroll", + "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-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "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-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-boundary", + "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-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-start-end-radius", + "border-start-start-radius", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-decoration-break", + "box-shadow", + "box-sizing", + "box-snap", + "break-after", + "break-before", + "break-inside", + "caption-side", + "caret", + "caret-animation", + "caret-color", + "caret-shape", + "chains", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "color-adjust", + "color-interpolation-filters", + "color-scheme", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "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", + "counter-increment", + "counter-reset", + "counter-set", + "cue", + "cue-after", + "cue-before", + "cursor", + "direction", + "display", + "dominant-baseline", + "elevation", + "empty-cells", + "field-sizing", + "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", + "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", + "input-security", + "inset", + "inset-area", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "isolation", + "justify-content", + "justify-items", + "justify-self", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "line-clamp", + "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", + "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", + "pointer-events", + "position", + "position-animation", + "position-fallback", + "position-fallback-bounds", + "position-try", + "position-try-options", + "position-try-order", + "print-color-adjust", + "property-name", + "quotes", + "region-fragment", + "resize", + "rest", + "rest-after", + "rest-before", + "richness", + "right", + "rotate", + "row-gap", + "ruby-align", + "ruby-merge", + "ruby-overhang", + "ruby-position", + "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-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-timeline", + "scroll-timeline-axis", + "scroll-timeline-name", + "scrollbar-color", + "scrollbar-gutter", + "scrollbar-width", + "shape-image-threshold", + "shape-inside", + "shape-margin", + "shape-outside", + "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-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-decoration-trim", + "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-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", + "zoom", +]; +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/chrome-122.0.json +pub const KNOWN_CHROME_PROPERTIES: [&str; 619] = [ + "accent-color", + "additive-symbols", + "align-content", + "-webkit-align-content", + "align-items", + "-webkit-align-items", + "align-self", + "-webkit-align-self", + "alignment-baseline", + "all", + "animation", + "animation-composition", + "animation-delay", + "-webkit-animation-delay", + "animation-direction", + "-webkit-animation-direction", + "animation-duration", + "-webkit-animation-duration", + "animation-fill-mode", + "-webkit-animation-fill-mode", + "animation-iteration-count", + "-webkit-animation-iteration-count", + "animation-name", + "-webkit-animation-name", + "animation-play-state", + "-webkit-animation-play-state", + "animation-range", + "animation-range-end", + "animation-range-start", + "animation-timeline", + "animation-timing-function", + "-webkit-animation-timing-function", + "-webkit-animation", + "app-region", + "-webkit-app-region", + "appearance", + "-webkit-appearance", + "ascent-override", + "aspect-ratio", + "backdrop-filter", + "backface-visibility", + "-webkit-backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "-webkit-background-clip", + "background-color", + "background-image", + "background-origin", + "-webkit-background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "-webkit-background-size", + "base-palette", + "baseline-shift", + "baseline-source", + "block-size", + "border", + "-webkit-border-after-color", + "-webkit-border-after-style", + "-webkit-border-after", + "-webkit-border-after-width", + "-webkit-border-before-color", + "-webkit-border-before-style", + "-webkit-border-before", + "-webkit-border-before-width", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-block-style", + "border-block-width", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "-webkit-border-bottom-left-radius", + "border-bottom-right-radius", + "-webkit-border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "-webkit-border-end-color", + "border-end-end-radius", + "border-end-start-radius", + "-webkit-border-end-style", + "-webkit-border-end", + "-webkit-border-end-width", + "-webkit-border-horizontal-spacing", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "-webkit-border-image", + "border-image-width", + "border-inline", + "border-inline-color", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "-webkit-border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "-webkit-border-start-color", + "border-start-end-radius", + "border-start-start-radius", + "-webkit-border-start-style", + "-webkit-border-start", + "-webkit-border-start-width", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "-webkit-border-top-left-radius", + "border-top-right-radius", + "-webkit-border-top-right-radius", + "border-top-style", + "border-top-width", + "-webkit-border-vertical-spacing", + "border-width", + "bottom", + "-webkit-box-align", + "-webkit-box-decoration-break", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-reflect", + "box-shadow", + "-webkit-box-shadow", + "box-sizing", + "-webkit-box-sizing", + "break-after", + "break-before", + "break-inside", + "buffered-rendering", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "-webkit-clip-path", + "clip-rule", + "color", + "color-interpolation", + "color-interpolation-filters", + "color-rendering", + "color-scheme", + "-webkit-column-break-after", + "-webkit-column-break-before", + "-webkit-column-break-inside", + "column-count", + "-webkit-column-count", + "column-fill", + "column-gap", + "-webkit-column-gap", + "column-rule", + "column-rule-color", + "-webkit-column-rule-color", + "column-rule-style", + "-webkit-column-rule-style", + "-webkit-column-rule", + "column-rule-width", + "-webkit-column-rule-width", + "column-span", + "-webkit-column-span", + "column-width", + "-webkit-column-width", + "columns", + "-webkit-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", + "counter-increment", + "counter-reset", + "counter-set", + "cursor", + "cx", + "cy", + "d", + "descent-override", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "fallback", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "-webkit-filter", + "flex", + "flex-basis", + "-webkit-flex-basis", + "flex-direction", + "-webkit-flex-direction", + "flex-flow", + "-webkit-flex-flow", + "flex-grow", + "-webkit-flex-grow", + "flex-shrink", + "-webkit-flex-shrink", + "-webkit-flex", + "flex-wrap", + "-webkit-flex-wrap", + "float", + "flood-color", + "flood-opacity", + "font", + "font-display", + "font-family", + "font-feature-settings", + "-webkit-font-feature-settings", + "font-kerning", + "font-optical-sizing", + "font-palette", + "font-size", + "-webkit-font-smoothing", + "font-stretch", + "font-style", + "font-synthesis", + "font-synthesis-small-caps", + "font-synthesis-style", + "font-synthesis-weight", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "forced-color-adjust", + "gap", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "height", + "hyphenate-character", + "-webkit-hyphenate-character", + "hyphenate-limit-chars", + "hyphens", + "image-orientation", + "image-rendering", + "inherits", + "initial-letter", + "initial-value", + "inline-size", + "inset", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "isolation", + "justify-content", + "-webkit-justify-content", + "justify-items", + "justify-self", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "-webkit-line-break", + "-webkit-line-clamp", + "line-gap-override", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "-webkit-locale", + "-webkit-logical-height", + "-webkit-logical-width", + "margin", + "-webkit-margin-after", + "-webkit-margin-before", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "-webkit-margin-end", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "-webkit-margin-start", + "margin-top", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "-webkit-mask-box-image-outset", + "-webkit-mask-box-image-repeat", + "-webkit-mask-box-image-slice", + "-webkit-mask-box-image-source", + "-webkit-mask-box-image", + "-webkit-mask-box-image-width", + "mask-clip", + "-webkit-mask-clip", + "mask-composite", + "-webkit-mask-composite", + "mask-image", + "-webkit-mask-image", + "mask-mode", + "mask-origin", + "-webkit-mask-origin", + "mask-position", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "mask-repeat", + "-webkit-mask-repeat", + "mask-size", + "-webkit-mask-size", + "mask-type", + "-webkit-mask", + "math-depth", + "math-shift", + "math-style", + "max-block-size", + "max-height", + "max-inline-size", + "-webkit-max-logical-height", + "-webkit-max-logical-width", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "-webkit-min-logical-height", + "-webkit-min-logical-width", + "min-width", + "mix-blend-mode", + "negative", + "object-fit", + "object-position", + "object-view-box", + "offset", + "offset-anchor", + "offset-distance", + "offset-path", + "offset-position", + "offset-rotate", + "opacity", + "-webkit-opacity", + "order", + "-webkit-order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-anchor", + "overflow-clip-margin", + "overflow-wrap", + "overflow-x", + "overflow-y", + "overlay", + "override-colors", + "overscroll-behavior", + "overscroll-behavior-block", + "overscroll-behavior-inline", + "overscroll-behavior-x", + "overscroll-behavior-y", + "pad", + "padding", + "-webkit-padding-after", + "-webkit-padding-before", + "padding-block", + "padding-block-end", + "padding-block-start", + "padding-bottom", + "-webkit-padding-end", + "padding-inline", + "padding-inline-end", + "padding-inline-start", + "padding-left", + "padding-right", + "-webkit-padding-start", + "padding-top", + "page", + "page-break-after", + "page-break-before", + "page-break-inside", + "page-orientation", + "paint-order", + "perspective", + "perspective-origin", + "-webkit-perspective-origin", + "-webkit-perspective-origin-x", + "-webkit-perspective-origin-y", + "-webkit-perspective", + "place-content", + "place-items", + "place-self", + "pointer-events", + "position", + "prefix", + "-webkit-print-color-adjust", + "quotes", + "r", + "range", + "resize", + "right", + "rotate", + "row-gap", + "-webkit-rtl-ordering", + "ruby-position", + "-webkit-ruby-position", + "rx", + "ry", + "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-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-timeline", + "scroll-timeline-axis", + "scroll-timeline-name", + "scrollbar-color", + "scrollbar-gutter", + "scrollbar-width", + "shape-image-threshold", + "-webkit-shape-image-threshold", + "shape-margin", + "-webkit-shape-margin", + "shape-outside", + "-webkit-shape-outside", + "shape-rendering", + "size", + "size-adjust", + "speak", + "speak-as", + "src", + "stop-color", + "stop-opacity", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "suffix", + "symbols", + "syntax", + "system", + "tab-size", + "table-layout", + "-webkit-tap-highlight-color", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "-webkit-text-combine", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip-ink", + "text-decoration-style", + "text-decoration-thickness", + "-webkit-text-decorations-in-effect", + "text-emphasis", + "text-emphasis-color", + "-webkit-text-emphasis-color", + "text-emphasis-position", + "-webkit-text-emphasis-position", + "text-emphasis-style", + "-webkit-text-emphasis-style", + "-webkit-text-emphasis", + "-webkit-text-fill-color", + "text-indent", + "text-orientation", + "-webkit-text-orientation", + "text-overflow", + "text-rendering", + "-webkit-text-security", + "text-shadow", + "text-size-adjust", + "-webkit-text-size-adjust", + "-webkit-text-stroke-color", + "-webkit-text-stroke", + "-webkit-text-stroke-width", + "text-transform", + "text-underline-offset", + "text-underline-position", + "text-wrap", + "timeline-scope", + "top", + "touch-action", + "transform", + "transform-box", + "transform-origin", + "-webkit-transform-origin", + "-webkit-transform-origin-x", + "-webkit-transform-origin-y", + "-webkit-transform-origin-z", + "transform-style", + "-webkit-transform-style", + "-webkit-transform", + "transition", + "transition-behavior", + "transition-delay", + "-webkit-transition-delay", + "transition-duration", + "-webkit-transition-duration", + "transition-property", + "-webkit-transition-property", + "transition-timing-function", + "-webkit-transition-timing-function", + "-webkit-transition", + "translate", + "unicode-bidi", + "unicode-range", + "-webkit-user-drag", + "-webkit-user-modify", + "user-select", + "-webkit-user-select", + "vector-effect", + "vertical-align", + "view-timeline", + "view-timeline-axis", + "view-timeline-inset", + "view-timeline-name", + "view-transition-name", + "visibility", + "white-space", + "white-space-collapse", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "-webkit-writing-mode", + "x", + "y", + "z-index", + "zoom", +]; + +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/edge-18.0.json +pub const KNOWN_EDGE_PROPERTIES: [&str; 386] = [ + "-ms-content-zoom-chaining", + "-ms-content-zoom-limit", + "-ms-content-zoom-limit-max", + "-ms-content-zoom-limit-min", + "-ms-content-zoom-snap", + "-ms-content-zoom-snap-points", + "-ms-content-zoom-snap-type", + "-ms-content-zooming", + "-ms-flow-from", + "-ms-flow-into", + "-ms-font-feature-settings", + "-ms-grid-column", + "-ms-grid-column-align", + "-ms-grid-column-span", + "-ms-grid-columns", + "-ms-grid-row", + "-ms-grid-row-align", + "-ms-grid-row-span", + "-ms-grid-rows", + "-ms-high-contrast-adjust", + "-ms-hyphenate-limit-chars", + "-ms-hyphenate-limit-lines", + "-ms-hyphenate-limit-zone", + "-ms-hyphens", + "-ms-ime-align", + "-ms-overflow-style", + "-ms-scroll-chaining", + "-ms-scroll-limit", + "-ms-scroll-limit-x-max", + "-ms-scroll-limit-x-min", + "-ms-scroll-limit-y-max", + "-ms-scroll-limit-y-min", + "-ms-scroll-rails", + "-ms-scroll-snap-points-x", + "-ms-scroll-snap-points-y", + "-ms-scroll-snap-type", + "-ms-scroll-snap-x", + "-ms-scroll-snap-y", + "-ms-scroll-translation", + "-ms-text-combine-horizontal", + "-ms-text-size-adjust", + "-ms-touch-select", + "-ms-user-select", + "-ms-wrap-flow", + "-ms-wrap-margin", + "-ms-wrap-through", + "-webkit-align-content", + "-webkit-align-items", + "-webkit-align-self", + "-webkit-animation", + "-webkit-animation-delay", + "-webkit-animation-direction", + "-webkit-animation-duration", + "-webkit-animation-fill-mode", + "-webkit-animation-iteration-count", + "-webkit-animation-name", + "-webkit-animation-play-state", + "-webkit-animation-timing-function", + "-webkit-appearance", + "-webkit-backdrop-filter", + "-webkit-backface-visibility", + "-webkit-background-clip", + "-webkit-background-origin", + "-webkit-background-size", + "-webkit-border-bottom-left-radius", + "-webkit-border-bottom-right-radius", + "-webkit-border-image", + "-webkit-border-radius", + "-webkit-border-top-left-radius", + "-webkit-border-top-right-radius", + "-webkit-box-align", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-sizing", + "-webkit-column-break-after", + "-webkit-column-break-before", + "-webkit-column-break-inside", + "-webkit-column-count", + "-webkit-column-gap", + "-webkit-column-rule", + "-webkit-column-rule-color", + "-webkit-column-rule-style", + "-webkit-column-rule-width", + "-webkit-column-span", + "-webkit-column-width", + "-webkit-columns", + "-webkit-filter", + "-webkit-flex", + "-webkit-flex-basis", + "-webkit-flex-direction", + "-webkit-flex-flow", + "-webkit-flex-grow", + "-webkit-flex-shrink", + "-webkit-flex-wrap", + "-webkit-justify-content", + "-webkit-line-clamp", + "-webkit-mask", + "-webkit-mask-composite", + "-webkit-mask-image", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "-webkit-mask-repeat", + "-webkit-mask-size", + "-webkit-order", + "-webkit-perspective", + "-webkit-perspective-origin", + "-webkit-tap-highlight-color", + "-webkit-text-fill-color", + "-webkit-text-size-adjust", + "-webkit-text-stroke", + "-webkit-text-stroke-color", + "-webkit-text-stroke-width", + "-webkit-transform", + "-webkit-transform-origin", + "-webkit-transform-style", + "-webkit-transition", + "-webkit-transition-delay", + "-webkit-transition-duration", + "-webkit-transition-property", + "-webkit-transition-timing-function", + "-webkit-user-modify", + "-webkit-user-select", + "-webkit-writing-mode", + "align-content", + "align-items", + "align-self", + "alignment-baseline", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "backface-visibility", + "background", + "background-attachment", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "baseline-shift", + "border", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "caption-side", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "color-interpolation-filters", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "content", + "counter-increment", + "counter-reset", + "cursor", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "flood-color", + "flood-opacity", + "font", + "font-family", + "font-feature-settings", + "font-optical-sizing", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-variant", + "font-variation-settings", + "font-weight", + "gap", + "glyph-orientation-horizontal", + "glyph-orientation-vertical", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "height", + "ime-mode", + "justify-content", + "justify-items", + "justify-self", + "kerning", + "layout-grid", + "layout-grid-char", + "layout-grid-line", + "layout-grid-mode", + "layout-grid-type", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-bottom", + "margin-left", + "margin-right", + "margin-top", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "mask-composite", + "mask-image", + "mask-position", + "mask-position-x", + "mask-position-y", + "mask-repeat", + "mask-size", + "max-height", + "max-width", + "min-height", + "min-width", + "object-fit", + "object-position", + "opacity", + "order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-wrap", + "overflow-x", + "overflow-y", + "overscroll-behavior", + "overscroll-behavior-x", + "overscroll-behavior-y", + "padding", + "padding-bottom", + "padding-left", + "padding-right", + "padding-top", + "page-break-after", + "page-break-before", + "page-break-inside", + "paint-order", + "pen-action", + "perspective", + "perspective-origin", + "pointer-events", + "position", + "quotes", + "right", + "row-gap", + "ruby-align", + "ruby-overhang", + "ruby-position", + "stop-color", + "stop-opacity", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "table-layout", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "text-decoration", + "text-indent", + "text-justify", + "text-kashida", + "text-kashida-space", + "text-overflow", + "text-shadow", + "text-transform", + "text-underline-position", + "top", + "touch-action", + "transform", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "unicode-bidi", + "vertical-align", + "visibility", + "white-space", + "widows", + "width", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "z-index", + "zoom", +]; + +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/explorer-11.0.json +pub const KNOWN_EXPLORER_PROPERTIES: [&str; 182] = [ + "-ms-block-progression", + "-ms-interpolation-mode", + "-ms-transform", + "-ms-transform-origin", + "accelerator", + "alignment-baseline", + "background", + "background-attachment", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "baseline-shift", + "behavior", + "border", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-shadow", + "box-sizing", + "caption-side", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "content", + "counter-increment", + "counter-reset", + "cursor", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "font", + "font-family", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-variant", + "font-weight", + "glyph-orientation-horizontal", + "glyph-orientation-vertical", + "height", + "ime-mode", + "kerning", + "layout-flow", + "layout-grid", + "layout-grid-char", + "layout-grid-line", + "layout-grid-mode", + "layout-grid-type", + "left", + "letter-spacing", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-bottom", + "margin-left", + "margin-right", + "margin-top", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "max-height", + "max-width", + "min-height", + "min-width", + "opacity", + "orphans", + "outline", + "outline-color", + "outline-style", + "outline-width", + "overflow", + "overflow-x", + "overflow-y", + "padding", + "padding-bottom", + "padding-left", + "padding-right", + "padding-top", + "page-break-after", + "page-break-before", + "page-break-inside", + "pointer-events", + "position", + "quotes", + "right", + "ruby-align", + "ruby-overhang", + "ruby-position", + "scrollbar-arrow-color", + "scrollbar-base-color", + "scrollbar-dark-shadow-color", + "scrollbar-face-color", + "scrollbar-highlight-color", + "scrollbar-shadow-color", + "scrollbar-track-color", + "scrollbar3d-light-color", + "stop-color", + "stop-opacity", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "table-layout", + "text-align", + "text-align-last", + "text-anchor", + "text-autospace", + "text-decoration", + "text-decoration-blink", + "text-decoration-line-through", + "text-decoration-none", + "text-decoration-overline", + "text-decoration-underline", + "text-indent", + "text-justify", + "text-justify-trim", + "text-kashida", + "text-kashida-space", + "text-overflow", + "text-transform", + "text-underline-position", + "top", + "unicode-bidi", + "vertical-align", + "visibility", + "white-space", + "widows", + "width", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "z-index", + "zoom", +]; + +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/firefox-122.0.json +pub const KNOWN_FIREFOX_PROPERTIES: [&str; 526] = [ + "-moz-animation", + "-moz-animation-delay", + "-moz-animation-direction", + "-moz-animation-duration", + "-moz-animation-fill-mode", + "-moz-animation-iteration-count", + "-moz-animation-name", + "-moz-animation-play-state", + "-moz-animation-timing-function", + "-moz-appearance", + "-moz-backface-visibility", + "-moz-border-end", + "-moz-border-end-color", + "-moz-border-end-style", + "-moz-border-end-width", + "-moz-border-image", + "-moz-border-start", + "-moz-border-start-color", + "-moz-border-start-style", + "-moz-border-start-width", + "-moz-box-align", + "-moz-box-direction", + "-moz-box-flex", + "-moz-box-ordinal-group", + "-moz-box-orient", + "-moz-box-pack", + "-moz-box-sizing", + "-moz-float-edge", + "-moz-font-feature-settings", + "-moz-font-language-override", + "-moz-force-broken-image-icon", + "-moz-hyphens", + "-moz-image-region", + "-moz-margin-end", + "-moz-margin-start", + "-moz-orient", + "-moz-osx-font-smoothing", + "-moz-padding-end", + "-moz-padding-start", + "-moz-perspective", + "-moz-perspective-origin", + "-moz-tab-size", + "-moz-text-size-adjust", + "-moz-transform", + "-moz-transform-origin", + "-moz-transform-style", + "-moz-transition", + "-moz-transition-delay", + "-moz-transition-duration", + "-moz-transition-property", + "-moz-transition-timing-function", + "-moz-user-focus", + "-moz-user-input", + "-moz-user-modify", + "-moz-user-select", + "-moz-window-dragging", + "-webkit-align-content", + "-webkit-align-items", + "-webkit-align-self", + "-webkit-animation", + "-webkit-animation-delay", + "-webkit-animation-direction", + "-webkit-animation-duration", + "-webkit-animation-fill-mode", + "-webkit-animation-iteration-count", + "-webkit-animation-name", + "-webkit-animation-play-state", + "-webkit-animation-timing-function", + "-webkit-appearance", + "-webkit-backface-visibility", + "-webkit-background-clip", + "-webkit-background-origin", + "-webkit-background-size", + "-webkit-border-bottom-left-radius", + "-webkit-border-bottom-right-radius", + "-webkit-border-image", + "-webkit-border-radius", + "-webkit-border-top-left-radius", + "-webkit-border-top-right-radius", + "-webkit-box-align", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-shadow", + "-webkit-box-sizing", + "-webkit-filter", + "-webkit-flex", + "-webkit-flex-basis", + "-webkit-flex-direction", + "-webkit-flex-flow", + "-webkit-flex-grow", + "-webkit-flex-shrink", + "-webkit-flex-wrap", + "-webkit-justify-content", + "-webkit-line-clamp", + "-webkit-mask", + "-webkit-mask-clip", + "-webkit-mask-composite", + "-webkit-mask-image", + "-webkit-mask-origin", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "-webkit-mask-repeat", + "-webkit-mask-size", + "-webkit-order", + "-webkit-perspective", + "-webkit-perspective-origin", + "-webkit-text-fill-color", + "-webkit-text-size-adjust", + "-webkit-text-stroke", + "-webkit-text-stroke-color", + "-webkit-text-stroke-width", + "-webkit-transform", + "-webkit-transform-origin", + "-webkit-transform-style", + "-webkit-transition", + "-webkit-transition-delay", + "-webkit-transition-duration", + "-webkit-transition-property", + "-webkit-transition-timing-function", + "-webkit-user-select", + "accent-color", + "align-content", + "align-items", + "align-self", + "all", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "appearance", + "aspect-ratio", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "block-size", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "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-right-radius", + "border-bottom-style", + "border-bottom-width", + "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-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-start-end-radius", + "border-start-start-radius", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-decoration-break", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "color-adjust", + "color-interpolation", + "color-interpolation-filters", + "color-scheme", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "contain", + "content", + "counter-increment", + "counter-reset", + "counter-set", + "cursor", + "cx", + "cy", + "d", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flood-color", + "flood-opacity", + "font", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-optical-sizing", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "gap", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "height", + "hyphenate-character", + "hyphens", + "image-orientation", + "image-rendering", + "ime-mode", + "inline-size", + "inset", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "isolation", + "justify-content", + "justify-items", + "justify-self", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-position-x", + "mask-position-y", + "mask-repeat", + "mask-size", + "mask-type", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "object-fit", + "object-position", + "offset", + "offset-anchor", + "offset-distance", + "offset-path", + "offset-rotate", + "opacity", + "order", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-anchor", + "overflow-block", + "overflow-inline", + "overflow-wrap", + "overflow-x", + "overflow-y", + "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-break-after", + "page-break-before", + "page-break-inside", + "paint-order", + "perspective", + "perspective-origin", + "place-content", + "place-items", + "place-self", + "pointer-events", + "position", + "print-color-adjust", + "quotes", + "r", + "resize", + "right", + "rotate", + "row-gap", + "ruby-align", + "ruby-position", + "rx", + "ry", + "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-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-type", + "scrollbar-color", + "scrollbar-gutter", + "scrollbar-width", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "shape-rendering", + "stop-color", + "stop-opacity", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "tab-size", + "table-layout", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip-ink", + "text-decoration-style", + "text-decoration-thickness", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-justify", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "text-underline-offset", + "text-underline-position", + "top", + "touch-action", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "translate", + "unicode-bidi", + "user-select", + "vector-effect", + "vertical-align", + "visibility", + "white-space", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "x", + "y", + "z-index", +]; + +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/safari-17.1.json +pub const KNOWN_SAFARI_PROPERTIES: [&str; 644] = [ + "-apple-pay-button-style", + "-apple-pay-button-type", + "-epub-caption-side", + "-epub-hyphens", + "-epub-text-combine", + "-epub-text-emphasis", + "-epub-text-emphasis-color", + "-epub-text-emphasis-style", + "-epub-text-orientation", + "-epub-text-transform", + "-epub-word-break", + "-epub-writing-mode", + "-webkit-align-content", + "-webkit-align-items", + "-webkit-align-self", + "-webkit-alt", + "-webkit-animation", + "-webkit-animation-delay", + "-webkit-animation-direction", + "-webkit-animation-duration", + "-webkit-animation-fill-mode", + "-webkit-animation-iteration-count", + "-webkit-animation-name", + "-webkit-animation-play-state", + "-webkit-animation-timing-function", + "-webkit-appearance", + "-webkit-backdrop-filter", + "-webkit-backface-visibility", + "-webkit-background-clip", + "-webkit-background-origin", + "-webkit-background-size", + "-webkit-border-after", + "-webkit-border-after-color", + "-webkit-border-after-style", + "-webkit-border-after-width", + "-webkit-border-before", + "-webkit-border-before-color", + "-webkit-border-before-style", + "-webkit-border-before-width", + "-webkit-border-bottom-left-radius", + "-webkit-border-bottom-right-radius", + "-webkit-border-end", + "-webkit-border-end-color", + "-webkit-border-end-style", + "-webkit-border-end-width", + "-webkit-border-horizontal-spacing", + "-webkit-border-image", + "-webkit-border-radius", + "-webkit-border-start", + "-webkit-border-start-color", + "-webkit-border-start-style", + "-webkit-border-start-width", + "-webkit-border-top-left-radius", + "-webkit-border-top-right-radius", + "-webkit-border-vertical-spacing", + "-webkit-box-align", + "-webkit-box-decoration-break", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-flex-group", + "-webkit-box-lines", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-reflect", + "-webkit-box-shadow", + "-webkit-box-sizing", + "-webkit-clip-path", + "-webkit-column-axis", + "-webkit-column-break-after", + "-webkit-column-break-before", + "-webkit-column-break-inside", + "-webkit-column-count", + "-webkit-column-fill", + "-webkit-column-gap", + "-webkit-column-progression", + "-webkit-column-rule", + "-webkit-column-rule-color", + "-webkit-column-rule-style", + "-webkit-column-rule-width", + "-webkit-column-span", + "-webkit-column-width", + "-webkit-columns", + "-webkit-cursor-visibility", + "-webkit-filter", + "-webkit-flex", + "-webkit-flex-basis", + "-webkit-flex-direction", + "-webkit-flex-flow", + "-webkit-flex-grow", + "-webkit-flex-shrink", + "-webkit-flex-wrap", + "-webkit-font-kerning", + "-webkit-font-smoothing", + "-webkit-hyphenate-character", + "-webkit-hyphenate-limit-after", + "-webkit-hyphenate-limit-before", + "-webkit-hyphenate-limit-lines", + "-webkit-hyphens", + "-webkit-initial-letter", + "-webkit-justify-content", + "-webkit-justify-items", + "-webkit-line-align", + "-webkit-line-box-contain", + "-webkit-line-break", + "-webkit-line-clamp", + "-webkit-line-grid", + "-webkit-line-snap", + "-webkit-locale", + "-webkit-logical-height", + "-webkit-logical-width", + "-webkit-margin-after", + "-webkit-margin-before", + "-webkit-margin-end", + "-webkit-margin-start", + "-webkit-mask", + "-webkit-mask-box-image", + "-webkit-mask-box-image-outset", + "-webkit-mask-box-image-repeat", + "-webkit-mask-box-image-slice", + "-webkit-mask-box-image-source", + "-webkit-mask-box-image-width", + "-webkit-mask-clip", + "-webkit-mask-composite", + "-webkit-mask-image", + "-webkit-mask-origin", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "-webkit-mask-repeat", + "-webkit-mask-size", + "-webkit-mask-source-type", + "-webkit-max-logical-height", + "-webkit-max-logical-width", + "-webkit-min-logical-height", + "-webkit-min-logical-width", + "-webkit-nbsp-mode", + "-webkit-opacity", + "-webkit-order", + "-webkit-padding-after", + "-webkit-padding-before", + "-webkit-padding-end", + "-webkit-padding-start", + "-webkit-perspective", + "-webkit-perspective-origin", + "-webkit-perspective-origin-x", + "-webkit-perspective-origin-y", + "-webkit-print-color-adjust", + "-webkit-rtl-ordering", + "-webkit-ruby-position", + "-webkit-shape-image-threshold", + "-webkit-shape-margin", + "-webkit-shape-outside", + "-webkit-text-combine", + "-webkit-text-decoration", + "-webkit-text-decoration-color", + "-webkit-text-decoration-line", + "-webkit-text-decoration-skip", + "-webkit-text-decoration-style", + "-webkit-text-decorations-in-effect", + "-webkit-text-emphasis", + "-webkit-text-emphasis-color", + "-webkit-text-emphasis-position", + "-webkit-text-emphasis-style", + "-webkit-text-fill-color", + "-webkit-text-orientation", + "-webkit-text-security", + "-webkit-text-stroke", + "-webkit-text-stroke-color", + "-webkit-text-stroke-width", + "-webkit-text-underline-position", + "-webkit-text-zoom", + "-webkit-transform", + "-webkit-transform-origin", + "-webkit-transform-origin-x", + "-webkit-transform-origin-y", + "-webkit-transform-origin-z", + "-webkit-transform-style", + "-webkit-transition", + "-webkit-transition-delay", + "-webkit-transition-duration", + "-webkit-transition-property", + "-webkit-transition-timing-function", + "-webkit-user-drag", + "-webkit-user-modify", + "-webkit-user-select", + "-webkit-writing-mode", + "accent-color", + "additive-symbols", + "align-content", + "align-items", + "align-self", + "alignment-baseline", + "all", + "alt", + "animation", + "animation-composition", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "appearance", + "aspect-ratio", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "base-palette", + "baseline-shift", + "block-size", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "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-right-radius", + "border-bottom-style", + "border-bottom-width", + "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-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-start-end-radius", + "border-start-start-radius", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "buffered-rendering", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "color-adjust", + "color-interpolation", + "color-interpolation-filters", + "color-scheme", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "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", + "counter-increment", + "counter-reset", + "cursor", + "cx", + "cy", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "epub-caption-side", + "epub-hyphens", + "epub-text-combine", + "epub-text-emphasis", + "epub-text-emphasis-color", + "epub-text-emphasis-style", + "epub-text-orientation", + "epub-text-transform", + "epub-word-break", + "epub-writing-mode", + "fallback", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flood-color", + "flood-opacity", + "font", + "font-display", + "font-family", + "font-feature-settings", + "font-kerning", + "font-optical-sizing", + "font-palette", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-synthesis", + "font-synthesis-small-caps", + "font-synthesis-style", + "font-synthesis-weight", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "gap", + "glyph-orientation-horizontal", + "glyph-orientation-vertical", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "hanging-punctuation", + "height", + "hyphenate-character", + "hyphens", + "image-orientation", + "image-rendering", + "inherits", + "initial-value", + "inline-size", + "inset", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "isolation", + "justify-content", + "justify-items", + "justify-self", + "kerning", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "margin-trim", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-repeat", + "mask-size", + "mask-type", + "math-style", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "negative", + "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-wrap", + "overflow-x", + "overflow-y", + "override-colors", + "overscroll-behavior", + "overscroll-behavior-block", + "overscroll-behavior-inline", + "overscroll-behavior-x", + "overscroll-behavior-y", + "pad", + "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", + "paint-order", + "perspective", + "perspective-origin", + "perspective-origin-x", + "perspective-origin-y", + "place-content", + "place-items", + "place-self", + "pointer-events", + "position", + "prefix", + "print-color-adjust", + "quotes", + "r", + "range", + "resize", + "right", + "rotate", + "row-gap", + "rx", + "ry", + "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-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-margin", + "scroll-snap-margin-bottom", + "scroll-snap-margin-left", + "scroll-snap-margin-right", + "scroll-snap-margin-top", + "scroll-snap-stop", + "scroll-snap-type", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "shape-rendering", + "size", + "size-adjust", + "speak-as", + "src", + "stop-color", + "stop-opacity", + "stroke", + "stroke-color", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "suffix", + "supported-color-schemes", + "symbols", + "syntax", + "system", + "tab-size", + "table-layout", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip", + "text-decoration-skip-ink", + "text-decoration-style", + "text-decoration-thickness", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "text-underline-offset", + "text-underline-position", + "top", + "touch-action", + "transform", + "transform-box", + "transform-origin", + "transform-origin-x", + "transform-origin-y", + "transform-origin-z", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "translate", + "unicode-bidi", + "unicode-range", + "vector-effect", + "vertical-align", + "visibility", + "white-space", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "x", + "y", + "z-index", + "zoom", +]; + +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/samsung_internet-23.0.json +pub const KNOWN_SUMSUNG_INTERNET_PROPERTIES: [&str; 608] = [ + "-webkit-align-content", + "-webkit-align-items", + "-webkit-align-self", + "-webkit-animation", + "-webkit-animation-delay", + "-webkit-animation-direction", + "-webkit-animation-duration", + "-webkit-animation-fill-mode", + "-webkit-animation-iteration-count", + "-webkit-animation-name", + "-webkit-animation-play-state", + "-webkit-animation-timing-function", + "-webkit-app-region", + "-webkit-appearance", + "-webkit-backface-visibility", + "-webkit-background-clip", + "-webkit-background-origin", + "-webkit-background-size", + "-webkit-border-after", + "-webkit-border-after-color", + "-webkit-border-after-style", + "-webkit-border-after-width", + "-webkit-border-before", + "-webkit-border-before-color", + "-webkit-border-before-style", + "-webkit-border-before-width", + "-webkit-border-bottom-left-radius", + "-webkit-border-bottom-right-radius", + "-webkit-border-end", + "-webkit-border-end-color", + "-webkit-border-end-style", + "-webkit-border-end-width", + "-webkit-border-horizontal-spacing", + "-webkit-border-image", + "-webkit-border-radius", + "-webkit-border-start", + "-webkit-border-start-color", + "-webkit-border-start-style", + "-webkit-border-start-width", + "-webkit-border-top-left-radius", + "-webkit-border-top-right-radius", + "-webkit-border-vertical-spacing", + "-webkit-box-align", + "-webkit-box-decoration-break", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-reflect", + "-webkit-box-shadow", + "-webkit-box-sizing", + "-webkit-clip-path", + "-webkit-column-break-after", + "-webkit-column-break-before", + "-webkit-column-break-inside", + "-webkit-column-count", + "-webkit-column-gap", + "-webkit-column-rule", + "-webkit-column-rule-color", + "-webkit-column-rule-style", + "-webkit-column-rule-width", + "-webkit-column-span", + "-webkit-column-width", + "-webkit-columns", + "-webkit-filter", + "-webkit-flex", + "-webkit-flex-basis", + "-webkit-flex-direction", + "-webkit-flex-flow", + "-webkit-flex-grow", + "-webkit-flex-shrink", + "-webkit-flex-wrap", + "-webkit-font-feature-settings", + "-webkit-font-smoothing", + "-webkit-highlight", + "-webkit-hyphenate-character", + "-webkit-justify-content", + "-webkit-line-break", + "-webkit-line-clamp", + "-webkit-locale", + "-webkit-logical-height", + "-webkit-logical-width", + "-webkit-margin-after", + "-webkit-margin-before", + "-webkit-margin-end", + "-webkit-margin-start", + "-webkit-mask", + "-webkit-mask-box-image", + "-webkit-mask-box-image-outset", + "-webkit-mask-box-image-repeat", + "-webkit-mask-box-image-slice", + "-webkit-mask-box-image-source", + "-webkit-mask-box-image-width", + "-webkit-mask-clip", + "-webkit-mask-composite", + "-webkit-mask-image", + "-webkit-mask-origin", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "-webkit-mask-repeat", + "-webkit-mask-repeat-x", + "-webkit-mask-repeat-y", + "-webkit-mask-size", + "-webkit-max-logical-height", + "-webkit-max-logical-width", + "-webkit-min-logical-height", + "-webkit-min-logical-width", + "-webkit-opacity", + "-webkit-order", + "-webkit-padding-after", + "-webkit-padding-before", + "-webkit-padding-end", + "-webkit-padding-start", + "-webkit-perspective", + "-webkit-perspective-origin", + "-webkit-perspective-origin-x", + "-webkit-perspective-origin-y", + "-webkit-print-color-adjust", + "-webkit-rtl-ordering", + "-webkit-ruby-position", + "-webkit-shape-image-threshold", + "-webkit-shape-margin", + "-webkit-shape-outside", + "-webkit-tap-highlight-color", + "-webkit-text-combine", + "-webkit-text-decorations-in-effect", + "-webkit-text-emphasis", + "-webkit-text-emphasis-color", + "-webkit-text-emphasis-position", + "-webkit-text-emphasis-style", + "-webkit-text-fill-color", + "-webkit-text-orientation", + "-webkit-text-security", + "-webkit-text-size-adjust", + "-webkit-text-stroke", + "-webkit-text-stroke-color", + "-webkit-text-stroke-width", + "-webkit-transform", + "-webkit-transform-origin", + "-webkit-transform-origin-x", + "-webkit-transform-origin-y", + "-webkit-transform-origin-z", + "-webkit-transform-style", + "-webkit-transition", + "-webkit-transition-delay", + "-webkit-transition-duration", + "-webkit-transition-property", + "-webkit-transition-timing-function", + "-webkit-user-drag", + "-webkit-user-modify", + "-webkit-user-select", + "-webkit-writing-mode", + "accent-color", + "additive-symbols", + "align-content", + "align-items", + "align-self", + "alignment-baseline", + "all", + "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", + "app-region", + "appearance", + "ascent-override", + "aspect-ratio", + "backdrop-filter", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-repeat-x", + "background-repeat-y", + "background-size", + "base-palette", + "baseline-shift", + "baseline-source", + "block-size", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "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-right-radius", + "border-bottom-style", + "border-bottom-width", + "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-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-start-end-radius", + "border-start-start-radius", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "buffered-rendering", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "color-interpolation", + "color-interpolation-filters", + "color-rendering", + "color-scheme", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "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", + "counter-increment", + "counter-reset", + "counter-set", + "cursor", + "cx", + "cy", + "d", + "descent-override", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "fallback", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flood-color", + "flood-opacity", + "font", + "font-display", + "font-family", + "font-feature-settings", + "font-kerning", + "font-optical-sizing", + "font-palette", + "font-size", + "font-stretch", + "font-style", + "font-synthesis", + "font-synthesis-small-caps", + "font-synthesis-style", + "font-synthesis-weight", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variation-settings", + "font-weight", + "forced-color-adjust", + "gap", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "height", + "hyphenate-character", + "hyphenate-limit-chars", + "hyphens", + "image-orientation", + "image-rendering", + "inherits", + "initial-letter", + "initial-value", + "inline-size", + "inset", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "isolation", + "justify-content", + "justify-items", + "justify-self", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "line-gap-override", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "mask-type", + "math-depth", + "math-shift", + "math-style", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "negative", + "object-fit", + "object-position", + "object-view-box", + "offset", + "offset-distance", + "offset-path", + "offset-rotate", + "opacity", + "order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-anchor", + "overflow-clip-margin", + "overflow-wrap", + "overflow-x", + "overflow-y", + "override-colors", + "overscroll-behavior", + "overscroll-behavior-block", + "overscroll-behavior-inline", + "overscroll-behavior-x", + "overscroll-behavior-y", + "pad", + "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", + "page-orientation", + "paint-order", + "perspective", + "perspective-origin", + "place-content", + "place-items", + "place-self", + "pointer-events", + "position", + "prefix", + "quotes", + "r", + "range", + "resize", + "right", + "rotate", + "row-gap", + "ruby-position", + "rx", + "ry", + "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-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-timeline", + "scroll-timeline-axis", + "scroll-timeline-name", + "scrollbar-gutter", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "shape-rendering", + "size", + "size-adjust", + "speak", + "speak-as", + "src", + "stop-color", + "stop-opacity", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "suffix", + "symbols", + "syntax", + "system", + "tab-size", + "table-layout", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip-ink", + "text-decoration-style", + "text-decoration-thickness", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-size-adjust", + "text-transform", + "text-underline-offset", + "text-underline-position", + "text-wrap", + "top", + "touch-action", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "translate", + "unicode-bidi", + "unicode-range", + "user-select", + "vector-effect", + "vertical-align", + "view-timeline", + "view-timeline-axis", + "view-timeline-inset", + "view-timeline-name", + "view-transition-name", + "visibility", + "white-space", + "white-space-collapse", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "x", + "y", + "z-index", + "zoom", +]; + +// https://github.com/known-css/known-css-properties/blob/master/source/browsers/uc_browser-13.4.json +pub const KNOWN_US_BROWSER_PROPERTIES: [&str; 517] = [ + "-webkit-align-content", + "-webkit-align-items", + "-webkit-align-self", + "-webkit-animation", + "-webkit-animation-delay", + "-webkit-animation-direction", + "-webkit-animation-duration", + "-webkit-animation-fill-mode", + "-webkit-animation-iteration-count", + "-webkit-animation-name", + "-webkit-animation-play-state", + "-webkit-animation-timing-function", + "-webkit-app-region", + "-webkit-appearance", + "-webkit-backface-visibility", + "-webkit-background-clip", + "-webkit-background-origin", + "-webkit-background-size", + "-webkit-border-after", + "-webkit-border-after-color", + "-webkit-border-after-style", + "-webkit-border-after-width", + "-webkit-border-before", + "-webkit-border-before-color", + "-webkit-border-before-style", + "-webkit-border-before-width", + "-webkit-border-bottom-left-radius", + "-webkit-border-bottom-right-radius", + "-webkit-border-end", + "-webkit-border-end-color", + "-webkit-border-end-style", + "-webkit-border-end-width", + "-webkit-border-horizontal-spacing", + "-webkit-border-image", + "-webkit-border-radius", + "-webkit-border-start", + "-webkit-border-start-color", + "-webkit-border-start-style", + "-webkit-border-start-width", + "-webkit-border-top-left-radius", + "-webkit-border-top-right-radius", + "-webkit-border-vertical-spacing", + "-webkit-box-align", + "-webkit-box-decoration-break", + "-webkit-box-direction", + "-webkit-box-flex", + "-webkit-box-ordinal-group", + "-webkit-box-orient", + "-webkit-box-pack", + "-webkit-box-reflect", + "-webkit-box-shadow", + "-webkit-box-sizing", + "-webkit-clip-path", + "-webkit-column-break-after", + "-webkit-column-break-before", + "-webkit-column-break-inside", + "-webkit-column-count", + "-webkit-column-gap", + "-webkit-column-rule", + "-webkit-column-rule-color", + "-webkit-column-rule-style", + "-webkit-column-rule-width", + "-webkit-column-span", + "-webkit-column-width", + "-webkit-columns", + "-webkit-filter", + "-webkit-flex", + "-webkit-flex-basis", + "-webkit-flex-direction", + "-webkit-flex-flow", + "-webkit-flex-grow", + "-webkit-flex-shrink", + "-webkit-flex-wrap", + "-webkit-font-feature-settings", + "-webkit-font-size-delta", + "-webkit-font-smoothing", + "-webkit-highlight", + "-webkit-hyphenate-character", + "-webkit-justify-content", + "-webkit-line-break", + "-webkit-line-clamp", + "-webkit-locale", + "-webkit-logical-height", + "-webkit-logical-width", + "-webkit-margin-after", + "-webkit-margin-after-collapse", + "-webkit-margin-before", + "-webkit-margin-before-collapse", + "-webkit-margin-bottom-collapse", + "-webkit-margin-collapse", + "-webkit-margin-end", + "-webkit-margin-start", + "-webkit-margin-top-collapse", + "-webkit-mask", + "-webkit-mask-box-image", + "-webkit-mask-box-image-outset", + "-webkit-mask-box-image-repeat", + "-webkit-mask-box-image-slice", + "-webkit-mask-box-image-source", + "-webkit-mask-box-image-width", + "-webkit-mask-clip", + "-webkit-mask-composite", + "-webkit-mask-image", + "-webkit-mask-origin", + "-webkit-mask-position", + "-webkit-mask-position-x", + "-webkit-mask-position-y", + "-webkit-mask-repeat", + "-webkit-mask-repeat-x", + "-webkit-mask-repeat-y", + "-webkit-mask-size", + "-webkit-max-logical-height", + "-webkit-max-logical-width", + "-webkit-min-logical-height", + "-webkit-min-logical-width", + "-webkit-opacity", + "-webkit-order", + "-webkit-padding-after", + "-webkit-padding-before", + "-webkit-padding-end", + "-webkit-padding-start", + "-webkit-perspective", + "-webkit-perspective-origin", + "-webkit-perspective-origin-x", + "-webkit-perspective-origin-y", + "-webkit-print-color-adjust", + "-webkit-rtl-ordering", + "-webkit-ruby-position", + "-webkit-shape-image-threshold", + "-webkit-shape-margin", + "-webkit-shape-outside", + "-webkit-tap-highlight-color", + "-webkit-text-combine", + "-webkit-text-decorations-in-effect", + "-webkit-text-emphasis", + "-webkit-text-emphasis-color", + "-webkit-text-emphasis-position", + "-webkit-text-emphasis-style", + "-webkit-text-fill-color", + "-webkit-text-orientation", + "-webkit-text-security", + "-webkit-text-size-adjust", + "-webkit-text-stroke", + "-webkit-text-stroke-color", + "-webkit-text-stroke-width", + "-webkit-transform", + "-webkit-transform-origin", + "-webkit-transform-origin-x", + "-webkit-transform-origin-y", + "-webkit-transform-origin-z", + "-webkit-transform-style", + "-webkit-transition", + "-webkit-transition-delay", + "-webkit-transition-duration", + "-webkit-transition-property", + "-webkit-transition-timing-function", + "-webkit-user-drag", + "-webkit-user-modify", + "-webkit-user-select", + "-webkit-writing-mode", + "align-content", + "align-items", + "align-self", + "alignment-baseline", + "all", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "backdrop-filter", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-repeat-x", + "background-repeat-y", + "background-size", + "baseline-shift", + "block-size", + "border", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "buffered-rendering", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "color-interpolation", + "color-interpolation-filters", + "color-rendering", + "color-scheme", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "contain", + "content", + "counter-increment", + "counter-reset", + "cursor", + "cx", + "cy", + "d", + "direction", + "display", + "dominant-baseline", + "empty-cells", + "fill", + "fill-opacity", + "fill-rule", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flood-color", + "flood-opacity", + "font", + "font-display", + "font-family", + "font-feature-settings", + "font-kerning", + "font-size", + "font-stretch", + "font-style", + "font-variant", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variation-settings", + "font-weight", + "gap", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "height", + "hyphens", + "image-rendering", + "inline-size", + "isolation", + "justify-content", + "justify-items", + "justify-self", + "left", + "letter-spacing", + "lighting-color", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "mask", + "mask-type", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "max-zoom", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "min-zoom", + "mix-blend-mode", + "object-fit", + "object-position", + "offset", + "offset-distance", + "offset-path", + "offset-rotate", + "opacity", + "order", + "orientation", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-anchor", + "overflow-wrap", + "overflow-x", + "overflow-y", + "overscroll-behavior", + "overscroll-behavior-block", + "overscroll-behavior-inline", + "overscroll-behavior-x", + "overscroll-behavior-y", + "padding", + "padding-block-end", + "padding-block-start", + "padding-bottom", + "padding-inline-end", + "padding-inline-start", + "padding-left", + "padding-right", + "padding-top", + "page", + "page-break-after", + "page-break-before", + "page-break-inside", + "paint-order", + "perspective", + "perspective-origin", + "place-content", + "place-items", + "place-self", + "pointer-events", + "position", + "quotes", + "r", + "resize", + "right", + "row-gap", + "rx", + "ry", + "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-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", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "shape-rendering", + "size", + "speak", + "src", + "stop-color", + "stop-opacity", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "tab-size", + "table-layout", + "text-align", + "text-align-last", + "text-anchor", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip-ink", + "text-decoration-style", + "text-indent", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-size-adjust", + "text-transform", + "text-underline-position", + "top", + "touch-action", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "unicode-bidi", + "unicode-range", + "user-select", + "user-zoom", + "vector-effect", + "vertical-align", + "visibility", + "white-space", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "x", + "y", + "z-index", + "zoom", +]; + #[cfg(test)] mod tests { use std::collections::HashSet; - use super::FUNCTION_KEYWORDS; + use super::{ + FUNCTION_KEYWORDS, KNOWN_EDGE_PROPERTIES, KNOWN_EXPLORER_PROPERTIES, + KNOWN_FIREFOX_PROPERTIES, KNOWN_PROPERTIES, KNOWN_SAFARI_PROPERTIES, + KNOWN_SUMSUNG_INTERNET_PROPERTIES, KNOWN_US_BROWSER_PROPERTIES, + }; #[test] fn test_function_keywords_sorted() { @@ -876,4 +4981,53 @@ mod tests { let has_duplicates = FUNCTION_KEYWORDS.iter().any(|&x| !set.insert(x)); assert!(!has_duplicates); } + + #[test] + fn test_known_properties_order() { + for items in KNOWN_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } + + #[test] + fn test_kown_edge_properties_order() { + for items in KNOWN_EDGE_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } + + #[test] + fn test_kown_explorer_properties_order() { + for items in KNOWN_EXPLORER_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } + + #[test] + fn test_kown_firefox_properties_order() { + for items in KNOWN_FIREFOX_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } + + #[test] + fn test_kown_safari_properties_order() { + for items in KNOWN_SAFARI_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } + + #[test] + fn test_kown_sumsung_internet_properties_order() { + for items in KNOWN_SUMSUNG_INTERNET_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } + + #[test] + fn test_kown_us_browser_properties_order() { + for items in KNOWN_US_BROWSER_PROPERTIES.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } } diff --git a/crates/biome_css_analyze/src/lint/nursery.rs b/crates/biome_css_analyze/src/lint/nursery.rs index d58af8788cca..c7ddaee16c99 100644 --- a/crates/biome_css_analyze/src/lint/nursery.rs +++ b/crates/biome_css_analyze/src/lint/nursery.rs @@ -9,6 +9,7 @@ pub mod no_duplicate_font_names; pub mod no_duplicate_selectors_keyframe_block; pub mod no_important_in_keyframe; pub mod no_unknown_function; +pub mod no_unknown_property; pub mod no_unknown_selector_pseudo_element; pub mod no_unknown_unit; pub mod no_unmatchable_anb_selector; @@ -25,6 +26,7 @@ declare_group! { self :: no_duplicate_selectors_keyframe_block :: NoDuplicateSelectorsKeyframeBlock , self :: no_important_in_keyframe :: NoImportantInKeyframe , self :: no_unknown_function :: NoUnknownFunction , + self :: no_unknown_property :: NoUnknownProperty , self :: no_unknown_selector_pseudo_element :: NoUnknownSelectorPseudoElement , self :: no_unknown_unit :: NoUnknownUnit , self :: no_unmatchable_anb_selector :: NoUnmatchableAnbSelector , diff --git a/crates/biome_css_analyze/src/lint/nursery/no_unknown_property.rs b/crates/biome_css_analyze/src/lint/nursery/no_unknown_property.rs new file mode 100644 index 000000000000..118a73d38905 --- /dev/null +++ b/crates/biome_css_analyze/src/lint/nursery/no_unknown_property.rs @@ -0,0 +1,95 @@ +use biome_analyze::{context::RuleContext, declare_rule, Ast, Rule, RuleDiagnostic}; +use biome_console::markup; +use biome_css_syntax::CssGenericProperty; +use biome_rowan::{AstNode, TextRange}; + +use crate::utils::{is_known_properties, vendor_prefixed}; + +declare_rule! { + /// Disallow unknown properties. + /// + /// This rule considers properties defined in the CSS Specifications and browser specific properties to be known. + /// https://github.com/known-css/known-css-properties#source + /// + /// + /// This rule ignores: + /// + /// - custom variables e.g. `--custom-property` + /// - vendor-prefixed properties (e.g., `-moz-align-self,` `-webkit-align-self`) + /// + /// ## Examples + /// + /// ### Invalid + /// + /// ```css,expect_diagnostic + /// a { + /// colr: blue; + /// } + /// ``` + /// + /// ```css,expect_diagnostic + /// a { + /// my-property: 1; + /// } + /// ``` + /// + /// ### Valid + /// + /// ```css + /// a { + /// color: green; + /// } + /// ``` + /// + /// ```css + /// a { + /// fill: black; + /// } + /// ``` + /// + /// ```css + /// a { + /// -moz-align-self: center; + /// } + /// ``` + /// + pub NoUnknownProperty { + version: "next", + name: "noUnknownProperty", + recommended: false, + } +} + +impl Rule for NoUnknownProperty { + type Query = Ast; + type State = TextRange; + type Signals = Option; + type Options = (); + + fn run(ctx: &RuleContext) -> Option { + let node = ctx.query(); + let property_name = node.name().ok()?.text().to_lowercase(); + if !is_known_properties(&property_name) && !vendor_prefixed(&property_name) { + return Some(node.name().ok()?.range()); + } + None + } + + fn diagnostic(_: &RuleContext, range: &Self::State) -> Option { + Some( + RuleDiagnostic::new( + rule_category!(), + range, + markup! { + "Unknown property is not allowed." + }, + ) + .note(markup! { + "See ""CSS Specifications and browser specific properties"" for more details." + }) + .note(markup! { + "To resolve this issue, replace the unknown property with a valid CSS property." + }) + ) + } +} diff --git a/crates/biome_css_analyze/src/options.rs b/crates/biome_css_analyze/src/options.rs index a8902cadb16a..1f9b8d11202a 100644 --- a/crates/biome_css_analyze/src/options.rs +++ b/crates/biome_css_analyze/src/options.rs @@ -13,6 +13,8 @@ pub type NoDuplicateSelectorsKeyframeBlock = < lint :: nursery :: no_duplicate_s pub type NoImportantInKeyframe = < lint :: nursery :: no_important_in_keyframe :: NoImportantInKeyframe as biome_analyze :: Rule > :: Options ; pub type NoUnknownFunction = ::Options; +pub type NoUnknownProperty = + ::Options; pub type NoUnknownSelectorPseudoElement = < lint :: nursery :: no_unknown_selector_pseudo_element :: NoUnknownSelectorPseudoElement as biome_analyze :: Rule > :: Options ; pub type NoUnknownUnit = ::Options; diff --git a/crates/biome_css_analyze/src/utils.rs b/crates/biome_css_analyze/src/utils.rs index ce6063ff6109..9725176f44a2 100644 --- a/crates/biome_css_analyze/src/utils.rs +++ b/crates/biome_css_analyze/src/utils.rs @@ -1,9 +1,12 @@ use crate::keywords::{ BASIC_KEYWORDS, FONT_FAMILY_KEYWORDS, FONT_SIZE_KEYWORDS, FONT_STRETCH_KEYWORDS, FONT_STYLE_KEYWORDS, FONT_VARIANTS_KEYWORDS, FONT_WEIGHT_ABSOLUTE_KEYWORDS, - FONT_WEIGHT_NUMERIC_KEYWORDS, FUNCTION_KEYWORDS, LEVEL_ONE_AND_TWO_PSEUDO_ELEMENTS, - LINE_HEIGHT_KEYWORDS, OTHER_PSEUDO_ELEMENTS, SHADOW_TREE_PSEUDO_ELEMENTS, - SYSTEM_FAMILY_NAME_KEYWORDS, VENDER_PREFIXES, VENDOR_SPECIFIC_PSEUDO_ELEMENTS, + FONT_WEIGHT_NUMERIC_KEYWORDS, FUNCTION_KEYWORDS, KNOWN_CHROME_PROPERTIES, + KNOWN_EDGE_PROPERTIES, KNOWN_EXPLORER_PROPERTIES, KNOWN_FIREFOX_PROPERTIES, KNOWN_PROPERTIES, + KNOWN_SAFARI_PROPERTIES, KNOWN_SUMSUNG_INTERNET_PROPERTIES, KNOWN_US_BROWSER_PROPERTIES, + LEVEL_ONE_AND_TWO_PSEUDO_ELEMENTS, LINE_HEIGHT_KEYWORDS, OTHER_PSEUDO_ELEMENTS, + SHADOW_TREE_PSEUDO_ELEMENTS, SYSTEM_FAMILY_NAME_KEYWORDS, VENDER_PREFIXES, + VENDOR_SPECIFIC_PSEUDO_ELEMENTS, }; use biome_css_syntax::{AnyCssGenericComponentValue, AnyCssValue, CssGenericComponentValueList}; use biome_rowan::{AstNode, SyntaxNodeCast}; @@ -127,3 +130,23 @@ pub fn is_pseudo_elements(prop: &str) -> bool { || SHADOW_TREE_PSEUDO_ELEMENTS.contains(&prop) || OTHER_PSEUDO_ELEMENTS.contains(&prop) } + +pub fn is_known_properties(prop: &str) -> bool { + KNOWN_PROPERTIES.binary_search(&prop).is_ok() + || KNOWN_CHROME_PROPERTIES.binary_search(&prop).is_ok() + || KNOWN_EDGE_PROPERTIES.binary_search(&prop).is_ok() + || KNOWN_EXPLORER_PROPERTIES.binary_search(&prop).is_ok() + || KNOWN_FIREFOX_PROPERTIES.binary_search(&prop).is_ok() + || KNOWN_SAFARI_PROPERTIES.binary_search(&prop).is_ok() + || KNOWN_SUMSUNG_INTERNET_PROPERTIES + .binary_search(&prop) + .is_ok() + || KNOWN_US_BROWSER_PROPERTIES.binary_search(&prop).is_ok() +} + +pub fn vendor_prefixed(props: &str) -> bool { + props.starts_with("-webkit-") + || props.starts_with("-moz-") + || props.starts_with("-ms-") + || props.starts_with("-o-") +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css new file mode 100644 index 000000000000..969a15b6e8ed --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css @@ -0,0 +1,7 @@ +a { + colr: blue; +} + +a { + my-property: 1; +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css.snap b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css.snap new file mode 100644 index 000000000000..0632c594ef64 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/invalid.css.snap @@ -0,0 +1,52 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: invalid.css +--- +# Input +```css +a { + colr: blue; +} + +a { + my-property: 1; +} + +``` + +# Diagnostics +``` +invalid.css:2:3 lint/nursery/noUnknownProperty ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ! Unknown property is not allowed + + 1 │ a { + > 2 │ colr: blue; + │ ^^^^ + 3 │ } + 4 │ + + i See CSS Specifications and browser specific properties for more details. + + i To resolve this issue, replace the unknown property with a valid CSS property + + +``` + +``` +invalid.css:6:3 lint/nursery/noUnknownProperty ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ! Unknown property is not allowed + + 5 │ a { + > 6 │ my-property: 1; + │ ^^^^^^^^^^^ + 7 │ } + 8 │ + + i See CSS Specifications and browser specific properties for more details. + + i To resolve this issue, replace the unknown property with a valid CSS property + + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css new file mode 100644 index 000000000000..43341a0d14af --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css @@ -0,0 +1,44 @@ +/* General properties */ +a { + color: green; +} + +a { + fill: black; +} + +/* Firefox-specific property */ +a { + -moz-align-self: center; +} + +/* WebKit (Safari, Chrome, etc.) specific property */ +a { + -webkit-align-self: center; +} + +/* Standard property */ +a { + align-self: center; +} + +/* Additional examples of browser-specific properties */ +/* Internet Explorer specific property */ +a { + -ms-flex-align: center; +} + +/* Opera specific property */ +a { + -o-link: #FF0000; +} + +/* Microsoft Edge specific property */ +a { + -ms-scroll-limit: 5px 5px 0px 0px; +} + +/* Chrome/Safari specific property */ +a { + -webkit-mask-image: url(mask.png); +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css.snap b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css.snap new file mode 100644 index 000000000000..9e062796a435 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/noUnknownProperty/valid.css.snap @@ -0,0 +1,52 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: valid.css +--- +# Input +```css +/* General properties */ +a { + color: green; +} + +a { + fill: black; +} + +/* Firefox-specific property */ +a { + -moz-align-self: center; +} + +/* WebKit (Safari, Chrome, etc.) specific property */ +a { + -webkit-align-self: center; +} + +/* Standard property */ +a { + align-self: center; +} + +/* Additional examples of browser-specific properties */ +/* Internet Explorer specific property */ +a { + -ms-flex-align: center; +} + +/* Opera specific property */ +a { + -o-link: #FF0000; +} + +/* Microsoft Edge specific property */ +a { + -ms-scroll-limit: 5px 5px 0px 0px; +} + +/* Chrome/Safari specific property */ +a { + -webkit-mask-image: url(mask.png); +} + +``` diff --git a/crates/biome_diagnostics_categories/src/categories.rs b/crates/biome_diagnostics_categories/src/categories.rs index 8365a2459baa..dde6b9d1e7ef 100644 --- a/crates/biome_diagnostics_categories/src/categories.rs +++ b/crates/biome_diagnostics_categories/src/categories.rs @@ -131,6 +131,7 @@ define_categories! { "lint/nursery/noTypeOnlyImportAttributes": "https://biomejs.dev/linter/rules/no-type-only-import-attributes", "lint/nursery/noUndeclaredDependencies": "https://biomejs.dev/linter/rules/no-undeclared-dependencies", "lint/nursery/noUnknownFunction": "https://biomejs.dev/linter/rules/no-unknown-function", + "lint/nursery/noUnknownProperty": "https://biomejs.dev/linter/rules/no-unknown-property", "lint/nursery/noUnknownSelectorPseudoElement": "https://biomejs.dev/linter/rules/no-unknown-selector-pseudo-element", "lint/nursery/noUnknownUnit": "https://biomejs.dev/linter/rules/no-unknown-unit", "lint/nursery/noUnmatchableAnbSelector": "https://biomejs.dev/linter/rules/no-unmatchable-anb-selector", @@ -138,9 +139,9 @@ define_categories! { "lint/nursery/noUselessUndefinedInitialization": "https://biomejs.dev/linter/rules/no-useless-undefined-initialization", "lint/nursery/useArrayLiterals": "https://biomejs.dev/linter/rules/use-array-literals", "lint/nursery/useBiomeSuppressionComment": "https://biomejs.dev/linter/rules/use-biome-suppression-comment", - "lint/nursery/useExplicitLengthCheck": "https://biomejs.dev/linter/rules/use-explicit-length-check", "lint/nursery/useConsistentBuiltinInstantiation": "https://biomejs.dev/linter/rules/use-consistent-new-builtin", "lint/nursery/useDefaultSwitchClause": "https://biomejs.dev/linter/rules/use-default-switch-clause", + "lint/nursery/useExplicitLengthCheck": "https://biomejs.dev/linter/rules/use-explicit-length-check", "lint/nursery/useGenericFontNames": "https://biomejs.dev/linter/rules/use-generic-font-names", "lint/nursery/useImportRestrictions": "https://biomejs.dev/linter/rules/use-import-restrictions", "lint/nursery/useSortedClasses": "https://biomejs.dev/linter/rules/use-sorted-classes", diff --git a/packages/@biomejs/backend-jsonrpc/src/workspace.ts b/packages/@biomejs/backend-jsonrpc/src/workspace.ts index 8ce0f44466e3..aca32b917a2b 100644 --- a/packages/@biomejs/backend-jsonrpc/src/workspace.ts +++ b/packages/@biomejs/backend-jsonrpc/src/workspace.ts @@ -984,6 +984,10 @@ export interface Nursery { * Disallow unknown CSS value functions. */ noUnknownFunction?: RuleConfiguration_for_Null; + /** + * Disallow unknown properties. + */ + noUnknownProperty?: RuleConfiguration_for_Null; /** * Disallow unknown pseudo-element selectors. */ @@ -2022,6 +2026,7 @@ export type Category = | "lint/nursery/noTypeOnlyImportAttributes" | "lint/nursery/noUndeclaredDependencies" | "lint/nursery/noUnknownFunction" + | "lint/nursery/noUnknownProperty" | "lint/nursery/noUnknownSelectorPseudoElement" | "lint/nursery/noUnknownUnit" | "lint/nursery/noUnmatchableAnbSelector" @@ -2029,9 +2034,9 @@ export type Category = | "lint/nursery/noUselessUndefinedInitialization" | "lint/nursery/useArrayLiterals" | "lint/nursery/useBiomeSuppressionComment" - | "lint/nursery/useExplicitLengthCheck" | "lint/nursery/useConsistentBuiltinInstantiation" | "lint/nursery/useDefaultSwitchClause" + | "lint/nursery/useExplicitLengthCheck" | "lint/nursery/useGenericFontNames" | "lint/nursery/useImportRestrictions" | "lint/nursery/useSortedClasses" diff --git a/packages/@biomejs/biome/configuration_schema.json b/packages/@biomejs/biome/configuration_schema.json index d8a0fd383d49..10f94705c2fb 100644 --- a/packages/@biomejs/biome/configuration_schema.json +++ b/packages/@biomejs/biome/configuration_schema.json @@ -1566,6 +1566,13 @@ { "type": "null" } ] }, + "noUnknownProperty": { + "description": "Disallow unknown properties.", + "anyOf": [ + { "$ref": "#/definitions/RuleConfiguration" }, + { "type": "null" } + ] + }, "noUnknownSelectorPseudoElement": { "description": "Disallow unknown pseudo-element selectors.", "anyOf": [