///|
/// The font size the browser computes for `value`, a theme variable a
/// stylesheet writes after `font-size:`. `parent` is the size inherited
/// when the declaration is invalid, as a bare number is, and the size
/// relative units refer to. `None` for a value the port does not
/// measure (other units, keywords, sizes not above zero).
pub fn css_font_size(value : Json, parent : Double) -> Double? {
  let text = match value {
    String(text) => text.trim(chars=" \t\n").to_owned().to_lower()
    // A number is written without a unit: no length, but for zero.
    Number(number, ..) if number == 0.0 => return Some(0.0)
    _ => return Some(parent)
  }
  // An empty value (what theme sanitising leaves of one it rejects) is a
  // declaration the stylesheet compiler drops.
  if text == "" {
    return Some(parent)
  }
  guard @dom.css_dimension(text) is Some((number, unit)) else { return None }
  // A negative size is invalid, whatever its unit.
  if number < 0.0 {
    return Some(parent)
  }
  let size = match unit {
    "px" => number
    "em" => number * parent
    "rem" => number * 16.0
    "%" => number / 100.0 * parent
    "pt" => number * 4.0 / 3.0
    // A number without a unit is no length, but for zero.
    "" if number == 0.0 => 0.0
    "" => return Some(parent)
    _ => return None
  }
  // Zero is a size: text set in it takes no room.
  Some(size)
}