PageSourceSearch

https://www.squalionline.com/boost/link-supporto.js?v=819a67a1

js squalionline.com collected 2026-10-08 06:03:41 UTC 4,952 bytes, 112 lines download raw bytes

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.