1/* Aggiunge "Supporto" al menu in fondo alla pagina. 2 * 3 * La sezione /supporto e' costruita da noi e Framer non la conosce, quindi nel 4 * footer del sito non compare. Aggiungerla dentro il progetto Framer 5 * vorrebbe dire rifare il mirror a ogni modifica; qui si agisce sul DOM finito, 6 * come gia' si fa per le schede di /progetti. 7 * 8 * Come si trova il footer. Per il tag che lo dice: <footer>. NON per 9 * posizione nella pagina - il menu in alto e' fisso e segue lo scorrimento, 10 * quindi a fondo pagina le sue coordinate lo fanno sembrare l'elemento piu' in 11 * basso, ed e' esattamente li' che il link era finito, mandando a capo la 12 * pillola del menu - e NON per le parole che contiene: prima le spie erano 13 * "casi studio" e "classifica ai", e sulle pagine tradotte quelle parole sono 14 * in un'altra lingua, l'elenco non si trovava piu' e la voce Supporto spariva 15 * dal piede. Se ne e' accorto il confronto con la pagina italiana: il piede 16 * inglese era 39 px piu' basso. 17 * 18 * Di <footer> ce n'e' uno per formato - computer, tablet, telefono - ed e' il 19 * CSS a decidere quale si vede: la voce va aggiunta a tutti. 20 * 21 * Dove porta e come si chiama lo dice il <body> della pagina, che 22 * tools/framer-lingua.mjs marca con data-supporto. 23 * 24 * Il link non si costruisce da zero: si CLONA una voce esistente e se ne 25 * cambiano testo e destinazione, cosi' eredita classi, font e comportamenti al 26 * passaggio del mouse senza doverli indovinare - e regge il fatto che le 27 * classi di Framer sono generate e cambiano a ogni pubblicazione. 28 */ 29(function () { 30 'use strict' 31 if (window.__linkSupporto) return 32 window.__linkSupporto = true 33 34 function attributo(nome, difetto) { 35 var b = document.body 36 return (b && b.getAttribute(nome)) || difetto 37 } 38 39 function scriviTesto(nodo, testo) { 40 for (var i = 0; i < nodo.childNodes.length; i++) { 41 var c = nodo.childNodes[i] 42 if (c.nodeType === 3 && c.nodeValue.trim()) { c.nodeValue = testo; return true } 43 if (c.nodeType === 1 && scriviTesto(c, testo)) return true 44 } 45 return false 46 } 47 48 function fisso(el) { 49 for (var n = el; n && n !== document.body; n = n.parentElement) { 50 var p = getComputedStyle(n).position 51 if (p === 'fixed' || p === 'sticky') return true 52 } 53 return false 54 } 55 56 function applica() { 57 var DEST = attributo('data-supporto', '/supporto') 58 var TESTO = attributo('data-supporto-testo', 'Supporto') 59 var piedi = document.querySelectorAll('footer') 60 for (var i = 0; i < piedi.length; i++) aggiungiA(piedi[i], DEST, TESTO) 61 } 62 63 function aggiungiA(piede, DEST, TESTO) { 64 /* La spia e' una voce qualunque dell'elenco: si prende la prima che porta 65 * a un'ancora della home (./#reparti), perche' quelle sono le voci del 66 * menu e non il logo o le note legali. */ 67 var voci = piede.querySelectorAll('a[href*="#"]') 68 var spia = null 69 for (var i = 0; i < voci.length; i++) if (!fisso(voci[i])) { spia = voci[i]; break } 70 if (!spia) return // footer non ancora in pagina 71 72 /* Si risale fino al VERO elenco, non al primo contenitore utile. 73 * Ogni voce del footer e' avvolta in un div suo; fermarsi li' significa 74 * infilare la voce nuova dentro quella accanto, che eredita cosi' la 75 * spaziatura sbagliata - "Supporto" finiva attaccato a "Casi Studio" 76 * mentre le altre voci erano distanziate. L'elenco e' il primo antenato i 77 * cui figli sono almeno tre e contengono quasi tutti un link. */ 78 var riga = spia, lista = null 79 for (var g = 0; g < 5 && riga.parentElement; g++) { 80 var pa = riga.parentElement 81 var conLink = 0 82 for (var k = 0; k < pa.children.length; k++) if (pa.children[k].querySelector('a')) conLink++ 83 if (pa.children.length >= 3 && conLink >= pa.children.length - 1) { lista = pa; break } 84 riga = pa 85 } 86 if (!lista || lista.querySelector('a[href="' + DEST + '"]')) return 87 88 var nuovo = riga.cloneNode(true) 89 var link = nuovo.matches('a') ? nuovo : nuovo.querySelector('a') 90 if (!link) return 91 link.setAttribute('href', DEST) 92 link.removeAttribute('data-framer-page-link-current') 93 scriviTesto(link, TESTO) 94 nuovo.setAttribute('data-boost-supporto', '1') 95 lista.appendChild(nuovo) // in coda all'elenco 96 } 97 98 function avvia() { try { applica() } catch (e) {} } 99 100 /* Non su DOMContentLoaded: React si idrata dopo, e toccare il DOM prima 101 * gli fa buttare via la pagina. Vedi mirror/boost/dopo-idratazione.js. */ 102 function avviaTutto() { 103 avvia() 104 /* Anche l'osservatore parte solo dopo l'idratazione: registrato prima, 105 * scatterebbe sulle modifiche che React fa mentre si idrata, e il 106 * ritocco tornerebbe a cadere nel mezzo. */ 107 new MutationObserver(avvia).observe(document.documentElement, { childList: true, subtree: true }) 108 } 109 110 window.dopoIdratazione ? window.dopoIdratazione(avviaTutto) : addEventListener('load', avviaTutto) 111 112})()
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.