*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

body {
  font-family: var(--font);
  background: var(--wash);
  color: var(--ink);
  height: 100dvh;
  overflow: hidden;
  -webkit-font-smoothing: antialiased;
  -webkit-tap-highlight-color: transparent;
}

button,
.filter-tab,
.plan-btn,
.clear-btn,
.p-item {
  touch-action: manipulation;
}

@keyframes blink { 0%,100%{opacity:1} 50%{opacity:.35} }
@keyframes fadeUp {
  from { opacity:0; transform:translateY(4px); }
  to   { opacity:1; transform:translateY(0); }
}
@keyframes panelIn {
  from { opacity:0; transform:translateY(-10px) scale(.985); }
  to   { opacity:1; transform:none; }
}
@keyframes dockIn {
  from { opacity:0; transform:translateX(-50%) translateY(12px); }
  to   { opacity:1; transform:translateX(-50%) translateY(0); }
}
@keyframes toastIn {
  from { opacity:0; transform:translateX(-50%) translateY(-6px); }
  to   { opacity:1; transform:translateX(-50%) translateY(0); }
}
@keyframes softPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(22, 163, 74, 0); }
  50% { box-shadow: 0 0 0 4px rgba(22, 163, 74, 0.12); }
}
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes swapTurn { to { transform: rotate(180deg); } }

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