:host { display: flex; min-height: 0; flex: 1; } .image-modal { position: relative; display: flex; min-width: 0; min-height: 0; flex: 1; flex-direction: column; overflow: hidden; background: black; transform-origin: center top; } .image-modal--settling { transition: transform 180ms ease-out; } .image-modal--gesturing { will-change: transform; } .image-modal__viewport { display: flex; min-width: 0; min-height: 0; flex: 1; align-items: center; justify-content: center; overflow: hidden; cursor: zoom-in; touch-action: none; user-select: none; } .image-modal__viewport--zoomed { cursor: grab; } .image-modal__viewport--zoomed:active { cursor: grabbing; } .image-modal__image { display: block; max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; transition: transform 120ms ease-out; -webkit-user-drag: none; } .image-modal--gesturing .image-modal__image { transition: none; will-change: transform; } .image-modal__viewport:active .image-modal__image { transition: none; } .image-modal__error { margin: 1rem; color: #ffffff; text-align: center; } .image-modal__controls { position: absolute; right: 50%; bottom: max(1.25rem, env(safe-area-inset-bottom)); z-index: 1; display: flex; align-items: center; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.25); border-radius: 2rem; background: rgba(20, 20, 20, 0.78); box-shadow: 0 0.25rem 1rem rgba(0, 0, 0, 0.3); transform: translateX(50%); backdrop-filter: blur(0.5rem); } .image-modal__control, .image-modal__zoom { display: inline-flex; height: 2.75rem; align-items: center; justify-content: center; border: 0; color: #ffffff; background: transparent; } .image-modal__control { width: 2.75rem; font-size: 1.5rem; } .image-modal__zoom { min-width: 4rem; padding: 0 0.5rem; font-size: 0.875rem; font-variant-numeric: tabular-nums; } .image-modal__control:hover:not(:disabled), .image-modal__zoom:hover { background: rgba(255, 255, 255, 0.12); } .image-modal__control:focus-visible, .image-modal__zoom:focus-visible { outline: 2px solid #ffffff; outline-offset: -3px; } .image-modal__control:disabled { opacity: 0.35; } @media (max-width: 576px) { .image-modal__controls { bottom: max(1rem, env(safe-area-inset-bottom)); background: rgba(20, 20, 20, 0.94); backdrop-filter: none; } } @media (pointer: coarse) { .image-modal__controls { background: rgba(20, 20, 20, 0.94); backdrop-filter: none; } } @media (prefers-reduced-motion: reduce) { .image-modal__image { transition: none; } }