aaf9323ba5
- Banner (loadBannerAlerts): add step 1b — any item from statsData.opened with is_edible=false is queued as expired even when client-side getExpiredSafety would consider it 'ok' (e.g. conserve <30d past expiry). Applies to all product types, not just conserve. Requires fetching stats in the same Promise.all (no extra round-trip since loadDashboard already calls stats separately). - CSS: remove text-decoration:line-through from .alert-item-spoiled .alert-item-name. The badge (⛔/⚠️) already communicates the state; strikethrough added no information and confused users into thinking the item had been deleted.