/* Browser chrome belongs to the browser; Flow uses the whole available viewport. */
body.web { height: 100dvh; min-width: 320px; }
.web .titlebar { display: none; }
.web #app { height: 100%; }
.web .shell { padding-top: 12px; }
.web .auth { min-height: 100%; height: 100%; overflow-y: auto; padding: 32px 20px; }
.web .auth-box { width: min(100%, 420px); margin: auto; }
.web .auth .logo { padding-bottom: 18px; }
.web .auth .tagline { line-height: 1.8; }
.web .auth .field { font-size: 16px; }
.web .auth .btn { min-height: 46px; }
.web .web-service-note { color: var(--muted); font-size: 13px; line-height: 1.6; }
.web .service .web-service-note { max-width: 48ch; }
.web .web-guest-entry { margin: 18px 0; padding: 22px; text-align: left; }
.web .web-guest-entry h2 { font-size: 18px; line-height: 1.4; margin: 0 0 8px; }
.web .web-guest-entry p { color: var(--muted); font-size: 13px; line-height: 1.65; margin: 0 0 16px; }
.web .web-guest-entry .btn { display: flex; width: 100%; text-decoration: none; align-items: center; justify-content: center; }
.web .web-guest-entry summary { cursor: pointer; font-size: 14px; font-weight: 650; line-height: 1.5; }
.web .web-guest-code { margin-top: 18px; }
.web .web-guest-code .field { width: 100%; text-transform: uppercase; margin-bottom: 12px; }
.web-boot-error { margin: 10vh auto; max-width: 420px; padding: 24px; font: 16px/1.6 sans-serif; color: #f3f5f9; }
@media (max-width: 760px) {
  .web .shell { padding-top: env(safe-area-inset-top, 0px); padding-bottom: calc(var(--mobile-nav-height) + env(safe-area-inset-bottom, 0px)); }
  .web .primary-nav { height: calc(var(--mobile-nav-height) + env(safe-area-inset-bottom, 0px)); padding-bottom: env(safe-area-inset-bottom, 0px); }
  .web .auth { padding: 28px 20px; }
  .web .auth-box { max-width: 400px; }
  .web input.field, .web textarea.field, .web .global-search input { font-size: 16px; }
  /* Android disables page entrances; the browser keeps the shared desktop rhythm.
     Its reduced-motion tokens retain the fade while removing the displacement. */
  .web .main > .view:not([hidden]) { animation: view-arrive 320ms var(--motion-ease) both; }
}
/* Keep the renderer's targeted reduced-motion rules. Shortening every animation
   also shortens infinite background loops and makes them race instead of stop. */
