"""Configuration constants for the parliamentary explorer. This module contains all constant definitions used across the explorer. It is intentionally free of Streamlit and DuckDB dependencies. """ from __future__ import annotations from typing import Dict __all__ = [ "PARTY_COLOURS", "SVD_THEMES", "KNOWN_MAJOR_PARTIES", "CURRENT_PARLIAMENT_PARTIES", "_PARTY_NORMALIZE", "CANONICAL_RIGHT", "CANONICAL_LEFT", ] CANONICAL_RIGHT: frozenset[str] = frozenset( { "PVV", "FVD", "JA21", "SGP", } ) CANONICAL_LEFT: frozenset[str] = frozenset( { "SP", "PvdA", "GL", "GroenLinks", "GroenLinks-PvdA", "DENK", "PvdD", "Volt", } ) PARTY_COLOURS: Dict[str, str] = { "VVD": "#1E73BE", "PVV": "#002366", "D66": "#00A36C", "CDA": "#4CAF50", "SP": "#E53935", "PvdA": "#D32F2F", "GroenLinks": "#388E3C", "GroenLinks-PvdA": "#2E7D32", "CU": "#0288D1", "SGP": "#F4511E", "PvdD": "#43A047", "FVD": "#6A1B9A", "JA21": "#7B1FA2", "BBB": "#8D6E63", "NSC": "#FF8F00", "Nieuw Sociaal Contract": "#FF8F00", "DENK": "#00897B", "50PLUS": "#7E57C2", "Volt": "#572AB7", "ChristenUnie": "#0288D1", "Unknown": "#9E9E9E", } SVD_THEMES: dict[int, dict[str, str]] = { 1: { "label": "Rechts kabinetsbeleid versus links oppositiebeleid", "explanation": ( "Deze as scheidt het rechts kabinetsbeleid van links oppositiebeleid. " "Aan de positieve kant staan moties die passen bij het kabinetsbeleid: " "Eurofighter Typhoons, defensie-uitgaven naar 3% bbp, F-35 reservedelen, " "marine-steun aan Rode Zee en asielrestricties. " "PVV, VVD, NSC en BBB scoren sterk positief. " "Aan de negatieve kant staan moties uit de oppositie: " "zorgbuurthuizen voor ouderen, boycot van Israël, sancties, en internationale " "klimaatsamenwerking. GroenLinks-PvdA, SP, PvdD en Volt scoren negatief. " "Deze as weerspiegelt de coalitie-oppositie dynamiek." ), "positive_pole": "Kabinetsbeleid: PVV, VVD, NSC, BBB, JA21 — defensie en restricties", "negative_pole": "Oppositiebeleid: GroenLinks-PvdA, SP, PvdD, Volt, DENK — zorg en multilateraal", "flip": False, }, 2: { "label": "PVV/FVD-populisme versus mainstream-partijen", "explanation": ( "Deze as scheidt het PVV/FVD-populisme van het overige parliament. " "Alleen PVV en FVD scoren positief; alle andere partijen scoren negatief. " "Positieve moties: Syriërs terugsturen, geen geld aan Jordanië, tijdelijke " "bescherming Oekraïne beëindigen, uitstappen uit WHO en klimaatakkoorden. " "Negatieve moties: digitale toegankelijkheid Caribisch Nederland, ethiekprogramma " "Defensie, zorg voor slachtoffers bombardement Hawija, internationale klimaatsamenwerking. " "Dit is geen links-rechts verdeling maar een populistisch vs. mainstream onderscheid." ), "positive_pole": "PVV en FVD — soevereiniteit en anti-establishment", "negative_pole": "Overige partijen: VVD, CDA, SGP, ChristenUnie, GroenLinks-PvdA, D66, Volt, BBB", "flip": False, }, 3: { "label": "Verzorgingsstaat versus bezuinigingen en marktwerking", "explanation": ( "Deze as weerspiegelt de spanning tussen staatsingrijpen en marktliberalisme, " "aangescherpt door de kabinetscrisis van 2025. Aan de positieve kant staan moties " "die bezuinigingen op zorg en het gemeentefonds willen terugdraaien, winstuitkeringen " "in de zorg verbieden en publieke controle over ziekenhuisfusies eisen. SP, PvdD, " "GroenLinks-PvdA stemmen hier gelijk — ondanks hun tegengestelde PC1-posities. " "Aan de negatieve kant staan moties " "over marktwerking in de zorg, fiscale bedrijfsopvolgingsfaciliteiten (VVD), " "doorgaan met besturen ondanks de kabinetscrisis (VVD/BBB) en defensie-" "uitgaven van 3,5% bbp." ), "positive_pole": "Pro-verzorgingsstaat: SP, PvdD, GroenLinks-PvdA (anti-bezuinigingen)", "negative_pole": "Marktliberaal en fiscaal conservatief: VVD, D66, CDA, SGP, BBB", "flip": True, }, 4: { "label": "Mainstreampartijen versus FVD/DENK-oppositie", "explanation": ( "Deze as scheidt het mainstream parliament van FVD en DENK. " "Aan de positieve kant stemmen vrijwel alle partijen voor dezelfde moties: " "openbare toiletten, vaderbetrokkenheid bij opvoeding, internationale " "samenwerking met Australië en Canada, en long covid-expertise. " "D66, CDA, VVD, PVV, GL-PvdA, SP, Volt en 50PLUS stemmen allemaal samen. " "Aan de negatieve kant stemmen alleen FVD en DENK voor — zij nemen " "regelmatig gepolariseerde posities die afwijken van het mainstream." ), "positive_pole": "Mainstreampartijen: D66, CDA, VVD, PVV, GL-PvdA, SP, Volt, 50PLUS — breedgedragen moties", "negative_pole": "FVD en DENK: oppositieposities buiten de mainstream", "flip": True, }, 5: { "label": "Christelijk-sociaal en gemeenschapswaarden versus progressieve individuele rechten", "explanation": ( "Deze as scheidt christelijk-sociale partijen van progressieve partijen op het " "vlak van gemeenschapswaarden. Aan de positieve kant staan moties over " "schuldhulpverlening via vrijwilligersorganisaties, maatschappelijke " "diensttijd voor jongeren, gastouderopvang en financiële prikkels voor scholieren. " "ChristenUnie, SGP, CDA en NSC voeren hier de toon; ook D66 en FVD scoren positief. " "Aan de negatieve kant staan moties over wettelijke erkenning van meerouderschap, " "abortusrecht in het EU-Handvest, armoedebeleid en sociaal-maatschappelijke thema's. " "SP, VVD, GL-PvdA, PvdD en Volt scoren negatief." ), "positive_pole": "Christelijk-sociaal: ChristenUnie, SGP, CDA, NSC — gemeenschap en vrijwilligers", "negative_pole": "Progressief-individueel: SP, VVD, GL-PvdA, PvdD, Volt — individuele rechten", "flip": False, }, 6: { "label": "Migratie en cultuur versus klimaat en progressieve inclusie", "explanation": ( "Deze as combineert migratie- en culturele posities. Aan de positieve kant staan " "moties over asielrestricties, nationale cultuur en identiteit, en beperkte " "immigratie. PVV, JA21, BBB, CDA, ChristenUnie, VVD, SGP, FVD en DENK scoren positief. " "Aan de negatieve kant staan moties over klimaatmaatregelen, progressieve " "inclusie, discriminatiebestrijding en internationale samenwerking. " "SP, PvdD, D66, GL-PvdA en Volt scoren negatief. " "De as scheidt partijen met restrictief migratiebeleid van partijen met " "progressief-inclusief beleid." ), "positive_pole": "Restrictief migratiebeleid: PVV, JA21, BBB, CDA, ChristenUnie, VVD, SGP, FVD, DENK", "negative_pole": "Progressieve inclusie: SP, PvdD, D66, GL-PvdA, Volt — klimaat en diversiteit", "flip": False, }, 7: { "label": "Bestuurlijk pragmatisme en implementatie (indicatief)", "explanation": ( "Een residuele as die overwegend beleidsdossiers uit 2024 (vorige parlementaire " "periode) omvat. De scores zijn smal (max ~11 punten) en de partijcombinaties " "ideologisch divers — dit label is indicatief. Aan de positieve kant staan " "pragmatische bestuursmoties: een compleet kostenoverzicht van producten van eigen " "bodem, papieren schoolboeken voor basisvaardigheden, een invoeringstoets voor het " "minimumloon en de A2-snelwegplanning. ChristenUnie, Volt, DENK en SP scoren " "positief. Aan de negatieve kant staan meer ideologisch geladen moties: een " "landelijk stookverbod (PvdD), het strafbaar stellen van verbranding van religieuze " "geschriften (DENK), chroom-6 schadevergoedingen en tegenhouden van nieuwe " "gaswinning. GroenLinks-PvdA, VVD, FVD en JA21 scoren negatief." ), "positive_pole": "Praktisch-bestuurlijk: ChristenUnie, Volt, SGP, DENK, SP", "negative_pole": "Ideologisch-principieel: GroenLinks-PvdA, VVD, FVD, JA21", "flip": True, }, 8: { "label": "Vaccinatiebeleid, onderwijs en regionale huisvesting (indicatief)", "explanation": ( "Een residuele as die overwegend thematisch diverse moties uit 2024-2025 vangt. " "Aan de positieve kant staan moties over vaccinatiegraad-verlaging voor kinderen, " "een VWO-profiel kunst en cultuur, stages voor mbo-studenten in het buitenland, " "en woningbouw voor jongeren in kleine kernen. BBB, SGP en JA21 scoren positief. " "Aan de negatieve kant staan moties over het instellen van een vaccinatiecommissie, " "heropening van het coronaoversterfte-onderzoek, regionale energiestrategieën " "en toegankelijkheid van het basispakket. SP, DENK en PvdD scoren sterk negatief. " "Deze as combineert onderwijs- en volksgezondheidsposities met regionale " "huisvestingsprioriteiten — het label is indicatief." ), "positive_pole": "Onderwijs en volksgezondheid: BBB, SGP, JA21 — vaccinatie, profielkeuze, woningbouw", "negative_pole": "Zorg en toegankelijkheid: SP, DENK, PvdD, Volt — coronaonderzoek, energie, basispakket", "flip": False, }, 9: { "label": "Pragmatische probleemoplossing versus systeemhervorming (indicatief)", "explanation": ( "Deze as scheidt pragmatische, concrete probleemoplossing van idealistische " "systeemhervorming. Aan de positieve kant staan moties over naleving van de " "Financiële-verhoudingswet voor gemeenten, beperking van arbeidsmigratie, " "een nieuwe tandartsopleiding in Rotterdam, een actieplan tegen misbruik van " "hallucinerende geneesmiddelen en oplossingen voor milieuproblemen op Bonaire. " "SGP en ChristenUnie scoren sterk positief; ook DENK en SP. Aan de negatieve kant " "staan moties over een moratorium op geitenstallen, een verbod op gokadvertenties, " "verduidelijking van gronden voor voorlopige hechtenis, een leegstandbelasting " "en end-to-end-encryptie. D66, JA21 en PVV scoren negatief. " "Deze as is indicatief — de scores zijn smal en ideologisch divers." ), "positive_pole": "Pragmatisch-bestuurlijk: SGP, ChristenUnie, DENK, SP — concrete oplossingen", "negative_pole": "Systeemhervorming: D66, JA21, PVV — idealistische beleidsposities", "flip": True, }, 10: { "label": "Kritisch op overheidsbemoeienis versus pro-regulering (indicatief)", "explanation": ( "Deze as scheidt partijen die kritisch staan tegenover overheidsbemoeienis van " "partijen die strikte regulering en handhaving steunen. Aan de positieve kant " "staan moties over minder tijdsintensieve schoolinspecties, het recht van " "toeslagenouders op hun persoonlijk dossier, behoud van tegemoetkomingen voor " "arbeidsongeschikten en verlaging van de leeftijdsdrempel voor kindgesprekken. " "DENK, SP en PvdD scoren positief. Aan de negatieve kant staan moties over " "een aangifteplicht voor scholen bij veiligheidsincidenten, een rookverbod in " "auto's met kinderen, braakliggende landbouwgrond en verhoogd beloningsgeld " "voor tipgevers. GroenLinks-PvdA scoort opvallend sterk negatief. " "Deze as is indicatief — de scores zijn smal en de partijcombinaties divers." ), "positive_pole": "Kritisch op overheidsbemoeienis: DENK, SP, PvdD — minder inspectielast en lastenverlichting", "negative_pole": "Pro-regulering: GroenLinks-PvdA, CDA, SGP — veiligheid, naleving en handhaving", "flip": True, }, } KNOWN_MAJOR_PARTIES = [ "VVD", "PVV", "D66", "GroenLinks-PvdA", "GroenLinks", "PvdA", "CDA", "SP", "NSC", "CU", "BBB", ] CURRENT_PARLIAMENT_PARTIES: frozenset[str] = frozenset( { "PVV", "VVD", "NSC", "BBB", "D66", "GroenLinks-PvdA", "CDA", "SP", "ChristenUnie", "SGP", "Volt", "DENK", "PvdD", "JA21", "FVD", } ) _PARTY_NORMALIZE: dict[str, str] = { "Nieuw Sociaal Contract": "NSC", "CU": "ChristenUnie", "GL": "GroenLinks-PvdA", "GroenLinks": "GroenLinks-PvdA", "PvdA": "GroenLinks-PvdA", "Gündoğan": "Volt", "Lid Keijzer": "BBB", "Groep Markuszower": "PVV", }