<!DOCTYPE html>
<html lang="sv">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Propagandaanalys.org — AI-driven mediekritik &amp; källkunskap</title>

<!-- Rank Math SEO Structure -->
<meta name="description" content="AI-driven analys av propagandatekniker i svenska medier. Baserad på Chomsky &amp; Hermans propagandamodell. Analysera SVT, SR, TV4 med artificiell intelligens.">
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<link rel="canonical" href="https://propagandaanalys.org/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">

<!-- Open Graph -->
<meta property="og:locale" content="sv_SE">
<meta property="og:type" content="website">
<meta property="og:title" content="Propagandaanalys.org — AI-driven mediekritik">
<meta property="og:description" content="Analysera propagandatekniker i svenska nyheter med AI. Baserad på akademisk forskning och Chomskys propagandamodell.">
<meta property="og:url" content="https://propagandaanalys.org/">
<meta property="og:site_name" content="Propagandaanalys.org">
<meta property="og:image" content="https://propagandaanalys.org/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:type" content="image/png">

<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Propagandaanalys.org — AI-driven mediekritik">
<meta name="twitter:description" content="Analysera propagandatekniker i svenska nyheter med AI.">
<meta name="twitter:image" content="https://propagandaanalys.org/og-image.png">
<meta name="twitter:image:alt" content="Propagandaanalys.org — AI-driven mediekritik och källanalys">

<!-- Schema.org JSON-LD for Rank Math -->
<script nonce="6E8PAgJcxjWbEaZOLn7bQA" type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "WebSite",
      "name": "Propagandaanalys.org",
      "url": "https://propagandaanalys.org/",
      "description": "AI-driven analys av propagandatekniker i svenska medier",
      "potentialAction": {
        "@type": "SearchAction",
        "target": "https://propagandaanalys.org/?s={search_term_string}",
        "query-input": "required name=search_term_string"
      }
    },
    {
      "@type": "Organization",
      "name": "Propagandaanalys.org",
      "url": "https://propagandaanalys.org/",
      "sameAs": []
    },
    {
      "@type": "WebPage",
      "@id": "https://propagandaanalys.org/#webpage",
      "url": "https://propagandaanalys.org/",
      "name": "Propagandaanalys — AI-driven mediekritik & källkunskap",
      "isPartOf": {"@id": "https://propagandaanalys.org/#website"},
      "description": "Analysera propagandatekniker i svenska nyheter med hjälp av AI. Baserad på Chomsky & Hermans propagandamodell.",
      "breadcrumb": {"@id": "https://propagandaanalys.org/#breadcrumb"}
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://propagandaanalys.org/#breadcrumb",
      "itemListElement": [
        {"@type": "ListItem", "position": 1, "name": "Hem", "item": "https://propagandaanalys.org/"}
      ]
    }
  ]
}
</script>

<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">

<style>
/* ═══════════════════════════════════════════════════════════════
   PROPAGANDAANALYS.COM — Cloudflare Pages
   Color palette: domstol.se (Svea hovrätt)
   ═══════════════════════════════════════════════════════════════ */

:root {
  /* domstol.se primary palette */
  --primary: #1c1f66;          /* Deep navy — nav, buttons, headings */
  --primary-dark: #15174d;     /* Darker navy — top bar, footer */
  --primary-light: #2a2d8a;   /* Lighter navy — hover states */
  --accent: #00c0be;           /* Teal/turquoise — highlights, CTAs */
  --accent-warm: #c0392b;      /* Red — propaganda score, warnings */
  --accent-amber: #d4891a;     /* Amber — secondary highlights */

  /* Surfaces */
  --bg: #ffffff;
  --bg-light: #f5f5f5;
  --bg-warm: #faf9f5;
  --bg-blue: #f0f2fa;
  --surface: #e0e0e0;

  /* Text */
  --ink: #1a1a1a;
  --ink-muted: #555555;
  --ink-light: #888888;
  --ink-on-dark: #ffffff;
  --ink-on-dark-muted: rgba(255,255,255,0.7);

  /* Typography */
  --font-body: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --font-serif: 'Playfair Display', Georgia, serif;
  --font-mono: 'IBM Plex Mono', 'Courier New', monospace;

  /* Layout */
  --max-w: 1140px;
  --radius: 4px;
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

body {
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 16px;
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
}

a { color: var(--primary); text-decoration: underline; }
a:hover { color: var(--primary-light); }

img { max-width: 100%; height: auto; }

/* ── TOP BAR ───────────────────────────────────────────────── */
.pa-topbar {
  background: var(--primary-dark);
  color: var(--ink-on-dark);
  font-size: 13px;
  padding: 8px 0;
}
.pa-topbar-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 24px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.pa-topbar a {
  color: var(--ink-on-dark);
  text-decoration: none;
  font-size: 13px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.pa-topbar a:hover { text-decoration: underline; }
.pa-topbar-right {
  display: flex;
  gap: 20px;
  align-items: center;
}

/* ── HEADER ────────────────────────────────────────────────── */
.pa-header {
  background: var(--bg);
  border-bottom: 1px solid var(--surface);
  padding: 20px 0;
}
.pa-header-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 24px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.pa-logo {
  display: flex;
  align-items: center;
  gap: 14px;
  text-decoration: none;
  color: var(--ink);
}
.pa-logo-icon {
  width: 48px;
  height: 48px;
  background: var(--primary);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
  color: white;
  font-weight: 700;
  font-family: var(--font-serif);
}
.pa-logo-text {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 20px;
  letter-spacing: -0.3px;
  color: var(--primary);
  line-height: 1.2;
}
.pa-logo-sub {
  font-size: 11px;
  font-weight: 400;
  color: var(--ink-muted);
  letter-spacing: 0.3px;
  text-transform: uppercase;
}

/* Search */
.pa-search {
  display: flex;
  align-items: center;
  border: 1px solid var(--surface);
  border-radius: var(--radius);
  overflow: hidden;
}
.pa-search input {
  border: none;
  padding: 10px 16px;
  font-size: 14px;
  font-family: var(--font-body);
  width: 280px;
  outline: none;
  background: var(--bg);
  color: var(--ink);
}
.pa-search input::placeholder { color: var(--ink-light); }
.pa-search button {
  background: var(--primary);
  color: white;
  border: none;
  padding: 10px 20px;
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.2s;
}
.pa-search button:hover { background: var(--primary-light); }

/* ── NAVIGATION (domstol.se style) ─────────────────────────── */
.pa-nav {
  background: var(--bg);
  border-bottom: 1px solid var(--surface);
  position: sticky;
  top: 0;
  z-index: 100;
}
.pa-nav-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 24px;
  display: flex;
  gap: 0;
  flex-wrap: wrap;
}
.pa-nav a {
  display: inline-block;
  padding: 14px 18px;
  font-size: 14px;
  font-weight: 500;
  color: var(--primary);
  text-decoration: none;
  border-radius: var(--radius);
  transition: all 0.15s ease;
  white-space: nowrap;
}
.pa-nav a:hover,
.pa-nav a.active {
  background: var(--primary);
  color: var(--ink-on-dark);
}
.pa-nav a:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: -2px;
}

/* Mobile menu toggle */
.pa-menu-toggle {
  display: none;
  background: var(--primary);
  color: white;
  border: none;
  padding: 10px 16px;
  font-size: 14px;
  font-family: var(--font-body);
  font-weight: 600;
  cursor: pointer;
  border-radius: var(--radius);
  margin: 10px 24px;
}

/* ── HERO ──────────────────────────────────────────────────── */
.pa-hero {
  background: var(--primary);
  color: var(--ink-on-dark);
  padding: 80px 24px 70px;
  position: relative;
  overflow: hidden;
}
.pa-hero::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 4px;
  background: linear-gradient(90deg, var(--accent), var(--accent-warm), var(--accent-amber), var(--accent));
}
.pa-hero-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  position: relative;
  z-index: 1;
}
.pa-hero-tag {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 20px;
  display: block;
}
.pa-hero h1 {
  font-family: var(--font-serif);
  font-size: clamp(36px, 6vw, 72px);
  font-weight: 900;
  line-height: 1.05;
  margin-bottom: 24px;
}
.pa-hero h1 em {
  font-style: italic;
  color: var(--accent);
}
.pa-hero-desc {
  font-size: 18px;
  color: var(--ink-on-dark-muted);
  max-width: 660px;
  line-height: 1.7;
  font-weight: 300;
}
.pa-hero-disclaimer {
  background: rgba(192,57,43,0.15);
  border-left: 3px solid var(--accent-warm);
  padding: 16px 24px;
  margin-top: 32px;
  font-size: 13px;
  color: rgba(255,255,255,0.6);
  max-width: 700px;
  font-style: italic;
}

