1<!doctype html> 2<html lang="en" data-beasties-container> 3<head> 4 <meta charset="utf-8"> 5 <title>Eat Clean Chicago - Changing the way you eat, one meal at a time.</title> 6 <meta name="description" content="Changing the way you eat, one meal at a time."> 7 <meta name="keywords" content> 8 <base href="/"> 9 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 10 11 <!-- Open Graph / Facebook --> 12 <meta property="og:type" content="website"> 13 <meta property="og:site_name" content="Eat Clean Chicago"> 14 <meta property="og:title" content="Eat Clean Chicago - Changing the way you eat, one meal at a time."> 15 <meta property="og:description" content="Changing the way you eat, one meal at a time."> 16 <meta property="og:image" content="https://happy-management-bucket.s3.amazonaws.com/tenants/tenant52/266/ecc-share-min-1773422052.png"> 17 18 <!-- Twitter --> 19 <meta name="twitter:card" content="summary_large_image"> 20 <meta name="twitter:title" content="Eat Clean Chicago - Changing the way you eat, one meal at a time."> 21 <meta name="twitter:description" content="Changing the way you eat, one meal at a time."> 22 <meta name="twitter:image" content="https://happy-management-bucket.s3.amazonaws.com/tenants/tenant52/266/ecc-share-min-1773422052.png"> 23 24 <link rel="icon" type="image/png" href="https://happy-management-bucket.s3.amazonaws.com/tenants/tenant52/269/faviconv2-1773421516.png"> 25 26 <!-- 27 Preconnect to critical third-party origins (DNS + TLS handshake early). 28 Lighthouse recommends â¤4 preconnects â listed in priority order. 29 S3 origin is accessed via wsrv.nl CDN proxy so only wsrv.nl matters for images. 30 --> 31 <link rel="preconnect" href="https://fonts.googleapis.com"> 32 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 33 <link rel="preconnect" href="https://wsrv.nl" crossorigin> 34 <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin> 35 <!-- dns-prefetch only (no TLS) for less critical origins --> 36 <link rel="dns-prefetch" href="https://happy-management-bucket.s3.amazonaws.com"> 37 38 <!-- Google Fonts loaded async to avoid render-blocking (was @import in styles.scss) --> 39 <link rel="preload" href="https://fonts.googleapis.com/css2?family=Allura&family=Cormorant+Garamond:wght@500;600;700&
39family=Playfair+Display:wght@500;600;700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'"> 40 <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Allura&family=Cormorant+Garamond:wght@500;600;700&family=Playfair+Display:wght@500;600;700&display=swap"></noscript> 41 42 <!-- Preload critical local fonts (WOFF2 â ~50KB each vs ~155KB TTF) to prevent FOUT on hard refresh --> 43 <link rel="preload" href="/assets/fonts/Poppins/Poppins-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 44 <link rel="preload" href="/assets/fonts/Poppins/Poppins-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 45 <link rel="preload" href="/assets/fonts/Poppins/Poppins-SemiBold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 46 <link rel="preload" href="/assets/fonts/Poppins/Poppins-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 47 48 <!-- Font Awesome loaded async to avoid render-blocking --> 49 <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 50 <noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"></noscript> 51<style>@font-face{font-family:Helvetica;src:local("Helvetica"),url("./media/Helvetica-L5QV36CN.woff2") format("woff2"),url("./media/Helvetica-ITLZU67G.woff") format("woff");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Helvetica;src:local("Helvetica Oblique"),local("Helvetica-Oblique"),url("./media/Helvetica-Oblique-5FZVUTG4.woff2") format("woff2"),url("./media/Helvetica-Oblique-TNVRDCCP.woff") format("woff");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:Helvetica;src:local("Helvetica Bold Oblique"),local("Helvetica-BoldOblique"),url("./media/Helvetica-BoldOblique-WNENZM4W.woff2") format("woff2"),url("./media/Helvetica-BoldOblique-SYNB2XYY.woff") format("woff");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:Helvetica;src:local("Helvetica Light"),local("Helvetica-Light"),url("./media/Helvetica-Light-EM6GKDOG.woff2") format("woff2"),url("./media/Helvetica-Light-RI34VUPG.woff") format("woff");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:Helvetica;src:local("Helvetica Bold"),local("Helvetica-Bold"),url("./media/Helvetica-Bold-QUY6WUNW.woff2") format("woff2"),url("./media/Helvetica-Bold-EHPXNHAD.woff") format("woff");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Helvetica;src:local("Helvetica Light Oblique"),local("Helvetica-LightOblique"),url("./media/Helvetica-LightOblique-MNR7LXDQ.woff2") format("woff2"),url("./media/Helvetica-LightOblique-U7ENJJVV.woff") format("woff");font-weight:300;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Regular-FMYECYQ6.woff2") format("woff2"),url("./media/Poppins-Regular-JNHL4IDV.ttf") format("truetype");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Italic-3OF7FTIW.woff2") format("woff2"),url("./media/Poppins-Italic-WLX3LTPH.ttf") format("truetype");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Light-RLIPIOZ7.woff2") format("woff2"),url("./media/Poppins-Light-RMQAEPUP.ttf") format("truetype");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-LightItalic-POXDCG3Y.woff2") format("woff2"),url("./media/Poppins-LightItalic-VTL7PH46.ttf") format("truetype");font-weight:300;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Medium-GSMFCECS.woff2") format("woff2"),url("./media/Poppins-Medium-UUWQX4EV.ttf") format("truetype");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-MediumItalic-XLUQ7PEA.woff2") format("woff2"),url("./media/Poppins-MediumItalic-GSTDJYPJ.ttf") format("truetype");font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-SemiBold-XW7OMJFY.woff2") format("woff2"),url("./media/Poppins-SemiBold-TBISX6G2.ttf") format("truetype");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-SemiBoldItalic-NGIK3XXZ.woff2") format("woff2"),url("./media/Poppins-SemiBoldItalic-KATDLEJV.ttf") format("truetype");font-weight:600;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Bold-QNQ7VQ2H.woff2") format("woff2"),url("./media/Poppins-Bold-QAA2AGZS.ttf") format("truetype");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-BoldItalic-DKKNES3Q.woff2") format("woff2"),url("./media/Poppins-BoldItalic-DIK4LTR6.ttf") format("truetype");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:Poppins;
51src:url("./media/Poppins-ExtraBold-B2OVMRHE.woff2") format("woff2"),url("./media/Poppins-ExtraBold-OVZKTNJI.ttf") format("truetype");font-weight:800;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-ExtraBoldItalic-YJEHX3JT.woff2") format("woff2"),url("./media/Poppins-ExtraBoldItalic-SZLJQHPN.ttf") format("truetype");font-weight:800;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Black-BPN4KQWY.woff2") format("woff2"),url("./media/Poppins-Black-U4YX6GHD.ttf") format("truetype");font-weight:900;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-BlackItalic-DVWAALY4.woff2") format("woff2"),url("./media/Poppins-BlackItalic-A4MUAHEW.ttf") format("truetype");font-weight:900;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-ExtraLight-TM2XMBHF.woff2") format("woff2"),url("./media/Poppins-ExtraLight-SEBPXBAV.ttf") format("truetype");font-weight:200;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-ExtraLightItalic-24LLOOKM.woff2") format("woff2"),url("./media/Poppins-ExtraLightItalic-FTSQIRMY.ttf") format("truetype");font-weight:200;font-style:italic;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-Thin-LHUXUIZL.woff2") format("woff2"),url("./media/Poppins-Thin-MBJSJ55P.ttf") format("truetype");font-weight:100;font-style:normal;font-display:swap}@font-face{font-family:Poppins;src:url("./media/Poppins-ThinItalic-DATA73QQ.woff2") format("woff2"),url("./media/Poppins-ThinItalic-56ERCFD6.ttf") format("truetype");font-weight:100;font-style:italic;font-display:swap}:root{--primary:#EA432C;--primary-hover:#c0392b;--primary-light:#fff2f2;--btn-primary:var(--primary);--btn-primary-hover:var(--primary-hover);--secondary:#6c757d;--secondary-hover:#5a6268;--secondary-light:#f8f9fa;--success:#31d376;--danger:#ff4d4d;--warning:#ffb700;--info:#3b82f6;--white:#ffffff;--black:#000000;--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-300:#dee2e6;--gray-400:#ced4da;--gray-500:#adb5bd;--gray-600:#6c757d;--gray-700:#495057;--gray-800:#343a40;--gray-900:#212529;--page-bg:#ffffff;--spacing-xs:4px;--spacing-sm:8px;--spacing-md:16px;--spacing-lg:24px;--spacing-xl:32px;--spacing-xxl:48px;--radius-sm:4px;--radius-md:8px;--radius-lg:16px;--radius-full:9999px;--font-family-sans:"Poppins", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-title:"Poppins", sans-serif;--font-subtitle:"Poppins", sans-serif;--font-body:"Poppins", sans-serif;--font-size-xs:12px;--font-size-sm:14px;--font-size-base:16px;--font-size-lg:18px;--font-size-xl:20px;--font-size-2xl:24px;--font-size-3xl:30px;--shadow-sm:0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md:0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--shadow-lg:0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--transition-fast:.15s ease-in-out;--transition-base:.3s ease-in-out;--scrollbar-size:6px;--scrollbar-track:var(--gray-100);--scrollbar-thumb:var(--primary);--scrollbar-thumb-hover:var(--primary-hover);--scrollbar-radius:3px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{touch-action:manipulation}body{font-family:var(--font-body);background-color:var(--page-bg);color:var(--gray-900);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden;width:100%;min-height:100vh}button{font-family:inherit}@media(max-width:768px){body{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}button{min-height:44px;min-width:44px}*{-webkit-overflow-scrolling:touch}}</style><link rel="stylesheet" href="styles-ZCS6JHHK.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-ZCS6JHHK.css"></noscript></head> 52<body> 53 <!-- Tenant config must load before Angular bundles (blocking, from public/). --> 54
54<script src="runtime-config.js"></script>
54 55 56 <style> 57 #app-boot-fallback { 58 align-items: center; 59 background: #ffffff; 60 color: #1a1a1a; 61 display: flex; 62 flex-direction: column; 63 font-family: Arial, sans-serif; 64 gap: 16px; 65 inset: 0; 66 justify-content: center; 67 padding: 24px; 68 position: fixed; 69 text-align: center; 70 z-index: 9999; 71 } 72 73 #app-boot-fallback[hidden] { 74 display: none; 75 } 76 77 #app-boot-fallback button { 78 background: #333333; 79 border: 0; 80 border-radius: 8px; 81 color: #fff; 82 cursor: pointer; 83 font-size: 16px; 84 padding: 12px 20px; 85 } 86 </style> 87 88 <div id="app-boot-fallback" hidden> 89 <p data-boot-message>Still loading...</p> 90 <button type="button" onclick="window.location.reload()">Reload page</button> 91 </div> 92 93 <app-root></app-root> 94 95
95<script> 96 (function () { 97 var CHUNK_RELOAD_STORAGE_KEY = 'hmp_chunk_reload_attempted'; 98 var fallback = document.getElementById('app-boot-fallback'); 99 var messageEl = fallback.querySelector('[data-boot-message]'); 100 101 function showFallback(message) { 102 if (messageEl) { 103 messageEl.textContent = message; 104 } 105 106 fallback.hidden = false; 107 } 108 109 function isUnsupportedBrowser() { 110 var ua = navigator.userAgent; 111 return /MSIE\s|Trident\/|MSIE\d/.test(ua); 112 } 113 114 function isChunkLoadMessage(message) { 115 if (!message) { 116 return false; 117 } 118 119 var lower = String(message).toLowerCase(); 120 return lower.indexOf('failed to load module script') !== -1 || 121 lower.indexOf('loading chunk') !== -1 || 122 lower.indexOf('mime type') !== -1 || 123 lower.indexOf('failed to fetch dynamically imported module') !== -1; 124 } 125 126 function reloadOnceForChunkError() { 127 try { 128 if (sessionStorage.getItem(CHUNK_RELOAD_STORAGE_KEY) === 'true') { 129 showFallback( 130 'We could not load the latest version. Please hard refresh (Ctrl+F5) or clear your browser cache, then try again.' 131 ); 132 return; 133 } 134 135 sessionStorage.setItem(CHUNK_RELOAD_STORAGE_KEY, 'true'); 136 window.location.reload(); 137 } catch (error) { 138 window.location.reload(); 139 } 140 } 141 142 function isSameOriginScriptTarget(target) { 143 if (!target || target.tagName !== 'SCRIPT' || !target.src) { 144 return false; 145 } 146 147 try { 148 var scriptUrl = new URL(target.src, window.location.href); 149 return scriptUrl.origin === window.location.origin; 150 } catch (error) { 151 return true; 152 } 153 } 154 155 if (isUnsupportedBrowser()) { 156 showFallback( 157 'This browser is not supported. Please use a current version of Chrome, Firefox, Safari, or Edge.' 158 ); 159 return; 160 } 161 162 window.addEventListener('error', function (event) { 163 if (isChunkLoadMessage(event.message)) { 164 reloadOnceForChunkError(); 165 return; 166 } 167 168 if (isSameOriginScriptTarget(event.target)) { 169 reloadOnceForChunkError(); 170 } 171 }, true); 172 173 window.addEventListener('unhandledrejection', function (event) { 174 var reason = event.reason; 175 var message = reason && reason.message ? reason.message :
175String(reason || ''); 176 177 if (isChunkLoadMessage(message)) { 178 reloadOnceForChunkError(); 179 } 180 }); 181 182 var bootTimer = window.setTimeout(function () { 183 var appRoot = document.querySelector('app-root'); 184 185 if (!appRoot || !appRoot.children.length) { 186 showFallback('Still loading...'); 187 } 188 }, 25000); 189 190 window.addEventListener('app-bootstrapped', function () { 191 window.clearTimeout(bootTimer); 192 fallback.hidden = true; 193 194 try { 195 sessionStorage.removeItem(CHUNK_RELOAD_STORAGE_KEY); 196 } catch (error) { 197 // Ignore storage errors in private browsing modes. 198 } 199 }); 200 })(); 201 </script>
201 202<link rel="modulepreload" href="chunk-EK6K46QA.js"><link rel="modulepreload" href="chunk-6YIYMUXP.js"><link rel="modulepreload" href="chunk-QODTGSN5.js"><link rel="modulepreload" href="chunk-RQPB2DNY.js"><link rel="modulepreload" href="chunk-WVFVJA36.js"><link rel="modulepreload" href="chunk-BWDQI4XG.js"><link rel="modulepreload" href="chunk-7DLZNXJY.js"><link rel="modulepreload" href="chunk-65C56LPO.js"><link rel="modulepreload" href="chunk-336NVX74.js"><link rel="modulepreload" href="chunk-3NDRJOCT.js">
202<script src="main-HRYF5M3T.js" type="module"></script>
202</body> 203</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.