CINXE.COM

Banking | Ceres: Sustainability is the bottom line

<!-- /layout.antlers.html --> <!doctype html> <html lang="en" class="antialiased"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> <link rel="preload" as="style" href="https://www.ceres.org/build/assets/site-df610a48.css" /><link rel="modulepreload" href="https://www.ceres.org/build/assets/site-0e22662f.js" /><link rel="stylesheet" href="https://www.ceres.org/build/assets/site-df610a48.css" data-navigate-track="reload" /><script type="module" src="https://www.ceres.org/build/assets/site-0e22662f.js" data-navigate-track="reload"></script> <link rel="stylesheet" href="https://unpkg.com/tippy.js@6/dist/tippy.css" /> <!-- statamic-peak-seo::snippets/_seo.antlers.html --> <title> Banking | Ceres: Sustainability is the bottom line </title> <link rel="canonical" href="https://www.ceres.org/banking"> <meta property="og:site_name" content="Ceres: Sustainability is the bottom line"> <meta property="og:type" content="website"> <meta property="og:locale" content="en_US"> <meta property="og:title" content="Banking"> <meta property="og:image" content="https://assets.ceres.org/cache/containers/social_images/social-media-preview.png/2e2942f777ec2f94bcfb196fcd49af51.png"> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-K7574ND');function gtag(){dataLayer.push(arguments);}</script> <script> gtag('consent', 'default', { 'ad_storage': 'denied', 'analytics_storage': 'denied', 'wait_for_update': 500 }); dataLayer.push({ 'event': 'default_consent' }); </script> <!-- End: statamic-peak-seo::snippets/_seo.antlers.html --> <!-- /snippets/_browser_appearance.antlers.html --> <link rel="icon" href="https://assets.ceres.org/images/favicons/ceres_logo.svg" type="image/svg+xml"> <link rel="icon" href="/favicons/default/favicon.ico" type="image/x-icon"> <link rel="icon" href="https://assets.ceres.org/cache/containers/favicons/ceres_logo.png/745e90b115200c251a72efe551a21a93.png" sizes="16x16"> <link rel="icon" href="https://assets.ceres.org/cache/containers/favicons/ceres_logo.png/604ff9f514f749ad9c374c18a9fdfc07.png" sizes="32x32"> <link rel="manifest" href="https://www.ceres.org/site.webmanifest"> <!-- End: /snippets/_browser_appearance.antlers.html --> <script src="https://75fc01f3120645c39e3c70274c82795f.js.ubembed.com" async></script> <script type='text/javascript'> piAId = '1076862'; piCId = ''; piHostname = 'marketing.ceres.org'; (function() { function async_load(){ var s = document.createElement('script'); s.type = 'text/javascript'; s.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + piHostname + '/pd.js'; var c = document.getElementsByTagName('script')[0]; c.parentNode.insertBefore(s, c); } if(window.attachEvent) { window.attachEvent('onload', async_load); } else { window.addEventListener('load', async_load, false); } })(); </script> <!-- Livewire Styles --><style >[wire\:loading][wire\:loading], [wire\:loading\.delay][wire\:loading\.delay], [wire\:loading\.inline-block][wire\:loading\.inline-block], [wire\:loading\.inline][wire\:loading\.inline], [wire\:loading\.block][wire\:loading\.block], [wire\:loading\.flex][wire\:loading\.flex], [wire\:loading\.table][wire\:loading\.table], [wire\:loading\.grid][wire\:loading\.grid], [wire\:loading\.inline-flex][wire\:loading\.inline-flex] {display: none;}[wire\:loading\.delay\.none][wire\:loading\.delay\.none], [wire\:loading\.delay\.shortest][wire\:loading\.delay\.shortest], [wire\:loading\.delay\.shorter][wire\:loading\.delay\.shorter], [wire\:loading\.delay\.short][wire\:loading\.delay\.short], [wire\:loading\.delay\.default][wire\:loading\.delay\.default], [wire\:loading\.delay\.long][wire\:loading\.delay\.long], [wire\:loading\.delay\.longer][wire\:loading\.delay\.longer], [wire\:loading\.delay\.longest][wire\:loading\.delay\.longest] {display: none;}[wire\:offline][wire\:offline] {display: none;}[wire\:dirty]:not(textarea):not(input):not(select) {display: none;}:root {--livewire-progress-bar-color: #2299dd;}[x-cloak] {display: none !important;}[wire\:cloak] {display: none !important;}</style> <script>(function(w,d,s,n,a){if(!w[n]){var l='call,catch,on,once,set,then,track' .split(','),i,o=function(n){return'function'==typeof n?o.l.push([arguments])&&o :function(){return o.l.push([n,arguments])&&o}},t=d.getElementsByTagName(s)[0], j=d.createElement(s);j.async=!0;j.src='https://cdn.fundraiseup.com/widget/'+a+''; t.parentNode.insertBefore(j,t);o.s=Date.now();o.v=4;o.h=w.location.href;o.l=[]; for(i=0;i<7;i++)o[l[i]]=o(l[i]);w[n]=o} })(window,document,'script','FundraiseUp','ADRUXVPU');</script> </head> <body class="overflow-x-hidden"> <!-- statamic-peak-tools::snippets/_noscript.antlers.html --> <noscript> <style> nav.hidden, nav ul [x-cloak], nav ul li ul { display: block !important; } </style> <p class="relative z-50 py-3 px-4 bg-gray-100 border-b border-gray-200 text-center font-bold text-xs text-gray-600">This website requires Javascript for some parts to function properly. Your experience may vary.</p> </noscript> <!-- End: statamic-peak-tools::snippets/_noscript.antlers.html --> <!-- statamic-peak-tools::navigation/_skip_links.antlers.html --> <div class="z-50 text-sm font-bold text-white [&_a]:fixed [&_a]:px-4 [&_a]:py-2 [&_a]:-translate-y-24 [&_a]:opacity-0 [&_a]:top-4 [&_a]:left-8 [&_a]:bg-primary [&_a]:focus-visible:translate-y-0 [&_a]:focus-visible:opacity-100 [&_a]:outline-primary [&_a]:motion-safe:transition-transform"> <a href="#content">Skip to content</a> </div> <!-- End: statamic-peak-tools::navigation/_skip_links.antlers.html --> <!-- statamic-peak-tools::components/_toolbar.antlers.html --> <!-- End: statamic-peak-tools::components/_toolbar.antlers.html --> <!-- statamic-peak-seo::components/_consent_banner.antlers.html --> <div x-data="consentBanner" x-show="!$store.consentBanner.getConsent()" x-transition class=" fixed z-[1000] inset-x-[1rem] bottom-[1rem] md:bottom-[2rem] max-h-[calc(100vh-2rem)] md:max-h-[calc(100vh-4rem)] md:w-[21rem] flex flex-col stack-2 p-6 bg-white border border-neutral/10 rounded shadow-lg overflow-auto overscroll-contain md:right-auto md:left-[2rem] " x-cloak > <h2 class="text-2xl font-bold">Cookies 🍪</h2> <p class="text-sm font-bold text-neutral"> This site uses cookies that need consent. </p> <div class="stack-space-4 py-6 flex flex-col gap-4"> <template x-for="type in $store.consentBanner.getConsentTypes()"> <label class="inline-flex"> <template x-if="type.disabled"> <input class="mr-2 w-4 h-4 rounded border-neutral !bg-cw-green-200 focus:border-cw-green-200 opacity-50" type="checkbox" :name="type.handle" checked disabled> </template> <template x-if="!type.disabled"> <input class="mr-2 w-4 h-4 rounded border-neutral checked:!bg-cw-green-200 focus:border-cw-green-200" type="checkbox" :name="type.handle" x-model="type.value"> </template> <span class="flex flex-col gap-0.5"> <span class="font-bold text-xs" x-html="type.title"></span> <span class="text-xs" x-html="type.explanation"></span> </span> </label> </template> </div> <div class="stack-space-4 flex flex-wrap gap-2"> <button @click="$store.consentBanner.acceptAll()" type="button" class="px-2 py-2 rounded text-xs font-bold bg-cw-green-200 text-white outline-primary"> Accept all </button> <button @click="$store.consentBanner.saveConsent()" type="button" class="px-2 py-2 rounded text-xs font-bold bg-neutral/10 text-neutral"> Accept selected </button> <button @click="$store.consentBanner.rejectAll()" type="button" class="px-2 py-2 rounded text-xs font-bold bg-neutral/10 text-neutral"> Reject all </button> </div> <script> let consentData = { "consent": false, "date": null, "consent_api": true, "custom_scripts": false, "types": [ { "value": true, "handle": "functionalCookies", "title": "Functional", "explanation": "First party cookies needed for the website to function. These can't be turned off.", "disabled": true }, { "value": false, "handle": "analyticsStorage", "title": "Analytics", "explanation": "Third party cookies used for analytics.", "consent_api": true, "consent_api_handle": "analytics_storage" }, { "value": false, "handle": "adStorage", "title": "Ads & tracking", "explanation": "Third party cookies used for advertisement.", "consent_api": true, "consent_api_handle": "ad_storage" }, { "value": false, "handle": "adUserData", "title": "Share Ad Data", "explanation": "Share advertising data with Google.", "consent_api": true, "consent_api_handle": "ad_user_data" }, { "value": false, "handle": "adPersonalization", "title": "Personalize Ads", "explanation": "Allow for personalized advertising.", "consent_api": true, "consent_api_handle": "ad_personalization" }, ] } </script> <script> document.addEventListener('alpine:init', () => { Alpine.store('consentBanner', { data: Alpine.$persist(consentData).as('consentBannerDefault'), acceptAll() { this.data.types.forEach((type) => type.value = true) this.saveConsent() }, getConsent() { return this.data.consent }, getConsentAPIValues() { return this.data.types.filter((type) => { return type['consent_api'] === true }).reduce((acc, type) => { acc[type.consent_api_handle] = type.value ? 'granted' : 'denied'; return acc; }, {}); }, getCustomScripts() { return this.data.types.filter((type) => type.hasOwnProperty('script_fragments') && type.value); }, getConsentDate() { return this.data.date }, getConsentTypes() { return this.data.types }, getConsentValue(handle) { return this.data.types.filter((type) => { return type['handle'] === handle })[0]['value'] }, invalidate() { this.data = consentData }, rejectAll() { this.data.types.forEach((type) => type.value = false) this.saveConsent() }, revokeConsent() { this.data.consent = false this.data.date = null }, saveConsent() { this.data.consent = true this.data.date = Math.floor(Date.now() / 1000) }, useConsentAPI() { return this.data.consent_api }, useCustomScripts() { return this.data.custom_scripts }, useEmbeds() { return this.data.embeds } }) Alpine.data('consentBanner', () => { return { data: Alpine.store('consentBanner').data, init() { if (Alpine.store('consentBanner').getConsentDate() < '') { Alpine.store('consentBanner').invalidate() } if (Alpine.store('consentBanner').useConsentAPI() && Alpine.store('consentBanner').getConsent()) { gtag('consent', 'update', Alpine.store('consentBanner').getConsentAPIValues()) } if (Alpine.store('consentBanner').useConsentAPI()) { this.$watch('data.consent', value => value && gtag('consent', 'update', Alpine.store('consentBanner').getConsentAPIValues())) } if (Alpine.store('consentBanner').useCustomScripts() && Alpine.store('consentBanner').getConsent()) { this.runCustomScripts() } if (Alpine.store('consentBanner').useCustomScripts()) { this.$watch('data.consent', value => value ? this.runCustomScripts() : this.removeCustomScripts()) } }, runCustomScripts() { Alpine.store('consentBanner') .getCustomScripts() .flatMap(script => script.script_fragments) .forEach(script => { const tag = document.createElement('script') script.type === 'script_tag' ? tag.src = script.source : tag.text = script.inline_script tag.defer = script.defer tag.async = script.async script.attributes.forEach(attribute => tag.setAttribute(attribute.key, attribute.value)) document.head.appendChild(tag) this.$el.addEventListener(`remove-custom-scripts-${script.category}`, () => tag.remove(), {once: true}) }) }, removeCustomScripts() { Alpine.store('consentBanner') .getCustomScripts() .forEach(script => this.$dispatch(`remove-custom-scripts-${script.handle}`)) } } }) }) </script> </div> <!-- End: statamic-peak-seo::components/_consent_banner.antlers.html --> <section> </section> <nav x-data="{ activeButton: null, activeSubMenu: null, activeSection: null, isMenuOpen: false, closeAllSubMenus: function() { this.activeButton = null; this.activeSubMenu = null; }, isSearchOpen: false, }" @keydown.escape.window="activeButton = null; activeSubMenu = null;" class="overflow-hidden" > <div class="bg-white relative border-b border-b-cw-green-50/40 z-[500]"> <div class="container flex flex-col lg:flex-row justify-between py-5"> <div class="flex xl:flex-row gap-10 justify-between w-full md:w-auto items-center"> <!-- /components/_logo.antlers.html --> <a aria-label="Logo Ceres" href="/" > <img src="/visuals/logo-dark.svg" class="select-none " width="" alt="Ceres"/> </a> <!-- End: /components/_logo.antlers.html --> <div class="flex flex-row items-center gap-5"> <button title="Search" aria-label="Search" class="inline-block lg:hidden" @click="isSearchOpen = !isSearchOpen;"> <svg width="20" height="20" class="cursor-pointer" aria-hidden="true" fill="none" stroke="black" viewBox="-1 -1 21 21"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="4" d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"/> </svg> </button> <button type="button" class="inline-flex items-center p-2 w-10 h-10 justify-center text-sm text-white rounded-lg lg:hidden focus:outline-none" aria-controls="mega-menu-full" aria-expanded="false" @click="isMenuOpen = !isMenuOpen; closeAllSubMenus()" @keydown.escape.window="isMenuOpen = false; closeAllSubMenus()" x-bind:aria-expanded="isMenuOpen.toString()" > <span class="sr-only">Open main menu</span> <svg class="w-5 h-5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="#72c100" viewBox="0 0 17 14"> <path stroke="#9CDD36" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M1 1h15M1 7h15M1 13h15"/> </svg> </button> </div> </div> <div id="mega-menu-full" class="gap-5 items-center justify-between hidden w-full lg:flex lg:w-auto lg:order-1 flex-grow" :class="{ 'hidden': !isMenuOpen }"> <ul id="megaMenuItemList" @click.away=" if (!$event.target.closest('#megaMenuItemList, #megaMenuNavigation')) { activeButton = null; activeSubMenu = null; } " class="flex flex-col mt-4 py-2 font-medium lg:flex-row lg:space-x-8 lg:mt-0"> <li> <button id="mega-menu-button-1" class="flex items-center justify-between w-full py-1 hover:text-black text-black/80 transition-all duration-200 relative group outline-none text-lg font-medium" :class="{ '!text-cw-green-400': activeButton === 'mega-menu-button-1' }" @click="activeButton = activeButton === 'mega-menu-button-1' ? null : 'mega-menu-button-1'; activeSubMenu = activeSubMenu === 'mega-menu-1' ? null : 'mega-menu-1'; activeSection = null" > Our work <span class="absolute w-12 h-0.5 bg-white bottom-0 left-0 group-hover:opacity-100 transition-all duration-200 ease-in-out opacity-0" :class="{ 'opacity-100': activeButton === 'mega-menu-button-1' }"></span> </button> </li> <li> <button id="mega-menu-button-2" class="flex items-center justify-between w-full py-1 hover:text-black text-black/80 transition-all duration-200 relative group outline-none text-lg font-medium" :class="{ '!text-cw-green-400': activeButton === 'mega-menu-button-2' }" @click="activeButton = activeButton === 'mega-menu-button-2' ? null : 'mega-menu-button-2'; activeSubMenu = activeSubMenu === 'mega-menu-2' ? null : 'mega-menu-2'; activeSection = null" > Get involved <span class="absolute w-12 h-0.5 bg-white bottom-0 left-0 group-hover:opacity-100 transition-all duration-200 ease-in-out opacity-0" :class="{ 'opacity-100': activeButton === 'mega-menu-button-2' }"></span> </button> </li> <li> <button id="mega-menu-button-3" class="flex items-center justify-between w-full py-1 hover:text-black text-black/80 transition-all duration-200 relative group outline-none text-lg font-medium" :class="{ '!text-cw-green-400': activeButton === 'mega-menu-button-3' }" @click="activeButton = activeButton === 'mega-menu-button-3' ? null : 'mega-menu-button-3'; activeSubMenu = activeSubMenu === 'mega-menu-3' ? null : 'mega-menu-3'; activeSection = null" > Resources <span class="absolute w-12 h-0.5 bg-white bottom-0 left-0 group-hover:opacity-100 transition-all duration-200 ease-in-out opacity-0" :class="{ 'opacity-100': activeButton === 'mega-menu-button-3' }"></span> </button> </li> <li> <button id="mega-menu-button-4" class="flex items-center justify-between w-full py-1 hover:text-black text-black/80 transition-all duration-200 relative group outline-none text-lg font-medium" :class="{ '!text-cw-green-400': activeButton === 'mega-menu-button-4' }" @click="activeButton = activeButton === 'mega-menu-button-4' ? null : 'mega-menu-button-4'; activeSubMenu = activeSubMenu === 'mega-menu-4' ? null : 'mega-menu-4'; activeSection = null" > About Ceres <span class="absolute w-12 h-0.5 bg-white bottom-0 left-0 group-hover:opacity-100 transition-all duration-200 ease-in-out opacity-0" :class="{ 'opacity-100': activeButton === 'mega-menu-button-4' }"></span> </button> </li> </ul> <div class="flex flex-row items-center gap-6"> <button title="Search" aria-label="Search" class="hidden lg:inline-block" @click=" isSearchOpen = !isSearchOpen; $nextTick(() => { if (isSearchOpen) { requestAnimationFrame(() => { document.getElementById('navSearchField').focus(); }) } }); "> <svg width="20" height="20" class="stroke-black" class="cursor-pointer text-cw-green-400" aria-hidden="true" fill="none" viewBox="-3 -3 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="4" d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"/> </svg> </button> <!-- /components/_button.antlers.html --> <a class=" cursor-pointer py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start hidden xl:inline-block bg-cw-green-200 font-bold text-white text-lg [&_svg]:stroke-white [&_svg]:fill-white <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="#XLXBXUKE" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> Donate </div> </a> <!-- End: /components/_button.antlers.html --> <script> <a href="#XLXBXUKE" style="display: none"></a> </script> </div> </div> </div> </div> <div class="w-full bg-white p-5" x-show="isSearchOpen" x-cloak> <div class="container"> <form action="/search" class="" x-data="{ query: '' }"> <label for="nav-search" class="mb-2 text-sm font-medium sr-only">Search</label> <div class="relative flex flex-row gap-2 items-center"> <input id="navSearchField" type="search" name="q" class="bg-transparent border-cw-green-800 w-full focus:border-cw-green-800 rounded-md py-3 px-6" placeholder="Search" autocomplete="off" x-model="query" > <div x-bind:class="{'opacity-50': query.trim() === ''}"> <button type="submit" class="py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start inline-block bg-cw-green-200 font-bold text-white text-lg" :disabled="query.trim() === ''" x-bind:class="{'cursor-not-allowed opacity-50': query.trim() === ''}" x-bind:aria-disabled="query.trim() === ''" > <div class="flex flex-row text-center items-center justify-center gap-2"> Search </div> </button> </div> </div> </form> </div> </div> <div class="absolute w-full z-[300]"> <div class="lg:container bg-white lg:bg-transparent [&_a]:before:hidden [&_a]:md:before:block [&_a]:relative [&_a]:before:opacity-0 [&_a]:before:transition-opacity hover:[&_a]:before:opacity-100 [&_a]:before:bg-cw-green-150/10 [&_a]:before:w-[calc(100%+1.5rem)] [&_a]:before:h-full [&_a]:before:absolute [&_a]:before:rounded-md [&_a]:before:-left-3"> <div id="megaMenuNavigation" class="container md:max-w-full md:px-0 pb-2 lg:pb-0 overflow-hidden"> <div id="mega-menu-1" class="bg-white hidden" :class="{ 'hidden': activeSubMenu !== 'mega-menu-1' }"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 relative gap-0 col-span-full "> <span class="hidden md:block absolute bg-gradient-to-b from-black/20 to-transparent top-0 w-full h-2 z-50"></span> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-0 col-span-full md:col-span-8 md:gap-x-4 lg:gap-x-8 xl:gap-x-16 pt-6 md:px-8 lg:py-10 "> <div class="col-span-full md:col-span-4"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'help-our-work-0' ? null : 'help-our-work-0'" class="mb-5 md:mb-0 col-span-full lg:col-span-3 pb-2 border-b-2 border-black text-sm cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-base">Issues we work on</p> <!-- End: /typography/_p.antlers.html --> </div> <div :class="activeSection === 'help-our-work-0' ? 'max-h-[1200px]' : 'max-h-0'" class="transition-all duration-500 ease-in-out col-span-3 overflow-hidden md:overflow-visible md:max-h-full"> <div class="flex flex-col gap-3 md:gap-2"> <a href="/climate" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="block py-1 md:py-3 group before:top-1 leading-tight"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Climate change</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Advancing business solutions for a cleaner, more resilient economy.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/nature" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="block py-1 md:py-3 group before:top-1 leading-tight"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Nature and biodiversity loss</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Restoring and preserving our natural ecosystems.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/water" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="block py-1 md:py-3 group before:top-1 leading-tight"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Water scarcity and pollution</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Protecting our precious global water resources.</p> <!-- End: /typography/_p.antlers.html --> </a> </div> </div> </div> </div> <div class="col-span-full md:col-span-8"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'know-our-work-0' ? null : 'know-our-work-0'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Sectors we work in</p> <!-- End: /typography/_p.antlers.html --> </div> <div :class="activeSection === 'know-our-work-0' ? 'max-h-[1200px]' : 'max-h-0'" class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 md:gap-y-2 gap-y-3 lg:gap-x-8 "> <a href="/banking" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Banking</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Financing the transition to a cleaner economy.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/food" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Food and beverage</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Building a more just and sustainable food system.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/oil-and-gas" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Oil and gas</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Transitioning away from fossil fuels.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/transportation" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Transportation</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Cutting emissions and driving innovation.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/steel" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Steel</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Reducing climate impacts in the built environment.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/electric-power" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Electric power</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Improving the electric utility landscape.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/accelerator/insurance" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Insurance</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Addressing risk and seizing new opportunities.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/sectors" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">More sectors</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">We work across nearly all sectors of the economy.</p> <!-- End: /typography/_p.antlers.html --> </a> </div> </div> </div> </div> </div> <div class=" gap-0 col-span-full md:col-span-4 relative pb-6 md:px-8 md:pt-6 lg:py-10 md:bg-cw-green-50 " > <div class="relative"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'latest-our-work-0' ? null : 'latest-our-work-0'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Latest resources</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out" :class="activeSection === 'latest-our-work-0' ? 'max-h-[1200px]' : 'max-h-0'"> <div class="flex flex-col gap-1 md:gap-5"> <a href="/resources/reports/leading-with-transparency-improving-climate-risk-disclosure-by-municipal-governments" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/leading-with-transparency---landing.png/ef6df40b2a38d357ab71159ba00d9895/leading-with-transparency---landing.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Leading with Transparency: A Guide to Strengthening Climate Disclosure and Resilience in the Municipal Bond Market </h4> </div> </div> </div> </a> <a href="/resources/reports/unlocking-opportunity-addressing-livestock-methane-to-build-resilient-food-systems" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/adobestock_169901658.jpeg/4b236f1d68a2d7d72e451f4671d55201/adobestock_169901658.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Unlocking Opportunity: Addressing Livestock Methane to Build Resilient Food Systems </h4> </div> </div> </div> </a> </div> </div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-5 md:mb-0 pb-2 border-b-2 border-black">Quick finds</p> <!-- End: /typography/_p.antlers.html --> <div class="flex flex-row md:flex-col gap-5 md:gap-4 justify-between md:justify-start hover:[&_a]:text-cw-green-250"> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="https://www.ceres.org/support" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Support our work</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/resources/news" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">News and insights</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/events" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Events and webinars</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> </div> </div> </div> </div> <span class="bg-cw-green-200 hidden lg:block absolute left-0 right-0 bottom-0 py-2 text-white"></span> </div> </div> <div id="mega-menu-2" class="bg-white hidden" :class="{ 'hidden': activeSubMenu !== 'mega-menu-2' }"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 relative gap-0 col-span-full "> <span class="hidden md:block absolute bg-gradient-to-b from-black/20 to-transparent top-0 w-full h-2 z-50"></span> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-0 col-span-full md:col-span-8 md:gap-x-4 lg:gap-x-8 xl:gap-x-16 pt-6 md:px-8 lg:py-10 "> <div class="col-span-full md:col-span-4"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'help-get-involved-1' ? null : 'help-get-involved-1'" class="mb-5 md:mb-0 col-span-full lg:col-span-3 pb-2 border-b-2 border-black text-sm cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-base">Who we work with</p> <!-- End: /typography/_p.antlers.html --> </div> <div :class="activeSection === 'help-get-involved-1' ? 'max-h-[1200px]' : 'max-h-0'" class="transition-all duration-500 ease-in-out col-span-3 overflow-hidden md:overflow-visible md:max-h-full"> <div class="flex flex-col gap-3 md:gap-2"> <a href="/get-involved#investors" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="block py-1 md:py-3 group before:top-1 leading-tight"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Investors</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">We work with leading asset managers and owners, public pension funds, and more.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/get-involved#companies" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="block py-1 md:py-3 group before:top-1 leading-tight"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Companies</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">We work with leading companies, including many Fortune 500 companies.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/get-involved#small-to-mid-size-enterprises" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="block py-1 md:py-3 group before:top-1 leading-tight"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Small and midsize enterprises</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">We provide resources to support SMEs on their sustainability journey.</p> <!-- End: /typography/_p.antlers.html --> </a> </div> </div> </div> </div> <div class="col-span-full md:col-span-8"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'know-get-involved-1' ? null : 'know-get-involved-1'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Ways to get involved</p> <!-- End: /typography/_p.antlers.html --> </div> <div :class="activeSection === 'know-get-involved-1' ? 'max-h-[1200px]' : 'max-h-0'" class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 md:gap-y-2 gap-y-3 lg:gap-x-8 "> <a href="/networks" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Join a network</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Learn more about our investor, company, and policy networks.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/get-involved/initiatives" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Join an initiative</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Explore initiatives, working groups, and advocacy opportunities.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/get-involved/sponsors" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Become a sponsor</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Maximize your impact with premium benefits across the year.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/events" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Attend an event</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Engage with leading business and sustainability experts virtually and in-person.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/support" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Ways to give</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Your donation can help ensure a just and resilient future.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/subscribe" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-6 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Subscribe</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Sign up for the latest news and updates from Ceres.</p> <!-- End: /typography/_p.antlers.html --> </a> </div> </div> </div> </div> </div> <div class=" gap-0 col-span-full md:col-span-4 relative pb-6 md:px-8 md:pt-6 lg:py-10 md:bg-cw-green-50 " > <div class="relative"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'latest-get-involved-1' ? null : 'latest-get-involved-1'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Latest resources</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out" :class="activeSection === 'latest-get-involved-1' ? 'max-h-[1200px]' : 'max-h-0'"> <div class="flex flex-col gap-1 md:gap-5"> <a href="/resources/reports/leading-with-transparency-improving-climate-risk-disclosure-by-municipal-governments" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/leading-with-transparency---landing.png/ef6df40b2a38d357ab71159ba00d9895/leading-with-transparency---landing.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Leading with Transparency: A Guide to Strengthening Climate Disclosure and Resilience in the Municipal Bond Market </h4> </div> </div> </div> </a> <a href="/resources/reports/unlocking-opportunity-addressing-livestock-methane-to-build-resilient-food-systems" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/adobestock_169901658.jpeg/4b236f1d68a2d7d72e451f4671d55201/adobestock_169901658.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Unlocking Opportunity: Addressing Livestock Methane to Build Resilient Food Systems </h4> </div> </div> </div> </a> </div> </div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-5 md:mb-0 pb-2 border-b-2 border-black">Quick finds</p> <!-- End: /typography/_p.antlers.html --> <div class="flex flex-row md:flex-col gap-5 md:gap-4 justify-between md:justify-start hover:[&_a]:text-cw-green-250"> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="https://www.ceres.org/support" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Support our work</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/resources/news" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">News and insights</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/events" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Events and webinars</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> </div> </div> </div> </div> <span class="bg-cw-green-200 hidden lg:block absolute left-0 right-0 bottom-0 py-2 text-white"></span> </div> </div> <div id="mega-menu-3" class="bg-white hidden" :class="{ 'hidden': activeSubMenu !== 'mega-menu-3' }"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 relative gap-0 col-span-full "> <span class="hidden md:block absolute bg-gradient-to-b from-black/20 to-transparent top-0 w-full h-2 z-50"></span> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-0 col-span-full md:col-span-8 md:gap-x-4 lg:gap-x-8 xl:gap-x-16 pt-6 md:px-8 lg:py-10 "> <div class="col-span-full "> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'know-resources-2' ? null : 'know-resources-2'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Select a resource</p> <!-- End: /typography/_p.antlers.html --> </div> <div :class="activeSection === 'know-resources-2' ? 'max-h-[1200px]' : 'max-h-0'" class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 md:gap-y-2 gap-y-3 lg:gap-x-8 "> <a href="/resources/reports" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Reports</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">View our cutting-edge research and analysis to learn about sustainability risks, opportunities, and solutions.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/resources/assessments" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Benchmarks and assessments</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">See the progress businesses are making toward their sustainability goals.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/events" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Events and webinars</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Hear from leading business and sustainability experts virtually and in-person.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/resources/news" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">News and insights</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Read our latest press releases and statements and expert commentary.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/resources/tools" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Tools</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Use our interactive tools to support your company or investment firm’s sustainability journey.</p> <!-- End: /typography/_p.antlers.html --> </a> </div> </div> </div> </div> <a href="/resources" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="w-fit min-w-24 h-fit py-2 before:top-0.5 hidden md:block"> <div class="flex flex-row items-center gap-3 pb-2 relative after:absolute after:h-0.5 after:w-24 after:bg-cw-green-800 after:bottom-0 mb-4 md:mb-0"> <!-- /typography/_h3.antlers.html --> <h3 class="text-base font-semibold text-nowrap">View all resources</h3> <!-- End: /typography/_h3.antlers.html --> <svg class="w-[10px] h-[10px] inline fill-black" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/> </svg> </div> </a> </div> <div class=" gap-0 col-span-full md:col-span-4 relative pb-6 md:px-8 md:pt-6 lg:py-10 md:bg-cw-green-50 " > <div class="relative"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'latest-resources-2' ? null : 'latest-resources-2'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Latest resources</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out" :class="activeSection === 'latest-resources-2' ? 'max-h-[1200px]' : 'max-h-0'"> <div class="flex flex-col gap-1 md:gap-5"> <a href="/resources/reports/leading-with-transparency-improving-climate-risk-disclosure-by-municipal-governments" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/leading-with-transparency---landing.png/ef6df40b2a38d357ab71159ba00d9895/leading-with-transparency---landing.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Leading with Transparency: A Guide to Strengthening Climate Disclosure and Resilience in the Municipal Bond Market </h4> </div> </div> </div> </a> <a href="/resources/reports/unlocking-opportunity-addressing-livestock-methane-to-build-resilient-food-systems" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/adobestock_169901658.jpeg/4b236f1d68a2d7d72e451f4671d55201/adobestock_169901658.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Unlocking Opportunity: Addressing Livestock Methane to Build Resilient Food Systems </h4> </div> </div> </div> </a> </div> </div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-5 md:mb-0 pb-2 border-b-2 border-black">Quick finds</p> <!-- End: /typography/_p.antlers.html --> <div class="flex flex-row md:flex-col gap-5 md:gap-4 justify-between md:justify-start hover:[&_a]:text-cw-green-250"> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="https://www.ceres.org/support" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Support our work</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/resources/news" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">News and insights</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/events" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Events and webinars</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> </div> </div> </div> </div> <span class="bg-cw-green-200 hidden lg:block absolute left-0 right-0 bottom-0 py-2 text-white"></span> </div> <a href="/resources" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="w-fit visible md:hidden"> <div class="flex flex-row items-center gap-3 pb-3 relative after:absolute after:h-0.5 after:w-24 after:bg-cw-green-800 after:bottom-0 mb-4 md:mb-0"> <!-- /typography/_h3.antlers.html --> <h3 class="text-base font-semibold">View all resources</h3> <!-- End: /typography/_h3.antlers.html --> <svg class="w-[10px] h-[10px] inline fill-black" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/> </svg> </div> </a> </div> <div id="mega-menu-4" class="bg-white hidden" :class="{ 'hidden': activeSubMenu !== 'mega-menu-4' }"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 relative gap-0 col-span-full "> <span class="hidden md:block absolute bg-gradient-to-b from-black/20 to-transparent top-0 w-full h-2 z-50"></span> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-0 col-span-full md:col-span-8 md:gap-x-4 lg:gap-x-8 xl:gap-x-16 pt-6 md:px-8 lg:py-10 "> <div class="col-span-full "> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'know-about-ceres-3' ? null : 'know-about-ceres-3'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Learn more about us</p> <!-- End: /typography/_p.antlers.html --> </div> <div :class="activeSection === 'know-about-ceres-3' ? 'max-h-[1200px]' : 'max-h-0'" class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 md:gap-y-2 gap-y-3 lg:gap-x-8 "> <a href="/about" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Who we are</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Learn about our mission, our history, and our values.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/about/leadership" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Leadership</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Meet our board of directors, president’s council, and leadership staff.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/about/experts" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Experts</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Meet our leading experts with deep subject matter expertise and knowledge.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/networks" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Our members</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Learn more about the investors and companies we work with.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/careers" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Careers</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Join our growing team to help make our mission a reality.</p> <!-- End: /typography/_p.antlers.html --> </a> <a href="/about/annual-report" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="tracking-tight block col-span-full py-1 md:py-3 before:top-1 md:col-span-4 group"> <!-- /typography/_h3.antlers.html --> <h3 class="font-bold mb-2 text-base transition-colors group-hover:text-cw-green-200">Annual Report</h3> <!-- End: /typography/_h3.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-tight">Read about our impact and the progress we’ve made thanks to supporters.</p> <!-- End: /typography/_p.antlers.html --> </a> </div> </div> </div> </div> <a href="/about" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="w-fit min-w-24 h-fit py-2 before:top-0.5 hidden md:block"> <div class="flex flex-row items-center gap-3 pb-2 relative after:absolute after:h-0.5 after:w-24 after:bg-cw-green-800 after:bottom-0 mb-4 md:mb-0"> <!-- /typography/_h3.antlers.html --> <h3 class="text-base font-semibold text-nowrap">See all about Ceres</h3> <!-- End: /typography/_h3.antlers.html --> <svg class="w-[10px] h-[10px] inline fill-black" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/> </svg> </div> </a> </div> <div class=" gap-0 col-span-full md:col-span-4 relative pb-6 md:px-8 md:pt-6 lg:py-10 md:bg-cw-green-50 " > <div class="relative"> <div class="flex flex-col gap-0 md:gap-5"> <div @click="activeSection = activeSection === 'latest-about-ceres-3' ? null : 'latest-about-ceres-3'" class="mb-5 md:mb-0 pb-2 border-b-2 border-black cursor-pointer md:cursor-default"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Latest resources</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="md:max-h-full overflow-hidden md:overflow-visible transition-all duration-500 ease-in-out" :class="activeSection === 'latest-about-ceres-3' ? 'max-h-[1200px]' : 'max-h-0'"> <div class="flex flex-col gap-1 md:gap-5"> <a href="/resources/reports/leading-with-transparency-improving-climate-risk-disclosure-by-municipal-governments" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/leading-with-transparency---landing.png/ef6df40b2a38d357ab71159ba00d9895/leading-with-transparency---landing.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Leading with Transparency: A Guide to Strengthening Climate Disclosure and Resilience in the Municipal Bond Market </h4> </div> </div> </div> </a> <a href="/resources/reports/unlocking-opportunity-addressing-livestock-methane-to-build-resilient-food-systems" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="py-3 before:top-0"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 mb-5 md:mb-0 "> <div class="col-span-5 relative h-24"> <img src="https://assets.ceres.org/cache/containers/images/adobestock_169901658.jpeg/4b236f1d68a2d7d72e451f4671d55201/adobestock_169901658.webp" alt="" class="w-full h-full object-cover rounded-lg absolute min-h-12"> </div> <div class="flex flex-col col-span-7 gap-2"> <div class="flex flex-col col-span-7 gap-1"> <p class="text-sm uppercase font-semibold text-black/50"> Report </p> <h4 class="leading-tight"> Unlocking Opportunity: Addressing Livestock Methane to Build Resilient Food Systems </h4> </div> </div> </div> </a> </div> </div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-5 md:mb-0 pb-2 border-b-2 border-black">Quick finds</p> <!-- End: /typography/_p.antlers.html --> <div class="flex flex-row md:flex-col gap-5 md:gap-4 justify-between md:justify-start hover:[&_a]:text-cw-green-250"> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="https://www.ceres.org/support" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Support our work</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/resources/news" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">News and insights</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> <a class="cursor-pointer py-2 md:py-3 rounded-md w-fit relative before:top-0" href="/events" > <div class="flex flex-row gap-2 items-center relative"> <!-- /typography/_h3.antlers.html --> <h3 class="font-semibold text-base">Events and webinars</h3> <!-- End: /typography/_h3.antlers.html --> </div> </a> </div> </div> </div> </div> <span class="bg-cw-green-200 hidden lg:block absolute left-0 right-0 bottom-0 py-2 text-white"></span> </div> <a href="/about" @click="if ($event.target.href.includes('#')) isMenuOpen = false; closeAllSubMenus();" class="w-fit visible md:hidden"> <div class="flex flex-row items-center gap-3 pb-3 relative after:absolute after:h-0.5 after:w-24 after:bg-cw-green-800 after:bottom-0 mb-4 md:mb-0"> <!-- /typography/_h3.antlers.html --> <h3 class="text-base font-semibold">See all about Ceres</h3> <!-- End: /typography/_h3.antlers.html --> <svg class="w-[10px] h-[10px] inline fill-black" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/> </svg> </div> </a> </div> </div> </div> </div> <span class="fixed w-full top-0 h-full bg-black/50 z-[80] opacity-0 transition-opacity pointer-events-none" :class="activeSubMenu ? 'opacity-100' : null"></span> </nav> <script> let currentOpenMenu; [...document.querySelectorAll("[data-collapse-toggle]")].forEach((button) => { button.addEventListener('click', (event) => { const targetId = event.currentTarget.getAttribute('data-collapse-toggle'); const targetElem = document.getElementById(targetId); // If there is a currently open menu and it's not the one being clicked, hide it if (currentOpenMenu && currentOpenMenu !== targetElem) { currentOpenMenu.classList.add('hidden'); } // If the clicked menu is already open, hide it. Otherwise, show it. if (targetElem === currentOpenMenu) { targetElem.classList.add('hidden'); currentOpenMenu = null; } else if (targetElem) { targetElem.classList.remove('hidden'); currentOpenMenu = targetElem; } }); }); </script> <!-- /default.antlers.html --> <main id="content"> <!-- /page_builder/_hero_banner.antlers.html --> <section class="bg-cw-green-800 text-white overflow-hidden"> <div x-data="{ translateX: 0 }" x-init="() => { function updateTranslate() { let containerWidth = $el.offsetWidth; let containerPaddingRight = parseInt(window.getComputedStyle($el).paddingRight, 10); let screenWidth = window.innerWidth; translateX = (screenWidth - containerWidth) / 2 + containerPaddingRight; } updateTranslate(); window.addEventListener('resize', updateTranslate); return () => window.removeEventListener('resize', updateTranslate); }" class="container relative z-50"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 w-full relative gap-0 "> <div class="flex flex-col lg:col-span-7 py-12 justify-center col-span-full gap-4 sm:gap-8 z-20"> <h1 class="text-5xl xl:text-[81px] font-bold leading-[107%] [&_p]:inline [&_p_>_span]:font-semibold"> Our work in the <span class="text-color" style="color: #84cc16">banking</span> sector </h1> <div class="flex flex-col gap-8"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-xl lg:text-2xl">As the lynchpin of the global economy, banks are key to setting the pace of climate action. We work with investors, banks, and key regulators to drive investments, smart policy, and action that will benefit both financial markets and the planet.</p> <!-- End: /typography/_p.antlers.html --> <!-- /components/_button.antlers.html --> <!-- End: /components/_button.antlers.html --> </div> </div> <!-- Video or Image Section --> <div class="col-span-full lg:col-span-5 order-last lg:order-none relative w-full h-full md:block"> <div class="absolute min-h-[30dvh] lg:relative w-full h-full"> <div class="absolute right-0 h-full"> <img src="https://assets.ceres.org/cache/containers/images/banking-sector.jpg/91fdf409cce812d9a57931c4f2ca0d00.webp" alt="Bank building" class="hidden lg:block w-full h-full object-cover opacity-20 lg:opacity-100" :style="{transform: 'translateX(' + translateX + 'px)'}"/> </div> </div> </div> </div> </div> </section> <!-- End: /page_builder/_hero_banner.antlers.html --> <!-- class="absolute bottom-0 -translate-y-[90%] translate-x-1 xl:-translate-y-[130%]" --> <!-- /page_builder/_wysiwyg.antlers.html --> <section class="bg-cw-green-50 text-black overflow-hidden"> <div id="" class="container "> <!-- /typography/_prose.antlers.html --> <article class=" prose prose-a:underline prose-a:decoration-primary prose-a:decoration-2 hover:prose-a:text-primary focus:prose-a:outline-none focus-visible:prose-a:ring focus-visible:prose-a:ring-primary focus-visible:prose-a:rounded-sm prose-figure:my-0 prose-pre:whitespace-pre-wrap max-w-none blockquote-import link-import contents bg-cw-green-50 text-black hover:[&_a]:text-cw-green-800 [&_a]:decoration-cw-green-800 text-xl prose [&_ul_li]:list-disc [&_ul_li]:list-outside " > <!-- /components/_text.antlers.html --> <div class="[&_blockquote]:not-italic [&_blockquote>p]:before:content-none [&_blockquote>p]:after:content-none"> <h1><br><strong>Our approach</strong> </h1><p>The U.S. banking sector’s current lending, financing, and investment practices are leaving banking institutions—and in turn, our planet and economy—dangerously vulnerable to sustainability threats from climate change, exacerbating racial, gender, and economic inequity. Calls are growing louder for banks to move more quickly on climate action as investors, policymakers, and financial regulators recognize the systemic, compounding threat that climate change poses to our financial system. Banks can help prevent the next financial crisis, and in so doing improve their competitive position and, ultimately, their financial results.</p><p>Banks’ financing, lending, and underwriting contribute to emissions in every sector of the economy. Through our <a rel="noopener noreferrer" href="/climate/ambition-2030">Ambition 2030 initiative</a>, Ceres aims to decarbonize the six highest-emitting sectors of the economy, including the banking sector. We work sector-wide, calling on companies to set science-based climate goals, create robust transition action plans, and provide disclosure about how they are achieving interim targets by 2030. </p> </div> <!-- End: /components/_text.antlers.html --> </article> <!-- End: /typography/_prose.antlers.html --> </div> </section> <!-- End: /page_builder/_wysiwyg.antlers.html --> <!-- /page_builder/_link_blocks.antlers.html --> <section class="bg-cw-green-50 text-black "> <div class="container py-16 grid md:grid-cols-12 gap-8 "> <a class="hover:cursor-pointer bg-white flex flex-col justify-between items-start group p-6 border border-neutral/10 shadow-cards rounded hover:shadow-cards-darker transition-all md:col-span-8 md:col-start-3 lg:col-span-4 lg:col-start-0 "aria-labelledby="investor-engagement" draggable="false" href="/networks/investor" > <div class="mb-4"> <span id="investor-engagement"> <!-- /typography/_h3.antlers.html --> <h3 class="text-2xl font-bold leading-tight mb-2 text-neutral group-hover:text-cw-green-250 transition-colors">Investor engagement</h3> <!-- End: /typography/_h3.antlers.html --> </span> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-4 text-neutral">Through the Ceres Investor Network, we support investors to constructively engage banks and financial institutions on the systemic financial risks of the climate crisis and the opportunities to address them.</p> <!-- End: /typography/_p.antlers.html --> </div> <!-- /components/_button.antlers.html --> <!-- End: /components/_button.antlers.html --> </a> <a class="hover:cursor-pointer bg-white flex flex-col justify-between items-start group p-6 border border-neutral/10 shadow-cards rounded hover:shadow-cards-darker transition-all md:col-span-8 md:col-start-3 lg:col-span-4 lg:col-start-0 "aria-labelledby="corporate-action" draggable="false" href="/networks/company" > <div class="mb-4"> <span id="corporate-action"> <!-- /typography/_h3.antlers.html --> <h3 class="text-2xl font-bold leading-tight mb-2 text-neutral group-hover:text-cw-green-250 transition-colors">Corporate action</h3> <!-- End: /typography/_h3.antlers.html --> </span> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-4 text-neutral">We work with financial service companies in the Ceres Company Network—and beyond—to integrate responsible investing and business practices into operational performance, business strategy, decision-making, and products and services. We also work with banks to measure and reduce their exposure to fossil fuel and high-carbon assets and to increase transition financing of Paris-aligned companies and projects.</p> <!-- End: /typography/_p.antlers.html --> </div> <!-- /components/_button.antlers.html --> <!-- End: /components/_button.antlers.html --> </a> <a class="hover:cursor-pointer bg-white flex flex-col justify-between items-start group p-6 border border-neutral/10 shadow-cards rounded hover:shadow-cards-darker transition-all md:col-span-8 md:col-start-3 lg:col-span-4 lg:col-start-0 "aria-labelledby="policy-advocacy" draggable="false" href="/accelerator" > <div class="mb-4"> <span id="policy-advocacy"> <!-- /typography/_h3.antlers.html --> <h3 class="text-2xl font-bold leading-tight mb-2 text-neutral group-hover:text-cw-green-250 transition-colors">Policy advocacy</h3> <!-- End: /typography/_h3.antlers.html --> </span> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mb-4 text-neutral">Through the Ceres Accelerator for Sustainable Capital Markets, we engage state and federal financial regulators, and other banks and trade associations to act on climate change as a systemic economic risk, incorporate climate risks in oversight of banks and other financial firms, mandate climate disclosure, and work with agencies to accelerate the transition to a clean economy.</p> <!-- End: /typography/_p.antlers.html --> </div> <!-- /components/_button.antlers.html --> <!-- End: /components/_button.antlers.html --> </a> </div> </section> <!-- End: /page_builder/_link_blocks.antlers.html --> <!-- /page_builder/_featured_resources.antlers.html --> <section class="bg-white text-black "> <div class="container py-16"> <div> <!-- /typography/_h2.antlers.html --> <h2 class="font-bold text-4xl">Explore our banking and finance reports</h2> <!-- End: /typography/_h2.antlers.html --> <br /> <div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-md md:max-w-4xl">We equip financial institutions with cutting-edge research and reports to help them thrive in the transition to a more equitable, net zero emissions economy.</p> <!-- End: /typography/_p.antlers.html --> </div> </div> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" my-8 grid grid-cols-1 lg:grid-cols-3 gap-8 mb-8 "> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden "> <a title="Ahead or Behind? The State of Climate Finance in the Banking Sector" aria-label="Ahead or Behind? The State of Climate Finance in the Banking Sector" href="/resources/reports/ahead-or-behind"> <img src="https://assets.ceres.org/cache/containers/images/adobestock_529773169-copy.jpg/6e11f40f7364dba3adb4b3511e5a4ffd/adobestock_529773169-copy.webp" alt="" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Oct 1, 2024 </div> <div class="text-lg font-bold"> Ahead or Behind? The State of Climate Finance in the Banking Sector </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden "> <a title="From Commitment to Implementation: An Analysis of Corporate Climate Actions from the 2021 Proxy Season" aria-label="From Commitment to Implementation: An Analysis of Corporate Climate Actions from the 2021 Proxy Season" href="/resources/reports/from-commitment-to-implementation-an-analysis-of-corporate-climate-actions-from-the-2021-proxy-season"> <img src="https://assets.ceres.org/cache/containers/images/analysis-cover.jpg/7dc71284b8fd82f1b1da9320cb25de33/analysis-cover.webp" alt="Wind mills" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Jul 24, 2024 </div> <div class="text-lg font-bold"> From Commitment to Implementation: An Analysis of Corporate Climate Actions from the 2021 Proxy Season </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden "> <a title="Blueprint for Implementing a Leading Climate Transition Action Plan" aria-label="Blueprint for Implementing a Leading Climate Transition Action Plan" href="/resources/reports/blueprint-for-implementing-a-leading-climate-transition-action-plan-ps-bing"> <img src="https://assets.ceres.org/cache/containers/images/cover--ceres-ctap-report.jpg/d97d967ff359d086645c01e1e10bff26/cover--ceres-ctap-report.webp" alt="Wind mills on a mountain" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Jun 10, 2024 </div> <div class="text-lg font-bold"> Blueprint for Implementing a Leading Climate Transition Action Plan </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden hidden "> <a title="Blueprint for Implementing a Leading Climate Transition Action Plan" aria-label="Blueprint for Implementing a Leading Climate Transition Action Plan" href="/resources/reports/blueprint-for-implementing-a-leading-climate-transition-action-plan"> <img src="https://assets.ceres.org/cache/containers/images/cover--ceres-ctap-report.jpg/d97d967ff359d086645c01e1e10bff26/cover--ceres-ctap-report.webp" alt="Wind mills on a mountain" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Jun 10, 2024 </div> <div class="text-lg font-bold"> Blueprint for Implementing a Leading Climate Transition Action Plan </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden hidden "> <a title="Blueprint for Implementing a Leading Climate Transition Action Plan" aria-label="Blueprint for Implementing a Leading Climate Transition Action Plan" href="/resources/reports/blueprint-for-implementing-a-leading-climate-transition-action-plan-ps"> <img src="https://assets.ceres.org/cache/containers/images/cover--ceres-ctap-report.jpg/d97d967ff359d086645c01e1e10bff26/cover--ceres-ctap-report.webp" alt="Wind mills on a mountain" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Jun 10, 2024 </div> <div class="text-lg font-bold"> Blueprint for Implementing a Leading Climate Transition Action Plan </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden hidden "> <a title="Sustainable Finance Opportunities: A Guide for Financial Institutions" aria-label="Sustainable Finance Opportunities: A Guide for Financial Institutions" href="/resources/reports/sustainable-finance-opportunities-guide-financial-institutions"> <img src="https://assets.ceres.org/cache/containers/images/resource-thumbnails-banners/sustainable-finance-opportunities-thumbnail.jpeg/f3c52e1d6ae8feb32eec2e15e45ad7cf.webp" alt="" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Nov 14, 2023 </div> <div class="text-lg font-bold"> Sustainable Finance Opportunities: A Guide for Financial Institutions </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden hidden "> <a title="Responsible Policy Engagement Benchmarking for Banks" aria-label="Responsible Policy Engagement Benchmarking for Banks" href="/resources/reports/responsible-policy-engagement-benchmarking-banks"> <img src="https://assets.ceres.org/cache/containers/images/resource-thumbnails-banners/rpe-banking-hero.png/bf016037df6b934c6062a858e3c14393.webp" alt="" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Aug 24, 2023 </div> <div class="text-lg font-bold"> Responsible Policy Engagement Benchmarking for Banks </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden hidden "> <a title="Net Zero Standard for North American Banks" aria-label="Net Zero Standard for North American Banks" href="/resources/reports/net-zero-standard-north-american-banks"> <img src="https://assets.ceres.org/cache/containers/images/resource-thumbnails-banners/net-zero-standard-hero.jpeg/c3d7e1720776456f9c872c431eb0c9bb.webp" alt="" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Aug 8, 2023 </div> <div class="text-lg font-bold"> Net Zero Standard for North American Banks </div> </div> </div> </div> </a> </div> <div class=" bg-white flex flex-col resource_card_grid_3 resource_cards_grid text-sm font-semibold shadow-cards hover:shadow-cards-darker transition duration-250 group rounded-t overflow-hidden hidden "> <a title="U.S. Banks and the Road to Net Zero" aria-label="U.S. Banks and the Road to Net Zero" href="/resources/reports/us-banks-and-road-net-zero"> <img src="https://assets.ceres.org/cache/containers/images/resource-thumbnails-banners/road-bank-hero.png/4376f8377d6391ba59a89500ec60921a.webp" alt="" class="h-48 w-full object-cover block group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Apr 12, 2023 </div> <div class="text-lg font-bold"> U.S. Banks and the Road to Net Zero </div> </div> </div> </div> </a> </div> </div> <div class="see-more-button-container-3 flex items-center w-full "> <div class="bg-black opacity-30 h-0.5 w-1/2"></div> <!-- /components/_button.antlers.html --> <div class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start see-more-button-3 mx-1 hover:cursor-pointer text-black border border-black stroke-black fill-black <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/banking" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> See more </div> </div> <!-- End: /components/_button.antlers.html --> <div class="bg-black opacity-30 h-0.5 w-1/2"></div> </div> <script> const see_more_button_container_3 = document.getElementsByClassName('see-more-button-container-3')[0] const see_more_button_3 = document.getElementsByClassName('see-more-button-3')[0] // These 2 variables are the props that passed from parent view, this syntax can get the props in Antlers const target_class_3 = 'resource_card_grid_3' const load_more_amount_3 = Number('3') // need to convert it to number because it is a string const target_elements_3 = document.getElementsByClassName(target_class_3) const total_number_of_target_elements_3 = Array.from(target_elements_3).length const redirect_url_3 = '/resources/reports' const getDisplayedItems_3 = () => { let number_of_displayed_items = 0 for(const element of target_elements_3) { if(!element.classList.contains('hidden')) { number_of_displayed_items++ } } return number_of_displayed_items } const loadMore_3 = () => { let displayed_items = getDisplayedItems_3() const redirect_user_to_url = () => { window.location.href = redirect_url_3; } if(displayed_items < total_number_of_target_elements_3 || displayed_items < 9) { for(let i = 0; i < displayed_items + load_more_amount_3; i++) { if(i < total_number_of_target_elements_3) { if(target_elements_3[i].classList.contains('hidden')) { target_elements_3[i].classList.remove('hidden') } } } displayed_items = getDisplayedItems_3() if(displayed_items >= total_number_of_target_elements_3 || displayed_items >= 9) { if(redirect_url_3 == '/') { see_more_button_container_3.classList.add('hidden') } else { see_more_button_3.removeEventListener('click', loadMore_3) see_more_button_3.addEventListener('click', redirect_user_to_url) } } } } const check_button_should_display_3 = () => { const number_of_cards = target_elements_3.length if(number_of_cards <= 3) { see_more_button_container_3.classList.add('hidden') } } see_more_button_3.addEventListener('click', loadMore_3) window.addEventListener('load', check_button_should_display_3) </script> </div> <div id="authFormModal" class="hidden fixed opacity-0 z-50 transition-opacity duration-500 w-full h-full bg-black/50 z-50 top-0 left-0 px-4"> <section class="overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 h-screen flex items-center justify-center bg-black/30"> <div class=" lg:p-4 lg:w-1/2 container py-16"> <div class="relative bg-white rounded-lg shadow dark:bg-gray-700"> <button onclick="closeAuthModal()" type="button" class="absolute top-3 end-2.5 text-gray-400 bg-transparent rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"> <svg width="32" height="32" class="stroke-gray-400 hover:stroke-cw-green-200" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-circle"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg> <span class="sr-only">Close form</span> </button> <div id="authFormContainer" class="p-6 lg:p-16"> <div class="p-4" id="authMessage"></div> <form id="loginForm"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-2"> <!-- /typography/_h2.antlers.html --> <h2 class="lg:text-2xl text-lg font-medium">Log in to download this report.</h2> <!-- End: /typography/_h2.antlers.html --> <span class="flex flex-row items-center gap-2"> <span class="lg:text-lg text-xs">Don't have an account?</span> <button type="button" id="showRegisterForm"> <span class="lg:text-lg text-xs underline">Sign up for free.</span> </button> </span> </div> <div class="flex flex-col"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 text-black [&_*]:text-center "> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <input type="email" id="lq47xg0a" name="email" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.email }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6" /> <input type="password" id="lq47xg0a" name="password" value="" required placeholder="Password" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.password }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6" /> </div> </div> <div class="flex flex-col gap-4 items-center"> <a href="/forgot-password" class="text-sm underline">Forgot your password?</a> <button type="submit" disabled class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-md transition-bg duration-300 ease-in-out cursor-not-allowed" background="#FFFFFF" > Log in </button> </div> </div> </form> <form class="hidden" action="/register" method="post" id="registerForm"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-1"> <!-- /typography/_h2.antlers.html --> <h2 class="lg:text-2xl text-lg font-medium">Sign up to unlock our reports.</h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed lg:text-md text-base">Create your free account to unlock access to all of our reports.</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="flex flex-col"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 "> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <input type="text" id="lq47xg0a" name="first_name" value="" required placeholder="First Name" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.first_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="text" id="lq47xg0a" name="last_name" value="" required placeholder="Last Name" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.last_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="email" id="lq47xg0a" name="email" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.email }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6 text-black" /> <input type="text" id="lq47xg0a" name="organisation" value="" required placeholder="Organization" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.organisation }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="text" id="lq47xg0a" name="zip_code" value="" required placeholder="Zip Code" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.zip_code }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="password" id="lq47xg0a" name="password" value="" required placeholder="Password - 8 character minimum" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.password }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6 text-black" /> <label class="col-span-12 flex items-center gap-2"> <input type="checkbox" name="subscribe" value="on" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6"> <span class="lg:text-lg text-xs">Subscribe to email updates from Ceres.</span> </label> </div> </div> <div class="flex flex-col gap-4 items-center"> <p class="lg:text-lg text-xs [text-wrap:balance] text-center max-w-sm [&_a]:cursor-pointer bg-white text-black [&_a]:font-medium"> By signing up, you agree to our <a class="underline" href="/privacy-policy">privacy policy</a> </p> <button type="submit" disabled class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-md transition-bg duration-300 ease-in-out cursor-not-allowed" background="#FFFFFF" > Create account </button> <span class="flex flex-row items-center gap-2"> <span class="lg:text-lg text-xs">Already have an account?</span> <button type="button" id="showLoginForm"> <span class="lg:text-lg text-xs underline">Log In</span> </button> </span> </div> </div> </form> </div> <script> document.addEventListener('DOMContentLoaded', () => { if (localStorage.getItem('NeedsVerifyEmail') === 'true') { let attempts = 0; let interval = setInterval(() => { attempts++; fetch('/fortify/api/verification-check', { credentials: 'include', headers: { 'Authorization': 'Bearer ' + localStorage.getItem('TOKEN') } } ).then((r) => { if (r.status !== 200) { clearInterval(interval); throw new Error(`Request rejected with status ${r.status}`); } else { return r.json(); } }) .then(data => { if (data.type === 'success') { localStorage.setItem('NeedsVerifyEmail', 'false'); localStorage.removeItem('TOKEN'); location.reload(); } }) .catch(err => console.error(err)); if (attempts >= 12) { clearInterval(interval); } }, 10000); } let elements = document.querySelectorAll('#authFormModal'); if (elements.length > 1) { for (let i = 0; i < elements.length - 1; i++) { elements[i].remove(); } }else{ const formsIds = ['loginForm', 'registerForm']; const authFormContainer = document.getElementById('authFormContainer'); const messageDiv = document.getElementById('authMessage'); formsIds.forEach(formId => { const form = document.getElementById(formId); if(form) { const submitButton = form.querySelector('button[type="submit"]'); submitButton.addEventListener('click', e => { e.preventDefault(); handleFormSubmit(messageDiv, formId); }); form.addEventListener('input', () => { const isValid = validateFields(form, submitButton); toggleButtonStyling(isValid, submitButton); }); form.addEventListener('keydown', e => { if (e.code === 'Enter' || e.key === 'Enter') { e.preventDefault(); } }) } }); const toggleFormDisplay = (showFormId, hideFormId) => { document.getElementById(showFormId).style.display = 'block'; document.getElementById(hideFormId).style.display = 'none'; } const showLoginFormButton = document.getElementById('showLoginForm'); if(showLoginFormButton) { showLoginFormButton.addEventListener('click', e => { e.preventDefault(); toggleFormDisplay('loginForm', 'registerForm'); }); } const showRegisterFormButton = document.getElementById('showRegisterForm'); if(showRegisterFormButton) { showRegisterFormButton.addEventListener('click', e => { e.preventDefault(); toggleFormDisplay('registerForm', 'loginForm'); }); } authFormContainer.addEventListener('click', event => { if (!event.target.closest('#authFormContainer')) { closeAuthModal(); } }); } }); function handleFormSubmit(messageDiv, formId) { const form = document.getElementById(formId); const submitButton = form.querySelector('button[type="submit"]'); if(formId === 'loginForm') { const _token = form.querySelector('[name="_token"]').value; const email = form.querySelector('[name="email"]').value; const password = form.querySelector('[name="password"]').value; submitButton.classList.remove('cursor-pointer') submitButton.classList.add('cursor-not-allowed'); submitButton.disabled = true; fetch('/fortify/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': _token }, body: JSON.stringify({ email, password }) }) .then(response => { if (!response.ok) { throw new Error(response.status + ' ' + response.statusText); } return response.json(); }) .then(data => { if (data && data.message) { messageDiv.classList.remove('text-red-500'); messageDiv.classList.add('text-green-500'); messageDiv.innerText = data.message; location.reload(); } else { throw new Error('Invalid response format'); } }) .catch(error => { messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = 'The username or password is incorrect. For assistance, please contact us at info@ceres.org.'; setTimeout(() => { submitButton.classList.add('cursor-pointer'); submitButton.disabled = false }, 5000); }); } else { const _token = form.querySelector('[name="_token"]').value; const emailInput = form.querySelector('[name="email"]').value; const passwordInput = form.querySelector('[name="password"]').value; const firstNameInput = form.querySelector('[name="first_name"]').value; const lastNameInput = form.querySelector('[name="last_name"]').value; const organisationInput = form.querySelector('[name="organisation"]').value; const zipCodeInput = form.querySelector('[name="zip_code"]').value; const subscribeCheckbox = form.querySelector('[name="subscribe"]').checked ? 'on' : 'off'; submitButton.classList.remove('cursor-pointer'); submitButton.classList.add('cursor-not-allowed'); submitButton.disabled = true; const customErrorMessages = { "The email has already been taken.": "This email is already in use. Please try again with a different email." }; fetch('/register', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': _token }, body: JSON.stringify({ email: emailInput, password: passwordInput, first_name: firstNameInput, last_name: lastNameInput, organisation: organisationInput, zip_code: zipCodeInput, subscribe: subscribeCheckbox, }) }) .then(response => response.json().then(data => ({ status: response.status, body: data }))) // Parse JSON and include status .then(response => { if (response.status === 200) { if (response.body && response.body.message) { messageDiv.classList.remove('text-red-500'); messageDiv.classList.add('text-green-500'); messageDiv.innerText = response.body.message; localStorage.setItem('TOKEN', response.body.token); localStorage.setItem('NeedsVerifyEmail', 'true'); setTimeout(() => { location.reload(); }, 10000); } else { throw new Error('Invalid response format'); } } else if (response.status === 422) { // Validation errors messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = ''; // Clear any existing messages for (const [field, messages] of Object.entries(response.body.errors)) { messages.forEach(message => { const errorParagraph = document.createElement('p'); // Use custom message if available, otherwise use the original message errorParagraph.innerText = customErrorMessages[message] || message; messageDiv.appendChild(errorParagraph); }); } } else { throw new Error(response.status + ' ' + response.statusText); } }) .catch(error => { messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = 'An unexpected error occurred. Please try again.'; }) .finally(() => { submitButton.classList.add('cursor-pointer'); submitButton.classList.remove('cursor-not-allowed'); submitButton.disabled = false; }); } } function validateFields(form) { const inputs = [...form.querySelectorAll('input:not([type="hidden"])')]; const formValidity = inputs.reduce((valid, element) => { switch (element.type) { case 'email': return valid && /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(element.value); case 'password': return valid && element.value.length >= 8; case 'text': if (element.name === 'zip_code') { return valid && element.value.length >= 2 && element.value.length <= 20; } else if (element.name === 'first_name' || element.name === 'last_name') { return valid && element.value.trim() !== '' && /^[a-zA-Z\s]+$/.test(element.value) && element.value.length <= 40; } else if (element.name === 'organisation') { return valid && element.value.trim() !== '' && element.value.length <= 40; } else { return valid && element.value.trim() !== '' && element.value.trim() !== '' && element.value.length <= 40; } default: return valid; } }, true); const passwordInputs = inputs.filter(input => input.type === 'password'); const passwordsMatch = passwordInputs.length <= 1 || (passwordInputs[0].value === passwordInputs[1].value); return formValidity && passwordsMatch; } function toggleButtonStyling(isValid, submitButton) { if (isValid) { submitButton.disabled = false submitButton.classList.remove('cursor-not-allowed', 'bg-black/40'); submitButton.classList.add('cursor-pointer', 'bg-cw-green-200'); submitButton.disabled = false; } else { submitButton.disabled = true submitButton.classList.add('cursor-not-allowed', 'bg-black/40'); submitButton.classList.remove('cursor-pointer', 'bg-cw-green-200'); submitButton.disabled = true; } } function openAuthModal() { const authModal = document.getElementById('authFormModal'); authModal.classList.remove('hidden'); document.body.style.overflow = 'hidden' setTimeout(() => { authModal.classList.remove('opacity-0'); authModal.classList.add('opacity-100'); }, 30); } function closeAuthModal() { const authModal = document.getElementById('authFormModal'); authModal.classList.remove('opacity-100'); authModal.classList.add('opacity-0'); setTimeout(() => { authModal.classList.add('hidden'); document.body.style.overflow = 'auto'; }, 200); } </script> </div> </div> </section> </div> </section> <!-- End: /page_builder/_featured_resources.antlers.html --> <!-- /page_builder/_featured_resources.antlers.html --> <section class="bg-white text-black "> <div class="container py-16"> <div> <!-- /typography/_h2.antlers.html --> <h2 class="font-bold text-4xl">Events and webinars</h2> <!-- End: /typography/_h2.antlers.html --> <br /> <div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-md md:max-w-4xl"></p> <!-- End: /typography/_p.antlers.html --> </div> </div> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" my-8 grid grid-cols-1 lg:grid-cols-3 gap-8 mb-8 "> <div class="bg-white flex flex-col transition-all duration-250 hover:shadow-cards-darker rounded-t-lg group resource_card_grid_4 resource_cards_grid text-sm font-semibold shadow-cards overflow-hidden "> <a href="/events/accelerating-sustainable-finance-ceres-insights-to-managing-climate-risks-in-banking-and-insurance" class="h-full flex flex-col"> <img src="https://assets.ceres.org/cache/http/images/%5Bevent-thumbnail%5D-accelerating-sustainable-finance-800x400-%281%29.png/7e188120e418f0d210557392356b6a2d/%5Bevent-thumbnail%5D-accelerating-sustainable-finance-800x400-%281%29.webp" alt="Flooded town" class="h-48 w-full object-cover block rounded-t group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4 flex flex-col justify-between"> <div class="flex flex-col justify-between h-full gap-16"> <div class="flex-grow"> <div class="my-4 text-gray-500"> <!-- /components/_date_time_format.antlers.html --> <span> <!-- Extracting components (year, month, day, time) from the start_date and start_time --> <!-- Extracting components (year, month, day, time) from the end_date and end_time --> <!-- Checking if there is no end_date --> <!-- Displaying start_date, start_month, start_year --> Jun 20, 2024 </span> <!-- End: /components/_date_time_format.antlers.html --> </div> <div class="text-lg font-bold "> Accelerating Sustainable Finance: Ceres' Insights to Managing Climate Risks in Banking and Insurance </div> </div> <div class="gap-4 flex flex-col w-full"> <!-- /components/_button.antlers.html --> <div class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start bg-cw-green-200 font-bold text-white text-lg [&_svg]:stroke-white [&_svg]:fill-white <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/events/accelerating-sustainable-finance-ceres-insights-to-managing-climate-risks-in-banking-and-insurance" rel="noopener noreferrer" target="_blank" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> Watch recording </div> </div> <!-- End: /components/_button.antlers.html --> </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all duration-250 hover:shadow-cards-darker rounded-t-lg group resource_card_grid_4 resource_cards_grid text-sm font-semibold shadow-cards overflow-hidden "> <a href="/events/webinar-derivatives-and-bank-climate-risk-report" class="h-full flex flex-col"> <img src="https://assets.ceres.org/cache/http/images/resource-thumbnails-banners/derivative-thumbnail.png/b8e530c7b4c38181975fa6486a2ba950/derivative-thumbnail.webp" alt="Buildings on Wall Street" class="h-48 w-full object-cover block rounded-t group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4 flex flex-col justify-between"> <div class="flex flex-col justify-between h-full gap-16"> <div class="flex-grow"> <div class="my-4 text-gray-500"> <!-- /components/_date_time_format.antlers.html --> <span> <!-- Extracting components (year, month, day, time) from the start_date and start_time --> <!-- Extracting components (year, month, day, time) from the end_date and end_time --> <!-- Checking if there is no end_date --> <!-- Displaying start_date, start_month, start_year --> Nov 4, 2022 </span> <!-- End: /components/_date_time_format.antlers.html --> </div> <div class="text-lg font-bold "> Derivatives and Bank Climate Risk Report </div> </div> <div class="gap-4 flex flex-col w-full"> <!-- /components/_button.antlers.html --> <div class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start bg-cw-green-200 font-bold text-white text-lg [&_svg]:stroke-white [&_svg]:fill-white <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/events/webinar-derivatives-and-bank-climate-risk-report" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> Watch recording </div> </div> <!-- End: /components/_button.antlers.html --> </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all duration-250 hover:shadow-cards-darker rounded-t-lg group resource_card_grid_4 resource_cards_grid text-sm font-semibold shadow-cards overflow-hidden "> <a href="/events/webinar-consequences-physical-climate-risks-banks" class="h-full flex flex-col"> <img src="https://assets.ceres.org/cache/http/images/resource-thumbnails-banners/thumbnail-12.png/bc17ce31841d22b045cbd5ecae0f272f/thumbnail-12.webp" alt="NYC flooding" class="h-48 w-full object-cover block rounded-t group-hover:scale-105 group-focus:scale-105 origin-bottom transition"> <div class="flex-grow p-2 sm:p-4 flex flex-col justify-between"> <div class="flex flex-col justify-between h-full gap-16"> <div class="flex-grow"> <div class="my-4 text-gray-500"> <!-- /components/_date_time_format.antlers.html --> <span> <!-- Extracting components (year, month, day, time) from the start_date and start_time --> <!-- Extracting components (year, month, day, time) from the end_date and end_time --> <!-- Checking if there is no end_date --> <!-- Displaying start_date, start_month, start_year --> Sep 14, 2021 </span> <!-- End: /components/_date_time_format.antlers.html --> </div> <div class="text-lg font-bold "> The Consequences of Physical Climate Risks for Banks </div> </div> <div class="gap-4 flex flex-col w-full"> <!-- /components/_button.antlers.html --> <div class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start bg-cw-green-200 font-bold text-white text-lg [&_svg]:stroke-white [&_svg]:fill-white <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/events/webinar-consequences-physical-climate-risks-banks" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> Watch recording </div> </div> <!-- End: /components/_button.antlers.html --> </div> </div> </div> </a> </div> </div> <div class="see-more-button-container-4 flex items-center w-full "> <div class="bg-black opacity-30 h-0.5 w-1/2"></div> <!-- /components/_button.antlers.html --> <div class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start see-more-button-4 mx-1 hover:cursor-pointer text-black border border-black stroke-black fill-black <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/banking" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> See more </div> </div> <!-- End: /components/_button.antlers.html --> <div class="bg-black opacity-30 h-0.5 w-1/2"></div> </div> <script> const see_more_button_container_4 = document.getElementsByClassName('see-more-button-container-4')[0] const see_more_button_4 = document.getElementsByClassName('see-more-button-4')[0] // These 2 variables are the props that passed from parent view, this syntax can get the props in Antlers const target_class_4 = 'resource_card_grid_4' const load_more_amount_4 = Number('3') // need to convert it to number because it is a string const target_elements_4 = document.getElementsByClassName(target_class_4) const total_number_of_target_elements_4 = Array.from(target_elements_4).length const redirect_url_4 = '/' const getDisplayedItems_4 = () => { let number_of_displayed_items = 0 for(const element of target_elements_4) { if(!element.classList.contains('hidden')) { number_of_displayed_items++ } } return number_of_displayed_items } const loadMore_4 = () => { let displayed_items = getDisplayedItems_4() const redirect_user_to_url = () => { window.location.href = redirect_url_4; } if(displayed_items < total_number_of_target_elements_4 || displayed_items < 9) { for(let i = 0; i < displayed_items + load_more_amount_4; i++) { if(i < total_number_of_target_elements_4) { if(target_elements_4[i].classList.contains('hidden')) { target_elements_4[i].classList.remove('hidden') } } } displayed_items = getDisplayedItems_4() if(displayed_items >= total_number_of_target_elements_4 || displayed_items >= 9) { if(redirect_url_4 == '/') { see_more_button_container_4.classList.add('hidden') } else { see_more_button_4.removeEventListener('click', loadMore_4) see_more_button_4.addEventListener('click', redirect_user_to_url) } } } } const check_button_should_display_4 = () => { const number_of_cards = target_elements_4.length if(number_of_cards <= 3) { see_more_button_container_4.classList.add('hidden') } } see_more_button_4.addEventListener('click', loadMore_4) window.addEventListener('load', check_button_should_display_4) </script> </div> <div id="authFormModal" class="hidden fixed opacity-0 z-50 transition-opacity duration-500 w-full h-full bg-black/50 z-50 top-0 left-0 px-4"> <section class="overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 h-screen flex items-center justify-center bg-black/30"> <div class=" lg:p-4 lg:w-1/2 container py-16"> <div class="relative bg-white rounded-lg shadow dark:bg-gray-700"> <button onclick="closeAuthModal()" type="button" class="absolute top-3 end-2.5 text-gray-400 bg-transparent rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"> <svg width="32" height="32" class="stroke-gray-400 hover:stroke-cw-green-200" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-circle"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg> <span class="sr-only">Close form</span> </button> <div id="authFormContainer" class="p-6 lg:p-16"> <div class="p-4" id="authMessage"></div> <form id="loginForm"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-2"> <!-- /typography/_h2.antlers.html --> <h2 class="lg:text-2xl text-lg font-medium">Log in to download this report.</h2> <!-- End: /typography/_h2.antlers.html --> <span class="flex flex-row items-center gap-2"> <span class="lg:text-lg text-xs">Don't have an account?</span> <button type="button" id="showRegisterForm"> <span class="lg:text-lg text-xs underline">Sign up for free.</span> </button> </span> </div> <div class="flex flex-col"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 text-black [&_*]:text-center "> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <input type="email" id="ls40094v" name="email" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.email }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6" /> <input type="password" id="ls40094v" name="password" value="" required placeholder="Password" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.password }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6" /> </div> </div> <div class="flex flex-col gap-4 items-center"> <a href="/forgot-password" class="text-sm underline">Forgot your password?</a> <button type="submit" disabled class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-md transition-bg duration-300 ease-in-out cursor-not-allowed" background="#FFFFFF" > Log in </button> </div> </div> </form> <form class="hidden" action="/register" method="post" id="registerForm"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-1"> <!-- /typography/_h2.antlers.html --> <h2 class="lg:text-2xl text-lg font-medium">Sign up to unlock our reports.</h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed lg:text-md text-base">Create your free account to unlock access to all of our reports.</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="flex flex-col"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 "> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <input type="text" id="ls40094v" name="first_name" value="" required placeholder="First Name" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.first_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="text" id="ls40094v" name="last_name" value="" required placeholder="Last Name" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.last_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="email" id="ls40094v" name="email" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.email }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6 text-black" /> <input type="text" id="ls40094v" name="organisation" value="" required placeholder="Organization" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.organisation }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="text" id="ls40094v" name="zip_code" value="" required placeholder="Zip Code" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.zip_code }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="password" id="ls40094v" name="password" value="" required placeholder="Password - 8 character minimum" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.password }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6 text-black" /> <label class="col-span-12 flex items-center gap-2"> <input type="checkbox" name="subscribe" value="on" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6"> <span class="lg:text-lg text-xs">Subscribe to email updates from Ceres.</span> </label> </div> </div> <div class="flex flex-col gap-4 items-center"> <p class="lg:text-lg text-xs [text-wrap:balance] text-center max-w-sm [&_a]:cursor-pointer bg-white text-black [&_a]:font-medium"> By signing up, you agree to our <a class="underline" href="/privacy-policy">privacy policy</a> </p> <button type="submit" disabled class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-md transition-bg duration-300 ease-in-out cursor-not-allowed" background="#FFFFFF" > Create account </button> <span class="flex flex-row items-center gap-2"> <span class="lg:text-lg text-xs">Already have an account?</span> <button type="button" id="showLoginForm"> <span class="lg:text-lg text-xs underline">Log In</span> </button> </span> </div> </div> </form> </div> <script> document.addEventListener('DOMContentLoaded', () => { let elements = document.querySelectorAll('#authFormModal'); if (elements.length > 1) { for (let i = 0; i < elements.length - 1; i++) { elements[i].remove(); } }else{ const formsIds = ['loginForm', 'registerForm']; const authFormContainer = document.getElementById('authFormContainer'); const messageDiv = document.getElementById('authMessage'); formsIds.forEach(formId => { const form = document.getElementById(formId); if(form) { const submitButton = form.querySelector('button[type="submit"]'); submitButton.addEventListener('click', e => { e.preventDefault(); handleFormSubmit(messageDiv, formId); }); form.addEventListener('input', () => { const isValid = validateFields(form, submitButton); toggleButtonStyling(isValid, submitButton); }); form.addEventListener('keydown', e => { if (e.code === 'Enter' || e.key === 'Enter') { e.preventDefault(); } }) } }); const toggleFormDisplay = (showFormId, hideFormId) => { document.getElementById(showFormId).style.display = 'block'; document.getElementById(hideFormId).style.display = 'none'; } const showLoginFormButton = document.getElementById('showLoginForm'); if(showLoginFormButton) { showLoginFormButton.addEventListener('click', e => { e.preventDefault(); toggleFormDisplay('loginForm', 'registerForm'); }); } const showRegisterFormButton = document.getElementById('showRegisterForm'); if(showRegisterFormButton) { showRegisterFormButton.addEventListener('click', e => { e.preventDefault(); toggleFormDisplay('registerForm', 'loginForm'); }); } authFormContainer.addEventListener('click', event => { if (!event.target.closest('#authFormContainer')) { closeAuthModal(); } }); } }); function handleFormSubmit(messageDiv, formId) { const form = document.getElementById(formId); const submitButton = form.querySelector('button[type="submit"]'); if(formId === 'loginForm') { const _token = form.querySelector('[name="_token"]').value; const email = form.querySelector('[name="email"]').value; const password = form.querySelector('[name="password"]').value; submitButton.classList.remove('cursor-pointer') submitButton.classList.add('cursor-not-allowed'); submitButton.disabled = true; fetch('/fortify/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': _token }, body: JSON.stringify({ email, password }) }) .then(response => { if (!response.ok) { throw new Error(response.status + ' ' + response.statusText); } return response.json(); }) .then(data => { if (data && data.message) { messageDiv.classList.remove('text-red-500'); messageDiv.classList.add('text-green-500'); messageDiv.innerText = data.message; location.reload(); } else { throw new Error('Invalid response format'); } }) .catch(error => { messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = 'The username or password is incorrect. For assistance, please contact us at info@ceres.org.'; setTimeout(() => { submitButton.classList.add('cursor-pointer'); submitButton.disabled = false }, 5000); }); } else { const _token = form.querySelector('[name="_token"]').value; const emailInput = form.querySelector('[name="email"]').value; const passwordInput = form.querySelector('[name="password"]').value; const firstNameInput = form.querySelector('[name="first_name"]').value; const lastNameInput = form.querySelector('[name="last_name"]').value; const organisationInput = form.querySelector('[name="organisation"]').value; const zipCodeInput = form.querySelector('[name="zip_code"]').value; const subscribeCheckbox = form.querySelector('[name="subscribe"]').checked ? 'on' : 'off'; submitButton.classList.remove('cursor-pointer'); submitButton.classList.add('cursor-not-allowed'); submitButton.disabled = true; const customErrorMessages = { "The email has already been taken.": "This email is already in use. Please try again with a different email." }; fetch('/register', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': _token }, body: JSON.stringify({ email: emailInput, password: passwordInput, first_name: firstNameInput, last_name: lastNameInput, organisation: organisationInput, zip_code: zipCodeInput, subscribe: subscribeCheckbox, }) }) .then(response => response.json().then(data => ({ status: response.status, body: data }))) // Parse JSON and include status .then(response => { if (response.status === 200) { if (response.body && response.body.message) { messageDiv.classList.remove('text-red-500'); messageDiv.classList.add('text-green-500'); messageDiv.innerText = response.body.message; localStorage.setItem('TOKEN', response.body.token); localStorage.setItem('NeedsVerifyEmail', 'true'); setTimeout(() => { location.reload(); }, 10000); } else { throw new Error('Invalid response format'); } } else if (response.status === 422) { // Validation errors messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = ''; // Clear any existing messages for (const [field, messages] of Object.entries(response.body.errors)) { messages.forEach(message => { const errorParagraph = document.createElement('p'); // Use custom message if available, otherwise use the original message errorParagraph.innerText = customErrorMessages[message] || message; messageDiv.appendChild(errorParagraph); }); } } else { throw new Error(response.status + ' ' + response.statusText); } }) .catch(error => { messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = 'An unexpected error occurred. Please try again.'; }) .finally(() => { submitButton.classList.add('cursor-pointer'); submitButton.classList.remove('cursor-not-allowed'); submitButton.disabled = false; }); } } function validateFields(form) { const inputs = [...form.querySelectorAll('input:not([type="hidden"])')]; const formValidity = inputs.reduce((valid, element) => { switch (element.type) { case 'email': return valid && /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(element.value); case 'password': return valid && element.value.length >= 8; case 'text': if (element.name === 'zip_code') { return valid && element.value.length >= 2 && element.value.length <= 20; } else if (element.name === 'first_name' || element.name === 'last_name') { return valid && element.value.trim() !== '' && /^[a-zA-Z\s]+$/.test(element.value) && element.value.length <= 40; } else if (element.name === 'organisation') { return valid && element.value.trim() !== '' && element.value.length <= 40; } else { return valid && element.value.trim() !== '' && element.value.trim() !== '' && element.value.length <= 40; } default: return valid; } }, true); const passwordInputs = inputs.filter(input => input.type === 'password'); const passwordsMatch = passwordInputs.length <= 1 || (passwordInputs[0].value === passwordInputs[1].value); return formValidity && passwordsMatch; } function toggleButtonStyling(isValid, submitButton) { if (isValid) { submitButton.disabled = false submitButton.classList.remove('cursor-not-allowed', 'bg-black/40'); submitButton.classList.add('cursor-pointer', 'bg-cw-green-200'); submitButton.disabled = false; } else { submitButton.disabled = true submitButton.classList.add('cursor-not-allowed', 'bg-black/40'); submitButton.classList.remove('cursor-pointer', 'bg-cw-green-200'); submitButton.disabled = true; } } function openAuthModal() { const authModal = document.getElementById('authFormModal'); authModal.classList.remove('hidden'); document.body.style.overflow = 'hidden' setTimeout(() => { authModal.classList.remove('opacity-0'); authModal.classList.add('opacity-100'); }, 30); } function closeAuthModal() { const authModal = document.getElementById('authFormModal'); authModal.classList.remove('opacity-100'); authModal.classList.add('opacity-0'); setTimeout(() => { authModal.classList.add('hidden'); document.body.style.overflow = 'auto'; }, 200); } </script> </div> </div> </section> </div> </section> <!-- End: /page_builder/_featured_resources.antlers.html --> <!-- /page_builder/_text_and_image_i.antlers.html --> <section class="bg-cw-green-50 text-black overflow-hidden"> <div class="container" x-data="{ translateX: 0, imagePosition: 'left' }" x-init="() => { function updateTranslate() { let containerWidth = $el.offsetWidth; let containerPaddingRight = parseInt(window.getComputedStyle($el).paddingRight, 10); let screenWidth = window.innerWidth; let calculatedTranslation = (screenWidth - containerWidth) / 2 + containerPaddingRight; // Flip the translation value based on image position translateX = imagePosition === 'left' ? -calculatedTranslation : calculatedTranslation; } updateTranslate(); window.addEventListener('resize', updateTranslate); return () => window.removeEventListener('resize', updateTranslate); }" > <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-0 "> <div class="col-span-6 row-span-full lg:block hidden col-start-1" :style="'transform: translateX(' + translateX + 'px)'" > <img src="https://assets.ceres.org/cache/containers/images/ctaps-preview.jpg/4e759ac650b9e8c0ec3644a4ed14a2d8.webp" alt="Solar panels" class="rounded w-full h-full object-cover"/> </div> <div class="flex flex-col gap-8 max-w-1/2 lg:col-span-7 col-span-12 row-span-full py-16 justify-center lg:col-start-6"> <div class="flex flex-col gap-2"> <!-- /typography/_h2.antlers.html --> <h2 class="text-[44px] font-medium leading-[137%]"><strong>Learn How to Create a Transition Plan</strong></h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Broad commitments and long-term goals for stabilizing the climate, protecting water, and conserving and restoring nature aren’t enough. The next step for investors and companies is to develop and publicly disclose a concrete plan for moving from commitment to impact.</p> <!-- End: /typography/_p.antlers.html --> </div> <!-- /components/_button.antlers.html --> <a class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start bg-cw-green-200 font-bold text-white text-lg [&_svg]:stroke-white [&_svg]:fill-white <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/transition-plans" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> Learn more </div> </a> <!-- End: /components/_button.antlers.html --> </div> </div> </div> </section> <!-- End: /page_builder/_text_and_image_i.antlers.html --> <!-- /page_builder/_featured_resources.antlers.html --> <section class="bg-cw-green-50 text-black "> <div class="container py-16"> <div> <!-- /typography/_h2.antlers.html --> <h2 class="font-bold text-4xl">Latest updates</h2> <!-- End: /typography/_h2.antlers.html --> <br /> <div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-md md:max-w-4xl">Read the latest news and insights from our work in the banking sector.</p> <!-- End: /typography/_p.antlers.html --> </div> </div> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" my-8 grid grid-cols-1 lg:grid-cols-3 gap-8 mb-8 "> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards "> <a href="/resources/news/new-guidance-gives-banks-framework-for-climate-finance"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/new-guidance-gives-banks-framework-for-climate-finance" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Oct 1, 2024 </div> <div class="text-lg font-bold pb-4 transition-colors"> New guidance gives banks framework for climate finance </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards "> <a href="/resources/news/q-a-with-meryl-richards-ceres-director-food-and-forests"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/q-a-with-meryl-richards-ceres-director-food-and-forests" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Sep 12, 2024 </div> <div class="text-lg font-bold pb-4 transition-colors"> Q & A with Meryl Richards, Ceres’ Program Director, Food and Forests </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards "> <a href="/resources/news/ceres-releases-first-of-its-kind-resource-for-companies-to-deliver-leading-climate-transition-action-plans"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/ceres-releases-first-of-its-kind-resource-for-companies-to-deliver-leading-climate-transition-action-plans" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Jun 10, 2024 </div> <div class="text-lg font-bold pb-4 transition-colors"> Ceres releases first-of-its-kind resource for companies to deliver leading climate transition action plans </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards hidden"> <a href="/resources/news/q-a-with-blair-bateson-ceres-director-financial-services"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/q-a-with-blair-bateson-ceres-director-financial-services" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> May 28, 2024 </div> <div class="text-lg font-bold pb-4 transition-colors"> Q & A with Blair Bateson, Ceres’ Director, Financial Services </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards hidden"> <a href="/resources/news/investors-drive-banks-toward-greater-transparency-on-climate-in-2024-proxy-season"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/investors-drive-banks-toward-greater-transparency-on-climate-in-2024-proxy-season" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> May 24, 2024 </div> <div class="text-lg font-bold pb-4 transition-colors"> Investors drive banks toward greater transparency on climate in 2024 proxy season </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards hidden"> <a href="/resources/news/u-s-banks-have-an-opportunity-to-advance-a-just-transition-heres-how"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/u-s-banks-have-an-opportunity-to-advance-a-just-transition-heres-how" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Nov 2, 2023 </div> <div class="text-lg font-bold pb-4 transition-colors"> U.S. banks have an opportunity to advance a just transition. Here’s how. </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards hidden"> <a href="/resources/news/key-banking-regulators-adopt-interagency-principles-to-address-climate-related-financial-risks-for-large-banks"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/key-banking-regulators-adopt-interagency-principles-to-address-climate-related-financial-risks-for-large-banks" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Oct 26, 2023 </div> <div class="text-lg font-bold pb-4 transition-colors"> Key banking regulators adopt interagency principles to address climate-related financial risks for large banks </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards hidden"> <a href="/resources/news/early-proxy-season-results-shareholders-show-support-for-climate-transition-plan-proposals-especially-at-banks"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/early-proxy-season-results-shareholders-show-support-for-climate-transition-plan-proposals-especially-at-banks" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Apr 28, 2023 </div> <div class="text-lg font-bold pb-4 transition-colors"> Early proxy season results: shareholders show support for climate transition plan proposals – especially at banks </div> </div> </div> </a> </div> <div class="bg-white flex flex-col transition-all hover:shadow-cards-darker rounded-tl-lg rounded-tr-lg group resource_card_grid_6 resource_cards_grid text-sm font-semibold shadow-cards hidden"> <a href="/resources/news/us-banks-set-to-fall-short-of-global-oil-and-gas-emissions-reductions-goals-by-2030-new-analysis-finds"> <span class="block w-full h-6 bg-cw-green-200 rounded-t-lg"></span> </a> <a href="/resources/news/us-banks-set-to-fall-short-of-global-oil-and-gas-emissions-reductions-goals-by-2030-new-analysis-finds" class="flex-grow p-2 sm:p-4"> <div class="flex flex-col justify-between gap-16 h-full"> <div> <div class="my-4 text-gray-500"> Apr 12, 2023 </div> <div class="text-lg font-bold pb-4 transition-colors"> U.S. Banks Set to Fall Short of Global Oil and Gas Emissions Reductions Goals by 2030, New Analysis Finds </div> </div> </div> </a> </div> </div> <div class="see-more-button-container-6 flex items-center w-full "> <div class="bg-black opacity-30 h-0.5 w-1/2"></div> <!-- /components/_button.antlers.html --> <div class=" cursor-pointer inline-flex py-3 px-8 rounded-full select-none whitespace-nowrap items-start self-start see-more-button-6 mx-1 hover:cursor-pointer text-black border border-black stroke-black fill-black <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="/banking" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> See more </div> </div> <!-- End: /components/_button.antlers.html --> <div class="bg-black opacity-30 h-0.5 w-1/2"></div> </div> <script> const see_more_button_container_6 = document.getElementsByClassName('see-more-button-container-6')[0] const see_more_button_6 = document.getElementsByClassName('see-more-button-6')[0] // These 2 variables are the props that passed from parent view, this syntax can get the props in Antlers const target_class_6 = 'resource_card_grid_6' const load_more_amount_6 = Number('3') // need to convert it to number because it is a string const target_elements_6 = document.getElementsByClassName(target_class_6) const total_number_of_target_elements_6 = Array.from(target_elements_6).length const redirect_url_6 = '/resources/news' const getDisplayedItems_6 = () => { let number_of_displayed_items = 0 for(const element of target_elements_6) { if(!element.classList.contains('hidden')) { number_of_displayed_items++ } } return number_of_displayed_items } const loadMore_6 = () => { let displayed_items = getDisplayedItems_6() const redirect_user_to_url = () => { window.location.href = redirect_url_6; } if(displayed_items < total_number_of_target_elements_6 || displayed_items < 9) { for(let i = 0; i < displayed_items + load_more_amount_6; i++) { if(i < total_number_of_target_elements_6) { if(target_elements_6[i].classList.contains('hidden')) { target_elements_6[i].classList.remove('hidden') } } } displayed_items = getDisplayedItems_6() if(displayed_items >= total_number_of_target_elements_6 || displayed_items >= 9) { if(redirect_url_6 == '/') { see_more_button_container_6.classList.add('hidden') } else { see_more_button_6.removeEventListener('click', loadMore_6) see_more_button_6.addEventListener('click', redirect_user_to_url) } } } } const check_button_should_display_6 = () => { const number_of_cards = target_elements_6.length if(number_of_cards <= 3) { see_more_button_container_6.classList.add('hidden') } } see_more_button_6.addEventListener('click', loadMore_6) window.addEventListener('load', check_button_should_display_6) </script> </div> <div id="authFormModal" class="hidden fixed opacity-0 z-50 transition-opacity duration-500 w-full h-full bg-black/50 z-50 top-0 left-0 px-4"> <section class="overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 h-screen flex items-center justify-center bg-black/30"> <div class=" lg:p-4 lg:w-1/2 container py-16"> <div class="relative bg-white rounded-lg shadow dark:bg-gray-700"> <button onclick="closeAuthModal()" type="button" class="absolute top-3 end-2.5 text-gray-400 bg-transparent rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"> <svg width="32" height="32" class="stroke-gray-400 hover:stroke-cw-green-200" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-circle"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg> <span class="sr-only">Close form</span> </button> <div id="authFormContainer" class="p-6 lg:p-16"> <div class="p-4" id="authMessage"></div> <form id="loginForm"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-2"> <!-- /typography/_h2.antlers.html --> <h2 class="lg:text-2xl text-lg font-medium">Log in to download this report.</h2> <!-- End: /typography/_h2.antlers.html --> <span class="flex flex-row items-center gap-2"> <span class="lg:text-lg text-xs">Don't have an account?</span> <button type="button" id="showRegisterForm"> <span class="lg:text-lg text-xs underline">Sign up for free.</span> </button> </span> </div> <div class="flex flex-col"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 text-black [&_*]:text-center "> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <input type="email" id="luvphbmb" name="email" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.email }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6" /> <input type="password" id="luvphbmb" name="password" value="" required placeholder="Password" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.password }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6" /> </div> </div> <div class="flex flex-col gap-4 items-center"> <a href="/forgot-password" class="text-sm underline">Forgot your password?</a> <button type="submit" disabled class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-md transition-bg duration-300 ease-in-out cursor-not-allowed" background="#F7FBF9" > Log in </button> </div> </div> </form> <form class="hidden" action="/register" method="post" id="registerForm"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-1"> <!-- /typography/_h2.antlers.html --> <h2 class="lg:text-2xl text-lg font-medium">Sign up to unlock our reports.</h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed lg:text-md text-base">Create your free account to unlock access to all of our reports.</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="flex flex-col"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 "> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <input type="text" id="luvphbmb" name="first_name" value="" required placeholder="First Name" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.first_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="text" id="luvphbmb" name="last_name" value="" required placeholder="Last Name" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.last_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="email" id="luvphbmb" name="email" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.email }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6 text-black" /> <input type="text" id="luvphbmb" name="organisation" value="" required placeholder="Organization" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.organisation }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="text" id="luvphbmb" name="zip_code" value="" required placeholder="Zip Code" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.zip_code }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6 text-black" /> <input type="password" id="luvphbmb" name="password" value="" required placeholder="Password - 8 character minimum" minlength="" maxlength="" autocomplete="off" x-model="" x-on:input="" :class="{ '!border-cw-green-150/90': valid.password }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-full lg:col-span-6 text-black" /> <label class="col-span-12 flex items-center gap-2"> <input type="checkbox" name="subscribe" value="on" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6"> <span class="lg:text-lg text-xs">Subscribe to email updates from Ceres.</span> </label> </div> </div> <div class="flex flex-col gap-4 items-center"> <p class="lg:text-lg text-xs [text-wrap:balance] text-center max-w-sm [&_a]:cursor-pointer bg-cw-green-50 text-black [&_a]:font-medium"> By signing up, you agree to our <a class="underline" href="/privacy-policy">privacy policy</a> </p> <button type="submit" disabled class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-md transition-bg duration-300 ease-in-out cursor-not-allowed" background="#F7FBF9" > Create account </button> <span class="flex flex-row items-center gap-2"> <span class="lg:text-lg text-xs">Already have an account?</span> <button type="button" id="showLoginForm"> <span class="lg:text-lg text-xs underline">Log In</span> </button> </span> </div> </div> </form> </div> <script> document.addEventListener('DOMContentLoaded', () => { let elements = document.querySelectorAll('#authFormModal'); if (elements.length > 1) { for (let i = 0; i < elements.length - 1; i++) { elements[i].remove(); } }else{ const formsIds = ['loginForm', 'registerForm']; const authFormContainer = document.getElementById('authFormContainer'); const messageDiv = document.getElementById('authMessage'); formsIds.forEach(formId => { const form = document.getElementById(formId); if(form) { const submitButton = form.querySelector('button[type="submit"]'); submitButton.addEventListener('click', e => { e.preventDefault(); handleFormSubmit(messageDiv, formId); }); form.addEventListener('input', () => { const isValid = validateFields(form, submitButton); toggleButtonStyling(isValid, submitButton); }); form.addEventListener('keydown', e => { if (e.code === 'Enter' || e.key === 'Enter') { e.preventDefault(); } }) } }); const toggleFormDisplay = (showFormId, hideFormId) => { document.getElementById(showFormId).style.display = 'block'; document.getElementById(hideFormId).style.display = 'none'; } const showLoginFormButton = document.getElementById('showLoginForm'); if(showLoginFormButton) { showLoginFormButton.addEventListener('click', e => { e.preventDefault(); toggleFormDisplay('loginForm', 'registerForm'); }); } const showRegisterFormButton = document.getElementById('showRegisterForm'); if(showRegisterFormButton) { showRegisterFormButton.addEventListener('click', e => { e.preventDefault(); toggleFormDisplay('registerForm', 'loginForm'); }); } authFormContainer.addEventListener('click', event => { if (!event.target.closest('#authFormContainer')) { closeAuthModal(); } }); } }); function handleFormSubmit(messageDiv, formId) { const form = document.getElementById(formId); const submitButton = form.querySelector('button[type="submit"]'); if(formId === 'loginForm') { const _token = form.querySelector('[name="_token"]').value; const email = form.querySelector('[name="email"]').value; const password = form.querySelector('[name="password"]').value; submitButton.classList.remove('cursor-pointer') submitButton.classList.add('cursor-not-allowed'); submitButton.disabled = true; fetch('/fortify/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': _token }, body: JSON.stringify({ email, password }) }) .then(response => { if (!response.ok) { throw new Error(response.status + ' ' + response.statusText); } return response.json(); }) .then(data => { if (data && data.message) { messageDiv.classList.remove('text-red-500'); messageDiv.classList.add('text-green-500'); messageDiv.innerText = data.message; location.reload(); } else { throw new Error('Invalid response format'); } }) .catch(error => { messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = 'The username or password is incorrect. For assistance, please contact us at info@ceres.org.'; setTimeout(() => { submitButton.classList.add('cursor-pointer'); submitButton.disabled = false }, 5000); }); } else { const _token = form.querySelector('[name="_token"]').value; const emailInput = form.querySelector('[name="email"]').value; const passwordInput = form.querySelector('[name="password"]').value; const firstNameInput = form.querySelector('[name="first_name"]').value; const lastNameInput = form.querySelector('[name="last_name"]').value; const organisationInput = form.querySelector('[name="organisation"]').value; const zipCodeInput = form.querySelector('[name="zip_code"]').value; const subscribeCheckbox = form.querySelector('[name="subscribe"]').checked ? 'on' : 'off'; submitButton.classList.remove('cursor-pointer'); submitButton.classList.add('cursor-not-allowed'); submitButton.disabled = true; const customErrorMessages = { "The email has already been taken.": "This email is already in use. Please try again with a different email." }; fetch('/register', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': _token }, body: JSON.stringify({ email: emailInput, password: passwordInput, first_name: firstNameInput, last_name: lastNameInput, organisation: organisationInput, zip_code: zipCodeInput, subscribe: subscribeCheckbox, }) }) .then(response => response.json().then(data => ({ status: response.status, body: data }))) // Parse JSON and include status .then(response => { if (response.status === 200) { if (response.body && response.body.message) { messageDiv.classList.remove('text-red-500'); messageDiv.classList.add('text-green-500'); messageDiv.innerText = response.body.message; localStorage.setItem('TOKEN', response.body.token); localStorage.setItem('NeedsVerifyEmail', 'true'); setTimeout(() => { location.reload(); }, 10000); } else { throw new Error('Invalid response format'); } } else if (response.status === 422) { // Validation errors messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = ''; // Clear any existing messages for (const [field, messages] of Object.entries(response.body.errors)) { messages.forEach(message => { const errorParagraph = document.createElement('p'); // Use custom message if available, otherwise use the original message errorParagraph.innerText = customErrorMessages[message] || message; messageDiv.appendChild(errorParagraph); }); } } else { throw new Error(response.status + ' ' + response.statusText); } }) .catch(error => { messageDiv.classList.remove('text-green-500'); messageDiv.classList.add('text-red-500'); messageDiv.innerText = 'An unexpected error occurred. Please try again.'; }) .finally(() => { submitButton.classList.add('cursor-pointer'); submitButton.classList.remove('cursor-not-allowed'); submitButton.disabled = false; }); } } function validateFields(form) { const inputs = [...form.querySelectorAll('input:not([type="hidden"])')]; const formValidity = inputs.reduce((valid, element) => { switch (element.type) { case 'email': return valid && /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(element.value); case 'password': return valid && element.value.length >= 8; case 'text': if (element.name === 'zip_code') { return valid && element.value.length >= 2 && element.value.length <= 20; } else if (element.name === 'first_name' || element.name === 'last_name') { return valid && element.value.trim() !== '' && /^[a-zA-Z\s]+$/.test(element.value) && element.value.length <= 40; } else if (element.name === 'organisation') { return valid && element.value.trim() !== '' && element.value.length <= 40; } else { return valid && element.value.trim() !== '' && element.value.trim() !== '' && element.value.length <= 40; } default: return valid; } }, true); const passwordInputs = inputs.filter(input => input.type === 'password'); const passwordsMatch = passwordInputs.length <= 1 || (passwordInputs[0].value === passwordInputs[1].value); return formValidity && passwordsMatch; } function toggleButtonStyling(isValid, submitButton) { if (isValid) { submitButton.disabled = false submitButton.classList.remove('cursor-not-allowed', 'bg-black/40'); submitButton.classList.add('cursor-pointer', 'bg-cw-green-200'); submitButton.disabled = false; } else { submitButton.disabled = true submitButton.classList.add('cursor-not-allowed', 'bg-black/40'); submitButton.classList.remove('cursor-pointer', 'bg-cw-green-200'); submitButton.disabled = true; } } function openAuthModal() { const authModal = document.getElementById('authFormModal'); authModal.classList.remove('hidden'); document.body.style.overflow = 'hidden' setTimeout(() => { authModal.classList.remove('opacity-0'); authModal.classList.add('opacity-100'); }, 30); } function closeAuthModal() { const authModal = document.getElementById('authFormModal'); authModal.classList.remove('opacity-100'); authModal.classList.add('opacity-0'); setTimeout(() => { authModal.classList.add('hidden'); document.body.style.overflow = 'auto'; }, 200); } </script> </div> </div> </section> </div> </section> <!-- End: /page_builder/_featured_resources.antlers.html --> <!-- /page_builder/_cta_card_resources.antlers.html --> <section class="container py-16 "> <div class="relative bg-cw-green-50 shadow-cards rounded overflow-hidden grid grid-cols-10"> <div class="col-span-10 lg:col-span-6 flex flex-col gap-6 p-8"> <!-- /typography/_h1.antlers.html --> <h1 class="text-2xl md:text-4xl font-bold leading-tight !font-black text-cw-green-800">Help us improve the banking sector</h1> <!-- End: /typography/_h1.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed leading-7 text-md">Our work to accelerate the transition to a cleaner, more just and resilient economy depends on the generosity of our supporters. Your gift will help Ceres drive progress across every sector of the economy.</p> <!-- End: /typography/_p.antlers.html --> <!-- /components/_button.antlers.html --> <a class=" cursor-pointer inline-flex px-8 rounded-full select-none whitespace-nowrap items-start self-start py-2 bg-cw-green-200 font-bold text-white text-lg [&_svg]:stroke-white [&_svg]:fill-white <!-- Adds extra space for mobile browsers to click on links if button requires it. --> " href="#XPCRHTWD" > <div class="flex flex-row text-center items-center justify-center gap-2" wire:click=""> Donate </div> </a> <!-- End: /components/_button.antlers.html --> </div> <div class="relative col-span-10 lg:col-span-4"> <img src="https://assets.ceres.org/images/banking-donate.jpeg" alt="Power plant emissions" class="w-full object-cover lg:absolute lg:h-[150%] lg:-top-1/4 lg:right-0 lg:rounded-tl-full lg:rounded-bl-full"> </div> </div> </section> <!-- End: /page_builder/_cta_card_resources.antlers.html --> <!-- /page_builder/_timeline.antlers.html --> <div class=" py-16 container " x-data="{ activeTab: 0 }" > <!-- /typography/_h2.antlers.html --> <h2 class="text-2xl font-bold leading-tight">Our Progress</h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed mt-2">Ceres is working to ensure that major banks set and achieve ambitious climate targets for 2030. As a result of our advocacy, we are seeing real progress. Here are some recent highlights.</p> <!-- End: /typography/_p.antlers.html --> <div id="scrollContainer" class="flex flex-row justify-center align-middle relative overflow-x-hidden w-full"> <div id="scrollable-icon" class="flex z-40 bg-white"> <div class="flex items-center my-6 justify-center"> <button type="button" @click="scrollStart" title="Scroll to start" aria-label="Scroll to start" > <!-- /components/_logo.antlers.html --> <svg width="32px" height="32px" viewBox="0 0 20 20" > <path d="M11.1071 10.0451C11.9056 9.28637 12.6792 8.54918 13.4529 7.81366C13.4429 7.80206 13.4346 7.79046 13.4247 7.77887C13.2508 7.89649 13.0752 8.01245 12.9029 8.13338C12.2038 8.62207 11.5047 9.11242 10.8056 9.59946C10.6864 9.68229 10.64 9.66241 10.5903 9.50835C10.4743 9.14556 10.3617 8.78276 10.2457 8.41997C10.0668 7.85838 9.88456 7.2968 9.704 6.73522C9.44225 5.91852 9.18383 5.10016 8.91546 4.28512C8.8641 4.12774 8.91877 4.08136 9.05792 4.06479C9.53668 4.00515 10.0154 3.97865 10.5008 4.02006C11.1336 4.07473 11.7383 4.22051 12.3214 4.46237C12.936 4.71749 13.4877 5.072 13.9863 5.51431C14.6324 6.08418 15.1244 6.76503 15.4789 7.54694C15.9262 8.53096 16.0769 9.56633 15.9643 10.6398C15.951 10.7624 15.9394 10.885 15.9245 11.0076C15.9079 11.1384 15.8483 11.1914 15.7058 11.1583C14.7765 10.938 13.8471 10.7226 12.9161 10.5056C12.3579 10.3747 11.7979 10.2439 11.2397 10.1113C11.2098 10.1031 11.1833 10.0832 11.1071 10.0451Z" fill="#006812"/> <path d="M9.8912 9.78339C8.91547 9.55809 7.96956 9.33942 7.0253 9.12075C7.02033 9.13566 7.01536 9.15057 7.01204 9.16548C7.94139 9.52165 8.86909 9.87616 9.84648 10.2505C9.68744 10.3698 9.57314 10.4626 9.45386 10.5454C8.72331 11.054 7.99109 11.5609 7.25888 12.0695C6.72545 12.4389 6.19037 12.8083 5.65695 13.1777C5.52111 13.2722 5.38527 13.3682 5.25109 13.4676C5.17323 13.524 5.11193 13.5157 5.06555 13.4312C4.86179 13.0535 4.64477 12.6841 4.46255 12.2981C4.21572 11.7763 4.08319 11.2246 4.03183 10.6531C3.96391 9.89438 3.99705 9.14394 4.20578 8.40511C4.46089 7.50061 4.90154 6.70544 5.52111 5.99974C5.97667 5.47957 6.51672 5.0737 7.10978 4.73244C7.28538 4.63139 7.30526 4.63967 7.40134 4.82521C7.84862 5.69824 8.29591 6.57292 8.74153 7.44594C9.11592 8.18147 9.48865 8.91865 9.86139 9.65583C9.87133 9.67737 9.87298 9.70387 9.8912 9.78339Z" fill="#006812"/> <path d="M10.3985 10.723C10.9071 11.7236 11.4008 12.6977 11.8961 13.6718C11.906 13.6685 11.9176 13.6651 11.9275 13.6602C11.6161 12.6878 11.3063 11.7153 10.9866 10.7197C11.0562 10.723 11.0926 10.7164 11.1224 10.728C11.8248 10.9964 12.5256 11.2664 13.2263 11.5348C13.662 11.7021 14.0993 11.8661 14.535 12.0301C14.8067 12.1328 15.0767 12.2355 15.3501 12.3332C15.4611 12.373 15.4909 12.4343 15.4395 12.542C15.1894 13.0737 14.8713 13.5641 14.4754 13.9981C13.9734 14.5514 13.3969 15.0153 12.7277 15.3499C12.0949 15.6663 11.4306 15.8883 10.7199 15.9512C9.98271 16.0158 9.2505 16.0076 8.52988 15.822C7.76287 15.6249 7.05717 15.2969 6.42103 14.8198C6.24212 14.6856 6.23881 14.6591 6.40281 14.5034C7.0787 13.859 7.75294 13.2162 8.43048 12.5735C9.04011 11.9936 9.65139 11.4155 10.2627 10.8373C10.2975 10.8042 10.3339 10.7761 10.3985 10.723Z" fill="#006812"/> </svg> <!-- End: /components/_logo.antlers.html --> </button> </div> </div> <span x-data="{ spanWidth: 0 }" x-init="spanWidth = document.getElementById('scrollContainer').clientWidth;" :style="'width:' + spanWidth + 'px;'" class="h-[1.5px] bg-cw-green-100 absolute top-1/2 -translate-y-1/2"></span> <ul x-ref="con" class="items flex flex-row w-full overflow-x-scroll no-scrollbar gap-16" tabindex="0" > <li class=" flex-none select-none w-full md:w-fit item " data-selected="true" > <div class="flex items-center my-6 justify-center" role="tablist"> <a :class="activeTab !== 0 && '!border !border-black !text-black !bg-white'" class="text-xl font-bold cursor-pointer z-10 flex items-center justify-center border border-cw-green-800 bg-cw-green-800 text-white rounded-full px-8 py-2" x-on:click.prevent="activeTab = 0" role="tab" > Citi </a> </div> </li> <li class=" flex-none select-none w-full md:w-fit item " data-selected="false" > <div class="flex items-center my-6 justify-center" role="tablist"> <a :class="activeTab !== 1 && '!border !border-black !text-black !bg-white'" class="text-xl font-bold cursor-pointer z-10 flex items-center justify-center border border-cw-green-800 bg-cw-green-800 text-white rounded-full px-8 py-2" x-on:click.prevent="activeTab = 1" role="tab" > Bank of America </a> </div> </li> <li class=" flex-none select-none w-full md:w-fit item " data-selected="false" > <div class="flex items-center my-6 justify-center" role="tablist"> <a :class="activeTab !== 2 && '!border !border-black !text-black !bg-white'" class="text-xl font-bold cursor-pointer z-10 flex items-center justify-center border border-cw-green-800 bg-cw-green-800 text-white rounded-full px-8 py-2" x-on:click.prevent="activeTab = 2" role="tab" > Wells Fargo </a> </div> </li> <li class=" flex-none select-none w-full md:w-fit item " data-selected="false" > <div class="flex items-center my-6 justify-center" role="tablist"> <a :class="activeTab !== 3 && '!border !border-black !text-black !bg-white'" class="text-xl font-bold cursor-pointer z-10 flex items-center justify-center border border-cw-green-800 bg-cw-green-800 text-white rounded-full px-8 py-2" x-on:click.prevent="activeTab = 3" role="tab" > Barclays </a> </div> </li> <li class=" flex-none select-none w-full md:w-fit item " data-selected="false" > <div class="flex items-center my-6 justify-center" role="tablist"> <a :class="activeTab !== 4 && '!border !border-black !text-black !bg-white'" class="text-xl font-bold cursor-pointer z-10 flex items-center justify-center border border-cw-green-800 bg-cw-green-800 text-white rounded-full px-8 py-2" x-on:click.prevent="activeTab = 4" role="tab" > JPMorgan </a> </div> </li> </ul> </div> <div> <div class="flex flex-row justify-end"> <button id="scrollLeftBtn" class="w-8 h-8 mr-4" title="Scroll Previous" aria-label="Scroll Previous" @click="activeTab > 0 ? activeTab-- : null;"> <svg width="32px" height="32px" viewBox="0 0 32 32" fill="none" class="rotate-180" > <path d="M16 3C13.4288 3 10.9154 3.76244 8.77759 5.1909C6.63975 6.61935 4.97351 8.64968 3.98957 11.0251C3.00563 13.4006 2.74819 16.0144 3.2498 18.5362C3.75141 21.0579 4.98953 23.3743 6.80762 25.1924C8.6257 27.0105 10.9421 28.2486 13.4638 28.7502C15.9856 29.2518 18.5995 28.9944 20.9749 28.0104C23.3503 27.0265 25.3807 25.3603 26.8091 23.2224C28.2376 21.0846 29 18.5712 29 16C28.9964 12.5533 27.6256 9.24882 25.1884 6.81163C22.7512 4.37445 19.4467 3.00364 16 3ZM16 27C13.8244 27 11.6977 26.3549 9.88873 25.1462C8.07979 23.9375 6.66989 22.2195 5.83733 20.2095C5.00477 18.1995 4.78693 15.9878 5.21137 13.854C5.63581 11.7202 6.68345 9.7602 8.22183 8.22183C9.76021 6.68345 11.7202 5.6358 13.854 5.21136C15.9878 4.78692 18.1995 5.00476 20.2095 5.83733C22.2195 6.66989 23.9375 8.07979 25.1462 9.88873C26.3549 11.6977 27 13.8244 27 16C26.9967 18.9164 25.8367 21.7123 23.7745 23.7745C21.7123 25.8367 18.9164 26.9967 16 27ZM21.7075 15.2925C21.8005 15.3854 21.8742 15.4957 21.9246 15.6171C21.9749 15.7385 22.0008 15.8686 22.0008 16C22.0008 16.1314 21.9749 16.2615 21.9246 16.3829C21.8742 16.5043 21.8005 16.6146 21.7075 16.7075L17.7075 20.7075C17.5199 20.8951 17.2654 21.0006 17 21.0006C16.7346 21.0006 16.4801 20.8951 16.2925 20.7075C16.1049 20.5199 15.9994 20.2654 15.9994 20C15.9994 19.7346 16.1049 19.4801 16.2925 19.2925L18.5863 17H11C10.7348 17 10.4804 16.8946 10.2929 16.7071C10.1054 16.5196 10 16.2652 10 16C10 15.7348 10.1054 15.4804 10.2929 15.2929C10.4804 15.1054 10.7348 15 11 15H18.5863L16.2925 12.7075C16.1049 12.5199 15.9994 12.2654 15.9994 12C15.9994 11.7346 16.1049 11.4801 16.2925 11.2925C16.4801 11.1049 16.7346 10.9994 17 10.9994C17.2654 10.9994 17.5199 11.1049 17.7075 11.2925L21.7075 15.2925Z" fill="#006812" /> </svg> </button> <button id="scrollRightBtn" class="w-8 h-8" title="Scroll Next" aria-label="Scroll Next" @click="activeTab < $refs.con.children.length - 1 ? activeTab++ : null;"> <svg width="32px" height="32px" viewBox="0 0 32 32" fill="none" class="" > <path d="M16 3C13.4288 3 10.9154 3.76244 8.77759 5.1909C6.63975 6.61935 4.97351 8.64968 3.98957 11.0251C3.00563 13.4006 2.74819 16.0144 3.2498 18.5362C3.75141 21.0579 4.98953 23.3743 6.80762 25.1924C8.6257 27.0105 10.9421 28.2486 13.4638 28.7502C15.9856 29.2518 18.5995 28.9944 20.9749 28.0104C23.3503 27.0265 25.3807 25.3603 26.8091 23.2224C28.2376 21.0846 29 18.5712 29 16C28.9964 12.5533 27.6256 9.24882 25.1884 6.81163C22.7512 4.37445 19.4467 3.00364 16 3ZM16 27C13.8244 27 11.6977 26.3549 9.88873 25.1462C8.07979 23.9375 6.66989 22.2195 5.83733 20.2095C5.00477 18.1995 4.78693 15.9878 5.21137 13.854C5.63581 11.7202 6.68345 9.7602 8.22183 8.22183C9.76021 6.68345 11.7202 5.6358 13.854 5.21136C15.9878 4.78692 18.1995 5.00476 20.2095 5.83733C22.2195 6.66989 23.9375 8.07979 25.1462 9.88873C26.3549 11.6977 27 13.8244 27 16C26.9967 18.9164 25.8367 21.7123 23.7745 23.7745C21.7123 25.8367 18.9164 26.9967 16 27ZM21.7075 15.2925C21.8005 15.3854 21.8742 15.4957 21.9246 15.6171C21.9749 15.7385 22.0008 15.8686 22.0008 16C22.0008 16.1314 21.9749 16.2615 21.9246 16.3829C21.8742 16.5043 21.8005 16.6146 21.7075 16.7075L17.7075 20.7075C17.5199 20.8951 17.2654 21.0006 17 21.0006C16.7346 21.0006 16.4801 20.8951 16.2925 20.7075C16.1049 20.5199 15.9994 20.2654 15.9994 20C15.9994 19.7346 16.1049 19.4801 16.2925 19.2925L18.5863 17H11C10.7348 17 10.4804 16.8946 10.2929 16.7071C10.1054 16.5196 10 16.2652 10 16C10 15.7348 10.1054 15.4804 10.2929 15.2929C10.4804 15.1054 10.7348 15 11 15H18.5863L16.2925 12.7075C16.1049 12.5199 15.9994 12.2654 15.9994 12C15.9994 11.7346 16.1049 11.4801 16.2925 11.2925C16.4801 11.1049 16.7346 10.9994 17 10.9994C17.2654 10.9994 17.5199 11.1049 17.7075 11.2925L21.7075 15.2925Z" fill="#006812" /> </svg> </button> </div> </div> <div x-cloak x-show="activeTab === 0" class="flex flex-col gap-5" > <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed m-0 md:max-w-5xl">As of April 2024, Citi remains on track to set financed emissions reduction targets on all high emitting sectors, currently having set targets on six sectors. Ceres’ direct engagement with Citi and investor engagement through various shareholder resolutions has led them to improve their transition plan, disclose client alignment percentage data (showing that resp. 37% and 59% of their Energy and Power clients are demonstrating ability to decarbonize their scope ½ emissions) and commit to disclose their clean energy supply ratio next year.</p> <!-- End: /typography/_p.antlers.html --> <div class="flex items-center"> <div> </div> </div> </div> <div x-cloak x-show="activeTab === 1" class="flex flex-col gap-5" > <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed m-0 md:max-w-5xl">In 2024, after consulting with Ceres on methodologies and targets design, Bank of America committed to reduce its financed emissions intensity for three new sectors, Aviation, Steel and Cement (resp. –37% , -27% and –32% by 2030), and to align its Maritime Shipping portfolio to the Poseidon Principles. We are pursuing our work with them on targets design and the inclusion of facilitated emissions-to-targets scope.</p> <!-- End: /typography/_p.antlers.html --> <div class="flex items-center"> <div> </div> </div> </div> <div x-cloak x-show="activeTab === 2" class="flex flex-col gap-5" > <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed m-0 md:max-w-5xl">As of April 2024 Ceres continues to work with Wells Fargo on building a credible transition plan towards its net-zero targets and sector commitments for Oil and Gas, Power, Aviation, Automotive and Steel sectors through direct engagement, discussions and investor work.</p> <!-- End: /typography/_p.antlers.html --> <div class="flex items-center"> <div> </div> </div> </div> <div x-cloak x-show="activeTab === 3" class="flex flex-col gap-5" > <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed m-0 md:max-w-5xl">In February 2024, Barclays announced a climate strategy for transitioning the energy sector by committing to no longer directly financing new upstream oil and gas projects or related infrastructure and restricted funding for clients reliant on expansion (more than 10% of planned capital expenditure). Additionally, Ceres worked with Barclays to guide its pilot for a just transition assessment within its Client Transition Framework to evaluate whether clients are seeking to decarbonize in line with a just transition.</p> <!-- End: /typography/_p.antlers.html --> <div class="flex items-center"> <div> </div> </div> </div> <div x-cloak x-show="activeTab === 4" class="flex flex-col gap-5" > <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed m-0 md:max-w-5xl">In December 2023, JPMorgan committed to reduce its portfolio emissions intensity on two additional sectors, Shipping and Aluminum (resp. -33% and –25% by 2030), bringing sectors they set targets on to eight. One significant update this year was the adoption of a new “energy mix” target for scope 3, replacing their previous scope 3 energy target of –15%, the new target includes zero-carbon power generations in its scope and raises the intensity reduction percentage to –36% by 2030. Due to investor engagement through a shareholder resolution, JP also committed to disclose its clean energy supply ratio next year.</p> <!-- End: /typography/_p.antlers.html --> <div class="flex items-center"> <div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', () => { const container = document.getElementById('scrollContainer'); const items = container.querySelectorAll('.item'); const scrollLeftBtn = document.getElementById('scrollLeftBtn'); const scrollRightBtn = document.getElementById('scrollRightBtn'); let selectedIndex = [...items].findIndex(item => item.getAttribute('data-selected') === 'true'); const scrollToSelected = () => { const selectedItem = items[selectedIndex]; if (!selectedItem) return; selectedItem.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' }); }; const updateSelection = (newIndex) => { if (selectedIndex !== -1) { items[selectedIndex].removeAttribute('data-selected'); } selectedIndex = newIndex; items[selectedIndex].setAttribute('data-selected', 'true'); scrollToSelected(); }; const scrollLeft = () => { if (selectedIndex <= 0) return; updateSelection(selectedIndex - 1); }; const scrollRight = () => { if (selectedIndex >= items.length - 1) return; updateSelection(selectedIndex + 1); }; items.forEach((item, index) => { item.addEventListener('click', () => updateSelection(index)); }); scrollRightBtn.addEventListener('click', scrollRight); scrollLeftBtn.addEventListener('click', scrollLeft); }); </script> <!-- End: /page_builder/_timeline.antlers.html --> <!-- /page_builder/_subscribe_to_newsletter_green_banner.antlers.html --> <section class="bg-cw-green-200 text-white "> <div class=" container py-12" > <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-0 gap-y-8 lg:gap-16 "> <div class="flex flex-col col-span-12 lg:col-span-6 gap-2"> <!-- /typography/_h2.antlers.html --> <h2 class="text-3xl font-bold">Never miss an alert</h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Sign up for the latest news and updates from Ceres.</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="flex flex-col justify-center items-center col-span-12 lg:col-span-6"> <div class="w-full" x-data="{ singular_email: '', emailValid: false, emailPattern: /^[a-zA-Z0-9._-]+(\+[a-zA-Z0-9._-]+)*@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/, validateEmail() { this.emailValid = this.emailPattern.test(this.singular_email); }, handleEnterKey(event) { if (event.key === 'Enter' && this.emailValid) { event.preventDefault(); openModal(); } } }" > <div aria-label="Newsletter Subscription Form"> <div class="relative"> <input class="text-black appearance-none rounded w-full py-3 px-6 !border-cw-green-200 !outline-none !ring-0 " type="email" name="singular_email" placeholder="Email Address" required x-model="singular_email" x-on:input="validateEmail(); $dispatch('email-changed', singular_email)" aria-label="Email Address" aria-required="true" :aria-invalid="!emailValid.toString()" x-on:change="localStorage.setItem('singular_email', singular_email);" x-on:keydown="handleEnterKey" > <button class="w-fit rounded-full bg-black/40 text-white font-bold p-2 focus:outline-none focus:shadow-outline absolute right-6 top-[50%] -translate-y-[50%] flex align-center justify-center transition-bg duration-300 ease-in-out" type="submit" :disabled="!emailValid" :aria-disabled="!emailValid.toString()" :class="{ '!bg-cw-green-800 hover:!bg-cw-green-800/75': emailValid, 'cursor-not-allowed': !emailValid }" aria-label="Submit" x-on:click="() => openModal()" > <span> <svg width="14" height="14" class="fill-current" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/> </svg> </span> </button> </div> </div> </div> </div> </div> </div> <div id="newsletter-modal" class="hidden fixed opacity-0 z-50 transition-opacity duration-500 w-full h-full bg-black/50 top-0 left-0 px-4"> <div class="w-full h-full flex items-center justify-center text-black"> <div id="modalNewsletterContainer" class="relative bg-cw-green-50 rounded-lg"> <div onclick="closeModal()" id="closeNewsletterModal" class="absolute top-4 right-4 cursor-pointer z-50"> <svg width="32" height="32" class="stroke-gray-400" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-circle"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg> </div> <!-- /page_builder/_subscribe_to_newsletter_form_full.antlers.html --> <section class="bg-cw-green-50 rounded-lg" @email-changed.window="email_address = $event.detail" x-data="{ first_name: '', last_name: '', organisation: '', zip_code: '', email_address: '', valid: { first_name: false, last_name: false, organisation: false, zip_code: false, email_address: false }, validateFirstName() { this.valid.first_name = this.first_name.length >= 3; }, validateLastName() { this.valid.last_name = this.last_name.length >= 3; }, validateOrganisation() { this.valid.organisation = this.organisation.length >= 3; }, validateZipCode() { this.valid.zip_code = this.zip_code.length >= 5; }, validateEmailAddress() { const pattern = /^[a-zA-Z0-9._-]+(\+[a-zA-Z0-9._-]+)*@[a-zA-Z0-9.-]+\.[a-zA-Z]+$/; this.valid.email_address = pattern.test(this.email_address); }, isFormValid() { return Object.values(this.valid).every(value => value); }, }" x-init="() => { $watch('email_address', () => validateEmailAddress()) if (localStorage.getItem('singular_email')) { email_address = localStorage.getItem('singular_email') || ''; localStorage.removeItem('singular_email'); // remove it from localStorage after fetching setTimeout(() => { document.getElementById('modalNewsletterForm').scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 500); // delay of 500 milliseconds to allow page to render } }" > <div class="relative container py-16"> <form id="modalNewsletterForm" class="transition-all duration-300"> <input type="hidden" name="_token" value="STATAMIC_CSRF_TOKEN"> <div class="flex flex-col max-w-lg mx-auto gap-8"> <div class="flex flex-col items-center gap-1"> <!-- /typography/_h2.antlers.html --> <h2 class="text-4xl font-medium">Never miss an alert</h2> <!-- End: /typography/_h2.antlers.html --> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed text-[17px]">Sign up for the latest news and updates from Ceres.</p> <!-- End: /typography/_p.antlers.html --> </div> <div class="flex flex-col rounded-lg"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 gap-5 rounded-lg "> <input type="text" id="lupt3m92" name="first_name" value="" required placeholder="First name" minlength="3" maxlength="" autocomplete="off" x-model="first_name" x-on:input="validateFirstName()" :class="{ '!border-cw-green-150/90': valid.first_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6" /> <input type="text" id="lupt3m92" name="last_name" value="" required placeholder="Last name" minlength="3" maxlength="" autocomplete="off" x-model="last_name" x-on:input="validateLastName()" :class="{ '!border-cw-green-150/90': valid.last_name }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6" /> <input type="text" id="lupt3m92" name="organisation" value="" required placeholder="Organization" minlength="3" maxlength="" autocomplete="off" x-model="organisation" x-on:input="validateOrganisation()" :class="{ '!border-cw-green-150/90': valid.organisation }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6" /> <input type="text" id="lupt3m92" name="zip_code" value="" required placeholder="ZIP Code" minlength="5" maxlength="" autocomplete="off" x-model="zip_code" x-on:input="validateZipCode()" :class="{ '!border-cw-green-150/90': valid.zip_code }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-6" /> <input type="email" id="lupt3m92" name="email_address" value="" required placeholder="Email Address" minlength="" maxlength="" autocomplete="off" x-model="email_address" x-on:input="validateEmailAddress()" :class="{ '!border-cw-green-150/90': valid.email_address }" class="border-2 border-cw-grey-500 rounded-md px-4 py-3 text-sm font-medium focus:!border-cw-green-select !ring-0 !outline-none transition-border duration-200 ease-in-out col-span-12" /> </div> </div> <div class="flex flex-col gap-4 items-center"> <button type="submit" class="text-white bg-black/40 rounded-full w-fit px-10 py-4 text-[17px] transition-bg duration-300 ease-in-out" :class="isFormValid() && 'bg-cw-green-800 text-white rounded-full w-fit px-10 py-4 text-[17px] hover:opacity-90'" :disabled="!isFormValid()" > Sign up </button> <p class="[text-wrap:balance] text-center max-w-sm [&_a]:cursor-pointer [&_a]:text-cw-green-800 [&_a]:font-medium"> By signing up, you agree to our <a class="underline" target="_blank" href="/privacy-policy">Privacy Policy</a> </p> </div> </div> </form> </div> </section> <script> document.addEventListener('DOMContentLoaded', function() { // Due to the script being loaded before these HTML elements are rendered, we need to set them once content has been loaded. successElement = document.getElementById('newsletterSuccessState'); errorElement = document.getElementById('newsletterErrorState'); }); const newsletterModal = document.getElementById('newsletter-modal'); const closeNewsletterModal = document.getElementById('closeNewsletterModal'); const newsletterForm = document.getElementById('modalNewsletterForm'); let successElement let errorElement function submitState(form, stateElement, isSuccess, message) { form.style.opacity = '0'; stateElement.innerHTML = ''; stateElement.style.display = 'flex'; setTimeout(() => { stateElement.style.opacity = '1'; }, 30) let messageContent; if (isSuccess) { messageContent = `<h2 class="text-cw-green-200 text-center">Subscription confirmed!</h2> <p class="text-center">Thanks for signing up. You’ll receive your first email from Ceres soon!</p>`; setTimeout(() => { if (newsletterModal) { cleanupElements(); } else { window.location.href = '/'; } }, 3000); } else { errorElement.style.display = 'flex'; messageContent = `<p class="text-red-600">Error - ${message || 'There was an issue with your submission. Please try again.'}</p>`; } stateElement.innerHTML = messageContent; } function handleSubmitNewsletterForm(event) { event.preventDefault(); errorElement.style.display = 'none'; const form = event.target; const submitButton = form.querySelector('button[type="submit"]'); submitButton.disabled = true; const formData = new FormData(form); const data = {}; formData.forEach((value, key) => { data[key] = value; }); const jsonData = JSON.stringify(data); fetch('/subscribeToNewsletterOnly', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': form.querySelector('input[name="_token"]').value }, body: jsonData }) .then(response => response.json()) .then(data => { console.log('Success:', data); submitState(form, successElement, true); }) .catch((error) => { console.error('Error:', error); submitState(form, errorElement, false); submitButton.disabled = false; }); removeEventListener('submit', handleSubmitNewsletterForm); } function cleanupElements() { const sectionParent = newsletterModal.closest('section'); if (sectionParent) { sectionParent.style.transition = 'opacity 300ms ease-out'; sectionParent.style.opacity = '0'; // Wait for the transition to complete before removing the element sectionParent.addEventListener('transitionend', function() { closeModal(); this.remove(); }); } } newsletterForm.addEventListener('submit', handleSubmitNewsletterForm); </script> <!-- End: /page_builder/_subscribe_to_newsletter_form_full.antlers.html --> <div id="newsletterErrorState" class="hidden px-8 pb-4 [&_p]:text-md"> </div> <div id="newsletterSuccessState" class=" hidden absolute px-8 flex-col gap-4 items-center justify-center top-0 left-0 w-full h-full transition-opacity delay-300 opacity-0 [&_h2]:text-4xl [&_p]:text-lg " ></div> </div> </div> </div> <script> const openModal = () => { newsletterModal.classList.remove('hidden'); document.body.style.overflow = 'hidden'; setTimeout(() => { newsletterModal.classList.remove('opacity-0'); newsletterModal.classList.add('opacity-100'); }, 30); newsletterModal.addEventListener('click', handleClickOutsideModal); newsletterForm.addEventListener('submit', handleSubmitNewsletterForm); } const closeModal = () => { newsletterModal.classList.remove('opacity-100'); newsletterModal.classList.add('opacity-0'); setTimeout(() => { newsletterModal.classList.add('hidden'); document.body.style.overflow = 'auto'; }, 200); newsletterModal.removeEventListener('click', handleClickOutsideModal); newsletterForm.removeEventListener('submit', handleSubmitNewsletterForm); } function handleClickOutsideModal(event) { if (!event.target.closest('#modalNewsletterContainer')) { closeModal(); } } </script> </section> <!-- End: /page_builder/_subscribe_to_newsletter_green_banner.antlers.html --> </main> <!-- End: /default.antlers.html --> <!-- /layout/_footer.antlers.html --> <footer> <div class="container"> <div class="flex flex-col gap-12 lg:gap-24 py-16 border-b border-b-black/25 lg:flex-row"> <div> <!-- /components/_logo.antlers.html --> <a aria-label="Logo Ceres" href="/" > <img src="/visuals/logo-dark.svg" class="select-none " width="108" alt="Ceres"/> </a> <!-- End: /components/_logo.antlers.html --> </div> <div class="flex-grow"> <!-- Grid component for layout of modules. Has default styling but can be changed using the class prop. --> <div class=" grid grid-cols-12 justify-between gap-6 lg:gap-0 gap-y-12 lg:flex lg:flex-row "> <div class="col-span-6 md:col-span-3 "> <a href="#" > <!-- /typography/_h4.antlers.html --> <h4 class="font-bold text-[16px] text-cw-green-250 mb-4">Issues</h4> <!-- End: /typography/_h4.antlers.html --> </a> <ul class="flex flex-col gap-3"> <li> <a href="https://www.ceres.org/climate" > <p class="text-[16px] tracking-tight"> Climate crisis </p> </a> </li> <li> <a href="https://www.ceres.org/water" > <p class="text-[16px] tracking-tight"> Water scarcity and pollution </p> </a> </li> <li> <a href="https://www.ceres.org/nature" > <p class="text-[16px] tracking-tight"> Nature and biodiversity loss </p> </a> </li> </ul> </div> <div class="col-span-6 md:col-span-3 "> <a href="https://www.ceres.org/networks" > <!-- /typography/_h4.antlers.html --> <h4 class="font-bold text-[16px] text-cw-green-250 mb-4">Networks</h4> <!-- End: /typography/_h4.antlers.html --> </a> <ul class="flex flex-col gap-3"> <li> <a href="https://www.ceres.org/networks/investor" > <p class="text-[16px] tracking-tight"> Investor Network </p> </a> </li> <li> <a href="https://www.ceres.org/networks/company" > <p class="text-[16px] tracking-tight"> Company Network </p> </a> </li> <li> <a href="https://www.ceres.org/networks/policy" > <p class="text-[16px] tracking-tight"> Policy Network </p> </a> </li> </ul> </div> <div class="col-span-6 md:col-span-3 "> <a href="https://www.ceres.org/resources" > <!-- /typography/_h4.antlers.html --> <h4 class="font-bold text-[16px] text-cw-green-250 mb-4">Resources</h4> <!-- End: /typography/_h4.antlers.html --> </a> <ul class="flex flex-col gap-3"> <li> <a href="https://www.ceres.org/resources/reports" > <p class="text-[16px] tracking-tight"> Reports </p> </a> </li> <li> <a href="https://www.ceres.org/events" > <p class="text-[16px] tracking-tight"> Events and webinars </p> </a> </li> <li> <a href="https://www.ceres.org/resources/news" > <p class="text-[16px] tracking-tight"> News and insights </p> </a> </li> </ul> </div> <div class="col-span-6 md:col-span-3 "> <a href="#" > <!-- /typography/_h4.antlers.html --> <h4 class="font-bold text-[16px] text-cw-green-250 mb-4">Work with us</h4> <!-- End: /typography/_h4.antlers.html --> </a> <ul class="flex flex-col gap-3"> <li> <a href="https://www.ceres.org/careers" > <p class="text-[16px] tracking-tight"> Careers </p> </a> </li> <li> <a href="https://www.ceres.org/procurement" > <p class="text-[16px] tracking-tight"> Procurement opportunities </p> </a> </li> </ul> </div> </div> </div> </div> <div class="flex flex-col py-10 gap-16 justify-between md:flex-row"> <div class="flex flex-row gap-16 flex-wrap"> <div class="text-[16px]"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed font-bold text-cw-green-250">Headquarters</p> <!-- End: /typography/_p.antlers.html --> <p>99 Chauncy Street, 6th Floor<br>Boston, MA 02111</p> </div> <div class="text-[16px]"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed font-bold text-cw-green-250">California Office</p> <!-- End: /typography/_p.antlers.html --> <p>369 Pine Street, Suite 620<br>San Francisco, CA 94104</p> </div> <div class="text-[16px]"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed font-bold text-cw-green-250">Connect with us</p> <!-- End: /typography/_p.antlers.html --> <p>(617) 247-0700 | <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3e575058517e5d5b4c5b4d10514c59">[email&#160;protected]</a><br>For media inquiries, email us at <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="137e76777a727a7d62667a617a76605370766176603d7c6174">[email&#160;protected]</a>.</p> </div> </div> <div class="flex flex-row h-fit md:self-end"> <a href="https://www.facebook.com/ceres.org/" aria-label="Facebook" target="_blank" rel="noopener noreferrer" class=" px-2 hover:opacity-70 transition-opacity duration-200 ease-in-out"> <svg height="1rem" width="1rem" width="206" height="370" viewBox="0 0 206 370" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M169.4 66.72L205.11 67.65V2.67L152.2 0.809998C102.47 0.809998 62.16 41.12 62.16 90.85V148.4H0.890015V218.02H62.16V369.34H139.21V218.02H193.98L205.12 148.4H139.21V96.91C139.21 80.23 152.73 66.71 169.41 66.71L169.4 66.72Z" fill="#246F00"/> </svg> </a> &middot; <a href="https://twitter.com/CeresNews" aria-label="Twitter" target="_blank" rel="noopener noreferrer" class="fill-cw-green-250 px-2 hover:opacity-70 transition-opacity duration-200 ease-in-out"> <svg height="1rem" width="1rem" width="1200" height="1227" viewBox="0 0 1200 1227" xmlns="http://www.w3.org/2000/svg"> <path d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="current"/> </svg> </a> &middot; <a href="https://www.linkedin.com/company/ceres-org" aria-label="LinkedIn" target="_blank" rel="noopener noreferrer" class=" px-2 hover:opacity-70 transition-opacity duration-200 ease-in-out"> <svg height="1rem" width="1rem" width="376" height="376" viewBox="0 0 376 376" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M90.57 131.75H13.8V375.08H90.57V131.75Z" fill="#246F00"/> <path d="M62.1239 96.4142C85.9701 91.2454 101.111 67.7241 95.9423 43.8779C90.7735 20.0317 67.2522 4.8907 43.406 10.0595C19.5598 15.2283 4.41882 38.7496 9.58762 62.5958C14.7564 86.442 38.2777 101.583 62.1239 96.4142Z" fill="#246F00"/> <path d="M288.51 124.51C229.12 124.51 212.23 165.07 212.23 165.07V131.76H138.36V375.09H215.13V247.63C215.13 230.25 220.44 191.14 260.03 191.14C299.62 191.14 299.62 237.01 299.62 237.01V375.09H375.42V230.73C375.42 162.17 347.9 124.51 288.51 124.51Z" fill="#246F00"/> </svg> </a> &middot; <a href="https://bsky.app/profile/ceresorg.bsky.social" aria-label="Bluesky" target="_blank" rel="noopener noreferrer" class="pr-0 px-2 hover:opacity-70 transition-opacity duration-200 ease-in-out"> <svg height="1rem" width="1rem" xmlns="http://www.w3.org/2000/svg" width="376" height="376" viewBox="0 0 376 376"> <path fill="#246F00" transform="scale(5.875)" d="M13.9 3.8A75.1 75.1 0 0 1 32 26.6v15.8c0-.3-.1 0-.4.9-1.5 4.5-7.4 21.8-21 8-7-7.4-3.8-14.7 9.2-17-7.4 1.4-15.7-.7-18-9A193 193 0 0 1 0 6.6C0-3.3 8.6-.1 13.9 3.9zm36.2 0A75.1 75.1 0 0 0 32 26.6v15.8c0-.3.1 0 .4.9 1.5 4.5 7.4 21.8 21 8 7-7.4 3.8-14.7-9.2-17 7.4 1.4 15.7-.7 18-9A193 193 0 0 0 64 6.6c0-9.8-8.6-6.7-13.9-2.7z"/> </svg> </a> </div> </div> </div> <div class="w-full bg-cw-green-100"> <div class="flex flex-row container justify-between py-4 text-sm flex-wrap gap-6"> <div class="flex flex-row items-center"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed pr-6 border-r border-r-black">©2025 Ceres</p> <!-- End: /typography/_p.antlers.html --> <a href="/privacy-policy" class="px-6 border-r border-r-black"> PRIVACY POLICY </a> <div class="px-6 border-r border-r-black"> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed inline-block">Website by</p> <!-- End: /typography/_p.antlers.html --> <a href="https://brewdigital.com/" target="_blank" rel="noreferrer noopener" class="font-bold text-cw-green-250 hover:text-cw-green-250/75 transition-colors">Brew Digital</a> </div> </div> <!-- /typography/_p.antlers.html --> <p class="mt-0 last:mb-0 leading-relaxed ">Ceres is a 501(c)(3) tax-exempt nonprofit organization registered in the US under EIN 223-053747</p> <!-- End: /typography/_p.antlers.html --> </div> </div> </footer> <!-- End: /layout/_footer.antlers.html --> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script data-navigate-once="true">window.livewireScriptConfig = {"csrf":"STATAMIC_CSRF_TOKEN","uri":"\/livewire\/update","progressBar":"","nonce":""};</script> <script> function smoothScrollToElement(targetId) { const targetElement = document.querySelector(targetId); if (targetElement) { const isMobile = window.innerWidth < 1280; targetElement.scrollIntoView({ behavior: 'smooth', block: isMobile ? 'start' : 'center' }); } } function handleLoadEvent() { const hash = window.location.hash; if (hash) { smoothScrollToElement(hash); } // Remove the event listener after it has executed window.removeEventListener('load', handleLoadEvent); } // Attach the load event listener window.addEventListener('load', handleLoadEvent); // Handle click events for jump links on the page document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); smoothScrollToElement(targetId); // Update the URL without reloading the page history.pushState(null, '', targetId); }); }); </script> <script>(function() { var els = document.getElementsByClassName('nocache'); var map = {}; for (var i = 0; i < els.length; i++) { var section = els[i].getAttribute('data-nocache'); map[section] = els[i]; } fetch('/!/nocache', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: window.location.href.split('#')[0], sections: Object.keys(map) }) }) .then((response) => response.json()) .then((data) => { const regions = data.regions; for (var key in regions) { if (map[key]) map[key].outerHTML = regions[key]; } for (const input of document.querySelectorAll('input[value="STATAMIC_CSRF_TOKEN"]')) { input.value = data.csrf; } for (const meta of document.querySelectorAll('meta[content="STATAMIC_CSRF_TOKEN"]')) { meta.content = data.csrf; } for (const input of document.querySelectorAll('script[data-csrf="STATAMIC_CSRF_TOKEN"]')) { input.setAttribute('data-csrf', data.csrf); } if (window.hasOwnProperty('livewire_token')) { window.livewire_token = data.csrf } if (window.hasOwnProperty('livewireScriptConfig')) { window.livewireScriptConfig.csrf = data.csrf } document.dispatchEvent(new CustomEvent('statamic:nocache.replaced', { detail: data })); }); })();</script></body> </html> <!-- End: /layout.antlers.html -->

Pages: 1 2 3 4 5 6 7 8 9 10