1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="UTF-8" /> 6 <!-- CSP and Security Headers: Managed via netlify.toml HTTP header (avoid meta+header intersection conflict) --> 7 <link rel="icon" type="image/svg+xml" href="/logo.svg" /> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> 9 <!-- iOS Safari specific --> 10 <meta name="mobile-web-app-capable" content="yes" /> 11 <meta name="apple-mobile-web-app-capable" content="yes" /> 12 <meta name="apple-mobile-web-app-status-bar-style" content="default" /> 13 <meta name="format-detection" content="telephone=no" /> 14 <meta name="description" 15 content="AI-driven simulation for climate-resilient building retrofits. Analyze risks, optimize comfort, and ensure compliance for future-ready architecture." /> 16 <!-- Open Graph --> 17 <meta property="og:type" content="website" /> 18 <meta property="og:title" content="Climate For All â AI Simulation for Climate-Resilient Retrofits" /> 19 <meta property="og:description" content="AI-driven simulation for climate-resilient building retrofits. Analyze risks, optimize comfort, and ensure compliance for future-ready architecture." /> 20 <meta property="og:image" content="/static/Logo-CLimate-For-All_FINAL_horizontal.webp" /> 21 <meta property="og:url" content="https://climateforall.ai" /> 22 <!-- Twitter Card --> 23 <meta name="twitter:card" content="summary_large_image" /> 24 <meta name="twitter:title" content="Climate For All â AI Simulation for Climate-Resilient Retrofits" /> 25 <meta name="twitter:description" content="AI-driven simulation for climate-resilient building retrofits." /> 26 <meta name="twitter:image" content="/static/Logo-CLimate-For-All_FINAL_horizontal.webp" /> 27 <title>Climate Adaptive Retrofit Design | CFA</title> 28 <!-- The ground colour, inline, so it paints in the first frame. The same two 29 rules exist in the stylesheet, but that file is render blocking and arrives 30 over the network: while it is in flight the browser paints its own white 31 default, which on a dark themed site is a white page followed by a flash. 32 The theme class is already on the root element by then, set by the script 33 below, which runs before the first paint. --> 34 <style>html{background-color:#ffffff}html.dark{background-color:#0d0d12}body{background-color:inherit}</style> 35 <link rel="preconnect" href="https://fonts.googleapis.com"> 36 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 37 <!-- The policy travels with the document. Header rules cover the declared routes, 38 but the catch-all rewrite serves this same document on any path, and a rule 39 that matches by path cannot be relied on to reach all of them. frame-ancestors 40 is not valid in a meta policy and is set as a header instead. --> 41 <meta http-equiv="Content-Security-Policy" content="default-src 'self' https://*.climateforall.ai https://climateforall.ai; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://*.netlify.app https://script.google.com https://script.googleusercontent.com https://*.climateforall.ai https://climateforall.ai; worker-src 'self' blob:; frame-src 'self'; base-uri 'self'; form-action 'self';"> 42 <link 43 href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600;1,700&family=Outfit:wght@300;400;500;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" 44 rel="stylesheet"> 45
45<script> 46 // The theme is decided BEFORE the first paint. Left to React, the page paints 47 // light, mounts, and flips to dark, which is a visible flash on every load. 48 // Dark is the default; a stored choice wins. 49 (function () { 50 try { 51 var stored = localStorage.getItem('theme'); 52 if (stored !== 'light') document.documentElement.classList.add('dark'); 53 } catch (e) { 54 document.documentElement.classList.add('dark'); 55 } 56 })(); 57 </script>
57 58
58<script type="module" crossorigin src="/assets/index-C5O3Ts85.js"></script>
58 59 <link rel="modulepreload" crossorigin href="/assets/vendor-react-JDpYHKXk.js"> 60 <link rel="modulepreload" crossorigin href="/assets/vendor-motion-DrhS-28h.js"> 61 <link rel="modulepreload" crossorigin href="/assets/vendor-icons-BqhQzER6.js"> 62 <link rel="stylesheet" crossorigin href="/assets/index-DWcv3e3N.css"> 63 </head> 64 65<body> 66 <!-- Cinematic Noise Overlay REMOVED: feTurbulence at z-9999 caused GPU repaint thrashing on scroll --> 67 <div id="root"></div> 68</body> 69 70</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.