"""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": "Fiscaal-economisch beleid versus sociaal welzijn en internationale rechten", "explanation": ( "Deze as scheidt fiscaal-economisch beleid van sociaal welzijn en internationale solidariteit. " "Aan de positieve kant staan moties over dijkvervanging, medische bijscholing, gaswinning op land, " "landbouwsubsidies en fiscale verlichting. " "Aan de negatieve kant staan moties over huurprijsbeheersing, boycot van defensiebedrijven, " "beëindiging van militaire verdragen, antipersoneelslandmijnen en zorgbuurthuizen. " "Deze as weerspiegelt de spanning tussen financieel-economische prioriteiten en sociaal-internationaal beleid." ), "positive_pole": "Fiscaal-economisch: dijkvervanging, landbouwsubsidies, gaswinning, fiscale verlichting", "negative_pole": "Sociaal welzijn en internationale rechten: huurbeheersing, defensieboycot, zorg, landmijnverbod", "flip": False, }, 2: { "label": "Nationalistische versus multilateralistische oriëntatie", "explanation": ( "Deze as meet een onafhankelijke culturele dimensie: nationalistisch-populistisch " "tegenover kosmopolitisch-mainstream. Aan de positieve kant staan PVV en FVD. " "Aan de negatieve kant staan Volt, GroenLinks-PvdA, DENK en SP. " "Deze as is onafhankelijk van links-rechts (as 1) en scheidt partijen " "op hun houding tegenover nationale identiteit, EU-samenwerking en de " "etnisch-culturele dimensie." ), "positive_pole": "Nationalistisch/populistisch — PVV, FVD: nationale identiteit en soevereiniteit", "negative_pole": "Kosmopolitisch/mainstream — Volt, GL-PvdA, DENK, SP: EU en internationale samenwerking", "flip": False, }, 3: { "label": "Verzorgingsstaat versus defensie en nationale veiligheid", "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": "Actieve internationale betrokkenheid versus terughoudendheid", "explanation": ( "Deze as scheidt actieve internationale betrokkenheid van terughoudendheid of terugtrekking. " "Aan de positieve kant staan moties over bilaterale en Europese samenwerking: partnerschappen met Australië, " "actieve vaderbetrokkenheid, kennisuitwisseling en coördinatie via internationale gremia. " "Aan de negatieve kant staan moties over verlaten van de WHO, beperking van migratiesaldo, " "gezinsbeleid en asielrestricties. " "Deze as is indicatief — de spreiding van partijen is breed." ), "positive_pole": "Actieve internationale betrokkenheid: bilaterale samenwerking, kennisuitwisseling, multilaterale coördinatie", "negative_pole": "Terughoudendheid en restricties: WHO-verlating, migratielimieten, binnenlands gericht beleid", "flip": False, }, 5: { "label": "Pragmatische financiële ondersteuning versus progressieve individuele rechten", "explanation": ( "Deze as scheidt pragmatische financiële en structurele ondersteuning van progressieve individuele rechten. " "Aan de positieve kant staan moties over een vrijgesteld minimumbudget voor infrastructurele werken, " "maatschappelijke diensttijd voor kwetsbare jongeren, verkorting van de WW alleen met concrete " "ondersteuningsmaatregelen, en vrijwaring van kindertoeslagen. " "Aan de negatieve kant staan moties over erkenning van meerouderschap, " "wettelijke kwaliteitseisen aan zwemlessen, een nationaal coördinator tegen buitenlandse beïnvloeding, " "en vastlegging van abortusrecht in het EU-Handvest. " "Deze as weerspiegelt de spanning tussen financiële prikkels en individuele rechtenbescherming." ), "positive_pole": "Pragmatische financiële ondersteuning: budgetvrijwaring, diensttijd, WW-hervorming, kindertoeslagen", "negative_pole": "Progressieve individuele rechten: meerouderschap, abortusrecht, zwemveiligheid, buitenlandse beïnvloeding", "flip": False, }, 6: { "label": "Fossiele brandstoffen en financiële prikkels versus klimaatbeleid en internationale rechten", "explanation": ( "Deze as scheidt fossiele brandstoffen en financiële marktprikkels van klimaatbeleid en internationale rechten. " "Aan de positieve kant staan moties over lng-capaciteit als alternatief voor gaswinning, " "kernenergie als volwaardig onderdeel van energiebeleid, vermogenswinstbelasting en beperkte " "overheidsuitgaven. " "Aan de negatieve kant staan moties over het uitsluiten van de fossiele industrie van klimaatconferenties, " "veroordeling van aanvallen op Libanon, sancties tegen internationale conflicten, " "en structureel overleg met moslimgemeenschappen. " "Deze as weerspiegelt de spanning tussen economisch-fiscale prioriteiten en klimaat/internationale solidariteit." ), "positive_pole": "Fossiel en financieel: lng-capaciteit, kernenergie, vermogenswinstbelasting, bezuinigingen", "negative_pole": "Klimaat en internationale rechten: fossiele industrie uitsluiten, sancties, Libanon, gemeenschappen", "flip": False, }, 7: { "label": "Praktisch-bestuurlijk versus idealistisch-proceduraal", "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": "Europese defensiesamenwerking versus binnenlands sociaaleconomisch beleid", "explanation": ( "Deze as scheidt Europese defensiesamenwerking van binnenlands sociaaleconomisch beleid. " "Aan de positieve kant staan moties over militaire mobiliteit in EU- en NAVO-verband, " "een Europees onderzoeksinstituut voor defensie, en concrete stappen voor 35% defensie-uitgaven. " "Aan de negatieve kant staan moties over toeslagenaffaire-herstel, ontslagrecht, " "coronastrategie en bestuurlijke instructieregels. " "Deze as is indicatief — de spreiding van partijen is breed en de thematische diversiteit is groot." ), "positive_pole": "Europese defensiesamenwerking: NAVO-militaire mobiliteit, Europees defensie-instituut, defensie-uitgaven", "negative_pole": "Binnenlands beleid: toeslagen, ontslagrecht, coronastrategie, administratieve lasten", "flip": False, }, 9: { "label": "Concreet-bestuurlijke versus systemische hervorming", "explanation": ( "Deze as scheidt concreet-bestuurlijke oplossingen van systemische hervorming. " "Aan de positieve kant staan moties over naleving van financiële verhoudingswetten voor gemeenten, " "beperking van arbeidsmigratie, een nieuwe tandartsopleiding in Rotterdam, " "en oplossingen voor milieuproblemen op Bonaire. " "Aan de negatieve kant staan moties over een moratorium op geitenstallen, " "een verbod op gokadvertenties, gronden voor voorlopige hechtenis, " "een leegstandbelasting en end-to-end-encryptie. " "Deze as is indicatief — de scores zijn smal en ideologisch divers." ), "positive_pole": "Concreet-bestuurlijk: financiële verhoudingswet, arbeidsmigratie, tandartsopleiding, Bonaire", "negative_pole": "Systemische hervorming: geitenstallen-moratorium, gokverbod, leegstandbelasting, encryptie", "flip": False, }, 10: { "label": "Bescherming van burgers versus overheidsregulering", "explanation": ( "Deze as scheidt bescherming van burgers van overheidsregulering en handhaving. " "Aan de positieve kant staan moties over minder tijdsintensieve schoolinspecties, " "het recht van toeslagenouders op hun persoonlijk dossier, behoud van tegemoetkomingen " "voor arbeidsongeschikten, integratie die geldt voor nieuwkomers (niet voor Nederlanders), " "en verlaging van de leeftijdsdrempel voor kindgesprekken. " "Aan de negatieve kant staan moties over een aangifteplicht voor scholen bij " "veiligheidsincidenten, rookverboden in auto's met kinderen, " "braakliggende landbouwgrond en verhoogd beloningsgeld voor tipgevers. " "Deze as is indicatief — de scores zijn smal en de partijcombinaties divers." ), "positive_pole": "Bescherming van burgers: minder inspecties, toegang tot dossiers, behoud toeslagen, kindleeftijd", "negative_pole": "Overheidsregulering: aangifteplicht scholen, rookverbod, braakliggende grond, tipgeversbeloning", "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", }