tbody>tr>td { padding: 5px 8px; } } } /* DARK MODE */ [data-color-mode= »dark »] { .contenant_graphe { .axes line, .axes path { stroke: rgba(255, 255, 255, 0.85); } .axes.x .tick line { stroke: rgba(255, 255, 255, 0.3); } .axes.x .tick text { fill: rgba(255, 255, 255, 0.85); } .axes.y .tick text { fill: rgba(255, 255, 255, 0.9); } .grid line { stroke: rgba(255, 255, 255, 0.15); } .grid .tick:first-of-type line { stroke: rgba(255, 255, 255, 0.3); } } .contenant_hemicycle .lescroix line { stroke: rgba(0, 0, 0, 1); } } ]]> keys_groupes.indexOf(a[0]) – keys_groupes.indexOf(b[0])); // On invisibilise les nonVotants entries_votes.forEach(([key, value]) => { value.nonVotants = value.nonVotants.concat(value.nonVotantsVolontaires); delete value.nonVotantsVolontaires; }); accessible_btn = contenant2.querySelector(« .accessibility_choice img »); isAccessible = accessible_btn.classList.contains(« checked »); const isDarkMode = faitNuit(); const listeVotes = [« pours », « contres », « abstentions », « nonVotants »], // « nonVotantsVolontaires » est assimilé à « nonVotants » dicoLongsMois = [« janvier », « février », « mars », « avril », « mai », « juin », « juillet », « août », « septembre », « octobre », « novembre », « décembre »]; var largeurAssNat = contenant.node().offsetWidth, isMobile = window.innerWidth <= 800; let scraped = ceVote["scraped"]; /* on envoie la date */ var dt = ceVote.date.split("-"), tmpJour = +dt[2] === 1 ? "1er" : +dt[2]; // Date contenant.select("span.datespan").html("le " + tmpJour + " " + dicoLongsMois[+dt[1] - 1] + " " + dt[0]); // Nombre de suffrages contenant.select("span.deputesspan").html(ceVote.abstentions + ceVote.contres + ceVote.pours); // Sièges vacants const nb_vacants = Object.keys(vacantsCeVote).length; let deputesTotaux = `${577 - nb_vacants}`; if (nb_vacants === 1) deputesTotaux += ` (un siège était vacant)`; if (nb_vacants > 1) deputesTotaux += ` (${nb_vacants} sièges étaient vacants)`; contenant.select(« span.deputestotauxspan »).html(deputesTotaux); var voteClassique = ceVote.type_majorite !== « majorité des membres composant l’Assemblée nationale » && ceVote.type_majorite !== « Majorité requise pour une motion de censure »; let titreGraphe = title; if (!titreGraphe) { titreGraphe = « »; //scraped ? ceVote.titre : nettoyerEtCap(ceVote.titre); } titreGraphe += ‘ : ‘ + ceVote.sort + « »; let sousTitreGraphe; /* si c’est un vote classique, on ajoute le pourcentage */ if (voteClassique) { let prctGraphe = Math.max(ceVote.pours, ceVote.contres) / (ceVote.pours + ceVote.contres); /* EDIT : enlever le terme « texte » */ sousTitreGraphe = ` ${ceVote.sort}${fem ? « e » : « »} avec ${prctGraphe.toLocaleString(« fr-FR », { style: « percent », minimumFractionDigits: 1, maximumFractionDigits: 1, })} des suffrages`; } else { const majoriteRequise = Math.floor((579 – nb_vacants) / 2) + 1; sousTitreGraphe = `Motion ${ceVote.sort}e avec ${ceVote.pours} votes sur ${majoriteRequise} requis`; // display node sur les instructions contenant.select(« .lmui-chart__instructions »).style(« display », « none »); } contenant.select(« .lmui-chart__title »).html(titreGraphe.replace(« . : », » : »)); contenant.select(« .resultat_vote »).html(sousTitreGraphe.replace(« . : », » : »)); try { contenant.select(« .lmui-chart__title »).html(mdm_html(titreGraphe)); } catch (e) { console.error(`mdm_html inconnu`); } function make_viz(display_graph, display_hemicycle) { if (display_hemicycle) make_an_hemicycle(contenant, entries_votes, listeVotes, dicoGroupes, ceVote, nb_vacants, vacantsCeVote, all_deputes, scraped, isDarkMode, isAccessible, isMobile, largeurAssNat); if (display_graph) make_graph(contenant, entries_votes, listeVotes, dicoGroupes, ceVote, voteClassique, isDarkMode, isAccessible, isMobile, largeurAssNat); /* EDIT : changement du nom de la fonction du tooltip et du selecteur (group plutôt que rec) */ make_tooltip_steffen(`#${contenant_id} g.groupe, #${contenant_id} circle.seat`, undefined); // make_tooltip_an(`#${contenant_id} g.groupe, #${contenant_id} circle.seat`, undefined, contenant_id); } make_viz(display_graph, display_hemicycle); accessible_btn = contenant2.querySelector(« .accessibility_choice img »); accessible_btn.addEventListener(« click », (e) => { checked = e.target.classList.contains(« checked »); document.querySelectorAll(« .accessibility_choice img »).forEach(function (img) { img.classList.toggle(« checked », !checked); }); checkAccessibility(contenant_id); make_viz(display_graph, display_hemicycle); }); } /* Override de la fonction make_graph pour introduire quelques changements */ function make_graph(contenant, entries_votes, listeVotes, dicoGroupes, ceVote, voteClassique, isDarkMode, isAccessible, isMobile, largeurAssNat) { const marginAssNat = { top: 20, right: 30, bottom: 0, left: isMobile ? 100 : 205, }; /* EDIT : ajout pour éviter erreur */ display_hemicycle = false; /* EDIT : ajout d’un dictionnaire */ let label_votes_short = { pours: « Pour », abstentions: « Abstention », contres: « Contre », // nonVotantsVolontaires: « Non votants », nonVotants: « Non votants », }; contenant.select(`.contenant_graphe svg`).remove(); const ratioAssNat = isMobile ? 0.85 : 0.55, nbrTicksAssNat = isMobile ? 5 : 10, widthAssNat = largeurAssNat – marginAssNat.left – marginAssNat.right, heightHistogram = largeurAssNat * ratioAssNat – marginAssNat.top – marginAssNat.bottom; const xScale = d3 .scaleLinear() .range([0, widthAssNat]) .domain([0, d3.max(entries_votes, ([key, value]) => value.nb_deputes)]) .nice(); const yScale = d3 .scaleBand() .range([0, heightHistogram]) .paddingInner(0.2) .domain(entries_votes.map((x) => x[0]).filter((x) => x !== « vacants » && ceVote.votes[x])); const svgAssNat = contenant .select(`.contenant_graphe`) .append(« svg ») .attr(« width », « 100% ») .attr(« viewBox », `0 0 ${widthAssNat + marginAssNat.left + marginAssNat.right} ${heightHistogram + marginAssNat.top + marginAssNat.bottom}`) .append(« g ») .attr(« transform », « translate( » + marginAssNat.left + « , » + marginAssNat.top + « ) »); const axesAssNat = svgAssNat.append(« g »), barresAssNat = svgAssNat.append(« g »).attr(« class », « groupebarres »), grilleAssNat = svgAssNat.append(« g »).attr(« class », « grid »); function make_x_gridlines() { return d3.axisBottom(xScale).ticks(nbrTicksAssNat); } const groupes = barresAssNat .selectAll(« .groupe ») .data(entries_votes) .enter() .append(« g ») .attr(« class », « groupe ») .attr(« data-groupe », ([key, val]) => key) .attr(« transform », ([key, val]) => `translate(0, ${yScale(key)})`) /* EDIT : ajout du contenu du tooltip sur le group plutôt que le rect */ .attr(« data-tt-title », function ([key, val]) { const row_groupe = dicoGroupes[key]; if (!row_groupe) couleurTemp = isDarkMode ? « #FFF » : « #000 »; else couleurTemp = isDarkMode ? row_groupe.Dark : row_groupe.Light; return `${row_groupe ? row_groupe.nom_long : key}`; }) .attr(« data-tt-desc », function ([key, val]) { let html = « »; for (const j in label_votes_short) { label = label_votes_short[j]; if (val[j].length > 0) { count = j == « nonVotantsVolontaires » ? val[« nonVotantsVolontaires »].length + val[« nonVotants »].length : val[j].length; html += ` ${label} ${count} sur ${val.nb_deputes} ]]>`; } } return html; }); const previous_x = {}; for (let type_vote of listeVotes) { groupes .append(« rect ») .attr(« class », « votes_rect » + type_vote) .attr(« data-vote », type_vote) .attr(« data-groupe », ([key, val]) => key) .attr(« data-nombre », function ([key, val]) { return val[type_vote].length; }) /* EDIT : suppression du fill, remplacé par du CSS */ .attr(« stroke », function ([key, val]) { return « #000 »; }) .attr(« stroke-width », 0) .attr(« x », function ([key, val]) { return previous_x[key]; }) .attr(« width », function ([key, val]) { const depts = val[type_vote].length; if (previous_x.hasOwnProperty(key)) previous_x[key] += xScale(depts); else previous_x[key] = xScale(depts); return xScale(depts); }) .attr(« height », yScale.bandwidth()) /* EDIT : suppression du contenu du tooltip, rappatrié sur le group plutôt que le rect */ .on(« mouseover », function (e, d) { const selection = d3.select(this); selection.style(« stroke-width », 1); if (display_hemicycle) { const classe = `circle.seat.${selection.attr(« data-vote »)}[data-groupe= »${selection.attr(« data-groupe »)} »]`; d3.selectAll(classe).style(« stroke-width », 1).style(« stroke-dasharray », « none »); } }) .on(« mouseout », function (d) { const selection = d3.select(this); selection.style(« stroke-width », 0); if (display_hemicycle) { d3.selectAll(« circle.seat »).style(« stroke-width », null).style(« stroke-dasharray », null); } }); } /* l’axe des ordonnées */ axesAssNat .append(« g ») .attr(« class », « axes x passelect ») .call( d3 .axisTop(xScale) .ticks(nbrTicksAssNat) .tickSizeOuter(0) .tickFormat((d) => (d > 0 ? d : « »)) ); /* l’axe des abscisses */ axesAssNat .append(« g ») .attr(« class », « axes y passelect ») .call(d3.axisLeft(yScale).tickFormat((d) => (dicoGroupes[d] ? (isMobile ? dicoGroupes[d].nom_court : dicoGroupes[d].nom_moyen) : d))); grilleAssNat.append(« g »).attr(« class », « grid »).call(make_x_gridlines().tickSizeOuter(nbrTicksAssNat).tickSize(heightHistogram).tickFormat(« »)); /* la légende */ /* EDIT : Modification de la génération de la légende (avec plus de CSS pour les couleurs et une différenciation entre la légende groupes et hémicycle) */ let html_legende = « »; for (let type_vote of listeVotes) { const nb_votes = type_vote == « nonVotants » ? ceVote.nonVotantsVolontaires + ceVote.nonVotants : ceVote[type_vote]; if (voteClassique || type_vote === « pours » || type_vote === « nonVotants ») { html_legende += `
${label_votes_short[type_vote]} (${nb_votes ? nb_votes : « 0 »})
`; } else { console.log(type_vote); } } contenant.select(`.d_legende_hemicycle`).html(html_legende); contenant.select(`.d_legende_groupes`).html(html_legende); } { if (all_deputes[depute]) { let circo = +all_deputes[depute].circo; const is_men = all_deputes[depute].civ === « M. »; try { correction_vote = clean_votes[votes[« corrections »][depute]]; } catch (e) { correction_vote = null; } if (!correction_vote) correction_vote = null; dico_g = dicoGroupes[groupe]; if (!dico_g) console.warn(`Le groupe ${groupe} n’est pas dans le tableur`); groupe_color = dico_g ? (modeSombre ? dico_g.Dark : dico_g.Light) : « black »; output.push({ nom: all_deputes[depute].nom, prenom: all_deputes[depute].prenom, groupe: groupe, groupe_color: groupe_color, circo: `${dicoDep[all_deputes[depute].dept].nom} (${circo}${circo === 1 ? « re » : « e »})`, vote: elem, correction: correction_vote, is_men: is_men, }); } else { console.warn(`Le député ${depute} n’est pas trouvable`); } }); }); } var columns = [ { title: « Député(e) », data: « nom », visible: true, orderSequence: [« asc », « desc »], render: function (data, type, full, meta) { if (type == « display ») { h = `
${full.prenom} ${data}`; if (isMobile) h += ` ${ dicoGroupes[full.groupe][« nom_court »] } `; return h; } else { return data; } }, }, { title: « Prénom », data: « prenom », visible: false, orderSequence: [« asc », « desc »], }, { title: « Groupe », data: « groupe », visible: !isMobile, orderSequence: [« asc », « desc »], render: function (data, type, full, meta) { if (dicoGroupes[data]) { if (type == « display ») { return ` ${dicoGroupes[data][« nom_court »]}`; } else if (dicoGroupes[data]) { return dicoGroupes[data][« nom_court »]; } } else { return data; } }, }, { title: « Circonscription », data: « circo », visible: !isMobile, orderSequence: [« asc », « desc »], }, { title: « Vote », data: « vote », visible: true, orderSequence: [« asc », « desc »], width: isMobile ? « 110px » : null, render: function (data, type, full, meta) { if (type == « sort ») { val = Object.keys(clean_votes).indexOf(data); if (full.correction) val += 0.5 * Object.keys(clean_votes).indexOf(full.correction); return val; } else { return ( `${clean_votes[data]}` + (full.correction ? `
(A fait savoir qu’${full.is_men ? « il » : « elle »} aurait voulu voter ${full.correction})` : « ») ); } }, }, { title: « Correction », data: « correction », visible: false, }, { title: « is_men », data: « is_men », type: « boolean », visible: false, }, { title: « groupe_color », data: « groupe_color », visible: false, }, ]; const myTable = new DataTable(table_container, { orderClasses: false, data: output, columns: columns, scrollY: « 280px » /* EDIT : passage de 500 à 300 */, scrollX: false, scrollCollapse: true, responsive: true, searching: true, paging: false, sorting: true, order: [[0, « asc »]], language: { zeroRecords: « Aucun député ne correspond à votre recherche » /* EDIT : changement de la mention */, lengthMenu: « _MENU_ entrées affichées », info: « », search: « », infoEmpty: « », infoFiltered: « », paginate: { previous: « Précédent », next: « Suivant », }, infoEmpty: « », }, initComplete: function () { const wrapper = document.querySelector(`#table${vote_id}_wrapper`); const entete = wrapper.parentElement.querySelector(« .d_entete »); const filterInput = wrapper.querySelector(« .dt-search input »); const filterDiv = wrapper.querySelector(« .dt-search »); if (filterInput) { filterInput.setAttribute(« placeholder », « Rechercher un nom, un groupe… »); } if (filterDiv) { const searchIcon = document.createElement(« span »); searchIcon.className = « d_search_icon »; filterDiv.appendChild(searchIcon); if (entete) { entete.appendChild(filterDiv); } } }, }); } ]]>
${titre ? `
${titre}` : « »}
debut && actuel
« Sorcellerie » ou « justice » fiscale ? « Budget Frankenstein » ou recherche d’un compromis parlementaire ? « Demi-avancées » ouvéritables « victoires » ? Dans l’ambiance électrique qui plane en ce moment sur l’Assemblée nationale, il est difficile d’y voir clair sur ce qu’ont réellement voté les députés au cours de l’examen en séance publique de la partie recettes du budget 2026, entre le 24 octobre et le 3 novembre.
Si les discussions ne sont pas encore terminées, et que tout pourrait voler en éclats en cas d’échec du parcours parlementaire, ces débats permettent d’ores et déjà de situer les différents groupes politiques sur des questions aussi cruciales que la fiscalité des plus riches, les impôts des entreprises ou des ménages. Tour d’horizon des principales mesures adoptées et rejetées ces dix derniers jours.
Les impôts des plus riches :
Les impôts des entreprises :
Les impôts des particuliers :
Autres :
Les impôts des plus riches
- Taxe Zucman sur les hauts patrimoines
Il vous reste 96.2% de cet article à lire. La suite est réservée aux abonnés.










