/* StreakPass reset — modern minimal normalization. */
*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; }

html { -webkit-text-size-adjust: 100%; }

body { min-height: 100vh; min-height: 100dvh; -webkit-font-smoothing: antialiased; }

img, picture, video, canvas, svg { display: block; max-width: 100%; }

input, button, textarea, select { font: inherit; color: inherit; }

button { background: none; border: none; padding: 0; cursor: pointer; }

p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }

ul[role="list"], ol[role="list"] { list-style: none; padding: 0; }

table { border-collapse: collapse; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* The hidden attribute must ALWAYS win, even over display:flex component rules
   (this was the invisible-text "error banner" bug on signup/verify). */
[hidden] { display: none !important; }

/* No double-tap zoom on iOS (manipulation still allows scroll + pinch zoom,
   so accessibility zooming keeps working). */
*, *::before, *::after { touch-action: manipulation; }
