Testseite: Unterschied zwischen den Versionen
Aus Bündnis für Familie Tübingen.
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 8: | Zeile 8: | ||
body { | body { | ||
font-family: | font-family: 'Segoe UI', system-ui, sans-serif; | ||
background: # | background: #f0f4f8; | ||
color: # | color: #1a202c; | ||
min-height: 100vh; | |||
padding: 1.5rem 1rem 3rem; | padding: 1.5rem 1rem 3rem; | ||
} | } | ||
header { text-align: center; margin-bottom: 1.75rem; } | |||
header h1 { | |||
font-size: clamp(1.5rem, 5vw, 2.25rem); | |||
font-size: 1. | |||
font-weight: 700; | font-weight: 700; | ||
letter-spacing: -0.02em; | |||
letter-spacing: -0. | color: #1a202c; | ||
} | } | ||
header p { color: #64748b; font-size: 0.9rem; margin-top: 0.3rem; } | |||
.calendar { | |||
max-width: 900px; | |||
margin: 0 auto; | |||
background: #fff; | |||
border-radius: 16px; | |||
overflow: hidden; | |||
box-shadow: 0 4px 24px rgba(0,0,0,.08); | |||
} | } | ||
.weekdays { | |||
. | |||
display: grid; | display: grid; | ||
grid-template-columns: repeat(7, 1fr); | grid-template-columns: repeat(7, 1fr); | ||
background: #1e3a5f; | |||
color: #fff; | |||
} | } | ||
.weekdays span { | |||
. | |||
text-align: center; | text-align: center; | ||
padding: 0. | padding: 0.65rem 0; | ||
font-size: 0. | font-size: 0.75rem; | ||
font-weight: 600; | font-weight: 600; | ||
letter-spacing: 0.06em; | |||
letter-spacing: 0. | |||
text-transform: uppercase; | text-transform: uppercase; | ||
} | } | ||
.days { | |||
display: grid; | |||
grid-template-columns: repeat(7, 1fr); | |||
border-left: 1px solid #e2e8f0; | |||
border-top: 1px solid #e2e8f0; | |||
} | } | ||
.day { | .day { | ||
min-height: 90px; | min-height: 90px; | ||
padding: 0. | padding: 0.45rem; | ||
background: # | border-right: 1px solid #e2e8f0; | ||
border-bottom: 1px solid #e2e8f0; | |||
background: #fff; | |||
display: flex; | display: flex; | ||
flex-direction: column; | flex-direction: column; | ||
gap: 0.3rem; | gap: 0.3rem; | ||
} | } | ||
.day | .day.empty { background: #f8fafc; } | ||
.day.today .day-number { | |||
color: # | background: #1e3a5f; | ||
color: #fff; | |||
width: | border-radius: 50%; | ||
height: | width: 26px; | ||
height: 26px; | |||
display: flex; | display: flex; | ||
align-items: center; | align-items: center; | ||
justify-content: center; | justify-content: center; | ||
} | } | ||
.day-number { | |||
font-size: 0.8rem; | |||
font-weight: 600; | |||
color: #475569; | |||
line-height: 1; | |||
margin-bottom: 0.1rem; | |||
} | |||
. | .event-chip { | ||
background: #dbeafe; | |||
background: # | border-left: 3px solid #2563eb; | ||
border-left: 3px solid # | border-radius: 4px; | ||
border-radius: | padding: 0.2rem 0.35rem; | ||
padding: 0. | font-size: 0.7rem; | ||
font-size: 0. | line-height: 1.3; | ||
line-height: 1. | |||
cursor: pointer; | cursor: pointer; | ||
transition: background 0.15s, transform 0.1s; | transition: background 0.15s, transform 0.1s; | ||
word-break: break-word; | |||
} | |||
.event-chip:hover { background: #bfdbfe; transform: translateY(-1px); } | |||
.event-chip .chip-time { | |||
font-weight: 700; | |||
color: #1d4ed8; | |||
display: block; | |||
} | } | ||
. | |||
.event-chip .chip-title { | |||
color: #1e3a5f; | |||
display: block; | |||
white-space: nowrap; | |||
overflow: hidden; | |||
text-overflow: ellipsis; | |||
} | } | ||
.modal-overlay { | |||
. | |||
display: none; | display: none; | ||
position: fixed; | position: fixed; | ||
inset: 0; | inset: 0; | ||
background: rgba(15, 23, 42, 0. | background: rgba(15, 23, 42, 0.55); | ||
z-index: 100; | |||
align-items: center; | |||
justify-content: center; | |||
padding: 1rem; | |||
} | } | ||
.modal-overlay.open { display: flex; } | |||
. | |||
.modal { | |||
background: #fff; | background: #fff; | ||
border-radius: 16px; | border-radius: 16px; | ||
max-width: | max-width: 480px; | ||
width: | width: 100%; | ||
padding: 2rem; | padding: 2rem; | ||
box-shadow: 0 20px 60px rgba(0,0,0, | position: relative; | ||
box-shadow: 0 20px 60px rgba(0,0,0,.2); | |||
animation: pop .18s ease-out; | |||
} | |||
@keyframes pop { | |||
from { opacity: 0; transform: scale(.94); } | |||
to { opacity: 1; transform: scale(1); } | |||
} | |||
.modal-close { | |||
position: absolute; | |||
top: 1rem; | |||
right: 1rem; | |||
background: #f1f5f9; | |||
border: none; | |||
border-radius: 50%; | |||
width: 32px; | |||
height: 32px; | |||
cursor: pointer; | |||
font-size: 1rem; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
color: #64748b; | |||
transition: background .15s; | |||
} | } | ||
. | .modal-close:hover { background: #e2e8f0; } | ||
. | .modal-date { | ||
font-size: 0. | font-size: 0.8rem; | ||
font-weight: 600; | font-weight: 600; | ||
letter-spacing: 0.05em; | |||
letter-spacing: 0. | |||
text-transform: uppercase; | text-transform: uppercase; | ||
color: #2563eb; | |||
margin-bottom: 0.4rem; | margin-bottom: 0.4rem; | ||
} | } | ||
. | |||
.modal-title { | |||
font-size: 1.3rem; | font-size: 1.3rem; | ||
font-weight: 700; | font-weight: 700; | ||
color: # | color: #1a202c; | ||
margin-bottom: 0.6rem; | |||
margin-bottom: 0. | |||
line-height: 1.3; | line-height: 1.3; | ||
} | } | ||
. | |||
.modal-time { | |||
display: inline-flex; | display: inline-flex; | ||
align-items: center; | align-items: center; | ||
gap: 0. | gap: 0.4rem; | ||
font-size: 0. | background: #f0f9ff; | ||
color: #0369a1; | |||
border-radius: 6px; | |||
padding: 0.3rem 0.7rem; | |||
font-size: 0.85rem; | |||
font-weight: 600; | font-weight: 600; | ||
margin-bottom: 1rem; | margin-bottom: 1rem; | ||
} | } | ||
. | |||
font-size: 0. | .modal-note { | ||
font-size: 0.9rem; | |||
color: #475569; | color: #475569; | ||
line-height: 1. | line-height: 1.6; | ||
margin-bottom: 1. | margin-bottom: 1.2rem; | ||
} | } | ||
. | |||
.modal-link { | |||
display: inline-flex; | display: inline-flex; | ||
align-items: center; | align-items: center; | ||
gap: 0.4rem; | gap: 0.4rem; | ||
background: # | background: #1e3a5f; | ||
color: #fff; | color: #fff; | ||
text-decoration: none; | text-decoration: none; | ||
font-size: 0. | border-radius: 8px; | ||
padding: 0.55rem 1.1rem; | |||
font-size: 0.85rem; | |||
font-weight: 600; | font-weight: 600; | ||
transition: background .15s; | |||
transition: background | |||
} | } | ||
.modal-link:hover { background: #2563eb; } | |||
. | |||
@media (max-width: 600px) { | |||
@media (max-width: | .weekdays span { font-size: 0.62rem; } | ||
.day { min-height: 60px; padding: 0.3rem; } | |||
.event-chip { font-size: 0.62rem; padding: 0.15rem 0.25rem; } | |||
.event-chip .chip-title { display: none; } | |||
. | |||
.day | |||
. | |||
.chip-title { display: none; } | |||
} | } | ||
</style> | </style> | ||
| Zeile 229: | Zeile 230: | ||
<body> | <body> | ||
< | <header> | ||
< | <h1>August 2026</h1> | ||
<p>Klick auf einen Termin | <p>Klick auf einen Termin fur mehr Details</p> | ||
</header> | |||
<div class="calendar"> | |||
<div class="weekdays"> | |||
<span>Mo</span><span>Di</span><span>Mi</span><span>Do</span><span>Fr</span><span>Sa</span><span>So</span> | |||
</div> | |||
<div class="days" id="calGrid"></div> | |||
</div> | </div> | ||
<div class=" | <div class="modal-overlay" id="modalOverlay" role="dialog" aria-modal="true"> | ||
< | <div class="modal"> | ||
<button class="modal-close" id="modalClose" aria-label="Schliessen">✕</button> | |||
<div class="modal-date" id="mDate"></div> | |||
<div class="modal-title" id="mTitle"></div> | |||
<div class="modal-time">🕐 <span id="mTimeText"></span></div> | |||
<div class="modal-note" id="mNote"></div> | |||
< | <a class="modal-link" id="mLink" href="#" target="_blank" rel="noopener"> | ||
🔗 Mehr Infos | |||
</a> | |||
</div> | |||
</div> | |||
<script> | |||
// ================================================== | |||
// TERMINE - hier pflegen | |||
// ================================================== | |||
var events = [ | |||
{ | |||
datum: "2026-08-05", | |||
titel: "Stadtfest Reutlingen", | |||
uhrzeit: "14:00", | |||
zusatztext: "Das jaehrliche Stadtfest in der Innenstadt mit Live-Musik, Essen und Marktstaenden. Parkplaetze sind begrenzt - Anreise mit OPNV empfohlen.", | |||
url: "https://www.reutlingen.de" | |||
}, | |||
{ | |||
datum: "2026-08-12", | |||
titel: "Team-Meeting Q3", | |||
uhrzeit: "09:30", | |||
zusatztext: "Quartals-Review mit allen Abteilungen. Bitte Berichte bis 08.08. einreichen. Video-Call-Link wird separat verschickt.", | |||
url: "https://meet.example.com/q3-review" | |||
}, | |||
{ | |||
datum: "2026-08-22", | |||
titel: "Open-Air Kino", | |||
uhrzeit: "21:00", | |||
zusatztext: "Filmabend im Stadtpark - gezeigt wird Cinema Paradiso (1988). Einlass ab 20:00 Uhr, Decke und Sitzkissen empfohlen. Eintritt frei.", | |||
url: "https://www.openair-kino-beispiel.de" | |||
} | |||
]; | |||
// ================================================== | |||
var byDate = {}; | |||
events.forEach(function(e) { | |||
if (!byDate[e.datum]) byDate[e.datum] = []; | |||
byDate[e.datum].push(e); | |||
}); | |||
var grid = document.getElementById('calGrid'); | |||
var year = 2026; | |||
var month = 7; | |||
var firstDay = new Date(year, month, 1).getDay(); | |||
var offset = (firstDay + 6) % 7; | |||
var daysInMonth = new Date(year, month + 1, 0).getDate(); | |||
var today = new Date(); | |||
for (var i = 0; i < offset; i++) { | |||
var empty = document.createElement('div'); | |||
empty.className = 'day empty'; | |||
grid.appendChild(empty); | |||
} | |||
for (var d = 1; d <= daysInMonth; d++) { | |||
var cell = document.createElement('div'); | |||
cell.className = 'day'; | |||
var isToday = today.getFullYear() === year | |||
&& today.getMonth() === month | |||
&& today.getDate() === d; | |||
if (isToday) cell.classList.add('today'); | |||
var num = document.createElement('div'); | |||
num.className = 'day-number'; | |||
num.textContent = d; | |||
cell.appendChild(num); | |||
var mm = String(month + 1).padStart(2, '0'); | |||
var dd = String(d).padStart(2, '0'); | |||
var dateKey = year + '-' + mm + '-' + dd; | |||
if (byDate[dateKey]) { | |||
byDate[dateKey].forEach(function(ev) { | |||
var chip = document.createElement('div'); | |||
chip.className = 'event-chip'; | |||
var timeSpan = document.createElement('span'); | |||
timeSpan.className = 'chip-time'; | |||
timeSpan.textContent = ev.uhrzeit; | |||
var titleSpan = document.createElement('span'); | |||
titleSpan.className = 'chip-title'; | |||
titleSpan.textContent = ev.titel; | |||
== | |||
chip.appendChild(timeSpan); | |||
chip.appendChild(titleSpan); | |||
chip.addEventListener('click', (function(evData) { | |||
return function() { openModal(evData); }; | |||
})(ev)); | |||
cell.appendChild(chip); | |||
}); | |||
} | |||
grid.appendChild(cell); | |||
} | |||
var overlay = document.getElementById('modalOverlay'); | |||
var btnClose = document.getElementById('modalClose'); | |||
function openModal(ev) { | |||
var d = new Date(ev.datum + 'T00:00:00'); | |||
document.getElementById('mDate').textContent = | |||
d.toLocaleDateString('de-DE', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }); | |||
document.getElementById('mTitle').textContent = ev.titel; | |||
document.getElementById('mTimeText').textContent = ev.uhrzeit + ' Uhr'; | |||
document.getElementById('mNote').textContent = ev.zusatztext; | |||
var link = document.getElementById('mLink'); | |||
if (ev.url) { | |||
link.href = ev.url; | |||
link.style.display = 'inline-flex'; | |||
} else { | |||
link.style.display = 'none'; | |||
} | |||
overlay.classList.add('open'); | |||
} | |||
function closeModal() { overlay.classList.remove('open'); } | |||
btnClose.addEventListener('click', closeModal); | |||
overlay.addEventListener('click', function(e) { if (e.target === overlay) closeModal(); }); | |||
document.addEventListener('keydown', function(e) { if (e.key === 'Escape') closeModal(); }); | |||
</script> | |||
</body> | </body> | ||
</html> | </html> | ||
Version vom 10. Juni 2026, 11:23 Uhr
August 2026
Klick auf einen Termin fur mehr Details
MoDiMiDoFrSaSo