diff --git a/.gitignore b/.gitignore index d279c822a1..896ad4183a 100644 --- a/.gitignore +++ b/.gitignore @@ -55,23 +55,6 @@ Temporary Items .directory .Trash-* -# Ignore all modules except the default modules. -/modules/** -!/modules/default -!/modules/default/** -!/modules/README.md** - -# Ignore changes to the custom css files but keep the sample and main. -/css/* -!/css/custom.css.sample -!/css/main.css -!/css/roboto.css -!/css/font-awesome.css - -# Ignore users config file but keep the sample. -/config/* -!/config/config.js.sample - # Vim ## swap [._]*.s[a-w][a-z] @@ -88,3 +71,6 @@ js/positions.js # Ignore lock files other than package-lock.json pnpm-lock.yaml yarn.lock + +# Sensitive configuration files containing API keys and credentials +config/credentials.js diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000000..e7b59436cf --- /dev/null +++ b/config/README.md @@ -0,0 +1,60 @@ +# MagicMirror Konfiguration + +## 🔐 Sicherheits-Setup + +### Credentials einrichten + +Die sensiblen Daten (API-Keys, Passwörter) sind **nicht** in diesem Repository enthalten. + +**Erstmalige Einrichtung:** + +1. Kopiere die Vorlage: + ```bash + cd config + cp credentials.example.js credentials.js + ``` + +2. Öffne `credentials.js` und trage deine echten Credentials ein + +3. **Wichtig:** Die Datei `credentials.js` wird automatisch von Git ignoriert! + +### Benötigte API-Keys + +- **OpenWeather API:** https://openweathermap.org/api +- **Tankerkönig (Fuel):** https://creativecommons.tankerkoenig.de/ +- **News API:** https://newsapi.org/ +- **Spotify Developer:** https://developer.spotify.com/dashboard/applications + +### Dateien-Übersicht + +- `config.js` - Hauptkonfiguration (OHNE sensible Daten) +- `credentials.js` - Deine persönlichen API-Keys (**NICHT in Git**) +- `credentials.example.js` - Vorlage für neue Installationen (**IN Git**) + +## 📝 Konfiguration anpassen + +Die Hauptkonfiguration befindet sich in `config.js`. Hier kannst du Module, Positionen, Update-Intervalle und mehr anpassen. + +### Standort ändern + +Die Standort-Koordinaten sind in `config.js` unter `locationSettings` definiert: + +```javascript +const locationSettings = { + latitude: 51.100411, + longitude: 6.811775, + city: "Dormagen", + agsCode: "051620004004" // AGS Code für NINA Warnungen +}; +``` + +### Module aktivieren/deaktivieren + +Kommentiere Module in der `modules`-Array aus oder entferne den Kommentar, um sie zu aktivieren. + +## ⚠️ Wichtige Sicherheitshinweise + +1. **NIEMALS** die Datei `credentials.js` ins Git-Repository committen! +2. Teile deine API-Keys nicht öffentlich +3. Überprüfe die `.gitignore` Datei, bevor du pushst +4. Bei Problemen: Überprüfe, ob `config/credentials.js` in `.gitignore` steht diff --git a/config/config.js b/config/config.js new file mode 100644 index 0000000000..e0dc395b6d --- /dev/null +++ b/config/config.js @@ -0,0 +1,362 @@ +// MagicMirror Konfiguration +// Zuletzt aktualisiert: 19.05.2025 + +// Importiere sensible Credentials aus separater Datei +// WICHTIG: credentials.js ist in .gitignore und wird NICHT ins Repository committed! +const credentials = require('./credentials.js'); + +// Standort-Konfigurationen +const locationSettings = { + latitude: 51.100411, + longitude: 6.811775, + city: "Dormagen", + agsCode: "051620004004" // AGS Code für Dormagen +}; + +let config = { + // Grundlegende Server-Einstellungen + address: "localhost", // Geändert von "0.0.0.0" zu "localhost" für mehr Sicherheit + port: 8080, + basePath: "/", + + // Sicherheitseinstellungen + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.0.0/24"], // Beschränkt auf localhost und lokales Netzwerk + useHttps: false, + httpsPrivateKey: "", + httpsCertificate: "", + + // Lokalisierungseinstellungen + language: "de", + locale: "de-DE", + timeFormat: 24, + units: "metric", + + // Systemeinstellungen + logLevel: ["INFO", "WARN", "ERROR"], // DEBUG und LOG entfernt für weniger Logs + serverOnly: false, // Kommentar hinzugefügt, damit die Option leichter verständlich ist + + // Module-Konfiguration + modules: [ + // ===== ANZEIGEMODULE ===== + + // Wallpaper +/* { + module: "MMM-Wallpaper", + position: "fullscreen_below", + config: { + source: "bing", + slideInterval: 600 * 1000, // Erhöht auf 10 Minuten für weniger Netzwerkverkehr + } + }, +*/ + // Uhr & Datum + { + module: "clock", + position: "top_left" + }, + + // ===== INFORMATIONSMODULE ===== + + // Wettervorhersage + { + module: "MMM-OpenWeatherForecast", + header: "Wetter Dormagen", + position: "top_right", + config: { + apikey: credentials.openWeatherApiKey, + latitude: locationSettings.latitude, + longitude: locationSettings.longitude, + iconset: "2c", + concise: true, + showWind: false, + displayKmhForWind: true, + animatedIconStartDelay: 2000, + label_timeFormat: "HH:mm", + forecastLayout: "tiled", + forecastHeaderText: "", + label_sunriseTimeFormat: "HH:mm", + maxHourliesToShow: 3, // Erhöht von 0, um stündliche Vorhersagen zu zeigen + maxDailiesToShow: 4, + label_days: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + updateInterval: 30 * 60 * 1000, // 30 Minuten Update-Intervall hinzugefügt + } + }, + + // Familienkalender + { + module: "MMM-MyCalendar", + header: "Familienkalender", + position: "top_left", + config: { + maximumEntries: 8, // Reduziert von 16 für bessere Übersichtlichkeit + maxTitleLength: 40, // Reduziert von 50 für bessere Lesbarkeit + fade: false, + dateFormat: "DD MMM", // Gekürzt von "DD MMMM" für Platzersparnis + timeFormat: "HH:mm", + joiningWord: "um", + colored: true, // Farbige Kalenderereignisse zur besseren Unterscheidung + showLocation: true, // Zeigt den Ort des Ereignisses an + calendars: [ + { + symbol: "calendar-check", + url: "https://calendar.google.com/calendar/ical/robinfrank1824%40gmail.com/public/basic.ics", + color: "#36c" // Farbe für Kalenderereignisse + }, + { + symbol: "calendar-alt", + url: "https://calendar.google.com/calendar/ical/de.german%23holiday%40group.v.calendar.google.com/public/basic.ics", + color: "#c33" // Farbe für Feiertage + } + ], + updateInterval: 10 * 60 * 1000 // 10 Minuten (neu hinzugefügt) + } + }, + + // NINA Warnungen + { + module: "MMM-NINA", + header: "NINA Warnungen Dormagen", + position: "top_right", + config: { + ags: locationSettings.agsCode, + maxAgeInHours: 12, // Erhöht von 6 auf 12 Stunden + mergeAlerts: true, // Geändert auf true um ähnliche Warnungen zusammenzufassen + showIcon: true, + showNoWarning: true, + updateIntervalInSeconds: 3600, // Auf 1 Stunde erhöht (von 30 Minuten) + } + }, + + // Öffentliche Verkehrsmittel - Abfahrten + { + module: "MMM-PublicTransportHafas", + position: "top_right", + config: { + stationID: "586867", + stationName: "Bahnhof Dormagen", + direction: "", + excludedTransportationTypes: ["bus", "taxi"], + ignoredLines: [], + timeToStation: 10, + showAbsoluteTime: true, + displayLastUpdate: true, // Auf true gesetzt + maxUnreachableDepartures: 2, + maxReachableDepartures: 3, + showColoredLineSymbols: true, + customLineStyles: "koeln", + showOnlyLineNumbers: true, + showTableHeadersAsSymbols: true, + useColorForRealtimeInfo: true, + tableHeaderOrder: ["line", "direction", "time"], + updateInterval: 2 * 60 * 1000 // 2 Minuten Update-Intervall hinzugefügt + } + }, + + // Spritpreise + { + module: "MMM-Fuel", + position: "top_right", + header: "Aktuelle Spritpreise", // Header hinzugefügt + config: { + api_key: credentials.fuelApiKey, + lat: locationSettings.latitude, + lng: locationSettings.longitude, + types: ["diesel", "e5"], // E5 hinzugefügt für mehr Informationen + radius: 5, // Erhöht von 4 auf 5 km + max: 3, + rotate: true, + sortBy: "price", // Nach Preis sortieren + showDistance: true, // Zeigt die Entfernung zur Tankstelle + shortenText: 20, + showAddress: true, // Auf true geändert + iconHeader: true, // Auf true geändert + updateInterval: 15 * 60 * 1000 // 15 Minuten Update-Intervall + } + }, + + // Tägliche Routine +{ + module: "MMM-GoogleSheets", + header: "Tägliche Routine", + position: "top_left", + config: { + url: "https://script.google.com/macros/s/AKfycbwVjNUZFHRF-caRwTNJoSeCydyXC6l60f6FemwcmpVj48o6Ptz7ZRR7RBDUgn1EWhpkBQ/exec", + sheet: "MMMGoogleSheets", + range: "A1:C16", + cellStyle: "invert", + stylesFromSheet: ["text-align", "color", "background-color"], + customStyles: ["font-size: 12px", "padding: 3px"], + headerStyles: ["font-weight: bold", "background-color:rgb(206, 206, 206)"], + retryDelay: 10000, // 10 Sekunden Wartezeit zwischen Versuchen + maxRetries: 5, // Maximal 5 Versuche + updateInterval: 300000, // Alle 5 Minuten aktualisieren statt jede Minute + + } +}, + + // ===== SYSTEM- UND STEUERUNGSMODULE ===== + + // PIR Sensor für Energiesparmodus + { + module: 'EXT-Screen', + position: 'top_left', + configDeepMerge: true, + config: { + delay: 10 * 60 * 1000, // Auf 10 Minuten erhöht (von 8) + animateBody: true, // Animation beim Ein-/Ausschalten + displayBar: true, // Countdown-Anzeige aktiviert + displayLastPresence: true, // Zeigt letzte Erkennungszeit + displayAvailability: true // Zeigt an, ob der Sensor aktiv ist + } + }, + + { + module: 'EXT-Pir', + config: { + debug: false, + gpio: 27, + reverseValue: false, + activateDelay: 0, // Sofortige Aktivierung + calibrationTime: 10000 // 10 Sekunden Kalibrierungszeit beim Start + } + }, + + // ===== MEDIEN- UND NACHRICHTENMODULE ===== + + // Spotify + { + module: "MMM-NowPlayingOnSpotify", + header: "Spotify", + position: "top_right", + config: { + clientID: credentials.spotifyClientID, + clientSecret: credentials.spotifyClientSecret, + accessToken: credentials.spotifyAccessToken, + refreshToken: credentials.spotifyRefreshToken, + showCoverArt: true, // Album-Cover anzeigen + showQrCode: false, // Kein QR-Code nötig + updatesEvery: 5, // Sekunden zwischen Updates + alignment: "left", // Text-Ausrichtung + useBottomBar: false, // Kein Fortschrittsbalken unten + showPlayingIcon: true, // Zeigt Play/Pause-Symbol + songInfoCustomOrder: ["title", "artist", "album"], // Reihenfolge der Info + debug: false // Debug-Modus aus + } + }, + + // Nachrichten + { + module: "MMM-NewsAPI", + header: "Nachrichten", + position: "top_right", + config: { + apiKey: credentials.newsApiKey, + debug: false, + choice: "everything", + pageSize: 30, + sortBy: "publishedAt", + drawInterval: 1000*30, // 30 sec + fetchInterval: 1000*30*60, // 30 min + query: { + country: "", + category: "", + q: "", + qInTitle: "", + sources: "", + domains: "tagesspiegel,morgenpost.de,rbb24.de,tagesschau.de", + excludeDomains: "", + language: "" + } + } + }, + + // SystemInfo & WLAN QR-Code + { + module: 'MMM-SystemInfo', + position: "top_left", + header: "System & WLAN", // Header hinzugefügt + config: { + // QR-Code Konfiguration für dein WLAN + network: credentials.wifiNetwork, + password: credentials.wifiPassword, + authType: "WPA", + qrSize: 120, // Verkleinert von 150 auf 120 + hiddenId: false, + + // Layout und Anzeige-Optionen + layout: "ltr", // QR-Code links, Statistiken rechts + wifiDataCompact: false, // Kompakte Darstellung der WLAN-Infos + showNetwork: true, + showPassword: false, // Aus Sicherheitsgründen kein Passwort anzeigen + + // System-Informationen + showCpuUsage: true, + showCpuTemp: true, + showMemoryUsage: true, + showDiskUsage: true, + showNetworkStatus: true, + showUptime: true, // Betriebszeit anzeigen + + // Farben und Formatierung + connectedColor: "#00C853", // Helleres Grün + disconnectedColor: "#FF5252", // Helleres Rot + units: "metric", + decimal: 1, + + // Update-Intervall + updateInterval: 30000 // Auf 30 Sekunden erhöht (von 10) + } + }, + + // Update Notification für Dashboard + { + module: "updatenotification", + position: "top_left", + config: { + updateInterval: 6 * 60 * 60 * 1000 // Alle 6 Stunden prüfen statt Standard + } + }, + + // ===== EIGENE MODULE (BEISPIELE) ===== + + // Wetter-Radar (optional, auskommentiert) + /* + { + module: "MMM-DWD-WarnWeather", + position: "top_right", + header: "Wetterradar", + config: { + lat: locationSettings.latitude, + lng: locationSettings.longitude, + zoomLevel: 8, // Zoom-Level des Radars + updateInterval: 15 * 60 * 1000, // 15 Minuten + animationInterval: 2000, // 2 Sekunden zwischen Frames + dynamicLocation: true, // Dynamische Position basierend auf IP + showValues: false // Keine Werte anzeigen + } + }, + */ + + // Luftqualität (optional, auskommentiert) + /* + { + module: "MMM-AirQuality", + position: "top_right", + header: "Luftqualität", + config: { + location: `geo:${locationSettings.latitude};${locationSettings.longitude}`, + updateInterval: 30 * 60 * 1000 // 30 Minuten + } + } + */ + ] +}; + +// Automatisch die Adresse auf localhost setzen, wenn die ipWhitelist nicht leer ist +if (config.ipWhitelist && config.ipWhitelist.length > 0) { + config.address = "localhost"; +} + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} + diff --git a/config/credentials.example.js b/config/credentials.example.js new file mode 100644 index 0000000000..69c7f13271 --- /dev/null +++ b/config/credentials.example.js @@ -0,0 +1,41 @@ +/** + * MagicMirror Credentials Template + * + * ANLEITUNG: + * 1. Kopiere diese Datei zu "credentials.js" im selben Verzeichnis + * 2. Fülle deine echten API-Keys und Credentials ein + * 3. credentials.js wird NICHT ins Git-Repository committed (siehe .gitignore) + * + * NIEMALS diese Datei mit echten Credentials committen! + */ + +module.exports = { + // ===== API KEYS ===== + + // OpenWeather API Key + // Erhalten unter: https://openweathermap.org/api + openWeatherApiKey: "DEIN_OPENWEATHER_API_KEY", + + // Tankerkönig Fuel API Key + // Erhalten unter: https://creativecommons.tankerkoenig.de/ + fuelApiKey: "DEIN_FUEL_API_KEY", + + // News API Key + // Erhalten unter: https://newsapi.org/ + newsApiKey: "DEIN_NEWS_API_KEY", + + // ===== SPOTIFY CREDENTIALS ===== + + // Spotify Developer App Credentials + // Erhalten unter: https://developer.spotify.com/dashboard/applications + spotifyClientID: "DEIN_SPOTIFY_CLIENT_ID", + spotifyClientSecret: "DEIN_SPOTIFY_CLIENT_SECRET", + spotifyAccessToken: "DEIN_SPOTIFY_ACCESS_TOKEN", + spotifyRefreshToken: "DEIN_SPOTIFY_REFRESH_TOKEN", + + // ===== WLAN CREDENTIALS ===== + + // Nur benötigt, wenn du den WLAN-QR-Code im MMM-SystemInfo Modul nutzen möchtest + wifiNetwork: "DEIN_WLAN_NAME", + wifiPassword: "DEIN_WLAN_PASSWORT" +}; diff --git a/css/custom.css b/css/custom.css new file mode 100644 index 0000000000..4f78e3f4c3 --- /dev/null +++ b/css/custom.css @@ -0,0 +1,526 @@ +/* Uncomment and adjust accordingly if you want to import another font from the google-fonts-api: */ +/* @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@100;300;400;700&display=swap'); */ + +:root { + --color-text: #999; + --color-text-dimmed: #666; + --color-text-bright: #fff; + --color-background: black; + + --font-primary: "Roboto Condensed"; + --font-secondary: "Roboto"; + + --font-size: 20px; + --font-size-small: 0.75rem; + + --gap-body-top: 60px; + --gap-body-right: 0px; + --gap-body-bottom: 60px; + --gap-body-left: 60px; + + --gap-modules: 30px; +} + + +.region.top.left { + width: 100%; + max-width: 650px; + min-width: 10vw; +} + + +.region.lower.third { + display: none; + +} + +.region.upper.third { + display: none; + +} + +.region.middle.center { + display: none; + +} + +.region.bottom.center { + display: none; + +} + +.region.bottom.right { + display: none; + +} + + + +.region.top.right { + width: 100%; + + + +} + +/* Smaller Header */ + +.module-header { + text-transform: none; + font-size: var(--font-size-xsmall); +} +header { + text-transform: none; +} + +/*Space between Module*/ +.module { + margin-bottom: 25px; +} + + +/* ALERT */ + +.module.alert .small { + font-size: 12px; + +} + +.module.alert .medium { + font-size: 17px; + +} + + +/* CLOCK */ +.module.clock .clock { + height: 200px; + width: 520px; + margin-bottom: 1px; + +} + +.module.clock .small { + font-size: 17px; + +} + + +.module.clock .time { + font-size: 110px; + line-height: 1.2; +} + +.module.clock .date { + font-size: var(--font-size-small); +} + +/*MMM-Wallpaper styles*/ +body { + background: rgba(3, 12, 29, 0.3); +} + +.fullscreen { + height: 100%; +} + +.fullscreen div { + height: 100%; +} + +.fullscreen img { + min-height: 100%; + min-width: 100%; +} + +.fullscreen .title { + position: absolute; + bottom: 0; + font-size: 12px; + height: auto; +} + +/*Stundenplan*/ + +.region.top.left .MMM-GoogleSheets .module-content { + width: 400px; +} + +/*Spotify*/ + +.MMM-NowPlayingOnSpotify .NPOS_coverArtArea { max-width: 125px; float: left; margin-right: 15px; } +.MMM-NowPlayingOnSpotify .NPOS_infoText { font-size: 15px !important; } +.MMM-NowPlayingOnSpotify .NPOS_infoText:first-child { color: #1ED760; } + +.MMM-NowPlayingOnSpotify .NPOS_nothingIsPlayingContent { + width: 30%; +} + +.MMM-NowPlayingOnSpotify .NPOS_icon { + margin-right: 0.5em; +} + +.MMM-NowPlayingOnSpotify progress.NPOS_progress { + background-color: transparent; + border-radius: 1em; + border: 1px solid #aaaaaa; + height: 0.5em; + width: 30%; +} + +/*MMM-ToDoist*/ +.MMM-Todoist .small { + font-size: 17px; + text-transform: capitalize; + } + +/* MMM-Todoist Scrolling Animation */ +.MMM-Todoist .divTable { + white-space: nowrap; + overflow: hidden; + height:195px; + box-sizing: border-box; +} + +.MMM-Todoist .divTable div { + -webkit-animation: divTable 25s linear infinite alternate; +} + +@-webkit-keyframes divTable { + 0% { -webkit-transform: translateY(5%); } + 100% { -webkit-transform: translateY(-40%); } +} + + +/*MMM-Fuel (Spritpreise)*/ +.MMM-Fuel .small { + font-size: 18px; + + } + + +/*newsfeed*/ + +.newsfeed .box +{ +padding-top:10px; +} + +.newsfeed .medium +{ +font-size: 25px; +line-height: 35px; +} + +.newsfeed .small +{ +font-size: 18px; +line-height: 20px; +} + + +/*Wetter*/ + +.MMM-OpenWeatherForecast .module-content { + width: auto; +} + +.MMM-OpenWeatherForecast .extra-current-conditions-wrapper { + display: flex; + /*text-align: left;*/ + /*background-color: #333;*/ + word-wrap: normal; + font-size: 13px; + margin: 0px; + width: 120%; +} + + + +.MMM-OpenWeatherForecast .weather-alert { + display: none; +} + + + +/*Calendar*/ +.region.top.left .MMM-MyCalendar .module-content { + max-width: 600px; +} + +.MMM-MyCalendar table { + border-collapse: unset; +} + + +.MMM-OpenWeatherForecast .attribution { + display:none; +} + +.MMM-OpenWeatherForecast .wrapper.tiled .forecast-container { + border-top: none; +} + + +.MMM-OpenWeatherForecast .wrapper.tiled .forecast-container .forecast-item { + border-bottom: none; +} + + +/*NINA Warnungen */ +.MMM-NINA .nina-wrapper { + font-size: 0.7rem; + line-height: 1.0rem; +} + +.MMM-NINA .nina-icon { + font-size: 1.2rem; + margin-right: 9px; + margin-left: 9px; + margin-bottom: 2%; +} + +.MMM-NINA .nina-alert .nina-issue-date { + font-size: 0.5rem; +} + +.MMM-NINA .nina-alert { + display: flex; + align-items: center; + justify-content: space-between; + color: #FFBD44; +} +.MMM-NINA .nina-alert-data { + margin-left: 7px; +} + +.MMM-NINA .nina-alert.severity-Fine { + color: #666; +} + +.MMM-NINA .nina-alert.severity-Minor { + color: #FFBD44; +} + + +/*System temp*/ +.mmm-systemtemperature { + font-size: 0.5rem; + line-height: 1.0rem; +} + +/*NewsAPI*/ + + #NEWSAPI { + line-height:1.1em; + } + + #NEWSAPI .header .title { + display:block; + color:#FFF; + font-size:50%; + line-height:1.2em; + + } + + #NEWSAPI .content { + padding:7px; + font-size:30%; + line-height:1.2em; + } + + #NEWSAPI .footer { + text-align:right; + font-size:30%; + } + + + #NEWSAPI.horizontal .content { + text-align:justify; + } + + #NEWSAPI.horizontal .content .articleImage { + margin-right:10px; + margin-top:5px; + margin-bottom:30px; + float:left; + width:40%; + height:auto; + border-radius:4px; + } + + + +/*CountDown*/ +.MMM-CountDown .time { + text-align:left; + margin-left:35px; + +} + +.MMM-CountDown .event { + text-align:left; + font-size:45%; + + +} + +/*PIR Sensor*/ + +#EXT-SCREEN_PRESENCE, +#EXT-SCREEN_SCREEN { + font-size: small; + display: flex; +} + + +/*Warnwetter*/ +.MMM-DWD-WarnWeather .description { + margin-left: 10px; + padding-left: 50px; + padding-top: 3px; + width: auto; + font-size: 12px; + line-height: normal; + text-align: justify; + justify-content: space-between; + +} + + + +/*Public Transport*/ + +.MMM-PublicTransportHafas .small +{ +font-size: 18px; +line-height: 20px; +} + +.MMM-PublicTransportHafas .pthSign { + font-weight: normal; +} + + + +.MMM-MyVolvo .VOC .graphic { +width: 40%; +margin-right: 1px; +margin-left: 10px; +margin-top: -12px; +float: right; +} + +.MMM-Todoist { /* your first module name */ + position: absolute; /* or absolute if you know where to put */ + top: 0px; + height: 100px; /* determine the height of the module */ + width: 250px; /* determine the width of the module */ +} + +.MMM-TwitterTrendsByPlace { /* your second module name */ + position: relative !important; /* or absolute if you know where to put */ + top: -125px; /* is the height of first module plus module gap */ + left: 275px; /* to put module side by side with first plus 10px gap */ + height: 100px; /* determine the height of the module */ + width: 250px; /* determine the width of the module */ + font-size: 10px; +} + +.MMM-TwitterTrendsByPlace .small { + font-size: 12px; +} + +/* MMM-SystemInfo Styling */ +.MMM-SystemInfo { + font-size: 15px; + line-height: 1.2; + margin-bottom: 15px; +} + +.MMM-SystemInfo .qr-container { + display: flex; + align-items: center; + justify-content: center; + margin-right: 10px; +} + +.MMM-SystemInfo .qr-container img { + border: 2px solid #666; + border-radius: 5px; + padding: 5px; + background-color: white; +} + +.MMM-SystemInfo .wifi-info { + font-size: 14px; + margin-bottom: 10px; + color: var(--color-text-bright); +} + +.MMM-SystemInfo .wifi-info .fa { + margin-right: 8px; + color: #1ED760; /* Gleiche Farbe wie bei Spotify für Konsistenz */ +} + +.MMM-SystemInfo .system-info-container { + display: flex; + flex-direction: column; +} + +.MMM-SystemInfo .system-info { + display: flex; + align-items: center; + margin-bottom: 5px; +} + +.MMM-SystemInfo .system-info .fa { + width: 20px; + margin-right: 10px; + text-align: center; +} + +.MMM-SystemInfo .system-info-label { + color: var(--color-text-dimmed); + width: 90px; +} + +.MMM-SystemInfo .system-info-value { + color: var(--color-text-bright); +} + +/* Farbcodes für Status */ +.MMM-SystemInfo .status-ok { + color: #008000; /* Grün für OK-Status */ +} + +.MMM-SystemInfo .status-warning { + color: #FFBD44; /* Gleiche Warnfarbe wie bei NINA für Konsistenz */ +} + +.MMM-SystemInfo .status-critical { + color: #ff0000; /* Rot für kritischen Status */ +} + +/* Animation für QR-Code hover-Effekt */ +.MMM-SystemInfo .qr-container img:hover { + transform: scale(1.05); + transition: transform 0.3s ease; +} + +/* Layout-Anpassungen für kompaktere Darstellung */ +.MMM-SystemInfo.ltr { + display: flex; + align-items: flex-start; +} + +.MMM-SystemInfo.rtl { + display: flex; + flex-direction: row-reverse; + align-items: flex-start; +} + +/* Ausrichtung verbessern, um zu anderen Modulen zu passen */ +.region.top.right .MMM-SystemInfo { + margin-top: 10px; +} diff --git a/css/main.css b/css/main.css index e025b4db65..0aa5c3418e 100644 --- a/css/main.css +++ b/css/main.css @@ -239,28 +239,3 @@ sup { border-spacing: 0; border-collapse: separate; } - -/** - * Container Definitions. - */ - -.region .container { - display: flex; - flex-direction: column; -} - -.region .container.hidden { - display: none; -} - -.region.left .flex { - justify-content: flex-start; -} - -.region.center .flex { - justify-content: center; -} - -.region.right .flex { - justify-content: flex-end; -} diff --git a/modules/MMM-CountDown b/modules/MMM-CountDown new file mode 160000 index 0000000000..eea1962ebf --- /dev/null +++ b/modules/MMM-CountDown @@ -0,0 +1 @@ +Subproject commit eea1962ebf2ff6c18fcab44ff862d2b88b1de768 diff --git a/modules/MMM-Fuel b/modules/MMM-Fuel new file mode 160000 index 0000000000..eafb711034 --- /dev/null +++ b/modules/MMM-Fuel @@ -0,0 +1 @@ +Subproject commit eafb71103468b41d25ef26c0b8da6a04447b26d0 diff --git a/modules/MMM-GoogleSheets b/modules/MMM-GoogleSheets new file mode 160000 index 0000000000..25685e98c6 --- /dev/null +++ b/modules/MMM-GoogleSheets @@ -0,0 +1 @@ +Subproject commit 25685e98c60f6906901c602dac1ce2bd2a75702b diff --git a/modules/MMM-MyCalendar b/modules/MMM-MyCalendar new file mode 160000 index 0000000000..55efaceacd --- /dev/null +++ b/modules/MMM-MyCalendar @@ -0,0 +1 @@ +Subproject commit 55efaceacd2a168108969bb1a94b80ffda18cae5 diff --git a/modules/MMM-NINA b/modules/MMM-NINA new file mode 160000 index 0000000000..0952739177 --- /dev/null +++ b/modules/MMM-NINA @@ -0,0 +1 @@ +Subproject commit 0952739177e1730ea2dbae3b8330e0eea3475f77 diff --git a/modules/MMM-NewsAPI b/modules/MMM-NewsAPI new file mode 160000 index 0000000000..f1342b7058 --- /dev/null +++ b/modules/MMM-NewsAPI @@ -0,0 +1 @@ +Subproject commit f1342b705894e5888f1825f3582e6c832dc902b4 diff --git a/modules/MMM-OpenWeatherForecast b/modules/MMM-OpenWeatherForecast new file mode 160000 index 0000000000..d47367b7b8 --- /dev/null +++ b/modules/MMM-OpenWeatherForecast @@ -0,0 +1 @@ +Subproject commit d47367b7b8293d0f758d8828f193c5d452e369d2 diff --git a/modules/MMM-PublicTransportHafas b/modules/MMM-PublicTransportHafas new file mode 160000 index 0000000000..126b94b96c --- /dev/null +++ b/modules/MMM-PublicTransportHafas @@ -0,0 +1 @@ +Subproject commit 126b94b96c5c9bfde50053983166424c5106f832 diff --git a/package-lock.json b/package-lock.json index e376534a55..f1d9420dbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -146,6 +146,7 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -862,7 +863,8 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.18.tgz", "integrity": "sha512-EF77RqROHL+4LhMGW5NTeKqfUd/e4OOv6EDFQ/UQQiFyWuqkEKyEz0NDILxOFxWUEVdjT2GQ2cC7t12B6pESwg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-dart": { "version": "2.3.1", @@ -1002,14 +1004,16 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.12.tgz", "integrity": "sha512-JFffQ1dDVEyJq6tCDWv0r/RqkdSnV43P2F/3jJ9rwLgdsOIXwQbXrz6QDlvQLVvNSnORH9KjDtenFTGDyzfCaA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.4.tgz", "integrity": "sha512-afea+0rGPDeOV9gdO06UW183Qg6wRhWVkgCFwiO3bDupAoyXRuvupbb5nUyqSTsLXIKL8u8uXQlJ9pkz07oVXw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-java": { "version": "5.0.12", @@ -1207,7 +1211,8 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", @@ -1348,6 +1353,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1394,6 +1400,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -3177,6 +3184,7 @@ "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.44.1", @@ -3513,6 +3521,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4061,6 +4070,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", @@ -4356,6 +4366,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5991,6 +6002,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -8445,6 +8457,7 @@ "integrity": "sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.1.3", "@jest/types": "30.0.5", @@ -9174,7 +9187,6 @@ "integrity": "sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", @@ -9194,7 +9206,6 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -9208,7 +9219,6 @@ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -9658,6 +9668,7 @@ "integrity": "sha512-/4Osri9QFGCZOCTkfA8qJF+XGjKYERSHkXzxSyS1hd3ZERJGjvsUao2h4wdnvpHp6Tu2Jh/bPHM0FE9JJza6ng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "globby": "14.1.0", "js-yaml": "4.1.0", @@ -11628,6 +11639,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -11677,6 +11689,7 @@ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11707,6 +11720,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -13387,6 +13401,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", @@ -14234,6 +14249,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" },