diff --git a/public/fonts/inter-400.woff2 b/public/fonts/inter-400.woff2
new file mode 100644
index 0000000..eb3509f
Binary files /dev/null and b/public/fonts/inter-400.woff2 differ
diff --git a/public/fonts/inter-500-cyr.woff2 b/public/fonts/inter-500-cyr.woff2
new file mode 100644
index 0000000..d750914
Binary files /dev/null and b/public/fonts/inter-500-cyr.woff2 differ
diff --git a/public/fonts/inter-500-lat.woff2 b/public/fonts/inter-500-lat.woff2
new file mode 100644
index 0000000..d15208d
Binary files /dev/null and b/public/fonts/inter-500-lat.woff2 differ
diff --git a/public/js/links.js b/public/js/links.js
index c34f5cd..0bcdcc5 100644
--- a/public/js/links.js
+++ b/public/js/links.js
@@ -49,6 +49,7 @@ async function loadLinks() {
Открыть
+
Отчёт
diff --git a/public/js/report.js b/public/js/report.js
new file mode 100644
index 0000000..e7ac12e
--- /dev/null
+++ b/public/js/report.js
@@ -0,0 +1,546 @@
+const state={token:'',password:null,showNames:true,cdTarget:0,cdTimer:null,cdBound:false};
+
+function esc(s){return String(s==null?'':s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''')}
+function pad(n){return String(n).padStart(2,'0')}
+function toDate(v){if(!v)return null;const d=new Date(v);return isNaN(d.getTime())?null:d}
+function fmtDate(v){const d=toDate(v);return d?pad(d.getDate())+'.'+pad(d.getMonth()+1)+'.'+d.getFullYear():''}
+function fmtShort(v){const d=toDate(v);return d?pad(d.getDate())+'.'+pad(d.getMonth()+1)+'.'+String(d.getFullYear()).slice(2):''}
+function fmtLong(v){const d=toDate(v);return d?d.toLocaleDateString('ru-RU',{day:'numeric',month:'long',year:'numeric'}):''}
+function plural(n,one,few,many){const m10=n%10,m100=n%100;if(m100>=11&&m100<=14)return many;if(m10===1)return one;if(m10>=2&&m10<=4)return few;return many}
+function words(n,one,few,many){return n+' '+plural(n,one,few,many)}
+function isImageFile(name){return /\.(jpe?g|jfif|png|gif|webp|bmp|avif|svg|ico)$/i.test(name||'')}
+function extLabel(name){const m=String(name||'').match(/\.([a-z0-9]{1,5})$/i);return m?m[1].toUpperCase():'FILE'}
+function baseName(name){return String(name||'файл').replace(/^.*[\\/]/,'').slice(0,80)}
+function thumbSrc(p){if(!p)return '';if(p.indexOf('/uploads/')===0)return '/uploads/thumb/'+p.slice(9);if(p.indexOf('/api/files/')>=0)return p+(p.indexOf('?')>=0?'&':'?')+'thumb=1';return p}
+function fileUrl(token){return '/api/share/'+encodeURIComponent(state.token)+'/files/'+encodeURIComponent(token)+(state.password?'?password='+encodeURIComponent(state.password):'')}
+function initials(name){const parts=String(name||'').trim().split(/\s+/).filter(Boolean);if(!parts.length)return 'WI';const a=parts[0].charAt(0);const b=parts.length>1?parts[1].charAt(0):(parts[0].length>1?parts[0].charAt(1):'');return (a+b).toUpperCase()}
+function setText(id,text){const el=document.getElementById(id);if(el)el.textContent=text==null?'':String(text)}
+function setHTML(id,html){const el=document.getElementById(id);if(el)el.innerHTML=html}
+function hideEl(el,on){if(el)el.classList.toggle('rep-hidden',!!on)}
+function node(html){const t=document.createElement('template');t.innerHTML=html.trim();return t.content.firstElementChild}
+function periodLabel(from,to){
+ if(!from&&!to)return '';
+ const a=toDate(from),b=toDate(to);
+ if(a&&b)return fmtDate(a)+' — '+fmtDate(b);
+ return fmtDate(a)||fmtDate(b);
+}
+function yearLabel(from,to){
+ const a=toDate(from),b=toDate(to);
+ if(!a&&!b)return '';
+ const ay=a?a.getFullYear():null,by=b?b.getFullYear():null;
+ if(ay&&by)return ay===by?String(ay):ay+' — '+String(by).slice(2);
+ return String(ay||by);
+}
+function countsLabel(photos,files){
+ const out=[];
+ if(photos)out.push(words(photos,'фото','фото','фото'));
+ if(files)out.push(words(files,'файл','файла','файлов'));
+ return out.join(' · ');
+}
+
+async function fetchShare(token,password){
+ const headers={};
+ if(password)headers['x-share-password']=password;
+ const res=await fetch('/api/share/'+encodeURIComponent(token),{headers});
+ const data=await res.json().catch(function(){return {}});
+ return {ok:res.ok,status:res.status,data:data};
+}
+
+function showError(msg){
+ stopCountdown();
+ setText('errorText',msg);
+ const box=document.getElementById('errorBox');
+ if(box)box.style.display='flex';
+ const content=document.getElementById('content');
+ if(content)content.style.display='none';
+}
+function stopCountdown(){
+ if(state.cdTimer){clearInterval(state.cdTimer);state.cdTimer=null}
+ state.cdTarget=0;
+ const el=document.getElementById('countdown');
+ if(el)el.style.display='none';
+}
+function formatRemaining(ms){
+ const total=Math.floor(ms/1000);
+ const days=Math.floor(total/86400);
+ const hours=Math.floor((total%86400)/3600);
+ const minutes=Math.floor((total%3600)/60);
+ const seconds=total%60;
+ const parts=[];
+ if(days>0)parts.push(words(days,'день','дня','дней'));
+ if(hours>0)parts.push(words(hours,'час','часа','часов'));
+ if(minutes>0)parts.push(words(minutes,'минуту','минуты','минут'));
+ if(days===0)parts.push(words(seconds,'секунду','секунды','секунд'));
+ return parts.slice(0,2).join(' ');
+}
+function syncCountdown(){
+ const el=document.getElementById('countdown');
+ if(!el||!state.cdTarget)return;
+ if(state.cdTarget-Date.now()<=0){el.style.display='none';return}
+ const hero=document.getElementById('hero');
+ const passed=hero?window.scrollY>hero.offsetHeight*0.5:true;
+ el.style.display=passed?'inline-flex':'none';
+}
+function tickCountdown(){
+ const el=document.getElementById('countdown');
+ if(!el||!state.cdTarget)return;
+ const left=state.cdTarget-Date.now();
+ if(left<=0){stopCountdown();return}
+ el.classList.toggle('rep-urgent',left<3600000);
+ el.classList.toggle('rep-warn',left>=3600000&&left<86400000);
+ const txt=el.querySelector('.rep-cd-text');
+ if(txt)txt.innerHTML='Отчёт доступен ещё
'+esc(formatRemaining(left))+'';
+ syncCountdown();
+}
+function startCountdown(expiresAt){
+ stopCountdown();
+ const t=toDate(expiresAt);
+ if(!t)return;
+ state.cdTarget=t.getTime();
+ if(state.cdTarget-Date.now()<=0){state.cdTarget=0;return}
+ if(!state.cdBound){state.cdBound=true;window.addEventListener('scroll',syncCountdown,{passive:true})}
+ tickCountdown();
+ state.cdTimer=setInterval(tickCountdown,1000);
+}
+
+function initSlider(slider,update){
+ if(!slider)return;
+ const track=slider.querySelector('.blocklist__list');
+ if(!track)return;
+ const prev=slider.querySelector('[data-slider-prev]');
+ const next=slider.querySelector('[data-slider-next]');
+ const step=function(){
+ const first=track.firstElementChild;
+ const w=first?first.getBoundingClientRect().width:track.clientWidth;
+ const visible=Math.max(1,Math.round(track.clientWidth/Math.max(1,w)));
+ return {width:Math.max(1,w),visible:visible};
+ };
+ const sync=function(){
+ const s=step();
+ const max=track.scrollWidth-track.clientWidth;
+ const one=track.scrollWidth<=track.clientWidth+4;
+ hideEl(prev,one||track.scrollLeft<=4);
+ hideEl(next,one||track.scrollLeft>=max-4);
+ };
+ const move=function(dir){
+ const s=step();
+ track.scrollBy({left:dir*s.width*s.visible,behavior:'smooth'});
+ };
+ if(prev)prev.addEventListener('click',function(){move(-1)});
+ if(next)next.addEventListener('click',function(){move(1)});
+ track.addEventListener('scroll',sync,{passive:true});
+ window.addEventListener('resize',sync);
+ sync();
+ if(update)update(sync);
+}
+function stepSlider(slider,dir){
+ const track=slider.querySelector('.blocklist__list');
+ if(!track)return;
+ const first=track.firstElementChild;
+ const w=first?first.getBoundingClientRect().width:track.clientWidth;
+ const visible=Math.max(1,Math.round(track.clientWidth/Math.max(1,w)));
+ track.scrollBy({left:dir*w*visible,behavior:'smooth'});
+}
+function scrollSliderTo(slider,index){
+ const track=slider.querySelector('.blocklist__list');
+ if(!track)return;
+ const child=track.children[index];
+ if(child)track.scrollTo({left:child.offsetLeft-track.offsetLeft,behavior:'smooth'});
+}
+function renderSlider(slider,items){
+ const track=slider.querySelector('.blocklist__list');
+ if(!track)return;
+ track.innerHTML=items.join('');
+ window.requestAnimationFrame(function(){initSlider(slider)});
+}
+
+function setNavVisible(name,on){
+ document.querySelectorAll('[data-nav="'+name+'"]').forEach(function(el){hideEl(el,!on)});
+}
+function makeNavLinks(){
+ document.querySelectorAll('.rep-nav .menu__link-lvl1').forEach(function(a){
+ a.addEventListener('click',function(){closeMenu()});
+ });
+}
+function openMenu(){
+ const panel=document.getElementById('navPanel');
+ const overlay=document.getElementById('navOverlay');
+ const close=document.getElementById('navClose');
+ if(panel)panel.classList.add('is-open');
+ if(overlay)overlay.classList.add('is-open');
+ if(close)close.classList.add('is-open');
+ document.documentElement.style.overflow='hidden';
+}
+function closeMenu(){
+ const panel=document.getElementById('navPanel');
+ const overlay=document.getElementById('navOverlay');
+ const close=document.getElementById('navClose');
+ if(panel)panel.classList.remove('is-open');
+ if(overlay)overlay.classList.remove('is-open');
+ if(close)close.classList.remove('is-open');
+ document.documentElement.style.overflow='';
+}
+
+function openModal(){const m=document.getElementById('passwordModal');if(m)m.classList.add('is-open');modalError('');const i=document.getElementById('passwordInput');if(i){i.value='';i.focus()}}
+function closeModal(){const m=document.getElementById('passwordModal');if(m)m.classList.remove('is-open')}
+function modalError(msg){const e=document.getElementById('passwordError');if(!e)return;e.textContent=msg||'';e.style.display=msg?'block':'none'}
+
+function openLightbox(src){const lb=document.getElementById('lightbox');const img=document.getElementById('lightboxImg');if(!lb||!img)return;img.src=src;lb.classList.add('is-open')}
+function photoPool(data){
+ const pool=[];
+ (data.entries||[]).forEach(function(e){if(e.photo_path)pool.push(e.photo_path)});
+ (data.photos||[]).forEach(function(p){if(p.photo_path)pool.push(p.photo_path)});
+ return pool;
+}
+function fileChips(files){
+ if(!files||!files.length)return '';
+ const items=files.map(function(f){
+ const url=fileUrl(f.token);
+ const label=baseName(f.name);
+ if(isImageFile(f.name))return '
'+esc(label)+'';
+ return '
'+esc(label)+'';
+ }).join('');
+ return '
'+items+'
';
+}
+function hideSection(id){
+ const el=document.getElementById(id);
+ if(el)el.style.display='none';
+}
+
+function renderHero(data,heading,pool){
+ const entries=data.entries||[];
+ setText('heroName',heading);
+ setText('heroRole',data.group_name?'Ученик группы «'+data.group_name+'»':'Отчёт о проделанной работе');
+ setText('heroPeriod',yearLabel(data.date_from,data.date_to)||yearLabel(data.created_at));
+ const lead=(data.message&&String(data.message).trim())||('Здесь собраны все занятия за выбранный период: '+words(entries.length,'запись','записи','записей')+'.');
+ setText('heroLead',lead);
+ const box=document.getElementById('heroPhotoBox');
+ const img=document.getElementById('heroPhoto');
+ if(box&&img&&pool.length){
+ img.src=thumbSrc(pool[0]);
+ img.alt=heading;
+ box.setAttribute('data-img',pool[0]);
+ }else if(box){
+ if(img)img.remove();
+ const mono=document.createElement('span');
+ mono.className='rep-monogram';
+ mono.textContent=initials(heading);
+ box.appendChild(mono);
+ box.classList.add('rep-hero-photo');
+ }
+}
+
+function statItem(num,cap,variant){
+ const sets=[
+ {item:'list__item list__item--u-ix00fc47p',num:'text text--u-iif5jnrfz text-number-1-script',cap:'text t2 text--u-ih2l1ywk8'},
+ {item:'list__item list__item--u-ic8gt20s1',num:'text text--u-ipk87vesx text-number-1-script',cap:'text t2 text--u-i53xasxdu'},
+ {item:'list__item list__item--u-ici0pcuqz',num:'text text--u-ir07nprxn text-number-1-script',cap:'text t2 text--u-ise2s2948'},
+ {item:'list__item list__item--u-ici0pcuqz list__item--u-irn5njhv8',num:'text text--u-ir07nprxn text-number-1-script',cap:'text t2 text--u-ise2s2948'}
+ ];
+ const s=sets[variant]||sets[0];
+ return '
'+
+ '
'+esc(num)+'
'+
+ '
'+esc(cap)+'
'+
+ '
';
+}
+function statSep(variant){
+ const extra=variant===1?' list__item--u-ip5wdmggw':(variant===2?' list__item--u-ixebr6v8q':'');
+ return '';
+}
+function renderAbout(data,pool){
+ const entries=data.entries||[];
+ const photos=(data.photos||[]).length;
+ const files=entries.reduce(function(n,e){return n+((e.files||[]).length)},0);
+ const months={};
+ entries.forEach(function(e){const d=toDate(e.created_at);if(d)months[d.getFullYear()+'-'+d.getMonth()]=1});
+ const photosTotal=entries.filter(function(e){return e.photo_path}).length+photos;
+ setText('aboutTitle',(data.name&&String(data.name).trim())||'Отчёт');
+ setText('aboutLead',(data.message&&String(data.message).trim())||('Мы собрали '+words(entries.length,'запись','записи','записей')+' о работе за этот период — с фотографиями, файлами и описанием каждого занятия.'));
+ const parts=[];
+ if(periodLabel(data.date_from,data.date_to))parts.push('Период: '+periodLabel(data.date_from,data.date_to));
+ if(data.group_name)parts.push('Группа «'+data.group_name+'»');
+ setText('aboutNote',parts.join(' · '));
+ setHTML('statsList',
+ statItem(entries.length,'записей о проделанной работе',0)+statSep(0)+
+ statItem(photosTotal,'фото с занятий',1)+statSep(1)+
+ statItem(files,'проектных файлов',2)+statSep(2)+
+ statItem(Object.keys(months).length,'месяцев активных занятий',3)
+ );
+ const box=document.getElementById('aboutPhotoBox');
+ const img=document.getElementById('aboutPhoto');
+ const photo=pool[1]||pool[0];
+ if(box&&img&&photo){img.src=thumbSrc(photo);img.alt='';box.setAttribute('data-img',photo);}
+ else if(box){
+ if(img)img.remove();
+ const mono=document.createElement('span');
+ mono.className='rep-about-monogram';
+ mono.textContent=initials((data.name&&String(data.name).trim())||data.student_name||'WhatIDo');
+ box.appendChild(mono);
+ }
+}
+
+function renderTimeline(data){
+ const entries=data.entries||[];
+ const list=document.getElementById('timelineList');
+ if(!list)return;
+ if(!entries.length){hideSection('timeline');setNavVisible('timeline',false);return}
+ const showDate=data.show_entry_date!==false;
+ const showDesc=!!data.show_student_message;
+ list.innerHTML=entries.map(function(e,index){
+ const files=e.files||[];
+ const stamp=showDate?fmtShort(e.created_at):pad(index+1);
+ const aside=[];
+ if(data.group_name)aside.push(data.group_name);
+ const counts=countsLabel(e.photo_path?1:0,files.length);
+ if(counts)aside.push(counts);
+ return '
'+
+ '
'+esc(stamp)+'
'+
+ '
'+
+ '
'+
+ (e.photo_path?'
':'')+
+ '
'+
+ '
'+
+ '
'+
+ '
'+esc(e.student_name||'Занятие')+''+
+ (showDesc&&e.description?'
'+esc(e.description)+'
':'')+
+ fileChips(files)+
+ '
'+
+ '
'+
+ aside.map(function(a){return '
'+esc(a)+'
'}).join('')+
+ '
'+
+ '
';
+ }).join('');
+}
+function workTitle(e){
+ const d=String(e.description||'').replace(/\s+/g,' ').trim();
+ if(d)return d.length>88?d.slice(0,88).trim()+'…':d;
+ return e.student_name||'Работа';
+}
+function renderWorks(data){
+ const slider=document.querySelector('.rep-slider[data-slider="works"]');
+ if(!slider)return;
+ const entries=(data.entries||[]).filter(function(e){return e.photo_path});
+ if(!entries.length){hideSection('works');setNavVisible('works',false);return}
+ const items=entries.slice(0,12).map(function(e,index){
+ return '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+esc(pad(index+1))+'
'+
+ '
'+
+ '
'+
+ '
'+esc(workTitle(e))+'
'+
+ '
'+esc(data.show_entry_date!==false?fmtDate(e.created_at):(e.student_name||''))+'
'+
+ '
'+
+ (data.show_student_message&&e.description&&workTitle(e)!==String(e.description).trim()?'
'+esc(e.description)+'
':'')+
+ fileChips(e.files)+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
';
+ });
+ renderSlider(slider,items);
+}
+
+function renderFiles(data){
+ const list=document.getElementById('filesList');
+ if(!list)return;
+ const rows=[];
+ (data.entries||[]).forEach(function(e){
+ (e.files||[]).forEach(function(f){rows.push({file:f,entry:e})});
+ });
+ if(!rows.length){hideSection('files');setNavVisible('files',false);return}
+ list.innerHTML=rows.map(function(row){
+ const f=row.file;
+ const url=fileUrl(f.token);
+ const label=baseName(f.name);
+ const isImg=isImageFile(f.name);
+ const meta=[];
+ if(data.show_entry_date!==false)meta.push(fmtDate(row.entry.created_at));
+ if(row.entry.student_name)meta.push(row.entry.student_name);
+ if(data.group_name)meta.push(data.group_name);
+ const icon=isImg
+ ?'
'
+ :'
'+esc(extLabel(f.name))+'
';
+ const head=isImg
+ ?'
'
+ :'';
+ return head+
+ ''+esc(fmtDate(row.entry.created_at))+'
'+
+ ''+
+ '
'+
+ '
'+
+ icon+
+ '
'+
+ '
'+
+ '
'+
+ ''+esc(label)+'
'+
+ ''+
+ ''+esc(meta.join(' · '))+''+
+ ''+(isImg?'Посмотреть':'Скачать')+''+
+ '
'+
+ '';
+ }).join('');
+}
+function renderGallery(data){
+ const slider=document.querySelector('.rep-slider[data-slider="gallery"]');
+ if(!slider)return;
+ const photos=data.photos||[];
+ if(!photos.length){hideSection('gallery');setNavVisible('gallery',false);return}
+ const items=photos.slice(0,12).map(function(p){
+ const caption=String(p.caption||'').trim();
+ return '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+esc(caption||(data.group_name?'Группа «'+data.group_name+'»':'Фото занятия'))+'
'+
+ '
'+esc(fmtDate(p.taken_at||p.created_at))+'
'+
+ '
'+esc(caption?'Фотография с занятий группы':'Фотография с занятий')+'
'+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '
';
+ });
+ renderSlider(slider,items);
+}
+
+function renderFooter(data,heading,pool){
+ setText('brandMark',initials(heading));
+ setText('brandMarkFooter',initials(heading));
+ setText('footGroup',data.group_name?'Группа «'+data.group_name+'»':'Группа не указана');
+ setText('footPeriod',periodLabel(data.date_from,data.date_to)?'Период: '+periodLabel(data.date_from,data.date_to):'Период: весь отчёт');
+ setText('footCreated','Обновлён: '+fmtDate(data.created_at));
+ const expires=toDate(data.expires_at);
+ setText('footExpires',expires?'Доступно до '+fmtDate(data.expires_at):'Срок не ограничен');
+ const link=document.getElementById('footLink');
+ if(link&&data.link_url&&/^https?:\/\//i.test(data.link_url)){link.href=data.link_url;link.style.display='inline-flex'}
+ else if(link){link.style.display='none'}
+ const note=document.getElementById('contactNote');
+ if(note)note.innerHTML='
Если появятся вопросы по отчёту — напишите преподавателю — мы ответим в течение 24 часов.';
+ setText('contactLead',(data.name&&String(data.name).trim())||'Отчёт о работе');
+ const sub=[];
+ if(periodLabel(data.date_from,data.date_to))sub.push('Период: '+periodLabel(data.date_from,data.date_to));
+ sub.push('Обновлён: '+fmtDate(data.created_at));
+ if(expires)sub.push('Доступен до: '+fmtDate(data.expires_at));
+ setText('contactSub',sub.join('\n'));
+ const btn=document.getElementById('contactBtn');
+ if(btn&&data.link_url&&/^https?:\/\//i.test(data.link_url)){
+ btn.href=data.link_url;
+ btn.target='_blank';
+ btn.rel='noopener noreferrer';
+ const label=btn.querySelector('.text-block-wrap-div');
+ if(label)label.textContent='Перейти по ссылке';
+ }
+ setText('footCopy','WhatIDo © '+new Date().getFullYear());
+ setText('footBrand',heading);
+ const fbox=document.getElementById('footerPhotoBox');
+ const fimg=document.getElementById('footerPhoto');
+ const photo=pool[2]||pool[0];
+ if(fbox&&fimg&&photo){fimg.src=thumbSrc(photo);fimg.alt='';fbox.setAttribute('data-img',photo)}
+ else if(fbox){hideEl(fbox,true)}
+}
+function renderReport(data){
+ const heading=(data.name&&String(data.name).trim())||data.student_name||data.group_name||'Отчёт';
+ document.title=heading;
+ const pool=photoPool(data);
+ renderHero(data,heading,pool);
+ renderAbout(data,pool);
+ renderTimeline(data);
+ renderWorks(data);
+ renderFiles(data);
+ renderGallery(data);
+ renderFooter(data,heading,pool);
+ startCountdown(data.expires_at);
+ const content=document.getElementById('content');
+ if(content)content.style.display='block';
+}
+
+async function loadReport(){
+ const token=location.pathname.split('/').filter(Boolean).pop()||'';
+ state.token=token;
+ state.password=null;
+ const result=await fetchShare(token,null);
+ if(result.ok){
+ state.showNames=result.data.show_student_names!==false;
+ renderReport(result.data);
+ return;
+ }
+ if(result.status===401&&result.data.passwordRequired){
+ openModal();
+ return;
+ }
+ if(result.status===410)showError('Срок действия ссылки истёк.');
+ else showError('Ссылка не найдена или была удалена.');
+ setText('brandMark',initials('WhatIDo'));
+ setText('brandMarkFooter',initials('WhatIDo'));
+}
+
+function bindEvents(){
+ const burger=document.getElementById('navBurger');
+ const close=document.getElementById('navClose');
+ const overlay=document.getElementById('navOverlay');
+ if(burger)burger.addEventListener('click',openMenu);
+ if(close)close.addEventListener('click',closeMenu);
+ if(overlay)overlay.addEventListener('click',closeMenu);
+ document.querySelectorAll('.rep-nav .menu__link-lvl1, .rep-nav .link--u-i2ifdcrc4').forEach(function(a){
+ a.addEventListener('click',function(){closeMenu()});
+ });
+ document.addEventListener('click',function(ev){
+ const prev=ev.target.closest('[data-slider-prev]');
+ const next=ev.target.closest('[data-slider-next]');
+ if(prev||next){
+ const slider=(prev||next).closest('.rep-slider');
+ if(slider){ev.preventDefault();stepSlider(slider,prev?-1:1)}
+ return;
+ }
+ const imgEl=ev.target.closest('[data-img]');
+ if(imgEl){ev.preventDefault();openLightbox(imgEl.getAttribute('data-img'));return}
+ const lb=document.getElementById('lightbox');
+ if(lb&&lb.classList.contains('is-open'))closeLightbox();
+ });
+ const submit=document.getElementById('passwordSubmitBtn');
+ const input=document.getElementById('passwordInput');
+ if(submit)submit.addEventListener('click',async function(){
+ const value=input?input.value.trim():'';
+ if(!value)return;
+ submit.disabled=true;
+ const result=await fetchShare(state.token,value);
+ submit.disabled=false;
+ if(result.ok){
+ state.password=value;
+ closeModal();
+ state.showNames=result.data.show_student_names!==false;
+ renderReport(result.data);
+ }else{
+ modalError(result.status===410?'Срок действия ссылки истёк':'Неверный пароль');
+ if(input){input.value='';input.focus()}
+ }
+ });
+ if(input)input.addEventListener('keydown',function(ev){
+ if(ev.key==='Enter'&&submit)submit.click();
+ });
+ const modal=document.getElementById('passwordModal');
+ if(modal)modal.addEventListener('click',function(ev){if(ev.target===modal)closeModal()});
+ document.addEventListener('keydown',function(ev){
+ if(ev.key!=='Escape')return;
+ closeLightbox();
+ closeMenu();
+ });
+ window.addEventListener('resize',function(){
+ if(window.innerWidth>991)closeMenu();
+ });
+}
+
+bindEvents();
+makeNavLinks();
+loadReport();
+function closeLightbox(){const lb=document.getElementById('lightbox');if(lb)lb.classList.remove('is-open')}
\ No newline at end of file
diff --git a/public/report.css b/public/report.css
new file mode 100644
index 0000000..a1531c9
--- /dev/null
+++ b/public/report.css
@@ -0,0 +1,9 @@
+/* WhatIDo report page - design system derived from the reference layout.
+ Generated file: do not edit by hand. */
+@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.menu{display:flex}.menu__wrapper-lvl1{background-color:transparent;background-image:linear-gradient(#fff,#fff);padding:10px}.menu__item-lvl1{position:relative}.menu__link-lvl1{color:#000;cursor:pointer;align-items:center;padding:5px 10px;text-decoration-line:none;display:flex}.menu__link-text{vertical-align:top;flex-grow:1;margin:0;display:inline-flex;position:relative}.menu__burger-button{cursor:pointer;background-color:transparent;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMjUnIGhlaWdodD0nMjUnIHZpZXdCb3g9JzAgMCAyNSAyNScgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTUgNi41QzUgNi4yMjM4NiA1LjIyMzg2IDYgNS41IDZIMTkuNUMxOS43NzYxIDYgMjAgNi4yMjM4NiAyMCA2LjVDMjAgNi43NzYxNCAxOS43NzYxIDcgMTkuNSA3SDUuNUM1LjIyMzg2IDcgNSA2Ljc3NjE0IDUgNi41Wk01IDEyLjVDNSAxMi4yMjM5IDUuMjIzODYgMTIgNS41IDEySDE5LjVDMTkuNzc2MSAxMiAyMCAxMi4yMjM5IDIwIDEyLjVDMjAgMTIuNzc2MSAxOS43NzYxIDEzIDE5LjUgMTNINS41QzUuMjIzODYgMTMgNSAxMi43NzYxIDUgMTIuNVpNNSAxOC41QzUgMTguMjIzOSA1LjIyMzg2IDE4IDUuNSAxOEgxOS41QzE5Ljc3NjEgMTggMjAgMTguMjIzOSAyMCAxOC41QzIwIDE4Ljc3NjEgMTkuNzc2MSAxOSAxOS41IDE5SDUuNUM1LjIyMzg2IDE5IDUgMTguNzc2MSA1IDE4LjVaJyBmaWxsPSd3aGl0ZScvPjwvc3ZnPg==),linear-gradient(#2bbbdc,#2bbbdc);background-position:50%;background-repeat:no-repeat;flex-shrink:0;justify-content:center;align-items:center;width:35px;height:35px;text-decoration-line:none}.menu__close-button{cursor:pointer;background-color:transparent;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMjUnIGhlaWdodD0nMjUnIHZpZXdCb3g9JzAgMCAyNSAyNScgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTUuMTQ2NDUgNS4xNDY0NUM1LjM0MTcxIDQuOTUxMTggNS42NTgyOSA0Ljk1MTE4IDUuODUzNTUgNS4xNDY0NUwxMi41IDExLjc5MjlMMTkuMTQ2NCA1LjE0NjQ1QzE5LjM0MTcgNC45NTExOCAxOS42NTgzIDQuOTUxMTggMTkuODUzNiA1LjE0NjQ1QzIwLjA0ODggNS4zNDE3MSAyMC4wNDg4IDUuNjU4MjkgMTkuODUzNiA1Ljg1MzU1TDEzLjIwNzEgMTIuNUwxOS44NTM2IDE5LjE0NjRDMjAuMDQ4OCAxOS4zNDE3IDIwLjA0ODggMTkuNjU4MyAxOS44NTM2IDE5Ljg1MzZDMTkuNjU4MyAyMC4wNDg4IDE5LjM0MTcgMjAuMDQ4OCAxOS4xNDY0IDE5Ljg1MzZMMTIuNSAxMy4yMDcxTDUuODUzNTUgMTkuODUzNkM1LjY1ODI5IDIwLjA0ODggNS4zNDE3MSAyMC4wNDg4IDUuMTQ2NDUgMTkuODUzNkM0Ljk1MTE4IDE5LjY1ODMgNC45NTExOCAxOS4zNDE3IDUuMTQ2NDUgMTkuMTQ2NEwxMS43OTI5IDEyLjVMNS4xNDY0NSA1Ljg1MzU1QzQuOTUxMTggNS42NTgyOSA0Ljk1MTE4IDUuMzQxNzEgNS4xNDY0NSA1LjE0NjQ1WicgZmlsbD0nIzI5MkUzNicvPjwvc3ZnPgo=),linear-gradient(#f5f5f5,#f5f5f5);background-position:50%;background-repeat:no-repeat;flex-shrink:0;justify-content:center;align-items:center;width:35px;height:35px;text-decoration-line:none}.menu__overlay{z-index:70;pointer-events:auto;background-color:transparent;background-image:linear-gradient(rgba(0,0,0,.5),rgba(0,0,0,.5));position:fixed;top:0;bottom:0;left:0;right:0;transform:translate(0,0)}.menu__fixed-wrapper{z-index:80;display:contents;position:fixed;top:0;bottom:0;left:0;right:0}.menu__scroll-wrapper{min-width:250px;height:100%;display:contents;position:relative;overflow:auto}.list__item{padding:10px}.link{cursor:pointer;display:inline-flex}.button{cursor:pointer;vertical-align:top;color:#fff;border-style:none;border-width:0;border-radius:3px;justify-content:center;align-items:center;padding:9px 18px;text-decoration-line:none;display:inline-flex;position:relative}.link-block{cursor:pointer;text-decoration-line:none;display:inline-flex}.image{vertical-align:top;width:100px;height:100px;display:inline-flex;position:relative;overflow:hidden}.image__img{object-fit:cover;width:100%;height:100%}.form{flex-direction:column;align-items:stretch;padding:20px;display:flex}.form *{outline-style:none}.text-button{display:inline-flex}.blocklist{vertical-align:top;width:100%;min-width:0;max-width:100%;line-height:normal;display:block;position:relative}.blocklist__list-wrapper{width:100%;height:100%}.blocklist__list{width:100%}.blocklist__item-wrapper{flex-shrink:0;max-width:100%;display:block}.blocklist__item{flex-grow:1;flex-shrink:1;max-width:100%;margin:20px}.blocklist__arrow-prev2{pointer-events:auto;cursor:pointer;background-color:transparent;background-repeat:no-repeat;flex-shrink:0;margin:auto auto auto 0}.blocklist__arrow-prev:disabled,.blocklist__arrow-prev2:disabled{pointer-events:none;cursor:auto;opacity:.35}.blocklist__arrow-next2{pointer-events:auto;cursor:pointer;background-color:transparent;background-repeat:no-repeat;margin:auto 0 auto auto}.blocklist__arrow-next:disabled,.blocklist__arrow-next2:disabled{pointer-events:none;cursor:auto;opacity:.35}.blocklist__controls-wrapper{pointer-events:none;z-index:4;position:absolute;top:0;bottom:0;left:0;right:0}.blocklist__controls{pointer-events:auto;max-width:100%;margin:auto auto 5px;padding:10px 30px;display:flex;position:relative}.blocklist__control-arrows{pointer-events:none;z-index:2;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.text{vertical-align:top;margin:0;display:inline-flex;position:relative}.section{width:100%;display:block;position:relative}.root{min-height:100vh;display:block;position:relative}.root:before,.root:after{content:"";clear:both;display:table}.div{width:100%;position:relative}.container{width:100%;margin:0 auto;position:relative}
+.blocklist__item--s2-iyza9pbv4{min-width:auto}.blocklist__item--s2-iefuhgv1p{min-width:auto}.image__img--s2-iyzrya226{object-fit:contain}.blocklist__item-wrapper--s2-ivnknl4k0{display:block}.blocklist__controls-wrapper--s2-igcvqnkng{display:flex}.blocklist__list-wrapper--s2-i4t2ufz23{overflow-x:hidden;overflow-y:hidden}.blocklist__list--s2-iou286xss{flex-wrap:nowrap}.blocklist__item-wrapper--s2-in9zna1lp{display:block}.blocklist__list-wrapper--s2-ijirftpw5{overflow-x:hidden;overflow-y:hidden}.blocklist__list--s2-iak70wit9{flex-wrap:nowrap;width:100%;height:auto}.blocklist__item-wrapper--s2-iuntcnkpn{height:auto}.blocklist__controls-wrapper--s2-ig787iibk{display:flex}.image__img--s2-ipfbguwr1{object-fit:contain}.image__img--s2-icfu2drw3{object-fit:contain}@media (max-width:991px){.blocklist__item--s2-iyza9pbv4{min-width:auto}}@media (max-width:991px){.blocklist--s2-ibgy2gpml{height:auto}}@media (max-width:991px){.blocklist--s2-ivlioq6ab{height:auto}}@media (max-width:991px){.blocklist__item--s2-iqn443glf{min-width:auto}}@media (max-width:991px){.blocklist--s2-iohyxn81v{height:auto}}@media (max-width:991px){.blocklist__item--s2-iefuhgv1p{min-width:auto}}@media (max-width:991px){.blocklist__item-wrapper--s2-ivnknl4k0{width:100%;height:auto}}@media (max-width:991px){.blocklist__list--s2-iou286xss{width:100%;height:auto}}@media (max-width:991px){.blocklist__item-wrapper--s2-in9zna1lp{width:100%;height:auto}}@media (max-width:991px){.blocklist__list--s2-iak70wit9{width:100%;height:auto}}@media (max-width:991px){.blocklist__item-wrapper--s2-iuntcnkpn{width:100%;height:auto}}.root--u-i8z5xo3zc{background-color:rgb(21,21,21);font-family:"Inter"}.text--u-ihro87s5g{color:rgba(255,255,255,1);text-align:center}.text--u-if3tqh9j6{color:rgba(255,255,255,0.2)}.text--u-il0q6mzel{color:rgba(255,255,255,0.2)}.div--u-iac2fpjoy{display:flex;justify-content:space-between;align-items:center}.section--u-imrochvid{display:flex;flex-direction:column;align-items:center;padding-bottom:100px;padding-top:40px}.div--u-iypw3r3hy{margin-top:-1.84vw;height:1px;background-color:rgba(255,255,255,0.05)}.div--u-ivqnx6ncb{height:1px;background-color:rgba(255,255,255,0.05)}.div--u-ii07pa6dy{display:flex;justify-content:space-between;align-items:flex-end}.image--u-ivhonc1br{width:auto;max-width:410px;height:auto}.image--u-i8jhhfeik{width:auto;max-width:410px;height:auto}.section--u-ije008ww5{border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:rgb(255,255,255);padding-top:80px;padding-bottom:80px;display:flex;flex-direction:column;align-items:center}.div--u-ivysvnhdd{height:100%;background-color:rgba(255,255,255,0.05);width:1px;position:absolute;top:0px}.div--u-ikil9thol{height:70%;background-color:rgba(0,0,0,0.05);width:1px;position:absolute;top:0px}.div--u-isbf1g6de{height:1px;background-color:rgba(0,0,0,0.05)}.text--u-ivqsnwblc{margin-right:auto;color:rgba(21,21,21,1)}.div--u-irqublwm9{width:5px;height:5px;background-color:rgb(0,0,0);position:absolute;top:-2px;left:-2px}.div--u-ikxc1qjen{width:5px;height:5px;background-color:rgb(0,0,0);position:absolute;top:-2px;right:-2px}.div--u-i88rv34ah{width:5px;height:5px;background-color:rgb(0,0,0);position:absolute;right:-2px;bottom:-2px}.div--u-i8l8bxdx6{width:5px;height:5px;background-color:rgb(0,0,0);position:absolute;left:-2px;bottom:-2px}.div--u-inkx4saax{height:230px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-color:rgba(0,0,0,0.05);border-left-color:rgba(0,0,0,0.05);border-right-color:rgba(0,0,0,0.05);border-bottom-color:rgba(0,0,0,0.05);display:flex;align-items:center;justify-content:flex-end;flex-direction:column;padding-left:23px;padding-right:23px;padding-top:23px;padding-bottom:23px;margin-top:50px;width:230px;background-color:rgb(255,255,255);margin-left:auto;margin-right:auto}.image--u-iidjge3zd{width:100%;height:auto;border-top-left-radius:50px;border-top-right-radius:50px;border-bottom-left-radius:50px;border-bottom-right-radius:50px}.div--u-i6wqm8o03{display:flex;width:50%;margin-left:auto}.text--u-iaopidyhq{max-width:500px;color:rgba(21,21,21,1)}.div--u-iayi3al5a{display:flex;flex-direction:column}.div--u-i7arpju57{width:50%;position:absolute;left:25%;height:100%;border-top-width:0px;border-right-width:1px;border-bottom-width:0px;border-left-width:1px;border-left-style:solid;border-left-color:rgba(0,0,0,0.05);border-right-style:solid;border-right-color:rgba(0,0,0,0.05)}.div--u-isrs3fsi8{width:50%;margin-left:25%;display:grid;grid-template-columns:1fr 1fr 1fr;column-gap:20px}.text--u-igq5dogo6{width:100%;color:rgba(174,176,176,1)}.div--u-iryjyivpv{display:flex;align-items:flex-end}.list--u-i59hjh2ej{display:flex;margin-top:50px;width:100%;justify-content:space-evenly;overflow-x:hidden;overflow-y:hidden}.list__item--u-ix00fc47p{display:flex;flex-direction:column;padding-top:0px;padding-bottom:0px;justify-content:flex-end;max-width:355px;width:100%;row-gap:10px;padding-left:10px;padding-right:10px}.text--u-iif5jnrfz{color:rgba(118,132,255,1)}.text--u-ih2l1ywk8{color:rgba(174,176,176,1);max-width:175px}.list__item--u-ic8gt20s1{display:flex;flex-direction:column;padding-left:10px;padding-right:10px;padding-top:0px;padding-bottom:0px;max-width:355px;width:100%;justify-content:flex-end;row-gap:10px}.text--u-ipk87vesx{color:rgba(118,132,255,1)}.text--u-i53xasxdu{color:rgba(174,176,176,1);max-width:175px}.list__item--u-isd3lg3iz{display:flex;flex-direction:column;padding-top:0px;padding-bottom:0px;max-height:250px;height:100vw;width:1px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-color:rgba(174,176,176,1);border-left-color:rgba(174,176,176,1);border-right-color:rgba(174,176,176,1);border-bottom-color:rgba(174,176,176,1);margin-left:0px;margin-right:0px;padding-left:0px;padding-right:0px}.list__item--u-ici0pcuqz{display:flex;flex-direction:column;padding-right:10px;padding-top:0px;padding-bottom:0px;max-width:355px;width:100%;justify-content:flex-end;row-gap:10px;padding-left:10px}.text--u-ir07nprxn{color:rgba(118,132,255,1)}.text--u-ise2s2948{color:rgba(174,176,176,1);max-width:175px}.list__item--u-irn5njhv8{max-width:355px}.button--u-i4a1jl1f8{margin-top:30px;height:60px;width:100%;padding-left:0px;padding-right:0px;padding-top:0px;padding-bottom:0px;background-size:auto;background-image:none;background-repeat:repeat;background-position:left 0px top 0px;background-attachment:scroll;background-color:rgb(21,21,21);border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;transition-property:background-color;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear}.button--u-i4a1jl1f8:hover{background-color:rgba(21,21,21,0.9)}.text--u-i6dz2a56i{margin-right:auto;color:rgba(255,255,255,1)}.section--u-iw83bdcw9{padding-top:80px;padding-bottom:150px;display:flex;flex-direction:column;row-gap:120px}.list--u-iaxl58kyi{display:flex;flex-direction:column;row-gap:50px}.list__item--u-ipltrh05x{max-height:80px;height:100vw;padding-left:0px;padding-right:0px;padding-top:0px;padding-bottom:0px;display:flex;grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:auto auto;justify-content:space-between;align-items:flex-end;transition-property:all;transition-duration:300ms;transition-delay:0ms;transition-timing-function:ease}.list__item--u-ipltrh05x:hover{border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-color:rgba(255,255,255,1);border-top-style:solid}.list__item--u-ipltrh05x:hover .div--u-i28d8g570{opacity:1}.list__item--u-ipltrh05x:hover .div--u-i26e5rzsk{opacity:1}.list__item--u-ipltrh05x:hover .div--u-i2d049m33{background-color:rgb(44,44,44);width:296px;height:296px;align-items:center;justify-content:center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-color:rgba(68,68,68,1);border-left-color:rgba(68,68,68,1);border-right-color:rgba(68,68,68,1);border-bottom-color:rgba(68,68,68,1)}.list__item--u-ipltrh05x:hover .div--u-it0l5f3ro{background-color:rgb(44,44,44);align-items:center;justify-content:center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-color:rgba(68,68,68,1);border-left-color:rgba(68,68,68,1);border-right-color:rgba(68,68,68,1);border-bottom-color:rgba(68,68,68,1);width:auto;height:auto;padding-left:58px;padding-right:58px;padding-top:58px;padding-bottom:58px}.list__item--u-ipltrh05x:hover .image--u-ijqu15ko7{width:180px;height:180px;border-top-left-radius:50px;border-top-right-radius:50px;border-bottom-left-radius:50px;border-bottom-right-radius:50px}.list__item--u-ipltrh05x:hover .image--u-i2etuklnt{height:180px;border-top-left-radius:50px;border-top-right-radius:50px;border-bottom-left-radius:50px;border-bottom-right-radius:50px;max-width:180px;width:180px}.list__item--u-ipltrh05x:hover .text--u-i3pvvosm9{color:rgba(255,255,255,1)}.list__item--u-ipltrh05x:hover .text--u-ie3ure5d7{color:rgba(255,255,255,1)}.text--u-ilncqhajz{color:rgba(56,56,56,1);grid-row-start:span 2;grid-row-end:span 2;max-width:275px}.text--u-ie3ure5d7{color:rgba(56,56,56,1);grid-row-start:span 2;grid-row-end:span 2;max-width:350px}.div--u-i26e5rzsk{grid-row-start:span 2;grid-row-end:span 2;width:80px;height:80px;display:flex;justify-content:center;align-items:center;opacity:0;z-index:1}.div--u-ib8lera1q{grid-row-start:span 2;grid-row-end:span 2;height:100%;display:flex;flex-direction:column;width:15%;align-items:flex-start;justify-content:center;row-gap:15px}.div--u-it0l5f3ro{grid-row-start:span 2;grid-row-end:span 2;width:300px;height:300px;display:flex;justify-content:center;align-items:center;position:absolute;z-index:2}.div--u-izku4a3eb{grid-row-start:span 2;grid-row-end:span 2;width:5px;height:5px;display:flex;justify-content:center;align-items:center;position:absolute;background-color:rgb(255,255,255);z-index:3;margin-top:100%;margin-right:100%}.div--u-iaj0y0mvl{grid-row-start:span 2;grid-row-end:span 2;width:5px;height:5px;display:flex;justify-content:center;align-items:center;position:absolute;background-color:rgb(255,255,255);z-index:3;margin-left:100%;margin-top:100%}.div--u-il2x5kjti{grid-row-start:span 2;grid-row-end:span 2;width:5px;height:5px;display:flex;justify-content:center;align-items:center;position:absolute;background-color:rgb(255,255,255);z-index:3;margin-left:100%;margin-bottom:100%}.div--u-iu4k5l3n1{grid-row-start:span 2;grid-row-end:span 2;width:5px;height:5px;display:flex;justify-content:center;align-items:center;position:absolute;background-color:rgb(255,255,255);z-index:3;margin-right:100%;margin-bottom:100%}.text--u-i8vddz288{color:rgba(56,56,56,1)}.text--u-ibx3d4g50{color:rgba(56,56,56,1)}.blocklist__item--u-iyza9pbv4{margin-left:0px;margin-top:0px;margin-bottom:0px;padding-left:30px;padding-right:30px;padding-top:30px;padding-bottom:30px;display:flex;justify-content:space-between;margin-right:0px;overflow-x:hidden;overflow-y:hidden}.blocklist--u-ibgy2gpml{border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-color:rgba(228,231,232,1);border-top-style:solid;margin-bottom:90px;z-index:3;max-width:none}.blocklist__arrow-prev2--u-i72uloioe{width:60px;height:60px;border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNi4wMDE2IDI2LjYwNjZMNi44MDk0NCAxNy40MTQ0TDYuODA5NDQgMTcuNDE0NEw1LjM5NTIyIDE2LjAwMDJMNS4zOTUyMyAxNi4wMDAyTDUuMzk1MDQgMTZMNi44MDkyNiAxNC41ODU4TDYuODA5NDQgMTQuNTg2TDE2LjAwMTggNS4zOTM1OUwxNy40MTYgNi44MDc4TDkuMjE0OTkgMTUuMDA4OUwyNS41MDQ4IDE1LjAwODhMMjUuNTA0OCAxNi45OTE2TDkuMjE1MDggMTYuOTkxNkwxNy40MTU5IDI1LjE5MjRMMTYuMDAxNiAyNi42MDY2WiIgZmlsbD0iIzE1MTUxNSIvPgo8L3N2Zz4K);background-size:40.22px;background-position:center center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(21,21,21,1);border-left-color:rgba(21,21,21,1);border-right-color:rgba(21,21,21,1);border-bottom-color:rgba(21,21,21,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;background-color:rgb(255,255,255);opacity:0.2;transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear}.blocklist__arrow-prev2--u-i72uloioe:hover{opacity:1}.blocklist__control-arrows--u-ihwh9bgqr{column-gap:10px}.blocklist__arrow-next2--u-ivlw85q4f{width:60px;height:60px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS45OTg0IDUuMzkzNDFMMjUuMTkwNiAxNC41ODU2TDI1LjE5MDYgMTQuNTg1NkwyNi42MDQ4IDE1Ljk5OThMMjYuNjA0OCAxNS45OTk4TDI2LjYwNSAxNkwyNS4xOTA3IDE3LjQxNDJMMjUuMTkwNiAxNy40MTRMMTUuOTk4MiAyNi42MDY0TDE0LjU4NCAyNS4xOTIyTDIyLjc4NSAxNi45OTEyTDYuNDk1MjMgMTYuOTkxMkw2LjQ5NTIzIDE1LjAwODRMMjIuNzg0OSAxNS4wMDg0TDE0LjU4NDEgNi44MDc2MkwxNS45OTg0IDUuMzkzNDFaIiBmaWxsPSIjMTUxNTE1Ii8+Cjwvc3ZnPgo=);background-size:40.22px;background-position:center center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(21,21,21,1);border-left-color:rgba(21,21,21,1);border-right-color:rgba(21,21,21,1);border-bottom-color:rgba(21,21,21,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;opacity:0.2;transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear}.blocklist__arrow-next2--u-ivlw85q4f:hover{opacity:1}.blocklist__controls--u-igz87d7pf{width:130px;margin-bottom:430px;padding-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;margin-top:-100px;margin-right:0px}.section--u-ibq7nxfzo{background-color:rgb(21,21,21);border-top-left-radius:20px;border-top-right-radius:20px;display:flex;flex-direction:column;row-gap:30px;padding-top:80px;align-items:center;justify-content:flex-end;padding-bottom:80px}.text--u-ihb2xbsz6{margin-right:auto;color:rgba(255,255,255,1)}.blocklist--u-ivlioq6ab{display:flex;flex-direction:row;width:auto;z-index:2;margin-left:-10px;margin-right:-10px;max-width:none}.blocklist__item--u-iqn443glf{background-color:rgb(21,21,21);margin-top:0px;margin-bottom:0px;width:100%;display:flex;justify-content:center;align-items:center;max-width:none;min-width:auto;margin-left:0px;margin-right:0px;padding-left:10px;padding-right:10px;overflow-x:hidden;overflow-y:hidden}.div--u-ifxd1g9rk{height:auto;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(44,44,44,1);border-left-color:rgba(44,44,44,1);border-right-color:rgba(44,44,44,1);border-bottom-color:rgba(44,44,44,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;display:flex;flex-direction:column;align-items:flex-start;justify-content:space-between;row-gap:50px;padding-left:30px;padding-right:30px;padding-top:30px;padding-bottom:30px}.div--u-ixtm7p8ov{height:5px;width:5px;position:absolute;background-color:rgb(255,255,255);margin-left:100%;margin-bottom:100%;top:-2px;right:-2px}.div--u-iidtqgnjo{height:5px;width:5px;position:absolute;background-color:rgb(255,255,255);bottom:-2px;left:-2px}.div--u-ibren39lw{height:5px;width:5px;position:absolute;background-color:rgb(255,255,255);margin-right:100%;margin-bottom:100%;top:-2px;left:-2px}.div--u-iohjzr62g{height:5px;width:5px;position:absolute;background-color:rgb(255,255,255);margin-left:100%;right:-2px;bottom:-2px}.div--u-ilvcq6gdk{display:flex;justify-content:space-between;align-items:flex-start}.text--u-i8ydj7eyx{color:rgba(255,255,255,1);max-width:350px}.text--u-iz3df5dls{color:rgba(255,255,255,1)}.div--u-ipp2467j8{width:auto;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(68,68,68,1);border-left-color:rgba(68,68,68,1);border-right-color:rgba(68,68,68,1);border-bottom-color:rgba(68,68,68,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;padding-left:20px;padding-right:20px;padding-top:10px;padding-bottom:10px;border-top-left-radius:100px;border-top-right-radius:100px;border-bottom-left-radius:100px;border-bottom-right-radius:100px}.image--u-iijk97g72{max-width:280px;width:auto;height:auto;margin-left:auto;margin-right:auto;border-top-left-radius:55px;border-top-right-radius:55px;border-bottom-left-radius:55px;border-bottom-right-radius:55px}.text--u-ib8dkw227{color:rgba(56,56,56,1)}.section--u-ip0mjje82{padding-top:80px;padding-bottom:80px;background-color:rgb(239,242,243);border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;display:flex;flex-direction:column;row-gap:30px}.text--u-i24jt3mcb{margin-right:auto}.list--u-iix2uh3ie{display:flex;flex-direction:column}.list__item--u-iusd5amsk{padding-left:0px;padding-right:0px;padding-top:20px;padding-bottom:20px;display:grid;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-top-color:rgba(228,231,232,1);grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:auto;justify-items:start;align-items:start;column-gap:10px}.div--u-iqdk5s4vv{max-width:230px;max-height:230px;padding-left:23px;padding-right:23px;padding-top:23px;padding-bottom:23px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(217,220,221,1);border-left-color:rgba(217,220,221,1);border-right-color:rgba(217,220,221,1);border-bottom-color:rgba(217,220,221,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid}.div--u-iq1qpzuod{width:5px;height:5px;background-color:rgb(21,21,21);position:absolute;margin-bottom:100%;margin-left:100%}.div--u-itqr1x7ye{width:5px;height:5px;background-color:rgb(21,21,21);position:absolute;margin-bottom:100%;margin-right:100%}.div--u-iauar4gpi{width:5px;height:5px;background-color:rgb(21,21,21);position:absolute;margin-top:100%;margin-left:100%}.div--u-i78hvbbl0{width:5px;height:5px;background-color:rgb(21,21,21);position:absolute;margin-top:100%;margin-right:100%}.div--u-i65kawao9{width:auto;padding-left:20px;padding-right:20px;padding-top:10px;padding-bottom:10px;border-top-left-radius:100px;border-top-right-radius:100px;border-bottom-left-radius:100px;border-bottom-right-radius:100px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(187,189,190,1);border-left-color:rgba(187,189,190,1);border-right-color:rgba(187,189,190,1);border-bottom-color:rgba(187,189,190,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid}.text--u-inm34sjkb{color:rgba(174,176,176,1)}.image--u-i1bx3pcch{max-width:180px;width:100%;max-height:180px;height:auto;border-top-left-radius:50px;border-top-right-radius:50px;border-bottom-left-radius:50px;border-bottom-right-radius:50px}.text--u-i0erozcli{max-width:380px;color:rgba(174,176,176,1)}.text--u-ih08rddti{max-width:370px}.blocklist--u-iohyxn81v{display:flex;width:100%;flex-direction:row;max-height:370px;height:100vw;justify-content:center;align-items:center}.blocklist__arrow-next2--u-ixzxe7qta{width:60px;height:60px;background-image:var(--sf-img-7);background-position:center center;background-size:40.22px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(255,255,255,1);border-left-color:rgba(255,255,255,1);border-right-color:rgba(255,255,255,1);border-bottom-color:rgba(255,255,255,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;opacity:0.2}.blocklist__arrow-prev2--u-i8t1smxl7{width:60px;height:60px;background-image:var(--sf-img-8);background-size:40.22px;background-position:center center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(255,255,255,1);border-left-color:rgba(255,255,255,1);border-right-color:rgba(255,255,255,1);border-bottom-color:rgba(255,255,255,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-left-radius:10px;border-top-right-radius:10px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;opacity:0.2}.blocklist__control-arrows--u-ihw55qli4{column-gap:10px}.blocklist__controls--u-iau8c9wem{padding-left:65px;padding-right:65px;margin-left:auto;margin-right:0px;margin-top:-100px;margin-bottom:auto;padding-top:30px;padding-bottom:30px}.blocklist__item--u-iefuhgv1p{margin-top:0px;margin-bottom:0px;display:flex;justify-content:center;align-items:center;margin-left:0px;margin-right:0px}.section--u-i0y44hvpw{background-color:rgb(21,21,21);border-top-left-radius:20px;border-top-right-radius:20px;display:flex;flex-direction:column;row-gap:30px;padding-top:80px;align-items:center;justify-content:center;padding-bottom:80px}.text--u-ikcqharhc{margin-right:auto;color:rgba(255,255,255,1)}.div--u-ig1bsrybs{width:1px;height:100%;position:absolute;background-color:rgb(33,33,33);z-index:auto}.div--u-i0kioh3ih{position:absolute;height:1px;background-color:rgb(33,33,33);z-index:auto}.div--u-iova3e6no{max-width:370px;padding-top:93px;padding-bottom:93px;padding-left:93px;padding-right:93px;display:flex;justify-content:center;align-items:center;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(44,44,44,1);border-left-color:rgba(44,44,44,1);border-right-color:rgba(44,44,44,1);border-bottom-color:rgba(44,44,44,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;flex-direction:column;width:100%;background-color:rgb(21,21,21);z-index:10;height:auto;max-height:370px}.image--u-ipuomcrxx{max-width:180px;width:auto;height:auto;border-top-left-radius:50px;border-top-right-radius:50px;border-bottom-left-radius:50px;border-bottom-right-radius:50px}.div--u-iy3zasv7f{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-bottom:100%;margin-right:100%;top:-2px;left:-2px}.div--u-ish1rimi9{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-bottom:100%;margin-left:100%;top:-2px;right:-3px}.div--u-ij727gv6j{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-top:100%;margin-left:100%;bottom:-2px;right:-3px}.div--u-iymundgii{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-top:100%;margin-right:100%;bottom:-2px;left:-2px}.div--u-iq00jif9z{display:flex;flex-direction:column;align-items:flex-start;padding-top:35px;padding-bottom:35px;padding-left:28px;padding-right:28px;row-gap:10px;max-width:385px;max-height:370px;margin-left:-1px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(44,44,44,1);border-left-color:rgba(44,44,44,1);border-right-color:rgba(44,44,44,1);border-bottom-color:rgba(44,44,44,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;background-color:rgb(21,21,21);justify-content:space-between;height:60vw;z-index:9}.text--u-i6vup9a8s{color:rgba(255,255,255,1)}.text--u-iwrgrsqzk{color:rgba(56,56,56,1);margin-bottom:auto}.text--u-ig38djg6x{color:rgba(255,255,255,1)}.div--u-i8lri9goh{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-left:100%;z-index:5;right:-2px;bottom:-2px;margin-bottom:96%}.link-block--u-ic5ntfotz:hover{opacity:0.6}.link--u-ihn1tumex:hover{opacity:0.5}.link--u-iw5fg3iez:hover{opacity:0.5}.link--u-i6sruiw9p:hover{opacity:0.5}.link--u-ivy8mkxoi:hover{opacity:0.5}.link--u-i17jh0lsx:hover{opacity:0.5}.link--u-ioxiekbkh:hover{opacity:0.5}.link-block--u-ij7yf5mm2:hover{opacity:0.5}.menu__link-text--u-i2qgb1ij1:hover{opacity:0.5}.link--u-i2ifdcrc4:hover{opacity:0.5;text-decoration:underline}.div--u-i4kmjxmbi{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-top:100%;margin-left:100%;z-index:5;right:-2px;bottom:-2px}.div--u-ivyxhpbts{height:600px;width:450px;border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;overflow-x:hidden;overflow-y:hidden;margin-top:-5vw;z-index:1;flex-shrink:0;pointer-events:none}.image--u-is0urbrfg{width:450px;height:100%;pointer-events:auto}.div--u-inb3arto0{position:absolute;height:100%;padding-left:25px;padding-right:25px;padding-top:25px;padding-bottom:25px;z-index:1}.div--u-iloks34xh{height:100%;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;border-top-color:rgba(255,255,255,0.1);border-left-color:rgba(255,255,255,0.1);border-right-color:rgba(255,255,255,0.1);border-bottom-color:rgba(255,255,255,0.1);display:flex;align-items:center;justify-content:flex-end;flex-direction:column;padding-left:35px;padding-right:35px;padding-top:35px;padding-bottom:35px;z-index:2}.div--u-iasmwwdzw{width:5px;height:5px;background-color:rgb(255,255,255);position:absolute;top:-2px;left:-2px}.div--u-i9jct2f9m{width:5px;height:5px;background-color:rgb(255,255,255);position:absolute;top:-2px;right:-2px}.div--u-is7e9z5nq{width:5px;height:5px;background-color:rgb(255,255,255);position:absolute;right:-2px;bottom:-2px}.div--u-i0k4yxpc8{width:5px;height:5px;background-color:rgb(255,255,255);position:absolute;left:-2px;bottom:-2px}.image--u-id09xtq63{width:40px;height:20px;pointer-events:auto}.text--u-is1fxv2no{color:rgba(255,255,255,1);margin-top:40px;text-align:center;max-width:370px;pointer-events:auto}.text--u-ig2k8b0st{color:rgba(255,255,255,1);margin-top:20px;text-align:center;pointer-events:auto}.image--u-i5hwy71ca{width:40px;height:20px;margin-top:40px;pointer-events:auto}@media (max-width:991px){.div--u-ii07pa6dy{max-width:768px;justify-content:center}}@media (max-width:991px){.image--u-ivhonc1br{height:auto;position:absolute;max-width:383px;max-height:383px;bottom:-100px;left:0%}}@media (max-width:991px){.image--u-i8jhhfeik{height:auto;max-width:383px;max-height:383px;position:absolute;bottom:-100px;right:0%}}@media (max-width:991px){.div--u-ikil9thol{height:80%}}@media (max-width:991px){.div--u-inkx4saax{width:190px;height:190px;grid-row-start:1;grid-row-end:1;grid-column-start:2;grid-column-end:3}}@media (max-width:991px){.image--u-iidjge3zd{max-width:140px}}@media (max-width:991px){.div--u-i7arpju57{border-left-width:0px;border-left-style:none;border-right-width:0px;border-right-style:none}}@media (max-width:991px){.div--u-iryjyivpv{display:none}}@media (max-width:991px){.list__item--u-ix00fc47p{padding-left:0px;padding-right:0px}}@media (max-width:991px){.list__item--u-ic8gt20s1{padding-left:0px;padding-right:0px}}@media (max-width:991px){.list__item--u-isd3lg3iz{max-height:210px;margin-left:5px;margin-right:5px}}@media (max-width:991px){.list__item--u-ici0pcuqz{margin-left:0px;margin-right:0px;padding-left:0px;padding-right:0px}}@media (max-width:991px){.list__item--u-irn5njhv8{margin-right:0px;margin-left:0px}}@media (max-width:991px){.button--u-i4a1jl1f8{margin-top:20px}}@media (max-width:991px){.text-button--u-i4t8wl9m2{font-size:15px;font-weight:500;line-height:100%;letter-spacing:-0.05em}}@media (max-width:991px){.section--u-iw83bdcw9{padding-bottom:80px}}@media (max-width:991px){.list__item--u-ipltrh05x{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:auto auto;row-gap:40px;max-height:211px;padding-top:21px;padding-bottom:55px;column-gap:20px}}@media (max-width:991px){.list__item--u-ipltrh05x:hover{border-top-width:0px;border-top-style:none}}@media (max-width:991px){.list__item--u-ipltrh05x:hover .div--u-it0l5f3ro{width:190px;height:190px}}@media (max-width:991px){.list__item--u-ipltrh05x:hover .image--u-i2etuklnt{width:140px;height:140px;border-top-left-radius:40px;border-top-right-radius:40px;border-bottom-left-radius:40px;border-bottom-right-radius:40px}}@media (max-width:991px){.text--u-ilncqhajz{max-width:126px;align-self:start}}@media (max-width:991px){.text--u-ie3ure5d7{grid-column-start:span 2;grid-column-end:span 2;grid-row-start:span 1;grid-row-end:span 1;color:rgba(255,255,255,1);justify-self:start}}@media (max-width:991px){.div--u-i26e5rzsk{opacity:1}}@media (max-width:991px){.div--u-ib8lera1q{grid-row-start:span 1;grid-row-end:span 1;grid-column-start:span 2;grid-column-end:span 2;width:auto}}@media (max-width:991px){.div--u-it0l5f3ro{width:190px;height:190px;background-color:rgb(44,44,44);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(68,68,68,1);border-left-color:rgba(68,68,68,1);border-right-color:rgba(68,68,68,1);border-bottom-color:rgba(68,68,68,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid}}@media (max-width:991px){.image--u-i2etuklnt{width:140px;height:140px;border-top-left-radius:40px;border-top-right-radius:40px;border-bottom-left-radius:40px;border-bottom-right-radius:40px}}@media (max-width:991px){.blocklist__controls--u-igz87d7pf{margin-top:-80px;margin-right:0px}}@media (max-width:991px){.div--u-ifxd1g9rk{max-width:none}}@media (max-width:991px){.list__item--u-iusd5amsk{row-gap:20px;grid-template-rows:auto auto;column-gap:20px}}@media (max-width:991px){.div--u-iqdk5s4vv{grid-row-start:span 4;grid-row-end:span 4;max-width:190px;max-height:190px}}@media (max-width:991px){.div--u-i65kawao9{grid-row-start:span 4;grid-row-end:span 4}}@media (max-width:991px){.image--u-i1bx3pcch{max-width:140px;max-height:140px}}@media (max-width:991px){.text--u-i0erozcli{grid-column-start:span 2;grid-column-end:span 2;max-width:344px;align-self:start}}@media (max-width:991px){.text--u-ih08rddti{grid-column-start:span 2;grid-column-end:span 2}}@media (max-width:991px){.div--u-iova3e6no{max-width:none;width:50%;max-height:366px;height:100%;padding-left:91.5px;padding-right:91.5px}}@media (max-width:991px){.div--u-ish1rimi9{right:-3px}}@media (max-width:991px){.div--u-ij727gv6j{right:-3px}}@media (max-width:991px){.div--u-iq00jif9z{max-width:none;width:50%;height:472px;margin-left:-1px;max-height:366px}}@media (max-width:991px){.menu--u-i9yrdei10.is-opened .button--u-iij3zrpzq:hover{background-color:rgb(89,99,185)}}@media (max-width:991px){.div--u-ih80fbo71{display:none}}@media (max-width:991px){.div--u-iloks34xh{padding-left:15px;padding-right:15px;padding-top:25px;padding-bottom:25px}}@media (max-width:767px){.div--u-iac2fpjoy{margin-top:10px;margin-bottom:25px}}@media (max-width:767px){.section--u-imrochvid{padding-bottom:20px;padding-top:20px}}@media (max-width:767px){.image--u-ivhonc1br{display:none}}@media (max-width:767px){.image--u-i8jhhfeik{display:none}}@media (max-width:767px){.section--u-ije008ww5{padding-top:50px;padding-bottom:50px}}@media (max-width:767px){.div--u-ikil9thol{height:90%}}@media (max-width:767px){.text--u-ivqsnwblc{margin-right:0px}}@media (max-width:767px){.div--u-inkx4saax{width:174px;height:174px}}@media (max-width:767px){.div--u-i6wqm8o03{margin-left:0px;width:100%;text-align:center}}@media (max-width:767px){.text--u-iaopidyhq{margin-top:30px}}@media (max-width:767px){.div--u-iayi3al5a{align-items:center}}@media (max-width:767px){.div--u-isrs3fsi8{margin-left:0px}}@media (max-width:767px){.list--u-i59hjh2ej{display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:auto auto;align-items:end;justify-items:center;max-width:345px}}@media (max-width:767px){.list__item--u-ix00fc47p{max-width:166px;justify-self:start}}@media (max-width:767px){.list__item--u-ic8gt20s1{max-width:166px;justify-self:end}}@media (max-width:767px){.text--u-i53xasxdu{width:150px}}@media (max-width:767px){.list__item--u-isd3lg3iz{margin-left:0px;margin-right:12px}}@media (max-width:767px){.list__item--u-ici0pcuqz{max-width:166px;justify-self:start}}@media (max-width:767px){.list__item--u-irn5njhv8{max-width:166px;justify-self:end}}@media (max-width:767px){.section--u-iw83bdcw9{padding-top:50px;padding-bottom:50px}}@media (max-width:767px){.list--u-iaxl58kyi{row-gap:20px}}@media (max-width:767px){.list__item--u-ipltrh05x{max-height:275px;grid-template-columns:1fr 1fr;grid-auto-flow:column;row-gap:20px;padding-top:20px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-color:rgba(33,33,33,1);border-top-style:solid}}@media (max-width:767px){.text--u-ilncqhajz{max-width:97px}}@media (max-width:767px){.text--u-ie3ure5d7{align-self:start;grid-column-start:span 1;grid-column-end:span 1}}@media (max-width:767px){.div--u-i26e5rzsk{grid-row-start:span 1;grid-row-end:span 1;justify-self:start;width:100%;max-width:174px;height:100%;max-height:174px}}@media (max-width:767px){.div--u-ib8lera1q{grid-row-start:2;grid-row-end:2;grid-column-start:2;grid-column-end:2;align-self:start;justify-content:flex-start}}@media (max-width:767px){.div--u-it0l5f3ro{width:170px;height:170px}}@media (max-width:767px){.blocklist__item--u-iyza9pbv4{padding-left:20px;padding-right:20px;padding-top:20px;padding-bottom:20px;row-gap:20px}}@media (max-width:767px){.section--u-ibq7nxfzo{padding-top:50px;padding-bottom:50px}}@media (max-width:767px){.blocklist--u-ivlioq6ab{margin-top:20px}}@media (max-width:767px){.section--u-ip0mjje82{padding-top:50px;padding-bottom:50px}}@media (max-width:767px){.text--u-i24jt3mcb{margin-left:auto}}@media (max-width:767px){.list--u-iix2uh3ie{margin-top:20px}}@media (max-width:767px){.list__item--u-iusd5amsk{grid-template-columns:1fr 1fr;grid-auto-flow:column}}@media (max-width:767px){.div--u-iqdk5s4vv{grid-row-start:span 1;grid-row-end:span 1;max-width:174px;max-height:174px}}@media (max-width:767px){.div--u-i65kawao9{grid-row-start:span 1;grid-row-end:span 1}}@media (max-width:767px){.text--u-i0erozcli{grid-column-start:span 1;grid-column-end:span 1}}@media (max-width:767px){.text--u-ih08rddti{grid-column-start:span 1;grid-column-end:span 1}}@media (max-width:767px){.blocklist--u-iohyxn81v{max-width:none;max-height:none;margin-top:20px;height:auto}}@media (max-width:767px){.blocklist__controls--u-iau8c9wem{margin-top:-80px}}@media (max-width:767px){.blocklist__item--u-iefuhgv1p{flex-direction:column;max-width:none}}@media (max-width:767px){.section--u-i0y44hvpw{padding-top:50px;padding-bottom:50px}}@media (max-width:767px){.div--u-i0kioh3ih{display:none}}@media (max-width:767px){.div--u-iova3e6no{width:auto;max-width:350px;height:auto;max-height:none}}@media (max-width:767px){.div--u-ij727gv6j{bottom:-3px}}@media (max-width:767px){.div--u-iymundgii{bottom:-3px}}@media (max-width:767px){.div--u-iq00jif9z{width:auto;height:auto;margin-left:0px;max-height:350px;margin-top:-1px;max-width:350px}}@media (max-width:767px){.text--u-ig38djg6x{margin-top:50px}}@media (max-width:767px){.div--u-i8lri9goh{margin-right:100%;margin-left:0px;margin-bottom:0%}}@media (max-width:767px){.list__item--u-ip5wdmggw{grid-row-start:2;grid-row-end:2;grid-column-start:2;grid-column-end:2}}@media (max-width:767px){.list__item--u-ixebr6v8q{display:none}}@media (max-width:767px){.div--u-ivyxhpbts{margin-top:0vw}}@media (max-width:767px){.text--u-is1fxv2no{max-width:300px}}@media (max-width:767px){.text--u-ig2k8b0st{display:none}}@media (max-width:479px){.div--u-ii07pa6dy{padding-left:20px;padding-right:20px}}@media (max-width:479px){.div--u-ivyxhpbts{width:280px;height:373px}}@media (max-width:479px){.image--u-is0urbrfg{width:280px;height:373px}}
+.section--u-ihbjvn71x{padding-top:40px;padding-bottom:20px;display:flex;flex-direction:column;align-items:center;overflow-x:hidden;overflow-y:hidden}.text--u-ifdrgto5v{margin-right:auto;color:rgba(255,255,255,1);margin-left:30px}.div--u-ivyhwi7sr{position:absolute;width:1px;height:100%;top:0px;z-index:2;background-color:rgb(33,33,33)}.div--u-iq5a3c8eo{display:grid;justify-content:space-between;grid-template-columns:1fr 1fr 1fr 1fr;grid-auto-flow:row;z-index:1;border-top-width:1px;border-right-width:0px;border-bottom-width:1px;border-left-width:0px;border-top-color:rgba(44,44,44,1);border-left-color:rgba(44,44,44,1);border-right-color:rgba(44,44,44,1);border-bottom-color:rgba(44,44,44,1);border-top-style:solid;border-bottom-style:solid}.image--u-ipv2zlpi2{grid-column-start:span 2;grid-column-end:span 2;justify-self:start;max-width:255px;max-height:255px;height:100%;width:100%;grid-row-start:span 1;grid-row-end:span 1}.text--u-ieyliov62{margin-right:0;color:rgba(255,255,255,1);align-self:start}.image--u-im8xge6of{justify-self:end;max-width:255px;max-height:255px;width:100%;height:100%}.div--u-ifj6asx15{display:flex;flex-direction:column;justify-content:center;align-items:center;padding-left:25px;padding-right:25px;padding-top:25px;padding-bottom:25px;width:auto;margin-top:-115px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-color:rgba(44,44,44,1);border-left-color:rgba(44,44,44,1);border-right-color:rgba(44,44,44,1);border-bottom-color:rgba(44,44,44,1);border-top-style:solid;border-left-style:solid;border-right-style:solid;border-bottom-style:solid;z-index:3;background-color:rgb(21,21,21)}.div--u-i95yztn00{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-bottom:100%;margin-right:100%;top:-2px;left:-2px}.div--u-iqswnal3i{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-bottom:100%;margin-left:100%;top:-2px;right:-2px}.image--u-i9ff2hgvg{max-width:180px;width:auto;height:auto;border-top-left-radius:55px;border-top-right-radius:55px;border-bottom-left-radius:55px;border-bottom-right-radius:55px}.image--u-ishqnsp3y{position:absolute;width:40px;height:20px}.div--u-iosm3syjx{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-top:100%;margin-left:100%;bottom:-2px;right:-2px}.div--u-imsajm4rq{width:5px;height:5px;position:absolute;background-color:rgb(255,255,255);margin-top:100%;margin-right:100%;left:-2px;bottom:-2px}.div--u-i0phithov{display:flex;margin-top:50px;column-gap:20px;padding-left:30px;padding-right:30px}.div--u-i82ybieml{width:100%;grid-template-columns:1fr 1fr;grid-template-rows:auto auto auto;grid-auto-flow:row;padding-bottom:30px;row-gap:50px;display:flex;flex-direction:column;max-width:50%}.link-block--u-ic5ntfotz{align-items:center;justify-content:center;margin-right:auto;align-self:start;grid-column-start:span 2;grid-column-end:span 2;transition-property:all;transition-duration:300ms;transition-delay:0ms;transition-timing-function:ease}.link-block--u-ic5ntfotz:hover{opacity:0.6}.image--u-iwz9z9ztv{max-width:none;height:auto;width:44px}.div--u-iqpqkl8er{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:auto auto;grid-auto-flow:column;width:auto;max-width:350px}.div--u-i230b7fin{grid-row-start:span 2;grid-row-end:span 2;grid-column-start:span 1;grid-column-end:span 1;display:flex;flex-direction:column;width:auto;align-items:flex-start;justify-content:flex-end;max-width:92px;row-gap:12px}.text--u-iukrw4zbo{color:rgba(68,68,68,1)}.link--u-ihn1tumex{color:rgba(255,255,255,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear;text-decoration:none}.link--u-ihn1tumex:hover{opacity:0.5}.link--u-iw5fg3iez{color:rgba(255,255,255,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear;text-decoration:none}.link--u-iw5fg3iez:hover{opacity:0.5}.link--u-i6sruiw9p{color:rgba(255,255,255,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear;text-decoration:none}.link--u-i6sruiw9p:hover{opacity:0.5}.link--u-ivy8mkxoi{color:rgba(255,255,255,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear;text-decoration:none}.link--u-ivy8mkxoi:hover{opacity:0.5}.link--u-i17jh0lsx{color:rgba(255,255,255,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear;text-decoration:none}.link--u-i17jh0lsx:hover{opacity:0.5}.div--u-i3z8k7bsc{display:flex;flex-direction:column;row-gap:12px;align-self:start;align-items:flex-start}.text--u-isp07chjo{color:rgba(68,68,68,1)}.div--u-i94yzqcsn{display:flex;flex-direction:column;row-gap:12px;align-self:start;align-items:flex-start}.text--u-ibz851gxs{color:rgba(68,68,68,1)}.link--u-ioxiekbkh{color:rgba(255,255,255,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear;text-decoration:none}.link--u-ioxiekbkh:hover{opacity:0.5}.form--u-i3ge2e3aw{padding-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px}.div--u-inush9rz9{display:flex;justify-content:space-between;padding-left:30px;padding-right:30px;padding-top:20px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-color:rgba(33,33,33,1);border-top-style:solid}.text--u-irub9snx4{color:rgba(255,255,255,1)}@media (max-width:991px){.text--u-ifdrgto5v{max-width:230px}}@media (max-width:991px){.div--u-ivyhwi7sr{z-index:0;height:40%}}@media (max-width:991px){.text--u-ieyliov62{position:absolute;justify-self:center;margin-left:50%}}@media (max-width:991px){.image--u-im8xge6of{grid-column-start:span 2;grid-column-end:span 2}}@media (max-width:991px){.div--u-i0phithov{flex-direction:column}}@media (max-width:991px){.div--u-i82ybieml{padding-top:50px;max-width:none;flex-direction:row;order:1000}}@media (max-width:991px){.div--u-iqpqkl8er{width:50%;max-width:none}}@media (max-width:991px){.div--u-inush9rz9{border-top-width:0px;border-top-style:none}}@media (max-width:767px){.text--u-ifdrgto5v{margin-left:auto;max-width:none;margin-bottom:30px;z-index:5}}@media (max-width:767px){.div--u-ivyhwi7sr{height:30%}}@media (max-width:767px){.text--u-ieyliov62{margin-left:auto;margin-right:auto;max-width:310px;text-align:center;z-index:5}}@media (max-width:767px){.div--u-i82ybieml{height:380px}}@media (max-width:767px){.div--u-iqpqkl8er{position:absolute;width:100%;row-gap:30px}}@media (max-width:767px){.div--u-i230b7fin{grid-row-start:1;grid-row-end:1;grid-column-start:2;grid-column-end:2}}@media (max-width:767px){.div--u-i3z8k7bsc{grid-row-start:2;grid-row-end:2;grid-column-start:1;grid-column-end:1}}@media (max-width:767px){.div--u-i94yzqcsn{grid-row-start:2;grid-row-end:2;grid-column-start:2;grid-column-end:2}}
+.menu__list-lvl1--s2-ioyaxt4m1{display:flex}.menu__wrapper-lvl1--s2-ic1ljomjg{display:block;position:static}@media (max-width:991px){.menu__list-lvl1--s2-ioyaxt4m1{display:block}}@media (max-width:991px){.menu__wrapper-lvl1--s2-ic1ljomjg{display:block;min-height:100%;position:static}}@media (max-width:991px){.menu__burger-button--s2-ibf8kzqjr{display:block}}@media (max-width:991px){.menu__scroll-wrapper--s2-ihg46fvlv{display:block}}@media (max-width:991px){.menu__close-button--s2-ib386a3r1{display:block}}@media (max-width:991px){.menu__fixed-wrapper--s2-iek5sxvy1{display:none;flex-direction:row}}.section--u-i7l3q2nvu{position:sticky;top:0px;z-index:10}.container--u-i80idakgi{max-width:none;padding-top:20px;padding-bottom:20px;background-color:rgb(255,255,255);border-bottom-right-radius:20px;border-bottom-left-radius:20px;display:flex;justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.link-block--u-ij7yf5mm2{align-items:center;justify-content:center;transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear}.link-block--u-ij7yf5mm2:hover{opacity:0.5}.image--u-irhpgss26{width:auto;height:auto}.menu__list-lvl1--u-ioyaxt4m1{align-items:center;column-gap:20px}.menu__link-lvl1--u-i6278jyvl{padding-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;min-height:auto;font-size:15px;font-weight:500;line-height:100%;letter-spacing:-0.05em}.menu__link-text--u-i2qgb1ij1{color:rgba(21,21,21,1);transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear}.menu__link-text--u-i2qgb1ij1:hover{opacity:0.5}.link--u-i2ifdcrc4{color:rgba(21,21,21,1);text-decoration:underline;transition-property:opacity;transition-duration:100ms;transition-delay:0ms;transition-timing-function:linear}.link--u-i2ifdcrc4:hover{opacity:0.5;text-decoration:underline}@media (max-width:991px){.menu--u-i9yrdei10.is-opened .button--u-iij3zrpzq:hover{background-color:rgb(89,99,185)}}@media (max-width:991px){.link--u-i2ifdcrc4{display:none}}@media (max-width:991px){.menu__wrapper-lvl1--u-ic1ljomjg{padding-left:0px;padding-right:0px;padding-top:0px;padding-bottom:0px}}@media (max-width:991px){.menu__burger-button--u-ibf8kzqjr{background-size:auto,auto;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIHZpZXdCb3g9IjAgMCAzMCAzMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIxMS41IiB3aWR0aD0iMjkiIGhlaWdodD0iMSIgc3Ryb2tlPSIjMTUxNTE1Ii8+CjxyZWN0IHg9IjAuNSIgeT0iMTcuNSIgd2lkdGg9IjI5IiBoZWlnaHQ9IjEiIHN0cm9rZT0iIzE1MTUxNSIvPgo8L3N2Zz4K),none;background-repeat:no-repeat;background-position:center center;background-attachment:scroll,scroll;width:30px;height:30px}}
+.paddings--left-right{padding-left:30px;padding-right:30px}.h1{font-size:13.6vw;font-weight:500;letter-spacing:-0.05em;line-height:100%}.t2{font-size:15px;font-weight:500;letter-spacing:-0.05em;line-height:100%}.text--link-1{font-size:15px;font-weight:500;line-height:100%;letter-spacing:-0.05em}.text--link-1:hover{border-bottom-color:rgba(0,0,0,0)}.l1{font-size:15px;font-weight:500;line-height:100%;letter-spacing:-0.05em}.h2{font-size:80px;font-weight:500;letter-spacing:-0.05em;line-height:100%}.h3{font-size:30px;font-weight:500;letter-spacing:-0.05em;line-height:100%}.text-number-2{font-weight:500;font-size:60px;line-height:100%;letter-spacing:-0.05em}.text--button{font-weight:500;font-size:15px;letter-spacing:-0.05em;line-height:100%}.h3-script{font-weight:500;letter-spacing:-0.05em;line-height:100%}.text-number-1-script{font-weight:500;line-height:100%;letter-spacing:-0.05em}@media (max-width:991px){.l1{font-size:20px}}@media (max-width:991px){.h2{font-size:60px}}@media (max-width:991px){.h3{font-size:25px}}@media (max-width:991px){.text-number-2{font-size:40px}}@media (max-width:991px){.paddings--left-right{row-gap:20px;padding-left:20px;padding-right:20px}}@media (max-width:991px){.text-number-1-script{font-size:90px}}@media (max-width:767px){.l1{font-size:16px}}@media (max-width:767px){.paddings--left-right{row-gap:0px}}@media (max-width:767px){.h3{font-size:20px}}@media (max-width:767px){.text-number-2{font-size:30px;grid-row-start:span 1;grid-row-end:span 1}}@media (max-width:767px){.h2{font-size:40px}}
+*{box-sizing:border-box}html,body{text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0;font-family:Arial,Helvetica,sans-serif;background:white;overflow-anchor:none;overflow-wrap:break-word;backface-visibility:hidden;-webkit-backface-visibility:hidden}img{max-width:100%}.text-block-wrap-div{flex-grow:1;max-width:100%}iframe{max-width:100%}.text-block-wrap-div span a{color:inherit}textarea{max-width:100%}input,button,textarea{font:inherit}[type=submit],button,label{cursor:pointer}.mosaic-wrap{color:#000000}@media (prefers-reduced-motion:reduce){*{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important;scroll-behavior:auto!important}}
+.h3-script{font-size:clamp(0px,1.64vw,30px)}.text-number-1-script{font-size:clamp(90px,7vw,160px)}
diff --git a/public/report.custom.css b/public/report.custom.css
new file mode 100644
index 0000000..7f47159
--- /dev/null
+++ b/public/report.custom.css
@@ -0,0 +1,185 @@
+/* WhatIDo - report page layer on top of report.css (design system from the reference layout). */
+
+@font-face{
+ font-family:"Inter";
+ font-style:normal;
+ font-weight:400;
+ font-display:swap;
+ src:url("/fonts/inter-400.woff2") format("woff2");
+}
+@font-face{
+ font-family:"Inter";
+ font-style:normal;
+ font-weight:500;
+ font-display:swap;
+ src:url("/fonts/inter-500-cyr.woff2") format("woff2");
+ unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
+}
+@font-face{
+ font-family:"Inter";
+ font-style:normal;
+ font-weight:500;
+ font-display:swap;
+ src:url("/fonts/inter-500-lat.woff2") format("woff2");
+ unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
+}
+
+:root{
+--rep-accent:rgb(118,132,255);
+--rep-accent-hover:rgb(89,99,185);
+--rep-bg:rgb(21,21,21);
+--rep-line:rgba(255,255,255,.1);
+--rep-line-soft:rgba(255,255,255,.16);
+--rep-muted:rgba(174,176,176,1);
+--sf-img-0:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMjUnIGhlaWdodD0nMjUnIHZpZXdCb3g9JzAgMCAyNSAyNScgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdNMTUuNSA2LjVMOS41IDEyLjVMMTUuNSAxOC41JyBzdHJva2U9JyM5QzlDOUMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvPjwvc3ZnPgo=");
+--sf-img-1:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMjUnIGhlaWdodD0nMjUnIHZpZXdCb3g9JzAgMCAyNSAyNScgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdNOS41IDE4LjVMMTUuNSAxMi41TDkuNSA2LjUnIHN0cm9rZT0nIzlDOUM5Qycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8+PC9zdmc+Cg==");
+--sf-img-7:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS45OTg0IDUuMzkzNDFMMjUuMTkwNiAxNC41ODU2TDI1LjE5MDYgMTQuNTg1NkwyNi42MDQ4IDE1Ljk5OThMMjYuNjA0OCAxNS45OTk4TDI2LjYwNSAxNkwyNS4xOTA3IDE3LjQxNDJMMjUuMTkwNiAxNy40MTRMMTUuOTk4MiAyNi42MDY0TDE0LjU4NCAyNS4xOTIyTDIyLjc4NSAxNi45OTEyTDYuNDk1MjMgMTYuOTkxMkw2LjQ5NTIzIDE1LjAwODRMMjIuNzg0OSAxNS4wMDg0TDE0LjU4NDEgNi44MDc2MkwxNS45OTg0IDUuMzkzNDFaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K");
+--sf-img-8:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNi4wMDE2IDI2LjYwNjZMNi44MDk0NCAxNy40MTQ0TDYuODA5NDQgMTcuNDE0NEw1LjM5NTIyIDE2LjAwMDJMNS4zOTUyMyAxNi4wMDAyTDUuMzk1MDQgMTZMNi44MDkyNiAxNC41ODU4TDYuODA5NDQgMTQuNTg2TDE2LjAwMTggNS4zOTM1OUwxNy40MTYgNi44MDc4TDkuMjE0OTkgMTUuMDA4OUwyNS41MDQ4IDE1LjAwODhMMjUuNTA0OCAxNi45OTE2TDkuMjE1MDggMTYuOTkxNkwxNy40MTU5IDI1LjE5MjRMMTYuMDAxNiAyNi42MDY2WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==");
+--sf-img-9:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMiAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEuMTk5MjIgNC44NTYzNkw0Ljc5OTIyIDkuNzMyNTVMMTAuNzk5MiAxLjE5OTIyIiBzdHJva2U9IndoaXRlIi8+Cjwvc3ZnPgo=");
+}
+
+html{scroll-behavior:smooth}
+html,body{background-color:var(--rep-bg)}
+body{overflow-x:hidden}
+::selection{background-color:var(--rep-accent);color:#fff}
+.container--u-i80idakgi{opacity:1!important;transform:none!important}
+.rep-hidden{display:none!important}
+.rep-static{cursor:default;color:var(--rep-muted)}
+[data-img]{cursor:zoom-in}
+button,a{-webkit-tap-highlight-color:transparent}
+
+.rep-logo-box{width:auto;min-width:44px;height:40px;align-items:center;justify-content:center;overflow:visible}
+.rep-logo{font-size:20px;font-weight:500;letter-spacing:-.05em;line-height:1;color:rgb(21,21,21);white-space:nowrap}
+.rep-logo-box--footer{height:20px;min-width:0}
+.rep-logo--white{font-size:18px;color:#fff}
+
+.rep-overlay{display:none}
+.rep-overlay.is-open{display:block}
+@media (min-width:992px){
+.rep-burger,.rep-menu-close{display:none!important}
+}
+@media (max-width:991px){
+.rep-menu-panel.is-open{display:flex!important;position:fixed;top:0;right:0;bottom:0;left:0;z-index:85;flex-direction:column;align-items:flex-start;background-color:rgb(255,255,255);padding:20px;overflow-y:auto}
+.rep-menu-panel.is-open .menu__scroll-wrapper{display:block!important;width:100%;min-width:0;height:auto}
+.rep-menu-panel.is-open .menu__wrapper-lvl1{display:block!important;position:static;background-image:none;background-color:transparent;padding:0}
+.rep-menu-panel.is-open .menu__list-lvl1{display:flex!important;flex-direction:column;align-items:flex-start;row-gap:16px;padding:50px 10px 0}
+.rep-menu-panel.is-open .menu__link-lvl1{font-size:26px;line-height:110%;padding:0}
+.rep-menu-close.is-open{display:block!important;position:absolute;top:22px;right:22px}
+.rep-burger{display:block}
+}
+
+.rep-hero-photo{position:relative;display:flex;align-items:center;justify-content:center}
+.rep-monogram{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:clamp(56px,9vw,140px);font-weight:600;letter-spacing:-.06em;color:rgba(255,255,255,.06)}
+.rep-hero-tag{color:rgba(255,255,255,.35)}
+.rep-hero-lead{white-space:pre-line;word-break:break-word}
+
+.rep-slider{width:100%;max-width:100%;min-width:0}
+.rep-slider .blocklist__list{display:flex;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scroll-snap-type:x mandatory;scrollbar-width:none;-ms-overflow-style:none}
+.rep-slider .blocklist__list::-webkit-scrollbar{display:none;width:0;height:0}
+.rep-slider .blocklist__item-wrapper{flex:0 0 100%;max-width:100%;scroll-snap-align:start}
+@media (min-width:992px){
+.rep-slider .blocklist__item-wrapper{flex:0 0 50%}
+}
+.rep-slider [data-slider-prev],.rep-slider [data-slider-next]{cursor:pointer}
+.rep-slider .rep-arrow-off{opacity:.06!important;pointer-events:none}
+
+.rep-work-photo{width:100%;max-width:280px;height:auto;aspect-ratio:1/1;border-radius:55px}
+@media (max-width:991px){
+.rep-work-photo{max-width:200px}
+}
+.rep-work-photo .image__img{width:100%;height:100%;object-fit:cover}
+
+.rep-gallery-photo{width:180px;height:180px;max-width:180px;border-radius:50px}
+@media (max-width:991px){
+.rep-gallery-photo{width:140px;height:140px;max-width:140px;border-radius:40px}
+}
+.rep-gallery-photo .image__img{width:100%;height:100%;object-fit:cover}
+.rep-gallery-caption{color:#fff}
+.rep-gallery-date{color:rgba(56,56,56,1);margin-bottom:auto}
+.rep-gallery-text{color:#fff}
+
+.rep-stack{flex-direction:column;align-items:flex-start;row-gap:12px}
+.rep-tl-desc{color:rgba(255,255,255,.7);max-width:350px;line-height:130%}
+.rep-tl-aside{row-gap:12px}
+.rep-tl-count{color:rgba(56,56,56,1)}
+.rep-files{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;max-width:350px}
+.rep-chip{display:inline-flex;align-items:center;gap:8px;max-width:280px;padding:9px 18px;border:1px solid var(--rep-line-soft);border-radius:100px;font-size:13px;font-weight:500;letter-spacing:-.05em;line-height:100%;color:rgba(255,255,255,.7);text-decoration:none;transition:border-color .1s linear,color .1s linear}
+.rep-chip:hover{border-color:rgba(255,255,255,.65);color:#fff}
+.rep-chip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.rep-chip--static{cursor:default}
+.rep-chip--static:hover{border-color:var(--rep-line-soft);color:rgba(255,255,255,.7)}
+.rep-empty{color:rgba(174,176,176,1);font-size:15px;font-weight:500;letter-spacing:-.05em;padding:20px 0}
+
+.rep-file-item{text-decoration:none;color:inherit;cursor:pointer;transition:background-color .15s linear}
+.rep-file-item:hover{background-color:rgb(255,255,255)}
+.rep-file-icon{display:flex;align-items:center;justify-content:center;width:180px;height:180px;max-width:180px;border-radius:50px;background-color:rgb(255,255,255);border:1px solid rgba(0,0,0,.06);font-size:20px;font-weight:500;letter-spacing:-.05em;color:rgba(21,21,21,.5);text-transform:uppercase}
+@media (max-width:991px){
+.rep-file-icon{width:140px;height:140px;max-width:140px;border-radius:40px;font-size:16px}
+}
+.rep-file-title{color:rgb(21,21,21);overflow-wrap:anywhere}
+.rep-file-meta{color:var(--rep-muted)}
+.rep-file-cta{display:inline-flex;margin-top:12px;padding:9px 18px;border:1px solid rgba(187,189,190,1);border-radius:100px;font-size:13px;font-weight:500;letter-spacing:-.05em;color:rgba(21,21,21,.75);text-decoration:none}
+.rep-file-item:hover .rep-file-cta{border-color:rgb(21,21,21);color:rgb(21,21,21)}
+.rep-contact{width:auto;max-width:420px;align-items:flex-start;row-gap:16px}
+.rep-contact-title{color:#fff;font-size:24px;font-weight:500;letter-spacing:-.05em;line-height:115%}
+.rep-contact-note{color:var(--rep-muted);font-size:15px;font-weight:500;letter-spacing:-.05em;line-height:140%}
+.rep-contact-btn{width:100%;height:60px;background-color:var(--rep-accent);border-radius:10px;color:#fff}
+.rep-contact-btn:hover{background-color:var(--rep-accent-hover)}
+.rep-footer-photo{width:180px;height:180px;max-width:180px;border-radius:55px}
+@media (max-width:991px){
+.rep-footer-photo{width:140px;height:140px;max-width:140px}
+}
+.rep-footer-photo .image__img{width:100%;height:100%;object-fit:cover}
+
+.rep-countdown{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:60;display:inline-flex;align-items:center;gap:8px;max-width:calc(100% - 32px);padding:12px 22px;border:1px solid var(--rep-line-soft);border-radius:100px;background-color:rgba(21,21,21,.94);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:rgba(255,255,255,.8);font-size:14px;font-weight:500;letter-spacing:-.05em;line-height:120%;white-space:nowrap;overflow:hidden}
+.rep-countdown strong{color:#fff;font-weight:500}
+.rep-countdown.rep-warn{border-color:rgba(250,192,0,.45)}
+.rep-countdown.rep-urgent{border-color:rgba(255,79,82,.55)}
+
+.rep-error{display:flex;align-items:center;justify-content:center;min-height:70vh;padding:80px 30px}
+.rep-error-inner{display:flex;flex-direction:column;align-items:center;row-gap:20px;max-width:540px;text-align:center}
+.rep-error-title{color:#fff;font-size:clamp(32px,4vw,50px);font-weight:500;letter-spacing:-.05em;line-height:100%}
+.rep-error-text{color:var(--rep-muted);font-size:15px;font-weight:500;letter-spacing:-.05em;line-height:140%}
+.rep-error-btn{width:auto;height:60px;padding:0 30px;background-color:var(--rep-accent);border-radius:10px;color:#fff}
+.rep-error-btn:hover{background-color:var(--rep-accent-hover)}
+
+.rep-lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:300;display:none;align-items:center;justify-content:center;padding:30px;background-color:rgba(0,0,0,.9);cursor:zoom-out}
+.rep-lightbox.is-open{display:flex}
+.rep-lightbox img{max-width:100%;max-height:100%;object-fit:contain;border-radius:10px}
+
+.rep-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:400;display:none;align-items:center;justify-content:center;padding:20px;background-color:rgba(0,0,0,.72);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
+.rep-modal.is-open{display:flex}
+.rep-modal-box{display:flex;flex-direction:column;row-gap:16px;width:100%;max-width:420px;padding:35px;border:1px solid rgba(44,44,44,1);border-radius:20px;background-color:var(--rep-bg)}
+.rep-modal-title{color:#fff;font-size:24px;font-weight:500;letter-spacing:-.05em;line-height:115%}
+.rep-modal-text{color:var(--rep-muted);font-size:15px;font-weight:500;letter-spacing:-.05em;line-height:140%}
+.rep-modal-input{width:100%;height:55px;padding:0 18px;border:1px solid var(--rep-line-soft);border-radius:10px;background-color:transparent;color:#fff;font-size:15px;font-weight:500;letter-spacing:-.05em;outline:none}
+.rep-modal-input::placeholder{color:rgba(255,255,255,.35)}
+.rep-modal-input:focus{border-color:rgba(255,255,255,.5)}
+.rep-modal-btn{width:100%;height:55px;background-color:var(--rep-accent);border-radius:10px;color:#fff}
+.rep-modal-btn:hover{background-color:var(--rep-accent-hover)}
+.rep-modal-error{color:rgb(255,79,82);font-size:14px;font-weight:500;letter-spacing:-.05em}
+
+@media (max-width:640px){
+.rep-countdown{bottom:14px;padding:10px 16px;font-size:13px}
+.rep-modal-box{padding:25px}
+}
+
+.rep-work-desc{color:rgba(255,255,255,.7);max-width:350px;line-height:130%}
+.rep-stack>.text-block-wrap-div{flex-grow:0}
+.rep-file-meta .text-block-wrap-div{flex-grow:0}
+.rep-about-photo{display:block;width:100%;height:100%}
+.rep-about-photo .image__img{width:100%;height:100%;object-fit:cover}
+.rep-about-monogram{display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:64px;font-weight:600;letter-spacing:-.06em;color:rgba(21,21,21,.12)}
+
+#works.section--u-ibq7nxfzo{background-color:rgb(255,255,255)}
+#works .text--u-ihb2xbsz6{color:rgba(21,21,21,1)}
+#works .blocklist__item--u-iqn443glf{background-color:rgb(255,255,255)}
+#works .div--u-ifxd1g9rk{border-top-color:rgba(228,231,232,1);border-right-color:rgba(228,231,232,1);border-bottom-color:rgba(228,231,232,1);border-left-color:rgba(228,231,232,1)}
+#works .text--u-ib8dkw227{color:rgba(220,220,220,1)}
+#works .text--u-i8ydj7eyx{color:rgba(21,21,21,1)}
+#works .div--u-ipp2467j8{border-top-color:rgba(187,189,190,1);border-right-color:rgba(187,189,190,1);border-bottom-color:rgba(187,189,190,1);border-left-color:rgba(187,189,190,1)}
+#works .text--u-iz3df5dls{color:rgba(21,21,21,1)}
+#works .div--u-ibren39lw,#works .div--u-ixtm7p8ov,#works .div--u-iidtqgnjo,#works .div--u-iohjzr62g{background-color:rgb(21,21,21)}
+#works .rep-work-desc{color:rgba(21,21,21,.7)}
+#works .rep-chip{border-color:rgb(187,189,190);color:rgba(21,21,21,.75)}
+#works .rep-chip:hover{border-color:rgb(21,21,21);color:rgb(21,21,21)}
diff --git a/public/report.html b/public/report.html
new file mode 100644
index 0000000..9a1f636
--- /dev/null
+++ b/public/report.html
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
Отчёт
+
+
+
+
+
+
+
+
+
+
+
+
+
+ —
+
+
+
+
+

+
+
+
+
+
+

+
+
+
[Отчёт]
+
+

+
+
+
+
+
+
+
+
+
![]()
+
+
+
+

+
+
+
+
+
+
+
+
+ Обо мне
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
+
+
+ Связаться
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ссылка защищена паролем
+
Введите пароль, чтобы открыть отчёт
+
+
+
Неверный пароль
+
+
+
+
+
+
diff --git a/server.js b/server.js
index 02b03d8..d91ce40 100644
--- a/server.js
+++ b/server.js
@@ -1911,6 +1911,10 @@ app.get('/s/:token', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'share.html'));
});
+app.get('/r/:token', (req, res) => {
+ res.sendFile(path.join(__dirname, 'public', 'report.html'));
+});
+
// --- Groups CRUD ---
app.get('/api/groups', apiLimiter, optionalAuth, async (req, res) => {
const rows = await cacheWrap('groups:list:' + scopeKey(req.user), PUBLIC_TTL_MS, async () => {
@@ -2522,10 +2526,17 @@ function renderStudentReport(data, opts) {
else if (IMG_EXT.has(ext)) { gallery.push({ type: 'image', src: 'files/' + f.saved }); galIdx.set('files/' + f.saved, gallery.length - 1); }
}
const avatar = showPhotos && photos.length ? photos[0].stored : null;
- const statsChips = [];
- if (showEntries) statsChips.push(`
${entries.length}занятий
`);
- if (showPhotos) statsChips.push(`
${photos.length}фотографий
`);
- if (showFiles) statsChips.push(`
${files.length}файлов
`);
+ const plural = (n, one, few, many) => {
+ const m10 = n % 10, m100 = n % 100;
+ if (m10 === 1 && m100 !== 11) return one;
+ if (m10 >= 2 && m10 <= 4 && (m100 < 12 || m100 > 14)) return few;
+ return many;
+ };
+ const counters = [];
+ if (showEntries) counters.push(`
${entries.length}${plural(entries.length, 'занятие', 'занятия', 'занятий')}
`);
+ if (showPhotos) counters.push(`
${photos.length}${plural(photos.length, 'фотография', 'фотографии', 'фотографий')}
`);
+ if (showFiles) counters.push(`
${files.length}${plural(files.length, 'работа', 'работы', 'работ')}
`);
+ counters.push(`
${groups.length}${plural(groups.length, 'группа', 'группы', 'групп')}
`);
const photoCards = showPhotos ? photos.map(p => {
let caption = '';
if (showCaptions && p.caption) caption = truncate(p.caption, 120);
@@ -2537,19 +2548,22 @@ function renderStudentReport(data, opts) {
${caption ? `
${escapeHtml(caption)}` : ''}
`;
}).join('') : '';
- const fileRows = showFiles ? files.map(f => {
+ const projectCards = showFiles ? files.map((f, i) => {
const ext = f.original.indexOf('.') >= 0 ? f.original.split('.').pop().toUpperCase().slice(0, 8) : 'FILE';
const meta = showDates ? `${fmtLongDate(f.createdAt)} · ${fmtBytes(f.size)}` : fmtBytes(f.size);
const fg = galIdx.get('files/' + f.saved);
- const gattr = fg !== undefined ? ` class="gfile" data-g="${fg}"` : ' target="_blank" rel="noopener"';
+ const gattr = fg !== undefined ? ` data-g="${fg}"` : ' target="_blank" rel="noopener"';
return `
-
-
- ${escapeHtml(ext)}
- ${escapeHtml(f.original)}
- ${escapeHtml(meta)}
+
+
+ ${String(i + 1).padStart(2, '0')}
+
+ ${escapeHtml(f.original)}
+ ${escapeHtml(ext)}${escapeHtml(meta)}
+
+ ↗
- `;
+ `;
}).join('') : '';
const photosByEntry = new Map();
for (const p of photos) {
@@ -2564,13 +2578,15 @@ function renderStudentReport(data, opts) {
const desc = e.description ? `
${escapeHtml(e.description)}
` : '';
const gr = e.group_name ? `
${escapeHtml(e.group_name)}` : '';
const dt = showDates && e.created_at ? `
${escapeHtml(fmtLongDate(e.created_at))}` : '';
- const head = dt + gr;
return `
- ${head ? `${head}
` : ''}
- ${desc}
- ${thumbs ? `${thumbs}
` : ''}
- ${fls}
+ ${dt ? `${escapeHtml(fmtLongDate(e.created_at))}
` : ''}
+
+ ${gr ? `
${escapeHtml(e.group_name)}` : ''}
+ ${desc}
+ ${thumbs ? `
${thumbs}
` : ''}
+ ${fls}
+
`;
}).join('') : '';
const groupLine = groups.length ? escapeHtml(groups.join(' · ')) : '';
@@ -2581,10 +2597,11 @@ function renderStudentReport(data, opts) {
metaBits.push(`Сформировано ${genLabel}`);
const heroAvatar = avatar ? `
` : '';
const navItems = [];
+ navItems.push('
Обзор');
if (showPhotos) navItems.push('
Фотографии');
- if (showFiles) navItems.push('
Работы');
+ if (showFiles) navItems.push('
Работы');
if (showEntries) navItems.push('
Занятия');
- const nav = navItems.length >= 2 ? '
' : '';
+ const nav = navItems.join('');
return `
@@ -2592,129 +2609,160 @@ function renderStudentReport(data, opts) {
${escapeHtml(name)} — портфолио
-
-
-
-
-
-
+
+
+
- ${nav}
+
+ Обзор
+
+ ${counters.join('')}
+
+
- ${showPhotos ? `
- 🏞️Фотографии
- ${photoCards ? `${photoCards}
` : '🎈 Фотографий пока нет
'}
+ ${showPhotos ? `
+ Фотографии
[${photos.length}]
+ ${photoCards ? `${photoCards}
` : 'Фотографий пока нет.
'}
` : ''}
- ${showFiles ? `
- 📁Работы и файлы
- ${fileRows ? `` : '🎈 Файлов пока нет
'}
+ ${showFiles ? `
+ Проекты и работы
[${files.length}]
+ ${projectCards ? `${projectCards}
` : 'Работ пока нет.
'}
` : ''}
- ${showEntries ? `
- 🎒Журнал занятий
- ${lessonRows ? `${lessonRows}
` : '🎈 Записей о занятиях пока нет
'}
+ ${showEntries ? `
+ Журнал занятий
[${entries.length}]
+ ${lessonRows ? `${lessonRows}
` : 'Записей о занятиях пока нет.
'}
` : ''}
-
+
@@ -2782,6 +2830,14 @@ footer{margin-top:44px;color:#B9B4BE;font-size:.82rem;text-align:center}
}
if (links.length) window.addEventListener('scroll', spy, { passive: true });
spy();
+ var toTop = document.getElementById('toTop');
+ function toTopSpy() {
+ if (window.scrollY > 420) toTop.classList.add('show');
+ else toTop.classList.remove('show');
+ }
+ toTop.addEventListener('click', function () { window.scrollTo({ top: 0, behavior: 'smooth' }); });
+ window.addEventListener('scroll', toTopSpy, { passive: true });
+ toTopSpy();
})();
@@ -4561,7 +4617,7 @@ app.delete('/api/trash', requireAuth, requireAdmin, async (req, res) => {
const ERROR_HTML = fs.readFileSync(path.join(__dirname, 'public', 'error.html'), 'utf8');
function isApiRoute(req) {
- return req.path.startsWith('/api/') || req.path.startsWith('/s/');
+ return req.path.startsWith('/api/') || req.path.startsWith('/s/') || req.path.startsWith('/r/');
}
function escapeHtml(str) {