LiveStyle.Pseudo (LiveStyle v0.13.0)

View Source

CSS pseudo-class and pseudo-element information and lookups.

This module provides compile-time generated function clauses for efficient pseudo-class priority lookups, following the pattern used by the unicode library.

All pseudo data is loaded from external files at compile time via LiveStyle.PropertyMetadata, enabling:

  • O(1) pattern-matched lookups instead of runtime lookups
  • Automatic recompilation when data files change
  • Single source of truth for pseudo metadata

Pseudo-Class Priority System

Pseudo-classes have priorities that determine their order in the cascade:

  • Lower priority pseudos are applied first
  • Higher priority pseudos override lower ones
  • :hover (130) < :focus (150) < :active (170)

Pseudo-Element Priority

Pseudo-elements (::before, ::after, etc.) add a base priority of 5000, which can be combined with pseudo-class priorities.

Examples

iex> LiveStyle.Pseudo.priority(":hover")
130

iex> LiveStyle.Pseudo.priority(":focus")
150

iex> LiveStyle.Pseudo.element_priority()
5000

Summary

Functions

Calculate the total priority for a selector suffix.

Checks if the given selector is a pseudo-element (starts with ::).

Returns the base priority added for pseudo-elements.

Returns all pseudo-class priorities as a map.

Returns the priority of a single pseudo-class.

Functions

calculate_priority(selector)

@spec calculate_priority(String.t() | nil) :: integer()

Calculate the total priority for a selector suffix.

Handles:

  • Single pseudo-classes (:hover)
  • Combined pseudo-classes (:hover:active)
  • Pseudo-elements (::before)
  • Pseudo-elements with pseudo-classes (::before:hover)
  • Complex selectors (:where(.marker:hover *))

Examples

iex> LiveStyle.Pseudo.calculate_priority(":hover")
130

iex> LiveStyle.Pseudo.calculate_priority(":hover:active")
300

iex> LiveStyle.Pseudo.calculate_priority("::before")
5000

iex> LiveStyle.Pseudo.calculate_priority("::before:hover")
5130

element?(key)

@spec element?(String.t() | atom() | nil) :: boolean()

Checks if the given selector is a pseudo-element (starts with ::).

Examples

iex> LiveStyle.Pseudo.element?("::before")
true

iex> LiveStyle.Pseudo.element?(":hover")
false

iex> LiveStyle.Pseudo.element?(nil)
false

element_priority()

@spec element_priority() :: integer()

Returns the base priority added for pseudo-elements.

Examples

iex> LiveStyle.Pseudo.element_priority()
5000

priorities()

Returns all pseudo-class priorities as a map.

priority(arg1)

@spec priority(String.t()) :: integer()

Returns the priority of a single pseudo-class.

Uses compile-time generated function clauses for O(1) pattern matching.

Examples

iex> LiveStyle.Pseudo.priority(":hover")
130

iex> LiveStyle.Pseudo.priority(":active")
170

iex> LiveStyle.Pseudo.priority(":unknown")
40