CINXE.COM
Fight for the Future
<!doctype html> <html lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Fight for the Future</title> <link rel="stylesheet" href="/wp-content/themes/fight/css/homepage.css?v=1743980438"> <link rel="stylesheet" href="https://use.typekit.net/bkm1wdi.css"> <link rel="icon" type="image/x-icon" href="https://www.fightforthefuture.org/favicon.ico" /> <link rel="alternate" type="application/rss+xml" title="Fight for the Future News" href="/news/feed.xml"> <!-- Facebook Open Graph --> <meta property="og:locale" content="en_US"/> <meta property="og:site_name" content="Fight for the Future"/> <meta property="og:title" content="Fight for the Future"/> <meta property="og:url" content="https://www.fightforthefuture.org/"/> <meta property="og:type" content="website"/> <meta property="og:description" content="Who are we? We are a group of artists, engineers, activists, and technologists who have been behind the largest online protests in human history, channeling Internet outrage into political power to win public interest victories previously thought to be impossible. We fight for a future where technology is a force for liberation— not oppression. Battle […]"/> <meta property="og:image" content="https://www.fightforthefuture.org/share.jpg"/> <!-- Google+ / Schema.org --> <meta itemprop="name" content="Fight for the Future"/> <meta itemprop="headline" content="Fight for the Future"/> <meta itemprop="description" content="Who are we? We are a group of artists, engineers, activists, and technologists who have been behind the largest online protests in human history, channeling Internet outrage into political power to win public interest victories previously thought to be impossible. We fight for a future where technology is a force for liberation— not oppression. Battle […]"/> <meta itemprop="image" content="https://www.fightforthefuture.org/share.jpg"/> <meta itemprop="author" content="Fight for the Future"/> <!--<meta itemprop="publisher" content="Fight for the Future"/>--> <!-- To solve: The attribute publisher.itemtype has an invalid value --> <!-- Twitter Cards --> <meta name="twitter:title" content="Fight for the Future"/> <meta name="twitter:url" content="https://www.fightforthefuture.org/"/> <meta name="twitter:description" content="Who are we? We are a group of artists, engineers, activists, and technologists who have been behind the largest online protests in human history, channeling Internet outrage into political power to win public interest victories previously thought to be impossible. We fight for a future where technology is a force for liberation— not oppression. Battle […]"/> <meta name="twitter:image" content="https://www.fightforthefuture.org/share.jpg"/> <meta name="twitter:card" content="summary_large_image"/> <meta name="twitter:site" content="@FightForTheFtr"/> </head> <body class="home page-template-default page page-id-7803 page-home"> <input type="checkbox" id="site-nav-menu-toggle" class="d-none" accesskey="m"> <header id="site-header" class="sticky-top hide-minimal"> <div class="fundraiser-bar border-bottom-rainbow py-3 w-100 bg-white text-center"> <div class="container d-flex justify-content-center align-items-center flex-column flex-md-row text-black"> <strong> Hold politicians to account? We got you. Power our hard-hitting campaigns? You got us. </strong> <a href="/donate?frequency=monthly" class="py-2 px-4 ms-3 fw-bold mt-2 mt-md-0 text-black link-underline" style="background-color: #C9D90D"> Donate Now </a> </div> </div> <div class="container"> <div class="d-flex justify-content-between align-items-center py-2 py-md-3 bg-black"> <a class="logo" href="/"> <img src="/wp-content/themes/fight/images/homepage/logo-fftf.svg" alt="Fight for the Future" style="max-height:30px"> </a> <div class="d-flex align-items-center"> <a class="h6 text-uppercase m-0 d-none d-md-block link-underline-hover-white py-1" href="/donate?frequency=monthly">Donate</a> <label for="site-nav-menu-toggle" class="ms-4 hamburgler" title="Toggle menu (alt+shift+m on Windows or Linux, ctrl+option+m on Mac)"> <div class="hamburger-menu"> <span class="visually-hidden">Toggle Site Navigation Menu</span> </div> </label> </div> </div> </div> <nav class="site-header-nav p-3 pt-md-5 mt-md-3"> <div class="container"> <div class="row"> <div class="col-md-4 pt-5 ps-md-4 hover-image"> <h4 class="mt-2 mt-md-4"><a href="/about">About Us</a></h4> <ul class="list-unstyled mb-0"> <li><a href="/about/team">Our Team</a></li> <li><a href="/about/timeline">Timeline</a></li> <li><a href="/playbook">Playbook</a></li> <li><a href="/about/jobs">Jobs</a></li> <li><a href="https://touchgrass.fightforthefuture.org" target="_blank">Newsletter</a></li> </ul> </div> <div class="col-md-4 pt-md-5 ps-md-4 hover-image"> <h4 class="mt-4"><a href="/projects">Projects</a></h4> <h4 class="mt-5"><a href="/news">News</a></h4> </div> <div class="col-md-4 pt-md-5 ps-md-4 hover-image"> <h4 class="mt-4"><a href="/contact">Contact</a></h4> <h4 class="mt-5"><a href="/donate">Donate</a></h4> <ul class="list-unstyled mb-0"> <li><a href="/donate/supporters">Supporters</a></li> <li><a href="https://shop.fightforthefuture.org">Shop</a></li> <li><a href="/donate/planned-giving">Planned Giving</a></li> <li><a href="/donate/stocks">Stocks</a></li> </ul> </div> </div> </div> </nav> </header> <header class="hide-maximal"> <div class="container"> <div class="row ps-md-3"> <div> <img src="/wp-content/themes/fight/images/homepage/logo-dark-fftf.svg" alt="Fight for the Future" style="max-height:30px"> </div> </div> </div> </header> <main id="primary" class="bg-light"> <article id="post-7803" class="post-7803 page type-page status-publish hentry"> <div class="video-header fixed"> <video autoplay loop muted playsinline poster="/wp-content/themes/fight/images/homepage/video-bg-poster-late-2022.jpg" src="/wp-content/themes/fight/videos/homepage/video-header.mp4"></video> </div> <section id="intro" class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"><h1 class="fight-for-animation"> Fight for <span class="d-block word text-nowrap"> THE FUTURE</span> </h1> <script type="module"> const words = ["INTERNET FREEDOM"," FREE EXPRESSION"," ONLINE PRIVACY"," NET NEUTRALITY"," CREATIVITY"," LIBERTY"," OUR FAMILIES"," HUMAN RIGHTS"," THE CONSTITUTION"," RACIAL JUSTICE"," TRANSPARENCY"," CIVIL RIGHTS"," THE TRUTH"," REAL CHANGE"," BETTER POLICY"," UNITY"," EVERYONE'S VOICE"," FREE THOUGHT"," OUR CHILDREN"," FREE SOFTWARE"," UNITY"," WHISTLEBLOWERS"," SOCIAL JUSTICE"," INNOVATION"," ACCESS"," ENCRYPTION"," DEMOCRACY"," THE PLANET"," DECENTRALIZATION"," COMPASSION"," WORKING PEOPLE"," A BETTER WEB"," UNDERSTANDING"," THE FUTURE"]; const el = document.querySelector('.fight-for-animation .word') let time = 1000 function changeWord() { if (words.length > 0) { // update the word el.textContent = words.shift() // decrease the timeout if (time > 100) { time = time * 0.8 } setTimeout(changeWord, time) } } document.addEventListener('DOMContentLoaded',changeWord) </script> <h6 class="wp-block-heading ff-sans text-uppercase fw-normal">Who are we?</h6> <p class="col-md-9 fs-3 fw-bold">We are a group of artists, engineers, activists, and technologists who have been behind the largest online protests in human history, channeling Internet outrage into political power to win public interest victories previously thought to be impossible. We fight for a future where technology is a force for liberation— not oppression. <img decoding="async" width="36" height="36" class="wp-image-8850" style="width: 36px;" src="https://www.fightforthefuture.org/wp-content/uploads/2024/02/rainbow-fist.png" alt="✊"></p> <div class="wp-block-buttons col-md-7 mt-5 is-layout-flex wp-block-buttons-is-layout-flex"> <div class="wp-block-button has-custom-width wp-block-button__width-100 has-custom-font-size btn-arrow-right btn-white has-large-font-size"><a class="wp-block-button__link wp-element-button" href="/join/">Join the Fight</a></div> </div> </div></section> <section id="projects" class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <div class="wp-block-group col-md-7"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <h2 class="wp-block-heading border-bottom-rainbow">Battle lines are drawn</h2> <p class="mb-5">Technology has the power to transform our society, upend injustice, and hold powerful people and institutions accountable. But it can also be used to silence the marginalized, automate oppression, and trample our basic rights. This is the battleground we fight on: to defend technology as a force for liberation, not tyranny.</p> </div></div> <header class="wp-block-group is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-3 wp-block-group-is-layout-flex"> <h5 class="wp-block-heading">Recent Projects</h5> <p><a href="/about/timeline">View a timeline of our projects →</a></p> </header> <div class="featured-projects row g-4"> <div class="col-md-8"> <a href="https://www.makedmssafe.com/" target="_blank" class="project hover-scale ratio ratio-1x1 d-block text-white text-decoration-none" style="background-image:url(https://airtable-attachments.fightforthefuture.org/attOxYrr62TMLXar7.gif"> <div class="p-4 p-md-5 d-flex flex-column justify-content-between"> <h4 class="h2">Make DMs Safe</h4> <div> <p>In an increasingly dangerous world, there’s one simple thing every messaging platform must do right now: make our messages safe using end-to-end encryption.</p> <span class="fw-bold text-decoration-underline text-uppercase">View Project</span> </div> </div> </a> </div> <div class="col-md-4"> <a href="https://stoponlineidchecks.org" target="_blank" class="project hover-scale ratio ratio-1x1 d-block text-white text-decoration-none mb-4" style="background-image:url(https://airtable-attachments.fightforthefuture.org/attkzfT17yZeWzdfp.png"> <div class="p-4 d-flex flex-column justify-content-between"> <h4 class="h3 ff-headings text-uppercase">Stop Online ID Checks</h4> <span class="fw-bold text-decoration-underline text-uppercase">View Project</span> </div> </a> <a href="https://www.banfacialrecognition.com/" target="_blank" class="project hover-scale ratio ratio-1x1 d-block text-white text-decoration-none" style="background-image:url(https://airtable-attachments.fightforthefuture.org/atthiMi4oWag2UGPl.jpg"> <div class="p-4 d-flex flex-column justify-content-between"> <h4 class="h3 ff-headings text-uppercase">Ban Facial Recognition</h4> <span class="fw-bold text-decoration-underline text-uppercase">View Project</span> </div> </a> </div> </div> <div class="wp-block-buttons col-md-7 offset-md-5 mt-3 mt-md-4 is-layout-flex wp-block-buttons-is-layout-flex"> <div class="wp-block-button has-custom-width wp-block-button__width-100 has-custom-font-size btn-arrow-right has-large-font-size"><a class="wp-block-button__link wp-element-button" href="/projects/">View all</a></div> </div> </div></section> <section id="donate" class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <div class="wp-block-columns my-md-5 is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex"> <div class="wp-block-column d-md-flex justify-content-between flex-column ps-md-5 is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:45%"> <h2 class="wp-block-heading">Donate</h2> <p>We rely on donations from everyday people just like you to fund our strategic activism. Please make a recurring donation to our organization so we can continue to fight for your digital rights.</p> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:55%"> <div class="wp-block-fight-donation-form bg-white p-4 border-top-rainbow"> <noscript> <h3 class="ff-headings">⛔ JavaScript is turned off</h3> <p>Unfortunately, JavaScript is required to pay by credit card. If you'd still like to donate, turn it on and refresh the page.</p> <p>Alternatively, you can Paypal us at <b>fftfinaction@gmail.com</b> or Venmo <a href="https://account.venmo.com/u/fightforthefuture" target="_blank">@fightforthefuture</a>.</p> </noscript> <div class="cf-turnstile" data-sitekey="0x4AAAAAAASzeGQ7Jpbjs1Yu" data-callback="handleTurnstileSuccess" data-error-callback="handleTurnstileError"></div> <div id="donate-app" v-cloak> <!-- Step nav --> <ol class="step-nav d-flex gap-3 px-0" v-if="!isMembership && currentStep > 1"> <li class="flex-fill" v-bind:class="{ active: currentStep == 1, completed: currentStep > 1 }"> <a @click.prevent="changeCardAmount" v-bind:disabled="hasSubmitted || !amount"> <span class="icon" v-if="currentStep > 1">✓</span> <span class="icon" v-else="v-else">1</span> <span> Amount <span v-if="amount"> (${{ amount }})</span> </span> </a> </li> <li class="flex-fill" v-bind:class="{ 'active': currentStep == 2, completed: currentStep > 2 }"> <div> <span class="icon" v-if="currentStep > 2">✓</span> <span class="icon" v-else="v-else">2</span> <span>Payment</span> </div> </li> <li class="flex-fill" v-bind:class="{ 'active': currentStep == 3, completed: currentStep > 2 }"> <div> <span class="icon" v-if="currentStep >= 3">✓</span> <span class="icon" v-else="v-else">3</span> <span>Details</span> </div> </li> </ol> <div v-show="!hasSubmitted"> <!-- Step 1 --> <div v-if="currentStep === 1" key="donate-step-1" class="step1"> <strong class="fs-4 my-4">Choose the amount of your gift:</strong> <form class="amount-form" @submit.prevent="submitPayWithCard()"> <div class="row amounts g-3"> <div class="col-6 col-sm-3" v-for="option in config.amounts" v-bind:key="`donate-${option}`"> <input class="visually-hidden" type="radio" v-bind:id="`option-${option}`" v-bind:value="option" v-model="amount" /> <label class="border border-black d-block text-center py-2 fw-bold" v-bind:for="`option-${option}`">${{ option }}</label> </div> <div class="col-6 col-sm-3 mb-3"> <div class="border border-black"> <label class="d-flex justify-content-center align-items-center"> <span class="ps-4 ps-md-1 ps-xl-3 text-muted">$</span> <input class="form-control border-0 m-0 py-2" type="number" v-model="amount" min="1" /> </label> </div> </div> </div> <!-- Frequency selector (monthly/one-time) --> <div class="my-3 mb-5" v-if="!isMembership && canRecur && !isHomePage"> <small class="d-block mb-2 fw-bold"> Make it monthly! </small> <div class="row g-3"> <div class="col-6"> <input id="is-recurring" type="radio" v-model="isRecurring" v-bind:value="true" class="visually-hidden" /> <label class="border border-black d-block py-3 text-center fw-bold fs-6" for="is-recurring"> Yes, count me in! </label> </div> <div class="col-6"> <input id="not-recurring" type="radio" v-model="isRecurring" v-bind:value="false" class="visually-hidden" /> <label class="border border-black d-block py-3 text-center fw-bold fs-6" for="not-recurring"> No, donate once </label> </div> </div> </div> <!-- Incentive selection --> <div v-if="filteredIncentives.length && !hasSubmitted && shouldShowIncentives" id="choose-donation-incentive"> <strong class="choose-text fs-4 my-4">Choose Your Thank You Gift:</strong> <div class="donation-incentives"> <div class="incentive" v-for="incentive in filteredIncentives" :key="incentive.id" @click="chooseIncentive(incentive)" :class="incentiveClass(incentive)"> <div @mouseover="hoverImage = incentive.id" @mouseleave="hoverImage = null"> <div :ref="`incentive-hover-${incentive.id}`" class="hover-image" v-if="hoverImage == incentive.id"> <img :src="incentive.image" :alt="incentive.name" /> </div> <img :src="incentive.image" :alt="incentive.name" /> <div class="requirements" v-if="!isEligibleForIncentive(incentive)"> <span class="required-amount">Donate ${{incentive.minimum_donation}} </span> <span>or more to choose this gift</span> </div> </div> <p>{{ incentive.name }}</p> </div> <div class="incentive opt-out p-3 p-md-0 d-flex align-items-center" :class="selectedIncentive == null ? 'selected' : ''" @click="toggleOptOut()"> <p>No thanks, I don't want a gift</p> </div> </div> </div> <!-- Shipping information --> <div class="mt-3" v-if="hasShippingFields"> <p class="small"> <strong>Shipping address for free gift</strong> (leave blank if you don't want a gift): </p> <div class="row"> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="First Name" v-model="shipping.first_name" /> </div> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="Last Name" v-model="shipping.last_name" /> </div> </div> <div class="row"> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="Street Address" v-model="shipping.address1" /> </div> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="Apt/Unit #" v-model="shipping.address2" /> </div> </div> <div class="row"> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="City" v-model="shipping.city" /> </div> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="State" v-model="shipping.province" /> </div> <div class="col-sm-6 mb-3"> <input class="form-control" type="text" placeholder="ZIP Code" v-model="shipping.zip" /> </div> <div class="col-sm-6 mb-3" v-if="selectedIncentive && selectedIncentive.requires_size"> <select class="form-select" v-model="shipping.shirt_size"> <option value="" disabled="disabled" selected="selected">Select Size</option> <option v-for="size of shirtSizes" v-bind:value="size" v-bind:key="size">{{ size }}</option> </select> </div> </div> <div class="row"> <div class="col mb-3"> <select class="form-select" v-model="shipping.country"> <option v-for="(name, code) of countries" v-bind:value="code" v-bind:key="code">{{ name }}</option> </select> </div> </div> </div> <!-- /hasShippingFields --> <!-- Submit button --> <div class="d-grid"> <button class="btn btn-arrow btn-arrow-right btn-lg lh-1"> <span v-if="!isHomePage">Pay with Card</span> <span v-else="v-else">Continue</span> </button> <small class="d-block mb-2"></small> </div> </form> <!-- Alternative payment methods --> <div class="my-3" v-if="!isHomePage"> <b class="d-block mb-1">Or make a payment with:</b> <div class="d-md-flex d-grid gap-2"> <a class="btn btn-paypal flex-fill d-inline-flex justify-content-center align-items-center" href="#" @click.prevent="submitPaypalForm()"><img decoding="async" src="/wp-content/themes/fight/images/homepage/paypal-logo.png" alt="PayPal"/></a> <div class="flex-fill" v-if="canUsePaymentRequestButton" ref="paymentRequestBtn"> </div> <form class="d-none" ref="paypalOneTime" action="https://www.paypal.com/cgi-bin/webscr" method="post"> <input type="hidden" name="business" :value="config.paypalEmail" /> <input type="hidden" name="cmd" value="_donations" /> <input type="hidden" name="item_name" :value="config.description" /> <input type="hidden" name="item_number" v-bind:value="paypalItemNumber" /> <input type="hidden" name="currency_code" value="USD" /> <input type="hidden" name="amount" v-bind:value="amount" /> <input type="hidden" name="no_shipping" value="1" /> <img decoding="async" alt="" border="0" width="1" height="1" src="https://www.paypal.com/en_US/i/scr/pixel.gif" /> <input type="hidden" name="return" v-bind:value="paypalReturnUrl" /> </form> <form class="d-none" ref="paypalRecurring" name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="post"> <input type="hidden" name="cmd" value="_xclick-subscriptions" /> <input type="hidden" name="business" :value="config.paypalEmail" /> <input type="hidden" name="item_name" :value="config.description" /> <input type="hidden" name="return" v-bind:value="paypalReturnUrl" /> <input type="hidden" name="item_number" v-bind:value="paypalItemNumber" /><input type="hidden" name="currency_code" value="USD" /> <input type="hidden" name="no_shipping" value="1" /> <input v-if="isConverted" type="hidden" name="a1" value="0" /> <input v-if="isConverted" type="hidden" name="p1" v-bind:value="trial_period_days" /> <input v-if="isConverted" type="hidden" name="t1" value="D" /> <input type="hidden" name="a3" v-bind:value="amount" /><input type="hidden" name="p3" value="1" /> <input type="hidden" name="t3" value="M" /><input type="hidden" name="src" value="1" /> <input type="hidden" name="sra" value="1" /> </form> </div> </div> </div> <!-- Step 2 --> <div v-else-if="currentStep >= 2" key="donate-step-2"> <div class="clearfix" v-if="!isMembership"> <h4 class="float-start" @click.prevent="changeCardAmount"> ${{ amount }}<span v-if="isRecurring">/month</span> </h4> <a class="float-end" href="#none" @click.prevent="changeCardAmount"> <img decoding="async" class="d-inline-block me-1" src="/wp-content/themes/fight/images/homepage/edit-icon.svg" alt="" aria-hidden="true"/> <small>Change amount</small> </a> </div> <small class="d-block mb-2 fw-bold"> Pay with credit card: </small> <p class="text-danger fw-bold" v-if="errorMessage"> {{ errorMessage }} </p> <form class="mb-5" v-show="!turnstileFailed" @submit.prevent="submitStripeForm()"> <div class="row g-2"> <div class="col-sm-6 mb-3"> <input class="form-control border-black" v-model="name" type="text" placeholder="Name" /> </div> <div class="col-sm-6 mb-3"> <input class="form-control border-black" v-model="email" type="email" placeholder="Email*" required="required" /> </div> </div> <div class="stripe-cc-form border border-black p-3 mb-3" ref="card"></div> <div class="d-grid mb-3"> <button class="btn btn-gradient btn-lg lh-1" v-bind:disabled="!turnstileToken || isSending"> <span v-if="!turnstileToken">Loading...</span> <span v-else-if="isSending">Processing...</span> <span v-else-if="confirmationCode">Yes, I want to donate again</span> <span v-else-if="isRecurring">Subscribe</span> <span v-else="v-else">Donate</span> </button> </div> <div class="mb-3 form-check"> <input class="form-check-input" id="is-subscribing" type="checkbox" v-model="isSubscribing" /> <label class="from-check-label fw-bold small" for="is-subscribing"> Yes, I want to receive important campaign emails. </label> </div> </form> </div> </div> <!-- /!hasSubmitted --> <div v-if="hasSubmitted" class="bg-light p-3"> <strong class="fs-4 mb-2"> Thank you for your important donation! </strong> <div v-if="canUpsell && turnstileReady"> <div class="upsell-form my-3 my-md-5" :class="{ 'bg-grey-light': !hasSubmittedUpsell, 'bg-success': hasSubmittedUpsell }"> <div v-if="!hasSubmittedUpsell"> <p class="fs-5 fw-bold"> Your support has never been more important. Can we count on you when it really matters? Will you make this a monthly recurring contribution? </p> <p> By clicking "DONATE" below, you are signing up for a monthly contribution of ${{amount}}. You can cancel any time. </p> <p class="text-warn" v-if="errorMessage"> <strong>{{ errorMessage }}</strong> </p> <div class="d-grid"> <a @click.prevent="startMonthlySubscription()" class="btn" :disabled="isSendingUpsell"> <span v-if="isSendingUpsell">Processing...</span> <span v-else>Donate ${{amount}} monthly</span> </a> </div> </div> <div v-else class="fs-5 fw-bold"> You have made a one-time donation of ${{amount}}, and a recurring monthly donation of ${{amount}}. Your receipt will be emailed to you shortly. </div> </div> </div> <p v-if="isMembership">Will you share this page on social media to encourage others to join the fight?</p> <p v-else>Will you share this page on social media to encourage others to help out?</p> <div class="d-none d-md-flex row row-cols-md-1 g-4"> <!-- Show Twitter + Facebook buttons on desktop --> <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.fightforthefuture.org%2F" target="_blank" class="link-unstyled text-decoration-none fw-bold d-flex align-items-center fs-6"> <img decoding="async" src="/wp-content/themes/fight/images/share-icon-facebook.svg" alt="" aria-hidden="true" class="me-2"> <span>Share to Facebook</span> </a> <a href="https://twitter.com/intent/tweet?text=Help+keep+freedom+of+expression+online+a+right+extended+to+all+people%E2%80%94join+forces+with+%40fightfortheftr+today.&url=https%3A%2F%2Fwww.fightforthefuture.org%2F" target="_blank" class="link-unstyled text-decoration-none fw-bold d-flex align-items-center"> <img decoding="async" src="/wp-content/themes/fight/images/share-icon-x.svg" alt="" aria-hidden="true" class="me-2"> <span>Share to X</span> </a> <a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.fightforthefuture.org%2F" target="_blank" class="link-unstyled text-decoration-none fw-bold d-flex align-items-center"> <img decoding="async" src="/wp-content/themes/fight/images/share-icon-linkedin.svg" alt="" aria-hidden="true" class="me-2"> <span>Share to LinkedIn</span> </a> </div> <!-- Show web share button on mobile --> <div class="d-grid d-md-none mb-2"> <a href="#" class="btn btn-twitter btn-lg text-uppercase" @click.prevent="share()" >Share</a> </div> </div> <!-- /hasSubmitted --> <!-- Tax disclaimer --> <div class="small text-muted mt-4" v-if="config.org == 'fftf'"> <p>Important legal information for donors: in order to run effective grassroots campaigns aimed at Congress, Fight for the Future is a 501(c)4, so donations are not tax deductible as charitable contributions or as business expenses under IRC §162(e). 🙏</p> <p>You can make <a href="https://www.fftfef.org/donate/">tax-deductible</a> donations to <a href="https://www.fftfef.org/">Fight for the Future Education Fund</a>, our sister 501(c)3 organization.</p> </div> <div class="small text-muted mt-4" v-else> <p>Fight for the Future Education Fund is a 501(c)3 nonprofit organization. Donations are tax deductible.</p> </div> </div> <script src="/wp-content/themes/fight/js/vue3.js"></script> <script type="module"> window.CF_TURNSTILE_RESPONSE = null window.CF_TURNSTILE_ERROR = null window.handleTurnstileSuccess = function(token) { window.CF_TURNSTILE_RESPONSE = token } window.handleTurnstileError = function(error) { window.CF_TURNSTILE_ERROR = error } const countries = { "AF":"Afghanistan", "AX":"Aland Islands", "AL":"Albania", "DZ":"Algeria", "AS":"American Samoa", "AD":"Andorra", "AO":"Angola", "AI":"Anguilla", "AQ":"Antarctica", "AG":"Antigua And Barbuda", "AR":"Argentina", "AM":"Armenia", "AW":"Aruba", "AU":"Australia", "AT":"Austria", "AZ":"Azerbaijan", "BS":"Bahamas", "BH":"Bahrain", "BD":"Bangladesh", "BB":"Barbados", "BY":"Belarus", "BE":"Belgium", "BZ":"Belize", "BJ":"Benin", "BM":"Bermuda", "BT":"Bhutan", "BO":"Bolivia", "BA":"Bosnia And Herzegovina", "BW":"Botswana", "BV":"Bouvet Island", "BR":"Brazil", "IO":"British Indian Ocean Territory", "BN":"Brunei Darussalam", "BG":"Bulgaria", "BF":"Burkina Faso", "BI":"Burundi", "KH":"Cambodia", "CM":"Cameroon", "CA":"Canada", "CV":"Cape Verde", "KY":"Cayman Islands", "CF":"Central African Republic", "TD":"Chad", "CL":"Chile", "CN":"China", "CX":"Christmas Island", "CC":"Cocos (Keeling) Islands", "CO":"Colombia", "KM":"Comoros", "CG":"Congo", "CD":"Congo, Democratic Republic", "CK":"Cook Islands", "CR":"Costa Rica", "CI":"Cote D'Ivoire", "HR":"Croatia", "CU":"Cuba", "CY":"Cyprus", "CZ":"Czech Republic", "DK":"Denmark", "DJ":"Djibouti", "DM":"Dominica", "DO":"Dominican Republic", "EC":"Ecuador", "EG":"Egypt", "SV":"El Salvador", "GQ":"Equatorial Guinea", "ER":"Eritrea", "EE":"Estonia", "ET":"Ethiopia", "FK":"Falkland Islands (Malvinas)", "FO":"Faroe Islands", "FJ":"Fiji", "FI":"Finland", "FR":"France", "GF":"French Guiana", "PF":"French Polynesia", "TF":"French Southern Territories", "GA":"Gabon", "GM":"Gambia", "GE":"Georgia", "DE":"Germany", "GH":"Ghana", "GI":"Gibraltar", "GR":"Greece", "GL":"Greenland", "GD":"Grenada", "GP":"Guadeloupe", "GU":"Guam", "GT":"Guatemala", "GG":"Guernsey", "GN":"Guinea", "GW":"Guinea-Bissau", "GY":"Guyana", "HT":"Haiti", "HM":"Heard Island & Mcdonald Islands", "VA":"Holy See (Vatican City State)", "HN":"Honduras", "HK":"Hong Kong", "HU":"Hungary", "IS":"Iceland", "IN":"India", "ID":"Indonesia", "IR":"Iran, Islamic Republic Of", "IQ":"Iraq", "IE":"Ireland", "IM":"Isle Of Man", "IL":"Israel", "IT":"Italy", "JM":"Jamaica", "JP":"Japan", "JE":"Jersey", "JO":"Jordan", "KZ":"Kazakhstan", "KE":"Kenya", "KI":"Kiribati", "KR":"Korea", "KW":"Kuwait", "KG":"Kyrgyzstan", "LA":"Lao People's Democratic Republic", "LV":"Latvia", "LB":"Lebanon", "LS":"Lesotho", "LR":"Liberia", "LY":"Libyan Arab Jamahiriya", "LI":"Liechtenstein", "LT":"Lithuania", "LU":"Luxembourg", "MO":"Macao", "MK":"Macedonia", "MG":"Madagascar", "MW":"Malawi", "MY":"Malaysia", "MV":"Maldives", "ML":"Mali", "MT":"Malta", "MH":"Marshall Islands", "MQ":"Martinique", "MR":"Mauritania", "MU":"Mauritius", "YT":"Mayotte", "MX":"Mexico", "FM":"Micronesia, Federated States Of", "MD":"Moldova", "MC":"Monaco", "MN":"Mongolia", "ME":"Montenegro", "MS":"Montserrat", "MA":"Morocco", "MZ":"Mozambique", "MM":"Myanmar", "NA":"Namibia", "NR":"Nauru", "NP":"Nepal", "NL":"Netherlands", "AN":"Netherlands Antilles", "NC":"New Caledonia", "NZ":"New Zealand", "NI":"Nicaragua", "NE":"Niger", "NG":"Nigeria", "NU":"Niue", "NF":"Norfolk Island", "MP":"Northern Mariana Islands", "NO":"Norway", "OM":"Oman", "PK":"Pakistan", "PW":"Palau", "PS":"Palestinian Territory, Occupied", "PA":"Panama", "PG":"Papua New Guinea", "PY":"Paraguay", "PE":"Peru", "PH":"Philippines", "PN":"Pitcairn", "PL":"Poland", "PT":"Portugal", "PR":"Puerto Rico", "QA":"Qatar", "RE":"Reunion", "RO":"Romania", "RU":"Russian Federation", "RW":"Rwanda", "BL":"Saint Barthelemy", "SH":"Saint Helena", "KN":"Saint Kitts And Nevis", "LC":"Saint Lucia", "MF":"Saint Martin", "PM":"Saint Pierre And Miquelon", "VC":"Saint Vincent And Grenadines", "WS":"Samoa", "SM":"San Marino", "ST":"Sao Tome And Principe", "SA":"Saudi Arabia", "SN":"Senegal", "RS":"Serbia", "SC":"Seychelles", "SL":"Sierra Leone", "SG":"Singapore", "SK":"Slovakia", "SI":"Slovenia", "SB":"Solomon Islands", "SO":"Somalia", "ZA":"South Africa", "GS":"South Georgia And Sandwich Isl.", "ES":"Spain", "LK":"Sri Lanka", "SD":"Sudan", "SR":"Suriname", "SJ":"Svalbard And Jan Mayen", "SZ":"Swaziland", "SE":"Sweden", "CH":"Switzerland", "SY":"Syrian Arab Republic", "TW":"Taiwan", "TJ":"Tajikistan", "TZ":"Tanzania", "TH":"Thailand", "TL":"Timor-Leste", "TG":"Togo", "TK":"Tokelau", "TO":"Tonga", "TT":"Trinidad And Tobago", "TN":"Tunisia", "TR":"Turkey", "TM":"Turkmenistan", "TC":"Turks And Caicos Islands", "TV":"Tuvalu", "UG":"Uganda", "UA":"Ukraine", "AE":"United Arab Emirates", "GB":"United Kingdom", "US":"United States", "UM":"United States Outlying Islands", "UY":"Uruguay", "UZ":"Uzbekistan", "VU":"Vanuatu", "VE":"Venezuela", "VN":"Vietnam", "VG":"Virgin Islands, British", "VI":"Virgin Islands, U.S.", "WF":"Wallis And Futuna", "EH":"Western Sahara", "YE":"Yemen", "ZM":"Zambia", "ZW":"Zimbabwe" } const config = { "amounts": [250, 100, 75, 50, 30, 10, 3], "monthlyAmounts": [3, 5, 10, 15, 20, 25, 30, 35, 50, 75, 85, 100, 250, 500, 1000], "defaultAmount": 30, "description": "Donation to Fight for the Future", "actionNetworkTags": ["donor", "donor-c4"], "defaultTag": "", "paypalEmail": "fftfinaction@gmail.com", "stripePublicKey": "pk_live_EafGxYVfzZHJF4aUSVUJ94e0", "incentiveId": "", "paymentsAPIBaseURL": "https://payments-api.fftf.cat/", "org": "fftf", "isHomePage": true, "defaultRecurring": false} // amount selection should go into the block // this is a temp hack for the matching pool campaign if (location.pathname.match(/mpcmatchingpool2023/)) { config.amounts = [10000, 5000, 3000, 1500, 1000, 750, 500] config.defaultAmount = 1000 } // Create empty Stripe Elements variables let stripe, stripeCard, stripeElements, stripePaymentRequest const app = Vue.createApp({ data() { return { isSending: false, isSendingUpsell: false, hasSubmitted: false, hasSubmittedUpsell: false, errorMessage: null, canUsePaymentRequestButton: true, // form fields email: null, name: null, amount: null, isSubscribing: true, token: null, isRecurring: false, paypalItemNumber: null, confirmationCode: null, trial_period_days: null, isConverted: false, paymentType: null, payWithCard: false, shipping: { first_name: null, last_name: null, address1: null, address2: null, city: null, province: null, zip: null, country: 'US', shirt_size: '' }, incentives: [], selectedIncentive: null, hoverImage: null, // these were props membershipTier: null, isEmbed: false, // CF turnstile turnstileFailed: false, turnstileToken: null, turnstileReady: false } }, computed: { config: () => config, currentStep() { if (this.hasSubmitted) { return 3 } else if (this.payWithCard) { return 2 } else { return 1 } }, isOtherAmountSelected() { return this.amount && !config.amounts.includes(this.amount) }, stripeAmount() { return this.amount * 100 }, canRecur() { return config.monthlyAmounts.includes(parseInt(this.amount, 10)) }, donationTag() { let tag = this.$route.query.tag || config.defaultTag if (this.isMembership) { tag += ',membership' } return tag }, donationFrequency() { return this.isRecurring ? 'monthly' : 'once' }, testName() { return this.$route.query.email_subject ? 'email_subject' : null }, testOption() { const opts = [] if (this.$route.query.email_subject) { opts.push(this.$route.query.email_subject) } return opts.length > 0 ? opts.join('_') : null }, isHomePage() { return config.isHomePage }, isMembership() { return !!this.membershipTier }, canUpsell() { if (this.canRecur && (!this.isRecurring || this.isConverted)) { return true } else { return false } }, paypalReturnUrl() { if (this.isMembership) { return `https://www.fightforthefuture.org/memberships/${this.membershipTier.id}?step=thanks` } else { const domain = config.org === 'fftfef' ? 'fftfef.org' : 'fightforthefuture.org' return `https://www.${domain}/donate${this.isEmbed ? '/embed' : '' }?step=thanks&amount=${this.amount}&frequency=${this.donationFrequency}` } }, incentiveId() { return this.$route.query.incentive || config.incentiveId }, hasShippingFields() { return this.isMembership || this.selectedIncentive }, shirtSizes() { return ['XS','S','M','L','XL','2XL','3XL','4XL'] }, shareUrl() { return this.isEmbed ? this.$route.query.site : null }, countries: () => countries, $route() { return { query: [], } }, sharingURL() { return `https://${location.host}${location.pathname}` }, filteredIncentives() { return this.incentives.filter(incentive => this.isRecurring ? incentive.requires_subscription : !incentive.requires_subscription) }, shouldShowIncentives() { return config.org !='fftfef' } }, watch: { currentStep(step) { if (step === 1) { this.setupLinkPayments() } else if (step === 2) { this.setupStripeCard() } }, amount: function (newVal, oldVal) { if (!this.canRecur) { this.isRecurring = false } if (stripePaymentRequest) { stripePaymentRequest.update({ total: { label: config.description, amount: this.stripeAmount } }) } if (this.selectedIncentive && !this.isEligibleForIncentive(this.selectedIncentive)) { this.selectedIncentive = null } }, isRecurring: function (newVal, oldVal) { if (this.selectedIncentive && !this.isEligibleForIncentive(this.selectedIncentive)) { this.selectedIncentive = null } }, }, created() { this.fetchIncentives() if (this.membershipTier) { this.amount = parseInt(this.membershipTier.amount) this.isRecurring = true } if (config.defaultRecurring) { this.isRecurring = true } }, mounted() { let { step, amount, frequency, an_tags } = this.$route.query // eslint-disable-line camelcase // Set inital amount in the url with `?amount=XX` or use default from config if (amount && parseInt(amount, 10) >= 1) { this.amount = parseInt(amount, 10) } else { this.amount = config.defaultAmount } // Set inital recurring value to once in the url with `?frequency=once` if (frequency && frequency !== 'once') { this.isRecurring = true } // // the step changes need to happen in mounted() instead of created() // to work on the generated site 🤓 // // Show step 2 of the form by setting the temporary amount to the final amount if (step === '2') { this.payWithCard = true } else if (step === 'thanks') { // Show "Thanks" step this.hasSubmitted = true } else { setTimeout(() => { this.setupLinkPayments() }, 1000) } // Add AN tags in this format: `?an_tags=foo,bar,test-1` if (an_tags) { config.actionNetworkTags = [...new Set(config.actionNetworkTags.concat(an_tags.split(',')))].map(s => s.trim()) } setTimeout(this.checkTurnstile, 500) }, methods: { $trackEvent() { // console.log('$trackEvent', arguments) }, checkTurnstile(force=false) { if (!force && this.turnstileToken) { return } if (window.CF_TURNSTILE_RESPONSE && window.CF_TURNSTILE_RESPONSE != this.turnstileToken) { this.turnstileFailed = false this.turnstileToken = window.CF_TURNSTILE_RESPONSE this.turnstileReady = true } else if (window.CF_TURNSTILE_ERROR) { this.turnstileFailed = true this.errorMessage = `🙁 We're very sorry, but our credit card processor is down. Please try donating with Paypal or Venmo instead.` } else { setTimeout(this.checkTurnstile.bind(null,force), 500) } }, async initializeStripe() { if(typeof(Stripe) == 'undefined') { return false } stripe = Stripe(config.stripePublicKey) // Set up Payment Request button for Apple, Google, and Microsoft Pay stripePaymentRequest = stripe.paymentRequest({ country: 'US', currency: 'usd', total: { label: config.description, amount: this.stripeAmount }, requestPayerName: true, requestPayerEmail: true }) // Process payment when token is received stripePaymentRequest.on('token', this.receivePaymentRequestToken) stripeElements = stripe.elements({ fonts: [{ cssSrc: 'https://use.typekit.net/cpr0mjd.css' }] }) return true }, async setupLinkPayments() { if (!(await this.initializeStripe())) { setTimeout(() => { this.setupLinkPayments() }, 100) return } // If the user has Apple/Google Pay, set up the button const paymentMethods = await stripePaymentRequest.canMakePayment() if (paymentMethods) { stripeElements = stripe.elements({ fonts: [{ cssSrc: 'https://use.typekit.net/cpr0mjd.css' }] }) const btn = stripeElements.create('paymentRequestButton', { paymentRequest: stripePaymentRequest, style: { paymentRequestButton: { type: 'donate', // 'default' | 'donate' | 'buy', // default: 'default' theme: 'light-outline', // 'dark' | 'light' | 'light-outline', // default: 'dark' height: '60px' // default: '40px', the width is always '100%' } } }) btn.mount(this.$refs.paymentRequestBtn) } else { this.canUsePaymentRequestButton = false } }, async setupStripeCard() { if (!(await this.initializeStripe())) { setTimeout(() => { this.setupStripeCard() }, 100) return } if (!this.$refs.card) { // re-run this if it hasn't fully loaded if (this.currentStep === 2) { setTimeout(() => { this.setupStripeCard() }, 100) } return } let fontSize = '21px' // adjust font size for small screen if (window.innerWidth < 400) { fontSize = '18px' } const formStyle = { base: { color: '#495057', fontSize: fontSize, fontFamily: "'neue-haas-grotesk-display', 'Helvetica Neue', Helvetica, Arial, sans-serif", '::placeholder': { color: '#6c757d' }, fontWeight: 'bold', // ':focus': { // borderColor: '#af8ffa', // boxShadow: '0 0 0 0.25rem rgba(95, 30, 244, 0.25)' // } }, invalid: { color: '#dc3545', ':focus': { color: '#100E13' } } } // Create and mount a new Stripe CC form stripeCard = stripeElements.create('card', { style: formStyle }) stripeCard.mount(this.$refs.card) stripeCard.on('focus', event => { this.$refs.card.classList.add('focus') }) stripeCard.on('blur', event => { this.$refs.card.classList.remove('focus') }) }, submitPayWithCard() { if (this.isHomePage) { location.href = `/donate/?amount=${this.amount}&frequency=monthly` } else { this.payWithCard = true } }, changeCardAmount() { this.payWithCard = false }, async receivePaymentRequestToken(event) { this.email = event.payerEmail this.name = event.payerName try { await this.createStripeCharge(event.token) event.complete('success') this.$trackEvent('stripe_payment_request_button', 'success', this.stripeAmount) } catch (error) { this.errorMessage = `${error.message} 🙁` event.complete('fail') } }, async submitStripeForm() { this.isSending = true this.errorMessage = null this.$trackEvent('stripe_donation_form', 'submit') try { const { token, error } = await stripe.createToken(stripeCard) if (error) { throw new Error(error.message) } await this.createStripeCharge(token) } catch (error) { const emoji = error.message.match(/\?$/) ? '🤔' : '🙁' this.errorMessage = `${error.message} ${emoji}` } this.isSending = false }, async createStripeCharge(token) { this.paymentType = 'stripe' let data = { ok: false } try { const response = await fetch(`${config.paymentsAPIBaseURL}stripe`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ org: config.org, amount: this.stripeAmount, token: token.id, email: this.email, name: this.name ? this.name : '', receive_emails: this.isSubscribing, description: config.description, action_network_tags: config.actionNetworkTags, donation_tag: this.donationTag, frequency: this.donationFrequency, test_name: this.testName, test_option: this.testOption, confirmation_code: this.confirmationCode, turnstile_token: this.turnstileToken, trial_period_days: this.trial_period_days, // skip incentive if shipping info is blank incentive_id: this.shipping.first_name && this.selectedIncentive ? this.selectedIncentive.id : null, shipping_address: this.$data.shipping, membership: this.isMembership }) }) data = await response.json() } catch (error) { console.error(error) } if (!data.ok) { let errorMessage = "Couldn't connect to payment processor" if (data.error) { errorMessage = data.error } if (data.confirmation_code) { this.confirmationCode = data.confirmation_code } throw new Error(errorMessage) } this.hasSubmitted = true this.confirmationCode = null this.turnstileReady = false // get a new turnstile token try { window.turnstile.reset() } catch (error) { console.error(error) } this.checkTurnstile(true) }, async createPendingPaypalDonation() { this.paymentType = 'paypal' const response = await fetch(`${config.paymentsAPIBaseURL}paypal`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ amount: this.amount, name: this.name, donation_tag: this.donationTag, frequency: this.donationFrequency, test_name: this.testName, test_option: this.testOption, org: config.org, trial_period_days: this.trial_period_days, // skip incentive if shipping info is blank incentive_id: this.shipping.first_name && this.selectedIncentive ? this.selectedIncentive.id : null, shipping_address: this.$data.shipping, membership: this.isMembership }) }) const data = await response.json() return data }, async submitPaypalForm() { this.isSending = true const ref = this.isRecurring ? 'paypalRecurring' : 'paypalOneTime' this.$trackEvent(`${ref}_form`, 'submit') try { const { id } = await this.createPendingPaypalDonation() this.paypalItemNumber = id // wait for item_number to be populated this.$nextTick(() => { this.$refs[ref].submit() }) } catch (error) { // ignore error and continue with donation this.$refs[ref].submit() } }, setupConvertToRecurring() { this.isRecurring = true this.trial_period_days = 30 this.isConverted = true }, async convertToRecurringStripe() { this.setupConvertToRecurring() await this.submitStripeForm() // if payment api blocked double request, // submit again with confirmation code if (this.confirmationCode) { await this.submitStripeForm() } }, async convertToRecurringPaypal() { this.setupConvertToRecurring() await this.submitPaypalForm() }, async share() { const title = getMetaContent('og:title') || document.title const text = getMetaContent('og:description') const url = getMetaContent('og:url') || location.href try { await navigator.share({ title, text, url }) } catch (error) { // } }, async fetchIncentives() { const response = await fetch('https://www.fightforthefuture.org/api/donation_incentives') const data = await response.json() this.incentives = data.filter(i => i.show_on_donate_form).map(i => { i.minimum_donation = parseInt(i.minimum_donation) return i }) if (this.incentiveId) { this.chooseIncentive(this.incentives.find(i => parseInt(i.id) == parseInt(this.incentiveId)) || null) } }, incentiveClass(incentive) { return { 'selected': this.selectedIncentive && this.selectedIncentive.id == incentive.id, 'unavailable': !this.isEligibleForIncentive(incentive) } }, chooseIncentive(incentive) { const hover = incentive ? this.$refs[`incentive-hover-${incentive.id}`] : null if (this.selectedIncentive && incentive && this.selectedIncentive.id == incentive.id && hover) { hover[0]?.classList.toggle('d-block') } else { this.selectedIncentive = incentive if (incentive && !this.isEligibleForIncentive(incentive)) { if (this.amount < incentive.minimum_donation) { this.amount = incentive.minimum_donation } if (incentive.requires_subscription && !this.isRecurring) { this.isRecurring = true } } if (hover) { hover[0]?.classList.remove('d-block') } } }, toggleOptOut() { if (this.selectedIncentive) { this.chooseIncentive(null) } else { const eligibleIncentive = this.filteredIncentives.find(incentive => this.isEligibleForIncentive(incentive)) if (eligibleIncentive) { this.chooseIncentive(eligibleIncentive) } else { this.chooseIncentive(this.filteredIncentives[0]) } } }, isEligibleForIncentive(incentive) { return ( // there is an incentive incentive // the donation is recurring or doesn't need to be && ( (this.isRecurring && incentive.requires_subscription) || !(this.isRecurring || incentive.requires_subscription) ) // the amount is valid && this.amount >= incentive.minimum_donation ) }, async startMonthlySubscription() { if (this.isSendingUpsell) return this.isSendingUpsell = true this.errorMessage = null try { await this.paymentType === 'stripe' ? this.convertToRecurringStripe() : this.convertToRecurringPaypal() } catch (error) { const emoji = error.message.match(/\?$/) ? '🤔' : '🙁' this.errorMessage = `${error.message} ${emoji}` } this.hasSubmittedUpsell = true this.isSendingUpsell = false } } }).mount('#donate-app') </script> </div> </div> </div> </div></section> <section id="store" class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <h2 class="wp-block-heading">Sustain the Fight<br>Rep the Fight</h2> <div class="shopify-products row mb-3 mb-md-4"> <div class="col-lg-10"> <div class="row g-3"> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/resist-surveillance-hoodie" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/IMG_1725_685d13f5-808e-4861-915c-71e2b850dfa3_600x.jpg?v=1728507633" alt="Resist Surveillance Squirrel Hoodie"> <div class="price p-2">$44</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/hex-big-tech-soy-wax-candle" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/glass-jar-soy-wax-candle-white-front-6570baa08de6e_600x.jpg?v=1701886632" alt="Hex Big Tech Soy Wax Candle"> <div class="price p-2">$20</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/holographic-stickers" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/IMG_1782_600x.jpg?v=1728507197" alt="Hex Big Tech Holographic Sticker"> <div class="price p-2">$8</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/resist-surveillance-unisex-garment-dyed-heavyweight-t-shirt" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/unisex-garment-dyed-heavyweight-t-shirt-black-left-front-655e41bcaa7be_600x.jpg?v=1700678258" alt="Resist Surveillance Squirrel Unisex T-Shirt"> <div class="price p-2">$36</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/brain-data-not-for-sale-waffle-beanie" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/waffle-beanie-black-front-6570b6c33f4e8_600x.jpg?v=1701885644" alt="Brain Data Not for Sale Waffle Beanie"> <div class="price p-2">$23</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/the-only-cookies-i-accept-unisex-garment-dyed-heavyweight-t-shirt" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/unisex-garment-dyed-heavyweight-t-shirt-black-front-655e41f0404a4_600x.jpg?v=1700676090" alt=""These Are The Only Cookies I Accept" Unisex T-Shirt"> <div class="price p-2">$36</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/ted-cruzs-tears-mug" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/white-glossy-mug-white-11-oz-front-view-655e41215c836_600x.jpg?v=1700675880" alt="Ted Cruz's Tears Mug"> <div class="price p-2">$16</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/privacy-is-a-human-right-t-shirt" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/unisex-garment-dyed-heavyweight-t-shirt-black-front-65f365c9022f3_600x.jpg?v=1710450129" alt="Privacy is a Human Right T-Shirt"> <div class="price p-2">$32</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/spiral-notebook-fftf" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/spiral-notebook-white-front-6570b6676aac5_600x.jpg?v=1701885552" alt="Making Politicians Cry Notebook"> <div class="price p-2">$20</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/holographic-stickers-1" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/kiss-cut-holographic-stickers-grey-3x3-front-6570b848dc6e2_600x.jpg?v=1701886030" alt="Resist Surveillance Holographic Sticker"> <div class="price p-2">$8</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/puzzle-encryption-game-wrapping-paper-sheets" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/wrapping-paper-sheets-_3_-white-matte-28.75x19.75-front-655e4231ee0d4_600x.jpg?v=1700676159" alt="Puzzle Encryption Game Wrapping Paper Sheets"> <div class="price p-2">$12</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/big-tech-tears-mug" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/white-glossy-mug-white-11-oz-handle-on-right-655e414040b24_600x.jpg?v=1700675911" alt="Big Tech Tears Mug"> <div class="price p-2">$16</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/balance-tote-bag" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/IMG_1745_600x.jpg?v=1728507079" alt=""It All Rests on Digital Rights" Tote Bag"> <div class="price p-2">$22.50</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/cuffed-beanie" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/products/mockup-1b5af85c_600x.jpg?v=1606161871" alt="FFTF Beanie"> <div class="price p-2">$20</div> </a> </div> <div class="col-6 col-sm-4"> <a class="shopify-product hover-scale" href="https://shop.fightforthefuture.org/products/balance-tough-case-for-iphone" target="_blank"> <img decoding="async" src="https://shop.fightforthefuture.org/cdn/shop/files/tough-case-for-iphone-matte-iphone-15-pro-max-front-6570c3fbecef8_600x.jpg?v=1701889033" alt=""It All Rests on Digital Rights" Phone Case"> <div class="price p-2">$22</div> </a> </div> </div> </div> </div> <div class="wp-block-buttons col-md-7 is-layout-flex wp-block-buttons-is-layout-flex"> <div class="wp-block-button has-custom-width wp-block-button__width-100 has-custom-font-size btn-arrow-right has-large-font-size"><a class="wp-block-button__link wp-element-button" href="https://shop.fightforthefuture.org/">Visit Shop</a></div> </div> </div></section> </article> </main> <footer id="page-footer" class="bg-black text-muted position-relative border-top-rainbow" > <div class="bg-dark hide-minimal"> <div class="container"> <div class="d-md-flex flex-md-row align-items-start py-3 py-md-5"> <div class="col-md-8 d-md-flex flex-md-row justify-content-between border-end border-grey-medium" > <ul class="list-unstyled col-xl flex-fill mb-0"> <li class="hover-arrow"> <a href="/privacy" class="">Privacy Policy</a ><span class="arrow"></span> </li> <li class="hover-arrow"> <a href="/subscription" class="">Email/SMS Subscription</a ><span class="arrow"></span> </li> <li class="hover-arrow"> <a href="https://drive.google.com/drive/u/1/folders/0Bz22uTps2Ng3fjNIR3E3Mi1IQzQzSFF1V3VlemFpUlk3eEZfUlRlWDZ0MjBlcDZCMjVVTmc" target="_blank" >Financial Statements</a ><span class="arrow"></span> </li> </ul> <ul class="list-unstyled col-xl flex-fill mb-0"> <li class="hover-arrow"> <a href="/contact" class="">Contact</a><span class="arrow"></span> </li> <li class="hover-arrow"> <a href="/about/jobs" class="">Jobs</a><span class="arrow"></span> </li> <li class="hover-arrow"> <a href="https://shop.fightforthefuture.org" target="_blank" >Shop</a ><span class="arrow"></span> </li> </ul> <ul class="list-unstyled col-xl flex-fill"> <li class="hover-arrow"> <a href="/donate/supporters" class="">Supporters</a ><span class="arrow"></span> </li> <li class="hover-arrow"> <a href="https://touchgrass.fightforthefuture.org" target="_blank" >Newsletter</a ><span class="arrow"></span> </li> <li class="hover-arrow"> <a href="/signal" >Signal Group</a ><span class="arrow"></span> </li> </ul> </div> <div class="col-md-4 social-links small"> <hr class="d-block d-md-none border-grey-medium" /> <div class="row row-cols-md-2 mx-md-4"> <ul class="list-unstyled mb-0"> <li> <a href="https://bsky.app/profile/fightforthefuture.org" target="_blank" ><img src="/wp-content/themes/fight/images/homepage/logo-bluesky.svg" style="padding:3px" aria-hidden="" />Bluesky</a > </li> <li> <a href="https://www.instagram.com/fightfortheftr/" target="_blank" ><img src="/wp-content/themes/fight/images/homepage/logo-instagram.png" aria-hidden="" />Instagram</a > </li> <li> <a rel="me" href="https://mastodon.fightforthefuture.org/@fight" target="_blank" ><img src="/wp-content/themes/fight/images/homepage/logo-mastodon.svg" aria-hidden="" style="padding:2px;margin-right:1px;" />Mastodon</a > </li> </ul> <ul class="list-unstyled"> <li> <a href="https://www.tiktok.com/@fightfortheftr" target="_blank" ><img src="/wp-content/themes/fight/images/homepage/logo-tiktok.svg" aria-hidden="" style="padding:2px" />TikTok</a > </li> <li> <a href="https://twitter.com/fightfortheftr" target="_blank" ><img src="/wp-content/themes/fight/images/homepage/logo-twitter.svg" aria-hidden="" />Twitter</a > </li> <li> <a href="https://www.youtube.com/channel/UC8QlojxJEilcCFExqn4qc2A" target="_blank" ><img src="/wp-content/themes/fight/images/homepage/logo-youtube.svg" aria-hidden="" />YouTube</a > </li> </ul> </div> </div> </div> </div> </div> <div class="container small"> <div class="d-md-flex flex-md-row align-items-start py-3 py-md-5 text-alt"> <div class="mb-4 mb-lg-0 flex-fill"> <a href="/"><img src="/wp-content/themes/fight/images/homepage/logo-fftf.svg" alt="Fight for the Future logo" class="logo" /></a> </div> <div class="flex-fill px-md-3 hide-minimal"> <p class="mb-lg-0"> For press inquiries, please contact us at:<br /> <a href="tel://5084745248">(508) 474-5248</a> or <a href="mailto:press@fightforthefuture.org" >press@fightforthefuture.org</a > </p> </div> <div class="flex-fill pr-md-3"> <p class="mb-lg-0"> For donation information, please email:<br /> <a href="mailto:donor@fightforthefuture.org" >donor@fightforthefuture.org</a > </p> </div> <div class="flex-fill pr-md-3 hide-minimal"> <p class="mb-lg-0"> All other inquiries, contact:<br /> <a href="mailto:team@fightforthefuture.org" >team@fightforthefuture.org</a > </p> </div> <div class="flex-fill pr-md-3 hide-minimal"> <p class="mb-lg-0">No copyright intended!</p> </div> </div> </div> </footer> <!-- Fathom Analytics --> <script src="https://cdn.usefathom.com/script.js" data-site="MMOKRMHZ" defer></script> </body> </html>