diff --git a/skills/datastore/assets/mila-apple-touch-icon.png b/skills/datastore/assets/mila-apple-touch-icon.png new file mode 100644 index 0000000..04807c6 Binary files /dev/null and b/skills/datastore/assets/mila-apple-touch-icon.png differ diff --git a/skills/datastore/assets/mila-icon-192.png b/skills/datastore/assets/mila-icon-192.png new file mode 100644 index 0000000..81ce8cc Binary files /dev/null and b/skills/datastore/assets/mila-icon-192.png differ diff --git a/skills/datastore/assets/mila-icon-512.png b/skills/datastore/assets/mila-icon-512.png new file mode 100644 index 0000000..ed8f9f1 Binary files /dev/null and b/skills/datastore/assets/mila-icon-512.png differ diff --git a/skills/datastore/assets/mila-icon.svg b/skills/datastore/assets/mila-icon.svg new file mode 100644 index 0000000..8d0b57b --- /dev/null +++ b/skills/datastore/assets/mila-icon.svg @@ -0,0 +1,15 @@ + diff --git a/skills/datastore/assets/mila.webmanifest b/skills/datastore/assets/mila.webmanifest new file mode 100644 index 0000000..f7e492d --- /dev/null +++ b/skills/datastore/assets/mila.webmanifest @@ -0,0 +1,35 @@ +{ + "name": "Mila — Schlaf & Entwicklung", + "short_name": "Mila", + "description": "Schlaf-, Trink- und Windeltagebuch für Mila Graf", + "start_url": "/family/mila.html", + "scope": "/", + "display": "standalone", + "orientation": "portrait-primary", + "background_color": "#090A0F", + "theme_color": "#090A0F", + "icons": [ + { + "src": "/family/mila-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/family/mila-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/family/mila-apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/family/mila-icon.svg", + "sizes": "any", + "type": "image/svg+xml" + } + ] +} diff --git a/skills/datastore/assets/sw.js b/skills/datastore/assets/sw.js new file mode 100644 index 0000000..903d71f --- /dev/null +++ b/skills/datastore/assets/sw.js @@ -0,0 +1,26 @@ +// Minimal service worker for Mila PWA installability & offline resilience +const CACHE_NAME = 'mila-v1'; + +self.addEventListener('install', (event) => { + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((keys) => + Promise.all( + keys.map((key) => { + if (key !== CACHE_NAME) return caches.delete(key); + }) + ) + ).then(() => self.clients.claim()) + ); +}); + +self.addEventListener('fetch', (event) => { + if (event.request.method !== 'GET') return; + // Network-first strategy: Always fetch live real-time updates from MinIO + event.respondWith( + fetch(event.request).catch(() => caches.match(event.request)) + ); +}); diff --git a/skills/datastore/scripts/update_website.py b/skills/datastore/scripts/update_website.py index 6722673..3c769af 100644 --- a/skills/datastore/scripts/update_website.py +++ b/skills/datastore/scripts/update_website.py @@ -447,23 +447,45 @@ def generate_dashboard_html(engine: DatastoreEngine) -> str: """ - # PWA Manifest as inline Data URI + # PWA Manifest (RFC-compliant base64 data URI + external webmanifest) + import base64 manifest_dict = { - "name": "Mila Tracker", + "name": "Mila — Schlaf & Entwicklung", "short_name": "Mila", + "description": "Schlaf-, Trink- und Windeltagebuch für Mila Graf", "start_url": "/family/mila.html", + "scope": "/", "display": "standalone", + "orientation": "portrait-primary", "background_color": "#090A0F", "theme_color": "#090A0F", "icons": [ { - "src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='48' fill='%237C3AED'/%3E%3Ctext x='50' y='65' font-size='42' font-family='sans-serif' text-anchor='middle' fill='white'%3E%F0%9F%A7%B8%3C/text%3E%3C/svg%3E", - "sizes": "192x192 512x512", + "src": "/family/mila-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/family/mila-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/family/mila-apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/family/mila-icon.svg", + "sizes": "any", "type": "image/svg+xml" } ] } - manifest_uri = "data:application/manifest+json," + json.dumps(manifest_dict) + manifest_json = json.dumps(manifest_dict) + manifest_uri = f"data:application/manifest+json;base64,{base64.b64encode(manifest_json.encode('utf-8')).decode('utf-8')}" # Full HTML Document html = f""" @@ -475,11 +497,20 @@ def generate_dashboard_html(engine: DatastoreEngine) -> str: + + + + + - + + + + + @@ -505,6 +536,42 @@ def generate_dashboard_html(engine: DatastoreEngine) -> str:
+ + + + + +