add world opinions project
All checks were successful
Test and deploy staging / staging (push) Successful in 1m49s

World map with switchable layers (what "liberal" means, what left vs right
is about, traditional/secular and survival/self-expression values), country
cards, a shared-scale party compass, a values scatter and national
narratives of major events.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 16:24:40 +00:00
parent 499dd94cbb
commit afb1f191df
16 changed files with 2338 additions and 2 deletions

View File

@@ -0,0 +1,976 @@
// World Opinions: a hand-curated orientation guide, not a dataset of record.
// Positions are approximate and meant for comparing countries/parties relative
// to each other. Sources are listed in `sources` at the bottom of this file.
export type RegionId =
| 'north-america'
| 'western-europe'
| 'nordics'
| 'eastern-europe'
| 'east-asia'
| 'south-asia'
| 'southeast-asia'
| 'latin-america'
| 'middle-east'
| 'africa'
| 'oceania';
export const regions: Record<RegionId, string> = {
'north-america': 'North America',
'western-europe': 'Western Europe',
nordics: 'Nordics',
'eastern-europe': 'Central & Eastern Europe',
'east-asia': 'East Asia',
'south-asia': 'South Asia',
'southeast-asia': 'Southeast Asia',
'latin-america': 'Latin America',
'middle-east': 'Middle East & North Africa',
africa: 'Sub-Saharan Africa',
oceania: 'Oceania'
};
// What a local means by "liberal".
export type LiberalMeaning = 'left' | 'market' | 'western';
export const liberalMeanings: Record<LiberalMeaning, string> = {
left: 'left-leaning, progressive',
market: 'free-market, often center-right',
western: 'pro-Western opposition to nationalists'
};
// What the main political divide is mostly about.
export type Divide = 'economy' | 'culture' | 'history' | 'none';
export const divides: Record<Divide, string> = {
economy: 'economy (taxes, welfare, unions)',
culture: 'culture (religion, identity, values)',
history: 'history & geopolitics',
none: 'no open party competition'
};
export type Country = {
id: string;
/** ISO 3166-1 numeric, as used by world-atlas */
iso: string;
name: string;
region: RegionId;
/**
* Inglehart–Welzel position. x: survival (-) ↔ self-expression (+);
* y: traditional (-) ↔ secular-rational (+). Undefined = not surveyed.
*/
values?: { x: number; y: number };
liberal?: LiberalMeaning;
divide?: Divide;
/** One line shown on hover, only where the label alone would mislead. */
note?: string;
};
export const countries: Country[] = [
{
id: 'se',
iso: '752',
name: 'Sweden',
region: 'nordics',
values: { x: 2.4, y: 1.8 },
liberal: 'market',
divide: 'economy'
},
{
id: 'dk',
iso: '208',
name: 'Denmark',
region: 'nordics',
values: { x: 2.3, y: 1.2 },
liberal: 'market',
divide: 'economy',
note: '"Venstre" (literally "Left") is the liberal, center-right party'
},
{
id: 'no',
iso: '578',
name: 'Norway',
region: 'nordics',
values: { x: 2.1, y: 1.4 },
liberal: 'market',
divide: 'economy'
},
{
id: 'fi',
iso: '246',
name: 'Finland',
region: 'nordics',
values: { x: 1.6, y: 1.0 },
liberal: 'market',
divide: 'economy'
},
{
id: 'nl',
iso: '528',
name: 'Netherlands',
region: 'western-europe',
values: { x: 2.0, y: 1.1 },
liberal: 'market',
divide: 'economy',
note: 'Liberal VVD is the main center-right party'
},
{
id: 'be',
iso: '056',
name: 'Belgium',
region: 'western-europe',
values: { x: 1.4, y: 0.8 },
liberal: 'market',
divide: 'economy',
note: 'Language (Flemish vs French-speaking) splits every party family'
},
{
id: 'de',
iso: '276',
name: 'Germany',
region: 'western-europe',
values: { x: 1.3, y: 1.4 },
liberal: 'market',
divide: 'economy',
note: 'Liberal FDP = pro-market, low taxes'
},
{
id: 'at',
iso: '040',
name: 'Austria',
region: 'western-europe',
values: { x: 1.3, y: 0.6 },
liberal: 'market',
divide: 'economy'
},
{
id: 'ch',
iso: '756',
name: 'Switzerland',
region: 'western-europe',
values: { x: 1.9, y: 0.7 },
liberal: 'market',
divide: 'economy'
},
{
id: 'gb',
iso: '826',
name: 'United Kingdom',
region: 'western-europe',
values: { x: 1.8, y: 0.3 },
liberal: 'market',
divide: 'economy',
note: 'Liberal Democrats sit in the center; Brexit cut across old lines'
},
{
id: 'ie',
iso: '372',
name: 'Ireland',
region: 'western-europe',
values: { x: 1.4, y: -0.4 },
liberal: 'market',
divide: 'history',
note: 'The two big parties descend from opposite sides of the 1922 civil war'
},
{
id: 'fr',
iso: '250',
name: 'France',
region: 'western-europe',
values: { x: 1.1, y: 0.8 },
liberal: 'market',
divide: 'economy',
note: '"Libéral" means pro-market, often used as a criticism'
},
{
id: 'es',
iso: '724',
name: 'Spain',
region: 'western-europe',
values: { x: 1.3, y: 0.3 },
liberal: 'market',
divide: 'economy',
note: 'Regional nationalism (Catalonia, Basque Country) is a second axis'
},
{
id: 'pt',
iso: '620',
name: 'Portugal',
region: 'western-europe',
values: { x: 0.8, y: -0.3 },
liberal: 'market',
divide: 'economy'
},
{
id: 'it',
iso: '380',
name: 'Italy',
region: 'western-europe',
values: { x: 0.5, y: 0.0 },
liberal: 'market',
divide: 'economy'
},
{
id: 'gr',
iso: '300',
name: 'Greece',
region: 'eastern-europe',
values: { x: 0.2, y: 0.0 },
liberal: 'market',
divide: 'economy'
},
{
id: 'us',
iso: '840',
name: 'United States',
region: 'north-america',
values: { x: 1.3, y: -0.5 },
liberal: 'left',
divide: 'culture',
note: '"Liberal" = Democrat; the Democrats sit near Europe\'s center economically'
},
{
id: 'ca',
iso: '124',
name: 'Canada',
region: 'north-america',
values: { x: 1.8, y: 0.0 },
liberal: 'left',
divide: 'economy'
},
{
id: 'mx',
iso: '484',
name: 'Mexico',
region: 'latin-america',
values: { x: 0.6, y: -1.3 },
liberal: 'market',
divide: 'economy'
},
{
id: 'br',
iso: '076',
name: 'Brazil',
region: 'latin-america',
values: { x: 0.1, y: -1.0 },
liberal: 'market',
divide: 'economy',
note: 'Bolsonaro\'s party is literally called "Partido Liberal"'
},
{
id: 'ar',
iso: '032',
name: 'Argentina',
region: 'latin-america',
values: { x: 0.7, y: -0.6 },
liberal: 'market',
divide: 'economy',
note: 'President Milei calls himself a "liberal-libertarian"'
},
{
id: 'cl',
iso: '152',
name: 'Chile',
region: 'latin-america',
values: { x: 0.8, y: -0.3 },
liberal: 'market',
divide: 'economy'
},
{
id: 'co',
iso: '170',
name: 'Colombia',
region: 'latin-america',
values: { x: 0.5, y: -1.6 },
divide: 'economy'
},
{
id: 'pe',
iso: '604',
name: 'Peru',
region: 'latin-america',
values: { x: 0.3, y: -1.1 },
liberal: 'market',
divide: 'economy'
},
{
id: 've',
iso: '862',
name: 'Venezuela',
region: 'latin-america',
values: { x: 0.4, y: -1.5 },
divide: 'none'
},
{
id: 'au',
iso: '036',
name: 'Australia',
region: 'oceania',
values: { x: 2.0, y: 0.2 },
liberal: 'market',
divide: 'economy',
note: 'The Liberal Party is the main conservative party'
},
{
id: 'nz',
iso: '554',
name: 'New Zealand',
region: 'oceania',
values: { x: 2.2, y: 0.1 },
liberal: 'market',
divide: 'economy'
},
{
id: 'pl',
iso: '616',
name: 'Poland',
region: 'eastern-europe',
values: { x: 0.2, y: -0.6 },
liberal: 'western',
divide: 'culture'
},
{
id: 'cz',
iso: '203',
name: 'Czechia',
region: 'eastern-europe',
values: { x: 0.5, y: 1.2 },
liberal: 'western',
divide: 'culture'
},
{
id: 'hu',
iso: '348',
name: 'Hungary',
region: 'eastern-europe',
values: { x: -0.4, y: 0.4 },
liberal: 'western',
divide: 'culture',
note: 'Orbán calls his model "illiberal democracy"'
},
{
id: 'ro',
iso: '642',
name: 'Romania',
region: 'eastern-europe',
values: { x: -0.4, y: -0.6 },
liberal: 'western',
divide: 'culture'
},
{
id: 'rs',
iso: '688',
name: 'Serbia',
region: 'eastern-europe',
values: { x: -0.6, y: 0.1 },
liberal: 'western',
divide: 'history'
},
{
id: 'ua',
iso: '804',
name: 'Ukraine',
region: 'eastern-europe',
values: { x: -0.9, y: 0.2 },
divide: 'history',
note: 'Politics long split between pro-Western and pro-Russian orientation'
},
{
id: 'ru',
iso: '643',
name: 'Russia',
region: 'eastern-europe',
values: { x: -1.0, y: 0.6 },
liberal: 'western',
divide: 'none',
note: '"Liberal" = the pro-Western opposition, mostly in exile or prison'
},
{
id: 'kz',
iso: '398',
name: 'Kazakhstan',
region: 'eastern-europe',
values: { x: -0.6, y: 0.4 },
divide: 'none'
},
{
id: 'tr',
iso: '792',
name: 'Turkey',
region: 'middle-east',
values: { x: -0.6, y: -0.9 },
liberal: 'western',
divide: 'culture',
note: 'Main divide: religious-conservative vs secular'
},
{
id: 'ir',
iso: '364',
name: 'Iran',
region: 'middle-east',
values: { x: -0.9, y: -0.6 },
liberal: 'western',
divide: 'none'
},
{
id: 'iq',
iso: '368',
name: 'Iraq',
region: 'middle-east',
values: { x: -1.2, y: -1.3 },
divide: 'culture'
},
{
id: 'eg',
iso: '818',
name: 'Egypt',
region: 'middle-east',
values: { x: -1.5, y: -1.5 },
divide: 'none'
},
{ id: 'ma', iso: '504', name: 'Morocco', region: 'middle-east', values: { x: -1.2, y: -1.5 } },
{ id: 'sa', iso: '682', name: 'Saudi Arabia', region: 'middle-east', divide: 'none' },
{ id: 'ng', iso: '566', name: 'Nigeria', region: 'africa', values: { x: -0.3, y: -1.8 } },
{ id: 'et', iso: '231', name: 'Ethiopia', region: 'africa', values: { x: -0.9, y: -1.5 } },
{ id: 'ke', iso: '404', name: 'Kenya', region: 'africa', values: { x: -0.4, y: -1.5 } },
{
id: 'za',
iso: '710',
name: 'South Africa',
region: 'africa',
values: { x: 0.0, y: -1.2 },
divide: 'history',
note: 'Politics still shaped by apartheid and the liberation struggle'
},
{
id: 'in',
iso: '356',
name: 'India',
region: 'south-asia',
values: { x: -0.5, y: -0.5 },
divide: 'culture',
note: 'Main divide: Hindu nationalism vs secular pluralism'
},
{ id: 'pk', iso: '586', name: 'Pakistan', region: 'south-asia', values: { x: -1.0, y: -1.4 } },
{
id: 'bd',
iso: '050',
name: 'Bangladesh',
region: 'south-asia',
values: { x: -1.0, y: -1.1 },
divide: 'history'
},
{
id: 'cn',
iso: '156',
name: 'China',
region: 'east-asia',
values: { x: -0.9, y: 1.5 },
liberal: 'western',
divide: 'none',
note: '"Liberal" = pro-Western intellectuals, a label the state treats with suspicion'
},
{
id: 'jp',
iso: '392',
name: 'Japan',
region: 'east-asia',
values: { x: 0.4, y: 1.8 },
liberal: 'market',
divide: 'history',
note: 'The "Liberal Democratic Party" is the conservative party in power since 1955'
},
{
id: 'kr',
iso: '410',
name: 'South Korea',
region: 'east-asia',
values: { x: -0.3, y: 1.2 },
liberal: 'left',
divide: 'history',
note: 'Divide is mostly about North Korea, Japan and the US'
},
{
id: 'tw',
iso: '158',
name: 'Taiwan',
region: 'east-asia',
values: { x: 0.0, y: 1.3 },
divide: 'history',
note: 'Main divide: how close to be with mainland China'
},
{
id: 'vn',
iso: '704',
name: 'Vietnam',
region: 'southeast-asia',
values: { x: -0.6, y: 0.5 },
divide: 'none'
},
{
id: 'th',
iso: '764',
name: 'Thailand',
region: 'southeast-asia',
values: { x: 0.0, y: -0.4 },
divide: 'history',
note: 'Main divide: monarchy and military vs reformists'
},
{
id: 'my',
iso: '458',
name: 'Malaysia',
region: 'southeast-asia',
values: { x: -0.6, y: -0.9 },
divide: 'culture'
},
{
id: 'ph',
iso: '608',
name: 'Philippines',
region: 'southeast-asia',
values: { x: -0.2, y: -1.4 }
},
{
id: 'id',
iso: '360',
name: 'Indonesia',
region: 'southeast-asia',
values: { x: -0.8, y: -1.2 },
divide: 'culture'
}
];
export const countryById = new Map(countries.map((country) => [country.id, country]));
// ---------------------------------------------------------------------------
// Party compass: parties on one shared scale
// econ: 0 = far left (state-led, redistributive) … 10 = far right (free market)
// social: 0 = progressive/libertarian … 10 = traditional/authoritarian
// Hand-placed approximations inspired by the Chapel Hill Expert Survey and
// Manifesto Project; good for relative position, not for decimals.
// ---------------------------------------------------------------------------
export type Party = {
country: string;
short: string;
name: string;
econ: number;
social: number;
note?: string;
};
export const partyCountries = [
'us',
'nl',
'de',
'gb',
'fr',
'se',
'pl',
'jp',
'kr',
'in',
'br',
'ca'
];
export const parties: Party[] = [
{
country: 'us',
short: 'Dem',
name: 'Democratic Party',
econ: 4.8,
social: 3.5,
note: 'The US "liberals": near Europe\'s center economically'
},
{ country: 'us', short: 'GOP', name: 'Republican Party', econ: 7.8, social: 8.0 },
{ country: 'nl', short: 'GL-PvdA', name: 'GroenLinks-PvdA', econ: 2.5, social: 1.5 },
{ country: 'nl', short: 'SP', name: 'Socialistische Partij', econ: 1.5, social: 5.0 },
{ country: 'nl', short: 'D66', name: 'Democraten 66', econ: 5.5, social: 1.5 },
{ country: 'nl', short: 'CDA', name: 'Christen-Democratisch Appèl', econ: 6.0, social: 6.0 },
{
country: 'nl',
short: 'VVD',
name: 'Volkspartij voor Vrijheid en Democratie',
econ: 7.5,
social: 5.0,
note: 'Dutch "liberals": market-liberal, center-right'
},
{ country: 'nl', short: 'BBB', name: 'BoerBurgerBeweging', econ: 6.0, social: 7.5 },
{
country: 'nl',
short: 'PVV',
name: 'Partij voor de Vrijheid',
econ: 4.5,
social: 9.0,
note: 'Radical right on immigration, centrist on welfare'
},
{ country: 'de', short: 'Linke', name: 'Die Linke', econ: 1.0, social: 2.5 },
{ country: 'de', short: 'Grüne', name: 'Bündnis 90/Die Grünen', econ: 3.0, social: 1.5 },
{ country: 'de', short: 'SPD', name: 'Sozialdemokratische Partei', econ: 3.5, social: 3.5 },
{ country: 'de', short: 'BSW', name: 'Bündnis Sahra Wagenknecht', econ: 2.0, social: 7.0 },
{
country: 'de',
short: 'FDP',
name: 'Freie Demokratische Partei',
econ: 8.5,
social: 3.0,
note: 'German "liberals": socially open, strongly pro-market'
},
{ country: 'de', short: 'CDU', name: 'CDU/CSU', econ: 6.5, social: 6.0 },
{ country: 'de', short: 'AfD', name: 'Alternative für Deutschland', econ: 7.0, social: 9.5 },
{ country: 'gb', short: 'Green', name: 'Green Party', econ: 1.5, social: 1.5 },
{ country: 'gb', short: 'Lab', name: 'Labour', econ: 3.8, social: 3.5 },
{ country: 'gb', short: 'LD', name: 'Liberal Democrats', econ: 5.0, social: 2.5 },
{ country: 'gb', short: 'Con', name: 'Conservatives', econ: 7.0, social: 6.5 },
{ country: 'gb', short: 'Reform', name: 'Reform UK', econ: 7.5, social: 8.5 },
{ country: 'fr', short: 'LFI', name: 'La France Insoumise', econ: 1.0, social: 2.5 },
{ country: 'fr', short: 'PS', name: 'Parti Socialiste', econ: 3.0, social: 3.0 },
{ country: 'fr', short: 'RE', name: 'Renaissance', econ: 6.5, social: 4.0 },
{ country: 'fr', short: 'LR', name: 'Les Républicains', econ: 7.5, social: 7.0 },
{
country: 'fr',
short: 'RN',
name: 'Rassemblement National',
econ: 4.5,
social: 9.0,
note: 'Economically left of Macron: lower retirement age, protectionism'
},
{ country: 'se', short: 'V', name: 'Vänsterpartiet', econ: 1.0, social: 2.0 },
{ country: 'se', short: 'S', name: 'Socialdemokraterna', econ: 3.0, social: 3.5 },
{ country: 'se', short: 'C', name: 'Centerpartiet', econ: 7.0, social: 2.5 },
{ country: 'se', short: 'M', name: 'Moderaterna', econ: 7.5, social: 5.5 },
{ country: 'se', short: 'SD', name: 'Sverigedemokraterna', econ: 5.5, social: 9.0 },
{ country: 'pl', short: 'Lewica', name: 'Lewica', econ: 2.0, social: 2.0 },
{ country: 'pl', short: 'KO', name: 'Koalicja Obywatelska', econ: 6.5, social: 4.0 },
{
country: 'pl',
short: 'PiS',
name: 'Prawo i Sprawiedliwość',
econ: 3.5,
social: 9.0,
note: 'Culturally right, economically left (big family benefits)'
},
{ country: 'pl', short: 'Konf', name: 'Konfederacja', econ: 9.0, social: 9.0 },
{ country: 'jp', short: 'JCP', name: 'Japanese Communist Party', econ: 1.0, social: 3.0 },
{ country: 'jp', short: 'CDP', name: 'Constitutional Democratic Party', econ: 4.0, social: 3.5 },
{ country: 'jp', short: 'Komeito', name: 'Komeito', econ: 5.0, social: 5.5 },
{
country: 'jp',
short: 'LDP',
name: 'Liberal Democratic Party',
econ: 6.0,
social: 7.0,
note: 'Called "Liberal", governs as conservatives since 1955'
},
{ country: 'jp', short: 'Ishin', name: 'Nippon Ishin no Kai', econ: 7.5, social: 6.0 },
{ country: 'jp', short: 'Sansei', name: 'Sanseitō', econ: 6.0, social: 9.0 },
{ country: 'kr', short: 'Justice', name: 'Justice Party', econ: 1.5, social: 1.5 },
{
country: 'kr',
short: 'DPK',
name: 'Democratic Party of Korea',
econ: 4.0,
social: 4.5,
note: 'The "progressive" camp, cautious on social issues'
},
{ country: 'kr', short: 'PPP', name: 'People Power Party', econ: 7.0, social: 7.0 },
{ country: 'in', short: 'INC', name: 'Indian National Congress', econ: 4.5, social: 4.0 },
{
country: 'in',
short: 'BJP',
name: 'Bharatiya Janata Party',
econ: 6.0,
social: 8.5,
note: 'Hindu-nationalist, pro-business, big welfare schemes'
},
{ country: 'br', short: 'PT', name: 'Partido dos Trabalhadores', econ: 2.5, social: 4.5 },
{ country: 'br', short: 'MDB', name: 'Movimento Democrático Brasileiro', econ: 6.0, social: 6.0 },
{ country: 'br', short: 'PL', name: 'Partido Liberal', econ: 7.5, social: 9.0 },
{ country: 'ca', short: 'NDP', name: 'New Democratic Party', econ: 2.5, social: 2.5 },
{ country: 'ca', short: 'LPC', name: 'Liberal Party of Canada', econ: 4.8, social: 3.0 },
{ country: 'ca', short: 'CPC', name: 'Conservative Party of Canada', econ: 7.5, social: 7.0 }
];
// ---------------------------------------------------------------------------
// Country profiles, kept short enough to scan
// ---------------------------------------------------------------------------
export type Profile = {
id: string;
/** What "normal" politics looks like, in one line. */
center: string;
fights: string[];
timeline: { year: string; label: string }[];
blindSpots: string[];
};
export const profiles: Profile[] = [
{
id: 'us',
center: 'Individual liberty and suspicion of government, on both sides',
fights: ['abortion', 'guns', 'race', 'immigration', 'religion'],
timeline: [
{ year: '1776', label: 'revolt against a distant state' },
{ year: '1861', label: 'civil war over slavery' },
{ year: '1945', label: 'wins WWII, superpower' },
{ year: '1964', label: 'Civil Rights Act' },
{ year: '1991', label: 'wins the Cold War' }
],
blindSpots: [
'assumes its left/right is universal',
'partisan media bubbles',
'little view of other systems'
]
},
{
id: 'nl',
center: 'Coalition consensus ("polder model") around a strong welfare state',
fights: ['immigration', 'housing', 'nitrogen & farmers', 'EU'],
timeline: [
{ year: '1600s', label: 'Golden Age, trade empire' },
{ year: '1940', label: 'German occupation' },
{ year: '1949', label: 'loses Indonesia' },
{ year: '1960s', label: 'pillars break, secularization' },
{ year: '2002', label: 'Fortuyn, immigration debate' }
],
blindSpots: ['tolerance self-image vs discrimination', 'colonial past taught thinly']
},
{
id: 'de',
center: 'Social market economy, fiscal caution, "never again"',
fights: ['migration', 'energy & climate', 'East vs West', 'debt brake'],
timeline: [
{ year: '1923', label: 'hyperinflation' },
{ year: '1933', label: 'Nazi dictatorship' },
{ year: '1949', label: 'split + economic miracle' },
{ year: '1990', label: 'reunification' },
{ year: '2015', label: 'refugee crisis' }
],
blindSpots: ['debt as moral failing', 'Russian gas as "just trade"']
},
{
id: 'fr',
center: 'Strong central state, laïcité, protest as normal politics',
fights: ['pensions', 'Paris vs periphery', 'Islam & laïcité', 'EU'],
timeline: [
{ year: '1789', label: 'Revolution invents left/right' },
{ year: '1940', label: 'defeat and Vichy' },
{ year: '1962', label: 'loses Algerian war' },
{ year: '1968', label: "May '68" },
{ year: '2018', label: 'Yellow Vests' }
],
blindSpots: ['colorblind universalism hides racism', 'influence in former African colonies']
},
{
id: 'gb',
center: 'Pragmatic and market-friendly, but the NHS is sacred',
fights: ['Brexit', 'class', 'North vs South', 'Scotland'],
timeline: [
{ year: '1900', label: 'largest empire in history' },
{ year: '1940', label: '"stood alone"' },
{ year: '1948', label: 'NHS founded' },
{ year: '1979', label: 'Thatcher' },
{ year: '2016', label: 'Brexit vote' }
],
blindSpots: ['empire taught selectively', 'overrates the "special relationship"']
},
{
id: 'se',
center: 'High-trust, high-tax welfare state; very secular and individualist',
fights: ['immigration', 'gang violence', 'private welfare', 'NATO'],
timeline: [
{ year: '1814', label: 'last war fought' },
{ year: '1932', label: "Social Democrats' era" },
{ year: '1939', label: 'neutral in WWII' },
{ year: '2015', label: 'record asylum intake' },
{ year: '2024', label: 'joins NATO' }
],
blindSpots: ['consensus makes disagreement taboo', 'neutrality myth (iron to Germany)']
},
{
id: 'pl',
center: 'Pro-NATO and wary of Russia across all parties',
fights: ['Catholic vs liberal', 'abortion', 'rule of law', 'EU'],
timeline: [
{ year: '1795', label: 'erased by partition' },
{ year: '1939', label: 'invaded by Germany and USSR' },
{ year: '1980', label: 'Solidarity movement' },
{ year: '1989', label: 'communism falls' },
{ year: '2004', label: 'joins the EU' }
],
blindSpots: ['victimhood crowds out dark chapters', 'distrust of Germany']
},
{
id: 'ru',
center: 'Strong state and great-power status; opposition repressed',
fights: ['largely suppressed in public'],
timeline: [
{ year: '1812', label: 'Napoleon invades' },
{ year: '1941', label: 'Nazi invasion, ~27M dead' },
{ year: '1991', label: 'USSR collapses' },
{ year: '1990s', label: 'chaos and poverty' },
{ year: '2022', label: 'full invasion of Ukraine' }
],
blindSpots: [
'state-controlled media',
'neighbors seen as sphere of influence',
'Soviet crimes downplayed'
]
},
{
id: 'cn',
center: 'Order, growth and national rejuvenation, led by the Party',
fights: ['youth jobs', 'property crisis', 'local corruption'],
timeline: [
{ year: '1839', label: 'Opium Wars, "humiliation"' },
{ year: '1937', label: 'Japanese invasion' },
{ year: '1966', label: 'Cultural Revolution' },
{ year: '1978', label: 'reform and opening' },
{ year: '1989', label: 'Tiananmen (unspoken)' }
],
blindSpots: ['censorship shapes history', 'criticism read as new humiliation']
},
{
id: 'jp',
center: 'Stability and harmony; one party governing since 1955',
fights: ['pacifist constitution', 'aging & immigration', 'war memory'],
timeline: [
{ year: '1868', label: 'Meiji modernization' },
{ year: '1937', label: 'war in Asia' },
{ year: '1945', label: 'atomic bombs, defeat' },
{ year: '1947', label: 'pacifist constitution' },
{ year: '1990', label: 'bubble bursts' }
],
blindSpots: ['wartime atrocities taught thinly', 'sees itself as war victim']
},
{
id: 'kr',
center: 'Fierce democracy won by protest; hyper-competitive society',
fights: ['North Korea', 'Japan', 'gender', 'chaebol power'],
timeline: [
{ year: '1910', label: 'Japanese colonization' },
{ year: '1950', label: 'Korean War' },
{ year: '1980', label: 'Gwangju massacre' },
{ year: '1987', label: 'democracy' },
{ year: '2024', label: 'martial law crisis' }
],
blindSpots: ['US and Japan seen through party lens']
},
{
id: 'in',
center: 'Largest democracy; religion, caste and language drive politics',
fights: ['Hindu nationalism', 'caste quotas', 'language', 'center vs states'],
timeline: [
{ year: '1858', label: 'British Raj' },
{ year: '1947', label: 'independence and Partition' },
{ year: '1961', label: 'Non-Aligned Movement' },
{ year: '1991', label: 'economic liberalization' },
{ year: '2014', label: 'BJP majority' }
],
blindSpots: ['polarized media', 'reduced to poverty & religion by outsiders']
},
{
id: 'br',
center: 'Inequality makes redistribution central; religious society',
fights: ['Lula vs Bolsonaro', 'crime', 'Amazon vs agribusiness'],
timeline: [
{ year: '1888', label: 'last to abolish slavery' },
{ year: '1964', label: 'military coup' },
{ year: '1985', label: 'democracy returns' },
{ year: '1994', label: 'ends hyperinflation' },
{ year: '2014', label: 'Car Wash scandal' }
],
blindSpots: ['"racial democracy" myth', 'WhatsApp information bubbles']
},
{
id: 'tr',
center: 'National pride, strong state, balancing West and region',
fights: ['religious vs secular', 'Kurdish question', 'inflation'],
timeline: [
{ year: '1915', label: 'Armenian genocide (denied)' },
{ year: '1920', label: 'Sèvres, fear of partition' },
{ year: '1923', label: "Atatürk's secular republic" },
{ year: '1980', label: 'military coup' },
{ year: '2016', label: 'failed coup' }
],
blindSpots: ['genocide denial', 'restricted press', 'Western criticism read as hostility']
}
];
export const profileById = new Map(profiles.map((profile) => [profile.id, profile]));
// ---------------------------------------------------------------------------
// One event, many stories
// ---------------------------------------------------------------------------
export type Narrative = {
event: string;
years: string;
views: { country: string; story: string }[];
};
export const narratives: Narrative[] = [
{
event: 'World War II',
years: '1939–45',
views: [
{ country: 'us', story: 'D-Day: democracy beats fascism' },
{ country: 'ru', story: 'We broke Hitler, 27M dead' },
{ country: 'cn', story: 'Our war began in 1937' },
{ country: 'pl', story: 'Liberation became Soviet occupation' },
{ country: 'jp', story: 'Hiroshima: we suffered' }
]
},
{
event: 'End of the Cold War',
years: '1989–91',
views: [
{ country: 'us', story: 'We won: the end of history' },
{ country: 'pl', story: 'We freed ourselves' },
{ country: 'ru', story: 'Collapse and humiliation' },
{ country: 'cn', story: 'A warning: never lose control' }
]
},
{
event: 'Colonialism',
years: '1500s–1970s',
views: [
{ country: 'nl', story: 'Golden Age trade, now debated' },
{ country: 'gb', story: 'Empire, remembered fondly by many' },
{ country: 'in', story: 'Extraction and Partition' },
{ country: 'cn', story: 'Century of humiliation' },
{ country: 'br', story: 'Conquest, then US dominance' }
]
},
{
event: 'Iraq War',
years: '2003',
views: [
{ country: 'us', story: 'Disarmament, later a mistake' },
{ country: 'fr', story: 'We warned you' },
{ country: 'iq', story: 'Invasion, then civil war' },
{ country: 'ru', story: 'Proof the rules are selective' }
]
}
];
export const sources = [
{
name: 'World Values Survey / EVS cultural map',
href: 'https://www.worldvaluessurvey.org/WVSContents.jsp?CMSID=Findings'
},
{ name: 'Chapel Hill Expert Survey', href: 'https://www.chesdata.eu/' },
{ name: 'Manifesto Project', href: 'https://manifesto-project.wzb.eu/' },
{ name: 'Pew Research Center', href: 'https://www.pewresearch.org/global/' },
{ name: 'Natural Earth (map shapes)', href: 'https://www.naturalearthdata.com/' }
];