/* THE RULES THAT MUST EXIST BEFORE THE FIRST PAINT.
 *
 * styles.css is 430KB. The browser blocks rendering on it, but on a phone it
 * still arrives late enough that the logo was painting at full size and THEN
 * being told to start at a fifth of its size -- which is the flash the
 * operator kept seeing after two attempts at fixing it elsewhere (2026-08-21).
 * Measured: at +45ms the document had parsed and `document.styleSheets.length`
 * was still 0.
 *
 * This file is a few hundred bytes and is linked BEFORE the main sheet, so the
 * mark's opening state is known by the time anything is drawn. Nothing else
 * belongs here: every rule in this file is one the main sheet cannot be
 * trusted to deliver in time.
 */
/* THE MARK ARRIVES (operator, 2026-08-21: "on the splash page I see at least a
   second or two loading on a cold start -- maybe the logo starts really small
   and zooms out smoothly").
   NOT A SECOND SPLASH SCREEN. One was built and removed on 2026-08-17 for
   holding the finished app back half a second to show artwork iOS was already
   showing. This animates the mark that is ALREADY on the shell, so it costs
   nothing and delays nothing: the app paints when it paints, and the logo
   settles into place as it does.
   It runs on the first paint of a session only -- `is-arriving` is set once,
   never on a tab change -- so it reads as the app opening rather than as
   decoration that repeats. */
/* SCALE ONLY, AND ONLY A LITTLE.
 *
 * The first two attempts started the mark at a fifth of its size with opacity
 * 0, which is exactly what made the flash so visible: any frame drawn before
 * this rule applies shows the logo FULL SIZE and OPAQUE, and the animation
 * then yanks it down to nothing. Three separate fixes chased the timing --
 * a head script, a precache entry, a separate stylesheet -- and the flash
 * survived all of them, because the race cannot be won reliably on a phone.
 *
 * So the animation is now written to be harmless when it loses the race: the
 * opening state is 0.92 scale at full opacity, which is within a pixel or two
 * of where the mark ends up. A late frame is indistinguishable from the
 * animation's own first frame.
 */
@keyframes brand-arrive {
  from { transform: scale(0.92); }
  to   { transform: none; }
}
.brand-first-paint .brand-mark { animation: none; }
}
