/* ---------- micro-animations (shared by every page) ---------- */
/* staggered reveals — JS adds .rv, then .in; classes are removed once settled so hover transforms stay clean */
.rv{opacity:0;transform:translateY(26px)}
.rv.in{opacity:1;transform:none;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transition-delay:var(--d,0ms)}

/* underline draw */
.ul,.nav a:not(.cta),.aside a,.contact-strip a{background-image:linear-gradient(currentColor,currentColor);background-repeat:no-repeat;
  background-position:0 100%;background-size:0% 1px;transition:background-size .4s cubic-bezier(.16,1,.3,1),color .2s,opacity .25s}
.ul:hover,.nav a:not(.cta):hover,.aside a:hover,.contact-strip a:hover{background-size:100% 1px}

/* image zoom inside anything marked .zoom (or cards with photos) */
.zoom{overflow:hidden}
.zoom img{transition:transform .6s cubic-bezier(.16,1,.3,1)}
.zoom:hover img,a:hover>.zoom img,a:focus-visible>.zoom img{transform:scale(1.06)}

/* magnetic buttons — JS sets --mx / --my */
.magnetic{translate:var(--mx,0px) var(--my,0px);transition:translate .35s cubic-bezier(.16,1,.3,1),transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s,background .3s,color .3s}
.shine{position:relative;overflow:hidden;isolation:isolate}
.shine::after{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;transform:translateX(-120%);
  background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,.45) 50%,transparent 65%)}
.shine:hover::after{transform:translateX(120%);transition:transform .6s cubic-bezier(.16,1,.3,1)}

/* badge shimmer */
.shimmer{position:relative;display:inline-block;overflow:hidden;border-radius:inherit}
.shimmer::after{content:"";position:absolute;inset:-20%;pointer-events:none;transform:translateX(-130%) skewX(-18deg);
  background:linear-gradient(90deg,transparent,rgba(255,236,200,.38),transparent);animation:shimmer 5.5s cubic-bezier(.45,0,.2,1) 1.5s infinite;animation-play-state:paused;will-change:transform}
.shimmer.sh-on::after{animation-play-state:running}
@keyframes shimmer{0%{transform:translateX(-130%) skewX(-18deg)}28%,100%{transform:translateX(130%) skewX(-18deg)}}

/* logo mark draws on */
.brand svg path,.brand svg circle{stroke-dasharray:120;stroke-dashoffset:120;animation:draw 1.2s cubic-bezier(.65,0,.35,1) .15s forwards}
.brand svg path:nth-of-type(1){animation-delay:.45s}
.brand svg path:nth-of-type(2){animation-delay:.7s}
@keyframes draw{to{stroke-dashoffset:0}}

/* live "open now" dot */
.open-now{display:inline-flex;align-items:center;gap:8px;font-size:13px;letter-spacing:.04em;color:rgba(244,234,217,.85);margin-top:8px}
.open-now i{width:9px;height:9px;border-radius:50%;background:#8a7f72;position:relative;flex:0 0 9px}
.open-now.is-open i{background:#5fd38d}
.open-now.is-open i::after{content:"";position:absolute;inset:0;border-radius:50%;background:#5fd38d;animation:ping 2s cubic-bezier(0,0,.2,1) infinite}
@keyframes ping{0%{transform:scale(1);opacity:.7}80%,100%{transform:scale(2.6);opacity:0}}

@media (prefers-reduced-motion: reduce){
  .rv,.rv.in{opacity:1!important;transform:none!important;transition:none!important}
  .zoom img,.magnetic{transition:none}
  .zoom:hover img,a:hover>.zoom img{transform:none}
  .magnetic{translate:none}
  .shine::after,.shimmer::after,.open-now i::after{display:none}
  .brand svg path,.brand svg circle{animation:none;stroke-dashoffset:0}
}
