diff --git a/web/demo.html b/web/demo.html
index e83d94d..1b61502 100644
--- a/web/demo.html
+++ b/web/demo.html
@@ -29,12 +29,41 @@
.slide{
position:absolute;inset:0;display:flex;flex-direction:column;
align-items:center;justify-content:center;padding:48px 64px;
- opacity:0;pointer-events:none;transition:opacity .5s ease;
+ opacity:0;pointer-events:none;
+ transform:translateX(60px) scale(.96);
+ transition:opacity .6s cubic-bezier(.22,1,.36,1),transform .6s cubic-bezier(.22,1,.36,1);
+}
+.slide.active{
+ opacity:1;pointer-events:auto;
+ transform:translateX(0) scale(1);
+ animation:slidePulse .6s cubic-bezier(.22,1,.36,1);
+}
+@keyframes slidePulse{
+ 0%{transform:translateX(60px) scale(.96);opacity:0}
+ 60%{transform:translateX(-4px) scale(1.01);opacity:1}
+ 100%{transform:translateX(0) scale(1);opacity:1}
+}
+/* staggered content entrance */
+.slide.active > *{animation:contentRise .5s cubic-bezier(.22,1,.36,1) both}
+.slide.active > *:nth-child(1){animation-delay:.1s}
+.slide.active > *:nth-child(2){animation-delay:.2s}
+.slide.active > *:nth-child(3){animation-delay:.3s}
+.slide.active > *:nth-child(4){animation-delay:.4s}
+.slide.active > *:nth-child(5){animation-delay:.5s}
+.slide.active > *:nth-child(6){animation-delay:.6s}
+@keyframes contentRise{
+ 0%{opacity:0;transform:translateY(20px)}
+ 100%{opacity:1;transform:translateY(0)}
+}
+/* slide exit */
+.slide:not(.active){
+ transform:translateX(-60px) scale(.96);
+ transition:opacity .4s ease,transform .4s ease;
}
-.slide.active{opacity:1;pointer-events:auto}
/* progress bar */
-.progress{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--green),var(--green-dim));z-index:200;width:0;box-shadow:0 0 8px rgba(22,163,74,.5)}
+.progress{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--green),var(--green-dim));z-index:200;width:0;box-shadow:0 0 8px rgba(22,163,74,.5);animation:progressGlow 2s ease-in-out infinite}
+@keyframes progressGlow{0%,100%{box-shadow:0 0 8px rgba(22,163,74,.4)}50%{box-shadow:0 0 16px rgba(22,163,74,.8)}}
.slide-meta{position:fixed;top:20px;left:32px;font-family:var(--font-mono);font-size:.7rem;color:var(--text-faint);letter-spacing:.05em;z-index:100}
.slide-num{position:fixed;top:20px;right:32px;font-family:var(--font-mono);font-size:.7rem;color:var(--text-faint);z-index:100}
.brand{position:fixed;bottom:20px;left:32px;display:flex;align-items:center;gap:8px;z-index:100;opacity:.6}