File size: 6,695 Bytes
3fdb1ce 7967f6e 3fdb1ce 43d57e8 7967f6e 43d57e8 7967f6e 43d57e8 7967f6e 5b719d3 43d57e8 7967f6e 43d57e8 3fdb1ce 5b719d3 43d57e8 5b719d3 43d57e8 5b719d3 43d57e8 3fdb1ce 5b719d3 7967f6e 5b719d3 43d57e8 5b719d3 3fdb1ce 5b719d3 43d57e8 5b719d3 43d57e8 5b719d3 43d57e8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | /* Refstudio hover overlay: + ADD button on web images.
* v12 — stable one-click capture with captureId nonce.
*/
(function () {
if (window.__muse_hover_v12) return;
window.__muse_hover_v12 = true;
// Remove old badge DOM left by previous injected versions. Anonymous old listeners
// may still exist, but they cannot duplicate backend actions because v12 adds captureId
// and Rust dedupes captureIds.
try { var old = document.getElementById('__muse_add_badge'); if (old) old.remove(); } catch (_) {}
var MIN = 90;
var activeImg = null;
var badge = null;
var showTimer = 0;
var hideTimer = 0;
var capturing = false;
function injectCSS() {
if (document.getElementById('__muse_badge_css_v12')) return;
var s = document.createElement('style'); s.id = '__muse_badge_css_v12';
s.textContent = '#__muse_add_badge{all:initial;position:fixed;z-index:2147483647;display:flex;align-items:center;gap:5px;padding:8px 16px;background:rgba(10,132,255,0.95);color:#fff;border-radius:999px;box-shadow:0 4px 20px rgba(0,0,0,0.4),0 0 0 1px rgba(255,255,255,0.1);font:700 12px/1 -apple-system,BlinkMacSystemFont,"Inter",sans-serif;cursor:pointer;opacity:0;transform:translateY(4px) scale(0.92);transition:opacity .2s,transform .2s,background .1s;pointer-events:auto;letter-spacing:0.01em;user-select:none}#__muse_add_badge.v{opacity:1;transform:none}#__muse_add_badge:hover{background:rgba(10,132,255,1);box-shadow:0 6px 28px rgba(10,132,255,0.4),0 0 0 1px rgba(255,255,255,0.2);transform:scale(1.06)}#__muse_add_badge:active{transform:scale(0.92);background:rgba(10,100,220,1)}#__muse_add_badge svg{width:14px;height:14px;stroke-width:2.5;pointer-events:none}#__mt7{all:initial;position:fixed;left:50%;bottom:24px;transform:translateX(-50%) translateY(8px);z-index:2147483647;padding:9px 16px;border-radius:999px;background:rgba(20,20,20,.97);border:1px solid rgba(255,255,255,.1);box-shadow:0 10px 36px rgba(0,0,0,.5);font:600 12px/1 -apple-system,sans-serif;color:#fff;opacity:0;transition:opacity .16s,transform .16s;pointer-events:none}#__mt7.s{opacity:1;transform:translateX(-50%) translateY(0)}';
(document.head || document.documentElement).appendChild(s);
}
function enc(v) { return encodeURIComponent(v == null ? '' : String(v)); }
function absUrl(s) { try { return new URL(s || '', location.href).href; } catch (_) { return s || ''; } }
function captureId() { return Date.now().toString(36) + '-' + Math.random().toString(36).slice(2); }
function bestImageUrl(img) {
var srcset = img.getAttribute('srcset') || '';
if (srcset) { var best='',bs=0; srcset.split(',').forEach(function(p){var b=p.trim().split(/\s+/),u=b[0],sc=1;if(b[1]){if(b[1].endsWith('w'))sc=parseInt(b[1],10)||1;else if(b[1].endsWith('x'))sc=(parseFloat(b[1])||1)*1000;}if(sc>bs){bs=sc;best=u;}}); if(best) return absUrl(best); }
var u = img.getAttribute('data-full')||img.getAttribute('data-original')||img.getAttribute('data-src')||img.getAttribute('data-lazy-src')||img.currentSrc||img.src;
u = absUrl(u);
try { if(u.includes('pinimg.com')&&u.match(/\/\d+x\//))u=u.replace(/\/\d+x\//,'/originals/'); if(u.includes('artstation.com')&&u.includes('/medium/'))u=u.replace('/medium/','/large/'); } catch(_){}
return u;
}
function toast(m) { var t=document.getElementById('__mt7'); if(!t){t=document.createElement('div');t.id='__mt7';document.documentElement.appendChild(t);} t.textContent=m;t.classList.add('s'); clearTimeout(t._t);t._t=setTimeout(function(){t.classList.remove('s');},2000); }
function fireAction(url, title, w, h) {
if (capturing) return;
capturing = true;
var id = captureId();
var u = 'muse-action://board?captureId='+enc(id)+'&url='+enc(url)+'&source='+enc(location.href)+'&title='+enc(title)+'&w='+enc(w)+'&h='+enc(h);
window.location.href = u;
setTimeout(function(){ capturing = false; }, 1000);
}
function clearHide(){clearTimeout(hideTimer);}
function scheduleHide(){clearHide();hideTimer=setTimeout(hide,600);}
function hide(){if(!badge)return;badge.classList.remove('v');activeImg=null;}
function pos(el,img){var r=img.getBoundingClientRect();var x=r.right-80,y=r.top+10;if(x<r.left+4)x=r.left+4;if(x>innerWidth-90)x=innerWidth-90;if(y<4)y=4;if(y>innerHeight-40)y=innerHeight-40;el.style.left=x+'px';el.style.top=y+'px';}
function show(img){
if(img===activeImg&&badge&&badge.classList.contains('v'))return;
injectCSS(); activeImg=img;
if(!badge){
badge=document.createElement('div');badge.id='__muse_add_badge';
badge.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>ADD';
badge.addEventListener('click',function(e){e.preventDefault();e.stopPropagation();e.stopImmediatePropagation();if(!activeImg)return;var url=bestImageUrl(activeImg);if(!url||url.startsWith('data:')||url.startsWith('blob:')){toast('Cannot capture');return;}fireAction(url,activeImg.alt||activeImg.title||document.title||'Reference',activeImg.naturalWidth||Math.round(activeImg.getBoundingClientRect().width),activeImg.naturalHeight||Math.round(activeImg.getBoundingClientRect().height));toast('✓ Added to Board');hide();},true);
['mousedown','mouseup','pointerdown','pointerup','touchstart','touchend'].forEach(function(ev){badge.addEventListener(ev,function(e){e.preventDefault();e.stopPropagation();e.stopImmediatePropagation();},true);});
badge.addEventListener('mouseenter',clearHide,true);
badge.addEventListener('mouseleave',scheduleHide,true);
document.documentElement.appendChild(badge);
}
pos(badge,activeImg);void badge.offsetHeight;badge.classList.add('v');
}
function isValid(el){if(!el||el.tagName!=='IMG')return false;if(el===badge)return false;var r=el.getBoundingClientRect();return r.width>=MIN&&r.height>=MIN;}
document.addEventListener('mouseover',function(e){var t=e.target;if(badge&&(t===badge||badge.contains(t))){clearHide();return;}if(!isValid(t))return;if(t===activeImg){clearHide();return;}clearHide();clearTimeout(showTimer);showTimer=setTimeout(function(){show(t);},150);},true);
document.addEventListener('mouseout',function(e){var t=e.target;if(!t||t.tagName!=='IMG'||t!==activeImg)return;var rel=e.relatedTarget;if(badge&&rel&&(badge===rel||badge.contains(rel))){clearHide();return;}clearTimeout(showTimer);scheduleHide();},true);
window.addEventListener('scroll',function(){if(!badge||!activeImg)return;var r=activeImg.getBoundingClientRect();if(r.bottom<-20||r.top>innerHeight+20)hide();else pos(badge,activeImg);},{passive:true,capture:true});
})();
|