diff --git a/assets/css/launch.css b/assets/css/launch.css new file mode 100644 index 0000000..a5c8387 --- /dev/null +++ b/assets/css/launch.css @@ -0,0 +1,512 @@ +:root { + color-scheme: light; +} + +:root.dark { + color-scheme: dark; +} + +body { + margin: 0; + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + background: #f5f5f5; + color: #222; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + width: min(700px, calc(100% - 32px)); +} + +.navbar { + position: fixed; + top: 16px; + left: 2%; + width: 96%; + box-sizing: border-box; + z-index: 100; + display: flex; + align-items: center; + gap: 8px; + padding: 15px; + background: rgba(255, 255, 255, 0.2); + -webkit-backdrop-filter: blur(7px); + backdrop-filter: blur(7px); + border-radius: 14px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.30), 0 12px 40px rgba(0, 0, 0, 0.45); +} + +.logo-bar { + display: flex; + align-items: center; + flex: 0 1 auto; + min-width: 0; +} + +.logo-bar img { + display: block; + height: 60px; + max-width: 100%; + width: auto; +} + +.nav-actions { + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: flex-end; + gap: 8px; + margin-left: auto; +} + +/* Hamburger: nur im Phone-Portrait sichtbar. + * "button.nav-toggle" ist spezifischer als ".button", + * sonst überschreibt display: inline-block diese Regel. */ +button.nav-toggle { + display: none; +} + +/* Enger als der globale 6px-Margin der Buttons */ +.navbar .button { + margin: 0; +} + +.lang-menu { + position: relative; +} + +.lang-dropdown { + display: none; + position: absolute; + right: 0; + top: 100%; + min-width: 150px; + margin-top: 6px; + padding: 6px; + background: white; + border-radius: 10px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); +} + +.lang-dropdown.open { + display: block; +} + +.lang-dropdown button { + display: block; + width: 100%; + margin: 0; + padding: 10px 14px; + border: 0; + border-radius: 6px; + background: none; + text-align: left; + font-size: 14px; + font-family: inherit; + cursor: pointer; +} + +.lang-dropdown button:hover { + background: #f0f0f0; +} + +.lang-dropdown button.active { + font-weight: 600; + background: #f0f8ff; +} + +.lang-flag { + width: 20px; + height: 13px; + margin-right: 6px; + border-radius: 2px; + vertical-align: -2px; +} + +.card { + box-sizing: border-box; + width: min(600px, 100%); + padding: 32px; + background: rgba(255, 255, 255, 0.2); + -webkit-backdrop-filter: blur(7px); + backdrop-filter: blur(7px); + border-radius: 14px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.30), 0 12px 40px rgba(0, 0, 0, 0.45); + text-align: center; +} + +h1 { + margin-top: 0; +} + +p { + color: #555; +} + +button, .button { + display: inline-block; + border: 0; + border-radius: 8px; + padding: 12px 20px; + margin: 6px; + font-size: 16px; + font-family: inherit; + cursor: pointer; + text-decoration: none; +} + +.primary { + background: #1f73e8; + color: white; +} + +.secondary { + background: #e9e9e9; + color: #222; +} + +.hidden { + display: none !important; +} + +.status { + margin-top: 24px; + padding: 16px; + border-radius: 8px; + background: #f0f0f0; +} + +.spinner { + display: inline-block; + width: 16px; + height: 16px; + margin-right: 8px; + border: 2px solid #ccc; + border-top-color: #333; + border-radius: 50%; + animation: spin 0.7s linear infinite; + vertical-align: -3px; +} + +.download { + margin-top: 24px; + padding: 20px; + border-radius: 8px; + background: #f5f5f5; +} + +.room { + font-family: monospace; + word-break: break-all; +} + +.error { + padding: 16px; + border-radius: 8px; + background: #fff0f0; + color: #900; +} + +.form-group { + margin-bottom: 16px; + text-align: left; +} + +.form-group label { + display: block; + margin-bottom: 4px; + font-weight: 500; + color: #333; +} + +.form-group input, +.form-group textarea { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 6px; + font-size: 14px; + box-sizing: border-box; +} + +.form-group textarea { + min-height: 80px; + resize: vertical; +} + +.form-actions { + margin-top: 24px; + display: flex; + gap: 12px; + justify-content: center; + flex-wrap: wrap; +} + +.success-message { + margin-top: 24px; + padding: 16px; + border-radius: 8px; + background: #f0f8ff; + color: #0066cc; +} + +.adhoc-result { + margin-top: 24px; + padding: 16px; + border-radius: 8px; + background: #f0fff4; + color: #1a7f37; +} + +.adhoc-link { + margin-top: 12px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + flex-wrap: wrap; +} + +.adhoc-link a { + font-family: monospace; + word-break: break-all; + 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 { + /* 130px räumen die fixe Navbar frei */ + padding-top: 130px; + /* min-height gilt für die Content-Box: Navbar-Freiraum + * abziehen, sonst sitzt die Karte unter der Mitte */ + min-height: calc(100vh - 130px); + } + + .navbar { + top: 8px; + left: 4%; + width: 92%; + padding: 10px; + flex-wrap: wrap; + } + + .logo-bar img { + height: 40px; + } + + button, .button { + padding: 10px 14px; + font-size: 15px; + } + + .card { + padding: 20px; + } +} + +/* Sehr schmale Telefone: noch kompakter */ +@media (max-width: 400px) { + .navbar { + left: 2%; + width: 96%; + padding: 8px; + gap: 6px; + } + + .logo-bar img { + height: 32px; + } + + .nav-actions { + gap: 6px; + } + + .nav-actions .button { + padding: 8px 12px; + font-size: 14px; + } +} + +/* + * Phone-Portrait: Navbar-Aktionen hinter dem + * Hamburger-Button als Dropdown anzeigen. + */ +@media (orientation: portrait) and (max-width: 600px) { + body { + /* Navbar ist hier einzeilig */ + padding-top: 80px; + min-height: calc(100vh - 80px); + } + + button.nav-toggle { + display: inline-flex; + } + + /* ".navbar .button" setzt margin: 0 – deshalb + * höher spezifisch ans Ziel: Button nach rechts */ + .navbar .nav-toggle { + margin-left: auto; + } + + .nav-actions { + display: none; + position: absolute; + top: 100%; + right: 0; + margin: 8px 0 0; + padding: 8px; + min-width: 200px; + background: white; + border-radius: 10px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + flex-direction: column; + align-items: stretch; + } + + .nav-actions.open { + display: flex; + } + + /* Alle Panel-Buttons gleich breit, Text zentriert */ + .nav-actions .button { + text-align: center; + } + + /* Sprach-Button liegt im .lang-menu-Wrapper */ + .nav-actions .lang-menu .button { + display: block; + width: 100%; + box-sizing: border-box; + } + + :root.dark .nav-actions { + background: #242424; + } +} + +/* + * Sicherheit: Hamburger im Landscape grundsätzlich + * ausblenden, falls orientation falsch gemeldet wird. + */ +@media (orientation: landscape) { + button.nav-toggle { + display: none; + } +} + +/* + * Phone-Landscape: schmaler, hoher Karteninhalt – + * einzeilige Navbar (~106px) freihalten. + */ +@media (orientation: landscape) and (max-height: 500px) { + body { + padding-top: 120px; + /* min-height gilt für die Content-Box: Navbar-Freiraum + * abziehen, sonst sitzt die Karte unter der Mitte */ + min-height: calc(100vh - 120px); + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +/* + * Dark-Theme über die Klasse "dark" am html-Element. + * JS setzt sie anhand der gespeicherten Wahl oder der + * System-Einstellung (siehe detectTheme). + */ +:root.dark body { + background: #181818; + color: #eee; +} + +:root.dark .navbar { + background: rgba(36, 36, 36, 0.72); +} + +:root.dark .card { + background: rgba(36, 36, 36, 0.72); +} + +:root.dark .lang-dropdown { + background: #242424; +} + +:root.dark .lang-dropdown button:hover { + background: #303030; +} + +:root.dark .lang-dropdown button.active { + background: #1a3a5a; +} + +:root.dark p { + color: #bbb; +} + +:root.dark .secondary { + background: #444; + color: #eee; +} + +:root.dark .status, +:root.dark .download { + background: #303030; +} + +:root.dark .spinner { + border-color: #555; + border-top-color: #ddd; +} + +:root.dark .form-group label { + color: #ddd; +} + +:root.dark .form-group input, +:root.dark .form-group textarea { + background: #303030; + border-color: #555; + color: #eee; +} + +:root.dark .success-message { + background: #1a3a5a; + color: #99ccff; +} + +:root.dark .adhoc-result { + background: #1c3527; + color: #7ee2a8; +} + +:root.dark .logo-bar img { + filter: url(#logo-dark-tint); +} + +:root.dark .adhoc-link a { + color: #99ccff; +} diff --git a/assets/apple-touch-icon.png b/assets/images/apple-touch-icon.png similarity index 100% rename from assets/apple-touch-icon.png rename to assets/images/apple-touch-icon.png diff --git a/assets/background.png b/assets/images/background.png similarity index 100% rename from assets/background.png rename to assets/images/background.png diff --git a/assets/cn.svg b/assets/images/cn.svg similarity index 100% rename from assets/cn.svg rename to assets/images/cn.svg diff --git a/assets/de.svg b/assets/images/de.svg similarity index 100% rename from assets/de.svg rename to assets/images/de.svg diff --git a/assets/favicon.ico b/assets/images/favicon.ico similarity index 100% rename from assets/favicon.ico rename to assets/images/favicon.ico diff --git a/assets/favicon.svg b/assets/images/favicon.svg similarity index 100% rename from assets/favicon.svg rename to assets/images/favicon.svg diff --git a/assets/fr.svg b/assets/images/fr.svg similarity index 100% rename from assets/fr.svg rename to assets/images/fr.svg diff --git a/assets/logo.svg b/assets/images/logo.svg similarity index 100% rename from assets/logo.svg rename to assets/images/logo.svg diff --git a/assets/uk.svg b/assets/images/uk.svg similarity index 100% rename from assets/uk.svg rename to assets/images/uk.svg diff --git a/assets/launch.js b/assets/launch.js index 4d6ce04..83c036b 100644 --- a/assets/launch.js +++ b/assets/launch.js @@ -21,11 +21,11 @@ const CONFIG = { /* * set wallpaper for webpage */ - backgroundImage: "assets/background.png", + backgroundImage: "assets/images/background.png", /* * Set logo */ - logo: "assets/logo.svg", + logo: "assets/images/logo.svg", /* * Download URLs for jitsi-meet clients */ @@ -162,10 +162,10 @@ const LANGUAGE_NAMES = { }; const LANGUAGE_FLAGS = { - en: "assets/uk.svg", - de: "assets/de.svg", - fr: "assets/fr.svg", - zh: "assets/cn.svg" + en: "assets/images/uk.svg", + de: "assets/images/de.svg", + fr: "assets/images/fr.svg", + zh: "assets/images/cn.svg" }; function updateLanguageMenu() { diff --git a/launch.html b/launch.html index 0c56962..58b7516 100644 --- a/launch.html +++ b/launch.html @@ -5,523 +5,10 @@ Jitsi Meeting - - - - + + + + @@ -552,14 +39,14 @@
- - - - + + + +