// Generated by tools/generate-expressions.mbtx.

///|
pub trait LengthMathInput {
  fn length_math(Self) -> MathExpr[Length]
}

///|
pub fn[T : LengthMathInput] math_length(value : T) -> MathExpr[Length] {
  value.length_math()
}

///|
pub impl LengthMathInput for Length with fn length_math(self) {
  math_expression(
    literal_expression(self.to_css(), "length").constrain("math:length"),
  )
}

///|
pub impl LengthMathInput for Token[Length] with fn length_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:length"),
  )
}

///|
pub impl LengthMathInput for DynamicSlot[Length] with fn length_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:length"),
  )
}

///|
pub impl LengthMathInput for MathExpr[Length] with fn length_math(self) {
  self
}

///|
pub extend Length with LengthMathInput::{length_math}

///|
pub extend Token with LengthMathInput::{length_math}

///|
pub extend DynamicSlot with LengthMathInput::{length_math}

///|
pub extend MathExpr with LengthMathInput::{length_math}

///|
pub trait LengthPercentageMathInput {
  fn length_percentage_math(Self) -> MathExpr[LengthPercentage]
}

///|
pub fn[T : LengthPercentageMathInput] math_length_percentage(
  value : T,
) -> MathExpr[LengthPercentage] {
  value.length_percentage_math()
}

///|
pub impl LengthPercentageMathInput for LengthPercentage with fn length_percentage_math(
  self,
) {
  math_expression(
    literal_expression(self.to_css(), "length-percentage").constrain(
      "math:length-percentage",
    ),
  )
}

///|
pub impl LengthPercentageMathInput for Token[LengthPercentage] with fn length_percentage_math(
  self,
) {
  math_expression(
    reference_expression(self.variable_use()).constrain(
      "math:length-percentage",
    ),
  )
}

///|
pub impl LengthPercentageMathInput for DynamicSlot[LengthPercentage] with fn length_percentage_math(
  self,
) {
  math_expression(
    reference_expression(self.variable_use()).constrain(
      "math:length-percentage",
    ),
  )
}

///|
pub impl LengthPercentageMathInput for MathExpr[LengthPercentage] with fn length_percentage_math(
  self,
) {
  self
}

///|
pub extend LengthPercentage with LengthPercentageMathInput::{
  length_percentage_math,
}

///|
pub extend Token with LengthPercentageMathInput::{length_percentage_math}

///|
pub extend DynamicSlot with LengthPercentageMathInput::{length_percentage_math}

///|
pub extend MathExpr with LengthPercentageMathInput::{length_percentage_math}

///|
pub trait PercentageMathInput {
  fn percentage_math(Self) -> MathExpr[Percentage]
}

///|
pub fn[T : PercentageMathInput] math_percentage(
  value : T,
) -> MathExpr[Percentage] {
  value.percentage_math()
}

///|
pub impl PercentageMathInput for Percentage with fn percentage_math(self) {
  math_expression(
    literal_expression(self.to_css(), "percentage").constrain("math:percentage"),
  )
}

///|
pub impl PercentageMathInput for Token[Percentage] with fn percentage_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:percentage"),
  )
}

///|
pub impl PercentageMathInput for DynamicSlot[Percentage] with fn percentage_math(
  self,
) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:percentage"),
  )
}

///|
pub impl PercentageMathInput for MathExpr[Percentage] with fn percentage_math(
  self,
) {
  self
}

///|
pub extend Percentage with PercentageMathInput::{percentage_math}

///|
pub extend Token with PercentageMathInput::{percentage_math}

///|
pub extend DynamicSlot with PercentageMathInput::{percentage_math}

///|
pub extend MathExpr with PercentageMathInput::{percentage_math}

///|
pub trait NumberMathInput {
  fn number_math(Self) -> MathExpr[Number]
}

///|
pub fn[T : NumberMathInput] math_number(value : T) -> MathExpr[Number] {
  value.number_math()
}

///|
pub impl NumberMathInput for Number with fn number_math(self) {
  math_expression(
    literal_expression(self.to_css(), "number").constrain("math:number"),
  )
}

///|
pub impl NumberMathInput for Token[Number] with fn number_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:number"),
  )
}

///|
pub impl NumberMathInput for DynamicSlot[Number] with fn number_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:number"),
  )
}

///|
pub impl NumberMathInput for MathExpr[Number] with fn number_math(self) {
  self
}

///|
pub extend Number with NumberMathInput::{number_math}

///|
pub extend Token with NumberMathInput::{number_math}

///|
pub extend DynamicSlot with NumberMathInput::{number_math}

///|
pub extend MathExpr with NumberMathInput::{number_math}

///|
pub trait AngleMathInput {
  fn angle_math(Self) -> MathExpr[Angle]
}

///|
pub fn[T : AngleMathInput] math_angle(value : T) -> MathExpr[Angle] {
  value.angle_math()
}

