diff --git a/app/globals.css b/app/globals.css index 4b616a9..ccac33b 100644 --- a/app/globals.css +++ b/app/globals.css @@ -128,6 +128,16 @@ --color-sidebar-ring: var(--sidebar-ring); } +[data-mobileclaw-embedded] { + --primary: oklch(0.313 0 0); + --primary-foreground: oklch(0.985 0 0); +} + +.dark [data-mobileclaw-embedded] { + --primary: oklch(0.258 0 0); + --primary-foreground: oklch(0.911 0 0); +} + @theme { /* Font-size scale — boosted so text-sm = 16px body baseline */ --text-2xs: 0.75rem; /* 12px */ @@ -148,6 +158,9 @@ * { @apply border-border outline-ring/50; } + html { + @apply bg-background text-foreground; + } body { @apply bg-background text-foreground; overflow: hidden; diff --git a/app/layout.tsx b/app/layout.tsx index b9f52c8..eec0ce5 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -32,9 +32,15 @@ export const metadata: Metadata = { // Also registers the service worker for PWA support const headScript = ` (function() { + var isDev = ${JSON.stringify(process.env.NODE_ENV !== 'production')}; var params = new URLSearchParams(location.search); var detached = params.has('detached'); var detachedMode = detached ? params.get('mode') : null; + var host = location.hostname; + var isIpV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(host); + var isLocalHost = host === 'localhost' || host === '127.0.0.1' || host === '0.0.0.0' || host.endsWith('.local'); + var isPrivateLanIp = /^10\\./.test(host) || /^192\\.168\\./.test(host) || /^172\\.(1[6-9]|2\\d|3[0-1])\\./.test(host); + var shouldDisableServiceWorker = isDev || isLocalHost || (isIpV4 && isPrivateLanIp); try { if (detachedMode === 'dark') { document.documentElement.classList.add('dark'); @@ -53,8 +59,19 @@ const headScript = ` if (detached) { document.documentElement.classList.add('detached-loading'); } - if ('serviceWorker' in navigator && location.hostname !== 'localhost' && !window.__nativeMode) { + if ('serviceWorker' in navigator && !window.__nativeMode) { window.addEventListener('load', function() { + if (shouldDisableServiceWorker) { + navigator.serviceWorker.getRegistrations().then(function(registrations) { + registrations.forEach(function(registration) { registration.unregister(); }); + }); + if (window.caches && caches.keys) { + caches.keys().then(function(keys) { + keys.forEach(function(key) { caches.delete(key); }); + }); + } + return; + } navigator.serviceWorker.register('/sw.js'); }); } @@ -67,7 +84,7 @@ export default function RootLayout({ children: React.ReactNode }>) { return ( - +