/* ── QUICK LINKS PANEL (domstol.se style) ──────────────────── */
.pa-quicklinks {
  background: var(--primary);
  padding: 32px 40px;
  max-width: 600px;
  margin: -30px 0 0 auto;
  position: relative;
  z-index: 2;
}
.pa-quicklinks h3 {
  color: white;
  font-family: var(--font-body);
  font-size: 18px;
  font-weight: 700;
  margin-bottom: 16px;
}
.pa-quicklinks-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 24px;
}
.pa-quicklinks a {
  color: white;
  text-decoration: underline;
  font-size: 14px;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 0;
}
.pa-quicklinks a::before {
  content: '>';
  color: var(--accent);
  font-weight: 700;
}
.pa-quicklinks a:hover {
  color: var(--accent);
}

/* ── CONTENT SECTIONS ──────────────────────────────────────── */
.pa-section {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 64px 24px;
}
.pa-section-label {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--accent-warm);
  margin-bottom: 12px;
  display: block;
}
.pa-section h2 {
  font-family: var(--font-serif);
  font-size: clamp(28px, 4vw, 44px);
  font-weight: 900;
  line-height: 1.2;
  margin-bottom: 24px;
  color: var(--primary);
}
.pa-section p {
  font-size: 16px;
  color: var(--ink);
  margin-bottom: 16px;
  line-height: 1.8;
}

/* 2-column intro */
.pa-intro-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
  align-items: start;
}

/* Book reference cards */
.pa-book-ref {
  background: var(--bg-blue);
  border: 1px solid #d0d4e8;
  border-left: 4px solid var(--primary);
  padding: 24px;
  margin-bottom: 16px;
}
.pa-book-title {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 18px;
  font-weight: 700;
  color: var(--primary);
  display: block;
  margin-bottom: 6px;
}
.pa-book-author {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--ink-muted);
  display: block;
  margin-bottom: 10px;
}
.pa-book-ref p { font-size: 14px; color: var(--ink-muted); margin-bottom: 0; }

/* ── TECHNIQUE FILTER BUTTONS ──────────────────────────────── */
.pa-filters {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 32px;
}
.pa-filter-btn {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 2px;
  text-transform: uppercase;
  padding: 8px 18px;
  border: 1px solid var(--surface);
  background: transparent;
  color: var(--ink-muted);
  cursor: pointer;
  border-radius: var(--radius);
  transition: all 0.2s;
}
.pa-filter-btn:hover,
.pa-filter-btn.active {
  background: var(--primary);
  color: white;
  border-color: var(--primary);
}

/* ── TECHNIQUE CARDS ───────────────────────────────────────── */
.pa-cards-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2px;
}
.pa-card {
  background: white;
  border: 1px solid #e4e4e4;
  overflow: hidden;
  transition: transform 0.2s, box-shadow 0.2s;
}
.pa-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 32px rgba(28,31,102,0.08);
}
.pa-card.full { grid-column: 1 / -1; }

.pa-card-header {
  padding: 28px 32px 20px;
  border-bottom: 1px solid #eee;
  display: flex;
  align-items: flex-start;
  gap: 20px;
}
.pa-card-num {
  font-family: var(--font-serif);
  font-size: 48px;
  font-weight: 900;
  color: #ddd;
  line-height: 1;
  min-width: 52px;
}
.pa-card-tag {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 3px;
  text-transform: uppercase;
  padding: 3px 10px;
  margin-bottom: 8px;
  display: inline-block;
  border-radius: 2px;
}
.tag-manipulation { background: rgba(192,57,43,0.1); color: var(--accent-warm); }
.tag-framing { background: rgba(28,31,102,0.08); color: var(--primary); }
.tag-omission { background: rgba(212,137,26,0.1); color: var(--accent-amber); }
.tag-bias { background: rgba(80,60,20,0.08); color: #5a3e10; }

.pa-card-title {
  font-family: var(--font-serif);
  font-size: 22px;
  font-weight: 700;
  line-height: 1.2;
  color: var(--ink);
}
.pa-card-body {
  padding: 24px 32px;
}
.pa-card-body p {
  font-size: 15px;
  color: #3a3a3a;
  margin-bottom: 20px;
  line-height: 1.8;
}

/* Example boxes */
.pa-example {
  background: var(--bg-light);
  border-left: 3px solid var(--primary);
  padding: 20px 24px;
  margin-bottom: 16px;
}
.pa-example.red { border-left-color: var(--accent-warm); background: #fdf5f5; }
.pa-example.amber { border-left-color: var(--accent-amber); background: #fdf8f0; }
.pa-example.teal { border-left-color: var(--accent); background: #f0fafa; }

.pa-example-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: 8px;
  display: block;
}
.pa-example-text {
  font-size: 14px;
  line-height: 1.8;
  color: #2a2a2a;
}
.pa-source-link {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--primary);
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 10px;
  border-bottom: 1px solid transparent;
  transition: border-color 0.2s;
}
.pa-source-link:hover { border-bottom-color: var(--primary); }

/* ── CHOMSKY MODEL (dark section) ──────────────────────────── */
.pa-model {
  background: var(--primary-dark);
  color: var(--ink-on-dark);
  padding: 80px 24px;
}
.pa-model-inner {
  max-width: var(--max-w);
  margin: 0 auto;
}
.pa-model h2 {
  font-family: var(--font-serif);
  font-size: clamp(28px, 4vw, 48px);
  font-weight: 900;
  margin-bottom: 48px;
  line-height: 1.15;
  color: white;
}
.pa-filters-grid {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 2px;
}
.pa-filter-card {
  background: rgba(255,255,255,0.04);
  border: 1px solid rgba(255,255,255,0.08);
  padding: 28px 24px;
  transition: background 0.2s;
}
.pa-filter-card:hover { background: rgba(255,255,255,0.07); }
.pa-filter-num {
  font-family: var(--font-serif);
  font-size: 36px;
  font-weight: 900;
  color: var(--accent);
  margin-bottom: 12px;
}
.pa-filter-name {
  font-family: var(--font-serif);
  font-size: 17px;
  font-weight: 700;
  color: white;
  margin-bottom: 10px;
  line-height: 1.3;
}
.pa-filter-desc {
  font-size: 13px;
  color: rgba(255,255,255,0.5);
  line-height: 1.6;
}

/* ── TIMELINE ──────────────────────────────────────────────── */
.pa-timeline {
  position: relative;
  padding-left: 32px;
}
.pa-timeline::before {
  content: '';
  position: absolute;
  left: 7px;
  top: 8px;
  bottom: 8px;
  width: 2px;
  background: linear-gradient(to bottom, var(--primary), var(--accent), var(--accent-amber));
}
.pa-t-item {
  position: relative;
  margin-bottom: 32px;
  padding-left: 24px;
}
.pa-t-item::before {
  content: '';
  position: absolute;
  left: -25px;
  top: 8px;
  width: 10px;
  height: 10px;
  background: var(--primary);
  border-radius: 50%;
  border: 2px solid var(--bg);
}
.pa-t-date {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 2px;
  color: var(--primary);
  margin-bottom: 4px;
}
.pa-t-title {
  font-family: var(--font-serif);
  font-size: 18px;
  font-weight: 700;
  margin-bottom: 8px;
  color: var(--ink);
}
.pa-t-text {
  font-size: 14px;
  color: var(--ink-muted);
  line-height: 1.8;
}

/* ── CHECKLIST SECTION ─────────────────────────────────────── */
.pa-spot {
  background: var(--bg-blue);
  border-top: 3px solid var(--primary);
  padding: 80px 24px;
}
.pa-spot-inner {
  max-width: var(--max-w);
  margin: 0 auto;
}
.pa-checklist {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}
.pa-check-item {
  background: white;
  border: 1px solid #d0d4e8;
  padding: 24px;
  border-radius: var(--radius);
}
.pa-check-icon { font-size: 28px; margin-bottom: 12px; display: block; }
.pa-check-title {
  font-family: var(--font-body);
  font-size: 16px;
  font-weight: 700;
  margin-bottom: 10px;
  color: var(--primary);
}
.pa-check-text {
  font-size: 14px;
  color: var(--ink-muted);
  line-height: 1.7;
}

/* ── PROPAGANDA TRACKER CTA ────────────────────────────────── */
.pa-tracker-cta {
  background: var(--primary);
  padding: 64px 24px;
  text-align: center;
}
.pa-tracker-cta h2 {
  font-family: var(--font-serif);
  font-size: clamp(28px, 4vw, 44px);
  font-weight: 900;
  color: white;
  margin-bottom: 16px;
}
.pa-tracker-cta p {
  font-size: 16px;
  color: var(--ink-on-dark-muted);
  max-width: 600px;
  margin: 0 auto 32px;
  line-height: 1.7;
}
.pa-btn {
  display: inline-block;
  background: var(--accent);
  color: var(--primary-dark);
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 2px;
  text-transform: uppercase;
  padding: 16px 36px;
  text-decoration: none;
  border-radius: var(--radius);
  transition: background 0.2s, transform 0.2s;
}
.pa-btn:hover {
  background: #00d6d4;
  transform: translateY(-1px);
  color: var(--primary-dark);
}

/* ── NEWS SECTION (domstol.se style) ───────────────────────── */
.pa-news {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 64px 24px;
}
.pa-news h2 {
  font-family: var(--font-body);
  font-size: 28px;
  font-weight: 700;
  color: var(--ink);
  margin-bottom: 32px;
}
.pa-news-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
}
.pa-news-item {
  padding-bottom: 24px;
  border-bottom: 1px solid var(--surface);
}
.pa-news-title {
  font-family: var(--font-body);
  font-size: 17px;
  font-weight: 700;
  color: var(--primary);
  margin-bottom: 8px;
  line-height: 1.4;
}
.pa-news-title a {
  color: var(--primary);
  text-decoration: none;
}
.pa-news-title a:hover { text-decoration: underline; }
.pa-news-excerpt {
  font-size: 14px;
  color: var(--ink-muted);
  line-height: 1.7;
  margin-bottom: 8px;
}
.pa-news-meta {
  font-size: 12px;
  color: var(--ink-light);
}

/* ── FOOTER ────────────────────────────────────────────────── */
.pa-footer {
  background: #303030;
  color: rgba(255,255,255,0.6);
  padding: 48px 24px;
}
.pa-footer-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 40px;
}
.pa-footer h4 {
  font-family: var(--font-body);
  font-size: 16px;
  font-weight: 700;
  color: white;
  margin-bottom: 16px;
}
.pa-footer p {
  font-size: 13px;
  line-height: 1.8;
  margin-bottom: 8px;
}
.pa-footer a {
  color: rgba(255,255,255,0.7);
  text-decoration: none;
  font-size: 14px;
  display: block;
  padding: 4px 0;
}
.pa-footer a:hover { color: var(--accent); }
.pa-footer-bottom {
  max-width: var(--max-w);
  margin: 32px auto 0;
  padding-top: 24px;
  border-top: 1px solid rgba(255,255,255,0.1);
  text-align: center;
  font-family: var(--font-mono);
  font-size: 11px;
  color: rgba(255,255,255,0.3);
  letter-spacing: 1px;
}

