/* pf-sun.js — солнце, лежащее на полу, в слоях ГНИВЦ и «Портфолио». Подключается одной строкой из HEAD. Сам находит слои и следит, открыты ли они. */ (function(){ var REACH=440, /* длина лучей на полу, px */ SUN=70, /* радиус ядра, px */ TILT=66, /* наклон пола, градусов: больше — площе */ FLASH=1.6, /* частота вспышек отдельных лучей, в секунду */ BLUR=1.6, /* общая мягкость света, px — как на главной */ SOFT=.22, /* неровность ядра: 0 — ровный круг */ LINES=false, /* true — добавить золотую линовку вокруг солнца */ BLOOD_A=.55, /* яркость кровавой сердцевины: 0 — убрать */ CORE='255,248,228', MID='255,222,145', TIP='255,196,105', BLOOD='170,18,32', BLOOD2='120,8,20'; var LAYERS=[ { sel:'.gnivcLogoLayer_9201', top:'60%', open:function(){return document.body.classList.contains('workCardHover_9201')} }, { sel:'.pfX_overlay', top:'62%', open:function(){var c=document.querySelector('.pfX_overlayClip');return !!(c&&c.classList.contains('isOpen'))} } ]; var css=document.createElement('style'); css.textContent= '.pfSunFloor{position:absolute;left:50%;width:min(1000px,130vmax);aspect-ratio:1;translate:-50% -50%;'+ 'transform:perspective(900px) rotateX('+TILT+'deg);pointer-events:none;z-index:0}'+ '.pfSunFloor canvas{position:absolute;inset:0;width:100%!important;height:100%!important;max-width:none!important;filter:blur('+BLUR+'px)}'+ '.pfSunLines{position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(255,222,150,.7) 0 1px,transparent 1px 16px);'+ '-webkit-mask-image:radial-gradient(circle at 50% 50%,#000 0%,rgba(0,0,0,.45) 22%,rgba(0,0,0,.1) 42%,transparent 55%);'+ 'mask-image:radial-gradient(circle at 50% 50%,#000 0%,rgba(0,0,0,.45) 22%,rgba(0,0,0,.1) 42%,transparent 55%);'+ 'opacity:var(--o,0);animation:pfSunLn 4s linear infinite}'+ '@keyframes pfSunLn{to{background-position:0 16px}}'+ '@media(prefers-reduced-motion:reduce){.pfSunLines{animation:none}}'; document.head.appendChild(css); var reduce=matchMedia('(prefers-reduced-motion:reduce)').matches; function rnd(a,b){return a+Math.random()*(b-a)} function Sun(layer,cfg){ var floor=document.createElement('div'); floor.className='pfSunFloor';floor.setAttribute('aria-hidden','true');floor.style.top=cfg.top; var lines=null; if(LINES){lines=document.createElement('div');lines.className='pfSunLines';floor.appendChild(lines)} var cv=document.createElement('canvas');floor.appendChild(cv); layer.insertBefore(floor,layer.firstChild); var S=1000,dpr=Math.min(2,window.devicePixelRatio||1),ctx=cv.getContext('2d'); cv.width=cv.height=Math.round(S*dpr); var rays=[]; function make(n,thin){ var st=Math.PI*2/n,off=thin?0:st/2; for(var i=0;i0)blob(R0*2.6,BLOOD_A*o,0,0,BLOOD,BLOOD2); /* кровь под светом */ blob(R0*2.1,.28*o); for(var j=0;j.4?'255,253,245':CORE); } }; } var suns=[],last=performance.now(); function attach(){ LAYERS.forEach(function(cfg){ if(cfg.done)return; var el=document.querySelector(cfg.sel); if(el){cfg.done=true;suns.push(new Sun(el,cfg))} }); return LAYERS.every(function(c){return c.done}); } function tick(now){ requestAnimationFrame(tick); var dt=Math.min(.05,(now-last)/1000);last=now; for(var i=0;i