1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <style data-vite-theme="" data-inject-first="">:root { 5 --background: 0 0% 100%; 6--foreground: 20 14.3% 4.1%; 7--muted: 60 4.8% 95.9%; 8--muted-foreground: 25 5.3% 44.7%; 9--popover: 0 0% 100%; 10--popover-foreground: 20 14.3% 4.1%; 11--card: 0 0% 100%; 12--card-foreground: 20 14.3% 4.1%; 13--border: 20 5.9% 90%; 14--input: 20 5.9% 90%; 15--primary: 142 76% 36%; 16--primary-foreground: 127 38% 98%; 17--secondary: 60 4.8% 95.9%; 18--secondary-foreground: 24 9.8% 10%; 19--accent: 60 4.8% 95.9%; 20--accent-foreground: 24 9.8% 10%; 21--destructive: 0 84.2% 60.2%; 22--destructive-foreground: 60 9.1% 97.8%; 23--ring: 20 14.3% 4.1%; 24--radius: 0.5rem; 25 } 26 .dark { 27 --background: 240 10% 3.9%; 28--foreground: 0 0% 98%; 29--muted: 240 3.7% 15.9%; 30--muted-foreground: 240 5% 64.9%; 31--popover: 240 10% 3.9%; 32--popover-foreground: 0 0% 98%; 33--card: 240 10% 3.9%; 34--card-foreground: 0 0% 98%; 35--border: 240 3.7% 15.9%; 36--input: 240 3.7% 15.9%; 37--primary: 142 76% 36%; 38--primary-foreground: 127 38% 98%; 39--secondary: 240 3.7% 15.9%; 40--secondary-foreground: 0 0% 98%; 41--accent: 240 3.7% 15.9%; 42--accent-foreground: 0 0% 98%; 43--destructive: 0 62.8% 30.6%; 44--destructive-foreground: 0 0% 98%; 45--ring: 240 4.9% 83.9%; 46--radius: 0.5rem; 47 }</style> 48 49 <meta charset="UTF-8" /> 50 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 51 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 52 <title>ShoreEdge - Sustainable Shore Excursions</title> 53 <meta name="description" content="Connect cruise passengers and crew with sustainable shore excursions" /> 54 55 <!-- Security headers --> 56 <meta http-equiv="X-Content-Type-Options" content="nosniff" /> 57 <meta http-equiv="X-Frame-Options" content="SAMEORIGIN" /> 58 <meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin" /> 59 60 <!-- Permissions Policy for Camera and other device features --> 61 <meta http-equiv="Permissions-Policy" content="camera=*, microphone=*, geolocation=*, fullscreen=*, payment=*" /> 62 63 <!-- Content Security Policy configured for Google Maps and external services --> 64 <meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' https: wss: data: blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: blob: data: https://maps.googleapis.com https://maps.gstatic.com *.google.com *.googletagmanager.com; style-src 'self' 'unsafe-inline' https: blob: data: https://maps.googleapis.com https://fonts.googleapis.com; font-src 'self' https: data: blob: https://fonts.gstatic.com https://maps.gstatic.com; img-src 'self' https: data: blob: * https://maps.googleapis.com https://maps.gstatic.com *.google.com; connect-src 'self' https: wss: ws: data: blob: * https://maps.googleapis.com *.google.com; frame-src 'self' https: data: blob:; worker-src 'self' blob: data: https:; media-src 'self' https: data: blob:; object-src 'none';" /> 65 66 <!-- PWA and mobile support --> 67 <meta name="theme-color" content="#2F855A" /> 68 <meta name="apple-mobile-web-app-capable" content="yes" /> 69 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 70 <meta name="apple-mobile-web-app-title" content="ShoreEdge" /> 71 72 <!-- PWA support --> 73 <link rel="manifest" href="/manifest.json" /> 74 <link rel="icon" type="image/png" href="/attached_assets/ShoreEDGE-icon.png" /> 75 <link rel="apple-touch-icon" href="/attached_assets/appstore.png" /> 76 77 <!-- iOS splash screens --> 78 <link rel="apple-touch-startup-image" href="/attached_assets/appstore.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" /> 79 <link rel="apple-touch-startup-image" href="/attached_assets/appstore.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" /> 80 <link rel="apple-touch-startup-image" href="/attached_assets/appstore.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3)" /> 81 <link rel="apple-touch-startup-image" href="/attached_assets/appstore.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3)" /> 82 <link rel="apple-touch-startup-image" href="/attached_assets/appstore.png" media="(min-device-width: 768px) and (max-device-width: 1024px)" /> 83 84 <!-- Fonts --> 85 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Montserrat:wght@600;700;
85800&family=Playfair+Display:wght@700&display=swap" rel="stylesheet"> 86 87 <!-- Preload the service worker file to ensure it's available --> 88 <link rel="preload" href="/sw.js" as="script" crossorigin="anonymous" /> 89
89<script type="module" crossorigin src="/assets/index-BFXWRnri.js"></script>
89 90 <link rel="stylesheet" crossorigin href="/assets/index-CpGKECRc.css"> 91 </head> 92 <body> 93 <div id="root"></div> 94 95 <!-- Service Worker registration fallback script --> 96
96<script> 97 // Ensure service worker is registered even if the main bundle fails to load 98 if ('serviceWorker' in navigator && !navigator.serviceWorker.controller) { 99 window.addEventListener('load', function() { 100 console.log('Fallback service worker registration starting...'); 101 navigator.serviceWorker.register('/sw.js', {scope: '/'}) 102 .then(function(registration) { 103 console.log('Fallback SW registration successful with scope:', registration.scope); 104 }) 105 .catch(function(error) { 106 console.error('Fallback SW registration failed:', error); 107 }); 108 }); 109 } 110 </script>
110 111 112 <!-- This is a replit script which adds a banner on the top of the page when opened in development mode outside the replit environment --> 113
113<script type="text/javascript" src="https://replit.com/public/js/replit-dev-banner.js"></script>
113 114 </body> 115</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.