.magnetic { transition: transform var(--dur-base, 320ms) var(--ease-emphasized, cubic-bezier(.2,0,0,1)); }
.link-draw { position: relative; display: inline-block; }
.link-draw::after {
  content: ""; position: absolute; inset-inline: 0; bottom: -2px; height: 1px;
  background: currentColor;
  transform: scaleX(0); transform-origin: right center;
  transition: transform var(--dur-base, 320ms) var(--ease-emphasized, cubic-bezier(.2,0,0,1));
}
.link-draw:hover::after,
.link-draw:focus-visible::after { transform: scaleX(1); transform-origin: left center; }
[dir="rtl"] .link-draw::after                { transform-origin: left center; }
[dir="rtl"] .link-draw:hover::after,
[dir="rtl"] .link-draw:focus-visible::after  { transform-origin: right center; }
.zoom-crop { display: block; overflow: hidden; overflow: clip;
             aspect-ratio: var(--zoom-ratio, 4 / 3); }
.zoom-crop img { width: 100%; height: 100%; object-fit: cover;
                 transform: scale(1);
                 transition: transform 700ms var(--ease-reveal, cubic-bezier(.22,1,.36,1)); }
.zoom-crop:hover img,
.zoom-crop:focus-visible img,
a:hover > .zoom-crop img,
a:focus-visible > .zoom-crop img { transform: scale(1.06); }
.cursor-dot {
  position: fixed; top: 0; left: 0; width: 10px; height: 10px; border-radius: 50%;
  background: var(--accent, #fff);
  pointer-events: none;
  z-index: var(--z-cursor, 9998);
  transform: translate(-50%, -50%);
  opacity: 0;
  transition: opacity 150ms linear, width 150ms, height 150ms;
}
html.cursor-live .cursor-dot { opacity: 1; }
html.cursor-live, html.cursor-live a, html.cursor-live button { cursor: none; }
html.cursor-live input, html.cursor-live textarea,
html.cursor-live select, html.cursor-live [contenteditable] { cursor: auto; }
.grain::after {
  content: ""; position: fixed; inset: -100%;
  z-index: var(--z-grain, 9999);
  pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  opacity: .05;
  mix-blend-mode: overlay;
}
@media (max-width: 720px) {
  .grain::after { mix-blend-mode: normal; opacity: .035; }
}
@media print { .grain::after { display: none; } }
@media (prefers-reduced-motion: reduce) {
  .magnetic          { transition: none; transform: none !important; }
  .link-draw::after  { transition: none; }
  .zoom-crop img     { transition: none; }
  .zoom-crop:hover img, .zoom-crop:focus-visible img,
  a:hover > .zoom-crop img, a:focus-visible > .zoom-crop img { transform: none; }
  .cursor-dot        { display: none; }
  html.cursor-live, html.cursor-live a, html.cursor-live button { cursor: auto; }
}
