
/* Memory performance: stable placeholders and progressive image reveal. */
.memoryPhotoFrame{position:relative;overflow:hidden;background:#efe4da}
.memoryPhotoFrame .memoryPhotoPlaceholder{position:absolute;inset:0;background:linear-gradient(105deg,#eee2d8 20%,#f8f1ea 38%,#eee2d8 56%);background-size:220% 100%;animation:memoryPhotoShimmer 1.35s ease-in-out infinite}
.memoryPhotoFrame img{position:absolute;inset:0;width:100%;height:100%;display:block;object-fit:cover;opacity:0;transition:opacity .28s ease}
.memoryPhotoFrame.isLoaded img{opacity:1}
.memoryPhotoFrame.isLoaded .memoryPhotoPlaceholder{display:none}
.memoryPhotoFrame.hasError .memoryPhotoPlaceholder{animation:none;background:linear-gradient(145deg,#f1e4da,#ead7ca)}
@keyframes memoryPhotoShimmer{0%{background-position:100% 0}100%{background-position:-100% 0}}
@media(prefers-reduced-motion:reduce){.memoryPhotoFrame .memoryPhotoPlaceholder{animation:none}.memoryPhotoFrame img{transition:none}}
