All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalacss.internal.Cond.scala Maven / Gradle / Ivy

The newest version!
package scalacss.internal

import scala.collection.immutable.SortedMap

/**
 * Condition under which CSS is applicable.
 */
final case class Cond(pseudo: Option[Pseudo], mediaQueries: Vector[Media.Query]) extends Pseudo.ChainOps[Cond] {
  override def toString =
    NonEmptyVector.option(mediaQueries).map(Media.css).fold("")(_ + " ") +
    Css.selector("", this)

  private[Cond] val sortKey: String = {
    var s = "" // remember, this is JS
    for (p <- pseudo) s += p.cssValue
    for (q <- mediaQueries) s += q.cssSuffix
    s
  }

  protected def addPseudo(p: Pseudo): Cond =
    copy(pseudo = Some(this.pseudo.fold(p)(_ & p)))

  @inline def &(p: Pseudo): Cond =
    addPseudo(p)

  def &(q: Media.Query): Cond =
    copy(mediaQueries = this.mediaQueries +: q)

  def &(b: Cond): Cond =
    Cond(
      optionAppend(pseudo, b.pseudo)(_ & _),
      b.mediaQueries.foldLeft(mediaQueries)(_ +: _))

  def applyToStyle(s: StyleS): StyleS = {
    val d = s.data.foldLeft(SortedMap.empty[Cond, AVs]){ case (q, (oldCond, av)) =>
      val newCond = this & oldCond
      val newValue = q.get(newCond).fold(av)(_ ++ av)
      q.updated(newCond, newValue)
    }

    val u = s.unsafeExts.map(e =>
      e.copy(
        style = this.copy(pseudo = None).applyToStyle(e.style),
        cond  = this.copy(mediaQueries = Vector.empty) & e.cond
      )
    )

    s.copy(data = d, unsafeExts = u)
  }
}

object Cond {
  val empty: Cond =
    Cond(None, Vector.empty)

  implicit val ordering: Ordering[Cond] =
    Ordering.by[Cond, String](_.toString)(NaturalOrdering)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy