(function (){ 'use strict'; const $=(s, c=document)=> c.querySelector(s); const $$=(s, c=document)=> Array.from(c.querySelectorAll(s)); const on=(el, ev, fn, opt)=> el&&el.addEventListener(ev, fn, opt); const MESI=['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre']; var slugToLabel={ 'confronti': 'Confronti', 'guide-pratiche': 'Guide Pratiche', 'tecnologia': 'Tecnologia', 'ristorazione': 'Ristorazione', 'casi-studio': 'Casi Studio', 'digitale': 'Digitale', 'ospitalita': 'Ospitalit\u00e0', }; function toDisplayLabel(slug){ return slugToLabel[slug] || slug.replace(/-/g, ' ').replace(/\b\w/g, function(l){ return l.toUpperCase(); }); } function initCursor(){ if(!window.matchMedia('(hover: hover)').matches) return; const dot=document.createElement('div'); const ring=document.createElement('div'); dot.className='cursor-dot'; ring.className='cursor-ring'; document.body.append(dot, ring); let mx=-100, my=-100; let rx=-100, ry=-100; const LAG=0.18; on(document, 'mousemove', e=> { mx=e.clientX; my=e.clientY; }, { passive: true }); function tick(){ dot.style.transform='translate3d(' + (mx - 3) + 'px,' + (my - 3) + 'px,0)'; rx +=(mx - rx) * LAG; ry +=(my - ry) * LAG; ring.style.transform='translate3d(' + (rx - 15) + 'px,' + (ry - 15) + 'px,0)'; requestAnimationFrame(tick); } tick(); on(document, 'mouseover', e=> { const isCard = !!e.target.closest('.ast-article-post'); const isLink = !!e.target.closest('a, button'); ring.classList.toggle('hover-card', isCard&&!isLink); ring.classList.toggle('hover-link', isLink); }, { passive: true }); on(document, 'mouseout', ()=> { ring.classList.remove('hover-card', 'hover-link'); }, { passive: true }); on(document, 'mouseleave', ()=> { dot.style.opacity='0'; ring.style.opacity='0'; }); on(document, 'mouseenter', ()=> { dot.style.opacity='1'; ring.style.opacity=''; }); } function initReadingProgress(){ if(!document.body.classList.contains('single-post')) return; const bar=document.createElement('div'); bar.id='reading-progress'; document.body.prepend(bar); const content=$('.entry-content')||$('main'); if(!content) return; let ticking=false; on(window, 'scroll', ()=> { if(ticking) return; requestAnimationFrame(()=> { const rect=content.getBoundingClientRect(); const total=content.offsetHeight - window.innerHeight; const scrolled=Math.max(0, -rect.top); bar.style.width=(total > 0 ? Math.min(100, scrolled / total * 100):0) + '%'; ticking=false; }); ticking=true; }, { passive: true }); } function fixTables(){ if(!document.body.classList.contains('single-post')) return; $$('.entry-content table').forEach(table=> { if(table.closest('.table-wrapper')) return; const wrapper=document.createElement('div'); wrapper.className='table-wrapper'; table.parentNode.insertBefore(wrapper, table); wrapper.appendChild(table); [table, ...$$('th, td', table)].forEach(el=> { const s=el.style; if(s.position==='sticky'||s.position==='-webkit-sticky') s.position='static'; }); }); } function addReadingTime(){ $$('.ast-article-post').forEach(card=> { const excerpt=$('.ast-excerpt-container', card)||$('.entry-content', card); if(!excerpt) return; const words=excerpt.textContent.trim().split(/\s+/).length; const full=Math.round(words * 7); const mins=Math.max(2, Math.ceil(full / 200)); const label=mins <=3 ? 'caffe':mins <=7 ? 'aperitivo':'cena'; const badge=document.createElement('div'); badge.className='reading-time'; badge.innerHTML=' ' + mins + ' min \u00b7 ' + label; const title=$('.entry-title', card); const postContent=$('.post-content', card); if(title&&postContent) postContent.insertBefore(badge, title); else excerpt.parentNode.insertBefore(badge, excerpt); }); } function addCardNumbers(){ } function addFeaturedBadge(){ var first=$('.mc-pp-layout .ast-article-post')||$('.ast-row .ast-article-post'); if(!first) return; if($('.featured-badge', first)) return; var badge=document.createElement('span'); badge.className='featured-badge'; badge.textContent='IN EVIDENZA'; first.appendChild(badge); } function injectCategoryFilter(){ const isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); const isArchive=document.body.classList.contains('archive'); if(!isIndex&&!isArchive) return; const cards=$$('.ast-article-post'); if(!cards.length) return; var catMap=new Map(); catMap.set('tutti', 'Tutti'); cards.forEach(function(card){ var matches=card.className.match(/\bcategory-([\w-]+)\b/g)||[]; var slugs=matches .map(function(c){ return c.replace('category-', ''); }) .filter(function(s){ return s!=='uncategorized'; }); var primarySlug=slugs[0]||''; if(primarySlug&&!catMap.has(primarySlug)){ catMap.set(primarySlug, toDisplayLabel(primarySlug)); } if(primarySlug&&!$('.cat-label', card)){ var labelEl=document.createElement('span'); labelEl.className='cat-label'; labelEl.textContent=toDisplayLabel(primarySlug); labelEl.dataset.catSlug=primarySlug; var title=$('.entry-title', card); var postContent=$('.post-content', card); if(title&&postContent){ postContent.insertBefore(labelEl, title); }} }); if(catMap.size <=2) return; var bar=document.createElement('div'); bar.className='category-filter'; catMap.forEach(function(label, slug){ var btn=document.createElement('button'); btn.className='category-filter-btn' + (slug==='tutti' ? ' active':''); btn.textContent=label; btn.dataset.filter=slug; bar.appendChild(btn); }); var grid=$('.ast-row'); if(grid) grid.parentNode.insertBefore(bar, grid); on(bar, 'click', function(e){ var btn=e.target.closest('.category-filter-btn'); if(!btn) return; var filter=btn.dataset.filter; $$('.category-filter-btn', bar).forEach(function(b){ b.classList.remove('active'); }); btn.classList.add('active'); cards.forEach(function(card, i){ if(filter==='tutti'){ card.classList.remove('filtered-out'); card.classList.add('filtered-in'); return; } if(card.closest('.mc-prima-pagina')){ card.classList.remove('filtered-out'); return; } var m=card.className.match(/\bcategory-([\w-]+)\b/); var cardSlug=m ? m[1]:''; var matches=cardSlug===filter; card.classList.toggle('filtered-out', !matches); card.classList.toggle('filtered-in', matches); }); $$('.mc-pp-brief').forEach(function(brief){ if(filter==='tutti'){ brief.classList.remove('filtered-out'); return; } var bSlug=brief.dataset.catSlug||''; brief.classList.toggle('filtered-out', bSlug!==filter&&filter!=='tutti'); }); }); } function initDarkMode(){ var SUN=''; var MOON=''; var btn=document.createElement('button'); btn.id='mc-dark-toggle'; btn.className='sera-toggle'; btn.setAttribute('aria-label', 'Tema chiaro/scuro'); btn.innerHTML = '' + SUN + '' + '' + MOON + ''; var target=$('#mc-dark-slot') || $('.mc-nav-right') || $('.main-header-bar') || $('.site-header'); if(target&&target.id==='mc-dark-slot'){ target.parentNode.replaceChild(btn, target); }else if(target){ target.appendChild(btn); } on(btn, 'click', function(){ var isDark=document.documentElement.classList.toggle('dark-mode'); if(isDark){ document.documentElement.setAttribute('data-mode','sera'); } else { document.documentElement.removeAttribute('data-mode'); } localStorage.setItem('mc_dark', isDark ? '1':'0'); }); } function initMarquee(){ var tracks=$$('.marquee-track'); if(!tracks.length) return; var lastScroll=window.scrollY; on(window, 'scroll', function(){ var cur=window.scrollY; tracks.forEach(function(t){ t.classList.toggle('reverse', cur < lastScroll); }); lastScroll=cur; }, { passive: true }); } function injectMarquee(){ if(document.querySelector('.marquee-strip')) return; var grid=document.querySelector('.ast-row'); if(!grid) return; var cats=['Ristorazione', 'Tecnologia', 'Guide', 'Confronti', 'Ospitalit\u00e0', 'Digitale', 'Casi Studio']; var strip=document.createElement('div'); strip.className='marquee-strip'; var track=document.createElement('div'); track.className='marquee-track'; var doubled=cats.concat(cats).concat(cats); track.textContent=doubled.map(function(c){ return '\u00b7 ' + c + ' '; }).join(''); strip.appendChild(track); grid.parentNode.insertBefore(strip, grid); } function injectBlogHero(){ var isIndex=document.body.classList.contains('blog')||document.body.classList.contains('home'); if(!isIndex) return; var hero=document.getElementById('mc-hero-ssr'); if(hero){ hero.removeAttribute('id'); hero.style.display=''; var marquee=document.querySelector('.marquee-strip'); var row=document.querySelector('.ast-row'); var target=marquee ? marquee.parentNode:(row ? row.parentNode:null); if(target){ var ref=marquee ? marquee.nextSibling:row; if(hero.parentNode!==target||hero.nextSibling!==ref){ target.insertBefore(hero, ref); }} var tagEl=hero.querySelector('.hero-tagline'); if(tagEl){ var text=tagEl.textContent; tagEl.innerHTML=text.split('').map(function(ch, i){ if(ch===' ') return ' '; return '' + ch + ''; }).join(''); tagEl.classList.add('curtain-reveal'); requestAnimationFrame(function(){ tagEl.classList.add('is-visible'); }); } return; } if(document.querySelector('.blog-hero-tagline')) return; var MESI=['GENNAIO','FEBBRAIO','MARZO','APRILE','MAGGIO','GIUGNO','LUGLIO','AGOSTO','SETTEMBRE','OTTOBRE','NOVEMBRE','DICEMBRE']; var now=new Date(); hero=document.createElement('div'); hero.className='blog-hero-tagline'; var issueEl=document.createElement('div'); var tagEl=document.createElement('h1'); var subEl=document.createElement('p'); issueEl.className='hero-issue'; tagEl.className='hero-tagline'; subEl.className='hero-sub'; issueEl.textContent='N\u00b0 ' + (now.getMonth() + 1) + ' \u00b7 ' + MESI[now.getMonth()] + ' ' + now.getFullYear(); var tagText='Il giornale digitale per chi fa ospitalit\u00e0'; tagEl.innerHTML=tagText.split('').map(function(ch, i){ if(ch===' ') return ' '; return '' + ch + ''; }).join(''); subEl.textContent='Guide, confronti e strategie per ristoratori italiani che vogliono crescere.'; hero.appendChild(issueEl); hero.appendChild(tagEl); hero.appendChild(subEl); var marquee=document.querySelector('.marquee-strip'); var row=document.querySelector('.ast-row'); var target=marquee ? marquee.parentNode:(row ? row.parentNode:null); if(target) target.insertBefore(hero, marquee ? marquee.nextSibling:row); tagEl.classList.add('curtain-reveal'); requestAnimationFrame(function(){ tagEl.classList.add('is-visible'); }); } function injectSectionLabel(){ var isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); if(!isIndex||$('.section-label')) return; var row=$('.ast-row'); if(!row) return; var label=document.createElement('div'); label.className='section-label'; label.textContent='Ultimi articoli'; row.parentNode.insertBefore(label, row); } function injectNewsletter(){ var isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); if(!isIndex||$('.newsletter-section')) return; var row=$('.ast-row'); if(!row) return; var section=document.createElement('div'); section.className='newsletter-section reveal-target'; var inner=document.createElement('div'); inner.className='newsletter-inner'; var eyebrow=document.createElement('p'); eyebrow.className='newsletter-eyebrow'; eyebrow.textContent='La lettera settimanale'; var title=document.createElement('h3'); title.className='newsletter-title'; title.textContent="Una lettera dall'ospitalit\u00e0 italiana"; var sub=document.createElement('p'); sub.className='newsletter-sub'; sub.innerHTML='Ogni marted\u00ec mattina, un articolo pratico per migliorare il tuo locale.
Niente spam. Cancellati quando vuoi.'; var form=document.createElement('form'); form.className='newsletter-form'; form.setAttribute('onsubmit', 'return false;'); var input=document.createElement('input'); input.type='email'; input.placeholder='tua@email.it'; input.className='newsletter-input'; input.required=true; var submitBtn=document.createElement('button'); submitBtn.type='submit'; submitBtn.className='newsletter-btn'; submitBtn.textContent='Iscriviti \u2192'; var proof=document.createElement('p'); proof.className='newsletter-proof'; proof.textContent='\u2192 847 ristoratori gi\u00e0 iscritti'; form.appendChild(input); form.appendChild(submitBtn); inner.appendChild(eyebrow); inner.appendChild(title); inner.appendChild(sub); inner.appendChild(form); inner.appendChild(proof); section.appendChild(inner); row.insertAdjacentElement('afterend', section); } function injectFooter(){ var footer=$('#colophon')||$('.site-footer'); if(!footer||$('.menucini-footer-content')) return; var year=new Date().getFullYear(); var now=new Date(); var meseName=MESI[now.getMonth()]; var issueNum=document.querySelectorAll('.ast-article-post').length||24; var content=document.createElement('div'); content.className='menucini-footer-content'; var zoneA=document.createElement('div'); zoneA.className='mc-footer-zona mc-footer-testata'; var topRule=document.createElement('div'); topRule.className='mc-footer-top-rule'; var mastheadWrap=document.createElement('div'); mastheadWrap.className='mc-footer-masthead-wrap'; var mastheadCenter=document.createElement('div'); mastheadCenter.className='mc-footer-masthead-center'; var mastheadTitle=document.createElement('a'); mastheadTitle.href='/'; mastheadTitle.className='mc-footer-masthead-title'; mastheadTitle.textContent='Menucini Blog'; var issueDetail=document.createElement('span'); issueDetail.className='mc-footer-issue'; issueDetail.textContent='N\u00b0 ' + issueNum + ' \u00b7 ' + meseName + ' ' + year; var tagline=document.createElement('div'); tagline.className='mc-footer-tagline'; tagline.textContent="Il Giornale dell\u2019Ospitalit\u00e0 Italiana"; mastheadCenter.appendChild(mastheadTitle); mastheadCenter.appendChild(tagline); mastheadWrap.appendChild(mastheadCenter); mastheadWrap.appendChild(issueDetail); var nlWrap=document.createElement('div'); nlWrap.className='mc-footer-nl'; var nlForm=document.createElement('form'); nlForm.className='mc-footer-nl-form'; nlForm.setAttribute('novalidate', ''); var nlInput=document.createElement('input'); nlInput.type='email'; nlInput.placeholder='tua@email.it'; nlInput.required=true; nlInput.className='mc-footer-nl-input'; var nlBtn=document.createElement('button'); nlBtn.type='submit'; nlBtn.className='mc-footer-nl-btn'; nlBtn.textContent='Iscriviti \u2192'; var nlMsg=document.createElement('div'); nlMsg.className='mc-footer-nl-msg'; nlForm.appendChild(nlInput); nlForm.appendChild(nlBtn); on(nlForm, 'submit', function(e){ e.preventDefault(); var email=nlInput.value.trim(); if(!email||!nlInput.validity.valid){ nlInput.classList.add('mc-nl-shake'); setTimeout(function(){ nlInput.classList.remove('mc-nl-shake'); }, 500); return; } nlMsg.textContent='Grazie! Ti terremo aggiornato \u2713'; nlMsg.classList.add('mc-nl-success'); nlForm.style.display='none'; }); var nlProof=document.createElement('div'); nlProof.className='mc-footer-nl-proof'; nlProof.textContent='Letto da 500+ ristoratori italiani'; nlWrap.appendChild(nlForm); nlWrap.appendChild(nlMsg); nlWrap.appendChild(nlProof); zoneA.appendChild(topRule); zoneA.appendChild(mastheadWrap); zoneA.appendChild(nlWrap); var zoneB=document.createElement('div'); zoneB.className='mc-footer-zona mc-footer-nav'; var navGrid=document.createElement('div'); navGrid.className='mc-footer-nav-grid'; var columns=[ { title: 'Guide Essenziali', links: [ ['Menu Digitale', '/menu-digitale/'], ['Come Creare un Menu QR', '/creare-menu-digitale-qr-code/'], ['Menu Digitale Gratis', '/menu-digitale-gratis/'], ['Prezzi Menu Digitale', '/menu-digitale-prezzi/'], ['Guida QR Code Menu', '/qr-code-menu/'] ] }, { title: 'Strumenti Gratuiti', links: [ ['Quiz', '/quiz-menu-digitale/'], ['Calcolatore ROI', '/calcolatore-roi-menu-digitale/'], ['Calcolatore Food Cost', '/calcolatore-food-cost/'], ['Glossario', '/glossario/'], ['Confronto Piattaforme', '/confronto-menu-digitale/'] ] }, { title: 'Menucini', links: [ ['Piani e Prezzi', 'https://menucini.com/prezzi', 'noopener noreferrer'], ['Funzionalit\u00e0', 'https://menucini.com/funzionalita', 'noopener noreferrer'], ['Testimonianze', '/testimonianze/'], ['Scrivici su WhatsApp', 'https://wa.me/393899027655', 'noopener noreferrer'], ['info@menucini.com', 'mailto:info@menucini.com'] ] } ]; columns.forEach(function(col){ var colEl=document.createElement('div'); colEl.className='mc-footer-nav-col'; var heading=document.createElement('button'); heading.className='mc-footer-nav-heading'; heading.setAttribute('aria-expanded', 'false'); heading.innerHTML='' + col.title + '+'; var list=document.createElement('ul'); list.className='mc-footer-nav-list'; col.links.forEach(function(item){ var li=document.createElement('li'); var a=document.createElement('a'); a.href=item[1]; a.textContent=item[0]; if(item[1].startsWith('https')){ a.target='_blank'; a.rel=item[2]||'noopener noreferrer'; } li.appendChild(a); list.appendChild(li); }); colEl.appendChild(heading); colEl.appendChild(list); navGrid.appendChild(colEl); }); zoneB.appendChild(navGrid); var zoneC=document.createElement('div'); zoneC.className='mc-footer-zona mc-footer-bottom-bar'; var bottomLeft=document.createElement('div'); bottomLeft.className='mc-footer-bottom-left'; var copyLine=document.createElement('div'); copyLine.className='mc-footer-copy'; copyLine.innerHTML='\u00a9 ' + year + ' Menucini di Nourbakhsh Mohammad Hossein \u2014 P.IVA 03835320833 \u00b7 Via Palermo 551, 98152 Messina (ME), Italia'; var legalLinks=document.createElement('div'); legalLinks.className='mc-footer-legal'; legalLinks.innerHTML = 'Privacy' + '\u00b7' + 'Cookie' + '\u00b7' + 'Termini e Condizioni'; bottomLeft.appendChild(copyLine); bottomLeft.appendChild(legalLinks); var bottomRight=document.createElement('div'); bottomRight.className='mc-footer-bottom-right'; var social=document.createElement('div'); social.className='mc-footer-social'; social.innerHTML = '' + '' + '' + '' + '' + ''; var backTop=document.createElement('button'); backTop.className='mc-footer-back-top'; backTop.setAttribute('aria-label', 'Torna su'); backTop.innerHTML=''; on(backTop, 'click', function(){ window.scrollTo({ top: 0, behavior: 'smooth' }); }); bottomRight.appendChild(social); bottomRight.appendChild(backTop); zoneC.appendChild(bottomLeft); zoneC.appendChild(bottomRight); content.appendChild(zoneA); content.appendChild(zoneB); content.appendChild(zoneC); footer.prepend(content); if(window.innerWidth < 768){ initFooterAccordion(); } var mql=window.matchMedia('(max-width: 767px)'); if(mql.addEventListener){ mql.addEventListener('change', function(e){ if(e.matches) initFooterAccordion(); else resetFooterAccordion(); }); }} function initFooterAccordion(){ $$('.mc-footer-nav-heading').forEach(function(btn){ if(btn._accBound) return; btn._accBound=true; var list=btn.nextElementSibling; list.style.maxHeight='0'; list.style.overflow='hidden'; btn.setAttribute('aria-expanded', 'false'); on(btn, 'click', function(){ var isOpen=btn.getAttribute('aria-expanded')==='true'; $$('.mc-footer-nav-heading').forEach(function(b){ b.setAttribute('aria-expanded', 'false'); b.nextElementSibling.style.maxHeight='0'; }); if(!isOpen){ btn.setAttribute('aria-expanded', 'true'); list.style.maxHeight=list.scrollHeight + 'px'; }}); }); } function resetFooterAccordion(){ $$('.mc-footer-nav-heading').forEach(function(btn){ btn.setAttribute('aria-expanded', 'false'); var list=btn.nextElementSibling; list.style.maxHeight=''; list.style.overflow=''; }); } function injectOrgSchema(){ } function initReveal(){ $$('h1,h2,h3').forEach(function(el){ if(el.closest('.menucini-toc,.site-header,.menucini-footer-content,.ast-article-post')) return; el.classList.add('curtain-reveal'); }); $$('.ast-article-post,.newsletter-section,.menucini-sommelier,blockquote').forEach(function(el){ if(el.offsetHeight===0) return; el.classList.add('reveal-target'); }); var row=$('.ast-row'); if(row) row.classList.add('reveal-group'); var io=new IntersectionObserver(function(entries){ entries.forEach(function(entry){ if(!entry.isIntersecting) return; entry.target.classList.add('is-visible'); io.unobserve(entry.target); if(entry.target.classList.contains('ast-article-post')){ setTimeout(function(){ entry.target.classList.remove('reveal-target'); entry.target.classList.add('mc-revealed'); }, 1000); }}); }, { threshold: 0.05, rootMargin: '0px 0px -40px 0px' }); $$('.curtain-reveal,.reveal-target').forEach(function(el){ io.observe(el); }); } function initBookmarks(){ var saved=JSON.parse(localStorage.getItem('menucini-saved')||'[]'); $$('.ast-article-post').forEach(function(card){ var link=card.querySelector('.entry-title a, h2 a, a[rel="bookmark"]'); if(!link) return; var id=link.href; var btn=document.createElement('button'); btn.className='bookmark-btn' + (saved.includes(id) ? ' saved':''); btn.setAttribute('aria-label', 'Salva per dopo'); btn.innerHTML=''; on(btn, 'click', function(e){ e.preventDefault(); e.stopPropagation(); var list=JSON.parse(localStorage.getItem('menucini-saved')||'[]'); var idx=list.indexOf(id); if(idx > -1){ list.splice(idx, 1); btn.classList.remove('saved'); showToast('Rimosso dai salvati'); }else{ list.push(id); btn.classList.add('saved'); showToast('Salvato per dopo'); } localStorage.setItem('menucini-saved', JSON.stringify(list)); }); card.appendChild(btn); }); } function showToast(msg){ var t=$('.bookmark-toast'); if(!t){ t=document.createElement('div'); t.className='bookmark-toast'; document.body.appendChild(t); } t.textContent=msg; t.classList.add('show'); setTimeout(function(){ t.classList.remove('show'); }, 2000); } function initWhatsAppShare(){ if(!document.body.classList.contains('single-post')) return; var title=document.title.replace(/\s[-\u2013|].*$/, ''); var url=window.location.href; var msg=encodeURIComponent('Ho trovato questo articolo utile:\ "' + title + '"\ ' + url + '\ \u2014 via Menucini Blog'); var btn=document.createElement('a'); btn.className='whatsapp-share'; btn.href='https://wa.me/?text=' + msg; btn.target='_blank'; btn.rel='noopener noreferrer'; btn.innerHTML=' Condividi'; document.body.appendChild(btn); setTimeout(function(){ btn.classList.add('is-visible'); }, 2500); } function initTOC(){ if(!document.body.classList.contains('single-post')) return; var content=$('.entry-content'); var headings=content ? $$('h2', content):[]; if(headings.length < 3) return; var toc=document.createElement('nav'); toc.className='menucini-toc'; var tocTitle=document.createElement('h4'); tocTitle.textContent='In questo articolo'; toc.appendChild(tocTitle); var ol=document.createElement('ol'); headings.forEach(function(h, i){ if(!h.id) h.id='sezione-' + (i + 1); var li=document.createElement('li'); var a=document.createElement('a'); a.href='#' + h.id; a.textContent=h.textContent; on(a, 'click', function(e){ e.preventDefault(); h.scrollIntoView({ behavior: 'smooth' });}); li.appendChild(a); ol.appendChild(li); }); toc.appendChild(ol); content.parentNode.insertBefore(toc, content); var links=$$('a', toc); var io2=new IntersectionObserver(function(entries){ entries.forEach(function(entry){ if(!entry.isIntersecting) return; var id='#' + entry.target.id; links.forEach(function(a){ var active=a.getAttribute('href')===id; a.classList.toggle('active', active); if(a.closest('li')) a.closest('li').classList.toggle('active', active); }); }); }, { rootMargin: '-15% 0px -65% 0px' }); headings.forEach(function(h){ io2.observe(h); }); } function initScrollHeader(){ var header=$('#masthead')||$('.site-header'); if(!header) return; on(window, 'scroll', function(){ header.classList.toggle('scrolled', window.scrollY > 80); }, { passive: true }); } function initHeader(){ var container=$('.main-header-bar .ast-container') || $('.main-header-bar-wrap .ast-container') || $('.main-header-bar') || $('.site-header'); if(!container||$('.mc-nav')) return; var nav=document.createElement('nav'); nav.className='mc-nav'; nav.setAttribute('aria-label', 'Navigazione principale'); var brand=document.createElement('a'); brand.className='mc-nav-brand'; brand.href='/'; brand.innerHTML = '' + '' + '' + 'M' + '' + 'Menucini Blog'; var items=document.createElement('ul'); items.className='mc-nav-items'; var li1=document.createElement('li'); li1.className='mc-nav-item'; li1.innerHTML='Blog'; var li2=document.createElement('li'); li2.className='mc-nav-item'; li2.innerHTML = '' + '
' + 'Quiz' + 'Calcolatore ROI' + 'Food Cost' + 'Glossario' + 'Confronto' + 'Risorse' + '
'; var li3=document.createElement('li'); li3.className='mc-nav-item'; li3.innerHTML='Guida QR'; var li4=document.createElement('li'); li4.className='mc-nav-item'; li4.innerHTML='Chi Siamo'; items.appendChild(li1); items.appendChild(li2); items.appendChild(li3); items.appendChild(li4); var right=document.createElement('div'); right.className='mc-nav-right'; right.innerHTML = '' + 'Prova Gratis \u2192Prova \u2192'; var hamburger=document.createElement('button'); hamburger.className='mc-hamburger'; hamburger.setAttribute('aria-label', 'Menu'); hamburger.innerHTML=''; var mobilePanel=document.createElement('div'); mobilePanel.className='mc-nav-mobile-panel'; mobilePanel.innerHTML = 'Blog' + 'Guida QR Code Menu' + 'Chi Siamo' + 'Quiz' + 'Calcolatore ROI' + 'Food Cost' + 'Glossario' + 'Confronto' + 'Risorse' + 'Prova Menucini Gratis \u2192'; right.appendChild(hamburger); nav.appendChild(brand); nav.appendChild(items); nav.appendChild(right); nav.appendChild(mobilePanel); container.innerHTML=''; container.appendChild(nav); var dropdownBtn=li2.querySelector('button'); on(dropdownBtn, 'click', function(e){ e.stopPropagation(); var isOpen=li2.classList.toggle('open'); dropdownBtn.setAttribute('aria-expanded', isOpen ? 'true':'false'); }); on(document, 'click', function(){ li2.classList.remove('open'); dropdownBtn.setAttribute('aria-expanded', 'false'); }); on(hamburger, 'click', function(){ hamburger.classList.toggle('open'); mobilePanel.classList.toggle('open'); }); on(mobilePanel, 'click', function(e){ if(e.target.tagName==='A'){ hamburger.classList.remove('open'); mobilePanel.classList.remove('open'); }}); } function initRelatedPosts(){ if(!document.body.classList.contains('single-post')) return; var commentsArea=$('.comments-area')||$('#comments'); if(!commentsArea) return; var idMatch=document.body.className.match(/\bpostid-(\d+)\b/); if(!idMatch) return; var postId=idMatch[1]; var section=document.createElement('div'); section.className='related-posts-section'; var titleEl=document.createElement('h4'); titleEl.className='related-posts-title'; titleEl.textContent='Leggi anche'; var grid=document.createElement('div'); grid.className='related-posts-grid'; section.appendChild(titleEl); section.appendChild(grid); commentsArea.parentNode.insertBefore(section, commentsArea); fetch('/wp-json/wp/v2/posts?per_page=2&_embed&exclude=' + postId) .then(function(r){ return r.json(); }) .then(function(posts){ if(!posts||!posts.length){ section.style.display='none'; return; } posts.slice(0, 2).forEach(function(post){ var media=post._embedded&&post._embedded['wp:featuredmedia']; var thumb=media&&media[0]&&media[0].source_url ? media[0].source_url:''; var card=document.createElement('a'); card.className='related-post-card'; card.href=post.link; if(thumb){ var img=document.createElement('div'); img.className='related-post-img'; img.style.backgroundImage='url(' + thumb + ')'; card.appendChild(img); } var body=document.createElement('div'); body.className='related-post-body'; var titleP=document.createElement('p'); titleP.className='related-post-title'; titleP.innerHTML=post.title.rendered; body.appendChild(titleP); card.appendChild(body); grid.appendChild(card); }); }) .catch(function(){ section.style.display='none'; }); } function initFloatingCTA(){ if(sessionStorage.getItem('mc_cta_dismissed')) return; var bar=document.createElement('div'); bar.id='mc-float-cta'; bar.innerHTML='Prova Menucini gratis — nessuna carta richiestaInizia ora →'; document.body.appendChild(bar); var shown=false; window.addEventListener('scroll', function(){ var scrollH=document.documentElement.scrollHeight - window.innerHeight; if(scrollH <=0) return; if(!shown&&(window.scrollY / scrollH) > 0.30){ bar.classList.add('mc-float-cta--visible'); shown=true; }}, { passive: true }); bar.querySelector('.mc-float-cta__dismiss').addEventListener('click', function(){ bar.classList.remove('mc-float-cta--visible'); sessionStorage.setItem('mc_cta_dismissed', '1'); }); } function getEaster(year){ var a=year % 19, b=Math.floor(year/100), c=year % 100; var d=Math.floor(b/4), e=b % 4, f=Math.floor((b+8)/25); var g=Math.floor((b-f+1)/3), h=(19*a + b - d - g + 15) % 30; var i=Math.floor(c/4), k=c % 4; var l=(32 + 2*e + 2*i - h - k) % 7; var m=Math.floor((a + 11*h + 22*l)/451); var month=Math.floor((h + l - 7*m + 114)/31); var day=((h + l - 7*m + 114) % 31) + 1; return { month: month, day: day };} function initSeasonalBanner(){ var dismissKey='mc_seasonal_dismissed'; if(sessionStorage.getItem(dismissKey)) return; var today=new Date(); var year=today.getFullYear(); var easter=getEaster(year); var events=[ { month: 8, day: 15, post: '/menu-ferragosto-ristorante/', label: 'Ferragosto', msg: 'Menu di Ferragosto: tutto pianificato?' }, { month: 12, day: 25, post: '/menu-natale-ristorante/', label: 'Natale', msg: 'Menu di Natale: tutto pronto?' }, { month: 1, day: 1, post: '/cenone-capodanno-ristorante/', label: 'Capodanno', msg: 'Cenone di Capodanno: hai già il menu?' }, { month: 2, day: 14, post: '/menu-san-valentino-ristorante/', label: 'San Valentino', msg: 'San Valentino si avvicina — il menu è pronto?' }, { month: easter.month, day: easter.day, post: '/menu-pasqua-ristorante/', label: 'Pasqua', msg: 'Pasqua si avvicina: menu e prenotazioni pronti?' } ]; var currentPath=window.location.pathname.replace(/\/+$/, '') + '/'; for (var i=0; i < events.length; i++){ var ev=events[i]; var evDate=new Date(year, ev.month - 1, ev.day); if(evDate < today){ var nextYear=year + 1; if(ev.label==='Pasqua'){ var e2=getEaster(nextYear); evDate=new Date(nextYear, e2.month - 1, e2.day); }else{ evDate=new Date(nextYear, ev.month - 1, ev.day); }} var daysUntil=Math.floor((evDate - today) / 86400000); var evPost=ev.post.replace(/\/+$/, '') + '/'; if(daysUntil >=0&&daysUntil <=30&¤tPath!==evPost){ var dayLabel=daysUntil===0 ? 'oggi':daysUntil===1 ? 'domani':daysUntil + ' giorni a ' + ev.label; var banner=document.createElement('div'); banner.className='mc-seasonal-banner'; banner.innerHTML = '' + dayLabel + '' + '' + ev.msg + '' + 'Leggi la guida →' + ''; banner.querySelector('.mc-seasonal-dismiss').addEventListener('click', function(){ banner.remove(); sessionStorage.setItem(dismissKey, '1'); }); var hdr=document.querySelector('.site-header')||document.querySelector('header'); if(hdr) hdr.insertAdjacentElement('afterend', banner); else document.body.insertAdjacentElement('afterbegin', banner); break; }} } function initROICalc(){ var placeholder=document.getElementById('mc-roi-placeholder'); if(!placeholder) return; placeholder.id='calcolatore-roi'; placeholder.className='mc-roi-calc'; placeholder.innerHTML = '

Calcolatore ROI Menu Digitale

' + '

Inserisci i dati del tuo locale. I numeri si aggiornano in tempo reale.

' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
+€0' + 'extra/mese (+12% scontrino)
' + '
+€0' + 'extra/mese (turisti +35%)' + '
' + '
+€0' + 'guadagno extra al mese
' + '
0:1' + 'ROI mensile
' + '
' + '
' + 'Costo Menucini: €14,99/mese' + 'Si ripaga in — giorni' + '
' + '

' + 'Dati reali aggregati dalla base clienti Menucini. Risultati individuali possono variare.' + '

' + '
Prova Menucini gratis per 14 giorni →
'; function fmt(n){ return '€' + Math.round(n).toLocaleString('it-IT'); } function calc(){ var coperti=parseInt(document.getElementById('inp-coperti').value); var scontrino=parseInt(document.getElementById('inp-scontrino').value); var pctTuristi=parseInt(document.getElementById('inp-turisti').value) / 100; var mensile=coperti * scontrino * 26; var upliftS=mensile * 0.12; var hasTuristi=pctTuristi > 0.20; var upliftT=hasTuristi ? mensile * pctTuristi * 0.35:0; var totale=upliftS + upliftT; var roi=(totale / 14.99).toFixed(1); var paybackDays=totale > 0 ? Math.ceil(14.99 / (totale / 26)):null; document.getElementById('val-coperti').textContent=coperti; document.getElementById('val-scontrino').textContent=scontrino; document.getElementById('val-turisti').textContent=Math.round(pctTuristi * 100); var prevS=document.getElementById('res-scontrino').textContent; var prevT=document.getElementById('res-turisti').textContent; var prevTot=document.getElementById('res-totale').textContent; var prevROI=document.getElementById('res-roi').textContent; animateROINumber(document.getElementById('res-scontrino'), prevS, '+' + fmt(upliftS), 320); animateROINumber(document.getElementById('res-totale'), prevTot, '+' + fmt(totale), 320); animateROINumber(document.getElementById('res-roi'), prevROI, roi + ':1', 280); var statTuristi=document.getElementById('stat-turisti'); var noteTuristi=document.getElementById('note-turisti'); if(hasTuristi){ animateROINumber(document.getElementById('res-turisti'), prevT, '+' + fmt(upliftT), 320); statTuristi.classList.remove('mc-roi-stat--muted'); noteTuristi.textContent=''; }else{ var resTuristi=document.getElementById('res-turisti'); if(resTuristi._mcAnim) cancelAnimationFrame(resTuristi._mcAnim); resTuristi._mcAnim=null; resTuristi.textContent='—'; statTuristi.classList.add('mc-roi-stat--muted'); noteTuristi.textContent='Attivo con >20% turisti'; } var paybackEl=document.getElementById('res-payback'); if(paybackEl){ var paybackText=paybackDays!==null&&paybackDays <=60 ? 'Si ripaga in ' + paybackDays + (paybackDays===1 ? ' giorno':' giorni') : 'Si ripaga in meno di 2 mesi'; paybackEl.textContent=paybackText; }} ['inp-coperti','inp-scontrino','inp-turisti','inp-tipo'].forEach(function(id){ var el=document.getElementById(id); if(el) el.addEventListener('input', calc); }); calc(); } function initWordReveal(){ var headings=$$('.entry-content h2, .entry-content h3'); if(!headings.length) return; headings.forEach(function(h){ if(h.closest('.menucini-toc')) return; h.classList.remove('curtain-reveal'); var words=h.innerHTML.split(/(\s+)/); h.innerHTML=words.map(function(w, i){ if(!w.trim()) return w; var delay=Math.min(i * 60, 600); return '' + w + ''; }).join(''); }); var io=new IntersectionObserver(function(entries){ entries.forEach(function(entry){ if(!entry.isIntersecting) return; entry.target.querySelectorAll('.word-reveal').forEach(function(w){ w.classList.add('is-visible'); }); io.unobserve(entry.target); }); }, { threshold: 0.15, rootMargin: '0px 0px -30px 0px' }); headings.forEach(function(h){ io.observe(h); }); } function initTOCIndicator(){ var toc=$('.menucini-toc'); if(!toc) return; var tocList=toc.querySelector('.toc-list')||toc.querySelector('ol')||toc.querySelector('ul'); if(!tocList) return; var indicator=document.createElement('div'); indicator.className='mc-toc-indicator'; tocList.style.position='relative'; tocList.appendChild(indicator); var links=Array.prototype.slice.call(toc.querySelectorAll('a[href^="#"]')); if(!links.length) return; var headings=links.map(function(a){ var id=a.getAttribute('href').slice(1); return document.getElementById(id); }).filter(Boolean); function updateActive(){ var scrollY=window.scrollY + window.innerHeight * 0.25; var activeIdx=0; headings.forEach(function(h, i){ if(h.getBoundingClientRect().top + window.scrollY <=scrollY) activeIdx=i; }); links.forEach(function(a, i){ a.classList.toggle('mc-toc-active', i===activeIdx); }); var activeLink=links[activeIdx]; if(activeLink){ var listRect=tocList.getBoundingClientRect(); var linkRect=activeLink.getBoundingClientRect(); indicator.style.top=(linkRect.top - listRect.top + tocList.scrollTop) + 'px'; indicator.style.height=linkRect.height + 'px'; }} updateActive(); on(window, 'scroll', updateActive, { passive: true }); } function initSmoothAnchors(){ on(document, 'click', function(e){ var a=e.target.closest('a[href^="#"]'); if(!a) return; var id=a.getAttribute('href').slice(1); if(!id) return; var target=document.getElementById(id); if(!target) return; e.preventDefault(); var start=window.scrollY; var end=target.getBoundingClientRect().top + window.scrollY - 80; var dist=end - start; var startT=null; var dur=Math.min(900, Math.max(350, Math.abs(dist) * 0.5)); function easeSpring(t){ return 1 - Math.pow(1 - t, 4); } function step(ts){ if(!startT) startT=ts; var t=Math.min(1, (ts - startT) / dur); window.scrollTo(0, start + dist * easeSpring(t)); if(t < 1) requestAnimationFrame(step); } requestAnimationFrame(step); }); } function initFloatingCTAClick(){ var bar=document.getElementById('mc-float-cta'); if(!bar) return; on(bar, 'click', function(e){ if(e.target.closest('.mc-float-cta__dismiss')) return; window.open('https://www.menucini.com/', '_blank', 'noopener'); }); } function animateROINumber(el, fromVal, toVal, duration){ if(!el) return; if(el._mcAnim) cancelAnimationFrame(el._mcAnim); var startT=null; var isEuro=String(fromVal).indexOf('€') >=0||String(toVal).indexOf('€') >=0; var from=parseFloat(String(fromVal).replace(/[^\d.-]/g,''))||0; var to=parseFloat(String(toVal).replace(/[^\d.-]/g,''))||0; el.classList.add('mc-counting'); function ease(t){ return t < 0.5 ? 2*t*t:1-Math.pow(-2*t+2,2)/2; } function step(ts){ if(!startT) startT=ts; var t=Math.min(1, (ts - startT) / duration); var val=from + (to - from) * ease(t); if(isEuro){ var prefix=val >=0 ? '+€':'-€'; el.textContent=prefix + Math.round(Math.abs(val)).toLocaleString('it-IT'); }else if(String(toVal).indexOf(':1') >=0){ el.textContent=val.toFixed(1) + ':1'; }else{ el.textContent=String(toVal); } if(t < 1) el._mcAnim=requestAnimationFrame(step); else { el.textContent=String(toVal); el.classList.remove('mc-counting'); el._mcAnim=null; }} el._mcAnim=requestAnimationFrame(step); } function getSweep(){ var el=document.getElementById('mc-sweep'); if(!el){ el=document.createElement('div'); el.id='mc-sweep'; document.body.insertAdjacentElement('afterbegin', el); } return el; } function runSipario(){ if(window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; var name='Menucini'; var letters=name.split('').map(function(ch, i){ return '' + ch + ''; }).join(''); var isDark=document.documentElement.classList.contains('dark-mode'); var el=document.createElement('div'); el.id='mc-sipario'; if(!isDark) el.classList.add('mc-sipario-light'); el.innerHTML = '
' + '
' + '
' + letters + '
' + '
' + '
Il Giornale dell’Ospitalità
' + '
'; document.body.insertAdjacentElement('afterbegin', el); setTimeout(function(){ el.classList.add('mc-sipario-lifting'); setTimeout(function(){ el.remove(); }, 800); }, 2000); } function runSweepOut(href){ if(window.matchMedia('(prefers-reduced-motion: reduce)').matches){ window.location.href=href; return; } var sweep=getSweep(); var content=document.querySelector('#content')||document.querySelector('main')||document.body; sweep.style.transition='none'; sweep.style.opacity='0'; sweep.style.pointerEvents='all'; sweep.getBoundingClientRect(); sweep.style.transition='opacity 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94)'; sweep.style.opacity='1'; content.classList.add('mc-page-leaving'); content.getBoundingClientRect(); content.classList.add('mc-fade-out'); sessionStorage.setItem('mc_transition', 'velo'); setTimeout(function(){ window.location.href=href; }, 340); } function runSweepIn(){ if(window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; var sweep=getSweep(); var content=document.querySelector('#content')||document.querySelector('main')||document.body; content.classList.remove('mc-page-leaving', 'mc-fade-out'); sweep.style.transition='none'; sweep.style.opacity='1'; sweep.style.pointerEvents='all'; content.classList.add('mc-page-entering'); sweep.getBoundingClientRect(); requestAnimationFrame(function(){ requestAnimationFrame(function(){ sweep.style.transition='opacity 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)'; sweep.style.opacity='0'; content.classList.add('mc-fade-in'); setTimeout(function(){ sweep.remove(); content.classList.remove('mc-page-entering', 'mc-fade-in'); }, 450); }); }); } function getLama(){ var el=document.getElementById('mc-lama'); if(!el){ el=document.createElement('div'); el.id='mc-lama'; document.body.insertAdjacentElement('afterbegin', el); } return el; } function runLaLamaOut(href){ if(window.matchMedia('(prefers-reduced-motion: reduce)').matches){ window.location.href=href; return; } var el=getLama(); el.style.transition='none'; el.style.transform='translateX(-115%) skewX(-10deg)'; el.style.transformOrigin='0 50%'; el.getBoundingClientRect(); el.style.transition='transform 180ms cubic-bezier(0.55, 0, 0.45, 1)'; el.style.transform='translateX(0) skewX(-10deg)'; sessionStorage.setItem('mc_transition', 'lama'); setTimeout(function(){ window.location.href=href; }, 200); } function runLaLamaIn(){ if(window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; var el=getLama(); el.style.transition='none'; el.style.transform='translateX(0) skewX(-10deg)'; el.style.transformOrigin='0 50%'; el.getBoundingClientRect(); requestAnimationFrame(function(){ requestAnimationFrame(function(){ el.style.transition='transform 220ms cubic-bezier(0.25, 0.46, 0.45, 0.94)'; el.style.transform='translateX(115%) skewX(-10deg)'; setTimeout(function(){ el.remove(); }, 240); }); }); } function initTransitionOut(){ on(document, 'click', function(e){ if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey) return; var a=e.target.closest('a[href]'); if(!a) return; if(a.target==='_blank') return; var href=a.getAttribute('href'); if(!href) return; if(href.charAt(0)==='#') return; if(/^(mailto:|tel:|javascript:)/.test(href)) return; var url; try { url=new URL(href, window.location.href); } catch(e){ return; } if(url.hostname!==window.location.hostname) return; if(url.pathname===window.location.pathname&&url.search===window.location.search) return; if(/^\/(wp-admin|wp-login|wp-json)/.test(url.pathname)) return; e.preventDefault(); runSweepOut(href); }); } function initPageAnimations(){ var isTransition=sessionStorage.getItem('mc_transition'); var siparioPlayed=sessionStorage.getItem('mc_sipario_played'); if(isTransition==='velo'){ sessionStorage.removeItem('mc_transition'); runSweepIn(); }else if(isTransition==='lama'){ sessionStorage.removeItem('mc_transition'); runLaLamaIn(); }else if(!siparioPlayed){ sessionStorage.setItem('mc_sipario_played', '1'); runSipario(); } initTransitionOut(); } function initMicroAnimations(){ if(window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; $$('.single .entry-content img').forEach(function(img){ if(img.closest('.menucini-toc,.menucini-sommelier,.mc-venue-card')) return; if(img.parentElement.classList.contains('img-cornice')) return; var wrap=document.createElement('span'); wrap.className='img-cornice mc-shimmer'; img.parentNode.insertBefore(wrap, img); wrap.appendChild(img); function onImgLoad(){ img.classList.add('mc-loaded'); wrap.classList.remove('mc-shimmer'); } if(img.complete&&img.naturalWidth > 0){ onImgLoad(); }else{ img.addEventListener('load', onImgLoad); img.addEventListener('error', function(){ wrap.classList.remove('mc-shimmer'); }); }}); var numRe=/^[+\-€]?\d[\d.,]*\s*[%€+xX]|^[+\-]\d|^\d{2,}/; $$('.single .entry-content strong').forEach(function(el){ if(el.closest('.switchboard-reading-time,.menucini-toc')) return; var txt=el.textContent.trim(); if(numRe.test(txt)&&!/^\d+\.\s*$/.test(txt)){ el.classList.add('stat-number'); }}); var allP=$$('.single .entry-content > p'); for (var i=allP.length - 1; i >=0; i--){ if(allP[i].querySelector('a[href*="menucini.com"]')){ allP[i].classList.add('mc-firma'); break; }} var articleIO=new IntersectionObserver(function(entries){ entries.forEach(function(entry){ if(!entry.isIntersecting) return; var el=entry.target; if(el.classList.contains('img-cornice')) el.classList.add('in-frame'); if(el.tagName==='HR') el.classList.add('drawn'); if(el.classList.contains('pull-quote')) el.classList.add('is-visible'); if(el.classList.contains('stat-number')) el.classList.add('stat-pop'); if(el.classList.contains('mc-firma')) el.classList.add('is-visible'); articleIO.unobserve(el); }); }, { threshold: 0.3, rootMargin: '0px 0px -20px 0px' }); $$('.img-cornice').forEach(function(el){ articleIO.observe(el); }); $$('.single .entry-content hr').forEach(function(el){ articleIO.observe(el); }); $$('.pull-quote').forEach(function(el){ articleIO.observe(el); }); $$('.stat-number').forEach(function(el){ articleIO.observe(el); }); $$('.mc-firma').forEach(function(el){ articleIO.observe(el); }); var footer=$('#colophon')||$('.site-footer'); if(footer){ footer.style.position='relative'; footer.classList.add('congedo-ready'); var footerIO=new IntersectionObserver(function(entries){ if(entries[0].isIntersecting){ footer.classList.add('congedo-visible'); footerIO.disconnect(); }}, { threshold: 0.1 }); footerIO.observe(footer); } var toc=$('.menucini-toc'); if(toc){ on(toc, 'click', function(e){ var a=e.target.closest('a[href^="#"]'); if(!a) return; var r=document.createElement('span'); r.className='toc-ripple'; r.style.left=e.offsetX + 'px'; r.style.top=e.offsetY + 'px'; a.style.position='relative'; a.appendChild(r); setTimeout(function(){ r.remove(); }, 500); var id=a.getAttribute('href').slice(1); var target=document.getElementById(id); if(target){ setTimeout(function(){ target.classList.add('bussola-flash'); setTimeout(function(){ target.classList.remove('bussola-flash'); }, 1000); }, Math.min(500, Math.abs(target.getBoundingClientRect().top) * 0.4)); }}); }} function initGlossary(){ var search=$('#mc-glossary-search'); if(!search) return; var letters=$$('.mc-letter-btn'); var sections=$$('.mc-glossary-section'); var cards=$$('.mc-glossary-card'); var emptyMsg=$('.mc-glossary-empty'); var presentLetters={}; sections.forEach(function(s){ var id=s.id.replace('glossary-', ''); presentLetters[id]=true; }); letters.forEach(function(btn){ if(!presentLetters[btn.dataset.letter]) btn.classList.add('disabled'); }); letters.forEach(function(btn){ on(btn, 'click', function(){ var letter=btn.dataset.letter; var target=document.getElementById('glossary-' + letter); if(!target) return; search.value=''; cards.forEach(function(c){ c.classList.remove('hidden'); }); sections.forEach(function(s){ s.classList.remove('hidden'); }); letters.forEach(function(b){ b.classList.remove('active'); }); btn.classList.add('active'); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }); }); on(search, 'input', function(){ var q=search.value.trim().toLowerCase(); letters.forEach(function(b){ b.classList.remove('active'); }); var visibleSections={}; var anyVisible=false; cards.forEach(function(card){ var term=(card.dataset.term||'').toLowerCase(); var text=card.textContent.toLowerCase(); var match = !q||term.indexOf(q)!==-1||text.indexOf(q)!==-1; card.classList.toggle('hidden', !match); if(match){ var sec=card.closest('.mc-glossary-section'); if(sec) visibleSections[sec.id]=true; anyVisible=true; }}); sections.forEach(function(s){ s.classList.toggle('hidden', !visibleSections[s.id]); }); if(emptyMsg) emptyMsg.classList.toggle('visible', !anyVisible); }); } function initCompare(){ var toggle=$('#mc-diff-toggle'); if(!toggle) return; var table=$('#mc-compare-table'); if(!table) return; var rows=$$('tbody tr:not(.mc-compare-category)', table); var diffMode=false; on(toggle, 'click', function(){ diffMode = !diffMode; toggle.classList.toggle('active', diffMode); toggle.textContent=diffMode ? 'Mostra tutte le funzionalità':'Mostra solo differenze'; rows.forEach(function(row){ if(!diffMode){ row.classList.remove('mc-same'); return; } var cells=Array.prototype.slice.call(row.querySelectorAll('td')); cells.shift(); var values=cells.map(function(c){ return c.textContent.trim(); }); var allSame=values.every(function(v){ return v===values[0]; }); row.classList.toggle('mc-same', allSame); }); }); } function initQuiz(){ var quiz=$('#mc-quiz'); if(!quiz) return; var cards=$$('.mc-quiz-card', quiz); var bar=$('#mc-quiz-bar'); var stepLabel=$('#mc-quiz-step'); var resultDiv=$('#mc-quiz-result'); if(!cards.length||!resultDiv) return; var answers={}; var total=cards.length; function showCard(idx){ cards.forEach(function(c, i){ c.style.display=i===idx ? '':'none'; if(i===idx) c.style.animation='none'; if(i===idx){ void c.offsetHeight; c.style.animation=''; }}); var pct=((idx + 1) / total * 100); if(bar) bar.style.setProperty('--quiz-progress', pct + '%'); if(stepLabel) stepLabel.textContent=(idx + 1) + ' / ' + total; } on(quiz, 'click', function(e){ var btn=e.target.closest('.mc-quiz-opt'); if(!btn) return; var q=parseInt(btn.dataset.q, 10); var val=btn.dataset.value; answers[q]=val; $$('.mc-quiz-opt[data-q="' + q + '"]', quiz).forEach(function(b){ b.classList.toggle('selected', b===btn); }); setTimeout(function(){ if(q < total){ showCard(q); }else{ showResult(); }}, 300); }); function showResult(){ cards.forEach(function(c){ c.style.display='none'; }); var progress=quiz.querySelector('.mc-quiz-progress'); if(progress) progress.style.display='none'; var features=[]; var relatedLinks=[]; var title='Menucini Standard è perfetto per te!'; var desc=''; var cta='Prova Menucini gratis per 14 giorni'; var ctaUrl='https://www.menucini.com/'; var venue=answers[1]||'ristorante'; var venueMap={ ristorante: { label: 'Ristorante', link: '/miglior-menu-digitale-ristorante/', linkText: 'Miglior menu digitale per ristorante' }, pizzeria: { label: 'Pizzeria', link: '/menu-digitale-pizzeria/', linkText: 'Menu digitale per pizzeria' }, bar: { label: 'Bar', link: '/menu-digitale-bar/', linkText: 'Menu digitale per bar' }, hotel: { label: 'Hotel', link: '/menu-digitale-hotel/', linkText: 'Menu digitale per hotel' }, altro: { label: 'Locale', link: '/menu-digitale/', linkText: 'Guida al menu digitale' }}; var venueInfo=venueMap[venue]||venueMap.ristorante; relatedLinks.push({ href: venueInfo.link, text: venueInfo.linkText }); var budget=answers[2]||'basso'; if(budget==='gratis'){ desc='Vuoi partire senza spendere? Menucini offre 14 giorni di prova gratuita senza carta di credito. A soli \u20ac14.99/mese dopo la prova, hai tutto quello che serve al tuo ' + venueInfo.label.toLowerCase() + '.'; relatedLinks.push({ href: '/menu-digitale-gratis/', text: 'Menu digitale gratis: le opzioni' }); }else if(budget==='basso'){ desc='Con un budget fino a \u20ac15/mese, Menucini Standard (\u20ac14.99/mese, o \u20ac12.99 con piano annuale) \u00e8 la scelta ideale. Include tutte le funzionalit\u00e0 premium senza sorprese.'; relatedLinks.push({ href: '/menu-digitale-prezzi/', text: 'Prezzi menu digitale a confronto' }); }else{ desc='Con il tuo budget hai accesso a tutte le funzionalit\u00e0 Menucini, incluso lo Smart Cube NFC+QR per un\'esperienza premium al tavolo.'; features.push('Smart Cube NFC+QR'); relatedLinks.push({ href: '/porta-menu-qr-code/', text: 'Smart Stand e porta menu QR' }); } var tech=answers[3]||'medio'; if(tech==='basso'){ features.push('Setup in 5 minuti'); features.push('Interfaccia semplicissima'); title='Menucini: semplice come usare WhatsApp!'; relatedLinks.push({ href: '/come-funziona-menu-digitale-qr-code/', text: 'Come funziona un menu digitale' }); }else if(tech==='alto'){ features.push('Dashboard completa'); features.push('Analytics avanzati'); } var intl=answers[4]||'no'; if(intl==='molti'){ features.push('50+ lingue automatiche'); features.push('Rilevamento lingua cliente'); title='Menucini multilingue: i turisti ti ringrazieranno!'; relatedLinks.push({ href: '/menu-digitale-multilingue/', text: 'Menu digitale multilingue' }); }else if(intl==='alcuni'){ features.push('Traduzione automatica'); relatedLinks.push({ href: '/menu-digitale-multilingue/', text: 'Menu digitale multilingue' }); } var order=answers[5]||'no'; if(order==='whatsapp'){ features.push('Ordini via WhatsApp'); relatedLinks.push({ href: '/ordini-whatsapp-ristorante/', text: 'Ordini WhatsApp per ristorante' }); }else if(order==='completo'){ features.push('Ordini via WhatsApp'); features.push('Comanda digitale'); relatedLinks.push({ href: '/whatsapp-business-ristorante/', text: 'WhatsApp Business per ristorante' }); } if(features.indexOf('QR Code menu')===-1) features.unshift('QR Code menu'); features.push('Gestione allergeni'); features.push('Aggiornamenti in tempo reale'); var titleEl=$('#mc-quiz-result-title'); var descEl=$('#mc-quiz-result-desc'); var featEl=$('#mc-quiz-result-features'); var ctaEl=$('#mc-quiz-result-cta'); var linksEl=$('#mc-quiz-related-links'); if(titleEl) titleEl.textContent=title; if(descEl) descEl.textContent=desc; if(featEl) featEl.innerHTML=features.map(function(f){ return '' + f + ''; }).join(''); if(ctaEl) ctaEl.innerHTML='' + cta + ' \u2192'; if(linksEl) linksEl.innerHTML=relatedLinks.map(function(l){ return '' + l.text + ' \u2192'; }).join(''); resultDiv.style.display=''; } var restartBtn=$('#mc-quiz-restart'); if(restartBtn){ on(restartBtn, 'click', function(){ answers={}; resultDiv.style.display='none'; var progress=quiz.querySelector('.mc-quiz-progress'); if(progress) progress.style.display=''; $$('.mc-quiz-opt', quiz).forEach(function(b){ b.classList.remove('selected'); }); showCard(0); }); } showCard(0); } function restructureArchive(){ var isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); if(!isIndex) return; var cards=$$('.ast-row .ast-article-post'); if(cards.length < 5) return; var row=$('.ast-row'); if(!row) return; var prima=document.createElement('div'); prima.className='mc-prima-pagina'; var layout=document.createElement('div'); layout.className='mc-pp-layout'; var featuredCol=document.createElement('div'); featuredCol.className='mc-pp-featured'; featuredCol.appendChild(cards[0]); var sidebar=document.createElement('div'); sidebar.className='mc-pp-sidebar'; var sideTitle=document.createElement('div'); sideTitle.className='mc-pp-sidebar-title'; sideTitle.textContent='Da leggere anche'; sidebar.appendChild(sideTitle); for (var i=1; i <=3&&i < cards.length; i++){ var card=cards[i]; var titleEl=card.querySelector('.entry-title a')||card.querySelector('.entry-title'); var title=titleEl ? titleEl.textContent.trim():''; var href=(card.querySelector('.entry-title a')||card.querySelector('a')).href||'#'; var catMatch=card.className.match(/\bcategory-([\w-]+)\b/); var catSlug=(catMatch&&catMatch[1]!=='uncategorized') ? catMatch[1]:''; card.classList.add('mc-pp-consumed'); var brief=document.createElement('div'); brief.className='mc-pp-brief'; if(catSlug) brief.dataset.catSlug=catSlug; if(catSlug){ var catEl=document.createElement('div'); catEl.className='mc-pp-brief-cat'; catEl.textContent=toDisplayLabel(catSlug); brief.appendChild(catEl); } var bTitle=document.createElement('div'); bTitle.className='mc-pp-brief-title'; bTitle.textContent=title; brief.appendChild(bTitle); var bLink=document.createElement('a'); bLink.className='mc-pp-brief-link'; bLink.href=href; bLink.textContent='\u2192 Leggi'; brief.appendChild(bLink); sidebar.appendChild(brief); } layout.appendChild(featuredCol); layout.appendChild(sidebar); prima.appendChild(layout); row.parentNode.insertBefore(prima, row); var divider=document.createElement('div'); divider.className='mc-section-divider'; var fleuron=document.createElement('span'); fleuron.className='mc-sd-fleuron'; fleuron.textContent='\u2767'; divider.appendChild(fleuron); row.parentNode.insertBefore(divider, row); } function injectPullQuoteStat(){ var isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); if(!isIndex||$('.mc-pull-stat')) return; var stats=[ 'In Italia, il 73% dei clienti consulta il menu online prima di scegliere dove mangiare.', 'Un menu digitale riduce i tempi di ordinazione del 35%, secondo le stime di settore.', 'Il 68% dei ristoratori italiani considera la digitalizzazione una priorit\u00e0 per il 2026.', 'I ristoranti con menu multilingue registrano fino al 40% in pi\u00f9 di clienti stranieri.', 'Il food cost ideale per un ristorante italiano si aggira tra il 28% e il 32% del prezzo di vendita.' ]; var stat=stats[Math.floor(Math.random() * stats.length)]; var el=document.createElement('div'); el.className='mc-pull-stat reveal-target'; var p=document.createElement('p'); p.textContent=stat; el.appendChild(p); var row=$('.ast-row'); var newsletter=$('.newsletter-section'); if(newsletter){ newsletter.parentNode.insertBefore(el, newsletter); }else if(row){ row.insertAdjacentElement('afterend', el); }} function createCasiStudioFilmstrip(){ var isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); if(!isIndex||$('.mc-filmstrip')) return; var casiCards=$$('.ast-row .ast-article-post.category-casi-studio:not(.mc-pp-consumed)'); if(casiCards.length < 2) return; var section=document.createElement('div'); section.className='mc-filmstrip reveal-target'; var divider=document.createElement('div'); divider.className='mc-section-divider'; var label=document.createElement('span'); label.className='mc-sd-label'; label.textContent='Casi Studio'; divider.appendChild(label); var track=document.createElement('div'); track.className='mc-filmstrip-track'; casiCards.forEach(function(card){ var img=card.querySelector('img.wp-post-image'); var titleEl=card.querySelector('.entry-title a')||card.querySelector('.entry-title'); var title=titleEl ? titleEl.textContent.trim():''; var href=(card.querySelector('.entry-title a')||card.querySelector('a')); var link=href ? href.href:'#'; var fc=document.createElement('div'); fc.className='mc-filmstrip-card'; if(img){ var imgClone=document.createElement('img'); imgClone.src=img.src; imgClone.alt=img.alt||title; imgClone.loading='lazy'; fc.appendChild(imgClone); } var body=document.createElement('div'); body.className='mc-filmstrip-card-body'; var t=document.createElement('div'); t.className='mc-filmstrip-card-title'; var a=document.createElement('a'); a.href=link; a.textContent=title; t.appendChild(a); body.appendChild(t); fc.appendChild(body); track.appendChild(fc); card.classList.add('mc-filmstrip-consumed'); }); section.appendChild(track); var newsletter=$('.newsletter-section'); var row=$('.ast-row'); if(newsletter){ newsletter.parentNode.insertBefore(section, newsletter); newsletter.parentNode.insertBefore(divider, section); }else if(row){ row.insertAdjacentElement('afterend', divider); divider.insertAdjacentElement('afterend', section); }} function injectEditionRail(){ var isIndex=document.body.classList.contains('blog') || document.body.classList.contains('home'); if(!isIndex||$('.mc-edition-rail')) return; var now=new Date(); var monthNum=now.getMonth() + 1; var rail=document.createElement('div'); rail.className='mc-edition-rail'; rail.textContent=MESI[now.getMonth()].toUpperCase() + ' ' + now.getFullYear() + ' \u00b7 Edizione N\u00b0 ' + monthNum; document.body.appendChild(rail); } function initCardTilt(){ if(!window.matchMedia('(hover: hover)').matches) return; var cards=$$('.ast-article-post'); if(!cards.length) return; cards.forEach(function(card){ var raf=0; card.addEventListener('mousemove', function(e){ if(raf) return; raf=requestAnimationFrame(function(){ var rect=card.getBoundingClientRect(); var x=((e.clientX - rect.left) / rect.width * 100); var y=((e.clientY - rect.top) / rect.height * 100); card.style.setProperty('--glow-x', x + '%'); card.style.setProperty('--glow-y', y + '%'); raf=0; }); }, { passive: true }); card.addEventListener('mouseleave', function(){ if(raf){ cancelAnimationFrame(raf); raf=0; } card.style.setProperty('--glow-x', '50%'); card.style.setProperty('--glow-y', '50%'); }); }); } function initCardImages(){ var empties=[]; $$('.ast-article-post').forEach(function(card){ var sec=card.querySelector('.ast-blog-featured-section'); if(!sec||sec.querySelector('img')) return; var link=card.querySelector('.entry-title a[href]'); if(!link) return; var url=link.getAttribute('href'); var slug=url.replace(/\/$/, '').split('/').pop(); if(!slug) return; sec.classList.add('mc-shimmer'); empties.push({ sec: sec, slug: slug, title: link.textContent.trim() }); }); if(!empties.length) return; var slugs=empties.map(function(e){ return e.slug; }); var apiUrl='/wp-json/wp/v2/posts?slug=' + slugs.join(',') + '&_fields=slug,featured_media,_links&_embed=wp:featuredmedia&per_page=' + slugs.length; fetch(apiUrl).then(function(r){ return r.json(); }).then(function(posts){ var map={}; posts.forEach(function(p){ var embedded=p._embedded&&p._embedded['wp:featuredmedia']; if(embedded&&embedded[0]&&embedded[0].source_url){ map[p.slug]=embedded[0].source_url; }}); empties.forEach(function(item, idx){ var imgUrl=map[item.slug]; if(!imgUrl){ item.sec.classList.remove('mc-shimmer'); var ini=document.createElement('div'); ini.className='mc-card-initial'; ini.textContent=item.title.charAt(0).toUpperCase(); item.sec.appendChild(ini); return; } var img=document.createElement('img'); img.className='mc-card-img wp-post-image'; img.src=imgUrl; img.alt=item.title; img.loading=idx < 2 ? 'eager':'lazy'; if(idx < 2) img.setAttribute('fetchpriority', 'high'); img.decoding='async'; item.sec.appendChild(img); function reveal(){ img.classList.add('mc-loaded'); item.sec.classList.remove('mc-shimmer'); } if(img.complete) reveal(); else img.addEventListener('load', reveal); img.addEventListener('error', function(){ item.sec.classList.remove('mc-shimmer'); var ini=document.createElement('div'); ini.className='mc-card-initial'; ini.textContent=item.title.charAt(0).toUpperCase(); item.sec.appendChild(ini); img.remove(); }); }); }).catch(function(){ empties.forEach(function(item){ item.sec.classList.remove('mc-shimmer'); }); }); } function initShimmer(){ var cards=$$('.ast-article-post'); if(!cards.length) return; cards.forEach(function(card){ var imgWrap=card.querySelector('.ast-blog-featured-section, .post-thumb'); if(!imgWrap) return; var img=imgWrap.querySelector('img'); if(!img) return; if(img.complete&&img.naturalWidth > 0) return; imgWrap.classList.add('mc-shimmer'); imgWrap.style.aspectRatio=imgWrap.style.aspectRatio||'16/10'; function onLoad(){ imgWrap.classList.add('mc-shimmer-fade'); setTimeout(function(){ imgWrap.classList.remove('mc-shimmer', 'mc-shimmer-fade'); }, 400); } img.addEventListener('load', onLoad); if(img.complete&&img.naturalWidth > 0) onLoad(); }); } document.addEventListener('DOMContentLoaded', function(){ if(document.documentElement.classList.contains('dark-mode')){ document.documentElement.setAttribute('data-mode','sera'); } initHeader(); initDarkMode(); initPageAnimations(); initCursor(); initScrollHeader(); initReadingProgress(); fixTables(); initWhatsAppShare(); initTOC(); initRelatedPosts(); injectMarquee(); initMarquee(); injectBlogHero(); restructureArchive(); injectNewsletter(); addReadingTime(); addCardNumbers(); addFeaturedBadge(); initBookmarks(); injectCategoryFilter(); injectPullQuoteStat(); createCasiStudioFilmstrip(); injectFooter(); injectOrgSchema(); (function(){ var metas=document.querySelectorAll('meta[name="google-site-verification"]'); metas.forEach(function(m){ if(m.content&&m.content.indexOf('google-site-verification=')===0){ m.remove(); }}); })(); (function(){ var scripts=document.querySelectorAll('script[type="application/ld+json"]'); scripts.forEach(function(s){ try { var data=JSON.parse(s.textContent); var graph=data['@graph']||[data]; var changed=false; graph.forEach(function(item){ if(item['@type']==='BlogPosting'&&item.headline){ item.headline=item.headline.replace(/\s*-\s*Menucini Blog$/i, ''); changed=true; }}); if(changed){ if(data['@graph']) data['@graph']=graph; s.textContent=JSON.stringify(data); }} catch(e){}}); })(); (function(){ var firstCardImg=document.querySelector('.ast-row article:first-child img.wp-post-image, .mc-pp-featured img.wp-post-image'); if(firstCardImg){ firstCardImg.setAttribute('fetchpriority', 'high'); firstCardImg.setAttribute('loading', 'eager'); var origSrc=firstCardImg.getAttribute('data-speedycache-original-src')||firstCardImg.getAttribute('data-src'); if(origSrc&&firstCardImg.src!==origSrc){ firstCardImg.src=origSrc; }} var ppImg=document.querySelector('.mc-pp-card-img, .mc-card-img'); if(ppImg&&ppImg!==firstCardImg){ ppImg.setAttribute('fetchpriority', 'high'); ppImg.setAttribute('loading', 'eager'); var origSrc2=ppImg.getAttribute('data-speedycache-original-src')||ppImg.getAttribute('data-src'); if(origSrc2&&ppImg.src!==origSrc2){ ppImg.src=origSrc2; }} })(); (function(){ var cardImgs=document.querySelectorAll('.mc-card-img, .ast-blog-featured-section img'); cardImgs.forEach(function(img){ if(!img.getAttribute('sizes')){ img.setAttribute('sizes', '(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw'); } if(!img.getAttribute('width')){ img.setAttribute('width', '580'); img.setAttribute('height', '317'); }}); })(); (function(){ var jq=document.querySelector('script[src*="jquery.min.js"]'); if(jq&&!jq.async&&!jq.defer){ var link=document.createElement('link'); link.rel='preload'; link.as='script'; link.href=jq.src; document.head.appendChild(link); }})(); injectSectionLabel(); injectEditionRail(); initROICalc(); initFoodCostCalc(); initFloatingCTA(); initFloatingCTAClick(); initWordReveal(); initMicroAnimations(); initTOCIndicator(); initSmoothAnchors(); initSeasonalBanner(); initGlossary(); initCompare(); initQuiz(); initAboutTools(); initCardTilt(); initCardImages(); initShimmer(); requestAnimationFrame(function(){ requestAnimationFrame(initReveal); }); }); function initAboutTools(){ var grid=document.getElementById('mc-about-tools-grid'); if(!grid) return; var tools=[ ['Calcolatore ROI', '/calcolatore-roi-menu-digitale/', 'Scopri quanto puoi risparmiare passando al menu digitale.'], ['Calcolatore Food Cost', '/calcolatore-food-cost/', 'Calcola il food cost dei tuoi piatti in pochi secondi.'], ['Quiz', '/quiz-menu-digitale/', 'Quale menu digitale fa per te? Rispondi e scoprilo.'], ['Glossario', '/glossario/', 'Tutti i termini della ristorazione digitale spiegati.'], ['Confronto Piattaforme', '/confronto-menu-digitale/', 'Confronta le principali soluzioni di menu digitale.'] ]; tools.forEach(function(t){ var a=document.createElement('a'); a.className='mc-about-tool'; a.href=t[1]; a.innerHTML='' + t[0] + '' + t[2] + ''; grid.appendChild(a); }); var cta=document.createElement('p'); cta.style.cssText='text-align:center;margin-top:var(--sp-md)'; cta.innerHTML='Prova Menucini gratis per 14 giorni \u2192'; grid.parentNode.insertBefore(cta, grid.nextSibling); } function initFoodCostCalc(){ var ph=document.getElementById('mc-foodcost-placeholder'); if(!ph) return; var INGREDIENTS=[ {id:'mozzarella_fior_di_latte',name:'Mozzarella fior di latte',price:9,unit:'kg',cat:'Proteine'}, {id:'mozzarella_bufala',name:'Mozzarella di bufala DOP',price:16,unit:'kg',cat:'Proteine'}, {id:'prosciutto_crudo',name:'Prosciutto crudo',price:25,unit:'kg',cat:'Proteine'}, {id:'prosciutto_cotto',name:'Prosciutto cotto',price:14,unit:'kg',cat:'Proteine'}, {id:'petto_pollo',name:'Petto di pollo',price:9,unit:'kg',cat:'Proteine'}, {id:'macinato_manzo',name:'Macinato di manzo',price:12,unit:'kg',cat:'Proteine'}, {id:'filetto_manzo',name:'Filetto di manzo',price:40,unit:'kg',cat:'Proteine'}, {id:'salmone',name:'Salmone',price:22,unit:'kg',cat:'Proteine'}, {id:'gamberi',name:'Gamberi',price:18,unit:'kg',cat:'Proteine'}, {id:'uova',name:'Uova',price:3.5,unit:'kg',cat:'Proteine'}, {id:'parmigiano',name:'Parmigiano Reggiano',price:20,unit:'kg',cat:'Latticini'}, {id:'pecorino',name:'Pecorino Romano',price:16,unit:'kg',cat:'Latticini'}, {id:'ricotta',name:'Ricotta',price:5,unit:'kg',cat:'Latticini'}, {id:'burro',name:'Burro',price:10,unit:'kg',cat:'Latticini'}, {id:'panna',name:'Panna fresca',price:5,unit:'L',cat:'Latticini'}, {id:'pelati',name:'Pomodori pelati',price:2.5,unit:'kg',cat:'Verdure'}, {id:'pomodori_freschi',name:'Pomodori freschi',price:3,unit:'kg',cat:'Verdure'}, {id:'insalata',name:'Insalata mista',price:4,unit:'kg',cat:'Verdure'}, {id:'patate',name:'Patate',price:1.2,unit:'kg',cat:'Verdure'}, {id:'zucchine',name:'Zucchine',price:2.5,unit:'kg',cat:'Verdure'}, {id:'melanzane',name:'Melanzane',price:2.5,unit:'kg',cat:'Verdure'}, {id:'funghi',name:'Funghi champignon',price:5,unit:'kg',cat:'Verdure'}, {id:'cipolla',name:'Cipolla',price:1.5,unit:'kg',cat:'Verdure'}, {id:'farina_00',name:'Farina 00',price:1.2,unit:'kg',cat:'Dispensa'}, {id:'pasta_secca',name:'Pasta secca',price:2,unit:'kg',cat:'Dispensa'}, {id:'riso_carnaroli',name:'Riso Carnaroli',price:4,unit:'kg',cat:'Dispensa'}, {id:'olio_evo',name:'Olio EVO',price:10,unit:'L',cat:'Dispensa'}, {id:'pane',name:'Pane',price:4,unit:'kg',cat:'Dispensa'}, {id:'sale',name:'Sale fino',price:0.5,unit:'kg',cat:'Dispensa'}, {id:'lievito',name:'Lievito fresco',price:4,unit:'kg',cat:'Dispensa'} ]; var BENCHMARKS={ ristorante: [28, 35], pizzeria: [22, 30], bar: [20, 28], hotel: [30, 38], trattoria: [30, 36] }; var recipes=[]; var editingIdx=-1; function load(){ try { recipes=JSON.parse(localStorage.getItem('mc_foodcost_recipes'))||[]; } catch(e){ recipes=[]; }} function save(){ localStorage.setItem('mc_foodcost_recipes', JSON.stringify(recipes)); } function getVenue(){ return localStorage.getItem('mc_foodcost_venue')||'ristorante'; } function setVenue(v){ localStorage.setItem('mc_foodcost_venue', v); } function findIngredient(id){ for (var i=0; i < INGREDIENTS.length; i++){ if(INGREDIENTS[i].id===id) return INGREDIENTS[i]; } return null; } function toBase(qty, inputUnit){ if(inputUnit==='g') return qty / 1000; if(inputUnit==='mL') return qty / 1000; return qty; } function calcIngCost(ing){ if(ing.preset){ var db=findIngredient(ing.preset); if(!db) return 0; if(ing.inputUnit==='pz') return ing.qty * db.price; return toBase(ing.qty, ing.inputUnit) * db.price; } if(ing.customPrice!=null){ if(ing.inputUnit==='pz') return ing.qty * ing.customPrice; return toBase(ing.qty, ing.inputUnit) * ing.customPrice; } return 0; } function fmt(n){ return n.toFixed(2).replace('.', ','); } function fmtPct(n){ return n.toFixed(1).replace('.', ',') + '%'; } function verdictClass(pct){ if(pct < 25) return 'ottimo'; if(pct < 35) return 'media'; if(pct < 40) return 'attenzione'; return 'critico'; } function verdictLabel(pct){ if(pct < 25) return 'Ottimo'; if(pct < 35) return 'Nella media'; if(pct < 40) return 'Attenzione'; return 'Critico'; } ph.innerHTML=''; ph.className='mc-fc'; var editorPanel=document.createElement('div'); editorPanel.className='mc-fc-panel'; editorPanel.id='mc-fc-editor'; var dashPanel=document.createElement('div'); dashPanel.className='mc-fc-panel'; dashPanel.id='mc-fc-dashboard'; var benchPanel=document.createElement('div'); benchPanel.className='mc-fc-panel'; benchPanel.id='mc-fc-benchmark'; ph.appendChild(editorPanel); ph.appendChild(dashPanel); ph.appendChild(benchPanel); function renderEditor(recipe){ var r=recipe||{ id: '', name: '', portions: 1, ingredients: [], sellingPrice: 0 }; var html='

' + (r.id ? 'Modifica piatto':'Nuovo piatto') + '

' + '
' + '' + '' + '
' + '
' + '' + '' + '' + '' + '' + '' + '
IngredienteQt\u00e0Unit\u00e0\u20ac/unit\u00e0Subtotale
' + '' + '
' + '
' + '' + '' + (r.id ? '':'') + '
'; editorPanel.innerHTML=html; var tbody=document.getElementById('fc-rows'); function buildOptions(selectedId){ var opts=''; var lastCat=''; for (var i=0; i < INGREDIENTS.length; i++){ var ing=INGREDIENTS[i]; if(ing.cat!==lastCat){ if(lastCat) opts +=''; opts +=''; lastCat=ing.cat; } opts +=''; } if(lastCat) opts +=''; opts +=''; return opts; } function addRow(ing){ var tr=document.createElement('tr'); var isCustom=ing&&!ing.preset; var presetId=(ing&&ing.preset)||''; var customName=(ing&&ing.customName)||''; var customPrice=(ing&&ing.customPrice!=null) ? ing.customPrice:''; var customUnit=(ing&&ing.customUnit)||'kg'; var qty=(ing&&ing.qty)||''; var inputUnit=(ing&&ing.inputUnit)||'g'; if(isCustom&&customName){ tr.innerHTML = '' + '' + '' + '' + '' + '' + '' + '' + '' + '\u20ac0,00' + ''; tr.dataset.mode='custom'; }else{ tr.innerHTML = '' + '' + '' + '' + (presetId ? priceLabel(presetId):'-') + '' + '\u20ac0,00' + ''; tr.dataset.mode='preset'; } tbody.appendChild(tr); bindRow(tr); recalc(); } function unitOpts(sel){ var units=['g','kg','mL','L','pz']; var labels=['g','kg','mL','L','pz']; var h=''; for (var i=0; i < units.length; i++){ h +=''; } return h; } function baseUnitOpts(sel){ var units=['kg','L','pz']; var h=''; for (var i=0; i < units.length; i++){ h +=''; } return h; } function priceLabel(presetId){ var db=findIngredient(presetId); if(!db) return '-'; return '\u20ac' + fmt(db.price) + '/' + db.unit; } function bindRow(tr){ var presetSel=tr.querySelector('.fc-preset'); if(presetSel){ presetSel.addEventListener('change', function(){ if(this.value==='__custom'){ tr.dataset.mode='custom'; var qtyVal=tr.querySelector('.fc-qty').value; var unitVal=tr.querySelector('.fc-unit').value; tr.querySelector('.mc-fc-col-name').innerHTML=''; tr.querySelector('.mc-fc-col-price').innerHTML = '' + ''; tr.querySelector('.fc-qty').value=qtyVal; tr.querySelector('.fc-unit').value=unitVal; bindRow(tr); }else{ tr.querySelector('.fc-price-display').textContent=this.value ? priceLabel(this.value):'-'; recalc(); }}); } tr.querySelectorAll('input, select').forEach(function(el){ el.addEventListener('input', recalc); }); var delBtn=tr.querySelector('.fc-del'); if(delBtn){ delBtn.addEventListener('click', function(){ tr.remove(); recalc(); }); }} function recalc(){ var rows=tbody.querySelectorAll('tr'); var totalCost=0; rows.forEach(function(tr){ var qty=parseFloat(tr.querySelector('.fc-qty').value)||0; var inputUnit=tr.querySelector('.fc-unit').value; var cost=0; if(tr.dataset.mode==='custom'){ var cp=parseFloat(tr.querySelector('.fc-custom-price').value)||0; var cu=tr.querySelector('.fc-custom-unit').value; if(inputUnit==='pz'){ cost=qty * cp; }else{ var baseQty=toBase(qty, inputUnit); if(cu==='pz') cost=qty * cp; else cost=baseQty * cp; }}else{ var presetSel=tr.querySelector('.fc-preset'); var presetId=presetSel ? presetSel.value:''; var db=findIngredient(presetId); if(db&&qty > 0){ if(inputUnit==='pz'){ cost=qty * db.price; }else{ cost=toBase(qty, inputUnit) * db.price; }} } tr.querySelector('.fc-sub').textContent='\u20ac' + fmt(cost); totalCost +=cost; }); var portions=parseInt(document.getElementById('fc-portions').value)||1; var costPerPortion=totalCost / portions; var sp=parseFloat(document.getElementById('fc-selling-price') ? document.getElementById('fc-selling-price').value:0)||0; var fcPct=sp > 0 ? (costPerPortion / sp) * 100:0; var margin=sp - costPerPortion; var summaryEl=document.getElementById('fc-summary'); summaryEl.innerHTML = '
\u20ac' + fmt(costPerPortion) + 'Costo/porzione
' + '
' + '' + 'Prezzo di vendita
' + '
' + (sp > 0 ? fmtPct(fcPct):'-') + '' + 'Food cost' + (sp > 0 ? '' + verdictLabel(fcPct) + '':'') + '
' + '
' + (sp > 0 ? '\u20ac' + fmt(margin):'-') + 'Margine lordo
'; var spInput=document.getElementById('fc-selling-price'); if(spInput){ spInput.addEventListener('input', recalc); }} if(r.ingredients&&r.ingredients.length){ r.ingredients.forEach(function(ing){ addRow(ing); }); }else{ addRow(null); } if(r.sellingPrice){ setTimeout(function(){ var spInput=document.getElementById('fc-selling-price'); if(spInput){ spInput.value=r.sellingPrice; recalc(); }}, 0); } document.getElementById('fc-add-row').addEventListener('click', function(){ addRow(null); }); document.getElementById('fc-name').addEventListener('input', recalc); document.getElementById('fc-portions').addEventListener('input', recalc); document.getElementById('fc-save').addEventListener('click', function(){ var name=document.getElementById('fc-name').value.trim(); if(!name){ document.getElementById('fc-name').style.borderColor='#c0392b'; return; } document.getElementById('fc-name').style.borderColor=''; var portions=parseInt(document.getElementById('fc-portions').value)||1; var sp=parseFloat(document.getElementById('fc-selling-price') ? document.getElementById('fc-selling-price').value:0)||0; var ings=[]; tbody.querySelectorAll('tr').forEach(function(tr){ var qty=parseFloat(tr.querySelector('.fc-qty').value)||0; var inputUnit=tr.querySelector('.fc-unit').value; if(qty <=0) return; if(tr.dataset.mode==='custom'){ var cn=tr.querySelector('.fc-custom-name').value.trim(); var cp=parseFloat(tr.querySelector('.fc-custom-price').value)||0; var cu=tr.querySelector('.fc-custom-unit').value; if(cn){ ings.push({ preset: null, customName: cn, customPrice: cp, customUnit: cu, qty: qty, inputUnit: inputUnit }); }}else{ var presetSel=tr.querySelector('.fc-preset'); var pid=presetSel ? presetSel.value:''; if(pid&&pid!=='__custom'){ ings.push({ preset: pid, qty: qty, inputUnit: inputUnit }); }} }); var recipe={ id: (editingIdx >=0&&recipes[editingIdx]) ? recipes[editingIdx].id:'r_' + Date.now(), name: name, portions: portions, ingredients: ings, sellingPrice: sp }; if(editingIdx >=0){ recipes[editingIdx]=recipe; }else{ recipes.push(recipe); } save(); editingIdx=-1; renderEditor(null); renderDashboard(); renderBenchmark(); }); document.getElementById('fc-new').addEventListener('click', function(){ editingIdx=-1; renderEditor(null); }); var cancelBtn=document.getElementById('fc-cancel'); if(cancelBtn){ cancelBtn.addEventListener('click', function(){ editingIdx=-1; renderEditor(null); }); } recalc(); } function renderDashboard(){ if(!recipes.length){ dashPanel.innerHTML='

I tuoi piatti

' + '
\ud83c\udf7d\ufe0fNessun piatto salvato.
Usa l\'editor sopra per aggiungere il tuo primo piatto.
'; return; } var html='

I tuoi piatti (' + recipes.length + ' ' + (recipes.length===1 ? 'piatto':'piatti') + ')

'; html +='
' + '' + ''; var totalFc=0, count=0, bestMarginPct=-Infinity, bestName='', worstFc=-Infinity, worstName=''; recipes.forEach(function(r, idx){ var cost=0; r.ingredients.forEach(function(ing){ cost +=calcIngCost(ing); });var cpp=cost / (r.portions||1); var sp=r.sellingPrice||0; var fcPct=sp > 0 ? (cpp / sp) * 100:0; var margin=sp - cpp; var marginPct=sp > 0 ? ((sp - cpp) / sp) * 100:0; if(sp > 0){ totalFc +=fcPct; count++; if(marginPct > bestMarginPct){ bestMarginPct=marginPct; bestName=r.name; } if(fcPct > worstFc){ worstFc=fcPct; worstName=r.name; }} html +='' + '' + '' + '' + '' + '' + '' + ''; });html +='
PiattoCostoPrezzoFood %Margine
\u20ac' + fmt(cpp) + '' + (sp > 0 ? '\u20ac' + fmt(sp):'-') + '' + (sp > 0 ? '' + fmtPct(fcPct) + '':'-') + '' + (sp > 0 ? '\u20ac' + fmt(margin):'-') + '
'; if(count > 0){ var avgFc=totalFc / count; html +='
' + '
Media food cost: ' + fmtPct(avgFc) + ' ' + verdictLabel(avgFc) + '
'; if(bestName) html +='
Pi\u00f9 redditizio: ' + bestName + ' (' + fmtPct(bestMarginPct) + ' margine)
'; if(worstName&&count > 1) html +='
Da rivedere: ' + worstName + ' (' + fmtPct(worstFc) + ' food cost)
'; html +='
'; } dashPanel.innerHTML=html; dashPanel.querySelectorAll('.mc-fc-dash-name').forEach(function(btn){ btn.addEventListener('click', function(){ var idx=parseInt(this.dataset.idx); editingIdx=idx; renderEditor(recipes[idx]); editorPanel.scrollIntoView({ behavior: 'smooth', block: 'start' }); }); }); dashPanel.querySelectorAll('[data-delidx]').forEach(function(btn){ btn.addEventListener('click', function(){ var idx=parseInt(this.dataset.delidx); if(confirm('Eliminare "' + recipes[idx].name + '"?')){ recipes.splice(idx, 1); save(); if(editingIdx===idx){ editingIdx=-1; renderEditor(null); } else if(editingIdx > idx){ editingIdx--; } renderDashboard(); renderBenchmark(); }}); }); } function renderBenchmark(){ var venue=getVenue(); var totalFc=0, count=0; recipes.forEach(function(r){ var cost=0; r.ingredients.forEach(function(ing){ cost +=calcIngCost(ing); }); var cpp=cost / (r.portions||1); if(r.sellingPrice > 0){ totalFc +=(cpp / r.sellingPrice) * 100; count++; }}); var avgFc=count > 0 ? totalFc / count:null; var range=BENCHMARKS[venue]||[28, 35]; var html='

Il tuo locale vs. la media italiana

' + '
' + '' + '
'; if(avgFc!==null){ var verdict=avgFc < range[0] ? 'Ottimo':(avgFc <=range[1] ? 'Nella media':'Attenzione'); var vc=avgFc < range[0] ? 'ottimo':(avgFc <=range[1] ? 'media':(avgFc <=range[1] + 5 ? 'attenzione':'critico')); html +='
' + '
Il tuo menu
Media Italia
Verdetto
' + '
Food cost
' + '
' + fmtPct(avgFc) + '
' + '
' + range[0] + '-' + range[1] + '%
' + '
' + verdict + '
' + '
'; }else{ html +='
Salva almeno un piatto con prezzo di vendita per vedere il confronto.
'; } benchPanel.innerHTML=html; var venueSelect=document.getElementById('fc-venue'); if(venueSelect){ venueSelect.addEventListener('change', function(){ setVenue(this.value); renderBenchmark(); }); }} load(); renderEditor(null); renderDashboard(); renderBenchmark(); }})(); (function(){ var page=document.querySelector('.mc-testi'); if(!page) return; var filters=page.querySelectorAll('.mc-testi-filter'); var cards=page.querySelectorAll('.mc-testi-card'); filters.forEach(function(btn){ btn.addEventListener('click', function(){ filters.forEach(function(b){ b.classList.remove('active'); }); btn.classList.add('active'); var venue=btn.getAttribute('data-venue'); cards.forEach(function(card){ if(venue==='tutti'||card.getAttribute('data-venue')===venue){ card.classList.remove('filtered-out'); }else{ card.classList.add('filtered-out'); }}); }); }); var statsBar=page.querySelector('.mc-testi-stats'); if(statsBar){ var counted=false; var nums=statsBar.querySelectorAll('.mc-testi-stat-num'); var observer=new IntersectionObserver(function(entries){ if(entries[0].isIntersecting&&!counted){ counted=true; nums.forEach(function(el){ var target=parseInt(el.getAttribute('data-target'), 10); var suffix=el.getAttribute('data-suffix')||''; var prefix=el.getAttribute('data-prefix')||''; var duration=1200; var start=performance.now(); function tick(now){ var p=Math.min((now - start) / duration, 1); var ease=1 - Math.pow(1 - p, 3); var val=Math.round(ease * target); el.textContent=prefix + val.toLocaleString('it-IT') + suffix; if(p < 1) requestAnimationFrame(tick); } requestAnimationFrame(tick); }); observer.disconnect(); }}, { threshold: 0.3 }); observer.observe(statsBar); } var revealTargets=page.querySelectorAll('.mc-testi-card, .mc-testi-ba-col, .mc-testi-cta'); if(revealTargets.length&&'IntersectionObserver' in window){ var revObs=new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('revealed'); revObs.unobserve(e.target); }}); }, { threshold: 0.1 }); revealTargets.forEach(function(el){ el.classList.add('reveal-target'); revObs.observe(el); }); }})(); (function(){ var page=document.querySelector('.mc-risorse'); if(!page) return; var searchInput=page.querySelector('.mc-risorse-search input'); if(searchInput){ var allCards=page.querySelectorAll('.mc-risorsa-card'); var sections=page.querySelectorAll('.mc-risorse-section'); var subgroups=page.querySelectorAll('.mc-risorse-subgroup'); searchInput.addEventListener('keyup', function(){ var q=this.value.toLowerCase().trim(); allCards.forEach(function(card){ if(!q){ card.classList.remove('filtered-out'); return; } var title=(card.querySelector('.mc-risorsa-title')||{}).textContent||''; var tags=card.getAttribute('data-tags')||''; var desc=(card.querySelector('.mc-risorsa-desc')||{}).textContent||''; var match=title.toLowerCase().indexOf(q)!==-1 || tags.toLowerCase().indexOf(q)!==-1 || desc.toLowerCase().indexOf(q)!==-1; card.classList.toggle('filtered-out', !match); }); subgroups.forEach(function(sg){ var visible=sg.querySelectorAll('.mc-risorsa-card:not(.filtered-out)'); sg.style.display=visible.length ? '':'none'; }); sections.forEach(function(sec){ var visible=sec.querySelectorAll('.mc-risorsa-card:not(.filtered-out)'); sec.classList.toggle('filtered-out', visible.length===0); }); }); } var sidebarLinks=page.querySelectorAll('.mc-risorse-sidebar a'); var sectionEls=page.querySelectorAll('.mc-risorse-section[id]'); if(sidebarLinks.length&§ionEls.length){ var secObs=new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(e.isIntersecting){ sidebarLinks.forEach(function(a){ a.classList.remove('active'); }); var link=page.querySelector('.mc-risorse-sidebar a[href="#' + e.target.id + '"]'); if(link) link.classList.add('active'); }}); }, { rootMargin: '-80px 0px -60% 0px', threshold: 0 }); sectionEls.forEach(function(s){ secObs.observe(s); }); } page.querySelectorAll('.mc-risorse-sidebar a').forEach(function(a){ a.addEventListener('click', function(e){ var href=this.getAttribute('href'); if(href&&href.charAt(0)==='#'){ e.preventDefault(); var target=document.getElementById(href.substring(1)); if(target) target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }}); }); var revealTargets=page.querySelectorAll('.mc-risorsa-card, .mc-risorse-percorso, .mc-risorse-strumento'); if(revealTargets.length&&'IntersectionObserver' in window){ var revObs=new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('revealed'); revObs.unobserve(e.target); }}); }, { threshold: 0.05 }); revealTargets.forEach(function(el){ el.classList.add('reveal-target'); revObs.observe(el); }); }})();; /* ══════════════════════════════════════════════ HOMEPAGE V2 — Appended 2026-04-18 Runs AFTER existing DOMContentLoaded init. ══════════════════════════════════════════════ */ (function(){ 'use strict'; if(!document.body.classList.contains('blog')&&!document.body.classList.contains('home')) return; var noMotion=window.matchMedia('(prefers-reduced-motion: reduce)').matches; var isMobile=window.matchMedia('(max-width: 768px)').matches; var canHover=window.matchMedia('(hover: hover)').matches; /* ── Load Caveat font ── */ (function(){ var link=document.createElement('link'); link.rel='stylesheet'; link.href='https://fonts.googleapis.com/css2?family=Caveat:wght@400;600&display=swap'; document.head.appendChild(link); })(); /* ── Load GSAP from CDN (with fallback) ── */ function loadGSAP(cb){ if(typeof gsap!=='undefined'){cb();return;} var fallbackTimer=setTimeout(function(){ document.querySelectorAll('.mc-hero-char').forEach(function(c){c.style.opacity=1;c.style.transform='none';}); var ul=document.querySelector('.mc-hero-underline');if(ul)ul.style.transform='scaleX(1)'; },5000); var s1=document.createElement('script'); s1.src='https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js'; s1.onload=function(){ var s2=document.createElement('script'); s2.src='https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js'; s2.onload=function(){ clearTimeout(fallbackTimer); gsap.registerPlugin(ScrollTrigger); cb(); }; document.head.appendChild(s2); }; document.head.appendChild(s1); } /* ── Build Hero V2 ── */ function buildHeroV2(){ var oldHero=document.querySelector('.blog-hero-tagline'); if(oldHero) oldHero.remove(); var marquee=document.querySelector('.marquee-strip'); if(!marquee) return; // Get first card from Prima Pagina for spotlight var ppFeatured=document.querySelector('.mc-pp-featured .ast-article-post'); var spotlightHTML=''; if(ppFeatured){ var img=ppFeatured.querySelector('img.wp-post-image'); var titleEl=ppFeatured.querySelector('.entry-title a')||ppFeatured.querySelector('.entry-title'); var excerpt=ppFeatured.querySelector('.ast-excerpt-container p, .entry-content p'); var catEl=ppFeatured.querySelector('.cat-label'); var link=ppFeatured.querySelector('.entry-title a'); var href=link?link.href:'#'; spotlightHTML='
' +'
' +(img?''+(img.alt||'')+'':'') +'
' +(catEl?'
'+catEl.textContent+'
':'') +'

'+(titleEl?titleEl.textContent:'')+'

' +(excerpt?'

'+excerpt.textContent.substring(0,140)+'...

':'') +'
'; } var MESI=['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre']; var now=new Date(); var issueText='N\u00b0 '+(now.getMonth()+1)+' \u00b7 '+MESI[now.getMonth()]+' '+now.getFullYear(); var hero=document.createElement('section'); hero.className='mc-hero-v2'; hero.innerHTML='
' +'
' +'' +'' +'' +'' +'
'+issueText+'
' +'

Gestire un ristorante \u00e8 complicato. Qui lo rendiamo pi\u00f9 semplice.

' +'

Normativa, costi, strumenti digitali e strategie operative. Scritto per chi ha un locale, non per chi ne parla.

' +'' +'
' +'
'+spotlightHTML+'
'; marquee.parentNode.insertBefore(hero, marquee.nextSibling); } /* ── Build Bridge (Esplora) ── */ function buildBridge(){ var hero=document.querySelector('.mc-hero-v2'); if(!hero) return; var fold=document.createElement('div'); fold.className='mc-newspaper-fold'; fold.setAttribute('aria-hidden','true'); hero.parentNode.insertBefore(fold, hero.nextSibling); var bridge=document.createElement('section'); bridge.className='mc-explore'; bridge.innerHTML='
' +'

