/* Reusable keyframes */ @keyframes pulse-glow { 0%, 100% { opacity: 0.8; transform: scale(1); } 50% { opacity: 1; transform: scale(1.1); } } @keyframes toast-slide-in { from { transform: translateX(400px); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes pulse { 0%, 100% { opacity: 0.4; transform: scale(1); } 50% { opacity: 1; transform: scale(1.1); } } /* Subtle success burst used for archive action */ @keyframes success-burst { 0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.45), 0 0 0 0 rgba(16, 185, 129, 0.25); transform: scale(1); } 60% { box-shadow: 0 0 0 10px rgba(16, 185, 129, 0), 0 0 0 0 rgba(16, 185, 129, 0); transform: scale(1.05); } 100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0), 0 0 0 0 rgba(16, 185, 129, 0); transform: scale(1); } } /* Apply archive animation when button enters animating state */ .mark-as-read-btn.animating { animation: success-burst 600ms ease-out 1; } .mark-as-read-btn.animating svg { animation: pulse 600ms ease-in-out 1; } @keyframes highlight-pulse-animation { 0%, 100% { box-shadow: 0 0 8px rgba(var(--highlight-rgb, 255, 255, 0), 0.2); transform: scale(1); } 25% { box-shadow: 0 0 20px rgba(var(--highlight-rgb, 255, 255, 0), 0.6); transform: scale(1.02); } 50% { box-shadow: 0 0 8px rgba(var(--highlight-rgb, 255, 255, 0), 0.2); transform: scale(1); } 75% { box-shadow: 0 0 20px rgba(var(--highlight-rgb, 255, 255, 0), 0.6); transform: scale(1.02); } } /* Reading progress bar positioning */ @media (min-width: 769px) { .reading-progress-bar { left: var(--left-offset) !important; right: var(--right-offset) !important; } }