/* ── RESPONSIVE ────────────────────────────────────────────── */
@media (max-width: 1024px) {
  .pa-filters-grid { grid-template-columns: repeat(3, 1fr); }
  .pa-footer-inner { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
  .pa-intro-grid,
  .pa-cards-grid,
  .pa-filters-grid,
  .pa-checklist,
  .pa-news-grid { grid-template-columns: 1fr; }

  .pa-card.full { grid-column: 1; }
  .pa-footer-inner { grid-template-columns: 1fr; }
  .pa-quicklinks { max-width: 100%; margin: 0; }
  .pa-quicklinks-grid { grid-template-columns: 1fr; }

  .pa-search input { width: 180px; }

  .pa-nav-inner { display: none; flex-direction: column; }
  .pa-nav-inner.open { display: flex; }
  .pa-menu-toggle { display: block; }

  .pa-hero { padding: 48px 24px 40px; }
}

/* ── Layout overrides ────────────────────────────────────────── */
/* ── HIGHSCORE BOARD ───────────────────────────────────────── */
.pa-highscore {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 48px 24px 64px;
}
.pa-highscore-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 16px;
  margin-bottom: 32px;
}
.pa-highscore h2 {
  font-family: var(--font-serif);
  font-size: clamp(24px, 3.5vw, 36px);
  font-weight: 900;
  color: var(--primary);
  margin: 0;
}
.pa-highscore h2 span { color: var(--accent-warm); }
.pa-hs-controls {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}
.pa-hs-btn {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  text-transform: uppercase;
  padding: 7px 16px;
  border: 1px solid var(--surface);
  background: transparent;
  color: var(--ink-muted);
  cursor: pointer;
  border-radius: var(--radius);
  transition: all 0.2s;
}
.pa-hs-btn:hover, .pa-hs-btn.active {
  background: var(--primary);
  color: white;
  border-color: var(--primary);
}
.pa-hs-list { list-style: none; }
.pa-hs-item {
  display: grid;
  grid-template-columns: 48px 1fr 80px 120px;
  gap: 16px;
  align-items: center;
  padding: 16px 20px;
  border-bottom: 1px solid #eee;
  transition: background 0.15s;
}
.pa-hs-item:hover { background: var(--bg-light); }
.pa-hs-rank {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-serif);
  font-size: 18px;
  font-weight: 900;
  color: white;
  background: var(--ink-light);
}
.pa-hs-rank.gold { background: linear-gradient(135deg, #d4a11a, #f0c040); }
.pa-hs-rank.silver { background: linear-gradient(135deg, #8a8a8a, #b8b8b8); }
.pa-hs-rank.bronze { background: linear-gradient(135deg, #a06030, #c8844a); }
.pa-hs-info {}
.pa-hs-title {
  font-size: 15px;
  font-weight: 600;
  color: var(--ink);
  line-height: 1.3;
  margin-bottom: 4px;
}
.pa-hs-title a {
  color: var(--ink);
  text-decoration: none;
}
.pa-hs-title a:hover { color: var(--primary); text-decoration: underline; }
.pa-hs-meta {
  font-size: 12px;
  color: var(--ink-light);
  display: flex;
  gap: 10px;
  align-items: center;
}
.pa-hs-source {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  text-transform: uppercase;
  padding: 2px 8px;
  border-radius: 2px;
  font-weight: 600;
}
.pa-hs-source.svt { background: #e8f0e8; color: #2a6a2a; }
.pa-hs-source.sr { background: #eef0f8; color: var(--primary); }
.pa-hs-source.dn { background: #fdf5f0; color: #8a4400; }
.pa-hs-source.svd { background: #f5f0f8; color: #5a2a8a; }
.pa-hs-source.tv4 { background: #fff0f0; color: #aa2020; }
.pa-hs-scorebar {
  display: flex;
  align-items: center;
  gap: 8px;
}
.pa-hs-bar {
  flex: 1;
  height: 8px;
  background: #eee;
  border-radius: 4px;
  overflow: hidden;
}
.pa-hs-bar-fill {
  height: 100%;
  border-radius: 4px;
  transition: width 0.6s ease;
}
.pa-hs-score {
  font-family: var(--font-mono);
  font-size: 14px;
  font-weight: 700;
  min-width: 36px;
  text-align: right;
}
.score-low { color: #2a8a2a; }
.score-low .pa-hs-bar-fill { background: #2a8a2a; }
.score-med { color: var(--accent-amber); }
.score-med .pa-hs-bar-fill { background: var(--accent-amber); }
.score-high { color: var(--accent-warm); }
.score-high .pa-hs-bar-fill { background: var(--accent-warm); }

.pa-hs-empty {
  text-align: center;
  padding: 48px 24px;
  color: var(--ink-light);
  font-size: 15px;
}
.pa-hs-loading {
  text-align: center;
  padding: 32px;
  color: var(--ink-light);
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 2px;
}

/* ── DASHBOARD SECTION ────────────────────────────────────── */
.pa-dashboard {
  display: none;
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 48px 24px 64px;
}
.pa-dashboard.visible { display: block; }
.pa-dash-kpis {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
  margin-bottom: 40px;
}
.pa-kpi {
  background: white;
  border: 1px solid #e4e4e4;
  padding: 24px;
  border-radius: var(--radius);
}
.pa-kpi-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--ink-light);
  margin-bottom: 8px;
}
.pa-kpi-value {
  font-family: var(--font-serif);
  font-size: 36px;
  font-weight: 900;
  color: var(--primary);
  line-height: 1;
}
.pa-kpi-change {
  font-size: 12px;
  color: var(--ink-light);
  margin-top: 4px;
}
.pa-dash-charts {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 24px;
  margin-bottom: 40px;
}
.pa-chart-box {
  background: white;
  border: 1px solid #e4e4e4;
  padding: 24px;
  border-radius: var(--radius);
}
.pa-chart-title {
  font-family: var(--font-body);
  font-size: 16px;
  font-weight: 700;
  color: var(--ink);
  margin-bottom: 16px;
}
.pa-dash-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
}
.pa-dash-table th {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--ink-light);
  text-align: left;
  padding: 12px 16px;
  border-bottom: 2px solid var(--primary);
}
.pa-dash-table td {
  padding: 12px 16px;
  border-bottom: 1px solid #eee;
  color: var(--ink);
}
.pa-dash-table tr:hover td { background: var(--bg-light); }
.pa-score-badge {
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 700;
  padding: 3px 10px;
  border-radius: 12px;
  display: inline-block;
}
.badge-low { background: #e8f5e8; color: #2a6a2a; }
.badge-med { background: #fdf5e8; color: #8a5500; }
.badge-high { background: #fde8e8; color: #8a2020; }

.pa-main-content { }
.pa-main-content.hidden-content { display: none; }

@media (max-width: 768px) {
  .pa-hs-item { grid-template-columns: 40px 1fr 60px; }
  .pa-hs-scorebar { display: none; }
  .pa-dash-kpis { grid-template-columns: 1fr 1fr; }
  .pa-dash-charts { grid-template-columns: 1fr; }
}
</style>

<!-- Chart.js -->
<script nonce="6E8PAgJcxjWbEaZOLn7bQA" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js"></script>

  <meta name="format-detection" content="telephone=no">
  <meta name="mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-title" content="Propagandaanalys">
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <meta name="application-name" content="Propagandaanalys">
  <link rel="manifest" href="/manifest.webmanifest">
</head>
<body>

<div class="pa-page-wrap">

<!-- TOP BAR -->
<div class="pa-topbar">
  <div class="pa-topbar-inner">
    <a href="/">Propagandaanalys.org</a>
    <div class="pa-topbar-right">
      <a href="https://granskasverige.org" target="_blank" rel="noopener">granskasverige.org</a>
      <a href="/" class="lang-active" title="Svenska"><svg viewBox="0 0 24 16" width="24" height="16" style="vertical-align:middle"><rect width="24" height="16" fill="#006AA7"/><rect x="7.5" y="0" width="3" height="16" fill="#FECC00"/><rect x="0" y="6.5" width="24" height="3" fill="#FECC00"/></svg></a>
      <a href="/en" title="English"><svg viewBox="0 0 24 16" width="24" height="16" style="vertical-align:middle"><rect width="24" height="16" fill="#012169"/><path d="M0,0 L24,16 M24,0 L0,16" stroke="#fff" stroke-width="2.5"/><path d="M0,0 L24,16 M24,0 L0,16" stroke="#C8102E" stroke-width="1.5"/><rect x="9.5" y="0" width="5" height="16" fill="#fff"/><rect x="0" y="5.5" width="24" height="5" fill="#fff"/><rect x="10.5" y="0" width="3" height="16" fill="#C8102E"/><rect x="0" y="6.5" width="24" height="3" fill="#C8102E"/></svg></a>
    </div>
  </div>
</div>

<!-- HEADER -->
<header class="pa-header">
  <div class="pa-header-inner">
    <a href="/" class="pa-logo">
      <div class="pa-logo-icon">P</div>
      <div>
        <div class="pa-logo-text">PROPAGANDAANALYS</div>
        <div class="pa-logo-sub">AI-driven mediekritik</div>
      </div>
    </a>
    <div class="pa-search">
      <input type="text" placeholder="Sök analyser, tekniker...">
      <button type="submit">Sök</button>
    </div>
  </div>
</header>

<!-- NAVIGATION — domstol.se style -->
<nav class="pa-nav" role="navigation" aria-label="Huvudnavigation">
  <button class="pa-menu-toggle" data-action="menu-toggle">Meny</button>
  <div class="pa-nav-inner">
    <a href="#tekniker" class="active" data-action="nav" data-section="main" data-anchor="tekniker">Propagandatekniker</a>
    <a href="#chomsky" data-action="nav" data-section="main" data-anchor="chomsky">Chomskys modell</a>
    <a href="#tracker" data-action="nav" data-section="main" data-anchor="tracker">AI-Tracker</a>
    <a href="#verktygslada" data-action="nav" data-section="main" data-anchor="verktygslada">Verktygslåda</a>
    <a href="#dashboard" data-action="nav" data-section="dashboard" data-anchor="">Dashboard</a>
    <a href="#nyheter" data-action="nav" data-section="main" data-anchor="nyheter">Nyheter</a>
    <a href="/mediaagare/">Mediaägare</a>
    <a href="https://granskasverige.org" target="_blank" rel="noopener">granskasverige.org</a>
  </div>
</nav>

<!-- HERO -->
<section class="pa-hero">
  <div class="pa-hero-inner">
    <span class="pa-hero-tag">// Mediekritik &amp; Källkunskap</span>
    <h1>Hur <em>mainstream</em><br>media påverkar dig</h1>
    <p class="pa-hero-desc">En genomgång av dokumenterade propagandatekniker — med verkliga reportage som exempel. Kunskapen hjälper dig bli en mer kritisk mediakonsument, oavsett politisk riktning.</p>
    <div class="pa-hero-disclaimer">
      Propagandatekniker används av medier längs hela det politiska spektret — höger, vänster och center. Den här sidan har inget politiskt syfte utan syftar till att öka mediekritisk medvetenhet.
    </div>
  </div>
</section>

<!-- QUICK LINKS -->
<div style="max-width:var(--max-w);margin:0 auto;padding:0 24px;">
  <div class="pa-quicklinks">
    <h3>Snabblänkar</h3>
    <div class="pa-quicklinks-grid">
      <a href="#tracker">AI PropagandaTracker</a>
      <a href="#tekniker">7 propagandatekniker</a>
      <a href="#chomsky">Chomskys 5 filter</a>
      <a href="#fallstudie">Irakkriget — tidslinje</a>
      <a href="#svensk-ps">SVT/SR-analys</a>
      <a href="#verktygslada">Mediekritisk verktygslåda</a>
    </div>
  </div>
</div>

<!-- ═══ HIGHSCORE BOARD (under hero) ═══ -->
<section class="pa-highscore" id="topplista">
  <div class="pa-highscore-header">
    <div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap;">
      <div>
        <span class="pa-section-label">// Senaste AI-analyserna</span>
        <h2>Propaganda<span>toppen</span></h2>
      </div>
      <div style="display:flex;gap:6px;margin-top:4px;">
        <button id="btn-7d" class="pa-hs-btn" data-action="timemode" data-mode="7d" style="font-size:11px;padding:4px 10px;">Senaste veckan</button>
        <button id="btn-alltime" class="pa-hs-btn active" data-action="timemode" data-mode="alltime" style="font-size:11px;padding:4px 10px;">Alla analyser</button>
      </div>
    </div>
    <div class="pa-hs-controls">
      <button class="pa-hs-btn active" data-action="filter-hs" data-domain="all">Alla</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="svt.se">SVT</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="sr.se">SR</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="dn.se">DN</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="svd.se">SVD</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="aftonbladet.se">AftonB</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="expressen.se">Express</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="expo.se">Expo</button>
      <button class="pa-hs-btn" data-action="filter-hs" data-domain="tv4.se">TV4</button>
    </div>
  </div>
  <div id="highscore-loading" class="pa-hs-loading">Laddar analysdata...</div>
  <ul class="pa-hs-list" id="highscore-list"></ul>
</section>

<!-- ═══ DASHBOARD (hidden by default, shown via nav) ═══ -->
<section class="pa-dashboard" id="dashboard">
  <span class="pa-section-label">// Realtidsstatistik</span>
  <h2 style="font-family:var(--font-serif);font-size:clamp(28px,4vw,44px);font-weight:900;color:var(--primary);margin-bottom:32px;">Live Dashboard</h2>

  <div class="pa-dash-kpis">
    <div class="pa-kpi">
      <div class="pa-kpi-label">Totalt analyserade</div>
      <div class="pa-kpi-value" id="kpi-total">--</div>
      <div class="pa-kpi-change">artiklar i databasen</div>
    </div>
    <div class="pa-kpi">
      <div class="pa-kpi-label">Snittpoang</div>
      <div class="pa-kpi-value" id="kpi-avg">--</div>
      <div class="pa-kpi-change">propaganda score (0-10)</div>
    </div>
    <div class="pa-kpi">
      <div class="pa-kpi-label">Idag</div>
      <div class="pa-kpi-value" id="kpi-today">--</div>
      <div class="pa-kpi-change">analyser idag</div>
    </div>
    <div class="pa-kpi">
      <div class="pa-kpi-label">Domäner</div>
      <div class="pa-kpi-value" id="kpi-sources">--</div>
      <div class="pa-kpi-change">bevakade domäner</div>
    </div>
  </div>

  <div class="pa-dash-charts">
    <div class="pa-chart-box">
      <div class="pa-chart-title">Propagandatrend (30 dagar)</div>
      <canvas id="trendChart" height="250"></canvas>
    </div>
    <div class="pa-chart-box">
      <div class="pa-chart-title">Teknikfordelning</div>
      <canvas id="techniqueChart" height="250"></canvas>
    </div>
  </div>

  <div class="pa-chart-box">
    <div class="pa-chart-title">Senaste analyser</div>
    <table class="pa-dash-table">
      <thead>
        <tr><th>Artikel</th><th>Domain</th><th>Score</th><th>Datum</th></tr>
      </thead>
      <tbody id="dash-table-body"></tbody>
    </table>
  </div>
</section>

<!-- ═══ MAIN CONTENT (educational) ═══ -->
<div class="pa-main-content" id="main-content">

<!-- INTRO -->
<section class="pa-section" id="tekniker">
  <div class="pa-intro-grid">
    <div>
      <span class="pa-section-label">// Grundläggande begrepp</span>
      <h2>Vad är mediapropaganda?</h2>
      <p>Propaganda handlar inte alltid om uppenbara lögner. Det handlar lika ofta om vad som <em>utelämnas</em>, hur nyheter <em>vinklas</em>, vilka röster som <em>väljs ut</em> — och vilka ämnen som överhuvudtaget hamnar på agendan.</p>
      <p>Moderna medier opererar inom komplexa strukturer av ägarintressen, reklamintäkter, politiska nätverk och redaktionella kulturer. Det skapar systematiska snedvridningar som inte nödvändigtvis beror på ond vilja — men som ändå formar vad vi tror oss veta.</p>
      <p>Nedan presenteras sju välkända tekniker, beskrivna av forskare och medievetare, illustrerade med verkliga och dokumenterade fall.</p>
    </div>
    <div>
      <div class="pa-book-ref">
        <span class="pa-book-title">Manufacturing Consent</span>
        <span class="pa-book-author">Noam Chomsky &amp; Edward S. Herman, 1988</span>
        <p>Den mest inflytelserika akademiska modellen för hur kommersiella medier systematiskt formar opinionen.</p>
      </div>
      <div class="pa-book-ref">
        <span class="pa-book-title">Network Propaganda</span>
        <span class="pa-book-author">Benkler, Faris &amp; Roberts — Oxford University Press, 2018</span>
        <p>Akademisk analys av hur mainstream-media kan manipuleras till att sprida desinformation.</p>
      </div>
    </div>
  </div>
</section>

<!-- TECHNIQUE FILTERS -->
<section class="pa-section" style="padding-top:0;">
  <div class="pa-filters">
    <button class="pa-filter-btn active" data-action="filter-cards" data-technique="all">Alla tekniker</button>
    <button class="pa-filter-btn" data-action="filter-cards" data-technique="manipulation">Manipulation</button>
    <button class="pa-filter-btn" data-action="filter-cards" data-technique="framing">Framing</button>
    <button class="pa-filter-btn" data-action="filter-cards" data-technique="omission">Utelämnande</button>
    <button class="pa-filter-btn" data-action="filter-cards" data-technique="bias">Strukturell bias</button>
  </div>

  <!-- TECHNIQUE CARDS -->
  <div class="pa-cards-grid">

    <!-- 01 Agenda Setting -->
    <div class="pa-card" data-cat="framing">
      <div class="pa-card-header">
        <div class="pa-card-num">01</div>
        <div>
          <span class="pa-card-tag tag-framing">Framing</span>
          <div class="pa-card-title">Dagordningsmakt<br>(Agenda Setting)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Medier avgör inte bara <em>hur</em> en nyhet berättas — de avgör vilka nyheter som berättas överhuvudtaget. Det som inte rapporteras existerar knappt i den allmänna medvetenheten.</p>
        <div class="pa-example amber">
          <span class="pa-example-label">Dokumenterat fall — Fallujah 2004</span>
          <div class="pa-example-text">Noam Chomsky jämförde den amerikanska medibevakningen av Afghan War Diaries med den nästan totala avsaknaden av bevakning av allvarliga hälsoproblem i Fallujah.</div>
        </div>
      </div>
    </div>

    <!-- 02 Framing -->
    <div class="pa-card" data-cat="framing">
      <div class="pa-card-header">
        <div class="pa-card-num">02</div>
        <div>
          <span class="pa-card-tag tag-framing">Framing</span>
          <div class="pa-card-title">Inramning<br>(Framing)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Samma händelse kan beskrivas på radikalt olika sätt beroende på vilka ord, bilder och sammanhang som väljs. En person kan kallas "frihetssoldat" eller "terrorist" — faktan är densamma, men inramningen styr tolkningen.</p>
        <div class="pa-example">
          <span class="pa-example-label">Dokumenterat fall — Brittiska tabloidrubriker</span>
          <div class="pa-example-text">Propagandamodellen lyfter fram hur brittiska tabloider använde förenklade och avhumaniserande rubriker som förmänskligar krig till en enkel konfrontation.</div>
        </div>
      </div>
    </div>

    <!-- 03 Card Stacking -->
    <div class="pa-card full" data-cat="omission">
      <div class="pa-card-header">
        <div class="pa-card-num">03</div>
        <div>
          <span class="pa-card-tag tag-omission">Utelämnande</span>
          <div class="pa-card-title">Selektiv information &amp; strategiskt utelämnande (Card Stacking)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Tekniken innebär att man presenterar fakta som är korrekta i sig, men utelämnar den information som skulle förändra bilden. Det är inte nödvändigtvis lögn — det är ett noggrant urval av sanningar.</p>
      </div>
    </div>

    <!-- 04 Authority -->
    <div class="pa-card" data-cat="manipulation">
      <div class="pa-card-header">
        <div class="pa-card-num">04</div>
        <div>
          <span class="pa-card-tag tag-manipulation">Manipulation</span>
          <div class="pa-card-title">Auktoritetsappell<br>(Appeal to Authority)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Genom att lyfta fram experter eller institutioner som utan vidare granskning ges status av "sanningskälla" skapar man en automatisk trovärdighetsstämpel.</p>
        <div class="pa-example red">
          <span class="pa-example-label">Dokumenterat fall — Pentagons medieanalytiker</span>
          <div class="pa-example-text">NYT avslöjade att Pentagons tjänstemän försåg TV-kanalernas nyhetsanalytiker med "speciell information" som presenterades som oberoende expertis i sändning.</div>
        </div>
      </div>
    </div>

    <!-- 05 Repetition -->
    <div class="pa-card" data-cat="manipulation">
      <div class="pa-card-header">
        <div class="pa-card-num">05</div>
        <div>
          <span class="pa-card-tag tag-manipulation">Manipulation</span>
          <div class="pa-card-title">Upprepning<br>(Repetition / Big Lie)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Ett påstående som upprepas tillräckligt många gånger börjar uppfattas som sanning — särskilt om medierna begränsar eller kontrollerar motröster.</p>
        <div class="pa-example amber">
          <span class="pa-example-label">Dokumenterat — WMD-myten lever kvar</span>
          <div class="pa-example-text">En studie visade att 42% av amerikaner fortfarande felaktigt trodde att USA:s trupper hittat massförstörelsevapen i Irak — trots att inga hittades.</div>
        </div>
      </div>
    </div>

    <!-- 06 VNR -->
    <div class="pa-card" data-cat="manipulation">
      <div class="pa-card-header">
        <div class="pa-card-num">06</div>
        <div>
          <span class="pa-card-tag tag-manipulation">Manipulation</span>
          <div class="pa-card-title">Falska nyhetsinslag<br>(Video News Releases)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Myndigheter och PR-byråer producerar färdiga nyhetsinslag som ser ut som vanliga reportage men är betalda kommunikationsinsatser.</p>
      </div>
    </div>

    <!-- 07 Structural Bias -->
    <div class="pa-card" data-cat="bias">
      <div class="pa-card-header">
        <div class="pa-card-num">07</div>
        <div>
          <span class="pa-card-tag tag-bias">Strukturell bias</span>
          <div class="pa-card-title">Ägarmakt &amp; reklamfilter<br>(Structural Bias)</div>
        </div>
      </div>
      <div class="pa-card-body">
        <p>Mediebolag ägs av stora konglomerat med breda affärsintressen. Det skapar en inbyggd intressekonflikt: redaktioner undviker sällan historier som skadar ägarens övriga verksamheter.</p>
      </div>
    </div>
  </div>
</section>

<!-- CHOMSKY MODEL -->
<section class="pa-model" id="chomsky">
  <div class="pa-model-inner">
    <span class="pa-section-label" style="color:var(--accent);">// Herman &amp; Chomskys modell — 1988</span>
    <h2>De fem filtren som<br>styr nyhetsflödet</h2>
    <div class="pa-filters-grid">
      <div class="pa-filter-card">
        <div class="pa-filter-num">I</div>
        <div class="pa-filter-name">Ägarmakt</div>
        <div class="pa-filter-desc">Storföretagsägda medier undviker historier som skadar ägarens andra affärsintressen.</div>
      </div>
      <div class="pa-filter-card">
        <div class="pa-filter-num">II</div>
        <div class="pa-filter-name">Reklamintäkter</div>
        <div class="pa-filter-desc">Annonsörer utgör den primära intäktskällan — kritisk granskning riskerar att kosta pengar.</div>
      </div>
      <div class="pa-filter-card">
        <div class="pa-filter-num">III</div>
        <div class="pa-filter-name">Källberoende</div>
        <div class="pa-filter-desc">Regeringar och storföretag är dominerande nyhetskällor — vilket ger dem stor kontroll.</div>
      </div>
      <div class="pa-filter-card">
        <div class="pa-filter-num">IV</div>
        <div class="pa-filter-name">"Flak"</div>
        <div class="pa-filter-desc">Organiserat motstånd mot kritisk journalistik — lobbying, rättstvister och politiskt tryck.</div>
      </div>
      <div class="pa-filter-card">
        <div class="pa-filter-num">V</div>
        <div class="pa-filter-name">Dominerande ideologi</div>
        <div class="pa-filter-desc">En gemensam världsbild som osynligt styr vad som betraktas som "rimligt" att rapportera.</div>
      </div>
    </div>
  </div>
</section>

<!-- TRACKER CTA -->
<section class="pa-tracker-cta" id="tracker">
  <h2>AI PropagandaTracker</h2>
  <p>Klistra in text eller URL från ett SVT-reportage och låt AI:n identifiera propagandatekniker, ge en score och analysera vinkling. Baserad på Grok AI.</p>
  <a href="/propaganda-tracker" class="pa-btn">Starta analys</a>
</section>

<!-- HOW TO SPOT -->
<section class="pa-spot" id="verktygslada">
  <div class="pa-spot-inner">
    <span class="pa-section-label">// Mediakritisk verktygslåda</span>
    <h2 style="font-family:var(--font-serif);font-size:clamp(28px,4vw,44px);font-weight:900;color:var(--primary);margin-bottom:40px;">Hur du skyddar dig</h2>
    <div class="pa-checklist">
      <div class="pa-check-item">
        <span class="pa-check-icon">?</span>
        <div class="pa-check-title">Fråga vad som utelämnas</div>
        <div class="pa-check-text">Varje artikel gör val om vad som inkluderas. Fråga alltid: finns det perspektiv, röster eller fakta som lyser med sin frånvaro?</div>
      </div>
      <div class="pa-check-item">
        <span class="pa-check-icon">&#x1F3DB;</span>
        <div class="pa-check-title">Kolla vem som äger mediet</div>
        <div class="pa-check-text">Ta reda på vem som äger publikationen och vilka andra affärsintressen de har.</div>
      </div>
      <div class="pa-check-item">
        <span class="pa-check-icon">&#x1F4D0;</span>
        <div class="pa-check-title">Jämför källan med källan</div>
        <div class="pa-check-text">Primärkällan skiljer sig ofta från hur medier refererar den. Gå tillbaka till originaldokumentet.</div>
      </div>
      <div class="pa-check-item">
        <span class="pa-check-icon">&#x26A1;</span>
        <div class="pa-check-title">Var skeptisk mot emotionell urgency</div>
        <div class="pa-check-text">Nyheter som skapar stark rädsla, ilska eller brådska bör granskas extra noggrant.</div>
      </div>
      <div class="pa-check-item">
        <span class="pa-check-icon">&#x1F504;</span>
        <div class="pa-check-title">Läs medier du normalt ogillar</div>
        <div class="pa-check-text">Att konsumera enbart medier vi instämmer med skapar ett ekkammare-filter.</div>
      </div>
      <div class="pa-check-item">
        <span class="pa-check-icon">&#x23F1;</span>
        <div class="pa-check-title">Ge nyheter tid</div>
        <div class="pa-check-text">Många "breaking news"-historier korrigeras, nyanseras eller faller samman under de följande dagarna.</div>
      </div>
    </div>
  </div>
</section>

<!-- NEWS SECTION (domstol.se style) -->
<section class="pa-news" id="nyheter">
  <h2>Senaste analyserna</h2>
  <div class="pa-news-grid">
    <div class="pa-news-item">
      <div class="pa-news-title"><a href="#">Ny analys: Vinklingen av energikrisen i SVT Rapport &rarr;</a></div>
      <div class="pa-news-excerpt">AI-analysen identifierade tre propagandatekniker i gårdagens huvudsändning, med en sammanlagd score på 6.2/10.</div>
      <div class="pa-news-meta">Analys | Propagandaanalys.org &bull; 2026-03-12</div>
    </div>
    <div class="pa-news-item">
      <div class="pa-news-title"><a href="#">Veckoranking: Mars vecka 11 — Mest vinklade nyheter &rarr;</a></div>
      <div class="pa-news-excerpt">Denna veckas topp-3 av de mest ensidiga rapporteringarna baserat på AI-driven propagandaanalys.</div>
      <div class="pa-news-meta">Veckorapport | Propagandaanalys.org &bull; 2026-03-10</div>
    </div>
    <div class="pa-news-item">
      <div class="pa-news-title"><a href="#">Jämförande studie: TV4 vs SVT i klimatrapporteringen &rarr;</a></div>
      <div class="pa-news-excerpt">En genomgång av hur de två kanalerna ramade in samma klimatrapport under en vecka.</div>
      <div class="pa-news-meta">Studie | Propagandaanalys.org &bull; 2026-03-07</div>
    </div>
    <div class="pa-news-item">
      <div class="pa-news-title"><a href="#">Ny funktion: Auto-analys med Grok AI &rarr;</a></div>
      <div class="pa-news-excerpt">PropagandaTracker kan nu automatiskt söka dagens mest laddade SVT-artikel och analysera den.</div>
      <div class="pa-news-meta">Uppdatering | Propagandaanalys.org &bull; 2026-03-05</div>
    </div>
  </div>
</section>

</div><!-- /.pa-main-content -->

<!-- FOOTER -->
<footer class="pa-footer">
  <div class="pa-footer-inner">
    <div>
      <h4>Propagandaanalys.org</h4>
      <p>AI-driven mediekritik och källkunskap. Baserad på akademisk forskning av Chomsky, Herman, Benkler m.fl.</p>
      <p style="margin-top:12px;">
        <a href="mailto:kontakt@propagandaanalys.org">kontakt@propagandaanalys.org</a>
      </p>
    </div>
    <div>
      <h4>Navigera</h4>
      <a href="#tekniker">Propagandatekniker</a>
      <a href="#chomsky">Chomskys modell</a>
      <a href="#tracker">AI PropagandaTracker</a>
      <a href="#verktygslada">Mediakritisk verktygslåda</a>
      <a href="/mediaagare/">Mediaägare — Vem äger media?</a>
      <a href="https://granskasverige.org" target="_blank" rel="noopener">granskasverige.org</a>
    </div>
    <div>
      <h4>Resurser</h4>
      <a href="https://en.wikipedia.org/wiki/Propaganda_model" target="_blank">Wikipedia: Propaganda-modellen</a>
      <a href="https://naringslivets-medieinstitut.se" target="_blank">Näringslivets medieinstitut</a>
      <a href="https://www.mprt.se" target="_blank">Granskningsnämnden (MPRT)</a>
      <a href="/integritetspolicy">Integritetspolicy</a>
    </div>
  </div>
  <div class="pa-footer-bottom">
    &copy; 2026 Propagandaanalys.org &mdash; Ingen politisk agenda. Bara källkritik.
  </div>
</footer>

</div><!-- .pa-page-wrap -->

<!-- JS: Full interactivity -->
<script nonce="6E8PAgJcxjWbEaZOLn7bQA">
const API_BASE = '';
function escapeHtml(str) {
  var d = document.createElement('div');
  d.textContent = String(str || '');
  return d.innerHTML;
}
let allAnalyses = [];
let trendChartInstance = null;
let techniqueChartInstance = null;

// ── Section toggling ──
function navTo(e, section, anchor) {
  e.preventDefault();
  const mainContent = document.getElementById('main-content');
  const dashboard   = document.getElementById('dashboard');
  const navLinks    = document.querySelectorAll('.pa-nav a');

  // Close mobile menu
  document.querySelector('.pa-nav-inner').classList.remove('open');

  if (section === 'dashboard') {
    mainContent.classList.add('hidden-content');
    dashboard.classList.add('visible');
    navLinks.forEach(l => l.classList.remove('active'));
    const dl = document.querySelector('a[href="#dashboard"]');
    if (dl) dl.classList.add('active');
    loadDashboard();
    window.scrollTo({ top: 0, behavior: 'smooth' });
  } else {
    mainContent.classList.remove('hidden-content');
    dashboard.classList.remove('visible');
    navLinks.forEach(l => l.classList.remove('active'));
    if (e.currentTarget) e.currentTarget.classList.add('active');
    // Wait one frame for content to be visible, then scroll
    requestAnimationFrame(() => {
      const target = anchor ? document.getElementById(anchor) : null;
      if (target) {
        const offset = 70; // nav height
        const top = target.getBoundingClientRect().top + window.scrollY - offset;
        window.scrollTo({ top, behavior: 'smooth' });
      } else {
        window.scrollTo({ top: 0, behavior: 'smooth' });
      }
    });
  }
}

// Keep old name for any remaining calls
function showSection(section) { navTo({ preventDefault:()=>{} }, section, null); }

// ── Card filter ──
function filterCards(cat) {
  document.querySelectorAll('.pa-filter-btn').forEach(b => b.classList.remove('active'));
  event.target.classList.add('active');
  document.querySelectorAll('.pa-card').forEach(card => {
    card.style.display = (cat === 'all' || card.dataset.cat === cat) ? '' : 'none';
  });
}

// ── Highscore board ──
function getScoreClass(score) {
  if (score <= 3.5) return 'score-low';
  if (score <= 6.5) return 'score-med';
  return 'score-high';
}

function getBadgeClass(score) {
  if (score <= 3.5) return 'badge-low';
  if (score <= 6.5) return 'badge-med';
  return 'badge-high';
}

function getRankClass(i) {
  if (i === 0) return 'gold';
  if (i === 1) return 'silver';
  if (i === 2) return 'bronze';
  return '';
}

function renderHighscore(analyses) {
  const list = document.getElementById('highscore-list');
  const loading = document.getElementById('highscore-loading');
  loading.style.display = 'none';

  if (!analyses || analyses.length === 0) {
    list.innerHTML = '<li class="pa-hs-empty">Inga analyser hittade. Data fylls pa nar Grok API-nyckeln konfigureras.</li>';
    return;
  }

  const hidden = ['100.se','nyheteridag.se'];
  const filtered = analyses.filter(a => !hidden.includes((a.domain || '').toLowerCase()));
  const sorted = [...filtered].sort((a, b) => (b.propaganda_score || 0) - (a.propaganda_score || 0));
  const top10 = sorted.slice(0, 10);

  list.innerHTML = top10.map((item, i) => {
    const score = (item.propaganda_score || 0).toFixed(1);
    const pct = ((item.propaganda_score || 0) / 10 * 100).toFixed(0);
    const cls = getScoreClass(item.propaganda_score || 0);
    const rankCls = getRankClass(i);
    const domain = (item.domain || '').toLowerCase();
    const domainName = item.domain_name && item.domain_name !== 'Unknown'
      ? escapeHtml(item.domain_name)
      : escapeHtml((item.source || 'other').toUpperCase());
    const domainClass = domain.replace('.', '-') || (item.source || 'other');
    const date = item.analyzed_at ? item.analyzed_at.split(' ')[0] : '';
    const url = item.article_url || '#';

    return '<li class="pa-hs-item" data-source="' + escapeHtml(item.source || '') + '" data-domain="' + escapeHtml(domain) + '">' +
      '<div class="pa-hs-rank ' + rankCls + '">' + (i + 1) + '</div>' +
      '<div class="pa-hs-info">' +
        '<div class="pa-hs-title"><a href="' + encodeURI(url) + '" target="_blank" rel="noopener">' + (item.article_title || 'Okand artikel') + '</a></div>' +
        '<div class="pa-hs-meta"><span class="pa-hs-source ' + domainClass + '">' + domainName + '</span> <span>' + domain + '</span> <span>' + date + '</span></div>' +
      '</div>' +
      '<div class="pa-hs-scorebar ' + cls + '">' +
        '<div class="pa-hs-bar"><div class="pa-hs-bar-fill" style="width:' + pct + '%"></div></div>' +
        '<div class="pa-hs-score">' + score + '</div>' +
      '</div>' +
    '</li>';
  }).join('');
}

let hsTimeMode = 'alltime'; // '7d' or 'alltime'
let hsDomain = 'all';

function setTimeMode(mode, btn) {
  hsTimeMode = mode;
  document.querySelectorAll('#btn-7d, #btn-alltime').forEach(b => b.classList.remove('active'));
  btn.classList.add('active');
  loadHighscoreData();
}

async function filterHighscore(domain, btn) {
  document.querySelectorAll('.pa-hs-controls .pa-hs-btn').forEach(b => b.classList.remove('active'));
  btn.classList.add('active');
  hsDomain = domain;
  loadHighscoreData();
}

async function loadHighscoreData() {
  const loading = document.getElementById('highscore-loading');
  loading.style.display = 'block';
  loading.textContent = 'Laddar...';
  document.getElementById('highscore-list').innerHTML = '';

  try {
    let url = API_BASE + '/api/analyses?limit=100&sort=score';
    if (hsTimeMode === '7d') url += '&days=7';
    if (hsDomain !== 'all') url += '&domain=' + encodeURIComponent(hsDomain);

    const resp = await fetch(url);
    const data = await resp.json();
    let analyses = data.analyses || [];

    // Legacy fallback: if domain filter gives 0 results, try source name
    if (analyses.length === 0 && hsDomain !== 'all') {
      const sourceKey = hsDomain.replace('.se', '');
      const resp2 = await fetch(API_BASE + '/api/analyses?limit=100&sort=score' +
        (hsTimeMode === '7d' ? '&days=7' : '') +
        '&source=' + encodeURIComponent(sourceKey));
      const data2 = await resp2.json();
      analyses = data2.analyses || [];
    }

    allAnalyses = analyses;
    renderHighscore(analyses);
  } catch(e) {
    loading.textContent = 'Kunde inte ladda data.';
  }
}

// ── Dashboard ──
async function loadDashboard() {
  try {
    const [statsResp, trendsResp, analysesResp] = await Promise.all([
      fetch(API_BASE + '/api/stats'),
      fetch(API_BASE + '/api/trends?days=30'),
      fetch(API_BASE + '/api/analyses?limit=50')
    ]);

    const stats = await statsResp.json();
    const trends = await trendsResp.json();
    const analyses = await analysesResp.json();

    // KPIs
    document.getElementById('kpi-total').textContent = stats.total_analyses || 0;
    document.getElementById('kpi-avg').textContent = stats.avg_propaganda_score !== null ? stats.avg_propaganda_score.toFixed(1) : '0.0';
    document.getElementById('kpi-today').textContent = stats.today_analyses || 0;
    document.getElementById('kpi-sources').textContent = (stats.by_domain || stats.sources || []).length;

    // Trend chart — group by domain if available, fall back to source
    renderTrendChart(trends.trends || []);

    // Technique chart
    renderTechniqueChart(analyses.analyses || []);

    // Table
    renderDashTable(analyses.analyses || []);
  } catch (e) {
    console.error('Dashboard load error:', e);
  }
}

function renderTrendChart(trends) {
  const ctx = document.getElementById('trendChart');
  if (!ctx) return;

  if (trendChartInstance) trendChartInstance.destroy();

  const dates = [...new Set(trends.map(t => t.date))].sort();

  // Group by domain if available, otherwise fall back to source
  const usesDomain = trends.some(t => t.domain && t.domain !== 'unknown');
  const groupKey   = usesDomain ? 'domain' : 'source';
  const labelKey   = usesDomain ? 'domain_name' : 'source';
  const groups     = [...new Set(trends.map(t => t[groupKey]).filter(Boolean))];

  const domainColors = {
    'svt.se': '#2a8a2a',      'svt': '#2a8a2a',
    'sr.se': '#1c1f66',       'sr': '#1c1f66',
    'dn.se': '#d4891a',       'dn': '#d4891a',
    'svd.se': '#7a2a9a',      'svd': '#7a2a9a',
    'tv4.se': '#c0392b',      'tv4': '#c0392b',
    'aftonbladet.se': '#e84040', 'aftonbladet': '#e84040',
    'expressen.se': '#e8a020',   'expressen': '#e8a020',
    '100.se': '#00bcd4',
    'expo.se': '#ff6f00',
    'nyheteridag.se': '#7b1fa2', 'nyheteridag': '#7b1fa2',
  };

  const datasets = groups.map(grp => {
    const labelEntry = trends.find(t => t[groupKey] === grp);
    const label = labelEntry ? (labelEntry[labelKey] || grp).toUpperCase() : grp.toUpperCase();
    return {
      label,
      data: dates.map(d => {
        const entry = trends.find(t => t.date === d && t[groupKey] === grp);
        return entry ? entry.avg_score : null;
      }),
      borderColor: domainColors[grp] || '#888',
      backgroundColor: (domainColors[grp] || '#888') + '20',
      tension: 0.3,
      fill: false,
      pointRadius: 3,
      borderWidth: 2,
      spanGaps: true,
    };
  });

  trendChartInstance = new Chart(ctx, {
    type: 'line',
    data: { labels: dates, datasets },
    options: {
      responsive: true,
      plugins: { legend: { position: 'bottom' } },
      scales: {
        y: { min: 0, max: 10, title: { display: true, text: 'Score' } },
        x: { title: { display: true, text: 'Datum' } }
      }
    }
  });
}

function renderTechniqueChart(analyses) {
  const ctx = document.getElementById('techniqueChart');
  if (!ctx) return;

  if (techniqueChartInstance) techniqueChartInstance.destroy();

  const techniques = {};
  analyses.forEach(a => {
    const detected = Array.isArray(a.techniques_detected) ? a.techniques_detected : [];
    detected.forEach(t => { techniques[t] = (techniques[t] || 0) + 1; });
  });

  const labels = Object.keys(techniques);
  const data = Object.values(techniques);

  if (labels.length === 0) {
    labels.push('Vantar pa data');
    data.push(1);
  }

  const bgColors = ['#1c1f66', '#00c0be', '#c0392b', '#d4891a', '#2a8a2a', '#7a2a9a', '#888'];

  techniqueChartInstance = new Chart(ctx, {
    type: 'doughnut',
    data: {
      labels,
      datasets: [{ data, backgroundColor: bgColors.slice(0, labels.length), borderWidth: 2 }]
    },
    options: {
      responsive: true,
      plugins: { legend: { position: 'bottom', labels: { font: { size: 11 } } } }
    }
  });
}

function renderDashTable(analyses) {
  const tbody = document.getElementById('dash-table-body');
  if (!tbody) return;

  tbody.innerHTML = analyses.slice(0, 20).map(a => {
    const score = (a.propaganda_score || 0).toFixed(1);
    const cls = getBadgeClass(a.propaganda_score || 0);
    // Prefer domain_name, fall back to source
    const displayName = a.domain_name && a.domain_name !== 'Unknown'
      ? escapeHtml(a.domain_name)
      : escapeHtml((a.source || 'other').toUpperCase());
    const domainClass = (a.domain || a.source || '').replace('.', '-');
    const date = a.analyzed_at ? a.analyzed_at.split(' ')[0] : '';
    const title = (a.article_title || 'Okand').substring(0, 60);

    return '<tr>' +
      '<td>' + title + '</td>' +
      '<td><span class="pa-hs-source ' + domainClass + '">' + displayName + '</span></td>' +
      '<td><span class="pa-score-badge ' + cls + '">' + score + '</span></td>' +
      '<td>' + date + '</td>' +
    '</tr>';
  }).join('');
}

// ── Load highscore on page load ──
loadHighscoreData();

// ── Event delegation (replaces inline onclick for CSP compliance) ──
document.addEventListener('click', function(e) {
  var el = e.target.closest('[data-action]');
  if (!el) return;
  var action = el.getAttribute('data-action');
  if (action === 'menu-toggle') {
    document.querySelector('.pa-nav-inner').classList.toggle('open');
  } else if (action === 'nav') {
    e.preventDefault();
    navTo(e, el.getAttribute('data-section'), el.getAttribute('data-anchor') || null);
  } else if (action === 'timemode') {
    setTimeMode(el.getAttribute('data-mode'), el);
  } else if (action === 'filter-hs') {
    filterHighscore(el.getAttribute('data-domain'), el);
  } else if (action === 'filter-cards') {
    filterCards(el.getAttribute('data-technique'));
  } else if (action === 'switch-tab') {
    switchTab(el.getAttribute('data-tab'));
  } else if (action === 'run-analysis') {
    runAnalysis();
  } else if (action === 'reset-form') {
    resetForm();
  }
});

</script>

<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" nonce="6E8PAgJcxjWbEaZOLn7bQA" data-cf-beacon='{"version":"2024.11.0","token":"733d249983ff44cf97c65258f5850d1f","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>
