.refine-frame{isolation:isolate;background:#edf0f2}
.refine-frame.is-pending{background:linear-gradient(110deg,#edf0f2 15%,#f8f9fa 45%,#edf0f2 75%);background-size:220% 100%;animation:refine-loading 1.5s ease-in-out infinite}
.refine-frame img{opacity:1;transition:opacity .45s ease;object-fit:cover}
.refine-frame.is-pending img{opacity:0}
.refine-frame.is-ready img{opacity:1}
.refine-frame .refine-status{position:absolute;bottom:7px;left:7px;z-index:4;display:inline-flex;align-items:center;gap:6px;padding:5px 8px;min-height:24px;border-radius:10px;background:#242b29cc;color:#fff;font:600 10px "Noto Sans SC",Arial,sans-serif;letter-spacing:.02em;backdrop-filter:blur(8px);box-shadow:0 2px 8px #0002;pointer-events:none;transition:opacity .25s ease,transform .25s ease}
.refine-frame .refine-status::before{content:"";width:8px;height:8px;border:1.5px solid #fff9;border-top-color:#fff;border-radius:50%;animation:refine-spin .8s linear infinite}
.refine-frame.is-ready .refine-status::before{content:"✓";width:auto;height:auto;border:0;animation:none;font-size:11px}
.refine-frame.is-ready.is-settled .refine-status{opacity:0;transform:translateY(5px)}
.refine-frame.is-error .refine-status::before{content:"!";width:auto;height:auto;border:0;animation:none;color:#ffe0d6;font-weight:800}
.refine-frame .refine-retry{display:none;position:absolute;inset:0;z-index:5;border:0;background:#e9ecf2d9;color:#583327;font:600 12px "Noto Sans SC",Arial,sans-serif;cursor:pointer}
.refine-frame.is-error .refine-retry{display:block}
.viewer-content .viewer-load{position:sticky;top:8px;left:8px;z-index:5;display:inline-flex;padding:8px 11px;border-radius:12px;background:#222b28d9;color:#fff;font:600 12px "Noto Sans SC",Arial,sans-serif;backdrop-filter:blur(8px)}
.viewer-content .viewer-load[hidden]{display:none}
@keyframes refine-loading{from{background-position:130% 0}to{background-position:-130% 0}}
@keyframes refine-spin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){.refine-frame.is-pending,.refine-frame .refine-status::before{animation:none}.refine-frame img,.refine-frame .refine-status{transition:none}}
