diff --git a/.changeset/add-use-baseline-css-rule.md b/.changeset/add-use-baseline-css-rule.md new file mode 100644 index 000000000000..0c1f42d1b01e --- /dev/null +++ b/.changeset/add-use-baseline-css-rule.md @@ -0,0 +1,11 @@ +--- +"@biomejs/biome": patch +--- + +Added new nursery lint rule `useBaseline` for CSS. The rule reports when CSS properties, property values, at-rules, media conditions, functions, or pseudo-selectors are not part of the configured [Baseline](https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility) tier. + +For example, *at the time of writing*, the rule will trigger for the use of `accent-color` because it has limited availability: + +```css +a { accent-color: bar; } +``` diff --git a/Cargo.lock b/Cargo.lock index c77f87ffcaf6..095411920039 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -341,6 +341,7 @@ dependencies = [ "filetime", "insta", "mimalloc", + "phf 0.13.1", "regex", "rustc-hash 2.1.1", "schemars", diff --git a/crates/biome_analyze/src/rule.rs b/crates/biome_analyze/src/rule.rs index a7330dc91495..996bb17b5555 100644 --- a/crates/biome_analyze/src/rule.rs +++ b/crates/biome_analyze/src/rule.rs @@ -186,6 +186,8 @@ pub enum RuleSource<'a> { EslintMarkdown(&'a str), /// Rules from [Eslint Plugin Yml](https://ota-meshi.github.io/eslint-plugin-yml/) EslintYml(&'a str), + /// Rules from [Eslint CSS](https://github.com/eslint/css) + EslintCss(&'a str), } impl<'a> std::fmt::Display for RuleSource<'a> { @@ -239,6 +241,7 @@ impl<'a> std::fmt::Display for RuleSource<'a> { Self::EslintJson(_) => write!(f, "@eslint/json"), Self::EslintMarkdown(_) => write!(f, "@eslint/markdown"), Self::EslintYml(_) => write!(f, "eslint-plugin-yml"), + Self::EslintCss(_) => write!(f, "@eslint/css"), } } } @@ -303,6 +306,7 @@ impl<'a> RuleSource<'a> { Self::EslintJson(_) => 41, Self::EslintMarkdown(_) => 42, Self::EslintYml(_) => 43, + Self::EslintCss(_) => 44, } } @@ -362,6 +366,7 @@ impl<'a> RuleSource<'a> { | Self::Stylelint(rule_name) | Self::EslintTurbo(rule_name) | Self::HtmlEslint(rule_name) + | Self::EslintCss(rule_name) | Self::EslintPlaywright(rule_name) | Self::EslintJson(rule_name) | Self::EslintMarkdown(rule_name) @@ -415,6 +420,7 @@ impl<'a> RuleSource<'a> { Self::EslintJson(_) => "json", Self::EslintMarkdown(_) => "markdown", Self::EslintYml(_) => "yml", + Self::EslintCss(_) => "css", } } @@ -472,6 +478,7 @@ impl<'a> RuleSource<'a> { Self::EslintJson(rule_name) => format!("https://github.com/eslint/json/blob/main/docs/rules/{rule_name}.md"), Self::EslintMarkdown(rule_name) => format!("https://github.com/eslint/markdown/blob/main/docs/rules/{rule_name}.md"), Self::EslintYml(rule_name) => format!("https://ota-meshi.github.io/eslint-plugin-yml/rules/{rule_name}.html"), + Self::EslintCss(rule_name) => format!("https://github.com/eslint/css/blob/main/docs/rules/{rule_name}.md"), } } diff --git a/crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rs b/crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rs index 7d2d43723a3d..891353603f4a 100644 --- a/crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rs +++ b/crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rs @@ -1145,6 +1145,22 @@ pub(crate) fn migrate_eslint_any_rule( .get_or_insert(Default::default()); rule.set_level(rule.level().max(rule_severity.into())); } + "css/use-baseline" => { + if !options.include_inspired { + results.add(eslint_name, eslint_to_biome::RuleMigrationResult::Inspired); + return false; + } + if !options.include_nursery { + results.add(eslint_name, eslint_to_biome::RuleMigrationResult::Nursery); + return false; + } + let group = rules.nursery.get_or_insert_with(Default::default); + let rule = group + .unwrap_group_as_mut() + .use_baseline + .get_or_insert(Default::default()); + rule.set_level(rule.level().max(rule_severity.into())); + } "curly" => { let group = rules.style.get_or_insert_with(Default::default); let rule = group diff --git a/crates/biome_configuration/src/analyzer/linter/rules.rs b/crates/biome_configuration/src/analyzer/linter/rules.rs index 8a4030983bed..73bf935c3d19 100644 --- a/crates/biome_configuration/src/analyzer/linter/rules.rs +++ b/crates/biome_configuration/src/analyzer/linter/rules.rs @@ -397,6 +397,7 @@ pub enum RuleName { UseAtIndex, UseAwait, UseAwaitThenable, + UseBaseline, UseBiomeIgnoreFolder, UseBlockStatements, UseButtonType, @@ -862,6 +863,7 @@ impl RuleName { Self::UseAtIndex => "useAtIndex", Self::UseAwait => "useAwait", Self::UseAwaitThenable => "useAwaitThenable", + Self::UseBaseline => "useBaseline", Self::UseBiomeIgnoreFolder => "useBiomeIgnoreFolder", Self::UseBlockStatements => "useBlockStatements", Self::UseButtonType => "useButtonType", @@ -1323,6 +1325,7 @@ impl RuleName { Self::UseAtIndex => RuleGroup::Style, Self::UseAwait => RuleGroup::Suspicious, Self::UseAwaitThenable => RuleGroup::Nursery, + Self::UseBaseline => RuleGroup::Nursery, Self::UseBiomeIgnoreFolder => RuleGroup::Suspicious, Self::UseBlockStatements => RuleGroup::Style, Self::UseButtonType => RuleGroup::A11y, @@ -1793,6 +1796,7 @@ impl std::str::FromStr for RuleName { "useAtIndex" => Ok(Self::UseAtIndex), "useAwait" => Ok(Self::UseAwait), "useAwaitThenable" => Ok(Self::UseAwaitThenable), + "useBaseline" => Ok(Self::UseBaseline), "useBiomeIgnoreFolder" => Ok(Self::UseBiomeIgnoreFolder), "useBlockStatements" => Ok(Self::UseBlockStatements), "useButtonType" => Ok(Self::UseButtonType), diff --git a/crates/biome_css_analyze/Cargo.toml b/crates/biome_css_analyze/Cargo.toml index 9fa2d211ce5c..c2d43d6f4124 100644 --- a/crates/biome_css_analyze/Cargo.toml +++ b/crates/biome_css_analyze/Cargo.toml @@ -32,6 +32,7 @@ biome_rule_options = { workspace = true } biome_string_case = { workspace = true } biome_suppression = { workspace = true } camino = { workspace = true } +phf = { workspace = true } regex = { workspace = true } rustc-hash = { workspace = true } schemars = { workspace = true, optional = true } diff --git a/crates/biome_css_analyze/src/baseline_data.rs b/crates/biome_css_analyze/src/baseline_data.rs new file mode 100644 index 000000000000..51549c3cfe18 --- /dev/null +++ b/crates/biome_css_analyze/src/baseline_data.rs @@ -0,0 +1,8806 @@ +//! This is a generated file. Don't modify it by hand! Run 'baseline' to re-generate the file. + +#[doc = r" The Baseline availability tier of a CSS feature."] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BaselineTier { + #[doc = r" Not yet supported in all core browsers."] + Limited, + #[doc = r" Supported in all core browsers for less than 30 months."] + Newly, + #[doc = r" Supported in all core browsers for at least 30 months."] + Widely, +} +#[doc = r" The year a CSS feature became Baseline newly-available."] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BaselineYear { + #[doc = r" The year the feature became newly available."] + Known(u16), + #[doc = r" No date is recorded for when this feature became available."] + Unknown, +} +#[doc = r" The combined Baseline status of a CSS feature."] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BaselineStatus { + pub tier: BaselineTier, + + pub year: BaselineYear, +} +#[doc = r" Look up the Baseline status of a feature by name."] +pub fn find_baseline( + table: &phf::Map<&'static str, BaselineStatus>, + name: &str, +) -> Option { + table.get(name).copied() +} +#[doc = r" Look up the Baseline status of a specific CSS property value."] +#[doc = " The key format is `\"property:value\"` (lowercase)."] +pub fn find_property_value_baseline(property: &str, value: &str) -> Option { + let key = format!("{property}:{value}"); + BASELINE_PROPERTY_VALUES.get(key.as_str()).copied() +} +#[doc = r" Baseline status for CSS properties."] +pub static BASELINE_PROPERTIES: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + "-webkit-text-fill-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "-webkit-text-stroke" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "-webkit-text-stroke-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "-webkit-text-stroke-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "accent-color" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "align-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "align-items" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "align-self" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "alignment-baseline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "anchor-name" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "anchor-scope" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-composition" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "animation-delay" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-direction" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-duration" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-fill-mode" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-iteration-count" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-name" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-play-state" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-range" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-range-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-range-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-timeline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-timing-function" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "appearance" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "aspect-ratio" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "backdrop-filter" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "backface-visibility" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "background" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-attachment" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-blend-mode" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "background-clip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-image" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-origin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position-x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position-y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "baseline-shift" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "baseline-source" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "block-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-end-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-end-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-end-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-start-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-start-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-start-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-block-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-left-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-right-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-collapse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-end-end-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-end-start-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-image" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-slice" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-source" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-end-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-end-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-end-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-start-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-start-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-start-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-inline-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-spacing" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-start-end-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-start-start-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-left-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-right-radius" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "box-decoration-break" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "box-shadow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "box-sizing" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "break-after" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-inside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "caption-side" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "caret-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "caret-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "clear" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "clip" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "clip-path" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "clip-rule" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-adjust" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "color-interpolation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color-interpolation-filters" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-scheme" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "column-count" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-fill" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-gap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-span" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "column-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "columns" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain-intrinsic-block-size" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-height" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-inline-size" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-size" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-width" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "container" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "container-name" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "container-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content-visibility" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "corner-block-end-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-block-start-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-bottom-left-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-bottom-right-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-bottom-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-end-end-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-end-start-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-inline-end-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-inline-start-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-left-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-right-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-start-end-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-start-start-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-top-left-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-top-right-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "corner-top-shape" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "counter-increment" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counter-reset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counter-set" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "custom-property" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "cx" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "cy" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "direction" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "display" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "dominant-baseline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "empty-cells" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "field-sizing" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "fill" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "fill-opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "fill-rule" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "filter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "flex" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-basis" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-direction" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-flow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-grow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-shrink" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-wrap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "float" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flood-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flood-opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-feature-settings" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "font-kerning" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-language-override" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-optical-sizing" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-palette" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-size-adjust" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "font-stretch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-synthesis" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-synthesis-position" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-synthesis-small-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-weight" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-variant-alternates" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-emoji" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-position" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variation-settings" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "font-weight" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-width" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "forced-color-adjust" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "gap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "glyph-orientation-vertical" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "grid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-area" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-auto-columns" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-auto-flow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-auto-rows" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-column" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-column-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-column-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-row" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-row-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-row-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-areas" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "hanging-punctuation" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "height" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "hyphenate-character" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "hyphenate-limit-chars" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hyphens" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "image-orientation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "image-rendering" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "ime-mode" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "initial-letter" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inline-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-block-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-block-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "interactivity" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "interpolate-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "isolation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "justify-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-items" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-self" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "letter-spacing" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "lighting-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "line-break" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "line-clamp" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "line-height" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-image" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "margin-block-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "margin-block-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "margin-bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "margin-inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "margin-inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "margin-left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-trim" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "marker" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "marker-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "marker-mid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "marker-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "mask" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-border" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mask-border-outset" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mask-border-repeat" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mask-border-slice" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mask-border-source" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mask-border-width" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mask-clip" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-composite" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-image" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-mode" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-position" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-repeat" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-size" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "math-depth" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "math-shift" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "math-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "max-block-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-height" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "max-inline-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "min-block-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-height" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "min-inline-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "mix-blend-mode" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-fit" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-view-box" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "offset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-anchor" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-distance" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-rotate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "order" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "orphans" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "outline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-offset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "overflow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "overflow-clip-margin" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "overflow-wrap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "overflow-x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overlay" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overscroll-behavior" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "padding" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "padding-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "padding-block-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "padding-block-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "padding-bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "padding-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "padding-inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "padding-inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "padding-left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "padding-right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "padding-top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "page" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "page-break-after" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-before" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-inside" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "paint-order" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "perspective" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "perspective-origin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "place-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "place-items" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "place-self" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "pointer-events" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "position-anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-order" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-visibility" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "print-color-adjust" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "quotes" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "r" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "reading-flow" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-order" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "resize" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "rotate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "row-gap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "ruby-align" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-overhang" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "ruby-position" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "rx" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "ry" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scale" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scroll-behavior" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scroll-initial-target" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-margin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-block-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-block-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-margin-top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-marker-group" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-padding" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-block-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-block-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-align" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-stop" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-target-group" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline-axis" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline-name" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scrollbar-color" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "scrollbar-gutter" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scrollbar-width" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "shape-image-threshold" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-margin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-rendering" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "speak" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "speak-as" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "stop-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stop-opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-dasharray" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-dashoffset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linecap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linejoin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-miterlimit" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "tab-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "table-layout" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align-last" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-anchor" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-autospace" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-edge" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-trim" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-combine-upright" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-decoration" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-line" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip-ink" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-thickness" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-emphasis" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-indent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-justify" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-orientation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-overflow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-rendering" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-shadow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-size-adjust" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-spacing-trim" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-transform" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-underline-offset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-wrap" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-mode" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-style" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "timeline-scope" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "touch-action" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "transform" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transform-origin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "transition" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-behavior" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transition-delay" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-duration" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-property" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "translate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "unicode-bidi" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "user-select" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "vector-effect" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "vertical-align" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "view-timeline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-axis" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-inset" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-name" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-transition-class" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-name" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "visibility" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space-collapse" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "widows" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "will-change" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "word-break" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "word-spacing" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "writing-mode" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "z-index" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "zoom" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, +}; +#[doc = r" Baseline status for CSS property values (identifier keywords only). Key format: property:value."] +pub static BASELINE_PROPERTY_VALUES: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + "accent-color:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "align-content:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "align-items:anchor-center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "align-self:anchor-center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "align-self:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "align-self:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "align-self:stretch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "alignment-baseline:alphabetic" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:baseline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:central" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:ideographic" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:mathematical" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:middle" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:text-after-edge" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "alignment-baseline:text-before-edge" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "anchor-name:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "anchor-scope:all" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "anchor-scope:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation:alternate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:alternate-reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:backwards" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:both" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:ease" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:ease-in" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:ease-in-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:ease-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:forwards" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:infinite" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:linear" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:step-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation:step-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-direction:alternate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-direction:alternate-reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-direction:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-direction:reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-duration:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-fill-mode:backwards" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-fill-mode:both" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-fill-mode:forwards" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-fill-mode:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-iteration-count:infinite" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-name:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-play-state:paused" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-play-state:running" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-range-end:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-range-start:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-timeline:scroll" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-timeline:view" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "animation-timing-function:ease" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:ease-in" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:ease-in-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:ease-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:jump" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:linear" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:step-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "animation-timing-function:step-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "appearance:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:base-select" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "appearance:button" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:checkbox" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:listbox" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:menulist" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:menulist-button" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:meter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:progress-bar" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:radio" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:searchfield" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:textarea" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "appearance:textfield" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "aspect-ratio:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "background:background-clip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:background-origin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:background-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:local" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:no-repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:repeat-x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:repeat-y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:round" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:scroll" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:space" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-attachment:fixed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-attachment:local" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-attachment:scroll" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-clip:border-area" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-clip:border-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-clip:content-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-clip:padding-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-clip:text" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-image:element" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "background-image:gradients" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-image:image-set" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "background-image:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-origin:border-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-origin:content-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-origin:padding-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-position:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-repeat:2-value" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-repeat:no-repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-repeat:repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-repeat:repeat-x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-repeat:repeat-y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-repeat:round" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-repeat:space" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "background-size:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-size:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "background-size:cover" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "baseline-shift:baseline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "baseline-shift:sub" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "baseline-shift:super" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "baseline-source:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "baseline-source:first" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "baseline-source:last" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "block-size:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "block-size:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "block-size:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "block-size:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "border:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-left-radius:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-right-radius:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-bottom-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-collapse:collapse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-collapse:separate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-image:fill" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image:gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image:repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image:round" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image:space" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image:stretch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-repeat:repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-repeat:round" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-repeat:space" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-repeat:stretch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-image-width:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "border-left:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-left-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-radius:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-right-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-left-radius:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-right-radius:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-top-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "border-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "bottom:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "bottom:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "bottom:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "box-decoration-break:clone" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "box-decoration-break:slice" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "box-shadow:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "box-shadow:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "box-sizing:border-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "box-sizing:content-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "break-after:always" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:avoid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:avoid-column" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "break-after:avoid-page" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:column" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "break-after:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:page" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:recto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-after:verso" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:always" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:avoid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:avoid-column" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "break-before:avoid-page" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:column" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "break-before:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:page" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:recto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-before:verso" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-inside:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-inside:avoid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "break-inside:avoid-column" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "break-inside:avoid-page" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "caption-side:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "caption-side:bottom-outside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "caption-side:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "caption-side:top-outside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "caret-shape:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "caret-shape:bar" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "caret-shape:block" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "caret-shape:underscore" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "clear:both" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "clear:inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "clear:inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "clear:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "clear:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "clear:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "clip:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "clip-path:fill-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "clip-path:path" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "clip-path:stroke-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "clip-path:view-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "clip-rule:evenodd" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "clip-rule:nonzero" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-interpolation:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color-interpolation:linearGradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color-interpolation:sRGB" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color-interpolation-filters:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-interpolation-filters:linearRGB" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-interpolation-filters:sRGB" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-scheme:dark" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "color-scheme:light" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "color-scheme:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "color-scheme:only" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "column-count:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-fill:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-fill:balance" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-gap:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-rule-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "column-span:all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "column-span:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "column-width:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "contain:content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:inline-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:layout" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:paint" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:strict" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain:style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "contain-intrinsic-block-size:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-height:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-inline-size:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-size:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "contain-intrinsic-width:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "container-name:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "container-type:anchored" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "container-type:inline-size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "container-type:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "container-type:scroll-state" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "container-type:size" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "content:close-quote" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:image-set" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "content:no-close-quote" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:no-open-quote" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:open-quote" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content:url" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "content-visibility:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "content-visibility:hidden" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "content-visibility:visible" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "counter-increment:list-item" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counter-increment:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counter-reset:list-item" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counter-reset:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counter-reset:reversed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "counter-set:list-item" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "counter-set:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "direction:ltr" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "direction:rtl" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "display:block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:contents" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display:flex" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:flow-root" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "display:grid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:inline-block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:inline-flex" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:inline-grid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:inline-table" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:list-item" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:math" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "display:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "display:ruby" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display:ruby-base" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display:ruby-base-container" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display:ruby-text" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display:ruby-text-container" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display:table" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-caption" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-cell" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-column" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-column-group" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-footer-group" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-header-group" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-row" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "display:table-row-group" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "dominant-baseline:alphabetic" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "dominant-baseline:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "dominant-baseline:central" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "dominant-baseline:hanging" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "dominant-baseline:ideographic" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "dominant-baseline:mathematical" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "dominant-baseline:middle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "empty-cells:hide" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "empty-cells:show" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "field-sizing:content" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "field-sizing:fixed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "fill:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "fill-rule:evenodd" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "fill-rule:nonzero" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "filter:blur" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:brightness" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:contrast" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:drop-shadow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:grayscale" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:hue-rotate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:invert" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:saturate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "filter:sepia" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "flex:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-basis:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-basis:content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-basis:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-basis:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-basis:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-direction:column" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-direction:column-reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-direction:row" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-direction:row-reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-wrap:nowrap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-wrap:wrap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flex-wrap:wrap-reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "float:inline-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "float:inline-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "float:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "float:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "float:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flood-color:currentColor" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "flood-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font:caption" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font:icon" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font:menu" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font:message-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font:small-caption" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font:status-bar" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:cursive" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:fangsong" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:fantasy" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:kai" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:khmer-mul" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:math" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "font-family:monospace" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:nastaliq" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:sans-serif" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:serif" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-family:system-ui" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "font-family:ui-monospace" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-family:ui-rounded" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-family:ui-sans-serif" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-family:ui-serif" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-feature-settings:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "font-kerning:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-kerning:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-kerning:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-optical-sizing:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-optical-sizing:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-palette:dark" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-palette:light" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-palette:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-size:math" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-size:xxx-large" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-size-adjust:from-font" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "font-size-adjust:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "font-size-adjust:two-values" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "font-stretch:condensed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:expanded" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:extra-condensed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:extra-expanded" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:percentage" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:semi-condensed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:semi-expanded" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:ultra-condensed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-stretch:ultra-expanded" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-style:italic" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-style:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-style:oblique" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-style:oblique-angle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-synthesis:position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-synthesis:small-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-synthesis:style" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-synthesis:weight" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "font-synthesis-position:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-synthesis-position:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-synthesis-small-caps:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-small-caps:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-style:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-weight:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-synthesis-weight:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant:historical-forms" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-variant:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-variant:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-variant:sub" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-variant:super" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-variant-alternates:annotation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-alternates:historical-forms" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-alternates:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-alternates:ornaments" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-alternates:styleset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-alternates:stylistic" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-alternates:swash" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-variant-caps:all-petite-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-caps:all-small-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-caps:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-caps:petite-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-caps:small-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-caps:titling-caps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-caps:unicase" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:full-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:jis04" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:jis78" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:jis83" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:jis90" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:proportional-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:ruby" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:simplified" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-east-asian:traditional" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-emoji:emoji" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-emoji:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-emoji:text" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-emoji:unicode" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-ligatures:common-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:contextual" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:discretionary-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:historical-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:no-common-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:no-contextual" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:no-discretionary-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:no-historical-ligatures" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-ligatures:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:diagonal-fractions" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:lining-nums" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:oldstyle-nums" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:ordinal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:proportional-nums" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:slashed-zero" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:stacked-fractions" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-numeric:tabular-nums" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "font-variant-position:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-position:sub" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-variant-position:super" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-weight:bold" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-weight:bolder" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-weight:lighter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-weight:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-weight:number" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "font-width:condensed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:expanded" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:extra-condensed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:extra-expanded" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:semi-condensed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:semi-expanded" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:ultra-condensed" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-width:ultra-expanded" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "forced-color-adjust:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "forced-color-adjust:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "forced-color-adjust:preserve-parent-color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "gap:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-auto-flow:column" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-auto-flow:dense" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-auto-flow:row" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-areas:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:animation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "grid-template-columns:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:masonry" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "grid-template-columns:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:minmax" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-columns:subgrid" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "grid-template-rows:animation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "grid-template-rows:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:masonry" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "grid-template-rows:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:minmax" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:repeat" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "grid-template-rows:subgrid" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "hanging-punctuation:allow-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hanging-punctuation:first" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hanging-punctuation:last" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hanging-punctuation:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "height:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "height:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "height:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "height:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "height:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "height:stretch" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hyphenate-character:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "hyphenate-limit-chars:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hyphens:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "image-orientation:from-image" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "image-orientation:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "image-rendering:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "image-rendering:crisp-edges" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "image-rendering:pixelated" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "image-rendering:smooth" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "initial-letter:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inline-size:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inline-size:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inline-size:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inline-size:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-block:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-block:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-block:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-block-end:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-block-end:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-block-end:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-block-start:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-block-start:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-block-start:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-inline:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-inline:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-inline:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-inline-end:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-inline-end:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-inline-end:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "inset-inline-start:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-inline-start:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "inset-inline-start:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "interactivity:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "interactivity:inert" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "interpolate-size:allow-keywords" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "interpolate-size:numeric-only" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "justify-content:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-content:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-content:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-items:anchor-center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "justify-items:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-items:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-items:legacy" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-items:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "justify-self:anchor-center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "justify-self:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "justify-self:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "justify-self:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "justify-self:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "justify-self:stretch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "left:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "left:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "left:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "letter-spacing:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "lighting-color:currentColor" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "lighting-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "line-break:anywhere" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "line-break:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "line-break:loose" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "line-break:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "line-break:strict" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "line-clamp:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "line-height:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style:inside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style:outside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style:symbols" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-image:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-position:inside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-position:outside" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:arabic-indic" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:armenian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:bengali" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:cambodian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:circle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:cjk-decimal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:cjk-earthly-branch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:cjk-heavenly-stem" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:cjk-ideographic" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:decimal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:decimal-leading-zero" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:devanagari" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:disc" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:disclosure-closed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:disclosure-open" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:ethiopic-numeric" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:georgian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:gujarati" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:gurmukhi" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:hebrew" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:hiragana" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:hiragana-iroha" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:japanese-formal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:japanese-informal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:kannada" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:katakana" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:katakana-iroha" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:khmer" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:korean-hangul-formal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:korean-hanja-formal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:korean-hanja-informal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:lao" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:lower-alpha" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:lower-armenian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:lower-greek" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:lower-latin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:lower-roman" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:malayalam" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:mongolian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:myanmar" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:oriya" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:persian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:simp-chinese-formal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:simp-chinese-informal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:square" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:string" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:symbols" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:tamil" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:telugu" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:thai" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:tibetan" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:trad-chinese-formal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:trad-chinese-informal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:upper-alpha" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:upper-armenian" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:upper-latin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "list-style-type:upper-roman" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-block:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-block-end:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-block-start:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-bottom:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-bottom:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-inline:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-inline-end:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-inline-start:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-left:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-left:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-right:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-right:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-top:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-top:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "margin-trim:block" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-trim:block-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-trim:block-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-trim:inline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-trim:inline-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-trim:inline-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "margin-trim:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "marker:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "marker-end:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "marker-mid:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "marker-start:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "mask-clip:border" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-clip:content" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-clip:padding" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-clip:text" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-composite:add" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-composite:exclude" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-composite:intersect" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-composite:subtract" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-mode:alpha" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-mode:luminance" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-mode:match-source" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin:border" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin:content" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin:fill-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin:padding" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin:stroke-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-origin:view-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "mask-type:alpha" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "mask-type:luminance" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "max-block-size:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "max-block-size:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-block-size:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-block-size:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-height:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "max-height:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-height:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "max-height:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "max-height:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "max-height:stretch" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "max-inline-size:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "max-inline-size:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-inline-size:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-inline-size:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-width:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "max-width:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "max-width:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "max-width:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "max-width:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "max-width:stretch" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "min-block-size:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "min-block-size:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-block-size:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-block-size:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-height:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "min-height:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "min-height:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-height:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "min-height:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "min-height:stretch" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "min-inline-size:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "min-inline-size:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-inline-size:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-inline-size:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-width:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "min-width:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "min-width:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "min-width:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "min-width:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "min-width:stretch" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "mix-blend-mode:plus-darker" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "mix-blend-mode:plus-lighter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-fit:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-fit:cover" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-fit:fill" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-fit:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-fit:scale-down" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "object-view-box:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "offset-anchor:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-anchor:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-anchor:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-anchor:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-anchor:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-anchor:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:border-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:content-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:fill-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:margin-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:padding-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:path" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:ray" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:stroke-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:url" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-path:view-box" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-position:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-rotate:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "offset-rotate:reverse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "opacity:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "outline:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "outline-color:transparent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:dashed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:dotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:double" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:groove" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:outset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:ridge" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-style:solid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-width:medium" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-width:thick" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "outline-width:thin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "overflow:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow:clip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overflow:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow:scroll" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow:visible" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-anchor:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-anchor:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-block:overlay" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "overflow-clip-margin:border-box" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-clip-margin:content-box" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-clip-margin:padding-box" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overflow-inline:overlay" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "overflow-wrap:anywhere" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "overflow-wrap:break-word" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "overflow-wrap:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "overflow-x:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-x:clip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overflow-x:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-x:scroll" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-x:visible" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-y:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-y:clip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overflow-y:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-y:scroll" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overflow-y:visible" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "overlay:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overlay:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "overscroll-behavior:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-block:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-block:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-block:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-inline:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-inline:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-inline:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-x:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-x:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-x:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-y:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-y:contain" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "overscroll-behavior-y:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "page-break-after:always" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-after:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-after:avoid" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-after:left" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-after:right" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-before:always" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-before:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-before:avoid" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-before:left" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-before:right" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-inside:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "page-break-inside:avoid" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "perspective:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "perspective-origin:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "perspective-origin:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "perspective-origin:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "perspective-origin:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "perspective-origin:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "place-items:anchor-center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "place-self:anchor-center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position:absolute" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "position:fixed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "position:relative" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "position:static" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "position:sticky" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "position-anchor:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-anchor:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:block-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:block-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:bottom" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:center" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:inline-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:inline-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:left" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:right" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-block-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-block-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-inline-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-inline-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:self-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-all" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-block-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-block-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-bottom" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-inline-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-inline-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-left" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-right" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-block-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-block-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-inline-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-inline-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-self-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-top" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:span-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:top" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-area:y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:self-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:self-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:self-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:self-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:span-self-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:span-self-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:span-self-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try:span-self-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:flip-block" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:flip-inline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:flip-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:position-area" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:self-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:self-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:self-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:self-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:span-self-x-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:span-self-x-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:span-self-y-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-fallbacks:span-self-y-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-order:most-block-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-order:most-height" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-order:most-inline-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-order:most-width" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-try-order:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-visibility:always" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-visibility:anchors-visible" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "position-visibility:no-overflow" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "print-color-adjust:economy" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "print-color-adjust:exact" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "quotes:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "quotes:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "reading-flow:flex-flow" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-flow:flex-visual" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-flow:grid-columns" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-flow:grid-order" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-flow:grid-rows" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-flow:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "reading-flow:source-order" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "resize:block" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "resize:inline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "right:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "right:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "right:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "rotate:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "row-gap:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "ruby-align:center" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-align:space-around" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-align:space-between" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-align:start" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-overhang:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "ruby-overhang:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "ruby-position:alternate" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "ruby-position:inter-character" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-position:over" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "ruby-position:under" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scale:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scroll-behavior:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scroll-behavior:smooth" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scroll-initial-target:nearest" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-initial-target:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-marker-group:after" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-marker-group:before" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-marker-group:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-padding:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-block:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-block-end:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-block-start:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-inline:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-inline-end:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-padding-inline-start:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-align:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-align:end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-align:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-align:start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-stop:always" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-stop:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type:block" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type:both" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type:inline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type:x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-snap-type:y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-target-group:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-target-group:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline-axis:block" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline-axis:inline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline-axis:x" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-timeline-axis:y" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scrollbar-color:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "scrollbar-gutter:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scrollbar-gutter:stable" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scrollbar-width:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scrollbar-width:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scrollbar-width:thin" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "shape-image-threshold:percentages" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:circle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:image" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:path" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-outside:polygon" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "shape-rendering:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "speak-as:digits" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "speak-as:literal-punctuation" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "speak-as:no-punctuation" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "speak-as:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "speak-as:spell-out" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "stroke:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-dasharray:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linecap:butt" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linecap:round" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linecap:square" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linejoin:bevel" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linejoin:miter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "stroke-linejoin:round" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "tab-size:length" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "table-layout:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "table-layout:fixed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:justify" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:match-parent" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align:start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-align-last:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-anchor:end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-anchor:middle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-anchor:start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-autospace:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:ideograph-alpha" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:ideograph-numeric" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:insert" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:no-autospace" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:punctuation" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-autospace:replace" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-edge:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-trim:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-trim:trim-both" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-trim:trim-end" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-box-trim:trim-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-combine-upright:all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-combine-upright:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-decoration-line:blink" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-decoration-line:grammar-error" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-line:line-through" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-line:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-line:overline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-line:spelling-error" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-line:underline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip-ink:all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip-ink:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-skip-ink:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-style:wavy" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-thickness:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-thickness:from-font" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-decoration-thickness:percentage" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-emphasis-position:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-position:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-position:over" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-position:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-position:under" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:circle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:dot" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:double-circle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:filled" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:sesame" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-emphasis-style:triangle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "text-indent:each-line" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-indent:hanging" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-justify:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-justify:inter-character" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-justify:inter-word" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-justify:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-orientation:mixed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-orientation:sideways" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-orientation:upright" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-overflow:clip" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-overflow:ellipsis" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-overflow:string" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-rendering:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-rendering:geometricPrecision" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-size-adjust:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-size-adjust:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-size-adjust:percentages" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-spacing-trim:normal" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-spacing-trim:space-all" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-spacing-trim:space-first" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-spacing-trim:trim-start" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-transform:capitalize" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-transform:full-size-kana" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-transform:full-width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-transform:lowercase" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-transform:math-auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "text-transform:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-transform:uppercase" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "text-underline-offset:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-offset:percentage" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-position:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-position:from-font" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-position:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-position:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-underline-position:under" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "text-wrap:balance" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap:nowrap" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap:pretty" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-wrap:stable" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap:wrap" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-mode:nowrap" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-mode:wrap" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-style:auto" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-style:balance" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "text-wrap-style:pretty" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "text-wrap-style:stable" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "timeline-scope:all" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "timeline-scope:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "top:anchor" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "top:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "top:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "touch-action:manipulation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pan-down" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pan-left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pan-right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pan-up" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pan-x" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pan-y" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "touch-action:pinch-zoom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2019), + }, + "transform:3d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "transform:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-box:border-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transform-box:content-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transform-box:fill-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transform-box:stroke-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transform-box:view-box" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transform-origin:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-origin:center" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-origin:left" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-origin:right" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transform-origin:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:ease" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:ease-in" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:ease-in-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:ease-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:linear" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:step-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:step-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition:transition-behavior" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "transition-property:all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-property:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:ease" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:ease-in" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:ease-in-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:ease-out" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:jump" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:linear" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:step-end" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "transition-timing-function:step-start" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "translate:none" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "unicode-bidi:bidi-override" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "unicode-bidi:embed" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "unicode-bidi:isolate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "unicode-bidi:isolate-override" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "unicode-bidi:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "unicode-bidi:plaintext" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "user-select:all" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "user-select:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "user-select:none" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "user-select:text" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "vertical-align:baseline" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:middle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:sub" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:super" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:text-bottom" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:text-top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "vertical-align:top" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "view-timeline-axis:block" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-axis:inline" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-axis:x" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-axis:y" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-timeline-inset:auto" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "view-transition-class:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-name:match-element" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-name:none" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "visibility:collapse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "visibility:hidden" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "visibility:visible" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space:break-spaces" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space:nowrap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space:pre" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space:pre-line" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space:pre-wrap" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "white-space-collapse:break-spaces" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "white-space-collapse:collapse" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "white-space-collapse:preserve" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "white-space-collapse:preserve-breaks" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "white-space-collapse:preserve-spaces" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "width:anchor-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "width:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "width:fit-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "width:max-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "width:min-content" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "width:stretch" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "will-change:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "will-change:contents" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "will-change:scroll-position" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "word-break:auto-phrase" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "word-break:break-all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "word-break:break-word" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "word-break:keep-all" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "word-break:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "word-spacing:normal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "writing-mode:horizontal-tb" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "writing-mode:lr" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "writing-mode:lr-tb" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "writing-mode:rl" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "writing-mode:rl-tb" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "writing-mode:sideways-lr" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "writing-mode:sideways-rl" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "writing-mode:tb" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "writing-mode:tb-rl" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "writing-mode:vertical-lr" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "writing-mode:vertical-rl" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2017), + }, + "z-index:auto" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, +}; +#[doc = r" Baseline status for CSS at-rules."] +pub static BASELINE_AT_RULES: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + "charset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "container" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "counter-style" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "custom-media" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "font-face" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "font-feature-values" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "font-palette-values" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "function" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "import" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "keyframes" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "layer" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "media" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "namespace" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "page" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "position-try" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "property" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "scope" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "starting-style" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "supports" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "view-transition" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, +}; +#[doc = r" Baseline status for CSS media query conditions."] +pub static BASELINE_MEDIA_CONDITIONS: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + "-webkit-device-pixel-ratio" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "-webkit-max-device-pixel-ratio" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "-webkit-min-device-pixel-ratio" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "-webkit-transform-3d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "any-hover" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "any-pointer" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "aspect-ratio" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "calc" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-gamut" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "color-index" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "device-aspect-ratio" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "device-height" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "device-posture" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "device-width" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "display-mode" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "dynamic-range" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "forced-colors" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "grid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "height" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "horizontal-viewport-segments" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hover" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "inverted-colors" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "media_features" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "media_query_values" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "monochrome" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "nested-queries" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "or_syntax" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "orientation" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "overflow-block" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "overflow-inline" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "pointer" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2018), + }, + "prefers-color-scheme" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "prefers-contrast" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "prefers-reduced-data" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "prefers-reduced-motion" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "prefers-reduced-transparency" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "range_syntax" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "resolution" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scripting" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "update" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "vertical-viewport-segments" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "video-dynamic-range" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "width" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, +}; +#[doc = r" Baseline status for CSS value functions."] +pub static BASELINE_FUNCTIONS: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + "abs" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "acos" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "asin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "atan" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "atan2" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "attr" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "blur" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "brightness" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "calc" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "calc-size" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "circle" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "clamp" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "color" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "color-mix" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "conic-gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "contrast" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "cos" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "counter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "counters" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "cross-fade" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "cubic-bezier" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "drop-shadow" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "element" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "ellipse" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "env" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "exp" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "grayscale" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "hsl" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "hue-rotate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "hwb" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "hypot" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "image" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "image-set" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "inset" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "invert" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "lab" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "lch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "light-dark" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "linear-gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "log" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "matrix" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "matrix3d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "max" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "min" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "mod" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "oklab" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "oklch" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "opacity" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "paint" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "path" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "perspective" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "polygon" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "pow" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "radial-gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "ray" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "rect" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "rem" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "repeating-conic-gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "repeating-linear-gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "repeating-radial-gradient" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "rgb" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "rotate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "rotate3d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "rotateX" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "rotateY" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "rotateZ" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "round" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "saturate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "scale" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "scale3d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "scaleX" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "scaleY" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "scaleZ" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "sepia" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, + "sign" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "sin" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "skew" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "skewX" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "skewY" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "sqrt" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "steps" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "string" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "tan" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2023), + }, + "translate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "translate3d" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "translateX" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "translateY" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "translateZ" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "url" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2016), + }, +}; +#[doc = r" Baseline status for CSS pseudo-class and pseudo-element selectors."] +pub static BASELINE_SELECTORS: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + "active" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "active-view-transition" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2026), + }, + "active-view-transition-type" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2026), + }, + "after" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "any-link" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "attribute" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "autofill" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "backdrop" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "before" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "buffering" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "checked" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "checkmark" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "child" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "class" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "column" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "cue" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "default" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "defined" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "descendant" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "details-content" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "dir" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "disabled" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "empty" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "enabled" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "file-selector-button" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "first" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "first-child" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "first-letter" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "first-line" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "first-of-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "focus" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "focus-visible" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "focus-within" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "fullscreen" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "future" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "grammar-error" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "has" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "has-slotted" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "heading" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "headingfunction" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "highlight" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "host" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "host-context" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "hostfunction" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "hover" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "id" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "in-range" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "indeterminate" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "interest-source" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "interest-target" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "invalid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "is" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "lang" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "last-child" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "last-of-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "left" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "link" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "list" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "marker" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "modal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2022), + }, + "muted" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "namespace" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "nesting" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "next-sibling" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "not" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "nth-child" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "nth-last-child" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "nth-last-of-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "nth-of-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "only-child" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "only-of-type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "open" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "optional" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "out-of-range" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "part" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "past" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "paused" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "picker" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "picker-icon" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "picture-in-picture" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "placeholder" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "placeholder-shown" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "playing" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "popover-open" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "read-only" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "read-write" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "required" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "right" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "root" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "scope" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "scroll-button" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-marker" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "scroll-marker-group" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "seeking" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "selection" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "slotted" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "spelling-error" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "stalled" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "state" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "subsequent-sibling" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "target" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "target-after" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "target-before" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "target-current" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "target-text" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2024), + }, + "type" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "universal" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "user-invalid" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "user-valid" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2023), + }, + "valid" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2015), + }, + "view-transition" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-group" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-image-pair" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-new" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "view-transition-old" => BaselineStatus { + tier: BaselineTier::Newly, + year: BaselineYear::Known(2025), + }, + "visited" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2020), + }, + "volume-locked" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, + "where" => BaselineStatus { + tier: BaselineTier::Widely, + year: BaselineYear::Known(2021), + }, + "xr-overlay" => BaselineStatus { + tier: BaselineTier::Limited, + year: BaselineYear::Unknown, + }, +}; diff --git a/crates/biome_css_analyze/src/keywords.rs b/crates/biome_css_analyze/src/keywords.rs index f3fc01efc40d..45286282cb99 100644 --- a/crates/biome_css_analyze/src/keywords.rs +++ b/crates/biome_css_analyze/src/keywords.rs @@ -5753,6 +5753,169 @@ pub(crate) const MATH_ML_TAGS: [&str; 32] = [ "semantics", ]; +// CSS named colors are CssIdentifier tokens in property values. +// We exclude them from property-value baseline checks because they're +// universally supported regardless of baseline data. +pub(crate) const NAMED_COLORS: &[&str] = &[ + "aliceblue", + "antiquewhite", + "aqua", + "aquamarine", + "auto", + "azure", + "beige", + "bisque", + "black", + "blanchedalmond", + "blue", + "blueviolet", + "brown", + "burlywood", + "cadetblue", + "chartreuse", + "chocolate", + "coral", + "cornflowerblue", + "cornsilk", + "crimson", + "currentcolor", + "cyan", + "darkblue", + "darkcyan", + "darkgoldenrod", + "darkgray", + "darkgreen", + "darkgrey", + "darkkhaki", + "darkmagenta", + "darkolivegreen", + "darkorange", + "darkorchid", + "darkred", + "darksalmon", + "darkseagreen", + "darkslateblue", + "darkslategray", + "darkslategrey", + "darkturquoise", + "darkviolet", + "deeppink", + "deepskyblue", + "dimgray", + "dimgrey", + "dodgerblue", + "firebrick", + "floralwhite", + "forestgreen", + "fuchsia", + "gainsboro", + "ghostwhite", + "gold", + "goldenrod", + "gray", + "green", + "greenyellow", + "grey", + "honeydew", + "hotpink", + "indianred", + "indigo", + "inherit", + "initial", + "ivory", + "khaki", + "lavender", + "lavenderblush", + "lawngreen", + "lemonchiffon", + "lightblue", + "lightcoral", + "lightcyan", + "lightgoldenrodyellow", + "lightgray", + "lightgreen", + "lightgrey", + "lightpink", + "lightsalmon", + "lightseagreen", + "lightskyblue", + "lightslategray", + "lightslategrey", + "lightsteelblue", + "lightyellow", + "lime", + "limegreen", + "linen", + "magenta", + "maroon", + "mediumaquamarine", + "mediumblue", + "mediumorchid", + "mediumpurple", + "mediumseagreen", + "mediumslateblue", + "mediumspringgreen", + "mediumturquoise", + "mediumvioletred", + "midnightblue", + "mintcream", + "mistyrose", + "moccasin", + "navajowhite", + "navy", + "none", + "oldlace", + "olive", + "olivedrab", + "orange", + "orangered", + "orchid", + "palegoldenrod", + "palegreen", + "paleturquoise", + "palevioletred", + "papayawhip", + "peachpuff", + "peru", + "pink", + "plum", + "powderblue", + "purple", + "rebeccapurple", + "red", + "revert", + "revert-layer", + "rosybrown", + "royalblue", + "saddlebrown", + "salmon", + "sandybrown", + "seagreen", + "seashell", + "sienna", + "silver", + "skyblue", + "slateblue", + "slategray", + "slategrey", + "snow", + "springgreen", + "steelblue", + "tan", + "teal", + "thistle", + "tomato", + "transparent", + "turquoise", + "unset", + "violet", + "wheat", + "white", + "whitesmoke", + "yellow", + "yellowgreen", +]; + #[cfg(test)] mod tests { use std::collections::HashSet; @@ -6144,4 +6307,11 @@ mod tests { assert!(items[0] < items[1], "{} < {}", items[0], items[1]); } } + + #[test] + fn test_color_names() { + for items in NAMED_COLORS.windows(2) { + assert!(items[0] < items[1], "{} < {}", items[0], items[1]); + } + } } diff --git a/crates/biome_css_analyze/src/lib.rs b/crates/biome_css_analyze/src/lib.rs index 87368dca2439..0553ac17c8b6 100644 --- a/crates/biome_css_analyze/src/lib.rs +++ b/crates/biome_css_analyze/src/lib.rs @@ -1,6 +1,7 @@ #![deny(clippy::use_self)] mod assist; +mod baseline_data; mod fonts; mod keywords; mod lint; diff --git a/crates/biome_css_analyze/src/lint/nursery/use_baseline.rs b/crates/biome_css_analyze/src/lint/nursery/use_baseline.rs new file mode 100644 index 000000000000..745118399ffb --- /dev/null +++ b/crates/biome_css_analyze/src/lint/nursery/use_baseline.rs @@ -0,0 +1,643 @@ +use crate::keywords::NAMED_COLORS; +use biome_analyze::{ + Ast, Rule, RuleDiagnostic, RuleSource, context::RuleContext, declare_lint_rule, +}; +use biome_console::{MarkupBuf, markup}; +use biome_css_syntax::{ + AnyCssAtRule, AnyCssGenericComponentValue, CssAtRule, CssFunction, CssGenericProperty, + CssPseudoClassIdentifier, CssPseudoElementIdentifier, CssQueryFeaturePlain, CssSupportsAtRule, + CssSupportsNotCondition, +}; +use biome_rowan::{AstNode, TextRange, TokenText, declare_node_union}; +use biome_rule_options::use_baseline::{AvailabilityNamed, AvailabilityTarget, UseBaselineOptions}; +use biome_string_case::StrLikeExtension; +use std::collections::HashMap; + +use crate::baseline_data::{ + BASELINE_AT_RULES, BASELINE_FUNCTIONS, BASELINE_MEDIA_CONDITIONS, BASELINE_PROPERTIES, + BASELINE_SELECTORS, BaselineTier, BaselineYear, find_baseline, find_property_value_baseline, +}; + +declare_lint_rule! { + /// Disallow CSS properties, values, at-rules, functions, and selectors that are not part of the configured Baseline. + /// + /// [Baseline](https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility) + /// tracks the availability of web platform features across core browsers. + /// This rule helps you avoid features that aren't supported in the browsers you need to target. + /// + /// Features are categorized into three tiers: + /// - **Limited**: Not yet available in all core browsers. + /// - **Newly available**: Available in all core browsers for less than 30 months. + /// - **Widely available**: Available in all core browsers for at least 30 months. + /// + /// By default, the rule reports on anything that is not Baseline **widely available**. + /// + /// Code inside `@supports` blocks is exempt: if you feature-detect a capability before + /// using it, the rule does not flag it. + /// + /// ## Examples + /// + /// ### Invalid + /// + /// ```css,expect_diagnostic + /// a { + /// backdrop-filter: blur(4px); + /// } + /// ``` + /// + /// ```css,expect_diagnostic + /// a { width: abs(20% - 100px); } + /// ``` + /// + /// ```css,expect_diagnostic + /// @media (inverted-colors: inverted) { a { color: red; } } + /// ``` + /// + /// ```css,expect_diagnostic + /// details::details-content { background: red; } + /// ``` + /// + /// ### Valid + /// + /// ```css + /// a { color: red; } + /// ``` + /// + /// ```css + /// /* @supports exempts feature-detected code */ + /// @supports (backdrop-filter: blur(4px)) { + /// a { backdrop-filter: blur(4px); } + /// } + /// ``` + /// + /// ## Options + /// + /// ### `available` + /// + /// Specifies the minimum Baseline availability tier to accept. Defaults to `"widely"`. + /// + /// - `"widely"`: Only accept features that are Baseline widely available (default). + /// - `"newly"`: Accept features that are at least Baseline newly available. + /// - A year number (e.g. `2023`): Accept features that became newly available in that year or earlier. + /// + /// Default: `"widely"` + /// + /// ```json,options + /// { + /// "options": { + /// "available": "newly" + /// } + /// } + /// ``` + /// + /// With `"newly"`, a property that is newly (but not yet widely) available doesn't trigger the rule: + /// + /// ```css,use_options + /// a { backdrop-filter: blur(4px); } + /// ``` + /// + /// But a limited property still fails: + /// + /// ```css,expect_diagnostic,use_options + /// a { accent-color: red; } + /// ``` + /// + /// ### `allowProperties` + /// + /// A list of CSS property names to exclude from checking (case-insensitive). + /// + /// Default: `[]` + /// + /// ```json,options + /// { + /// "options": { + /// "allowProperties": ["backdrop-filter"] + /// } + /// } + /// ``` + /// + /// ```css,use_options + /// a { backdrop-filter: blur(4px); } + /// ``` + /// + /// ### `allowAtRules` + /// + /// A list of CSS at-rule names to exclude from checking (without `@`, case-insensitive). + /// + /// Default: `[]` + /// + /// ```json,options + /// { + /// "options": { + /// "allowAtRules": ["view-transition"] + /// } + /// } + /// ``` + /// + /// ```css,use_options + /// @view-transition { navigation: auto; } + /// ``` + /// + /// ### `allowFunctions` + /// + /// A list of CSS value function names to exclude from checking (case-insensitive). + /// + /// Default: `[]` + /// + /// ```json,options + /// { + /// "options": { + /// "allowFunctions": ["abs"] + /// } + /// } + /// ``` + /// + /// ```css,use_options + /// a { width: abs(20% - 100px); } + /// ``` + /// + /// ### `allowMediaConditions` + /// + /// A list of CSS media query condition names to exclude from checking (case-insensitive). + /// + /// Default: `[]` + /// + /// ```json,options + /// { + /// "options": { + /// "allowMediaConditions": ["inverted-colors"] + /// } + /// } + /// ``` + /// + /// ```css,use_options + /// @media (inverted-colors: inverted) { a { color: red; } } + /// ``` + /// + /// ### `allowPropertyValues` + /// + /// An object mapping property names to arrays of allowed values (case-insensitive). + /// + /// Default: `{}` + /// + /// ```json,options + /// { + /// "options": { + /// "allowPropertyValues": { + /// "clip-path": ["fill-box"] + /// } + /// } + /// } + /// ``` + /// + /// ```css,use_options + /// a { clip-path: fill-box; } + /// ``` + /// + /// ### `allowSelectors` + /// + /// A list of CSS pseudo-class or pseudo-element names to exclude from checking + /// (without `:` or `::`, case-insensitive). + /// + /// Default: `[]` + /// + /// ```json,options + /// { + /// "options": { + /// "allowSelectors": ["has"] + /// } + /// } + /// ``` + /// + /// ```css,use_options + /// h1:has(+ h2) { margin: 0; } + /// ``` + /// + pub UseBaseline { + version: "next", + name: "useBaseline", + language: "css", + recommended: false, + sources: &[RuleSource::EslintCss("use-baseline").inspired()], + } +} + +impl Rule for UseBaseline { + type Query = Ast; + type State = UseBaselineState; + type Signals = Option; + type Options = UseBaselineOptions; + + fn run(ctx: &RuleContext) -> Self::Signals { + let options = ctx.options(); + let node = ctx.query(); + + match node { + AnyBaselineCheckable::CssGenericProperty(prop) => check_property(prop, options), + AnyBaselineCheckable::CssFunction(func) => check_function(func, options), + AnyBaselineCheckable::CssPseudoClassIdentifier(pseudo) => check_pseudo( + pseudo.name().ok()?.value_token().ok()?.token_text_trimmed(), + pseudo.syntax().text_trimmed_range(), + "pseudo-class", + options, + ), + AnyBaselineCheckable::CssPseudoElementIdentifier(pseudo) => check_pseudo( + pseudo.name().ok()?.value_token().ok()?.token_text_trimmed(), + pseudo.syntax().text_trimmed_range(), + "pseudo-element", + options, + ), + AnyBaselineCheckable::CssQueryFeaturePlain(feature) => { + check_media_condition(feature, options) + } + AnyBaselineCheckable::CssAtRule(at_rule) => check_at_rule(at_rule, options), + } + } + + fn diagnostic(_ctx: &RuleContext, state: &Self::State) -> Option { + Some( + RuleDiagnostic::new( + rule_category!(), + state.range, + markup! { + "CSS "{state.category}" "{state.feature_name.message()}" isn't part of the chosen Baseline." + }, + ) + .note(markup! { + "Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers." + }) + .note(markup! { + "Either remove the feature, or use the ""@supports"" at-rule to gate the feature behind a browser-specific support condition." + }) + .note(markup! { + "See ""MDN Baseline"" for more information." + }) + .note(state.feature_name.can_i_use()) + ) + } +} + +declare_node_union! { + pub AnyBaselineCheckable = + CssGenericProperty + | CssFunction + | CssPseudoClassIdentifier + | CssPseudoElementIdentifier + | CssQueryFeaturePlain + | CssAtRule +} + +pub struct UseBaselineState { + /// Human-readable name of the feature that failed the check. + pub feature_name: FeatureName, + /// Category label for the diagnostic message. + pub category: &'static str, + /// Source range to underline. + pub range: TextRange, +} + +pub enum FeatureName { + Token(TokenText), + String(&'static str), + PropertyValue(TokenText, TokenText), +} + +impl From for FeatureName { + fn from(name: TokenText) -> Self { + Self::Token(name) + } +} + +impl From<&'static str> for FeatureName { + fn from(name: &'static str) -> Self { + Self::String(name) + } +} + +impl From<(TokenText, TokenText)> for FeatureName { + fn from(pair: (TokenText, TokenText)) -> Self { + Self::PropertyValue(pair.0, pair.1) + } +} + +impl FeatureName { + fn message(&self) -> String { + match self { + Self::Token(name) => name.text().to_string(), + Self::PropertyValue(key, value) => format!("{}: {}", key.text(), value.text()), + Self::String(name) => name.to_string(), + } + } + + fn can_i_use(&self) -> MarkupBuf { + match self { + Self::Token(name) => { + let href = format!("https://caniuse.com/?search={}", name.text()); + markup! { + "Check ""caniuse.com"" for more information about the feature "{name.text()}"." + } + .to_owned() + } + Self::PropertyValue(key, value) => { + let value_href = format!("https://caniuse.com/?search={}", value.text()); + let key_href = format!("https://caniuse.com/?search={}", key.text()); + + markup! { + "Check ""caniuse.com"" for more information about the value "{value.text()}" for the property "{key.text()}"." + "Check ""caniuse.com"" for more information about the property "{key.text()}"." + }.to_owned() + } + Self::String(name) => { + let href = format!("https://caniuse.com/?search={}", name); + + markup! { + "Check ""caniuse.com"" for more information about the feature "{name.to_string()}"." + }.to_owned() + } + } + } +} + +/// Return `true` if the feature's status passes the configured availability +/// requirement. +fn is_acceptable(options: &UseBaselineOptions, tier: BaselineTier, year: BaselineYear) -> bool { + match &options.available { + AvailabilityTarget::Named(AvailabilityNamed::Widely) => { + matches!(tier, BaselineTier::Widely) + } + AvailabilityTarget::Named(AvailabilityNamed::Newly) => { + !matches!(tier, BaselineTier::Limited) + } + AvailabilityTarget::Year(cutoff) => match tier { + BaselineTier::Widely => true, + BaselineTier::Newly => { + // Passes only if the year is known and on or before the cutoff. + matches!(year, BaselineYear::Known(y) if y <= *cutoff) + } + BaselineTier::Limited => false, + }, + } +} + +/// Check whether a syntax node is inside a positive (non-negated) `@supports` +/// condition. If so, the property/value is feature-gated and should not be +/// flagged. +fn is_inside_positive_supports(syntax: &biome_css_syntax::CssSyntaxNode) -> bool { + for anc in syntax.ancestors().skip(1) { + // If we encounter a `not` condition on the way up, it means we're + // inside `@supports not (...)` — not suppressed. + if CssSupportsNotCondition::can_cast(anc.kind()) { + return false; + } + // If we reach the top-level @supports at-rule (via its parent CssAtRule), + // we are inside a positive @supports. + if CssSupportsAtRule::can_cast(anc.kind()) { + return true; + } + } + false +} + +fn in_allow_list(name: &TokenText, list: &[String]) -> bool { + list.iter() + .any(|item| item.eq_ignore_ascii_case(&name.to_ascii_lowercase_cow())) +} + +fn is_allowed_property_value( + key: &TokenText, + value: &TokenText, + list: &HashMap>, +) -> bool { + let key_lower = key.to_ascii_lowercase_cow(); + let val_lower = value.to_ascii_lowercase_cow(); + // Case-insensitive key lookup, then check if the value is in the allowed list. + list.iter().any(|(prop, allowed_values)| { + prop.eq_ignore_ascii_case(&key_lower) + && allowed_values + .iter() + .any(|v| v.eq_ignore_ascii_case(&val_lower)) + }) +} + +fn is_named_color(name: &str) -> bool { + NAMED_COLORS.binary_search(&name).is_ok() +} + +fn check_property( + prop: &CssGenericProperty, + options: &UseBaselineOptions, +) -> Option { + use biome_css_syntax::AnyCssValue; + + // If inside a positive @supports, the feature is gated — skip + if is_inside_positive_supports(prop.syntax()) { + return None; + } + + // Check the property name itself + let name_node = prop.name().ok()?; + let prop_name = name_node.as_css_identifier()?.value_token().ok()?; + let prop_text = prop_name.token_text_trimmed(); + + // Skip custom properties (--foo) + if prop_text.text().starts_with("--") { + return None; + } + + // Skip if in allow list + if in_allow_list(&prop_text, options.allow_properties.as_slice()) { + return None; + } + + // Check property name baseline + if let Some(status) = find_baseline( + &BASELINE_PROPERTIES, + &prop_text.text().to_ascii_lowercase_cow(), + ) && !is_acceptable(options, status.tier, status.year) + { + return Some(UseBaselineState { + feature_name: prop_text.into(), + category: "property", + range: prop_name.text_trimmed_range(), + }); + } + // If not in our data, assume it's fine (unknown = not checked) + + // Check property values (identifier keywords only) + let value_list = prop + .value() + .ok() + .and_then(|v| v.as_css_generic_component_value_list().cloned())?; + for component in value_list { + if let AnyCssGenericComponentValue::AnyCssValue(value) = &component + && let AnyCssValue::CssIdentifier(ident) = value + { + let tok = ident.value_token().ok()?; + let val_text = tok.token_text_trimmed(); + + // Skip named colors + if is_named_color(&val_text.to_ascii_lowercase_cow()) { + continue; + } + + // Skip if in property value allow list + if is_allowed_property_value(&prop_text, &val_text, &options.allow_property_values) { + continue; + } + + if let Some(status) = find_property_value_baseline( + &prop_text.to_ascii_lowercase_cow(), + &val_text.to_ascii_lowercase_cow(), + ) && !is_acceptable(options, status.tier, status.year) + { + return Some(UseBaselineState { + feature_name: (prop_text, val_text).into(), + category: "property value", + range: tok.text_trimmed_range(), + }); + } + } + } + + None +} + +fn check_function(func: &CssFunction, options: &UseBaselineOptions) -> Option { + let name_node = func.name().ok()?; + let name_ident = name_node.as_css_identifier()?; + let name_token = name_ident.value_token().ok()?; + let name = name_token.token_text_trimmed(); + + // Skip custom functions (--foo()) + if name.starts_with("--") { + return None; + } + + if in_allow_list(&name, &options.allow_functions) { + return None; + } + + if let Some(status) = find_baseline(&BASELINE_FUNCTIONS, &name.to_ascii_lowercase_cow()) + && !is_acceptable(options, status.tier, status.year) + { + return Some(UseBaselineState { + feature_name: name.into(), + category: "function", + range: name_token.text_trimmed_range(), + }); + } + None +} + +fn check_pseudo( + name: TokenText, + range: TextRange, + category: &'static str, + options: &UseBaselineOptions, +) -> Option { + if in_allow_list(&name, &options.allow_selectors) { + return None; + } + + if let Some(status) = find_baseline(&BASELINE_SELECTORS, &name.to_ascii_lowercase_cow()) + && !is_acceptable(options, status.tier, status.year) + { + return Some(UseBaselineState { + feature_name: name.into(), + category, + range, + }); + } + None +} + +fn check_media_condition( + feature: &CssQueryFeaturePlain, + options: &UseBaselineOptions, +) -> Option { + let name_node = feature.name().ok()?; + let tok = name_node.value_token().ok()?; + let name = tok.token_text_trimmed(); + + if in_allow_list(&name, &options.allow_media_conditions) { + return None; + } + + if let Some(status) = find_baseline(&BASELINE_MEDIA_CONDITIONS, &name.to_ascii_lowercase_cow()) + && !is_acceptable(options, status.tier, status.year) + { + return Some(UseBaselineState { + feature_name: name.into(), + category: "media condition", + range: tok.text_trimmed_range(), + }); + } + None +} + +fn at_rule_name(rule: &AnyCssAtRule) -> Option<&'static str> { + match rule { + AnyCssAtRule::CssCharsetAtRule(_) => Some("charset"), + AnyCssAtRule::CssColorProfileAtRule(_) => Some("color-profile"), + AnyCssAtRule::CssContainerAtRule(_) => Some("container"), + AnyCssAtRule::CssCounterStyleAtRule(_) => Some("counter-style"), + AnyCssAtRule::CssDocumentAtRule(_) => Some("document"), + AnyCssAtRule::CssFontFaceAtRule(_) => Some("font-face"), + AnyCssAtRule::CssFontFeatureValuesAtRule(_) => Some("font-feature-values"), + AnyCssAtRule::CssFontPaletteValuesAtRule(_) => Some("font-palette-values"), + AnyCssAtRule::CssImportAtRule(_) => Some("import"), + AnyCssAtRule::CssKeyframesAtRule(_) => Some("keyframes"), + AnyCssAtRule::CssLayerAtRule(_) => Some("layer"), + AnyCssAtRule::CssMediaAtRule(_) => Some("media"), + AnyCssAtRule::CssNamespaceAtRule(_) => Some("namespace"), + AnyCssAtRule::CssPageAtRule(_) => Some("page"), + AnyCssAtRule::CssPositionTryAtRule(_) => Some("position-try"), + AnyCssAtRule::CssPropertyAtRule(_) => Some("property"), + AnyCssAtRule::CssScopeAtRule(_) => Some("scope"), + AnyCssAtRule::CssStartingStyleAtRule(_) => Some("starting-style"), + AnyCssAtRule::CssSupportsAtRule(_) => Some("supports"), + AnyCssAtRule::CssViewTransitionAtRule(_) => Some("view-transition"), + AnyCssAtRule::CssFunctionAtRule(_) => Some("function"), + // Internal/framework at-rules, not CSS spec + AnyCssAtRule::CssBogusAtRule(_) + | AnyCssAtRule::CssUnknownBlockAtRule(_) + | AnyCssAtRule::CssUnknownValueAtRule(_) + | AnyCssAtRule::CssValueAtRule(_) + | AnyCssAtRule::TwApplyAtRule(_) + | AnyCssAtRule::TwConfigAtRule(_) + | AnyCssAtRule::TwCustomVariantAtRule(_) + | AnyCssAtRule::TwPluginAtRule(_) + | AnyCssAtRule::TwReferenceAtRule(_) + | AnyCssAtRule::TwSlotAtRule(_) + | AnyCssAtRule::TwSourceAtRule(_) + | AnyCssAtRule::TwThemeAtRule(_) + | AnyCssAtRule::TwUtilityAtRule(_) + | AnyCssAtRule::TwVariantAtRule(_) => None, + } +} + +fn check_at_rule(at_rule: &CssAtRule, options: &UseBaselineOptions) -> Option { + let inner = at_rule.rule().ok()?; + let name = at_rule_name(&inner)?; + + if options + .allow_at_rules + .iter() + .any(|item| item.eq_ignore_ascii_case(&name.to_ascii_lowercase_cow())) + { + return None; + } + + if let Some(status) = find_baseline(&BASELINE_AT_RULES, name) + && !is_acceptable(options, status.tier, status.year) + { + // Report the at-rule's first token range (the @keyword) + let range = at_rule.syntax().first_token()?.text_trimmed_range(); + return Some(UseBaselineState { + feature_name: name.into(), + category: "at-rule", + range, + }); + } + None +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.css new file mode 100644 index 000000000000..56a74cc76c8e --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.css @@ -0,0 +1,17 @@ +/* should generate diagnostics */ + +/* allowProperties: only accent-color is allowed, backdrop-filter is still flagged */ +a { accent-color: red; backdrop-filter: blur(10px); } + +/* allowSelectors: only "has" is allowed, fullscreen is still flagged */ +h1:has(+ h2) { margin: 0; } +h1:fullscreen { color: red; } + +/* allowFunctions: only color-mix is allowed, abs is still flagged */ +a { width: abs(20% - 100px); } + +/* allowMediaConditions: only scripting is allowed, inverted-colors is still flagged */ +@media (inverted-colors: inverted) { a { color: red; } } + +/* allowPropertyValues: only clip-path:fill-box is allowed, stroke-box is still flagged */ +a { clip-path: stroke-box; } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.css.snap new file mode 100644 index 000000000000..59a22e696059 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.css.snap @@ -0,0 +1,146 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: invalid.allow-lists.css +--- +# Input +```css +/* should generate diagnostics */ + +/* allowProperties: only accent-color is allowed, backdrop-filter is still flagged */ +a { accent-color: red; backdrop-filter: blur(10px); } + +/* allowSelectors: only "has" is allowed, fullscreen is still flagged */ +h1:has(+ h2) { margin: 0; } +h1:fullscreen { color: red; } + +/* allowFunctions: only color-mix is allowed, abs is still flagged */ +a { width: abs(20% - 100px); } + +/* allowMediaConditions: only scripting is allowed, inverted-colors is still flagged */ +@media (inverted-colors: inverted) { a { color: red; } } + +/* allowPropertyValues: only clip-path:fill-box is allowed, stroke-box is still flagged */ +a { clip-path: stroke-box; } + +``` + +# Diagnostics +``` +invalid.allow-lists.css:4:24 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property backdrop-filter isn't part of the chosen Baseline. + + 3 │ /* allowProperties: only accent-color is allowed, backdrop-filter is still flagged */ + > 4 │ a { accent-color: red; backdrop-filter: blur(10px); } + │ ^^^^^^^^^^^^^^^ + 5 │ + 6 │ /* allowSelectors: only "has" is allowed, fullscreen is still flagged */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature backdrop-filter. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.allow-lists.css:8:4 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS pseudo-class fullscreen isn't part of the chosen Baseline. + + 6 │ /* allowSelectors: only "has" is allowed, fullscreen is still flagged */ + 7 │ h1:has(+ h2) { margin: 0; } + > 8 │ h1:fullscreen { color: red; } + │ ^^^^^^^^^^ + 9 │ + 10 │ /* allowFunctions: only color-mix is allowed, abs is still flagged */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature fullscreen. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.allow-lists.css:11:12 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS function abs isn't part of the chosen Baseline. + + 10 │ /* allowFunctions: only color-mix is allowed, abs is still flagged */ + > 11 │ a { width: abs(20% - 100px); } + │ ^^^ + 12 │ + 13 │ /* allowMediaConditions: only scripting is allowed, inverted-colors is still flagged */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature abs. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.allow-lists.css:14:9 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS media condition inverted-colors isn't part of the chosen Baseline. + + 13 │ /* allowMediaConditions: only scripting is allowed, inverted-colors is still flagged */ + > 14 │ @media (inverted-colors: inverted) { a { color: red; } } + │ ^^^^^^^^^^^^^^^ + 15 │ + 16 │ /* allowPropertyValues: only clip-path:fill-box is allowed, stroke-box is still flagged */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature inverted-colors. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.allow-lists.css:17:16 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property value clip-path: stroke-box isn't part of the chosen Baseline. + + 16 │ /* allowPropertyValues: only clip-path:fill-box is allowed, stroke-box is still flagged */ + > 17 │ a { clip-path: stroke-box; } + │ ^^^^^^^^^^ + 18 │ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the value stroke-box for the property clip-path.Check caniuse.com for more information about the property clip-path. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.options.json new file mode 100644 index 000000000000..1586d8d895b1 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.allow-lists.options.json @@ -0,0 +1,21 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "allowProperties": ["accent-color"], + "allowSelectors": ["has"], + "allowFunctions": ["color-mix"], + "allowMediaConditions": ["scripting"], + "allowPropertyValues": { + "clip-path": ["fill-box"] + } + } + } + } + } + } +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.css new file mode 100644 index 000000000000..8b22c68144c1 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.css @@ -0,0 +1,48 @@ +/* should generate diagnostics */ + +/* Limited/newly available properties - flagged with default "widely" */ +a { accent-color: bar; backdrop-filter: auto } + +/* @supports not (negated) - NOT suppressed */ +@supports not (accent-color: auto) { a { accent-color: auto } } + +/* Outer @supports does not protect inner non-matching rule */ +@supports (accent-color: auto) { + @supports (backdrop-filter: auto) { + a { accent-color: red; } + } + a { backdrop-filter: auto; } +} + +/* Property value not yet widely available */ +@supports (clip-path: fill-box) { a { clip-path: stroke-box; } } + +/* Function not yet widely available */ +a { width: abs(20% - 100px); } +a { color: light-dark(black, white); } + +/* Function inside @supports, but @supports condition uses different feature */ +@supports (accent-color: auto) { a { accent-color: abs(20% - 10px); } } + +/* Media conditions not widely available */ +@media (inverted-colors: inverted) { a { color: red; } } + +/* Multiple non-baseline media conditions in one rule */ +@media (height: 600px) and (inverted-colors: inverted) and (device-posture: folded) { a { color: red; } } + +/* Unknown condition mixed with non-baseline */ +@media (foo) and (inverted-colors: inverted) { a { color: red; } } + +/* Pseudo-class not yet widely available */ +h1:has(+ h2) { margin: 0 0 0.25rem 0; } + +/* @supports selector() guards only its own block, not a separate rule */ +@supports selector(:has()) { a { color: red; } } +@supports (color: red) { + h1:has(+ h2) { + color: red; + } +} + +/* Pseudo-element not yet widely available */ +details::details-content { background-color: #a29bfe; } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.css.snap new file mode 100644 index 000000000000..da992109a7a0 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.css.snap @@ -0,0 +1,323 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: invalid.css +--- +# Input +```css +/* should generate diagnostics */ + +/* Limited/newly available properties - flagged with default "widely" */ +a { accent-color: bar; backdrop-filter: auto } + +/* @supports not (negated) - NOT suppressed */ +@supports not (accent-color: auto) { a { accent-color: auto } } + +/* Outer @supports does not protect inner non-matching rule */ +@supports (accent-color: auto) { + @supports (backdrop-filter: auto) { + a { accent-color: red; } + } + a { backdrop-filter: auto; } +} + +/* Property value not yet widely available */ +@supports (clip-path: fill-box) { a { clip-path: stroke-box; } } + +/* Function not yet widely available */ +a { width: abs(20% - 100px); } +a { color: light-dark(black, white); } + +/* Function inside @supports, but @supports condition uses different feature */ +@supports (accent-color: auto) { a { accent-color: abs(20% - 10px); } } + +/* Media conditions not widely available */ +@media (inverted-colors: inverted) { a { color: red; } } + +/* Multiple non-baseline media conditions in one rule */ +@media (height: 600px) and (inverted-colors: inverted) and (device-posture: folded) { a { color: red; } } + +/* Unknown condition mixed with non-baseline */ +@media (foo) and (inverted-colors: inverted) { a { color: red; } } + +/* Pseudo-class not yet widely available */ +h1:has(+ h2) { margin: 0 0 0.25rem 0; } + +/* @supports selector() guards only its own block, not a separate rule */ +@supports selector(:has()) { a { color: red; } } +@supports (color: red) { + h1:has(+ h2) { + color: red; + } +} + +/* Pseudo-element not yet widely available */ +details::details-content { background-color: #a29bfe; } + +``` + +_Note: The parser emitted 1 diagnostics which are not shown here._ + +# Diagnostics +``` +invalid.css:4:5 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property accent-color isn't part of the chosen Baseline. + + 3 │ /* Limited/newly available properties - flagged with default "widely" */ + > 4 │ a { accent-color: bar; backdrop-filter: auto } + │ ^^^^^^^^^^^^ + 5 │ + 6 │ /* @supports not (negated) - NOT suppressed */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature accent-color. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:4:24 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property backdrop-filter isn't part of the chosen Baseline. + + 3 │ /* Limited/newly available properties - flagged with default "widely" */ + > 4 │ a { accent-color: bar; backdrop-filter: auto } + │ ^^^^^^^^^^^^^^^ + 5 │ + 6 │ /* @supports not (negated) - NOT suppressed */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature backdrop-filter. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:7:16 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property accent-color isn't part of the chosen Baseline. + + 6 │ /* @supports not (negated) - NOT suppressed */ + > 7 │ @supports not (accent-color: auto) { a { accent-color: auto } } + │ ^^^^^^^^^^^^ + 8 │ + 9 │ /* Outer @supports does not protect inner non-matching rule */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature accent-color. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:21:12 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS function abs isn't part of the chosen Baseline. + + 20 │ /* Function not yet widely available */ + > 21 │ a { width: abs(20% - 100px); } + │ ^^^ + 22 │ a { color: light-dark(black, white); } + 23 │ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature abs. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:22:12 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS function light-dark isn't part of the chosen Baseline. + + 20 │ /* Function not yet widely available */ + 21 │ a { width: abs(20% - 100px); } + > 22 │ a { color: light-dark(black, white); } + │ ^^^^^^^^^^ + 23 │ + 24 │ /* Function inside @supports, but @supports condition uses different feature */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature light-dark. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:25:52 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS function abs isn't part of the chosen Baseline. + + 24 │ /* Function inside @supports, but @supports condition uses different feature */ + > 25 │ @supports (accent-color: auto) { a { accent-color: abs(20% - 10px); } } + │ ^^^ + 26 │ + 27 │ /* Media conditions not widely available */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature abs. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:28:9 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS media condition inverted-colors isn't part of the chosen Baseline. + + 27 │ /* Media conditions not widely available */ + > 28 │ @media (inverted-colors: inverted) { a { color: red; } } + │ ^^^^^^^^^^^^^^^ + 29 │ + 30 │ /* Multiple non-baseline media conditions in one rule */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature inverted-colors. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:31:29 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS media condition inverted-colors isn't part of the chosen Baseline. + + 30 │ /* Multiple non-baseline media conditions in one rule */ + > 31 │ @media (height: 600px) and (inverted-colors: inverted) and (device-posture: folded) { a { color: red; } } + │ ^^^^^^^^^^^^^^^ + 32 │ + 33 │ /* Unknown condition mixed with non-baseline */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature inverted-colors. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:31:61 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS media condition device-posture isn't part of the chosen Baseline. + + 30 │ /* Multiple non-baseline media conditions in one rule */ + > 31 │ @media (height: 600px) and (inverted-colors: inverted) and (device-posture: folded) { a { color: red; } } + │ ^^^^^^^^^^^^^^ + 32 │ + 33 │ /* Unknown condition mixed with non-baseline */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature device-posture. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:34:19 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS media condition inverted-colors isn't part of the chosen Baseline. + + 33 │ /* Unknown condition mixed with non-baseline */ + > 34 │ @media (foo) and (inverted-colors: inverted) { a { color: red; } } + │ ^^^^^^^^^^^^^^^ + 35 │ + 36 │ /* Pseudo-class not yet widely available */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature inverted-colors. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.css:48:10 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS pseudo-element details-content isn't part of the chosen Baseline. + + 47 │ /* Pseudo-element not yet widely available */ + > 48 │ details::details-content { background-color: #a29bfe; } + │ ^^^^^^^^^^^^^^^ + 49 │ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature details-content. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.css new file mode 100644 index 000000000000..11a641b83812 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.css @@ -0,0 +1,10 @@ +/* should generate diagnostics */ + +/* accent-color is limited (not even newly available) */ +a { accent-color: bar; } + +/* view-transition at-rule is not yet newly available */ +@view-transition { navigation: auto; } + +/* device-posture media condition is not newly available */ +@media (device-posture: folded) { a { color: red; } } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.css.snap new file mode 100644 index 000000000000..495607ccdf92 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.css.snap @@ -0,0 +1,90 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: invalid.newly.css +--- +# Input +```css +/* should generate diagnostics */ + +/* accent-color is limited (not even newly available) */ +a { accent-color: bar; } + +/* view-transition at-rule is not yet newly available */ +@view-transition { navigation: auto; } + +/* device-posture media condition is not newly available */ +@media (device-posture: folded) { a { color: red; } } + +``` + +# Diagnostics +``` +invalid.newly.css:4:5 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property accent-color isn't part of the chosen Baseline. + + 3 │ /* accent-color is limited (not even newly available) */ + > 4 │ a { accent-color: bar; } + │ ^^^^^^^^^^^^ + 5 │ + 6 │ /* view-transition at-rule is not yet newly available */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature accent-color. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.newly.css:7:1 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS at-rule view-transition isn't part of the chosen Baseline. + + 6 │ /* view-transition at-rule is not yet newly available */ + > 7 │ @view-transition { navigation: auto; } + │ ^ + 8 │ + 9 │ /* device-posture media condition is not newly available */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature view-transition. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` + +``` +invalid.newly.css:10:9 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS media condition device-posture isn't part of the chosen Baseline. + + 9 │ /* device-posture media condition is not newly available */ + > 10 │ @media (device-posture: folded) { a { color: red; } } + │ ^^^^^^^^^^^^^^ + 11 │ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature device-posture. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.options.json new file mode 100644 index 000000000000..fffee801d985 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.newly.options.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "available": "newly" + } + } + } + } + } +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.css new file mode 100644 index 000000000000..26ff0b90f228 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.css @@ -0,0 +1,4 @@ +/* should generate diagnostics */ + +/* backdrop-filter became newly available in 2022, fails cutoff of 2021 */ +.box { backdrop-filter: blur(10px); } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.css.snap new file mode 100644 index 000000000000..cc947daa6b6d --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.css.snap @@ -0,0 +1,36 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: invalid.year-2021.css +--- +# Input +```css +/* should generate diagnostics */ + +/* backdrop-filter became newly available in 2022, fails cutoff of 2021 */ +.box { backdrop-filter: blur(10px); } + +``` + +# Diagnostics +``` +invalid.year-2021.css:4:8 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property backdrop-filter isn't part of the chosen Baseline. + + 3 │ /* backdrop-filter became newly available in 2022, fails cutoff of 2021 */ + > 4 │ .box { backdrop-filter: blur(10px); } + │ ^^^^^^^^^^^^^^^ + 5 │ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature backdrop-filter. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.options.json new file mode 100644 index 000000000000..3a1e581585c5 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2021.options.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "available": 2021 + } + } + } + } + } +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.css new file mode 100644 index 000000000000..b8d1287afbae --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.css @@ -0,0 +1,7 @@ +/* should generate diagnostics */ + +/* hyphens became newly available in 2023, fails cutoff of 2022 */ +p { hyphens: auto; } + +/* :has became newly available in 2023, fails cutoff of 2022 */ +h1:has(+ h2) { margin: 0; } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.css.snap new file mode 100644 index 000000000000..c639fc42e6be --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.css.snap @@ -0,0 +1,40 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: invalid.year-2022.css +--- +# Input +```css +/* should generate diagnostics */ + +/* hyphens became newly available in 2023, fails cutoff of 2022 */ +p { hyphens: auto; } + +/* :has became newly available in 2023, fails cutoff of 2022 */ +h1:has(+ h2) { margin: 0; } + +``` + +# Diagnostics +``` +invalid.year-2022.css:4:5 lint/nursery/useBaseline ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i CSS property hyphens isn't part of the chosen Baseline. + + 3 │ /* hyphens became newly available in 2023, fails cutoff of 2022 */ + > 4 │ p { hyphens: auto; } + │ ^^^^^^^ + 5 │ + 6 │ /* :has became newly available in 2023, fails cutoff of 2022 */ + + i Using a feature that isn't part of the Baseline can lead to unexpected behavior in older browsers. + + i Either remove the feature, or use the @supports at-rule to gate the feature behind a browser-specific support condition. + + i See MDN Baseline for more information. + + i Check caniuse.com for more information about the feature hyphens. + + i This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information. + + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.options.json new file mode 100644 index 000000000000..42f4e48345aa --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/invalid.year-2022.options.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "available": 2022 + } + } + } + } + } +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.css new file mode 100644 index 000000000000..07795ea1510e --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.css @@ -0,0 +1,19 @@ +/* should not generate diagnostics */ + +/* allowProperties excludes these non-widely-available properties */ +a { accent-color: bar; backdrop-filter: auto } + +/* allowFunctions */ +a { color: color-mix(in srgb, plum, #123456); } + +/* allowMediaConditions */ +@media (scripting: none) { a { color: red; } } + +/* allowSelectors */ +h1:has(+ h2) { margin: 0 0 0.25rem 0; } + +/* allowPropertyValues: clip-path:fill-box */ +a { clip-path: fill-box; } + +/* allowAtRules: container */ +@container (min-width: 800px) { a { color: red; } } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.css.snap new file mode 100644 index 000000000000..6a86b0c50456 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.css.snap @@ -0,0 +1,27 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: valid.allow-lists.css +--- +# Input +```css +/* should not generate diagnostics */ + +/* allowProperties excludes these non-widely-available properties */ +a { accent-color: bar; backdrop-filter: auto } + +/* allowFunctions */ +a { color: color-mix(in srgb, plum, #123456); } + +/* allowMediaConditions */ +@media (scripting: none) { a { color: red; } } + +/* allowSelectors */ +h1:has(+ h2) { margin: 0 0 0.25rem 0; } + +/* allowPropertyValues: clip-path:fill-box */ +a { clip-path: fill-box; } + +/* allowAtRules: container */ +@container (min-width: 800px) { a { color: red; } } + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.options.json new file mode 100644 index 000000000000..b585a86951ec --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.allow-lists.options.json @@ -0,0 +1,22 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "allowProperties": ["accent-color", "backdrop-filter"], + "allowFunctions": ["color-mix"], + "allowMediaConditions": ["scripting"], + "allowSelectors": ["has"], + "allowPropertyValues": { + "clip-path": ["fill-box"] + }, + "allowAtRules": ["container"] + } + } + } + } + } +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.css new file mode 100644 index 000000000000..037f6ad3260f --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.css @@ -0,0 +1,85 @@ +/* should not generate diagnostics */ + +/* Widely available properties - not flagged */ +a { color: red; } +a { color: red; background-color: blue; } +a { color: red; transition: none; } +body { padding: 0; } + +/* Custom properties - always allowed */ +body { --custom-property: red; } + +/* Vendor-prefixed properties - not in baseline data, skipped */ +a { color: red; -moz-transition: bar } + +/* Pseudo-elements that are widely available */ +::before { content: attr(foo); } + +/* At-rules that are widely available */ +@font-face { font-weight: 100 400 } +@media (min-width: 800px) { a { color: red; } } +@container (min-width: 800px) { a { color: red; } } + +/* Media conditions that are widely available */ +@media (prefers-color-scheme: dark) { a { color: red; } } +@media (color-gamut: srgb) { a { color: red; } } + +/* Unknown media conditions - not in data, not flagged */ +@media (foo) { a { color: red; } } + +/* Case-insensitive at-rules */ +@MEDIA (min-width: 800px) { a { color: red; } } +@Media (foo) { a { color: red; } } +@MeDia (prefers-color-scheme: dark) { a { color: red; } } +@MEDIA (color-gamut: srgb) { a { color: red; } } + +/* @supports suppression: property inside @supports is not flagged */ +@supports (accent-color: auto) { a { accent-color: auto; } } +@supports (accent-color: red) { a { accent-color: red; } } +@supports (accent-color: auto) { a { accent-color: red; } } +@supports (clip-path: fill-box) { a { clip-path: fill-box; } } + +/* @supports with compound conditions */ +@supports (accent-color: auto) and (backdrop-filter: auto) { + a { accent-color: auto; background-filter: auto } +} + +/* Nested @supports */ +@supports (accent-color: auto) { + @supports (backdrop-filter: auto) { + a { accent-color: auto; background-filter: auto } + } +} + +/* Case-insensitive @supports */ +@SUPPORTS (clip-path: fill-box) { a { clip-path: fill-box; } } + +@Supports (accent-color: auto) and (backdrop-filter: auto) { + a { accent-color: auto; backdrop-filter: auto } +} + +@SUPPORTS (accent-color: auto) { + @SuPpOrTs (backdrop-filter: auto) { + a { accent-color: auto; backdrop-filter: auto } + } +} + +/* Doubly nested @supports with same condition */ +@supports (accent-color: auto) { + @supports (accent-color: auto) { + a { accent-color: auto; } + } + a { accent-color: auto; } +} + +/* @supports selector() suppresses the :has check inside the block */ +@supports selector(:has()) { + h1:has(+ h2) { color: red; } +} + +/* Properties with wide browser support not tracked in web-features */ +div { cursor: pointer; } +pre { overflow: auto; } + +/* Multiple selectors */ +.highlight, #highlight, highlight { color: red } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.css.snap new file mode 100644 index 000000000000..48955ac86388 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.css.snap @@ -0,0 +1,95 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: valid.css +--- +# Input +```css +/* should not generate diagnostics */ + +/* Widely available properties - not flagged */ +a { color: red; } +a { color: red; background-color: blue; } +a { color: red; transition: none; } +body { padding: 0; } + +/* Custom properties - always allowed */ +body { --custom-property: red; } + +/* Vendor-prefixed properties - not in baseline data, skipped */ +a { color: red; -moz-transition: bar } + +/* Pseudo-elements that are widely available */ +::before { content: attr(foo); } + +/* At-rules that are widely available */ +@font-face { font-weight: 100 400 } +@media (min-width: 800px) { a { color: red; } } +@container (min-width: 800px) { a { color: red; } } + +/* Media conditions that are widely available */ +@media (prefers-color-scheme: dark) { a { color: red; } } +@media (color-gamut: srgb) { a { color: red; } } + +/* Unknown media conditions - not in data, not flagged */ +@media (foo) { a { color: red; } } + +/* Case-insensitive at-rules */ +@MEDIA (min-width: 800px) { a { color: red; } } +@Media (foo) { a { color: red; } } +@MeDia (prefers-color-scheme: dark) { a { color: red; } } +@MEDIA (color-gamut: srgb) { a { color: red; } } + +/* @supports suppression: property inside @supports is not flagged */ +@supports (accent-color: auto) { a { accent-color: auto; } } +@supports (accent-color: red) { a { accent-color: red; } } +@supports (accent-color: auto) { a { accent-color: red; } } +@supports (clip-path: fill-box) { a { clip-path: fill-box; } } + +/* @supports with compound conditions */ +@supports (accent-color: auto) and (backdrop-filter: auto) { + a { accent-color: auto; background-filter: auto } +} + +/* Nested @supports */ +@supports (accent-color: auto) { + @supports (backdrop-filter: auto) { + a { accent-color: auto; background-filter: auto } + } +} + +/* Case-insensitive @supports */ +@SUPPORTS (clip-path: fill-box) { a { clip-path: fill-box; } } + +@Supports (accent-color: auto) and (backdrop-filter: auto) { + a { accent-color: auto; backdrop-filter: auto } +} + +@SUPPORTS (accent-color: auto) { + @SuPpOrTs (backdrop-filter: auto) { + a { accent-color: auto; backdrop-filter: auto } + } +} + +/* Doubly nested @supports with same condition */ +@supports (accent-color: auto) { + @supports (accent-color: auto) { + a { accent-color: auto; } + } + a { accent-color: auto; } +} + +/* @supports selector() suppresses the :has check inside the block */ +@supports selector(:has()) { + h1:has(+ h2) { color: red; } +} + +/* Properties with wide browser support not tracked in web-features */ +div { cursor: pointer; } +pre { overflow: auto; } + +/* Multiple selectors */ +.highlight, #highlight, highlight { color: red } + +``` + +_Note: The parser emitted 1 diagnostics which are not shown here._ diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.css new file mode 100644 index 000000000000..694974449afc --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.css @@ -0,0 +1,10 @@ +/* should not generate diagnostics */ + +/* Newly available property - ok with "newly" */ +a { backdrop-filter: auto } + +/* Newly available at-rule - ok with "newly" */ +@property --foo { + syntax: "*"; + inherits: false; +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.css.snap new file mode 100644 index 000000000000..c376242a307f --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.css.snap @@ -0,0 +1,18 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: valid.newly.css +--- +# Input +```css +/* should not generate diagnostics */ + +/* Newly available property - ok with "newly" */ +a { backdrop-filter: auto } + +/* Newly available at-rule - ok with "newly" */ +@property --foo { + syntax: "*"; + inherits: false; +} + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.options.json new file mode 100644 index 000000000000..fffee801d985 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.newly.options.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "available": "newly" + } + } + } + } + } +} diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.css b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.css new file mode 100644 index 000000000000..c24c78d1f4e7 --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.css @@ -0,0 +1,7 @@ +/* should not generate diagnostics */ + +/* overscroll-behavior became newly available in 2022 - ok */ +.messages { overscroll-behavior: contain; } + +/* @container is widely available */ +@container (min-width: 800px) { a { color: red; } } diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.css.snap b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.css.snap new file mode 100644 index 000000000000..1eee1f4d145a --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.css.snap @@ -0,0 +1,15 @@ +--- +source: crates/biome_css_analyze/tests/spec_tests.rs +expression: valid.year.css +--- +# Input +```css +/* should not generate diagnostics */ + +/* overscroll-behavior became newly available in 2022 - ok */ +.messages { overscroll-behavior: contain; } + +/* @container is widely available */ +@container (min-width: 800px) { a { color: red; } } + +``` diff --git a/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.options.json b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.options.json new file mode 100644 index 000000000000..42f4e48345aa --- /dev/null +++ b/crates/biome_css_analyze/tests/specs/nursery/useBaseline/valid.year.options.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "nursery": { + "useBaseline": { + "level": "error", + "options": { + "available": 2022 + } + } + } + } + } +} diff --git a/crates/biome_diagnostics_categories/src/categories.rs b/crates/biome_diagnostics_categories/src/categories.rs index 5e5b6b6881e0..dcdd9ed072ff 100644 --- a/crates/biome_diagnostics_categories/src/categories.rs +++ b/crates/biome_diagnostics_categories/src/categories.rs @@ -237,6 +237,7 @@ define_categories! { "lint/nursery/useArraySome": "https://biomejs.dev/linter/rules/use-array-some", "lint/nursery/useArraySortCompare": "https://biomejs.dev/linter/rules/use-array-sort-compare", "lint/nursery/useAwaitThenable": "https://biomejs.dev/linter/rules/use-await-thenable", + "lint/nursery/useBaseline": "https://biomejs.dev/linter/rules/use-baseline", "lint/nursery/useBiomeSuppressionComment": "https://biomejs.dev/linter/rules/use-biome-suppression-comment", "lint/nursery/useConsistentEnumValueType": "https://biomejs.dev/linter/rules/use-consistent-enum-value-type", "lint/nursery/useConsistentGraphqlDescriptions": "https://biomejs.dev/linter/rules/use-consistent-graphql-descriptions", @@ -256,14 +257,15 @@ define_categories! { "lint/nursery/useJsxCurlyBraceConvention": "https://biomejs.dev/linter/rules/use-jsx-curly-brace-convention", "lint/nursery/useLoneAnonymousOperation": "https://biomejs.dev/linter/rules/use-lone-anonymous-operation", "lint/nursery/useLoneExecutableDefinition": "https://biomejs.dev/linter/rules/use-lone-executable-definition", - "lint/nursery/useNullishCoalescing": "https://biomejs.dev/linter/rules/use-nullish-coalescing", "lint/nursery/useMaxParams": "https://biomejs.dev/linter/rules/use-max-params", "lint/nursery/useNamedCaptureGroup": "https://biomejs.dev/linter/rules/use-named-capture-group", + "lint/nursery/useNullishCoalescing": "https://biomejs.dev/linter/rules/use-nullish-coalescing", "lint/nursery/usePlaywrightValidDescribeCallback": "https://biomejs.dev/linter/rules/use-playwright-valid-describe-callback", "lint/nursery/useQwikMethodUsage": "https://biomejs.dev/linter/rules/use-qwik-method-usage", "lint/nursery/useQwikValidLexicalScope": "https://biomejs.dev/linter/rules/use-qwik-valid-lexical-scope", "lint/nursery/useRegexpExec": "https://biomejs.dev/linter/rules/use-regexp-exec", "lint/nursery/useRequiredScripts": "https://biomejs.dev/linter/rules/use-required-scripts", + "lint/nursery/useScopedStyles": "https://biomejs.dev/linter/rules/use-scoped-styles", "lint/nursery/useSortedClasses": "https://biomejs.dev/linter/rules/use-sorted-classes", "lint/nursery/useSpread": "https://biomejs.dev/linter/rules/use-spread", "lint/nursery/useUnicodeRegex": "https://biomejs.dev/linter/rules/use-unicode-regex", @@ -278,7 +280,6 @@ define_categories! { "lint/nursery/useVueDefineMacrosOrder": "https://biomejs.dev/linter/rules/use-vue-define-macros-order", "lint/nursery/useVueHyphenatedAttributes": "https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes", "lint/nursery/useVueMultiWordComponentNames": "https://biomejs.dev/linter/rules/use-vue-multi-word-component-names", - "lint/nursery/useScopedStyles": "https://biomejs.dev/linter/rules/use-scoped-styles", "lint/nursery/useVueVForKey": "https://biomejs.dev/linter/rules/use-vue-v-for-key", "lint/nursery/useVueValidTemplateRoot": "https://biomejs.dev/linter/rules/use-vue-valid-template-root", "lint/nursery/useVueValidVBind": "https://biomejs.dev/linter/rules/use-vue-valid-v-bind", diff --git a/crates/biome_js_analyze/src/lint/nursery/no_redundant_default_export.rs b/crates/biome_js_analyze/src/lint/nursery/no_redundant_default_export.rs index 1a9816cdf714..de7d15882c83 100644 --- a/crates/biome_js_analyze/src/lint/nursery/no_redundant_default_export.rs +++ b/crates/biome_js_analyze/src/lint/nursery/no_redundant_default_export.rs @@ -4,8 +4,9 @@ use biome_console::markup; use biome_diagnostics::Severity; use biome_js_semantic::{Binding, SemanticModel}; use biome_js_syntax::{ - export_ext::{AnyIdentifier, AnyJsExported}, AnyJsBinding, AnyJsBindingPattern, AnyJsExportClause, - AnyJsExpression, AnyJsModuleItem, JsModule, + AnyJsBinding, AnyJsBindingPattern, AnyJsExportClause, AnyJsExpression, AnyJsModuleItem, + JsModule, + export_ext::{AnyIdentifier, AnyJsExported}, }; use biome_rowan::TextRange; use biome_rule_options::no_redundant_default_export::NoRedundantDefaultExportOptions; @@ -14,7 +15,7 @@ use rustc_hash::FxHashSet; declare_lint_rule! { /// Checks if a default export exports the same symbol as a named export. /// - /// This rule warns when a `default` export references the same identifier as a named export. + /// This rule reports new nursery lint rule `useBase when a `default` export references the same identifier as a named export. /// Re-exports are out of scope. /// /// ## Examples @@ -53,13 +54,13 @@ impl Rule for NoRedundantDefaultExport { let module = ctx.query(); let model = ctx.model(); let (named_export_bindings, default_export) = collect_exports(module, model); - + if let Some((binding, range)) = default_export && named_export_bindings.contains(&binding) { return Some(range); } - + None } @@ -96,15 +97,14 @@ fn get_binding_from_identifier( }; Some(model.as_binding(id_binding)) } - AnyIdentifier::AnyTsIdentifierBinding(ts_binding) => { - ts_binding - .as_ts_identifier_binding() - .map(|binding| model.as_binding(binding)) - } + AnyIdentifier::AnyTsIdentifierBinding(ts_binding) => ts_binding + .as_ts_identifier_binding() + .map(|binding| model.as_binding(binding)), AnyIdentifier::JsReferenceIdentifier(ref_id) => model.binding(ref_id), - AnyIdentifier::JsIdentifierExpression(id_expr) => { - id_expr.name().ok().and_then(|ref_id| model.binding(&ref_id)) - } + AnyIdentifier::JsIdentifierExpression(id_expr) => id_expr + .name() + .ok() + .and_then(|ref_id| model.binding(&ref_id)), AnyIdentifier::JsLiteralExportName(_) => None, } } @@ -121,8 +121,10 @@ fn resolve_binding_and_range_from_exported_item( model: &SemanticModel, ) -> Option<(Binding, Option)> { if exported_item.is_default - && let Some(AnyJsExported::JsFunctionExportDefaultDeclaration(_) | AnyJsExported::JsClassExportDefaultDeclaration(_)) = - exported_item.exported.as_ref() + && let Some( + AnyJsExported::JsFunctionExportDefaultDeclaration(_) + | AnyJsExported::JsClassExportDefaultDeclaration(_), + ) = exported_item.exported.as_ref() { return None; } diff --git a/crates/biome_rule_options/src/lib.rs b/crates/biome_rule_options/src/lib.rs index 9bbf6842a310..ad6b7d1d75fb 100644 --- a/crates/biome_rule_options/src/lib.rs +++ b/crates/biome_rule_options/src/lib.rs @@ -312,6 +312,7 @@ pub mod use_as_const_assertion; pub mod use_at_index; pub mod use_await; pub mod use_await_thenable; +pub mod use_baseline; pub mod use_biome_ignore_folder; pub mod use_block_statements; pub mod use_button_type; diff --git a/crates/biome_rule_options/src/use_baseline.rs b/crates/biome_rule_options/src/use_baseline.rs new file mode 100644 index 000000000000..64836b640900 --- /dev/null +++ b/crates/biome_rule_options/src/use_baseline.rs @@ -0,0 +1,102 @@ +use biome_deserialize::{ + Deserializable, DeserializableType, DeserializableValue, DeserializationContext, +}; +use biome_deserialize_macros::{Deserializable, Merge}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +/// The Baseline availability level to target. +/// +/// - `"widely"` – warn on anything not Baseline widely available. +/// - `"newly"` – warn on anything not at least Baseline newly available. +/// - A year (e.g. `2023`) – warn on anything whose `baseline_low_date` is after +/// that year (i.e. became newly available after that year). +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +#[serde(untagged)] +pub enum AvailabilityTarget { + /// A named tier: `"widely"` or `"newly"`. + Named(AvailabilityNamed), + /// A year cutoff (e.g. `2023`). + Year(u16), +} + +impl Default for AvailabilityTarget { + fn default() -> Self { + Self::Named(AvailabilityNamed::Widely) + } +} + +impl biome_deserialize::Merge for AvailabilityTarget { + fn merge_with(&mut self, other: Self) { + *self = other; + } +} + +impl Deserializable for AvailabilityTarget { + fn deserialize( + ctx: &mut impl DeserializationContext, + value: &impl DeserializableValue, + name: &str, + ) -> Option { + Some(if value.visitable_type()? == DeserializableType::Str { + Self::Named(::deserialize( + ctx, value, name, + )?) + } else { + Self::Year(::deserialize(ctx, value, name)?) + }) + } +} + +/// Named Baseline availability tiers. +#[derive(Default, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Deserializable, Merge)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +#[serde(rename_all = "lowercase")] +pub enum AvailabilityNamed { + /// Warn on anything not Baseline widely available (default). + #[default] + Widely, + /// Warn on anything not at least Baseline newly available. + Newly, +} + +/// Options for the `useBaseline` rule. +#[derive(Default, Clone, Debug, Deserialize, Deserializable, Merge, Eq, PartialEq, Serialize)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +#[serde(rename_all = "camelCase", deny_unknown_fields, default)] +pub struct UseBaselineOptions { + /// The availability level to target. Defaults to `"widely"`. + #[serde(skip_serializing_if = "AvailabilityTarget::is_default")] + pub available: AvailabilityTarget, + + /// CSS properties to exclude from checking (case-insensitive). + #[serde(skip_serializing_if = "Vec::is_empty")] + pub allow_properties: Vec, + + /// CSS at-rules to exclude from checking (without `@`, case-insensitive). + #[serde(skip_serializing_if = "Vec::is_empty")] + pub allow_at_rules: Vec, + + /// CSS value functions to exclude from checking (case-insensitive). + #[serde(skip_serializing_if = "Vec::is_empty")] + pub allow_functions: Vec, + + /// CSS media conditions to exclude from checking (case-insensitive). + #[serde(skip_serializing_if = "Vec::is_empty")] + pub allow_media_conditions: Vec, + + /// CSS property values to exclude from checking (maps property name to allowed values, case-insensitive). + #[serde(skip_serializing_if = "HashMap::is_empty")] + pub allow_property_values: HashMap>, + + /// CSS pseudo-selectors to exclude from checking (without `:` or `::`, case-insensitive). + #[serde(skip_serializing_if = "Vec::is_empty")] + pub allow_selectors: Vec, +} + +impl AvailabilityTarget { + fn is_default(&self) -> bool { + matches!(self, Self::Named(AvailabilityNamed::Widely)) + } +} diff --git a/justfile b/justfile index 65522097e9f4..ae4fce3d085b 100644 --- a/justfile +++ b/justfile @@ -56,6 +56,9 @@ gen-analyzer: gen-rules: cargo run -p xtask_codegen -- analyzer +# Generates Baseline data for CSS features from web-features +gen-css-baseline: + cargo run -p xtask_codegen --features xtask_codegen/external_data -- css-baseline gen-configuration: cargo run -p xtask_codegen --features configuration -- configuration diff --git a/packages/@biomejs/backend-jsonrpc/src/workspace.ts b/packages/@biomejs/backend-jsonrpc/src/workspace.ts index 3288cff34b0d..d06a6f091d06 100644 --- a/packages/@biomejs/backend-jsonrpc/src/workspace.ts +++ b/packages/@biomejs/backend-jsonrpc/src/workspace.ts @@ -2335,6 +2335,11 @@ See https://biomejs.dev/linter/rules/use-await-thenable */ useAwaitThenable?: UseAwaitThenableConfiguration; /** + * Disallow CSS properties, values, at-rules, functions, and selectors that are not part of the configured Baseline. +See https://biomejs.dev/linter/rules/use-baseline + */ + useBaseline?: UseBaselineConfiguration; + /** * Disallow enums from having both number and string members. See https://biomejs.dev/linter/rules/use-consistent-enum-value-type */ @@ -4234,6 +4239,9 @@ export type UseArraySortCompareConfiguration = export type UseAwaitThenableConfiguration = | RulePlainConfiguration | RuleWithUseAwaitThenableOptions; +export type UseBaselineConfiguration = + | RulePlainConfiguration + | RuleWithUseBaselineOptions; export type UseConsistentEnumValueTypeConfiguration = | RulePlainConfiguration | RuleWithUseConsistentEnumValueTypeOptions; @@ -5930,6 +5938,10 @@ export interface RuleWithUseAwaitThenableOptions { level: RulePlainConfiguration; options?: UseAwaitThenableOptions; } +export interface RuleWithUseBaselineOptions { + level: RulePlainConfiguration; + options?: UseBaselineOptions; +} export interface RuleWithUseConsistentEnumValueTypeOptions { level: RulePlainConfiguration; options?: UseConsistentEnumValueTypeOptions; @@ -7402,6 +7414,39 @@ export type NoVueVIfWithVForOptions = {}; export type UseArraySomeOptions = {}; export type UseArraySortCompareOptions = {}; export type UseAwaitThenableOptions = {}; +/** + * Options for the `useBaseline` rule. + */ +export interface UseBaselineOptions { + /** + * CSS at-rules to exclude from checking (without `@`, case-insensitive). + */ + allowAtRules?: string[]; + /** + * CSS value functions to exclude from checking (case-insensitive). + */ + allowFunctions?: string[]; + /** + * CSS media conditions to exclude from checking (case-insensitive). + */ + allowMediaConditions?: string[]; + /** + * CSS properties to exclude from checking (case-insensitive). + */ + allowProperties?: string[]; + /** + * CSS property values to exclude from checking (maps property name to allowed values, case-insensitive). + */ + allowPropertyValues?: Record; + /** + * CSS pseudo-selectors to exclude from checking (without `:` or `::`, case-insensitive). + */ + allowSelectors?: string[]; + /** + * The availability level to target. Defaults to `"widely"`. + */ + available?: AvailabilityTarget; +} export type UseConsistentEnumValueTypeOptions = {}; export interface UseConsistentGraphqlDescriptionsOptions { /** @@ -7962,6 +8007,15 @@ while for `useState()` it would be `[1]`. stableResult?: StableHookResult; } export type Regex = string; +/** + * The Baseline availability level to target. + +- `"widely"` – warn on anything not Baseline widely available. +- `"newly"` – warn on anything not at least Baseline newly available. +- A year (e.g. `2023`) – warn on anything whose `baseline_low_date` is after + that year (i.e. became newly available after that year). + */ +export type AvailabilityTarget = AvailabilityNamed | number; /** * The GraphQL description style to enforce. */ @@ -8004,6 +8058,10 @@ export interface Convention { } export type GroupMatcher = ImportMatcher | SourceMatcher; export type StableHookResult = boolean | number[] | string[]; +/** + * Named Baseline availability tiers. + */ +export type AvailabilityNamed = "widely" | "newly"; export interface PathOptions { /** * Names of the exported members that allowed to be not be used. @@ -8411,6 +8469,7 @@ export type Category = | "lint/nursery/useArraySome" | "lint/nursery/useArraySortCompare" | "lint/nursery/useAwaitThenable" + | "lint/nursery/useBaseline" | "lint/nursery/useBiomeSuppressionComment" | "lint/nursery/useConsistentEnumValueType" | "lint/nursery/useConsistentGraphqlDescriptions" @@ -8430,14 +8489,15 @@ export type Category = | "lint/nursery/useJsxCurlyBraceConvention" | "lint/nursery/useLoneAnonymousOperation" | "lint/nursery/useLoneExecutableDefinition" - | "lint/nursery/useNullishCoalescing" | "lint/nursery/useMaxParams" | "lint/nursery/useNamedCaptureGroup" + | "lint/nursery/useNullishCoalescing" | "lint/nursery/usePlaywrightValidDescribeCallback" | "lint/nursery/useQwikMethodUsage" | "lint/nursery/useQwikValidLexicalScope" | "lint/nursery/useRegexpExec" | "lint/nursery/useRequiredScripts" + | "lint/nursery/useScopedStyles" | "lint/nursery/useSortedClasses" | "lint/nursery/useSpread" | "lint/nursery/useUnicodeRegex" @@ -8452,7 +8512,6 @@ export type Category = | "lint/nursery/useVueDefineMacrosOrder" | "lint/nursery/useVueHyphenatedAttributes" | "lint/nursery/useVueMultiWordComponentNames" - | "lint/nursery/useScopedStyles" | "lint/nursery/useVueVForKey" | "lint/nursery/useVueValidTemplateRoot" | "lint/nursery/useVueValidVBind" diff --git a/packages/@biomejs/biome/configuration_schema.json b/packages/@biomejs/biome/configuration_schema.json index 9674bfb4b581..ecb2c60cb9c5 100644 --- a/packages/@biomejs/biome/configuration_schema.json +++ b/packages/@biomejs/biome/configuration_schema.json @@ -390,6 +390,37 @@ "additionalProperties": false }, "AttributePosition": { "type": "string", "enum": ["auto", "multiline"] }, + "AvailabilityNamed": { + "description": "Named Baseline availability tiers.", + "oneOf": [ + { + "description": "Warn on anything not Baseline widely available (default).", + "type": "string", + "const": "widely" + }, + { + "description": "Warn on anything not at least Baseline newly available.", + "type": "string", + "const": "newly" + } + ] + }, + "AvailabilityTarget": { + "description": "The Baseline availability level to target.\n\n- `\"widely\"` – warn on anything not Baseline widely available.\n- `\"newly\"` – warn on anything not at least Baseline newly available.\n- A year (e.g. `2023`) – warn on anything whose `baseline_low_date` is after\n that year (i.e. became newly available after that year).", + "anyOf": [ + { + "description": "A named tier: `\"widely\"` or `\"newly\"`.", + "$ref": "#/$defs/AvailabilityNamed" + }, + { + "description": "A year cutoff (e.g. `2023`).", + "type": "integer", + "format": "uint16", + "maximum": 65535, + "minimum": 0 + } + ] + }, "Bool": { "type": "boolean" }, "BracketSameLine": { "description": "Put the `>` of a multi-line HTML or JSX element at the end of the last line instead of being alone on the next line (does not apply to self closing elements).", @@ -6162,6 +6193,13 @@ { "type": "null" } ] }, + "useBaseline": { + "description": "Disallow CSS properties, values, at-rules, functions, and selectors that are not part of the configured Baseline.\nSee https://biomejs.dev/linter/rules/use-baseline", + "anyOf": [ + { "$ref": "#/$defs/UseBaselineConfiguration" }, + { "type": "null" } + ] + }, "useConsistentEnumValueType": { "description": "Disallow enums from having both number and string members.\nSee https://biomejs.dev/linter/rules/use-consistent-enum-value-type", "anyOf": [ @@ -9902,6 +9940,15 @@ "additionalProperties": false, "required": ["level"] }, + "RuleWithUseBaselineOptions": { + "type": "object", + "properties": { + "level": { "$ref": "#/$defs/RulePlainConfiguration" }, + "options": { "$ref": "#/$defs/UseBaselineOptions" } + }, + "additionalProperties": false, + "required": ["level"] + }, "RuleWithUseBiomeIgnoreFolderOptions": { "type": "object", "properties": { @@ -12968,6 +13015,56 @@ "type": "object", "additionalProperties": false }, + "UseBaselineConfiguration": { + "oneOf": [ + { "$ref": "#/$defs/RulePlainConfiguration" }, + { "$ref": "#/$defs/RuleWithUseBaselineOptions" } + ] + }, + "UseBaselineOptions": { + "description": "Options for the `useBaseline` rule.", + "type": "object", + "properties": { + "allowAtRules": { + "description": "CSS at-rules to exclude from checking (without `@`, case-insensitive).", + "type": "array", + "items": { "type": "string" } + }, + "allowFunctions": { + "description": "CSS value functions to exclude from checking (case-insensitive).", + "type": "array", + "items": { "type": "string" } + }, + "allowMediaConditions": { + "description": "CSS media conditions to exclude from checking (case-insensitive).", + "type": "array", + "items": { "type": "string" } + }, + "allowProperties": { + "description": "CSS properties to exclude from checking (case-insensitive).", + "type": "array", + "items": { "type": "string" } + }, + "allowPropertyValues": { + "description": "CSS property values to exclude from checking (maps property name to allowed values, case-insensitive).", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { "type": "string" } + } + }, + "allowSelectors": { + "description": "CSS pseudo-selectors to exclude from checking (without `:` or `::`, case-insensitive).", + "type": "array", + "items": { "type": "string" } + }, + "available": { + "description": "The availability level to target. Defaults to `\"widely\"`.", + "$ref": "#/$defs/AvailabilityTarget" + } + }, + "additionalProperties": false + }, "UseBiomeIgnoreFolderConfiguration": { "oneOf": [ { "$ref": "#/$defs/RulePlainConfiguration" }, diff --git a/xtask/codegen/Cargo.toml b/xtask/codegen/Cargo.toml index 0fee20cec4e7..ee80c211ad32 100644 --- a/xtask/codegen/Cargo.toml +++ b/xtask/codegen/Cargo.toml @@ -61,7 +61,7 @@ configuration = [ "biome_rowan", "pulldown-cmark", ] -license = ["serde", "serde_json", "ureq/default", "ureq/json"] +external_data = ["serde", "serde_json", "ureq/default", "ureq/json"] schema = [ "biome_analyze", "biome_configuration", diff --git a/xtask/codegen/src/generate_css_baseline.rs b/xtask/codegen/src/generate_css_baseline.rs new file mode 100644 index 000000000000..fab45549b301 --- /dev/null +++ b/xtask/codegen/src/generate_css_baseline.rs @@ -0,0 +1,566 @@ +use anyhow::Context; +use proc_macro2::Literal; +use quote::quote; +use serde::Deserialize; +use std::collections::BTreeMap; +use ureq::get; +use xtask_codegen::update; +use xtask_glue::{Mode, Result, project_root}; + +const WEB_FEATURES_DATA_URL: &str = "https://unpkg.com/web-features/data.json"; + +#[derive(Debug, Deserialize)] +struct WebFeaturesData { + features: BTreeMap, +} + +/// A single entry in `features`. We only care about `"feature"` kind entries. +#[derive(Debug, Deserialize)] +#[serde(tag = "kind", rename_all = "lowercase")] +enum FeatureEntry { + Feature(Feature), + /// Redirected to another feature — ignored. + #[serde(other)] + Other, +} + +#[derive(Debug, Deserialize)] +struct Feature { + status: FeatureStatus, + #[serde(default)] + compat_features: Vec, +} + +#[derive(Debug, Deserialize)] +struct FeatureStatus { + baseline: BaselineValue, + baseline_low_date: Option, +} + +/// The `baseline` field can be `"high"`, `"low"`, or `false`. +#[derive(Debug, Deserialize, Clone, Copy, PartialEq, Eq)] +#[serde(untagged)] +enum BaselineValue { + Named(BaselineNamed), + Limited(bool), // always false when present +} + +#[derive(Debug, Deserialize, Clone, Copy, PartialEq, Eq)] +#[serde(rename_all = "lowercase")] +enum BaselineNamed { + High, + Low, +} + +/// Extract the year from an optional baseline_low_date string. +fn extract_year(low_date: Option<&str>) -> Option { + let date = low_date?; + // Dates are formatted as "YYYY-MM-DD" or "≤YYYY-MM-DD" + let date = date.trim_start_matches('≤'); + date.get(..4).and_then(|y| y.parse::().ok()) +} + +#[derive(Debug, Clone, Copy)] +struct Status { + tier: Tier, + year: Option, +} + +#[derive(Debug, Clone, Copy)] +enum Tier { + Limited, + Newly, + Widely, +} + +fn map_status(baseline: BaselineValue, low_date: Option<&str>) -> Status { + let tier = match baseline { + BaselineValue::Named(BaselineNamed::High) => Tier::Widely, + BaselineValue::Named(BaselineNamed::Low) => Tier::Newly, + BaselineValue::Limited(_) => Tier::Limited, + }; + Status { + tier, + year: extract_year(low_date), + } +} + +/// Regex-free pattern matching for CSS compat keys. +/// Returns `None` if the key doesn't match the given category. +fn match_css_property(key: &str) -> Option<&str> { + // css.properties. (no further dots — excludes value sub-keys) + let rest = key.strip_prefix("css.properties.")?; + if rest.contains('.') { + return None; + } + Some(rest) +} + +fn match_css_property_value(key: &str) -> Option<(&str, &str)> { + // css.properties.. (exactly one more level, no underscores in value) + let rest = key.strip_prefix("css.properties.")?; + let (prop, val) = rest.split_once('.')?; + // ESLint skips keys where value contains underscore (those are descriptions, not syntax) + if val.contains('_') { + return None; + } + // Exclude any further nesting + if val.contains('.') { + return None; + } + Some((prop, val)) +} + +fn match_css_at_rule(key: &str) -> Option<&str> { + // css.at-rules. (no further dots) + let rest = key.strip_prefix("css.at-rules.")?; + if rest.contains('.') { + return None; + } + Some(rest) +} + +fn match_css_media_condition(key: &str) -> Option<&str> { + // css.at-rules.media. (exactly one more level) + let rest = key.strip_prefix("css.at-rules.media.")?; + if rest.contains('.') { + return None; + } + Some(rest) +} + +fn match_css_selector(key: &str) -> Option<&str> { + // css.selectors. (no further dots) + let rest = key.strip_prefix("css.selectors.")?; + if rest.contains('.') { + return None; + } + Some(rest) +} + +fn match_css_function(key: &str) -> Option<&str> { + // css.types. + // We only want entries that correspond to actual CSS functions (end in "()") + // in the mdn-data CSS functions list — but we don't have mdn-data here. + // ESLint uses `mdn-data` to check if `name + "()"` is a known CSS function. + // We replicate by checking the known set of CSS type keys that are functions. + // The key format is css.types. or css.types.. + let rest = key.strip_prefix("css.types.")?; + // Take the last segment + let name = rest.split('.').next_back()?; + // Heuristic: if it ends with no underscore and is a single segment, + // it's a candidate. We'll validate against known function names below. + Some(name) +} + +// ── Main extraction ────────────────────────────────────────────────────────── + +struct CssFeatures { + /// (property_name, status) — sorted by name + properties: Vec<(String, Status)>, + /// (property_name, value_name, status) — sorted by (prop, value) + property_values: Vec<(String, String, Status)>, + /// (at_rule_name, status) — sorted by name + at_rules: Vec<(String, Status)>, + /// (media_condition_name, status) — sorted by name + media_conditions: Vec<(String, Status)>, + /// (function_name, status) — sorted by name + functions: Vec<(String, Status)>, + /// (selector_name, status) — sorted by name + selectors: Vec<(String, Status)>, +} + +/// Properties that aren't considered baseline but have wide support. +/// https://github.com/web-platform-dx/web-features/issues/1038#issuecomment-2627370691 +const WIDE_SUPPORT_PROPERTIES: &[&str] = &["cursor"]; + +/// Compare baseline tiers: Widely > Newly > Limited. +fn tier_rank(tier: Tier) -> u8 { + match tier { + Tier::Limited => 0, + Tier::Newly => 1, + Tier::Widely => 2, + } +} + +/// Insert or update the map to keep the highest-tier status. +fn update_best(map: &mut BTreeMap, key: K, status: Status) { + map.entry(key) + .and_modify(|existing| { + if tier_rank(status.tier) > tier_rank(existing.tier) { + *existing = status; + } + }) + .or_insert(status); +} + +fn extract_css_features(data: &WebFeaturesData) -> CssFeatures { + let mut properties: BTreeMap = BTreeMap::new(); + let mut property_values: BTreeMap<(String, String), Status> = BTreeMap::new(); + let mut at_rules: BTreeMap = BTreeMap::new(); + let mut media_conditions: BTreeMap = BTreeMap::new(); + let mut functions_map: BTreeMap = BTreeMap::new(); + let mut selectors: BTreeMap = BTreeMap::new(); + + for entry in data.features.values() { + let feature = match entry { + FeatureEntry::Feature(f) => f, + FeatureEntry::Other => continue, + }; + + // Use the feature-level status for all compat keys. + // The per-compat-key status may differ and is less reliable. + // ESLint's generate-baseline.js uses the feature-level status. + let feature_status = map_status( + feature.status.baseline, + feature.status.baseline_low_date.as_deref(), + ); + + for key in &feature.compat_features { + if !key.starts_with("css.") { + continue; + } + let status = feature_status; + + if let Some(prop) = match_css_property(key) { + if !WIDE_SUPPORT_PROPERTIES.contains(&prop) { + update_best(&mut properties, prop.to_string(), status); + } + continue; + } + + if let Some((prop, val)) = match_css_property_value(key) { + if !WIDE_SUPPORT_PROPERTIES.contains(&prop) { + update_best( + &mut property_values, + (prop.to_string(), val.to_string()), + status, + ); + } + continue; + } + + if let Some(at_rule) = match_css_at_rule(key) { + update_best(&mut at_rules, at_rule.to_string(), status); + continue; + } + + if let Some(condition) = match_css_media_condition(key) { + update_best(&mut media_conditions, condition.to_string(), status); + continue; + } + + if let Some(name) = match_css_function(key) { + // Only include if it appears to be a function (not a generic type) + // We use the same set ESLint uses from mdn-data css.functions + if is_known_css_function(name) { + update_best(&mut functions_map, name.to_string(), status); + } + continue; + } + + if let Some(sel) = match_css_selector(key) { + update_best(&mut selectors, sel.to_string(), status); + } + } // inner loop over compat_features + } // outer loop over features + + CssFeatures { + properties: properties.into_iter().collect(), + property_values: property_values + .into_iter() + .map(|((p, v), s)| (p, v, s)) + .collect(), + at_rules: at_rules.into_iter().collect(), + media_conditions: media_conditions.into_iter().collect(), + functions: functions_map.into_iter().collect(), + selectors: selectors.into_iter().collect(), + } +} + +// This mirrors what ESLint extracts from mdn-data's css.functions list. +// These are function names (without parentheses) that exist as CSS value functions. + +fn is_known_css_function(name: &str) -> bool { + // This list is derived from mdn-data/css/functions.json keys (strip parens) + const KNOWN: &[&str] = &[ + "abs", + "acos", + "annotation", + "asin", + "atan", + "atan2", + "attr", + "blur", + "brightness", + "calc", + "calc-size", + "character-variant", + "circle", + "clamp", + "color", + "color-mix", + "conic-gradient", + "contrast", + "cos", + "counter", + "counters", + "cross-fade", + "cubic-bezier", + "device-cmyk", + "drop-shadow", + "element", + "ellipse", + "env", + "exp", + "fit-content", + "format", + "grayscale", + "hsl", + "hsla", + "hue-rotate", + "hwb", + "hypot", + "image", + "image-set", + "inset", + "invert", + "lab", + "layer", + "lch", + "leader", + "light-dark", + "linear", + "linear-gradient", + "local", + "log", + "matrix", + "matrix3d", + "max", + "min", + "minmax", + "mod", + "oklab", + "oklch", + "opacity", + "ornaments", + "paint", + "path", + "perspective", + "polygon", + "pow", + "radial-gradient", + "ray", + "rect", + "rem", + "repeat", + "repeating-conic-gradient", + "repeating-linear-gradient", + "repeating-radial-gradient", + "rgb", + "rgba", + "rotate", + "rotate3d", + "rotateX", + "rotateY", + "rotateZ", + "round", + "saturate", + "scale", + "scale3d", + "scaleX", + "scaleY", + "scaleZ", + "sepia", + "sign", + "sin", + "skew", + "skewX", + "skewY", + "sqrt", + "steps", + "string", + "styleset", + "stylistic", + "supports", + "swash", + "symbols", + "tan", + "target-counter", + "target-counters", + "target-text", + "translate", + "translate3d", + "translateX", + "translateY", + "translateZ", + "url", + "var", + "xywh", + "anchor", + "anchor-size", + ]; + KNOWN.contains(&name) +} + +fn tier_tokens(tier: Tier) -> proc_macro2::TokenStream { + match tier { + Tier::Widely => quote! { BaselineTier::Widely }, + Tier::Newly => quote! { BaselineTier::Newly }, + Tier::Limited => quote! { BaselineTier::Limited }, + } +} + +fn year_tokens(year: Option) -> proc_macro2::TokenStream { + match year { + Some(y) => quote! { BaselineYear::Known(#y) }, + None => quote! { BaselineYear::Unknown }, + } +} + +fn status_entry(status: &Status) -> proc_macro2::TokenStream { + let tier = tier_tokens(status.tier); + let year = year_tokens(status.year); + quote! { BaselineStatus { tier: #tier, year: #year } } +} + +fn phf_map_entries(items: &[(String, Status)]) -> Vec { + items + .iter() + .map(|(name, status)| { + let name_lit = Literal::string(name); + let entry = status_entry(status); + quote! { #name_lit => #entry } + }) + .collect() +} + +fn generate_code(features: CssFeatures) -> proc_macro2::TokenStream { + let properties = phf_map_entries(&features.properties); + let at_rules = phf_map_entries(&features.at_rules); + let media_conditions = phf_map_entries(&features.media_conditions); + let functions = phf_map_entries(&features.functions); + let selectors = phf_map_entries(&features.selectors); + + // Property values: flat map keyed by "property:value". + let property_values: Vec<_> = features + .property_values + .iter() + .map(|(prop, val, status)| { + let key_lit = Literal::string(&format!("{prop}:{val}")); + let entry = status_entry(status); + quote! { #key_lit => #entry } + }) + .collect(); + + quote! { + /// The Baseline availability tier of a CSS feature. + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub enum BaselineTier { + /// Not yet supported in all core browsers. + Limited, + /// Supported in all core browsers for less than 30 months. + Newly, + /// Supported in all core browsers for at least 30 months. + Widely, + } + + /// The year a CSS feature became Baseline newly-available. + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub enum BaselineYear { + /// The year the feature became newly available. + Known(u16), + /// No date is recorded for when this feature became available. + Unknown, + } + + /// The combined Baseline status of a CSS feature. + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub struct BaselineStatus { + pub tier: BaselineTier, + pub year: BaselineYear, + } + + /// Look up the Baseline status of a feature by name. + pub fn find_baseline( + table: &phf::Map<&'static str, BaselineStatus>, + name: &str, + ) -> Option { + table.get(name).copied() + } + + /// Look up the Baseline status of a specific CSS property value. + /// The key format is `"property:value"` (lowercase). + pub fn find_property_value_baseline(property: &str, value: &str) -> Option { + let key = format!("{property}:{value}"); + BASELINE_PROPERTY_VALUES.get(key.as_str()).copied() + } + + /// Baseline status for CSS properties. + pub static BASELINE_PROPERTIES: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + #( #properties ),* + }; + + /// Baseline status for CSS property values (identifier keywords only). + /// Keys are in `"property:value"` format (lowercase). + pub static BASELINE_PROPERTY_VALUES: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + #( #property_values ),* + }; + + /// Baseline status for CSS at-rules. + pub static BASELINE_AT_RULES: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + #( #at_rules ),* + }; + + /// Baseline status for CSS media query conditions. + pub static BASELINE_MEDIA_CONDITIONS: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + #( #media_conditions ),* + }; + + /// Baseline status for CSS value functions. + pub static BASELINE_FUNCTIONS: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + #( #functions ),* + }; + + /// Baseline status for CSS pseudo-class and pseudo-element selectors. + pub static BASELINE_SELECTORS: phf::Map<&'static str, BaselineStatus> = phf::phf_map! { + #( #selectors ),* + }; + } +} + +pub fn generate_css_baseline(mode: Mode) -> Result<()> { + eprintln!("Fetching web-features data from {WEB_FEATURES_DATA_URL}"); + + let mut response = get(WEB_FEATURES_DATA_URL) + .call() + .context("Failed to fetch web-features data")?; + + let data: WebFeaturesData = response + .body_mut() + .read_json() + .context("Failed to parse web-features JSON")?; + + eprintln!("Loaded {} features", data.features.len()); + + let features = extract_css_features(&data); + + eprintln!( + "Extracted: {} properties, {} property values, {} at-rules, {} media conditions, {} functions, {} selectors", + features.properties.len(), + features.property_values.len(), + features.at_rules.len(), + features.media_conditions.len(), + features.functions.len(), + features.selectors.len(), + ); + + let tokens = generate_code(features); + let output_path = project_root().join("crates/biome_css_analyze/src/baseline_data.rs"); + + let content = &xtask_glue::reformat_with_command(tokens.to_string(), "baseline")?; + + update(output_path.as_path(), content, &mode)?; + + Ok(()) +} diff --git a/xtask/codegen/src/lib.rs b/xtask/codegen/src/lib.rs index ee78062c1561..f407e1019f08 100644 --- a/xtask/codegen/src/lib.rs +++ b/xtask/codegen/src/lib.rs @@ -120,6 +120,9 @@ pub enum TaskCommand { /// Generates unicode table inside lexer #[bpaf(command)] Unicode, + /// Generates Baseline data for CSS features from web-features + #[bpaf(command, long("css-baseline"))] + CssBaseline, /// Creates a new lint rule #[bpaf(command, long("new-lintrule"))] NewRule { diff --git a/xtask/codegen/src/main.rs b/xtask/codegen/src/main.rs index 67c5c14919b2..d165c15290fd 100644 --- a/xtask/codegen/src/main.rs +++ b/xtask/codegen/src/main.rs @@ -2,7 +2,9 @@ mod generate_bindings; #[cfg(feature = "configuration")] mod generate_configuration; -#[cfg(feature = "license")] +#[cfg(feature = "external_data")] +mod generate_css_baseline; +#[cfg(feature = "external_data")] mod generate_license; #[cfg(feature = "configuration")] mod generate_migrate_eslint; @@ -15,8 +17,9 @@ use crate::generate_bindings::generate_workspace_bindings; use crate::generate_configuration::generate_rule_options; #[cfg(feature = "configuration")] use crate::generate_configuration::generate_rules_configuration; - -#[cfg(feature = "license")] +#[cfg(feature = "external_data")] +use crate::generate_css_baseline::generate_css_baseline; +#[cfg(feature = "external_data")] use crate::generate_license::generate_license; #[cfg(feature = "configuration")] use crate::generate_migrate_eslint::generate_migrate_eslint; @@ -61,7 +64,7 @@ fn main() -> Result<()> { generate_workspace_bindings(Overwrite)?; } TaskCommand::License => { - #[cfg(feature = "license")] + #[cfg(feature = "external_data")] generate_license(Overwrite)?; } TaskCommand::Grammar(language_list) => { @@ -70,6 +73,10 @@ fn main() -> Result<()> { TaskCommand::Unicode => { generate_tables()?; } + TaskCommand::CssBaseline => { + #[cfg(feature = "external_data")] + generate_css_baseline(Overwrite)?; + } TaskCommand::NewRule { category, name,