1<!DOCTYPE html><!-- Last Published: Sun Aug 30 2026 16:36:33 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="hiddensheds.webflow.io" data-wf-page="60ec93100c87a83041e8d482" data-wf-site="602eb43d42a3b5553a4f134c" lang="en" data-wf-collection="60ec93100c87a813dee8d45e" data-wf-item-slug="hydrosheds-v2-for-the-americas"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>HydroSHEDS v2 for the Americas</title><meta content="HydroSHEDS v2 data now available for the Americas" name="description"/><meta content="HydroSHEDS v2 for the Americas" property="og:title"/><meta content="HydroSHEDS v2 data now available for the Americas" property="og:description"/><meta content="" property="og:image"/><meta content="HydroSHEDS v2 for the Americas" name="twitter:title"/><meta content="HydroSHEDS v2 data now available for the Americas" name="twitter:description"/><meta content="" name="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><link href="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/css/hiddensheds.webflow.shared.78d773930.min.css" rel="stylesheet" type="text/css" integrity="sha384-eNdzkwSVCtNVwInoiRjV07vBoMEvnWndAQn/QvoWk5xEKfb7B+S/gX8sHlWg40nL" crossorigin="anonymous"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/>
1<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
1<script type="text/javascript">WebFont.load({ google: { families: ["Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Open Sans:300,300italic,400,400italic,600,600italic,700,700italic,800,800italic","Oswald:200,300,400,500,600,700"] }});</script>
1<script src="https://use.typekit.net/zla7mhr.js" type="text/javascript"></script>
1<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
1<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
1<link href="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/6244bf4e6fe355c3bde76dbe_Favicon-32.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/6244be3431f13d6742fc25a5_Favicon-256.png" rel="apple-touch-icon"/><!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 108 bytes, lines 1-3
1 2<script type="fs-cc" fs-cc-categories="analytics" async 3 src="https://www.googletagmanager.com/gtag/js?id=
3G-VELPMV5CZE
vendor: 14 bytes, lines 3-5
3"> 4</script> 5
6<script type="fs-cc" fs-cc-categories="analytics"> 7
vendor: 134 bytes, lines 7-11
7window.dataLayer = window.dataLayer || []; 8 function gtag(){dataLayer.push(arguments);} 9 gtag('js', new Date()); 10 11 gtag('config', '
11G-VELPMV5CZE
vendor: 4 bytes, line 11
11');
12</script>
12 13<!-- Finsweet Cookie Consent -->
14<script async src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="opt-in"></script>
14 15 16<style> body { overflow-y: auto !important; max-width: 100%;} </style><style> 17body { 18 background: #eee; 19} 20.credits { 21 margin: 20px auto; 22 text-align: center; 23} 24#beforeafter { 25/* width: 80VW; 26 max-width: 100%; 27 height: 60VW; 28 max-height: 60VH; */ 29 margin: 0 auto; 30} 31/* Plugin CSS */ 32.twentytwenty-horizontal .twentytwenty-handle:before, 33.twentytwenty-horizontal .twentytwenty-handle:after, 34.twentytwenty-vertical .twentytwenty-handle:before, 35.twentytwenty-vertical .twentytwenty-handle:after { 36 content: " "; 37 display: block; 38 background: white; 39 position: absolute; 40 z-index: 30; 41 -webkit-box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); 42 -moz-box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); 43 box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); 44} 45.twentytwenty-horizontal .twentytwenty-handle:before, 46.twentytwenty-horizontal .twentytwenty-handle:after { 47 width: 3px; 48 height: 9999px; 49 left: 50%; 50 margin-left: -1.5px; 51} 52.twentytwenty-vertical .twentytwenty-handle:before, 53.twentytwenty-vertical .twentytwenty-handle:after { 54 width: 9999px; 55 height: 3px; 56 top: 50%; 57 margin-top: -1.5px; 58} 59.twentytwenty-before-label, 60.twentytwenty-after-label, 61.twentytwenty-overlay { 62 position: absolute; 63 top: 0; 64 width: 100%; 65 height: 100%; 66} 67.twentytwenty-before-label, 68.twentytwenty-after-label, 69.twentytwenty-overlay { 70 -webkit-transition-duration: 0.5s; 71 -moz-transition-duration: 0.5s; 72 transition-duration: 0.5s; 73} 74.twentytwenty-before-label, 75.twentytwenty-after-label { 76 -webkit-transition-property: opacity; 77 -moz-transition-property: opacity; 78 transition-property: opacity; 79} 80.twentytwenty-before-label:before, 81.twentytwenty-after-label:before { 82 color: white; 83 font-size: 13px; 84 letter-spacing: 0.1em; 85} 86.twentytwenty-before-label:before, 87.twentytwenty-after-label:before { 88 position: absolute; 89 background: rgba(255, 255, 255, 0.2); 90 line-height: 38px; 91 padding: 0 20px; 92 -webkit-border-radius: 2px; 93 -moz-border-radius: 2px; 94 border-radius: 2px; 95} 96.twentytwenty-horizontal .twentytwenty-before-label:before, 97.twentytwenty-horizontal .twentytwenty-after-label:before { 98 top: 50%; 99 margin-top: -19px; 100} 101.twentytwenty-vertical .twentytwenty-before-label:before, 102.twentytwenty-vertical .twentytwenty-after-label:before { 103 left: 50%; 104 margin-left: -45px; 105 text-align: center; 106 width: 90px; 107} 108.twentytwenty-left-arrow, 109.twentytwenty-right-arrow, 110.twentytwenty-up-arrow, 111.twentytwenty-down-arrow { 112 width: 0; 113 height: 0; 114 border: 6px inset transparent; 115 position: absolute; 116} 117.twentytwenty-left-arrow, 118.twentytwenty-right-arrow { 119 top: 50%; 120 margin-top: -6px; 121} 122.twentytwenty-up-arrow, 123.twentytwenty-down-arrow { 124 left: 50%; 125 margin-left: -6px; 126} 127.twentytwenty-container { 128 -webkit-box-sizing: content-box; 129 -moz-box-sizing: content-box; 130 box-sizing: content-box; 131 z-index: 0; 132 overflow: hidden; 133 position: relative; 134 -webkit-user-select: none; 135 -moz-user-select: none; 136} 137.twentytwenty-container img { 138 max-width: 100%; 139 position: absolute; 140 top: 0; 141 display: block; 142} 143.twentytwenty-container.active .twentytwenty-overlay, 144.twentytwenty-container.active:hover.twentytwenty-overlay { 145 background: rgba(0, 0, 0, 0); 146} 147.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-before-label, 148.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-after-label, 149.twentytwenty-container.active:hover.twentytwenty-overlay .twentytwenty-before-label, 150.twentytwenty-container.active:hover.twentytwenty-overlay .twentytwenty-after-label { 151 opacity: 0; 152} 153.twentytwenty-container * { 154 -webkit-box-sizing: content-box; 155 -moz-box-sizing: content-box; 156 box-sizing: content-box; 157} 158.twentytwenty-before-label { 159 opacity: 0; 160} 161.twentytwenty-before-label:before { 162 content: ""; 163} 164#iceland .twentytwenty-before-label:before { 165 content: "TanDEM-X elevation data" } 166#hydroshedsv1 .twentytwenty-before-label:before { 167 content: "HydroSHEDS v1 northern river network" } 168#merit_comparison .twentytwenty-before-label:before { 169 content: "MERIT Hydro river network" } 170.twentytwenty-after-label { 171 opacity: 0; 172} 173.twentytwenty-after-label:before { 174 content: "HydroSHEDS v2.0"; 175} 176.twentytwenty-horizontal .twentytwenty-before-label:before { 177 left: 10px; 178} 179.twentytwenty-horizontal .twentytwenty-after-label:before { 180 right: 10px; 181}
182.twentytwenty-vertical .twentytwenty-before-label:before { 183 top: 10px; 184} 185.twentytwenty-vertical .twentytwenty-after-label:before { 186 bottom: 10px; 187} 188.twentytwenty-overlay { 189 -webkit-transition-property: background; 190 -moz-transition-property: background; 191 transition-property: background; 192 background: rgba(0, 0, 0, 0); 193 z-index: 25; 194} 195 196.twentytwenty-overlay:hover { 197 background: rgba(0, 0, 0, 0.5); 198} 199.twentytwenty-overlay:hover .twentytwenty-after-label { 200 opacity: 1; 201} 202.twentytwenty-overlay:hover .twentytwenty-before-label { 203 opacity: 1; 204} 205.twentytwenty-before { 206 z-index: 20; 207} 208.twentytwenty-after { 209 z-index: 10; 210} 211.twentytwenty-handle { 212 height: 38px; 213 width: 38px; 214 position: absolute; 215 left: 50%; 216 top: 50%; 217 margin-left: -22px; 218 margin-top: -22px; 219 border: 3px solid white; 220 -webkit-border-radius: 1000px; 221 -moz-border-radius: 1000px; 222 border-radius: 1000px; 223 -webkit-box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); 224 -moz-box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); 225 box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); 226 z-index: 40; 227 cursor: pointer; 228} 229.twentytwenty-horizontal .twentytwenty-handle:before { 230 bottom: 50%; 231 margin-bottom: 22px; 232 -webkit-box-shadow: 0 3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 233 -moz-box-shadow: 0 3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 234 box-shadow: 0 3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 235} 236.twentytwenty-horizontal .twentytwenty-handle:after { 237 top: 50%; 238 margin-top: 22px; 239 -webkit-box-shadow: 0 -3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 240 -moz-box-shadow: 0 -3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 241 box-shadow: 0 -3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 242} 243.twentytwenty-vertical .twentytwenty-handle:before { 244 left: 50%; 245 margin-left: 22px; 246 -webkit-box-shadow: 3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 247 -moz-box-shadow: 3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 248 box-shadow: 3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 249} 250.twentytwenty-vertical .twentytwenty-handle:after { 251 right: 50%; 252 margin-right: 22px; 253 -webkit-box-shadow: -3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 254 -moz-box-shadow: -3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 255 box-shadow: -3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); 256} 257.twentytwenty-left-arrow { 258 border-right: 6px solid white; 259 left: 50%; 260 margin-left: -17px; 261} 262.twentytwenty-right-arrow { 263 border-left: 6px solid white; 264 right: 50%; 265 margin-right: -17px; 266} 267.twentytwenty-up-arrow { 268 border-bottom: 6px solid white; 269 top: 50%; 270 margin-top: -17px; 271} 272.twentytwenty-down-arrow { 273 border-top: 6px solid white; 274 bottom: 50%; 275 margin-bottom: -17px; 276} 277</style></head><body><div data-animation="default" data-collapse="small" data-duration="100" data-easing="ease" data-easing2="ease-out-quad" role="banner" class="navbar-main w-nav"><div class="div-block-33"><div class="navbardiv"><a href="/" class="nav-logo-link"><img src="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/62421e0391da2b54f8930663_HydroSHEDS_logo.svg" alt="HydroSHEDS word, with the logo as the O. The logo is a globe with graticule lines and a wave across the centre." class="nav-logo"/></a><nav role="navigation" class="nav-menu-4 w-nav-menu"><div class="navbar-page"><a href="/" class="project-link-heading-cover w-nav-link">Home</a></div><div class="navbar-page"><a href="/about" class="project-link-heading-cover w-nav-link">About</a></div><div class="navbar-page"><a href="/news" class="project-link-heading-cover w-nav-link">News</a></div><div class="navbar-page"><a href="/products" class="project-link-heading-cover w-nav-link">Products</a></div><div class="navbar-page"><a href="/applications" class="project-link-heading-cover w-nav-link">Applications</a></div><div class="navbar-page"><a href="/faq" class="project-link-heading-cover w-nav-link">FAQ</a></div></nav><div class="menu-button-3 w-nav-button"><div class="icon-3 w-icon-nav-menu"></div></div></div><a href="#" class="brand w-nav-brand"></a></div></div><div class="content-section"><div class="content w-container"><img src="" loading="lazy" alt="" class="news-photo w-dyn-bind-empty"/><div class="main-text-section"><h2>HydroSHEDS v2 for the Americas</h2><div class="main-text-section w-richtext"><p><strong>We are pleased to announce the first release of HydroSHEDS v2, now available for the Americas.</strong></p><p>HydroSHEDS v2 is derived from TanDEM-X elevation data, which has been extensively conditioned by collaborator <a href="https://www.confluvio.com/hydrosheds-v2">Confluvio </a>to improve the accuracy and connectivity of drainage pathways. Confluvio collaborated with industry leader Esri, Redlands to develop new tools that improve the generation of flow directions and river lines. </p><p>Existing stream datasets, including OpenStreetMap and national hydrographic datasets, were used to âimprintâ known flow paths into the elevation maps, a new technique developed at Confluvio to guide the flow of rivers and streams in predominantly flat terrain. Additionally, our production team identified and incorporated natural sinks into the conditioning process, helping to represent internally draining basins.</p><p>The datasets feature some impressive characteristics: across the Americas, the new vector river network contains ~21 million river reaches with a combined total length of more than 35 million km. We identified about 7,700 natural sinks, incorporated close to 40 million imprint lines, and carried out nearly 200 thousand manual corrections, all reflecting the extensive conditioning and quality-control effort behind HydroSHEDS v2. For more information on HydroSHEDS v2 visit the <a href="/products/hydrosheds-v2">product page</a>.</p><p>This release includes core raster layers in GeoTIFF format at 1 arc-second resolution, approximately 3
2770 m at the equator. Raster data are provided as 10 à 10 degree tiles as well as continental composites. Vector data are available as both zipped Esri File Geodatabases and OGC GeoPackages (.gpkg).</p><p>Available products include flow directions, flow accumulation, river networks, and drainage basins (HydroBASINS Beta). Please visit the HydroSHEDS v2 <a href="/downloads-core-data-v2" target="_blank">download page </a>to access the data.</p><p>To receive updates on future HydroSHEDS v2 releases, including additional regions and data layers, sign up for the <a href="/newsletter" target="_blank">HydroSHEDS newsletter</a>. Questions and discussion are welcome in the <a href="https://hydrosheds.freeflarum.com/" target="_blank">HydroSHEDS forums</a>.</p><figure style="max-width:1913pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/602ebbdd5021f30e81efbad9/6a4d09c4c118125b1b323429_Overview_americas.jpg" loading="lazy"/></div><figcaption>HydroSHEDS v2 river network (left) was produced from TanDEM-X data using automated conditioning, manual corrections and imprinting (middle) and identifying and implementing natural sinks (right)</figcaption></figure><p>â</p></div></div><div class="div-block-42"><div data-wf--newsletter-signup--variant="base" class="signup w-form"><form id="wf-form-news-signup-page" name="wf-form-newsletter-signup" data-name="newsletter-signup" method="get" class="form-5" data-wf-page-id="60ec93100c87a83041e8d482" data-wf-element-id="113b177e-2dd3-95b6-1e8c-2dcebb104327" data-turnstile-sitekey="0x4AAAAAAAQTptj2So4dx43e"><h3 class="heading-54">Sign up for our newsletter</h3><div class="contact-form-grid"><div id="w-node-_113b177e-2dd3-95b6-1e8c-2dcebb10432b-bb104326" class="subscribe"><input class="text-field w-node-_113b177e-2dd3-95b6-1e8c-2dcebb104332-bb104326 w-input" maxlength="256" name="newsletter-email" data-name="newsletter-email" placeholder="Email *" type="email" id="newsletter-email" required=""/></div><div id="w-node-_113b177e-2dd3-95b6-1e8c-2dcebb104333-bb104326" class="subscribe"><input type="submit" data-wait="Please wait..." id="w-node-_113b177e-2dd3-95b6-1e8c-2dcebb104334-bb104326" class="subscribe-button w-button" value="Subscribe"/></div></div></form><div class="success-message w-form-done"><div>Thank you! Your submission has been received and you should receive a confirmation by email. Please confirm your subscription.</div></div><div class="error-message w-form-fail"><div>Oops! Something went wrong while submitting the form.</div></div></div></div><h3>Other news items</h3><div class="collection-list-wrapper-8 w-dyn-list"><div role="list" class="collection-list-6 w-dyn-items w-row"><div role="listitem" class="collection-item-7 w-dyn-item w-col w-col-6"><a href="/news/a-sharper-look-at-the-worlds-rivers-and-catchments-eos" class="link-block-16 w-inline-block"><div><img src="https://cdn.prod.website-files.com/602ebbdd5021f30e81efbad9/6a4dad1dc103786da8c7e14e_TDX-Formation_small.jpg" loading="lazy" width="393" alt="" sizes="(max-width: 479px) 92vw, (max-width: 767px) 82vw, (max-width: 991px) 46vw, 393px" srcset="https://cdn.prod.website-files.com/602ebbdd5021f30e81efbad9/6a4dad1dc103786da8c7e14e_TDX-Formation_small-p-500.jpg 500w, https://cdn.prod.website-files.com/602ebbdd5021f30e81efbad9/6a4dad1dc103786da8c7e14e_TDX-Formation_small-p-800.jpg 800w, https://cdn.prod.website-files.com/602ebbdd5021f30e81efbad9/6a4dad1dc103786da8c7e14e_TDX-Formation_small-p-1080.jpg 1080w, https://cdn.prod.website-files.com/602ebbdd5021f30e81efbad9/6a4dad1dc103786da8c7e14e_TDX-Formation_small.jpg 2000w" class="image-22"/><div class="text-block-42">A Sharper Look at the Worldâs Rivers and Catchments</div></div></a></div></div></div></div></div><footer id="footer" class="footer-2"><div class="div-block-25"></div><div class="footer-content"><div class="footer-component w-container"><div id="w-node-_4aca09d0-71cd-e983-4ea3-efc009f4fc1a-f166aad0" class="footer-block-2"><a href="/" class="bottom-logo w-inline-block"><img src="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/62421e8b14b8c66bd1daa8a3_HydroSHEDS_logo_light.svg" loading="lazy" width="155" alt="HydroSHEDS word, with the logo as the O. The logo is a globe with graticule lines and a wave across the centre." class="image-16"/></a></div><div id="w-node-_3bbe096a-cb66-7922-c519-1639f166aae5-f166aad0" class="footer-block-2"><ul role="list" class="list-5 w-list-unstyled"><li class="footer-item"><a href="/about" class="footer-link-2">About</a></li><li class="footer-item"><div class="footer-copyright">|</div></li><li class="footer-item"><a href="/news" class="footer-link-2">News</a></li><li class="footer-item"><div class="footer-copyright">|</div></li><li class="footer-item"><a href="/sponsors" class="footer-link-2">Sponsors</a></li><li class="footer-item"><div class="footer-copyright hide-when-small">|</div></li></ul><ul role="list" class="list-5 w-list-unstyled"><li class="footer-item"><a href="/contact" class="footer-link-2">Contact</a></li><li class="footer-item"><div class="footer-copyright">|</div></li><li class="footer-item"><a href="/terms-of-use" class="footer-link-2">Terms of Use</a></li><li class="footer-item"><div class="footer-copyright">|</div></li><li class="footer-item"><a href="/privacy" class="footer-link-2">Privacy Policy</a></li><li class="footer-item"><div class="footer-copyright">|</div></li><li class="footer-item"><a href="/newsletter" class="footer-link-2">Newsletter</a></li></ul></div></div><div class="footer-copyright">© HydroSHEDS 2026<br/></div></div></footer>
277<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=602eb43d42a3b5553a4f134c" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
277<script src="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/js/webflow.schunk.e381ae44737afe02.js" type="text/javascript" integrity="sha384-aC+KDlIL9ZeLUzml1VnUJGQDHlvA39K/wuU6VzxknZMq8uI19vSz4Fi07d2Ipd31" crossorigin="anonymous"></script>
277<script src="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/js/webflow.schunk.ab18bf50ca6a7679.js" type="text/javascript" integrity="sha384-wwWyUpK/ijy4ogRCK4yeWgJE35KPhoC5lV6nj4p2DOJIjz/rl42XJllmB0bBocTN" crossorigin="anonymous"></script>
277<script src="https://cdn.prod.website-files.com/602eb43d42a3b5553a4f134c/js/webflow.105f0303.d0e9f8d6276778af.js" type="text/javascript" integrity="sha384-DpYS+pg0VXQ3yaJkpDxvVTqk+vTxVsrQXjNm/wnq46QMDI7WJ/uFP4E/2xkLhQ0p" crossorigin="anonymous"></script>
vendor: 1 bytes, line 277
277
278<script> 279 function getParam(name) { 280 name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 281 var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 282 results = regex.exec(location.search); 283 return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 284 } 285 var Webflow = Webflow || []; 286 Webflow.push(function () { 287 var tabName = getParam('tab'); 288 if (tabName) $('.' + tabName).triggerHandler('click'); 289 }); 290 291 </script>
291 292 293
293<script> 294 document.addEventListener("DOMContentLoaded", function () { 295 const PROXY_SUBSCRIBE_URL = "https://subscribe.hydrosheds.org/subscribe"; 296 const SUBSCRIBE_SECRET = ""; 297 298 /** Webflow field ids inside each newsletter form (required on those forms). */ 299 const NEWSLETTER_EMAIL_ID = "newsletter-email"; 300 const NEWSLETTER_NAME_ID = "name-newsletter"; 301 302 /** 303 * Newsletter blocks: form id + signup_source sent to the proxy / attribs. 304 * Add a row when you add another Webflow form that uses the same field ids. 305 */ 306 const NEWSLETTER_FORMS = [ 307 { formId: "wf-form-newsletter", signupSource: "newsletter" }, 308 { formId: "wf-form-news-signup-page", signupSource: "newsletter" }, 309 ]; 310 311 /** 312 * Optional extra inputs -> POST /subscribe JSON keys (global document ids). 313 * Add matching fields on listmonk_subscribe_proxy SubscribeIn before using. 314 * 315 * @type {Array<{ elementId: string, jsonKey: string, type?: "string"|"checkbox" }>} 316 */ 317 const EXTRA_SUBSCRIBE_FIELDS = [ 318 // { elementId: "company-newsletter", jsonKey: "message", type: "string" }, 319 // { elementId: "tools-opt-in", jsonKey: "tool_interest", type: "checkbox" }, 320 ]; 321 322 const boundNewsletterForms = new WeakSet(); 323 324 function escapeSel(id) { 325 if (window.CSS && typeof window.CSS.escape === "function") return window.CSS.escape(id); 326 return id.replace(/["\\#.;:[\],>+~*'()]/g, "\\$&"); 327 } 328 329 function fieldInForm(form, elementId) { 330 if (!form || !elementId) return null; 331 return form.querySelector("#" + escapeSel(elementId)); 332 } 333 334 function trimValue(el) { 335 if (!el || typeof el.value !== "string") return ""; 336 return el.value.trim(); 337 } 338 339 function collectExtraFields() { 340 const out = {}; 341 for (const row of EXTRA_SUBSCRIBE_FIELDS) { 342 const el = document.getElementById(row.elementId); 343 if (!el) continue; 344 const t = row.type || "string"; 345 if (t === "checkbox") { 346 out[row.jsonKey] = Boolean(el.checked); 347 } else { 348 const v = trimValue(el); 349 if (v !== "") out[row.jsonKey] = v; 350 } 351 } 352 return out; 353 } 354 355 function buildSubscribeBody(email, name, signupSource) { 356 return Object.assign( 357 { 358 email: email, 359 name: name, 360 signup_source: signupSource, 361 tool_interest: false, 362 message: "", 363 }, 364 collectExtraFields() 365 ); 366 } 367 368 async function postSubscribe(body) { 369 const headers = { "Content-Type": "application/json" }; 370 if (SUBSCRIBE_SECRET) headers["X-Subscribe-Secret"] = SUBSCRIBE_SECRET; 371 return fetch(PROXY_SUBSCRIBE_URL, { 372 method: "POST", 373 headers: headers, 374 body: JSON.stringify(body), 375 }); 376 } 377 378 function bindNewsletterForm(form, signupSource) { 379 if (!form || boundNewsletterForms.has(form)) return; 380 const emailEl = fieldInForm(form, NEWSLETTER_EMAIL_ID); 381 const nameEl = fieldInForm(form, NEWSLETTER_NAME_ID); 382 if (!emailEl) return; 383 384 boundNewsletterForms.add(form); 385 386 form.addEventListener("submit", async function (event) { 387 event.preventDefault(); 388 389 const email = trimValue(emailEl); 390 const name = nameEl ? trimValue(nameEl) : ""; 391 if (!email) { 392 console.warn("Newsletter signup: missing email (#" + NEWSLETTER_EMAIL_ID + ")."); 393 return; 394 } 395 396 const body = buildSubscribeBody(email, name, signupSource); 397 398 try { 399 const response = await postSubscribe(body); 400 if (!response.ok) { 401 console.warn("Newsletter signup failed:", await response.text()); 402 return; 403 } 404 form.reset(); 405 } catch (err) { 406 console.warn("Newsletter signup failed:", err); 407 } 408 }); 409 } 410 411 for (const cfg of NEWSLETTER_FORMS) { 412 const form = document.getElementById(cfg.formId); 413 if (form) bindNewsletterForm(form, cfg.signupSource); 414 } 415 416 // Contact form: opt-in checkbox then native Webflow submit 417 const contactForm = document.getElementById("wf-form-contact-general"); 418 const contactNameField = document.getElementById("First-Name-2"); 419 const contactEmailField = document.getElementById("Email-2"); 420 const optinCheckbox = document.getElementById("checkbox-2");
421 let contactSubmitting = false; 422 423 if (contactForm && contactEmailField && optinCheckbox) { 424 contactForm.addEventListener("submit", async function (event) { 425 if (contactSubmitting) return; 426 if (!optinCheckbox.checked) return; 427 428 event.preventDefault(); 429 430 const email = trimValue(contactEmailField); 431 const name = contactNameField ? trimValue(contactNameField) : ""; 432 433 if (email) { 434 try { 435 const response = await postSubscribe(buildSubscribeBody(email, name, "contact")); 436 if (!response.ok) { 437 console.warn("Newsletter opt-in failed:", await response.text()); 438 } 439 } catch (err) { 440 console.warn("Newsletter opt-in failed:", err); 441 } 442 } 443 444 contactSubmitting = true; 445 contactForm.requestSubmit(); 446 }); 447 } 448 }); 449</script>
449 450
451<script src="https://code.jquery.com/jquery-2.2.0.min.js" integrity="sha256-ihAoc6M/JPfrIiIeayPE9xjin4UWjsx2mjW/rtmxLM4=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 451
451
452<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
452 453
454<script> 455!function(t){t.fn.twentytwenty=function(e){var e=t.extend({default_offset_pct:.5,orientation:"horizontal"},e);return this.each(function(){var n=e.default_offset_pct,i=t(this),a=e.orientation,s="vertical"===a?"down":"left",d="vertical"===a?"up":"right";i.wrap("<div class='twentytwenty-wrapper twentytwenty-"+a+"'></div>"),i.append("<div class='twentytwenty-overlay'></div>");var r=i.find("img:first"),w=i.find("img:last");i.append("<div class='twentytwenty-handle'></div>");var c=i.find(".twentytwenty-handle");c.append("<span class='twentytwenty-"+s+"-arrow'></span>"),c.append("<span class='twentytwenty-"+d+"-arrow'></span>"),i.addClass("twentytwenty-container"),r.addClass("twentytwenty-before"),w.addClass("twentytwenty-after");var o=i.find(".twentytwenty-overlay");o.append("<div class='twentytwenty-before-label'></div>"),o.append("<div class='twentytwenty-after-label'></div>");var f=function(t){var e=r.width(),n=r.height();return{w:e+"px",h:n+"px",cw:t*e+"px",ch:t*n+"px"}},l=function(t){"vertical"===a?r.css("clip","rect(0,"+t.w+","+t.ch+",0)"):r.css("clip","rect(0,"+t.cw+","+t.h+",0)"),i.css("height",t.h)},v=function(t){var e=f(t);c.css("vertical"===a?"top":"left","vertical"===a?e.ch:e.cw),l(e)};t(window).on("resize.twentytwenty",function(){v(n)});var p=0,y=0;c.on("movestart",function(t){(t.distX>t.distY&&t.distX<-t.distY||t.distX<t.distY&&t.distX>-t.distY)&&"vertical"!==a?t.preventDefault():(t.distX<t.distY&&t.distX<-t.distY||t.distX>t.distY&&t.distX>-t.distY)&&"vertical"===a&&t.preventDefault(),i.addClass("active"),p=i.offset().left,offsetY=i.offset().top,y=r.width(),imgHeight=r.height()}),c.on("moveend",function(){i.removeClass("active")}),c.on("move",function(t){i.hasClass("active")&&(n="vertical"===a?(t.pageY-offsetY)/imgHeight:(t.pageX-p)/y,0>n&&(n=0),n>1&&(n=1),v(n))}),i.find("img").on("mousedown",function(t){t.preventDefault()}),t(window).trigger("resize.twentytwenty")})}}(jQuery); 456 457!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(t,e){function n(t){function e(){a?(n(),O(e),i=!0,a=!1):i=!1}var n=t,a=!1,i=!1;this.kick=function(){a=!0,i||e()},this.end=function(t){var e=n;t&&(i?(n=a?function(){e(),t()}:t,a=!0):t())}}function a(){return!0}function i(){return!1}function o(t){t.preventDefault()}function r(t){z[t.target.tagName.toLowerCase()]||t.preventDefault()}function u(t){return 1===t.which&&!t.ctrlKey&&!t.altKey}function c(t,e){var n,a;if(t.identifiedTouch)return t.identifiedTouch(e);for(n=-1,a=t.length;++n<a;)if(t[n].identifier===e)return t[n]}function d(t,e){var n=c(t.changedTouches,e.identifier);if(n&&(n.pageX!==e.pageX||n.pageY!==e.pageY))return n}function m(t){var e;u(t)&&(e={target:t.target,startX:t.pageX,startY:t.pageY,timeStamp:t.timeStamp},K(document,Q.move,f,e),K(document,Q.cancel,s,e))}function f(t){var e=t.data;X(t,e,t,v)}function s(){v()}function v(){L(document,Q.move,f),L(document,Q.cancel,s)}function p(t){var e,n;z[t.target.tagName.toLowerCase()]||(e=t.changedTouches[0],n={target:e.target,startX:e.pageX,startY:e.pageY,timeStamp:t.timeStamp,identifier:e.identifier},K(document,B.move+"."+e.identifier,g,n),K(document,B.cancel+"."+e.identifier,h,n))}function g(t){var e=t.data,n=d(t,e);n&&X(t,e,n,l)}function h(t){var e=t.data,n=c(t.changedTouches,e.identifier);n&&l(e.identifier)}function l(t){L(document,"."+t,g),L(document,"."+t,h)}function X(t,e,n,a){var i=n.pageX-e.startX,o=n.pageY-e.startY;C*C>i*i+o*o||y(t,e,n,i,o,a)}function Y(){return this._handled=a,!1}function w(t){t._handled()}function y(t,e,n,a,i,o)(),z={textarea:!0,input:!0,select:!0,button:!0},Q={move:"mousemove",cancel:"mouseup dragstart",end:"mouseup"},B={move:"touchmove",cancel:"touchend",end:"touchend"};t.event.special.movestart={setup:R,teardown:x,add:b,remove:j,_default:function(t){function a(){D(o,r.touch,r.timeStamp),N(t.target,o)}var o,r;t._handled()&&(o={target:t.target,startX:t.startX,startY:t.startY,pageX:t.pageX,pageY:t.pageY,distX:t.distX,distY:t.distY,deltaX:t.deltaX,deltaY:t.deltaY,velocityX:t.velocityX,velocityY:t.velocityY,timeStamp:t.timeStamp,identifier:t.identifier,targetTouches:t.targetTouches,finger:t.finger},r={event:o,timer:new n(a),touch:e,timeStamp:e},t.identifier===e?(K(t.target,"click",i),K(document,Q.move,T,r),K(document,Q.end,S,r)):(t._preventTouchmoveDefault(),K(document,B.move+"."+t.identifier,_,r),K(document,B.end+"."+t.identifier,q,r)))}},t.event.special.move={setup:function(){K(this,"movestart.move",t.noop)},teardown:function(){L(this,"movestart.move",t.noop)}},t.event.special.moveend={setup:function(){K(this,"movestart.moveend",t.noop)},teardown:function(){L(this,"movestart.moveend",t.noop)}},K(document,"mousedown.move",m),K(document,"touchstart.move",p),"function"==typeof Array.prototype.indexOf&&!function(t){for(var e=["changedTouches","targetTouches"],n=e.length;n--;)-1===t.event.props.indexOf(e[n])&&t.event.props.push(e[n])}(t)}); 458 459$('.twentytwenty-container').imagesLoaded(function(){ 460 $(".twentytwenty-container").twentytwenty(); 461}); 462 463$(window).load(function() { 464 $("#beforeafter").twentytwenty(); 465}); 466</script>
466 467 468<!-- If you already loaded HE then you don't need this line-->
469<script src="https://cdnjs.cloudflare.com/ajax/libs/he/1.2.0/he.min.js"></script>
469 470<!-- decode CMS collection item embed -->
471<script type="text/javascript"> 472$(document).ready(function () { 473 // targeting class of .podcast-embed 474 $(".podcast-embed").each(function () { 475 $(this).hide(); // hide so code is not displayed (better to hide in CSS) 476 $(this).html(he.decode($(this).html())); // decode the text 477 $(this).show(); // show the decoded element 478 }); 479}); 480</script>
480</body></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.