PageSourceSearch

https://rousseau5.ch/wp-content/themes/rousseau5/assets/js/temps-forts.js?ver=1788700219

js rousseau5.ch collected 2026-10-06 12:23:04 UTC 2,965 bytes, 74 lines download raw bytes

1/**
2 * « Les temps forts » — arrivée des vignettes et décompte des chiffres.
3 *
4 * Extrait de transactions.js le 28/08 : le bloc est désormais posé sur
5 * l'accueil aussi, où cette feuille-là n'est pas chargée. Autonome, donc,
6 * et sans dépendance — il ne partage plus que le CSS.
7 *
8 * UNE SEULE FOIS : une animation qui se rejoue à chaque passage devient
9 * un tic, pas un effet. Sans JavaScript ou avec les animations réduites,
10 * tout est déjà lisible — le CSS pose l'état final, le script ne fait
11 * que retarder son apparition.
12 */
13(function () {
14	'use strict';
15	/* La virgule décimale et « mrd » sont français ; la page anglaise écrit
16	   2.70 bn (06/09/2026). La langue vient du <html lang>. */
17	var R5_FR = /^fr/i.test(document.documentElement.lang || 'fr');
18	var R5_DEC = R5_FR ? ',' : '.';
19	var R5_MRD = R5_FR ? ' mrd' : ' bn';
20
21	var bande = document.querySelector('.tx-forts');
22	if (!bande) { return; }
23
24	/* Formats, identiques à ceux du serveur : le décompte doit atterrir
25	   exactement sur le texte rendu, pas à côté. */
26	function nb(n) { return Math.round(n).toString().replace(/\B(?=(\d{3})+(?!\d))/g, '’'); }
27	function mio(n) {
28		if (!n) { return '0'; }
29		if (n >= 1e9) { return (n / 1e9).toFixed(2).replace('.', R5_DEC) + R5_MRD; }
30		if (n >= 1e6) { return (n / 1e6).toFixed(1).replace('.', R5_DEC) + 'M'; }
31		return Math.round(n / 1e3) + 'k';
32	}
33
34	var doux = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
35	if (doux || !('IntersectionObserver' in window)) { return; } // déjà visible
36
37	// On masque seulement maintenant, et l'on garde un filet : si
38	// l'observateur ne se déclenche pas — onglet déclaré masqué,
39	// navigateur atypique — la bande s'affiche quand même au bout de deux
40	// secondes. Un contenu ne doit jamais dépendre d'un événement qui
41	// peut ne pas venir.
42	bande.classList.add('anim');
43	var lance = false;
44	var filet = setTimeout(demarrer, 2000);
45
46	function demarrer() {
47		if (lance) { return; }
48		lance = true;
49		clearTimeout(filet);
50		bande.classList.add('vu');
51
52		Array.prototype.forEach.call(bande.querySelectorAll('[data-tx-compteur]'), function (el, i) {
53			var cible = parseInt(el.dataset.txCompteur, 10);
54			var final = el.textContent;
55			if (!cible || cible > 1e12) { return; }
56			var format = (final.indexOf('M') !== -1 || final.indexOf('mrd') !== -1 || final.indexOf('k') !== -1)
57				? mio : nb;
58			var debut = null, duree = 1100 + i * 120;
59			function pas(t) {
60				if (debut === null) { debut = t; }
61				var p = Math.min(1, (t - debut) / duree);
62				var adouci = 1 - Math.pow(1 - p, 3);
63				el.textContent = p < 1 ? format(Math.round(cible * adouci)) : final;
64				if (p < 1) { requestAnimationFrame(pas); }
65			}
66			requestAnimationFrame(pas);
67		});
68	}
69
70	var obs = new IntersectionObserver(function (entrees) {
71		if (entrees[0].isIntersecting) { demarrer(); obs.disconnect(); }
72	}, { threshold: 0.2 });
73	obs.observe(bande);
74})();

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.