*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; }
body { background: transparent; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; overflow: hidden; }
#app { height: 100%; }

/*
 * Shared design tokens are now defined in styles/tokens.css.
 * tokens.css is imported before this file in main.js, so its :root
 * declarations are the single source of truth for all design variables.
 * Do not add duplicate token definitions here.
 */

/* Respect prefers-reduced-motion for all decorative indeterminate animations.
   Component-level transitions still work; only the globally named
   infinite animations are silenced. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.08s !important;
    scroll-behavior: auto !important;
  }
}

/* Global WebKit scrollbar reset — ALL pseudo-elements must be defined once any one is set,
   otherwise older WKWebView (macOS 15 / WebKit 18) falls back to native overlay rendering.
   Missing ::-webkit-scrollbar-button is the most common trigger for that fallback. */
::-webkit-scrollbar { width: 4px; height: 4px; background: transparent; }
::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-track-piece { background: transparent; }
::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.12); border-radius: 2px; }
::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.22); }
::-webkit-scrollbar-corner { background: transparent; }
::-webkit-resizer { display: none; }

body.no-select, body.no-select * {
  user-select: none !important;
  -webkit-user-select: none !important;
}
