<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>CDU Ortsverband Neuhofen</title>
<link rel="nofollow">https://cdu-neuhofen.de</link>
<description>Hier finden Sie aktuelle Feeds. Falls Sie direkt mit uns Kontakt aufnehmen möchten, wenden Sie sich bitte direkt per Mail an uns. (anschlos@t-online.de)</description>
<language>de</language>
<pubDate>Wed, 08 Apr 2026 04:05:14 GMT</pubDate>
<item>
<title><![CDATA[Landtagswahl 2026]]></title>
<link rel="nofollow">https://cdu-neuhofen.de/news/lokal/244/Landtagswahl-2026.html</link>
<description><![CDATA[ <img src="https://cdu-neuhofen.de/image/news/244.jpg" valign="left" width="200"> ]]></description>
<pubDate>Sat, 28 Feb 2026 23:59:00 GMT</pubDate>
<guid>https://cdu-neuhofen.de/news/lokal/244/Landtagswahl-2026.html</guid>
</item>
<item>
<title><![CDATA[25 Jahre CDU-Website]]></title>
<link rel="nofollow">https://cdu-neuhofen.de/news/lokal/243/25-Jahre-CDU-Website.html</link>
<description><![CDATA[ <img src="https://cdu-neuhofen.de/image/news/243.jpg" valign="left" width="200"><div id="jub25-wrap" style="max-width:920px;margin:30px auto;padding:18px;">
<div style="
    border-radius:22px;
    overflow:hidden;
    border:1px solid rgba(45,60,75,.25);
    box-shadow:0 18px 55px rgba(45,60,75,.35);
    background:
      radial-gradient(1200px 600px at 20% 20%, rgba(81,183,193,.25), transparent 60%),
      radial-gradient(900px 500px at 80% 70%, rgba(249,179,29,.25), transparent 55%),
      linear-gradient(135deg, #2d3c4b, #1f2a34);
  "><canvas id="jub25-c" style="display:block;width:100%;height:280px;"></canvas></div>
</div>
<script>
(() => {
  const canvas = document.getElementById("jub25-c");
  const ctx = canvas.getContext("2d", { alpha: true });
  const DPR = Math.max(1, Math.min(2, window.devicePixelRatio || 1));

  let W = 0, H = 0;
  let particles = [];
  let targets = [];
  let mouse = { x: -9999, y: -9999, r: 90 };
  let t0 = performance.now();

  const COLORS = {
    primary: { r: 81, g: 183, b: 193 },   // #51b7c1
    accent:  { r: 249, g: 179, b: 29  },  // #f9b31d
    dark:    { r: 45, g: 60,  b: 75  },  // #2d3c4b
    white:   { r: 255, g: 255, b: 255 }
  };

  function resize() {
    const cssW = canvas.clientWidth;
    const cssH = canvas.clientHeight;
    W = Math.floor(cssW * DPR);
    H = Math.floor(cssH * DPR);
    canvas.width = W;
    canvas.height = H;
    buildTargets();
    seedParticles();
  }

  function buildTargets() {
    const off = document.createElement("canvas");
    off.width = W;
    off.height = H;
    const octx = off.getContext("2d");

    octx.clearRect(0, 0, W, H);
    const fontSize = Math.floor(H * 0.62);
    octx.font = `900 ${fontSize}px system-ui, -apple-system, Segoe UI, Roboto, Arial`;
    octx.textAlign = "center";
    octx.textBaseline = "middle";
    octx.fillStyle = "#ffffff";
    octx.shadowColor = "rgba(0,0,0,0.35)";
    octx.shadowBlur = 10 * DPR;
    octx.fillText("25", W * 0.5, H * 0.55);

    const img = octx.getImageData(0, 0, W, H).data;
    targets = [];
    const step = Math.max(5, Math.floor(Math.min(W, H) / 70));

    for (let y = 0; y < H; y += step) {
      for (let x = 0; x < W; x += step) {
        const i = (y * W + x) * 4;
        if (img[i + 3] > 30) targets.push({ x, y });
      }
    }
  }

  function seedParticles() {
    const max = Math.min(2000, targets.length);
    const shuffled = targets.slice().sort(() => Math.random() - 0.5);

    particles = new Array(max).fill(0).map((_, i) => {
      const t = shuffled[i];
      return {
        x: Math.random() * W,
        y: Math.random() * H,
        vx: 0, vy: 0,
        tx: t.x, ty: t.y,
        p: Math.random()
      };
    });
  }

  function tick(now) {
    const dt = Math.min(0.033, (now - t0) / 1000);
    t0 = now;
    ctx.clearRect(0, 0, W, H);

    for (const p of particles) {
      const ax = (p.tx - p.x) * 0.02;
      const ay = (p.ty - p.y) * 0.02;

      const dx = p.x - mouse.x;
      const dy = p.y - mouse.y;
      const d = Math.hypot(dx, dy);
      let rx = 0, ry = 0;
      if (d < mouse.r * DPR) {
        const f = (1 - d / (mouse.r * DPR)) * 1.5;
        rx = (dx / d) * f;
        ry = (dy / d) * f;
      }

      p.vx = (p.vx + ax + rx) * 0.88;
      p.vy = (p.vy + ay + ry) * 0.88;
      p.x += p.vx;
      p.y += p.vy;

      const mix = (Math.sin(p.p + now * 0.0015) + 1) / 2;
      const r = COLORS.primary.r + (COLORS.accent.r - COLORS.primary.r) * mix;
      const g = COLORS.primary.g + (COLORS.accent.g - COLORS.primary.g) * mix;
      const b = COLORS.primary.b + (COLORS.accent.b - COLORS.primary.b) * mix;

      ctx.fillStyle = `rgba(${r|0},${g|0},${b|0},0.95)`;
      ctx.beginPath();
      ctx.arc(p.x, p.y, 1.8 * DPR, 0, Math.PI * 2);
      ctx.fill();
    }

    requestAnimationFrame(tick);
  }

  function onMove(e) {
    const r = canvas.getBoundingClientRect();
    mouse.x = (e.clientX - r.left) * DPR;
    mouse.y = (e.clientY - r.top) * DPR;
  }
  function onLeave() { mouse.x = mouse.y = -9999; }

  const ro = new ResizeObserver(resize);
  ro.observe(canvas);
  canvas.addEventListener("mousemove", onMove);
  canvas.addEventListener("mouseleave", onLeave);
  canvas.addEventListener("touchmove", e => onMove(e.touches[0]), { passive:true });
  canvas.addEventListener("touchend", onLeave);

  resize();
  requestAnimationFrame(tick);
})();
</script> ]]></description>
<pubDate>Wed, 28 Jan 2026 21:00:00 GMT</pubDate>
<guid>https://cdu-neuhofen.de/news/lokal/243/25-Jahre-CDU-Website.html</guid>
</item>
</channel>
</rss>