///|
pub impl AngleMathInput for Angle with fn angle_math(self) {
  math_expression(
    literal_expression(self.to_css(), "angle").constrain("math:angle"),
  )
}

///|
pub impl AngleMathInput for Token[Angle] with fn angle_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:angle"),
  )
}

///|
pub impl AngleMathInput for DynamicSlot[Angle] with fn angle_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:angle"),
  )
}

///|
pub impl AngleMathInput for MathExpr[Angle] with fn angle_math(self) {
  self
}

///|
pub extend Angle with AngleMathInput::{angle_math}

///|
pub extend Token with AngleMathInput::{angle_math}

///|
pub extend DynamicSlot with AngleMathInput::{angle_math}

///|
pub extend MathExpr with AngleMathInput::{angle_math}

///|
pub trait TimeMathInput {
  fn time_math(Self) -> MathExpr[Time]
}

///|
pub fn[T : TimeMathInput] math_time(value : T) -> MathExpr[Time] {
  value.time_math()
}

///|
pub impl TimeMathInput for Time with fn time_math(self) {
  math_expression(
    literal_expression(self.to_css(), "time").constrain("math:time"),
  )
}

///|
pub impl TimeMathInput for Token[Time] with fn time_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:time"),
  )
}

///|
pub impl TimeMathInput for DynamicSlot[Time] with fn time_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:time"),
  )
}

///|
pub impl TimeMathInput for MathExpr[Time] with fn time_math(self) {
  self
}

///|
pub extend Time with TimeMathInput::{time_math}

///|
pub extend Token with TimeMathInput::{time_math}

///|
pub extend DynamicSlot with TimeMathInput::{time_math}

///|
pub extend MathExpr with TimeMathInput::{time_math}

///|
pub trait ResolutionMathInput {
  fn resolution_math(Self) -> MathExpr[Resolution]
}

///|
pub fn[T : ResolutionMathInput] math_resolution(
  value : T,
) -> MathExpr[Resolution] {
  value.resolution_math()
}

///|
pub impl ResolutionMathInput for Resolution with fn resolution_math(self) {
  math_expression(
    literal_expression(self.to_css(), "resolution").constrain("math:resolution"),
  )
}

///|
pub impl ResolutionMathInput for Token[Resolution] with fn resolution_math(self) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:resolution"),
  )
}

///|
pub impl ResolutionMathInput for DynamicSlot[Resolution] with fn resolution_math(
  self,
) {
  math_expression(
    reference_expression(self.variable_use()).constrain("math:resolution"),
  )
}

///|
pub impl ResolutionMathInput for MathExpr[Resolution] with fn resolution_math(
  self,
) {
  self
}

///|
pub extend Resolution with ResolutionMathInput::{resolution_math}

///|
pub extend Token with ResolutionMathInput::{resolution_math}

///|
pub extend DynamicSlot with ResolutionMathInput::{resolution_math}

///|
pub extend MathExpr with ResolutionMathInput::{resolution_math}

///|
pub extend Expression with Eq::{equal, not_equal}

///|
pub extend Expression with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend MathExpr with Eq::{equal, not_equal}

///|
pub extend MathExpr with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ExpressionVariable with Eq::{equal, not_equal}

///|
pub extend ExpressionVariable with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend Image with Eq::{equal, not_equal}

///|
pub extend Image with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend GradientStop with Eq::{equal, not_equal}

///|
pub extend GradientStop with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ConicPosition with Eq::{equal, not_equal}

///|
pub extend ConicPosition with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend GradientPosition with Eq::{equal, not_equal}

///|
pub extend GradientPosition with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend GradientDirection with Eq::{equal, not_equal}

///|
pub extend GradientDirection with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend GradientSide with Eq::{equal, not_equal}

///|
pub extend GradientSide with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend RadialShape with Eq::{equal, not_equal}

///|
pub extend RadialShape with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend RadialExtent with Eq::{equal, not_equal}

///|
pub extend RadialExtent with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend RadialSize with Eq::{equal, not_equal}

///|
pub extend RadialSize with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend LayerAttachment with Eq::{equal, not_equal}

///|
pub extend LayerAttachment with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend LayerBox with Eq::{equal, not_equal}

///|
pub extend LayerBox with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend LayerSize with Eq::{equal, not_equal}

///|
pub extend LayerSize with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend BackgroundLayer with Eq::{equal, not_equal}

///|
pub extend BackgroundLayer with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend BackgroundLayers with Eq::{equal, not_equal}

///|
pub extend BackgroundLayers with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend Color with GradientColorInput::{gradient_color}

///|
pub extend Token with GradientColorInput::{gradient_color}

///|
pub extend DynamicSlot with GradientColorInput::{gradient_color}

///|
pub extend Image with ImageInput::{image_expression}

///|
pub extend Url with ImageInput::{image_expression}

///|
pub extend Token with ImageInput::{image_expression}

///|
pub extend DynamicSlot with ImageInput::{image_expression}

///|
pub extend MathExpr with LengthContractExpression::{contract_expression}