diff --git a/.gitmodules b/.gitmodules
index 426d936..5a97d93 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
+[submodule "beautifulhugo"]
+ path = themes/beautifulhugo
+ url = https://github.com/cccb/beautifulhugo.git
[submodule "themes/blowfish"]
path = themes/blowfish
url = https://github.com/nunocoracao/blowfish.git
diff --git a/.hugo-params b/.hugo-params
index 2ef16a1..e3abdb3 100644
--- a/.hugo-params
+++ b/.hugo-params
@@ -1,5 +1 @@
-<<<<<<< HEAD
---baseURL=https://berlin.ccc.de/
-=======
---baseURL=https://berlin.ccc.de/
->>>>>>> staging
+--baseURL=https://berlin.ccc.de/
\ No newline at end of file
diff --git a/assets/css/calendar.css b/assets/css/calendar.css
deleted file mode 100644
index 2806966..0000000
--- a/assets/css/calendar.css
+++ /dev/null
@@ -1,113 +0,0 @@
- .calendar-container {
- display: flex;
- flex-wrap: wrap;
- width: 100%;
- gap: 20px;
- }
- #calendar {
- flex: 1;
- min-width: 300px;
- }
- #event-panel {
- flex: 1;
- min-width: 30%;
- background-color: var(--color-bg-secondary);
- padding: 15px;
- border-radius: 5px;
- min-height: 300px;
- display: none;
- }
- #calendar-controls {
- text-align: center;
- margin-bottom: 10px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- #calendar-controls button {
- background: none;
- border: none;
- font-size: 2em;
- cursor: pointer;
- padding: 5px 15px;
- }
- #calendar-table {
- width: 100%;
- border-collapse: collapse;
- }
- #calendar-table th, #calendar-table td {
- border: 1px;
- padding: 5px;
- text-align: center;
- vertical-align: top;
- height: 50px;
- width: 15%;
- }
- #calendar-table th
- #calendar-table td {
- position: relative;
- cursor: pointer;
- }
- #calendar-table td:hover {
- background-color: rgba(255, 255, 255, 0.2);
- box-shadow: 0 0 20px rgba(255, 255, 255, 0.2);
- }
- .event-dot-greenyellow {
- height: 8px;
- width: 8px;
- background-color: #9acd32;
- border-radius: 50%;
- display: block;
- margin: 5px auto 0;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
- }
- .event-dot-orange {
- height: 8px;
- width: 8px;
- background-color: #ffa500;
- border-radius: 50%;
- display: block;
- margin: 5px auto 0;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
- }
- .event-dot-red {
- height: 8px;
- width: 8px;
- background-color: #ff4500;
- border-radius: 50%;
- display: block;
- margin: 5px auto 0;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
- }
- .selected-day {
- background-color: rgba(255, 255, 255, 0.1);
- box-shadow: 0 0 20px rgba(255, 255, 255, 0.1);
- border-radius: 8px;
- width: 20px;
- height: 20px;
- border: 5px solid grey;
- font-weight: lighter;
- position: relative;
- z-index: 1;
- }
- #event-date {
- font-size: 1.2em;
- margin-bottom: 15px;
- }
- .event-item {
- margin-bottom: 15px;
- padding-bottom: 15px;
- border-bottom: 1px solid var(--color-border);
- }
- .event-title {
- font-weight: bold;
- margin-bottom: 5px;
- }
- .event-time, .event-description {
- font-size: 0.9em;
- margin-bottom: 5px;
- }
- .no-events {
- font-style: italic;
- color: var(--color-text-secondary);
- }
diff --git a/assets/js/calendar.js b/assets/js/calendar.js
deleted file mode 100644
index 5aa9d6b..0000000
--- a/assets/js/calendar.js
+++ /dev/null
@@ -1,445 +0,0 @@
-document.addEventListener('DOMContentLoaded', function() {
- (function(){
- let events = [];
- let eventsByDate = {};
-
- // Funktion zum Parsen der ICS-Datei
- function parseICS(icsText) {
- let events = [];
- let lines = icsText.split(/\r?\n/);
- let event = null;
- lines.forEach(line => {
- if (line.startsWith("BEGIN:VEVENT")) {
- event = {};
- } else if (line.startsWith("END:VEVENT")) {
- if (event) events.push(event);
- event = null;
- } else if (event) {
- let colonIndex = line.indexOf(":");
- if (colonIndex > -1) {
- let key = line.substring(0, colonIndex);
- let value = line.substring(colonIndex + 1);
-
- // Handle properties with parameters (like TZID)
- const baseKey = key.split(";")[0];
-
- if (baseKey === "DTSTART") {
- event.start = value;
- event.startParams = key.includes(";") ? key.substring(key.indexOf(";") + 1) : null;
- } else if (baseKey === "DTEND") {
- event.end = value;
- event.endParams = key.includes(";") ? key.substring(key.indexOf(";") + 1) : null;
- } else if (baseKey === "SUMMARY") {
- event.summary = value;
- } else if (baseKey === "DESCRIPTION") {
- event.description = value;
- } else if (baseKey === "RRULE") {
- event.rrule = value;
- }
- }
- }
- });
- return events;
- }
-
- // Hilfsfunktion: Parst einen ICS-Datum-String ins Format "YYYY-MM-DD"
- function parseDateString(icsDateStr) {
- // Handle different date formats
- if (!icsDateStr) return null;
-
- // For basic date format: YYYYMMDD
- if (icsDateStr.length === 8) {
- let year = icsDateStr.substring(0, 4);
- let month = icsDateStr.substring(4, 6);
- let day = icsDateStr.substring(6, 8);
- return `${year}-${month}-${day}`;
- }
- // For datetime formats: YYYYMMDDTHHmmssZ or YYYYMMDDTHHmmss
- else if (icsDateStr.includes("T")) {
- let year = icsDateStr.substring(0, 4);
- let month = icsDateStr.substring(4, 6);
- let day = icsDateStr.substring(6, 8);
- return `${year}-${month}-${day}`;
- }
- return null;
- }
-
- // Extract date components from different date formats
- function getDateComponents(icsDateStr) {
- if (!icsDateStr) return null;
-
- // Basic handling - extract YYYY, MM, DD regardless of format
- const year = parseInt(icsDateStr.substring(0, 4));
- const month = parseInt(icsDateStr.substring(4, 6)) - 1; // 0-based months
- const day = parseInt(icsDateStr.substring(6, 8));
-
- return { year, month, day };
- }
-
- function expandRecurringEvents(event, year, month) {
- if (!event.rrule) return [event];
-
- const rruleStr = event.rrule;
-
- // Get start date components
- const startComponents = getDateComponents(event.start);
- if (!startComponents) return [event];
-
- const startDate = new Date(
- startComponents.year,
- startComponents.month,
- startComponents.day
- );
-
- const rangeStart = new Date(year, month, 1);
- const rangeEnd = new Date(year, month + 1, 0);
- const expandedEvents = [];
-
- if (rruleStr.includes("FREQ=WEEKLY") && rruleStr.includes("BYDAY")) {
- const bydayMatch = rruleStr.match(/BYDAY=([^;]+)/);
- if (bydayMatch) {
- const dayCode = bydayMatch[1];
- const dayMap = {
- 'MO': 1, 'TU': 2, 'WE': 3, 'TH': 4, 'FR': 5, 'SA': 6, 'SU': 0
- };
- const targetDay = dayMap[dayCode];
-
- if (targetDay !== undefined) {
- // Create events for each matching day in the month
- let day = 1;
- while (day <= rangeEnd.getDate()) {
- const testDate = new Date(year, month, day);
- if (testDate.getDay() === targetDay && testDate >= startDate) {
- const newEvent = {...event};
- const eventDate = formatDateForICS(testDate);
-
- // Preserve time portion from original event
- const timePart = event.start.includes('T') ?
- event.start.substring(event.start.indexOf('T')) : '';
- const endTimePart = event.end.includes('T') ?
- event.end.substring(event.end.indexOf('T')) : '';
-
- newEvent.start = eventDate + timePart;
- newEvent.end = eventDate + endTimePart;
- expandedEvents.push(newEvent);
- }
- day++;
- }
- }
- }
- }
- else if (rruleStr.includes("FREQ=MONTHLY") && rruleStr.includes("BYDAY")) {
- const bydayMatch = rruleStr.match(/BYDAY=([^;]+)/);
- if (bydayMatch) {
- const bydays = bydayMatch[1].split(',');
- const dayMap = {
- 'MO': 1, 'TU': 2, 'WE': 3, 'TH': 4, 'FR': 5, 'SA': 6, 'SU': 0
- };
-
- bydays.forEach(byday => {
- const occurrence = parseInt(byday) || 1;
- const dayCode = byday.slice(-2);
- const dayIndex = dayMap[dayCode];
-
- let day = 1;
- let count = 0;
-
- while (day <= rangeEnd.getDate()) {
- const testDate = new Date(year, month, day);
- if (testDate.getDay() === dayIndex) {
- count++;
- if (count === occurrence || (occurrence < 0 && day > rangeEnd.getDate() + occurrence * 7)) {
- const newEvent = {...event};
- const eventDate = new Date(year, month, day);
-
- // Preserve time portion from original event
- const timePart = event.start.includes('T') ?
- event.start.substring(event.start.indexOf('T')) : '';
- const endTimePart = event.end.includes('T') ?
- event.end.substring(event.end.indexOf('T')) : '';
-
- newEvent.start = formatDateForICS(eventDate) + timePart;
- newEvent.end = formatDateForICS(eventDate) + endTimePart;
- expandedEvents.push(newEvent);
- }
- }
- day++;
- }
- });
- }
- }
-
- return expandedEvents.length > 0 ? expandedEvents : [event];
- }
-
- // Kalender initialisieren
- let currentYear, currentMonth;
- const currentMonthElem = document.getElementById("current-month");
- const calendarBody = document.getElementById("calendar-body");
- const eventPanel = document.getElementById("event-panel");
- const eventDateElem = document.getElementById("event-date");
- const eventDetailsElem = document.getElementById("event-details");
-
- document.getElementById("prev-month").addEventListener("click", function(){
- currentMonth--;
- if (currentMonth < 0) {
- currentMonth = 11;
- currentYear--;
- }
- updateEventsForMonth(currentYear, currentMonth);
- });
- document.getElementById("next-month").addEventListener("click", function(){
- currentMonth++;
- if (currentMonth > 11) {
- currentMonth = 0;
- currentYear++;
- }
- updateEventsForMonth(currentYear, currentMonth);
- });
-
- function updateEventsForMonth(year, month) {
- // Clear existing events for this month view
- eventsByDate = {};
-
- // Process each event, expanding recurring ones
- events.forEach(ev => {
- if (ev.rrule) {
- // For recurring events, expand them for current month
- const expandedEvents = expandRecurringEvents(ev, year, month);
- expandedEvents.forEach(expandedEv => {
- let dateKey = parseDateString(expandedEv.start);
- if (dateKey) {
- if (!eventsByDate[dateKey]) {
- eventsByDate[dateKey] = [];
- }
- eventsByDate[dateKey].push(expandedEv);
- }
- });
- } else {
- // For regular events, check if they fall in current month
- let dateKey = parseDateString(ev.start);
- if (dateKey) {
- // Check if this event belongs to current month view
- const eventYear = parseInt(dateKey.split('-')[0]);
- const eventMonth = parseInt(dateKey.split('-')[1]) - 1;
-
- if (eventYear === year && eventMonth === month) {
- if (!eventsByDate[dateKey]) {
- eventsByDate[dateKey] = [];
- }
- eventsByDate[dateKey].push(ev);
- }
- }
- }
- });
-
- renderCalendar(year, month);
- }
-
- function renderCalendar(year, month) {
- // Setze die Monatsbeschriftung (in Deutsch)
- const monthNames = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
- currentMonthElem.textContent = monthNames[month] + " " + year;
- calendarBody.innerHTML = "";
-
- let firstDay = new Date(year, month, 1);
- let firstDayIndex = (firstDay.getDay() + 6) % 7; // Montag = 0, Dienstag = 1, etc.
- let daysInMonth = new Date(year, month + 1, 0).getDate();
-
- let row = document.createElement("tr");
- // Leere Zellen vor dem 1. Tag
- for (let i = 0; i < firstDayIndex; i++){
- let cell = document.createElement("td");
- row.appendChild(cell);
- }
-
- // Tage hinzufügen
- for (let day = 1; day <= daysInMonth; day++){
- if (row.children.length === 7) {
- calendarBody.appendChild(row);
- row = document.createElement("tr");
- }
- let cell = document.createElement("td");
- cell.innerHTML = "" + day + "";
-
- let dayStr = day < 10 ? "0" + day : day;
- let monthStr = (month + 1) < 10 ? "0" + (month + 1) : (month + 1);
- let dateKey = year + "-" + monthStr + "-" + dayStr;
-
- if (eventsByDate[dateKey]) {
- let dotsContainer = document.createElement("div");
- dotsContainer.className = "event-dots-container";
- cell.classList.add("has-event");
-
- // Gruppe Events nach Typ
- const events = eventsByDate[dateKey];
- const hasMembersOnly = events.some(e => e.summary.toLowerCase().includes("members only"));
- const hasSubbotnik = events.some(e => e.summary.toLowerCase().includes("subbotnik"));
- const hasBastelabend = events.some(e => e.summary.toLowerCase().includes("bastelabend"));
- const hasSpieleabend = events.some(e => e.summary.toLowerCase().includes("spieleabend"));
- const hasRegular = events.some(e => {
- const title = e.summary.toLowerCase();
- return !title.includes("members only") &&
- !title.includes("subbotnik") &&
- !title.includes("bastelabend") &&
- !title.includes("spieleabend");
- });
-
- // Füge Dots entsprechend der Event-Typen hinzu
- if (hasMembersOnly) {
- let dot = document.createElement("div");
- dot.className = "event-dot event-dot-red";
- dotsContainer.appendChild(dot);
- }
- if (hasSubbotnik || hasBastelabend || hasSpieleabend) {
- let dot = document.createElement("div");
- dot.className = "event-dot event-dot-orange";
- dotsContainer.appendChild(dot);
- }
- if (hasRegular) {
- let dot = document.createElement("div");
- dot.className = "event-dot event-dot-greenyellow";
- dotsContainer.appendChild(dot);
- }
-
- cell.appendChild(dotsContainer);
- cell.dataset.dateKey = dateKey;
- cell.addEventListener("click", function() {
- // Clear previous selections
- document.querySelectorAll('.selected-day').forEach(el => {
- el.classList.remove('selected-day');
- });
- cell.classList.add('selected-day');
- showEventDetails(dateKey);
- });
- }
- row.appendChild(cell);
- }
- // Falls die letzte Zeile nicht komplett ist
- while (row.children.length < 7) {
- let cell = document.createElement("td");
- row.appendChild(cell);
- }
- calendarBody.appendChild(row);
- }
-
- function createEventLink(eventTitle) {
- if (eventTitle.startsWith("Datengarten")) {
- // Extract the number after "Datengarten "
- const match = eventTitle.match(/Datengarten\s+(\d+)/i);
- if (match && match[1]) {
- return `https://berlin.ccc.de/datengarten/${match[1]}/`;
- }
- }
-
- // For other titles, convert to lowercase and use as path
- const slug = eventTitle.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '');
- return `https://berlin.ccc.de/page/${slug}/`;
- }
-
- function showEventDetails(dateKey) {
- const events = eventsByDate[dateKey];
- eventDateElem.textContent = formatDate(dateKey);
- eventDetailsElem.innerHTML = "";
-
- if (events && events.length > 0) {
- events.forEach(ev => {
- let eventItem = document.createElement("div");
- eventItem.className = "event-item";
-
- let eventTitle = document.createElement("div");
- eventTitle.className = "event-title";
-
- // Create a link for the event title
- let titleLink = document.createElement("h");
- titleLink.textContent = ev.summary;
- titleLink.target = "_blank";
- eventTitle.appendChild(titleLink);
-
- eventItem.appendChild(eventTitle);
-
- let eventTime = document.createElement("div");
- eventTime.className = "event-time";
- eventTime.textContent = `Start: ${formatTime(ev.start)}, End: ${formatTime(ev.end)}`;
- eventItem.appendChild(eventTime);
-
- if (ev.description) {
- let eventDescription = document.createElement("div");
- eventDescription.className = "event-description";
-
- // Check if the description is a URL and make it a clickable link
- if (ev.description.trim().startsWith('http')) {
- let linkElement = document.createElement("a");
- linkElement.href = ev.description.trim();
- linkElement.textContent = ev.description.trim();
- linkElement.target = "_blank";
- eventDescription.innerHTML = '';
- eventDescription.appendChild(linkElement);
- } else {
- eventDescription.textContent = ev.description;
- }
-
- eventItem.appendChild(eventDescription);
- }
-
- eventDetailsElem.appendChild(eventItem);
- });
- } else {
- let noEvents = document.createElement("div");
- noEvents.className = "no-events";
- noEvents.textContent = "Keine Veranstaltungen an diesem Tag.";
- eventDetailsElem.appendChild(noEvents);
- }
-
- eventPanel.style.display = "block";
- }
-
- function formatDate(dateStr) {
- // Convert YYYY-MM-DD to DD.MM.YYYY
- const parts = dateStr.split("-");
- return `${parts[2]}.${parts[1]}.${parts[0]}`;
- }
-
- function formatTime(icsTimeStr) {
- // Format time for display
- if (!icsTimeStr) return "";
-
- if (icsTimeStr.length === 8) {
- // All-day event
- return "Ganztägig";
- } else if (icsTimeStr.includes("T")) {
- // Time-specific event (with or without timezone)
- const timeStart = icsTimeStr.indexOf("T") + 1;
- const hour = icsTimeStr.substring(timeStart, timeStart + 2);
- const minute = icsTimeStr.substring(timeStart + 2, timeStart + 4);
- return `${hour}:${minute}`;
- }
- return icsTimeStr;
- }
-
- function formatDateForICS(date) {
- const year = date.getFullYear();
- const month = (date.getMonth() + 1).toString().padStart(2, '0');
- const day = date.getDate().toString().padStart(2, '0');
- return `${year}${month}${day}`;
- }
-
- // ICS-Datei abrufen und Events verarbeiten
- fetch('/all.ics')
- .then(response => response.text())
- .then(data => {
- events = parseICS(data);
-
- // Initialize with current date
- let today = new Date();
- currentYear = today.getFullYear();
- currentMonth = today.getMonth();
-
- // Process events for current month
-
- updateEventsForMonth(currentYear, currentMonth);
-
- })
- .catch(err => console.error('Fehler beim Laden der ICS-Datei:', err));
- })();
-});
diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml
index 9090cd4..c48a71e 100644
--- a/config/_default/hugo.toml
+++ b/config/_default/hugo.toml
@@ -8,7 +8,7 @@ defaultContentLanguage = "de"
RelativeURLs = true
CanonifyURLs = true
-pluralizeListTitles = "false" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles
+pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles
enableRobotsTXT = true
summaryLength = 0
diff --git a/config/_default/markup.toml b/config/_default/markup.toml
index 4219cc6..c5449fc 100644
--- a/config/_default/markup.toml
+++ b/config/_default/markup.toml
@@ -9,5 +9,5 @@
noClasses = false
[tableOfContents]
- startLevel = 1
- endLevel = 5
+ startLevel = 2
+ endLevel = 4
diff --git a/config/_default/params.toml b/config/_default/params.toml
index d19b358..68f7772 100644
--- a/config/_default/params.toml
+++ b/config/_default/params.toml
@@ -61,8 +61,8 @@ forgejoDefaultServer = "https://git.berlin.ccc.de"
showDateUpdated = true
showAuthor = false
showAuthorBottom = true
- showHero = true
- heroStyle = "big" # valid options: basic, big, background, thumbAndBackground
+ showHero = false
+ # heroStyle = "basic" # valid options: basic, big, background, thumbAndBackground
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
showBreadcrumbs = true
diff --git a/content/_index.md b/content/_index.md
index 872be10..11b925a 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -6,4 +6,4 @@ description: "Startseite CCCB mit Kurzkalender"
CALENDAR
-Weitere Termine findest du im [Veranstaltungskalender](/verein/calendar/).
+Weitere Termine findest du [hier](/verein/calendar/).
\ No newline at end of file
diff --git a/content/datengarten/106/index.md b/content/datengarten/106/index.md
index 30fca27..9c42a36 100644
--- a/content/datengarten/106/index.md
+++ b/content/datengarten/106/index.md
@@ -1,6 +1,6 @@
---
categories: ["Datengarten"]
-tags: ["IOCCC", "Obfuscation", "Wettbewerb", "Datengarten", "Veranstaltung", "Programming"]
+tags: ["IOCCC", "Obfuscated C", "Wettbewerb", "Datengarten", "Veranstaltung"]
series: "Datengarten"
title: "Datengarten 106"
no: 106
diff --git a/content/datengarten/112/feature-dg-standard-logo.svg b/content/datengarten/112/feature-dg-standard-logo.svg
deleted file mode 100644
index 733a929..0000000
--- a/content/datengarten/112/feature-dg-standard-logo.svg
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
diff --git a/content/datengarten/112/index.md b/content/datengarten/112/index.md
deleted file mode 100644
index c4023db..0000000
--- a/content/datengarten/112/index.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-categories: ["Datengarten"]
-tags: ["Alltag", "Kompression", "Mediendateien", "Datengarten", "Veranstaltung"]
-series: "Datengarten"
-title: "Datengarten 112"
-no: 112
-subtitle: "Ich hab den kleinsten ... Anhang! - Erste Hilfe für sinnvolle Mediendateigrößen"
-speaker: "Volker Diels-Grabsch"
-date: 2025-03-12T19:00:00+01:00
-event:
- start: 2025-03-20T20:00:00+01:00
- end: 2025-03-20T21:30:00+01:00
-location: CCCB
-language: de
-streaming: true
-recording: https://streaming.media.ccc.de/datengarten/cccb
-draft: false
----
-to be done
\ No newline at end of file
diff --git a/content/datengarten/96/index.md b/content/datengarten/96/index.md
index 1be168e..547bbd5 100644
--- a/content/datengarten/96/index.md
+++ b/content/datengarten/96/index.md
@@ -1,6 +1,6 @@
---
categories: ["Datengarten"]
-tags: ["Compiler", "Interpreter", "Programming Language", "Trust", "Programming", "Datengarten", "Veranstaltung"]
+tags: ["Compiler", "Interpreter", "Programming Language", "Trust", "Datengarten", "Veranstaltung"]
series: "Datengarten"
title: "Datengarten 96"
no: 96
diff --git a/content/post/tag_des_offenen_hackerspace/index.md b/content/post/tag_des_offenen_hackerspace/index.md
index 6bb06bd..52ec901 100644
--- a/content/post/tag_des_offenen_hackerspace/index.md
+++ b/content/post/tag_des_offenen_hackerspace/index.md
@@ -4,7 +4,6 @@ subtitle: "Der CCCB lädt ein zum Kennenlernen und Entdecken."
date: 2025-02-10T12:00:00+02:00
dtstart: 20250329T130000
dtend: 20250329T200000
-showHero: false
---
{{< figure
diff --git a/content/veranstaltungen/bastelabend.md b/content/veranstaltungen/bastelabend.md
index 5f3d995..b6d0157 100644
--- a/content/veranstaltungen/bastelabend.md
+++ b/content/veranstaltungen/bastelabend.md
@@ -9,7 +9,6 @@ menu:
main:
parent: "Veranstaltungen"
tag: ["Veranstaltung"]
-draft: true
---
diff --git a/content/veranstaltungen/plenum.md b/content/veranstaltungen/plenum.md
index 202ed96..f96b468 100644
--- a/content/veranstaltungen/plenum.md
+++ b/content/veranstaltungen/plenum.md
@@ -6,7 +6,6 @@ dtstart: 20180704T200000
dtend: 20180704T220000
rrule: "FREQ=MONTHLY;BYDAY=2TU,4TU;INTERVAL=1;WKST=MO"
tags: ["Mitgliedschaft", "Veranstaltung"]
-draft: true
---
Das Plenum findet in der Regel am 2. und 4. Dienstag im Monat ab 20:00 Uhr in den Clubräumen
diff --git a/content/veranstaltungen/subbotnik.md b/content/veranstaltungen/subbotnik.md
index 5e86aa2..589d7a9 100644
--- a/content/veranstaltungen/subbotnik.md
+++ b/content/veranstaltungen/subbotnik.md
@@ -9,7 +9,6 @@ menu:
main:
parent: "Veranstaltungen"
tag: ["Veranstaltung"]
-draft: true
---

diff --git a/content/verein/calendar.md b/content/verein/calendar.md
new file mode 100644
index 0000000..2bd6210
--- /dev/null
+++ b/content/verein/calendar.md
@@ -0,0 +1,604 @@
+---
+title: "Kalender"
+subtitle: "Der Kalender des CCCB"
+date: 2025-02-26T10:00:00+02:00
+menu:
+ main:
+ parent: "Verein"
+tag: ["Verein"]
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Mo |
+ Di |
+ Mi |
+ Do |
+ Fr |
+ Sa |
+ So |
+
+
+
+
+
+
+
+
+
+
+Keinen Termin mehr verpeilen? Einfach den [Veranstaltungskalender abonnieren](all.ics)!
diff --git a/content/verein/calendar/feature-calendar-nachts-geschlossen.jpg b/content/verein/calendar/feature-calendar-nachts-geschlossen.jpg
deleted file mode 100644
index b0c8727..0000000
Binary files a/content/verein/calendar/feature-calendar-nachts-geschlossen.jpg and /dev/null differ
diff --git a/content/verein/calendar/index.md b/content/verein/calendar/index.md
deleted file mode 100644
index 44de0a0..0000000
--- a/content/verein/calendar/index.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "Kalender"
-subtitle: "Der Kalender des CCCB"
-date: 2025-02-26T10:00:00+02:00
-menu:
- main:
- parent: "Verein"
-tag: ["Verein"]
-herostyle: big
-
----
-
-{{< calendar >}}
-
-Keinen Termin mehr verpeilen? Einfach den [Veranstaltungskalender abonnieren](all.ics)!
diff --git a/layouts/shortcodes/calendar.html b/layouts/shortcodes/calendar.html
deleted file mode 100644
index b7e2271..0000000
--- a/layouts/shortcodes/calendar.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{{ $style := resources.Get "css/calendar.css" | resources.ToCSS | resources.Fingerprint }}
-
-
-{{ $js := resources.Get "js/calendar.js" | resources.Fingerprint }}
-
-
-
-
-
-
-
-
-
-
-
-
- | Mo |
- Di |
- Mi |
- Do |
- Fr |
- Sa |
- So |
-
-
-
-
-
-
-
diff --git a/themes/beautifulhugo b/themes/beautifulhugo
new file mode 160000
index 0000000..0699f27
--- /dev/null
+++ b/themes/beautifulhugo
@@ -0,0 +1 @@
+Subproject commit 0699f2797d2b8c2da8a6a28da9ef4a8013f5f858