/* * Wallpaper background config. * * Properties: * theme - Active palette theme. One of the keys in window.THEMES * (default 'ash'). The matching CSS file is loaded at * startup. * language - UI / i18n language code (default 'en'). * timeFormat - Moment.js-compatible format string for the clock. * debug - If 1, the right-side debug panel is shown. * units - Object with 'temperature' ('C' or 'F'). * location - Geographic coordinates for sun/moon calculations. Used * by SunCalc (https://github.com/mourner/suncalc). Object * with 'lat' (latitude, -90 to +90) and 'lon' (longitude, * -180 to +180). Positive lat = north, positive lon = east. * Optionally add 'label' (string) to override the * reverse-geocoded city name. * Note: the height grid is axis-aligned (N up); terrain * matches the 8-mode square mosaic and straight flights * with fetch=N. Heights: Copernicus DEM via terrarium * tiles (z9, ~200 m), fetched once per session. * terrain - 3D ground from real elevation data. Object: * enabled - true (default) / false = flat plane. * exaggeration - vertical scale factor on the DEM * (default 8; 1 would be physically * true and nearly invisible at this * horizontal scale). * weatherSim - If true, ignore open-meteo and cycle through * ['sunny','cloudy','stormy','night'] automatically every * weatherSimInterval ms. Useful for A/B testing every * theme without waiting on the API. * weatherSimInterval - Sim cycle period in ms (default 30000). * orbit - Figure-eight flight (Bernoulli lemniscate) around * CONFIG.location instead of a straight drift. The * eight's self-crossing sits exactly on the configured * coordinate. Each time the aircraft crosses that point * a new random orientation is picked and blended in * over one lobe (spline through the crossing). Object: * radiusKm - lobe tip reach from the centre in km * (~13 km per tile at z11/48deg N). * Clamped (~190 km) so tips + fog horizon * fit inside the 43x43 tile mosaic. * clockwise - travel direction along the eight. * reorient - random re-aim at every crossing * (default true; false keeps the bearing). * Set to null (or remove) for the straight-line flight. * fog - Ground fog / distance haze. Object with 'distanceKm' * (visibility range at which terrain fully blends into * a milky haze; default 120). false/0 disables fog. * clouds - Vertical extent of the cloud deck in world units * (1 unit = ~13 km at zoom 11; camera flies at y=2.2). * Object with 'top' and 'bottom'. Default keeps the * deck a bit below flight altitude. * tiles - All downloads (street tiles, elevation grid, last * weather payload, geo label) live permanently in * IndexedDB and are never re-fetched once cached; a * warm cache = fully offline rendering. Set * expireDays (number > 0) to re-fetch street tiles * periodically (e.g. 90). * * Time format tokens (subset): * YYYY 4-digit year (2026) * YY 2-digit year (26) * MMMM full month name (October) * MM month with leading zero (10) * DD day with leading zero (07) * HH 24-hour hour with zero (18) * hh 12-hour hour with zero (06) * mm minute with leading zero (14) * ss second with leading zero (25) * a am/pm lowercase (pm) - long form * A AM/PM uppercase (PM) - long form */ window.CONFIG = { theme: 'ash', language: 'en', timeFormat: 'DD. MMMM, YYYY ‒ HH:mm:SS', debug: 0, units: { temperature: 'C' }, // Data attribution at the bottom of the info box (auto text based on // the enabled layers). false = ausgeblendet. credits: true, // Internal 3D resolution scale (0.3..1, default 1). Lower values // render the clouds/map shader at reduced resolution and upscale // via CSS - use it if fps is low (GPU-bound) despite a quiet CPU. renderScale: 1, location: { // Latitude and longitude for sun/moon calculations // Passau (vorher: Muenchen 48.1374/11.5755, Innsbruck 47.2692/11.4041) lat: 48.5667, lon: 13.4319 }, weatherSim: false, weatherSimInterval: 30000, // Alles Downloads (Strassenkacheln, Hoehengitter, Wetter-JSON, // Geo-Label) bleibt dauerhaft im IndexedDB — kein erneuter // Download. expireDays (Tage, >0) reaktiviert periodisches // Auffrischen der Strassenkacheln. tiles: { expireDays: null, // true = Kachel-Raender + N/S + x/y-Koords in die Boden-Textur // malen (Debug-Orientierung). Aus = saubere Karte. debug: false }, // Boden-Bildquelle: 'satellite' = ESRI World_Imagery (Luftbild, ohne // Beschriftung), 'streets' = ESRI World_Street_Map (mit Ortsnamen). // Beide dauerhaft gecacht (eigener Cache- Praefix pro Stil). ground: { style: 'satellite' }, // Achterkurs um location (lat/lon), ueberschneidungspunkt genau auf // der Koordinate. null/entfernen = gerade Flugbahn. orbit: { radiusKm: 60, // Lappenspitze: max. Abstand vom Zentrum clockwise: true, reorient: true, // Zufalls-Ausrichtung an jedem Kreuzungs-Durchflug // Langsames vertikales Wogen innerhalb der Flugband 15-35 km: // Mitte 25 km (~1.93 Welt-Einheiten), amp = halbes Band // (10 km ~ 0.77); harte Klemme ueber/unter die Bandgrenzen. // periodS Sekunden pro Zyklus, tilt = Reaktion der Kamera-Nase // auf Steig-/Sinkrate. enabled: false = konstant 25 km. altBob: { enabled: true, amp: 0.77, periodS: 90, tilt: 0.3 } }, // Bodennebel: Distanz-Haze. distanceKm = Sichtweite bis vollständige // Nebelsaettigung (false/0 = aus). fog: { distanceKm: 120 }, // 3D-Boden aus echten Hoehendaten (Copernicus DEM, terrarium-Kacheln). // enabled: false = flache Ebene. exaggeration: vertikale Ueberhoehung // (1 = real, unsichtbar; default 8). wireframe: true = Mesh-Kanten // als orange Linien zusaetzlich einblenden (Debug). // nightLights: NASA-VIIRS-Stadtlichter-Layer, der ab Sonnenuntergang // ueber ~1 h in die Tageskarte geblendet wird (dunkler Boden, // leuchtende Staedte). Einmaliger Fetch (~49 Kacheln), persistent // gecacht. false = kein Lichtoverlay, nachts bleibt die normale // Textur deutlich heller (nur sanft abgedimmt). // carLights: fahrende Lichter auf Autobahnen (OSM/Overpass-Kurven, // nachts additiv ueber dem Gelaende). JSON einmalig, persistent gecacht. // cityLights: Siedlungslichter — OSM-Ortsknoten (city/town/village/ // hamlet) als leicht gelbliche Glow-Punkte, ab Daemmerung statisch; // je groesser die Siedlung (place-Klasse + population-Tag), desto // mehr und hellere Punkte. Eine Overpass-Abfrage, persistent gecacht. // Daten (c) OpenStreetMap-Mitwirkende, ODbL. terrain: { enabled: true, exaggeration: 10, wireframe: false, nightLights: false, carLights: true, cityLights: true }, // Tagessimulation: true = 24h-Zyklus wird in cycleSeconds durchlaufen // (Sonne steigt im Osten, Mittag im Sueden, Untergang im Westen). // false = echte Sonnen-/Mondposition via SunCalc. day: { simulation: false, cycleSeconds: 20 }, // Wolkendecke in Welt-Einheiten (1 unit ~ 13 km bei Zoom 11; // Kamera fliegt auf y=2.2). Decke etwas unter Flughohe. clouds: { top: 0.9, bottom: -0.3 }, }; // List of available themes. The key is the theme id (used in config.theme), // the value is the CSS file name. Add a new theme by adding a new entry here // and dropping the corresponding CSS file in the same directory. window.THEMES = { 'ash': 'ash.css', 'gruvbox': 'gruvbox.css', 'nord': 'nord.css' };