Indice \u00b7 edizione Menucini

' +'

Da dove vuoi partire?

' +'

Ogni area ha guide, strumenti e risposte concrete.

' +'
' +'' +'
' +'

Guide Pratiche

' +'

Checklist, procedure, istruzioni passo-passo. Dall\'organizzazione della cucina all\'ispezione ASL.

' +'Leggi le guide \u2192
' +'' +'
' +'

Glossario

' +'

Food cost, EBITDA, HACCP, scontrino medio: ogni termine spiegato con formule ed esempi italiani.

' +'Apri il glossario \u2192
' +'' +'
' +'

Strumenti

' +'

Calcolatore ROI, food cost e quiz. Gratuiti. Per decidere con i numeri, non a intuito.

' +'Prova gratis \u2192
' +'' +'
' +'

Confronti

' +'

TheFork vs Quandoo, digitale vs cartaceo, POS vs registratore. Confronti onesti, con i numeri.

' +'Vedi i confronti \u2192
' +'
'; fold.parentNode.insertBefore(bridge, fold.nextSibling); } /* ── Build Carta del Giorno ── */ function buildCartaDelGiorno(){ var grid=document.querySelector('.ast-row'); if(!grid) return; // Pick a post based on day of month var cards=Array.from(document.querySelectorAll('.ast-row .ast-article-post:not(.mc-pp-consumed)')); if(cards.length<1) return; var pick=cards[new Date().getDate()%cards.length]; var titleEl=pick.querySelector('.entry-title a')||pick.querySelector('.entry-title'); var link=pick.querySelector('.entry-title a'); if(!titleEl) return; var MESI=['gennaio','febbraio','marzo','aprile','maggio','giugno','luglio','agosto','settembre','ottobre','novembre','dicembre']; var now=new Date(); var dateStr=now.getDate()+' '+MESI[now.getMonth()]+' '+now.getFullYear(); var carta=document.createElement('div'); carta.className='mc-carta-del-giorno'; carta.innerHTML='
' +'

