/* 扉へ重ねる移動点。点滅する輪だけで示し、当たり判定は固定する。 */
.dyn-portal {
  position: fixed; z-index: 65; left: var(--portal-x, -100px); top: var(--portal-y, -100px);
  width: 56px; height: 56px; padding: 0; margin: 0; border: 0; border-radius: 50%;
  transform: translate(-50%, -50%); background: transparent; box-shadow: none;
  cursor: pointer; touch-action: manipulation; pointer-events: auto;
}
.dyn-portal::before, .dyn-portal::after {
  content: ''; position: absolute; pointer-events: none; border-radius: 50%;
}
.dyn-portal::before {
  inset: 17px; background: #fff9da; border: 2px solid #fff;
  box-shadow: 0 0 10px #fff8, 0 0 2px 2px #28201866;
}
.dyn-portal::after {
  inset: 5px; border: 2px solid #fffbe4;
  box-shadow: 0 0 5px #2b1c1055; animation: dyn-door-pulse 1.8s ease-out infinite;
}
.dyn-portal:focus-visible { outline: 3px solid #f5c531; outline-offset: 4px; }
.dyn-portal:hover::before { background: #f5c531; }
@keyframes dyn-door-pulse { 0%,100% { opacity: .18; transform: scale(.65); } 50% { opacity: .95; transform: scale(1); } }
.dyn-portal[hidden], html:not(.has-3d) .dyn-portal, .no-3d .dyn-portal,
.is-locked .dyn-portal, .is-tour .dyn-portal, .dyn-menu-open .dyn-portal,
.gx-doc-open .dyn-portal, .gx-doc-big .dyn-portal, .dyn-reading .dyn-portal { display: none !important; }
@media (prefers-reduced-motion: reduce) { .dyn-portal::after { animation: none; opacity: .8; } }
