Testseite: Unterschied zwischen den Versionen

Aus Bündnis für Familie Tübingen.
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<!doctype html>
<html lang="de">
<html lang="de">
<head>
<head>
<meta charset="UTF-8">
  <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Familienangebote August 2026</title>
  <title>Viele Formen von Familie – Programm 2026</title>
 
  <style>
<style>
     :root {
body{
      --bg: #f6f7fb;
    font-family: Arial, sans-serif;
      --surface: #ffffff;
    margin:20px;
      --surface-soft: #f8fafc;
     background:#f5f5f5;
      --text: #1f2937;
}
      --muted: #64748b;
 
      --line: #dbe1ea;
h1{
      --accent: #0f766e;
    text-align:center;
      --accent-dark: #115e59;
}
      --accent-soft: #ecfdf5;
 
      --radius: 16px;
.toolbar{
    display:flex;
    gap:10px;
    margin-bottom:20px;
    justify-content:center;
}
 
button{
    cursor:pointer;
}
 
.calendar{
    display:grid;
    grid-template-columns:repeat(7,1fr);
    gap:10px;
}
 
.weekday{
    background:#003366;
    color:white;
    padding:10px;
    text-align:center;
    font-weight:bold;
}
 
.day{
    background:white;
    min-height:150px;
    border-radius:8px;
    padding:8px;
    box-shadow:0 2px 5px rgba(0,0,0,.15);
    cursor:pointer;
}
 
.day-number{
    font-weight:bold;
    margin-bottom:8px;
}
 
.entry{
    background:#e8f2ff;
    padding:4px;
    margin-bottom:4px;
    border-radius:4px;
    font-size:12px;
}
 
.modal{
    display:none;
    position:fixed;
    inset:0;
    background:rgba(0,0,0,.5);
    justify-content:center;
    align-items:center;
}
 
.modal-content{
    background:white;
    width:90%;
    max-width:900px;
    max-height:90vh;
    overflow:auto;
    padding:20px;
    border-radius:10px;
}
 
label{
    display:block;
    margin-top:10px;
    font-weight:bold;
}
 
input, textarea{
    width:100%;
    padding:8px;
    box-sizing:border-box;
}
 
.entry-card{
    border:1px solid #ccc;
    padding:10px;
    margin:10px 0;
    border-radius:6px;
}
 
.actions{
    display:flex;
    gap:10px;
    margin-top:10px;
}
 
.close-btn{
    float:right;
}
 
.empty{
    background:transparent;
}
</style>
</head>
<body>
 
<h1>Familienangebote – August 2026</h1>
 
<div class="toolbar">
    <button onclick="exportData()">Export JSON</button>
    <button onclick="exportPDF()">Export PDF</button>
    <button onclick="exportExcel()">Export Excel</button>
 
    <input type="file" id="importFile" onchange="importData(event)">
</div>
 
<div class="calendar" id="calendar"></div>
 
<div class="modal" id="modal">
    <div class="modal-content">
 
        <button class="close-btn" onclick="closeModal()">Schließen</button>
 
        <h2 id="modalDate"></h2>
 
        <button onclick="addEntry()">+ Neuer Eintrag</button>
 
        <div id="entriesContainer"></div>
 
    </div>
</div>
 
<script>
 
let data = {
  "1": [
    {
      angebot: "Bächlewanderung mit Kind und Kescher",
      uhrzeit: "10:00 - 13:00",
      ort: "Start und Treffpunkt ist am Parkplatz Bebenhausen.",
      zielgruppe: "Geeignet für Familien mit Kindern ab 5 Jahren",
      anmeldung: "wird benötigt",
      link: "https://www.fbs-tuebingen.de/eltern-und-kinder/kw/bereich/kursdetails/kurs/261-2516B/kursname/Baechlewanderung%20mit%20Kind%20und%20Kescher/kategorie-id/11/",
      beschreibung: "Wir wandern am Goldersbach entlang über die Tellerbrücke zur Teufelsbrücke."
     }
     }
  ],


  "2": [
     *, *::before, *::after { box-sizing: border-box; }
     {
     html { scroll-behavior: smooth; }
      angebot: "Eiscafé frieDa",
     body {
      uhrzeit: "14:00-17:00",
       margin: 0;
      ort: "Café frieDa, Friedrich-Dannenmann-Straße 69, 72070 Tübingen",
       color: var(--text);
      zielgruppe: "Familien, Nachbarn, Menschen mit und ohne Behinderung",
      background: var(--bg);
      anmeldung: "",
       font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
      link: "https://www.lebenshilfe-tuebingen.de/service/termine/",
       line-height: 1.5;
      beschreibung: "Das Eiscafé frieDa ist ein Begegnungs-Ort."
     },
     {
       angebot: "Geschwisterchen auf dem Weg",
       uhrzeit: "10:00 - 12:00",
       ort: "FBS, Raum 003 Villa Metz, Hechingerstraße 13",
      zielgruppe: "Für Kinder ab 4 Jahren mit einem Elternteil",
      anmeldung: "wird benötigt",
       link: "https://www.fbs-tuebingen.de/programm/kw/bereich/kursdetails/kurs/261-2509/kursname/Geschwisterchen%20auf%20dem%20Weg/",
      beschreibung: "Vorbereitung auf ein Geschwisterchen."
     }
     }
  ],
    .wrap { width: min(100% - 2rem, 1200px); margin: 0 auto; padding: clamp(1rem, 3vw, 2rem) 0; }
 
    h1, h2, h3 { line-height: 1.2; overflow-wrap: anywhere; }
  "4": [
    h1 { margin: 0 0 .5rem; font-size: clamp(1.75rem, 1.2rem + 2vw, 2.75rem); }
     {
     h2 { margin: 0 0 1rem; font-size: clamp(1.25rem, 1rem + .8vw, 1.6rem); }
      angebot: "BabyBrunch",
    .intro { margin: 0 0 1.5rem; color: var(--muted); }
      uhrzeit: "09:30-11:30",
    .notice {
       ort: "elkiko Familienzentrum",
      margin: 0 0 1.5rem;
       zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
       padding: .85rem 1rem;
       anmeldung: "babybrunch@elkiko.de",
       border-left: 4px solid #d97706;
       link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
       border-radius: 10px;
       beschreibung: ""
       color: #78350f;
       background: #fffbeb;
     }
     }
  ],
     .month {
 
       margin-bottom: 1.5rem;
  "5": [
       padding: clamp(.85rem, 2vw, 1.25rem);
     {
       background: var(--surface);
       angebot: "Spielplatztreff",
       border: 1px solid var(--line);
      uhrzeit: "14:30-15:30",
       border-radius: var(--radius);
       ort: "Piratenspielplatz, Anlagenpark",
       box-shadow: 0 8px 24px rgb(15 23 42 / 5%);
       zielgruppe: "Familien mit jüngeren Kindern",
       anmeldung: "-",
       link: "",
       beschreibung: "Treffpunkt zum Austausch mit der Familienbeauftragten."
     }
     }
  ],
     .weekdays, .grid {
 
       display: grid;
  "6": [
       grid-template-columns: repeat(7, minmax(0, 1fr));
     {
      gap: clamp(4px, 1vw, 10px);
  angebot: "BabyBrunch",
      uhrzeit: "09:30-11:30",
      ort: "elkiko Familienzentrum",
      zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
      anmeldung: "babybrunch@elkiko.de",
      link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
      beschreibung:
    },
    {
       angebot: "Sommerferien mit dem LESE-HAUS",
       uhrzeit: "11:00"
ort: Alter Botanischer Garten, Wiese neben dem Kinderspielplatz, bei schlechtem Wetter: Thekla-Waitz-Studio, im EG der Stadtbücherei, Nonnengasse 19, 72070 Tübingen",
zielgruppe: "Kinder von 4 - 8 Jahre mit Begleitpersonen",
link: "https://tuebingen.ferienprogramm-online.de/"
beschreibung: ""Vorlesestunde zum Thema „Unsere Welt ist bunt“ mit allerlei Geschichten, vorgelesen von Lesepatinnen und Lesepaten des LESE-HAUSes sowie Mitarbeitenden der Stadtbücherei.
Bei schönem Wetter findet die Veranstaltung immer donnerstags im Alten Botanischen Garten an einem schattigen Plätzchen statt. Bei schlechtem Wetter treffen wir uns  im Thekla-Waitz-Studio im Erdgeschoss der Stadtbücherei."
 
 
 
 
     }
     }
  ],
    .weekdays { margin-bottom: .5rem; }
 
     .weekdays div {
  "9": [
       padding: .25rem;
     {
       color: var(--muted);
      angebot: "Eiscafé frieDa",
       font-size: .85rem;
       uhrzeit: "14:00-17:00",
       font-weight: 700;
       ort: "Café frieDa, Friedrich-Dannenmann-Straße 69, 72070 Tübingen",
       text-align: center;
       zielgruppe: "Familien, Nachbarn, Menschen mit und ohne Behinderung",
       anmeldung: "",
       link: "https://www.lebenshilfe-tuebingen.de/service/termine/",
      beschreibung: "Das Eiscafé frieDa ist ein Begegnungs-Ort."
     }
     }
  ],
     .day {
 
       min-width: 0;
  "11": [
       min-height: 120px;
     {
       padding: .6rem;
       angebot: "BabyBrunch",
       background: var(--surface-soft);
       uhrzeit: "09:30-11:30",
       border: 1px solid var(--line);
       ort: "elkiko Familienzentrum",
       border-radius: 12px;
       zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
      display: flex;
       anmeldung: "babybrunch@elkiko.de",
      flex-direction: column;
       link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
       gap: .5rem;
       beschreibung: ""
     }
     }
  ],
    .day.muted { opacity: .45; }
 
    .dn { color: #374151; font-size: .9rem; font-weight: 700; }
  "12": [
     .event {
     {
       width: 100%;
       angebot: "Spielplatztreff",
      min-width: 0;
       uhrzeit: "14:30-15:30"
      padding: .65rem .7rem;
      color: var(--accent-dark);
      text-align: left;
       font: inherit;
      background: var(--accent-soft);
      border: 1px solid rgb(15 118 110 / 18%);
      border-left: 4px solid var(--accent);
      border-radius: 10px;
      cursor: pointer;
      overflow-wrap: anywhere;
      transition: background .2s ease, transform .2s ease;
     }
     }
  ],
     .event:hover, .event:focus-visible { background: #d1fae5; transform: translateY(-1px); }
 
    .event:focus-visible, button:focus-visible {
  "13": [
       outline: 3px solid rgb(37 99 235 / 35%);
     {
       outline-offset: 2px;
      angebot: "BabyBrunch",
      uhrzeit: "09:30-11:30",
      ort: "elkiko Familienzentrum",
      zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
      anmeldung: "babybrunch@elkiko.de",
      link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
      beschreibung: ""
    },
    {
       angebot: "Sommerferien mit dem LESE-HAUS",
       uhrzeit: "11:00"
ort: Alter Botanischer Garten, Wiese neben dem Kinderspielplatz, bei schlechtem Wetter: Thekla-Waitz-Studio, im EG der Stadtbücherei, Nonnengasse 19, 72070 Tübingen",
zielgruppe: "Kinder von 4 - 8 Jahre mit Begleitpersonen",
link: "https://tuebingen.ferienprogramm-online.de/"
beschreibung: ""Vorlesestunde zum Thema „Unsere Welt ist bunt“ mit allerlei Geschichten, vorgelesen von Lesepatinnen und Lesepaten des LESE-HAUSes sowie Mitarbeitenden der Stadtbücherei.
Bei schönem Wetter findet die Veranstaltung immer donnerstags im Alten Botanischen Garten an einem schattigen Plätzchen statt. Bei schlechtem Wetter treffen wir uns  im Thekla-Waitz-Studio im Erdgeschoss der Stadtbücherei."
     }
     }
  ],
    .event-time { display: block; margin-bottom: .15rem; font-size: .75rem; font-weight: 800; }
    .et { display: block; font-size: .84rem; font-weight: 700; line-height: 1.35; }


  "16": [
     .event-dialog {
     {
      width: min(92vw, 680px);
angebot: "Eiscafé frieDa",
       max-height: 88vh;
       uhrzeit: "14:00-17:00",
       padding: 0;
       ort: "Café frieDa, Friedrich-Dannenmann-Straße 69, 72070 Tübingen",
       color: var(--text);
       zielgruppe: "Familien, Nachbarn, Menschen mit und ohne Behinderung",
       background: var(--surface);
       anmeldung: "",
       border: 0;
       link: "https://www.lebenshilfe-tuebingen.de/service/termine/",
       border-radius: 18px;
       beschreibung: "Das Eiscafé frieDa ist ein Begegnungs-Ort."
       box-shadow: 0 20px 60px rgb(15 23 42 / 25%);
    },
    {
      angebot: "Bunt backen mit Kindern: Regenbogen-Muffins & Cake-Pops",
       uhrzeit: "16:00 - 18:30"
     }
     }
  ],
    .event-dialog::backdrop { background: rgb(15 23 42 / 58%); }
 
    .dialog-inner { max-height: 88vh; overflow: auto; padding: 1.25rem; }
  "18": [
     .dialog-close {
     {
       float: right;
       angebot: "BabyBrunch",
       width: 2.75rem;
       uhrzeit: "09:30-11:30",
      height: 2.75rem;
       ort: "elkiko Familienzentrum",
      border: 0;
       zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
      border-radius: 50%;
       anmeldung: "babybrunch@elkiko.de",
       color: var(--text);
       link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
       background: #eef2f7;
       beschreibung: ""
       font-size: 1.5rem;
       line-height: 1;
       cursor: pointer;
     }
     }
  ],
    .dialog-close:hover { background: #e2e8f0; }
    .dialog-title { margin: 0 3.25rem .9rem 0; color: var(--accent-dark); font-size: clamp(1.15rem, 1rem + .8vw, 1.5rem); }
    .dialog-date { margin: 0 0 1rem; color: var(--muted); font-weight: 700; }
    .dialog-details { display: grid; gap: .85rem; }
    .detail-row { padding-top: .85rem; border-top: 1px solid var(--line); overflow-wrap: anywhere; }
    .detail-row strong { display: block; margin-bottom: .2rem; color: var(--text); }
    .detail-description { white-space: pre-line; }
    .dialog-link { color: var(--accent-dark); font-weight: 700; overflow-wrap: anywhere; }


  "19": [
    @media (max-width: 700px) {
    {
      .wrap { width: min(100% - 1rem, 600px); }
       angebot: "Spielplatztreff",
      .month { padding: .85rem; border-radius: 14px; }
       uhrzeit: "14:30-15:30"
       .weekdays, .grid { grid-template-columns: repeat(7, minmax(30px, 1fr)); gap: 3px; }
       .weekdays div { padding: .2rem 0; font-size: .7rem; }
      .day { min-height: 62px; padding: .35rem; border-radius: 9px; }
      .dn { font-size: .78rem; }
      .event { padding: .55rem .6rem; border-left-width: 3px; }
      .event-time { font-size: .65rem; }
      .et { font-size: .74rem; }
     }
     }
  ],


  "20": [
    @media (max-width: 480px) {
    {
      .grid { display: block; }
    angebot: "BabyBrunch",
      .day { display: none; }
       uhrzeit: "09:30-11:30",
       .day.has-events {
      ort: "elkiko Familienzentrum",
        display: block;
      zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
        min-height: auto;
       anmeldung: "babybrunch@elkiko.de",
        margin-bottom: .7rem;
       link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
        padding: .7rem;
      beschreibung: ""
        background: var(--surface-soft);
    },
       }
    {
       .day.has-events .dn { margin-bottom: .55rem; font-size: 1rem; }
      angebot: "Sommerferien mit dem LESE-HAUS",
      .day.muted { display: none; }
       uhrzeit: "11:00"
       .event { margin-top: .5rem; }
ort: Alter Botanischer Garten, Wiese neben dem Kinderspielplatz, bei schlechtem Wetter: Thekla-Waitz-Studio, im EG der Stadtbücherei, Nonnengasse 19, 72070 Tübingen",
      .event-time { font-size: .76rem; }
zielgruppe: "Kinder von 4 - 8 Jahre mit Begleitpersonen",
      .et { font-size: .92rem; }
link: "https://tuebingen.ferienprogramm-online.de/"
beschreibung: ""Vorlesestunde zum Thema „Unsere Welt ist bunt“ mit allerlei Geschichten, vorgelesen von Lesepatinnen und Lesepaten des LESE-HAUSes sowie Mitarbeitenden der Stadtbücherei.
Bei schönem Wetter findet die Veranstaltung immer donnerstags im Alten Botanischen Garten an einem schattigen Plätzchen statt. Bei schlechtem Wetter treffen wir uns  im Thekla-Waitz-Studio im Erdgeschoss der Stadtbücherei."
     }
     }
  ],


  "23": [
     @media (prefers-reduced-motion: reduce) {
     {
       *, *::before, *::after { scroll-behavior: auto !important; transition: none !important; }
angebot: "Eiscafé frieDa",
      uhrzeit: "14:00-17:00",
       ort: "Café frieDa, Friedrich-Dannenmann-Straße 69, 72070 Tübingen",
      zielgruppe: "Familien, Nachbarn, Menschen mit und ohne Behinderung",
      anmeldung: "",
      link: "https://www.lebenshilfe-tuebingen.de/service/termine/",
      beschreibung: "Das Eiscafé frieDa ist ein Begegnungs-Ort."
     }
     }
   ],
   </style>
</head>
<body>
  <main class="wrap">
    <h1>Viele Formen von Familie</h1>
    <p class="intro">Hier findet ihr eine Übersicht über das gesamte Programm zur Ausstellung. Die Ausstellung ist von Anfang Oktober bis Dezember 2026 in der Hauptstelle der Stadtbibliothek (Kinder- und Jugendbereich sowie 1. Stock) und im Stadtmuseum zu sehen.</p>
    <p class="notice"><strong>In Kl&ruml;rung:</strong> Kino – drei Sonntagsmatineen mit Familienfilmen.</p>
    <div id="calendar"></div>
  </main>


   "25": [
   <dialog id="eventDialog" class="event-dialog" aria-labelledby="dialogTitle">
     {
     <div class="dialog-inner">
       angebot: "BabyBrunch",
       <button type="button" class="dialog-close" id="dialogClose" aria-label="Details schließen">&times;</button>
       uhrzeit: "09:30-11:30",
       <h2 id="dialogTitle" class="dialog-title"></h2>
       ort: "elkiko Familienzentrum",
       <p id="dialogDate" class="dialog-date"></p>
       zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
       <div class="dialog-details">
      anmeldung: "babybrunch@elkiko.de",
        <div class="detail-row"><strong>Uhrzeit</strong><span id="dialogTime"></span></div>
      link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
        <div class="detail-row"><strong>Zielgruppe</strong><span id="dialogAudience"></span></div>
      beschreibung: ""
        <div class="detail-row"><strong>Treffpunkt</strong><span id="dialogPlace"></span></div>
     }
        <div class="detail-row"><strong>Beschreibung</strong><div id="dialogDescription" class="detail-description"></div></div>
   ],
        <div id="dialogLinkRow" class="detail-row" hidden><strong>Weitere Informationen / Anmeldung</strong><a id="dialogLink" class="dialog-link" target="_blank" rel="noopener"></a></div>
      </div>
     </div>
   </dialog>


   "26": [
   <script>
     {
     /*
       angebot: "Spielplatztreff",
      =====================================================
      uhrzeit: "14:30-15:30"
      HIER ANGEBOTE ERGĨNZEN
    }
      =====================================================
  ],
       Jedes Angebot ist ein Objekt mit diesen Feldern:
        - year: 2026
        - month: 10 (Oktober) oder 11 (November) oder 12 (Dezember)
        - day: 1 bis 31
        - time: z. B. "18:00 Uhr" oder "09:00–11:00 Uhr" oder "Ganzt䨤gig"
        - title: Kurzer Titel der Veranstaltung
        - audience: Zielgruppe
        - place: Ort / Treffpunkt
        - description: L&auml;ngere Beschreibung (mehrzeilig erlaubt)
        - link: Optional, z. B. "https://..." oder "mailto:..."


  "27": [
       Einfach ein neues Objekt in die passende Monatsliste einf&uuml;gen.
    {
     */
       angebot: "BabyBrunch",
      uhrzeit: "09:30-11:30",
      ort: "elkiko Familienzentrum",
      zielgruppe: "Eltern mit Säuglingen und Kleinkindern",
      anmeldung: "babybrunch@elkiko.de",
      link: "https://www.elkiko.de/content2/index.php/de/programm/babybrunch-brunch1plus.html",
      beschreibung: ""
    },
     {
      angebot: "Sommerferien mit dem LESE-HAUS",
      uhrzeit: "11:00"
ort: Alter Botanischer Garten, Wiese neben dem Kinderspielplatz, bei schlechtem Wetter: Thekla-Waitz-Studio, im EG der Stadtbücherei, Nonnengasse 19, 72070 Tübingen",
zielgruppe: "Kinder von 4 - 8 Jahre mit Begleitpersonen",
link: "https://tuebingen.ferienprogramm-online.de/"
beschreibung: ""Vorlesestunde zum Thema „Unsere Welt ist bunt“ mit allerlei Geschichten, vorgelesen von Lesepatinnen und Lesepaten des LESE-HAUSes sowie Mitarbeitenden der Stadtbücherei.
Bei schönem Wetter findet die Veranstaltung immer donnerstags im Alten Botanischen Garten an einem schattigen Plätzchen statt. Bei schlechtem Wetter treffen wir uns  im Thekla-Waitz-Studio im Erdgeschoss der Stadtbücherei."
    }
  ],


  "30": [
    const events = [
    {
      // Oktober 2026
      angebot: "Eiscafé frieDa",
      { year: 2026, month: 10, day: 6, time: "20:00–21:00 Uhr", title: "Hochsensible Kinder gut unterst&uuml;tzen und begleiten", audience: "Eltern", place: "Digitales Format", description: "Eltern sein in T&uuml;bingen – so geht's leichter! Welche konkreten Tipps haben T&uuml;binger Expert*innen f&uuml;r Eltern von j&uuml;ngeren und &auml;lteren Kindern – zu Erziehungsthemen, aber auch zu Herausforderungen, die das Elternsein mit sich bringt?\n\nDiese Online-Themenreihe ist eine Kooperation der Universit&auml;tsstadt T&uuml;bingen mit der Familien-Bildungsst&auml;tte (FBS) und dem B&uuml;ndnis f&uuml;r Familie (B&uuml;Fa).\n\nNach der Anmeldung erhalten Sie einen Zoom-Zugangscode. Ein eigener Zoom-Account ist nicht erforderlich.", link: "https://www.fbs-tuebingen.de/eltern-und-lebensthemen" },
       uhrzeit: "14:00-17:00",
      { year: 2026, month: 10, day: 8, time: "18:00 Uhr", title: "Filmvorf&uuml;hrung mit Gespr&auml;ch &uuml;ber den Film „All Inclusive“", audience: "Alle Generationen, f&uuml;r Kinder ab 7 Jahren", place: "Aula des Uhland-Gymnasiums, Uhlandstra&szlig;e 24, 72072 T&uuml;bingen", description: "Filmvorf&uuml;hrung mit Gespr&auml;ch &uuml;ber den Film „All Inclusive“. Die Veranstaltung wird vom Interkulturellen Mehrgenerationenhaus InF&ouml; e. V. und der Lebenshilfe veranstaltet." },
      ort: "Café frieDa, Friedrich-Dannenmann-Straße 69, 72070 Tübingen",
      { year: 2026, month: 10, day: 9, time: "15:00 Uhr", title: "Vorlesezeit in franz&ouml;sischer Sprache mit dem LESE-HAUS", audience: "Kinder von 4 bis 8 Jahren", place: "Stadtb&uuml;cherei T&uuml;bingen, Nonnengasse 19, Thekla-Waitz-Studio", description: "Geschichten und Lieder auf Franz&ouml;sisch laden Kinder spielerisch dazu ein, erste Eindr&uuml;cke der Sprache zu sammeln. Mitarbeitende des Institut Culturel Franco-Allemand (ICFA) gestalten diese besondere Vorlesezeit rund um das Thema Familie." },
       zielgruppe: "Familien, Nachbarn, Menschen mit und ohne Behinderung",
       { year: 2026, month: 10, day: 9, time: "16:00 Uhr", title: "Vorlesezeit mit dem LESE-HAUS", audience: "Kinder von 4 bis 8 Jahren", place: "Stadtb&uuml;cherei T&uuml;bingen, Nonnengasse 19, Thekla-Waitz-Studio", description: "Bei dieser Vorlesezeit auf Deutsch stehen Geschichten rund um das Thema Familie im Mittelpunkt – mal lustig, mal spannend, mal ber&uuml;hrend." },
       anmeldung: "",
      { year: 2026, month: 10, day: 9, time: "17:00 Uhr", title: "Vorlesezeit in ukrainischer Sprache mit dem LESE-HAUS", audience: "Kinder von 4 bis 8 Jahren", place: "Stadtb&uuml;cherei T&uuml;bingen, Nonnengasse 19, Thekla-Waitz-Studio", description: "Lesepatinnen aus der Ukraine lesen Geschichten in ihrer Muttersprache und geben Einblicke in ukrainische Erz&auml;hltraditionen rund um das Thema Familie." },
      link: "https://www.lebenshilfe-tuebingen.de/service/termine/",
       { year: 2026, month: 10, day: 21, time: "17:00 Uhr", title: "Familiensprachen und Sprachencaf&eacute;s im elkiko Familienzentrum", audience: "T&uuml;binger Familien und Interessierte", place: "Stadtb&uuml;cherei, Hauptstelle", description: "Mitmachangebote zum Thema Familiensprachen sowie Informationen zu den Sprachencaf&eacute;s im elkiko Familienzentrum." },
      beschreibung: "Das Eiscafé frieDa ist ein Begegnungs-Ort."
      { year: 2026, month: 10, day: 22, time: "18:00 Uhr", title: "Preisverleihung des 23. Schreibwettbewerbs f&uuml;r junge Menschen der Buchhandlung Wekenmann", audience: "Alle Interessierten", place: "Museumsgesellschaft Obere S&auml;le, Wilhelmstra&szlig;e 3, T&uuml;bingen", description: "Festliche Preisverleihung: Die sechs Preistr&auml;ger*innen des Schreibwettbewerbs „We are family“ lesen aus ihren Siegertexten. Dr. Daniela H&uuml;ttig, Erste Landesbeamtin und Schirmherrin des Wettbewerbs, spricht ein Gru&szlig;wort. Musikalisch umrahmt wird der Abend von Singer/Songwriter Jakob Longfield." },
    }
       { year: 2026, month: 10, day: 31, time: "15:00 Uhr", title: "BamBam-Band &amp; Halloween Fair for Kids", audience: "Familien mit Kindern ab 3 Jahren", place: "d.a.i. T&uuml;bingen, Karlstra&szlig;e 3, T&uuml;bingen", description: "Konzert und Halloween f&uuml;r die ganze Familie. Ab 15 Uhr spielt die BamBam-Band. Ab 16 Uhr hei&szlig;t es Trick or Treat: Kinderdisco, Basteln, Gaming und jede Menge Spa&szlig; mit Popcorn und Snacks.\n\nAlles kostenfrei auf Spendenbasis. Kost&uuml;me sind sehr willkommen. Die Veranstaltung findet in deutscher und englischer Sprache statt.", link: "https://www.dai-tuebingen.de/bambam" },
  ]
};


      // November 2026
      { year: 2026, month: 11, day: 5, time: "09:00–11:00 Uhr", title: "„Der Widerspenstigen Z&auml;hmung?“ – Workshop", audience: "Eltern von Kindern im Vorschulalter", place: "Jugend- und Familienberatungszentrum T&uuml;bingen, Bismarckstra&szlig;e 110, 72072 T&uuml;bingen, 2. Stock", description: "Manche Kinder sind Weltmeister darin, Erwachsene an ihre Grenzen zu bringen. Gemeinsam soll ein Verst&auml;ndnis f&uuml;r als schwierig empfundene kindliche Verhaltensweisen entwickelt werden. Ziel ist au&szlig;erdem, neue Reaktionsweisen auszuprobieren, um unn&ouml;tige Machtk&auml;mpfe im Familienalltag zu vermeiden.", link: "mailto:jfbz-tue@kreis-tuebingen.de" },
      { year: 2026, month: 11, day: 5, time: "19:00 Uhr", title: "Nach der Elternzeit – welche Betreuung passt f&uuml;r mein Kind und unsere Familie?", audience: "(Werdende) Eltern, die sich &uuml;ber Kleinkindbetreuung informieren m&ouml;chten", place: "Online", description: "Um eine passende Betreuung nach der Elternzeit zu finden, braucht es einen &Uuml;berblick &uuml;ber die verschiedenen M&ouml;glichkeiten der Kinderbetreuung. Welches Modell passt f&uuml;r welches Kind und welche Familie, welche Kriterien k&ouml;nnen eine Rolle spielen und was sind die Besonderheiten der Kindertagespflege?", link: "mailto:info@tageselternverein.de" },
      { year: 2026, month: 11, day: 9, time: "18:00–20:00 Uhr", title: "Wassergew&ouml;hnung – wie unterst&uuml;tze ich mein Kind?", audience: "Alle Eltern und Erziehungsberechtigten", place: "Hirsch Begegnungsst&auml;tte, Hirschgasse 9, 72070 T&uuml;bingen", description: "Schwimmen f&uuml;r alle Kinder informiert zu einem besseren Verst&auml;ndnis von Wassergew&ouml;hnung. Enthalten sind alltagspraktische &Uuml;bungen f&uuml;r Kinder vor dem Schwimmkurs. Eintritt frei, Getr&auml;nke gegen Spende." },
      { year: 2026, month: 11, day: 10, time: "18:00 Uhr", title: "Live-Show mit Miriam Davoudvandi: Das k&ouml;nnen wir uns nicht leisten", audience: "Alle Interessierten", place: "Gemeindehaus Lamm, Gro&szlig;er Saal 1, Am Markt 7, T&uuml;bingen", description: "Was es bedeutet, in Deutschland arm aufzuwachsen: Journalistin und Podcasterin Miriam Davoudvandi (aka Cashmiri) bringt mit dem aktuellen Buch „Das k&ouml;nnen wir uns nicht leisten“ ihre Geschichte mit Texten, pers&ouml;nlichen Geschichten, Humor und Pop auf die B&uuml;hne." },
      { year: 2026, month: 11, day: 10, time: "17:00–19:00 Uhr", title: "Das Geheimnis des Bildungserfolgs, Teil 1: Entwicklungsaufgaben", audience: "Eltern von Kindern der 1. bis 6. Klasse", place: "Br&uuml;ckenhaus, Werkstra&szlig;e 8, 72074 T&uuml;bingen", description: "Teil 1: Entwicklungsaufgaben, Eltern-Kind-Bindung, Mutter und Vater als Unterst&uuml;tzer*innen, Lernen und Selbstwirksamkeit. Wie k&ouml;nnen Eltern ihr Kind unterst&uuml;tzen, damit es in der Schule gut zurechtkommt? Zu diesen Fragen gibt es jeweils einen kurzen Vortrag auf Deutsch, Englisch, Arabisch und Persisch." },
      { year: 2026, month: 11, day: 11, time: "19:00–21:00 Uhr", title: "„Zu Hause in einer Erziehungsstelle“ – Podiumsdiskussion", audience: "Eltern", place: "Lorettoplatz 30, T&uuml;bingen", description: "Vorstellung von kit jugendhilfe mit dem Schwerpunkt auf professionellen Pflegefamilien und anschlie&szlig;ender Diskussionsrunde. Eine kurze R&uuml;ckmeldung zur Teilnahme w&auml;re sch&ouml;n, ist aber nicht zwingend notwendig.", link: "mailto:andrea.leitgeb@kit-jugendhilfe.de" },
      { year: 2026, month: 11, day: 15, time: "14:00–17:00 Uhr", title: "Familienbasteln im Caf&eacute; frieDa", audience: "Familien mit Kindern, 0 bis 99 Jahre", place: "Caf&eacute; frieDa, Friedrich-Dannenmann-Stra&szlig;e 69, 72070 T&uuml;bingen", description: "Bunte Bastelstunde im Caf&eacute; frieDa mit Angeboten f&uuml;r die ganz Kleinen und Gr&ouml;&szlig;eren. Unter anderem werden Leinenbeutel bemalt und bedruckt. F&uuml;r die gro&szlig;en G&auml;ste gibt es Kaffee und Kuchen auf Spendenbasis. Keine Anmeldung erforderlich." },
      { year: 2026, month: 11, day: 17, time: "17:00–19:00 Uhr", title: "Das Geheimnis des Bildungserfolgs, Teil 2: Erfolg in Schule, Bildung und Teilhabe", audience: "Eltern von Kindern der 1. bis 6. Klasse", place: "Br&uuml;ckenhaus, Werkstra&szlig;e 8, 72074 T&uuml;bingen", description: "Das Geheimnis des Bildungserfolgs – was Ihr Kind von Ihnen als Mutter und Vater braucht. Drei internationale Pr&auml;senz-Elternabende auf Deutsch, Englisch, Arabisch und Persisch f&uuml;r Eltern von Kindern der 1. bis 6. Klasse." },
      { year: 2026, month: 11, day: 19, time: "09:30–11:30 Uhr", title: "Zutaten f&uuml;r ein starkes Familienleben", audience: "Eltern mit Kindern im Alter von 0 bis 3 Jahren", place: "Jugend- und Familienberatungszentrum T&uuml;bingen, Bismarckstra&szlig;e 110, 72072 T&uuml;bingen, 2. Stock", description: "Rezeptideen f&uuml;r ein starkes Familienleben – Zutaten: Feinf&uuml;hligkeit, Zeit, Vertrauen und mehr. In gem&uuml;tlicher und kleinkindorientierter Atmosph&auml;re wird gemeinsam dar&uuml;ber gesprochen, was f&uuml;r ein starkes Familienleben sorgt.", link: "mailto:fruehehilfen@kreis-tuebingen.de" },
      { year: 2026, month: 11, day: 21, time: "10:00–15:00 Uhr", title: "Bastelspa&szlig; f&uuml;r die ganze Familie – Thanksgiving Edition", audience: "Familien mit Kindern aller Altersgruppen", place: "d.a.i. T&uuml;bingen, Karlstra&szlig;e 3, Bibliothek", description: "Kommen Sie ins d.a.i. T&uuml;bingen und basteln Sie gemeinsam wundersch&ouml;ne Thanksgiving-Dekorationen. Feiern Sie den Tag der Dankbarkeit bei einer gem&uuml;tlichen Bastelrunde in der d.a.i.-Bibliothek." },
      { year: 2026, month: 11, day: 24, time: "17:00–19:00 Uhr", title: "Das Geheimnis des Bildungserfolgs, Teil 3: Medienerziehung", audience: "Eltern von Kindern der 1. bis 6. Klasse", place: "Br&uuml;ckenhaus, Werkstra&szlig;e 8, 72074 T&uuml;bingen", description: "Das Geheimnis des Bildungserfolgs – was Ihr Kind von Ihnen als Mutter und Vater braucht. Drei internationale Pr&auml;senz-Elternabende auf Deutsch, Englisch, Arabisch und Persisch." },
      { year: 2026, month: 11, day: 24, time: "Ganzt&auml;gig", title: "Gemeinsam gegen Abfall – Papierrecycling in der Stadtb&uuml;cherei", audience: "Familien", place: "Stadtb&uuml;cherei T&uuml;bingen, Nonnengasse 19, T&uuml;bingen", description: "Im Rahmen der Europ&auml;ischen Woche der Abfallvermeidung bietet die Stadtb&uuml;cherei T&uuml;bingen eine besondere Mitmachaktion an: An einem Papierbindetisch k&ouml;nnen aus einseitig bedrucktem Altpapier Spiralbl&ouml;cke hergestellt werden. Papier ist vor Ort verf&uuml;gbar, kann aber auch gerne mitgebracht werden." },
      { year: 2026, month: 11, day: 25, time: "Ganzt&auml;gig", title: "Gemeinsam gegen Abfall – Papierrecycling in der Stadtb&uuml;cherei", audience: "Familien", place: "Stadtb&uuml;cherei T&uuml;bingen, Nonnengasse 19, T&uuml;bingen", description: "Im Rahmen der Europ&auml;ischen Woche der Abfallvermeidung bietet die Stadtb&uuml;cherei T&uuml;bingen eine besondere Mitmachaktion an: An einem Papierbindetisch k&ouml;nnen aus einseitig bedrucktem Altpapier Spiralbl&ouml;cke hergestellt werden. Papier ist vor Ort verf&uuml;gbar, kann aber auch gerne mitgebracht werden." },
      { year: 2026, month: 11, day: 26, time: "Ganzt&auml;gig", title: "Gemeinsam gegen Abfall – Papierrecycling in der Stadtb&uuml;cherei", audience: "Familien", place: "Stadtb&uuml;cherei T&uuml;bingen, Nonnengasse 19, T&uuml;bingen", description: "Im Rahmen der Europ&auml;ischen Woche der Abfallvermeidung bietet die Stadtb&uuml;cherei T&uuml;bingen eine besondere Mitmachaktion an: An einem Papierbindetisch k&ouml;nnen aus einseitig bedrucktem Altpapier Spiralbl&ouml;cke hergestellt werden. Papier ist vor Ort verf&uuml;gbar, kann aber auch gerne mitgebracht werden." }
    ];


let selectedDay = null;
    /*
      =====================================================
      AB HIER NICHTS MEHR ÄNDERN (au&szlig;er bei Bedarf)
      =====================================================
    */


const weekdays = ["Mo","Di","Mi","Do","Fr","Sa","So"];
    const monthNames = { 10: "Oktober", 11: "November", 12: "Dezember" };
    const weekdayNames = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"];


function saveData(){
     function getDaysInMonth(year, month) {
     renderCalendar();
      return new Date(year, month, 0).getDate();
}
 
function renderCalendar(){
 
    const cal = document.getElementById("calendar");
    cal.innerHTML = "";
 
    weekdays.forEach(day=>{
        const div = document.createElement("div");
        div.className = "weekday";
        div.textContent = day;
        cal.appendChild(div);
    });
 
    const firstDay = new Date(2026,7,1);
 
    let offset = firstDay.getDay();
    offset = offset === 0 ? 6 : offset - 1;
 
    for(let i=0;i<offset;i++){
        const empty = document.createElement("div");
        empty.className = "empty";
        cal.appendChild(empty);
     }
     }


     for(let day=1; day<=31; day++){
     function getWeekday(year, month, day) {
 
      const date = new Date(year, month - 1, day);
        const div = document.createElement("div");
      let wd = date.getDay(); // 0 = Sonntag
        div.className = "day";
      return wd === 0 ? 6 : wd - 1; // 0 = Montag
 
        div.onclick = () => openDay(day);
 
        const dayNumber = document.createElement("div");
        dayNumber.className = "day-number";
        dayNumber.textContent = day;
 
        div.appendChild(dayNumber);
 
        const entries = data[day] || [];
 
        entries.forEach(entry=>{
            const e = document.createElement("div");
            e.className = "entry";
            e.textContent = entry.angebot || "(ohne Titel)";
            div.appendChild(e);
        });
 
        cal.appendChild(div);
     }
     }
}
function openDay(day){


     selectedDay = day;
     function escapeHtml(str) {
 
      return str
    document.getElementById("modal").style.display="flex";
        .replace(/&/g, "&amp;")
    document.getElementById("modalDate").textContent =
         .replace(/</g, "&lt;")
         `Samstag, ${day}. August 2026`.replace("Samstag", new Date(2026,7,day)
         .replace(/>/g, "&gt;")
         .toLocaleDateString("de-DE",{weekday:"long"}));
        .replace(/"/g, "&quot;");
 
    renderEntries();
}
 
function closeModal(){
    document.getElementById("modal").style.display="none";
}
 
function renderEntries(){
 
    const container = document.getElementById("entriesContainer");
    container.innerHTML = "";
 
    if(!data[selectedDay]){
        data[selectedDay] = [];
     }
     }


     data[selectedDay].forEach((entry,index)=>{
     function renderCalendar() {
      const container = document.getElementById("calendar");
      const monthsToRender = [10, 11, 12];


         const card = document.createElement("div");
      monthsToRender.forEach(month => {
         card.className = "entry-card";
         const monthEvents = events.filter(e => e.month === month && e.year === 2026);
         if (monthEvents.length === 0) return;


         card.innerHTML = `
         const section = document.createElement("section");
            <label>Angebot</label>
        section.className = "month";
            <input value="${entry.angebot || ''}" onchange="updateField(${index},'angebot',this.value)">
        section.setAttribute("aria-labelledby", `month-${month}`);


            <label>Uhrzeit</label>
        const heading = document.createElement("h2");
            <input value="${entry.uhrzeit || ''}" onchange="updateField(${index},'uhrzeit',this.value)">
        heading.id = `month-${month}`;
        heading.textContent = `${monthNames[month]} 2026`;
        section.appendChild(heading);


            <label>Treffpunkt/Ort</label>
        const weekdays = document.createElement("div");
            <input value="${entry.ort || ''}" onchange="updateField(${index},'ort',this.value)">
        weekdays.className = "weekdays";
        weekdays.setAttribute("aria-hidden", "true");
        weekdayNames.forEach(name => {
          const div = document.createElement("div");
          div.textContent = name;
          weekdays.appendChild(div);
        });
        section.appendChild(weekdays);


            <label>Zielgruppe</label>
        const grid = document.createElement("div");
            <input value="${entry.zielgruppe || ''}" onchange="updateField(${index},'zielgruppe',this.value)">
        grid.className = "grid";


            <label>Anmeldung</label>
        const daysInMonth = getDaysInMonth(2026, month);
            <input value="${entry.anmeldung || ''}" onchange="updateField(${index},'anmeldung',this.value)">
        const firstWeekday = getWeekday(2026, month, 1);


            <label>Link zum Angebot</label>
        // Leere Tage vor dem 1. des Monats
            <input value="${entry.link || ''}" onchange="updateField(${index},'link',this.value)">
        for (let i = 0; i < firstWeekday; i++) {
          const prevDay = getDaysInMonth(2026, month - 1) - firstWeekday + 1 + i;
          const dayDiv = document.createElement("div");
          dayDiv.className = "day muted";
          const dn = document.createElement("div");
          dn.className = "dn";
          dn.textContent = prevDay;
          dayDiv.appendChild(dn);
          grid.appendChild(dayDiv);
        }


            <label>Beschreibung</label>
        // Eigentliche Tage
            <textarea rows="4" onchange="updateField(${index},'beschreibung',this.value)">${entry.beschreibung || ''}</textarea>
        for (let day = 1; day <= daysInMonth; day++) {
          const dayEvents = monthEvents.filter(e => e.day === day);
          const dayDiv = document.createElement("div");
          dayDiv.className = "day";
          if (dayEvents.length > 0) dayDiv.classList.add("has-events");


          <div class="actions">
          const dn = document.createElement("div");
    <button onclick="copyEntryToDate(${index})">
          dn.className = "dn";
        Auf anderes Datum kopieren
          dn.textContent = day;
    </button>
          dayDiv.appendChild(dn);


    <button onclick="deleteEntry(${index})">
          dayEvents.forEach(ev => {
        Löschen
            const btn = document.createElement("button");
    </button>
            btn.type = "button";
</div>
            btn.className = "event";
        `;
            btn.setAttribute("data-date", `${day}. ${monthNames[month]} 2026`);
            btn.setAttribute("data-time", ev.time);
            btn.setAttribute("data-audience", ev.audience);
            btn.setAttribute("data-place", ev.place);
            btn.setAttribute("data-description", ev.description);
            if (ev.link) btn.setAttribute("data-link", ev.link);


        container.appendChild(card);
            const timeSpan = document.createElement("span");
    });
            timeSpan.className = "event-time";
}
            timeSpan.textContent = ev.time;
function copyEntryToDate(index){


    const targetDay = prompt(
            const titleSpan = document.createElement("span");
        "Auf welchen Tag im August kopieren? (1-31)"
            titleSpan.className = "et";
    );
            titleSpan.textContent = ev.title;


    if(!targetDay) return;
            btn.appendChild(timeSpan);
            btn.appendChild(titleSpan);
            dayDiv.appendChild(btn);
          });


    const day = parseInt(targetDay);
          grid.appendChild(dayDiv);
        }


    if(day < 1 || day > 31){
        // Leere Tage nach dem letzten Tag des Monats (auff&uuml;llen auf volle Wochen)
        alert("Ungültiger Tag.");
        const totalCells = firstWeekday + daysInMonth;
        return;
        const remaining = (7 - (totalCells % 7)) % 7;
    }
        for (let i = 1; i <= remaining; i++) {
          const dayDiv = document.createElement("div");
          dayDiv.className = "day muted";
          const dn = document.createElement("div");
          dn.className = "dn";
          dn.textContent = i;
          dayDiv.appendChild(dn);
          grid.appendChild(dayDiv);
        }


    if(!data[day]){
        section.appendChild(grid);
         data[day] = [];
         container.appendChild(section);
      });
     }
     }


     const copy = JSON.parse(
     // Dialog-Logik
        JSON.stringify(data[selectedDay][index])
    (() => {
    );
      const dialog = document.getElementById("eventDialog");
      const closeButton = document.getElementById("dialogClose");
      const title = document.getElementById("dialogTitle");
      const date = document.getElementById("dialogDate");
      const time = document.getElementById("dialogTime");
      const audience = document.getElementById("dialogAudience");
      const place = document.getElementById("dialogPlace");
      const description = document.getElementById("dialogDescription");
      const linkRow = document.getElementById("dialogLinkRow");
      const link = document.getElementById("dialogLink");


    data[day].push(copy);
      document.addEventListener("click", (event) => {
        if (!event.target.classList.contains("event")) return;
        const btn = event.target;
        title.textContent = btn.querySelector(".et").textContent.trim();
        date.textContent = btn.dataset.date || "";
        time.textContent = btn.dataset.time || "Nicht angegeben";
        audience.textContent = btn.dataset.audience || "Nicht angegeben";
        place.textContent = btn.dataset.place || "Nicht angegeben";
        description.textContent = btn.dataset.description || "Keine Beschreibung vorhanden.";


    saveData();
        const url = btn.dataset.link;
        if (url) {
          linkRow.hidden = false;
          link.href = url;
          link.textContent = url.startsWith("mailto:") ? url.replace("mailto:", "") : url;
          link.target = url.startsWith("mailto:") ? "_self" : "_blank";
        } else {
          linkRow.hidden = true;
          link.removeAttribute("href");
          link.textContent = "";
        }


    alert(
         dialog.showModal();
        "Termin wurde auf den "
      });
        + day +
         ". August kopiert."
    );
}
function addEntry(){


    data[selectedDay].push({
      closeButton.addEventListener("click", () => dialog.close());
        angebot:"",
      dialog.addEventListener("click", (event) => {
        uhrzeit:"",
         if (event.target === dialog) dialog.close();
        ort:"",
      });
        zielgruppe:"",
     })();
        anmeldung:"",
        link:"",
        beschreibung:""
    });
 
    saveData();
    renderEntries();
}
 
function updateField(index, field, value){
 
    data[selectedDay][index][field] = value;
 
    saveData();
}
 
function deleteEntry(index){
 
    if(confirm("Eintrag löschen?")){
 
        data[selectedDay].splice(index,1);
 
        saveData();
        renderEntries();
    }
}
 
function copyEntry(index){
 
    const copy = JSON.parse(
        JSON.stringify(data[selectedDay][index])
    );
 
    data[selectedDay].push(copy);
 
    saveData();
    renderEntries();
}
 
function exportData(){
 
    const blob = new Blob(
         [JSON.stringify(data,null,2)],
        {type:"application/json"}
    );
 
    const a = document.createElement("a");
    a.href = URL.createObjectURL(blob);
    a.download = "familienangebote_august_2026.json";
    a.click();
}
 
function importData(event){
 
    const file = event.target.files[0];
    if(!file) return;
 
    const reader = new FileReader();
 
    reader.onload = e => {
 
        data = JSON.parse(e.target.result);
 
        saveData();
 
        alert("Import erfolgreich.");
     };
 
    reader.readAsText(file);
}
 
renderCalendar();
 
</script>


    // Kalender beim Laden rendern
    renderCalendar();
  </script>
</body>
</body>
</html>
</html>

Aktuelle Version vom 7. September 2026, 12:25 Uhr

<!doctype html> Viele Formen von Familie – Programm 2026

Viele Formen von Familie

Hier findet ihr eine Übersicht über das gesamte Programm zur Ausstellung. Die Ausstellung ist von Anfang Oktober bis Dezember 2026 in der Hauptstelle der Stadtbibliothek (Kinder- und Jugendbereich sowie 1. Stock) und im Stadtmuseum zu sehen.

In Kl&ruml;rung: Kino – drei Sonntagsmatineen mit Familienfilmen.

Uhrzeit
Zielgruppe
Treffpunkt
Beschreibung