diff --git a/launch.html b/launch.html index 10e5573..8321767 100644 --- a/launch.html +++ b/launch.html @@ -272,6 +272,53 @@ color: #0066cc; } + /* + * Verhindert abgeschnittene Inhalte, wenn die Karte + * höher als der Viewport ist ("center" schneidet oben ab). + */ + @supports (align-items: safe center) { + body { + align-items: safe center; + } + } + + /* + * Schmale Bildschirme: Navbar umbrechen lassen, + * Abstände und Logo verkleinern. + */ + @media (max-width: 600px) { + body { + align-items: flex-start; + padding-top: 130px; + } + + .navbar { + top: 8px; + left: 4%; + width: 92%; + padding: 10px; + flex-wrap: wrap; + } + + .logo-bar img { + height: 40px; + } + + .nav-actions { + flex-wrap: wrap; + justify-content: flex-end; + } + + button, .button { + padding: 10px 14px; + font-size: 15px; + } + + .card { + padding: 20px; + } + } + @keyframes spin { to { transform: rotate(360deg); @@ -1737,7 +1784,7 @@ function generateICS(meetingName, description, startTime, endTime, organizer) { /* Generate a unique room name from the meeting name */ const roomName = createRoomName(meetingName); - const meetingUrl = `https://${CONFIG.jitsiLauncher}/launch.html?room=${encodeURIComponent(roomName)}`; + const meetingUrl = createLaunchUrl(roomName); /* Format dates for ICS */ const formatICSDate = (date) => { @@ -1935,6 +1982,24 @@ END:VCALENDAR`; * ============================================================ */ + /* + * Zeitspanne, nach der der "Kopiert!"-Text zum + * normalen Button-Label zurückkehrt. + */ + const COPY_RESET_MS = 2000; + + /* + * Launch-URL, die das Meeting im Jitsi-Client öffnet. + * + * Beispiel: + * + * "projekt-kickoff" ergibt + * https://meet.bnvb.eu/launch.html?room=projekt-kickoff + */ + function createLaunchUrl(roomName) { + return `https://${CONFIG.jitsiLauncher}/launch.html?room=${encodeURIComponent(roomName)}`; + } + function createAdhocLink() { const meetingName = meetingNameInput.value.trim(); @@ -1943,13 +2008,14 @@ END:VCALENDAR`; return; } - if (!ROOM_PATTERN.test(createRoomName(meetingName))) { + const roomName = createRoomName(meetingName); + + if (!ROOM_PATTERN.test(roomName)) { alert(getTranslation('creator.meetingNameInvalid') || 'Meeting name may only contain letters, numbers and hyphens'); return; } - const roomName = createRoomName(meetingName); - const url = `https://${CONFIG.jitsiLauncher}/launch.html?room=${encodeURIComponent(roomName)}`; + const url = createLaunchUrl(roomName); adhocLink.href = url; adhocLink.textContent = url; @@ -1961,6 +2027,7 @@ END:VCALENDAR`; async function copyAdhocLink() { const url = adhocLink.href; + /* Clipboard-API, mit Fallback für ältere Browser */ try { await navigator.clipboard.writeText(url); } catch (error) { @@ -1972,10 +2039,11 @@ END:VCALENDAR`; document.body.removeChild(input); } + /* Kurzes Feedback, dann zurück zum normalen Label */ copyAdhocLinkButton.textContent = getTranslation('creator.copiedLabel') || 'Copied!'; setTimeout(() => { copyAdhocLinkButton.textContent = getTranslation('creator.copyLinkButton') || 'Copy Link'; - }, 2000); + }, COPY_RESET_MS); } function cancelCreateMeeting() {