Oggi consigliamo

' +'
' +'

'+titleEl.textContent+'

' +'

'+dateStr+'

' +'
' +'Leggi \u2192'; // Insert before the grid section label var sectionLabel=document.querySelector('.section-label'); var target=sectionLabel||grid; target.parentNode.insertBefore(carta, target); } /* ── Build Coffee Cup ── */ function buildCoffeeCup(){ var cup=document.createElement('div'); cup.className='mc-coffee-progress'; cup.setAttribute('aria-hidden','true'); cup.innerHTML='' +'' +'' +'' +'' +'' +'' +'' +'' +'' +'' +'
il tuo caff\u00e8
'; document.body.appendChild(cup); } /* ── Build Floating Ingredients ── */ function buildIngredients(){ if(isMobile) return; var wrap=document.createElement('div'); wrap.className='mc-ingredients'; wrap.setAttribute('aria-hidden','true'); wrap.innerHTML= '
' +'
' +'
' +'
'; document.body.appendChild(wrap); } /* ── GSAP Animations ── */ function initAnimations(){ if(typeof gsap==='undefined') return; // Hero entrance var h1=document.querySelector('.mc-hero-editorial .hero-tagline'); if(h1&&!h1.querySelector('.mc-hero-char')){ var text=h1.textContent; h1.innerHTML=text.split('').map(function(ch){ if(ch===' ') return ' '; return ''+ch+''; }).join('')+''; } if(noMotion){ document.querySelectorAll('.mc-hero-char').forEach(function(c){ c.style.opacity=1; c.style.transform='none'; }); var ul=document.querySelector('.mc-hero-underline'); if(ul) ul.style.transform='scaleX(1)'; return; } var chars=document.querySelectorAll('.mc-hero-char'); var underline=document.querySelector('.mc-hero-underline'); var tl=gsap.timeline(); tl.from('.mc-hero-editorial .hero-issue',{opacity:0,y:20,duration:0.5,ease:'power2.out'},0) .to(chars,{opacity:1,y:0,duration:0.45,stagger:0.018,ease:'power2.out'},0.1); if(underline) tl.to(underline,{scaleX:1,duration:0.8,ease:'power2.inOut'},0.5); tl.from('.mc-hero-editorial .hero-sub',{opacity:0,y:20,duration:0.6,ease:'power2.out'},0.6) .from('.mc-hero-search',{opacity:0,y:15,scale:0.95,duration:0.7,ease:'power2.out'},0.75) .from('.mc-hero-quicklinks a',{opacity:0,y:15,duration:0.5,stagger:0.08,ease:'power2.out'},0.9) .from('.mc-hero-spotlight .spotlight-card',{opacity:0,x:70,rotationY:-8,duration:1.1,ease:'power2.out'},0.3); // Annotations gsap.from('.mc-annotation',{opacity:0,duration:0.5,stagger:0.2,delay:1.5,ease:'power2.out'}); gsap.from('.mc-margin-line',{scaleY:0,transformOrigin:'top',duration:0.8,delay:1.2,ease:'power2.out'}); // Hero interactions (desktop only) if(canHover){ var hero=document.querySelector('.mc-hero-v2'); var glow=document.querySelector('.mc-hero-glow'); var card=document.querySelector('.mc-hero-spotlight .spotlight-card'); var shine=document.querySelector('.spotlight-shine'); var pills=document.querySelectorAll('.mc-hero-quicklinks a'); if(hero&&glow){ var glowX=gsap.quickTo(glow,'x',{duration:0.6,ease:'power2.out'}); var glowY=gsap.quickTo(glow,'y',{duration:0.6,ease:'power2.out'}); hero.addEventListener('mousemove',function(e){ var r=hero.getBoundingClientRect(); glowX(e.clientX-r.left);glowY(e.clientY-r.top); },{passive:true}); } if(card){ var tiltX=gsap.quickTo(card,'rotationX',{duration:0.4,ease:'power2.out'}); var tiltY=gsap.quickTo(card,'rotationY',{duration:0.4,ease:'power2.out'}); card.addEventListener('mousemove',function(e){ var r=card.getBoundingClientRect(); var x=(e.clientX-r.left)/r.width, y=(e.clientY-r.top)/r.height; tiltX((y-0.5)*-8); tiltY((x-0.5)*8); if(shine){ shine.style.setProperty('--shine-x',(x*100)+'%'); shine.style.setProperty('--shine-y',(y*100)+'%'); } },{passive:true}); card.addEventListener('mouseleave',function(){ tiltX(0); tiltY(0); }); } pills.forEach(function(p){ p.addEventListener('mousemove',function(e){ var r=p.getBoundingClientRect(); gsap.to(p,{x:(e.clientX-r.left-r.width/2)*0.3,y:(e.clientY-r.top-r.height/2)*0.3,duration:0.3,ease:'power2.out'}); },{passive:true}); p.addEventListener('mouseleave',function(){ gsap.to(p,{x:0,y:0,duration:0.5,ease:'elastic.out(1,0.4)'}); }); }); } // Scroll animations function reveal(t,tr,v,e){ gsap.from(t,Object.assign({scrollTrigger:{trigger:tr||t,start:'top 88%',toggleActions:'play none none none'},ease:'power2.out'},v,e||{})); } reveal('.mc-newspaper-fold','.mc-newspaper-fold',{opacity:0,scaleX:0.3,duration:0.6}); reveal('.mc-explore-header','.mc-explore',{y:35,opacity:0,duration:0.7}); reveal('.mc-explore-card','.mc-explore-grid',{y:50,opacity:0,duration:0.8,stagger:0.12}); reveal('.mc-carta-del-giorno','.mc-carta-del-giorno',{opacity:0,y:30,rotation:-6,scale:0.9,duration:0.9}); // Grid cards — batch trigger (1 instance instead of ~12) ScrollTrigger.batch('.ast-row .ast-article-post:not(.mc-pp-consumed)',{ start:'top 90%', onEnter:function(batch){ gsap.from(batch,{y:50,opacity:0,duration:0.7,stagger:0.15,ease:'power2.out'}); batch.forEach(function(c){c.classList.add('mc-revealed');}); } }); // Newsletter gsap.from('.newsletter-section',{ scrollTrigger:{trigger:'.newsletter-section',start:'top 88%',toggleActions:'play none none none'}, scale:0.92,opacity:0,duration:1,ease:'power2.out', onComplete:function(){ var el=document.querySelector('.newsletter-proof'); if(!el) return; var m=el.textContent.match(/(\d+)/); if(!m) return; var target=parseInt(m[1],10); var span=document.createElement('span'); span.className='counter-num'; el.innerHTML=el.innerHTML.replace(m[1],'0'); var numEl=el.querySelector('.counter-num'); gsap.to({v:0},{v:target,duration:1.8,ease:'power1.out',snap:{v:1},onUpdate:function(){ numEl.textContent=Math.round(this.targets()[0].v); }}); } }); // Coffee cup scroll progress var cup=document.querySelector('.mc-coffee-progress'); var liquid=document.querySelector('.mc-coffee-liquid'); var steam=document.querySelector('.mc-coffee-steam'); if(cup&&liquid){ ScrollTrigger.create({trigger:document.body,start:'top -10%', onEnter:function(){cup.classList.add('is-visible');}, onLeaveBack:function(){cup.classList.remove('is-visible');} }); gsap.to(liquid,{scrollTrigger:{trigger:document.body,start:'top top',end:'bottom bottom',scrub:0.3},attr:{y:12,height:28},ease:'none'}); if(steam) gsap.to(steam,{scrollTrigger:{trigger:document.body,start:'80% bottom',end:'bottom bottom',scrub:0.3},opacity:0.5,ease:'none'}); } // Floating ingredients parallax if(!isMobile){ var speeds=[0.15,-0.1,0.12,-0.08]; document.querySelectorAll('.mc-ingredient').forEach(function(el,i){ gsap.to(el,{scrollTrigger:{trigger:document.body,start:'top top',end:'bottom bottom',scrub:1}, y:speeds[i]*window.innerHeight,ease:'none'}); }); } } /* ── Init sequence ── */ function initV2(){ buildHeroV2(); buildBridge(); buildCartaDelGiorno(); buildCoffeeCup(); buildIngredients(); loadGSAP(initAnimations); } // Run after existing DOMContentLoaded handlers complete if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded',function(){ setTimeout(initV2,50); }); }else{ setTimeout(initV2,50); } // CSS overrides for visual polish (function(){ var s=document.createElement('style'); s.textContent='.mc-ingredient{opacity:0.15 !important;}' +'@media(max-width:1024px){.mc-margin-line,.mc-annotation{display:block !important;}}' +'.mc-annotation--qui{left:-60px !important;}' +'.mc-annotation--circle{left:-48px !important;}' +'.mc-annotation--arrow{left:-40px !important;}' +'[data-mode="sera"]{--ast-global-color-0:#C4622D;--ast-global-color-1:#A04E22;--ast-global-color-2:#F0E6D3;--ast-global-color-3:#C8B99A;--ast-global-color-4:#1A1510;--ast-global-color-5:#221E18;--ast-global-color-6:#2C271F;--ast-global-color-7:#221E18;--ast-global-color-8:#8C7B6B;}' +'[data-mode="sera"] body{background:var(--c-ivory) !important;color:var(--c-ink) !important;}' +'[data-mode="sera"] #masthead,[data-mode="sera"] .site-header{background:var(--c-ivory) !important;border-bottom-color:var(--c-linen-d) !important;}' +'[data-mode="sera"] .scrolled #masthead,[data-mode="sera"] .scrolled .site-header{background:rgba(26,21,16,0.92) !important;}' +'.mc-hero-search input[type="search"]{padding:11px 16px 11px 48px !important;background:var(--c-linen) !important;border-radius:var(--r-pill) !important;border-color:var(--c-linen-d) !important;}' +'.mc-hero-search input[type="search"]:focus{border-color:var(--c-terracotta) !important;background:var(--c-white) !important;}'; document.head.appendChild(s); })(); })();