/* 所有底部弹层共用动效；仅改变透明度和面板位移，保留遮罩的水平居中定位。 */
.modal-entering {
  animation: modal-backdrop-in 280ms ease-out both;
}
.modal-entering > .modal {
  animation: modal-panel-in 280ms cubic-bezier(.22, 1, .36, 1) both;
}
.modal-leaving {
  pointer-events: none;
  animation: modal-backdrop-out 220ms ease-in both;
}
.modal-leaving > .modal {
  animation: modal-panel-out 220ms cubic-bezier(.4, 0, 1, 1) both;
}
@keyframes modal-backdrop-in {
  from { opacity: 0; }
  to { opacity: 1; }
}
@keyframes modal-backdrop-out {
  from { opacity: 1; }
  to { opacity: 0; }
}
@keyframes modal-panel-in {
  from { transform: translateY(100%); }
  to { transform: translateY(0); }
}
@keyframes modal-panel-out {
  from { transform: translateY(0); }
  to { transform: translateY(100%); }
}
/* 尊重系统减少动态效果设置，关闭时由脚本直接清理。 */
@media (prefers-reduced-motion: reduce) {
  .modal-entering,
  .modal-entering > .modal,
  .modal-leaving,
  .modal-leaving > .modal { animation: none; }
}
