From c6ff9156c61d9fa79c6e2e56fa85f0cb80981150 Mon Sep 17 00:00:00 2001 From: scottmakestech <83726258+scottmakestech@users.noreply.github.com> Date: Fri, 5 Jun 2026 11:29:08 -0500 Subject: [PATCH 1/5] Prepare 2026 Donation Campaign page --- content/en/donate-2026.html | 9 ++ data/donate-2026.json | 37 +++++++ i18n/en.toml | 11 +++ themes/le-2025/assets/css/donate-2026.css | 43 ++++++++ .../assets/css/le-2025-theme-input.css | 2 + themes/le-2025/assets/js/donate-2026.js | 97 +++++++++++++++++++ themes/le-2025/layouts/page/donate-2026.html | 48 +++++++++ .../partials/donate-2026/campaign-hero.html | 6 ++ .../partials/donate-2026/campaign-item.html | 25 +++++ 9 files changed, 278 insertions(+) create mode 100644 content/en/donate-2026.html create mode 100644 data/donate-2026.json create mode 100644 themes/le-2025/assets/css/donate-2026.css create mode 100644 themes/le-2025/assets/js/donate-2026.js create mode 100644 themes/le-2025/layouts/page/donate-2026.html create mode 100644 themes/le-2025/layouts/partials/donate-2026/campaign-hero.html create mode 100644 themes/le-2025/layouts/partials/donate-2026/campaign-item.html diff --git a/content/en/donate-2026.html b/content/en/donate-2026.html new file mode 100644 index 000000000..f3e684815 --- /dev/null +++ b/content/en/donate-2026.html @@ -0,0 +1,9 @@ +--- +title: Support Let's Encrypt +slug: donate-2026 +type: page +layout: donate-2026 +no_donate_footer: true +useContainer: false +lastmod: 2026-06-05 +--- diff --git a/data/donate-2026.json b/data/donate-2026.json new file mode 100644 index 000000000..2c96b8f8c --- /dev/null +++ b/data/donate-2026.json @@ -0,0 +1,37 @@ +{ + "items": [ + { + "id": "item-1", + "eyebrow": "Donate $40+ [PLACEHOLDER]", + "title": "Item One [PLACEHOLDER]", + "description": "Replace this description with the actual merch item details.", + "images": [ + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Puzzle-1.png", "full": "/images/donate-2024/Selections/Puzzle/Donate-2024-Gift-Puzzle-1.png" }, + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Puzzle-2.jpg", "full": "/images/donate-2024/Selections/Puzzle/Donate-2024-Gift-Puzzle-2.png" }, + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Puzzle-3.png", "full": "/images/donate-2024/Selections/Puzzle/Donate-2024-Gift-Puzzle-3.png" } + ] + }, + { + "id": "item-2", + "eyebrow": "Donate $40+ [PLACEHOLDER]", + "title": "Item Two [PLACEHOLDER]", + "description": "Replace this description with the actual merch item details.", + "images": [ + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Print-1.jpg", "full": "/images/donate-2024/Selections/Poster/Donate-2024-Gift-Print-1.png" }, + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Print-2.jpg", "full": "/images/donate-2024/Selections/Poster/Donate-2024-Gift-Print-2.png" }, + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Print-3.jpg", "full": "/images/donate-2024/Selections/Poster/Donate-2024-Gift-Print-3.png" } + ] + }, + { + "id": "item-3", + "eyebrow": "Donate $40+ [PLACEHOLDER]", + "title": "Item Three [PLACEHOLDER]", + "description": "Replace this description with the actual merch item details.", + "images": [ + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Shirt-1.jpg", "full": "/images/donate-2024/Selections/Tee/Donate-2024-Gift-Shirt-1.png" }, + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Shirt-2.jpg", "full": "/images/donate-2024/Selections/Tee/Donate-2024-Gift-Shirt-2.png" }, + { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Shirt-3.jpg", "full": "/images/donate-2024/Selections/Tee/Donate-2024-Gift-Shirt-3.png" } + ] + } + ] +} diff --git a/i18n/en.toml b/i18n/en.toml index 3ada28eb5..f4f6f2153 100644 --- a/i18n/en.toml +++ b/i18n/en.toml @@ -549,3 +549,14 @@ other = "We are able to accept most cryptocurrency donations {{ .cryptoLink }}." [donate_page_crypto_link_text] other = "here" + +# ── Donate 2026 Campaign ────────────────────────────────── + +[donate_2026_hero_title] +other = "Encryption for Everybody." + +[donate_2026_hero_body] +other = "For over a decade, Let's Encrypt has provided billions of free TLS certificates. Each one made possible thanks to the generosity of people like you. Donate today to help us continue this work, and we'll say thanks with a gift of your choosing." + +[donate_2026_cta_button] +other = "Donate Now" diff --git a/themes/le-2025/assets/css/donate-2026.css b/themes/le-2025/assets/css/donate-2026.css new file mode 100644 index 000000000..6728b54b2 --- /dev/null +++ b/themes/le-2025/assets/css/donate-2026.css @@ -0,0 +1,43 @@ +/* ── Donate 2026 Campaign ──────────────────────────────── */ +@utility donate-2026-item { + @apply flex flex-col md:flex-row gap-6 pb-10 border-b border-gray-200; + + &:last-child { + @apply border-b-0; + } +} +@utility donate-2026-carousel { + @apply w-full md:w-48 flex-shrink-0; +} +@utility donate-2026-carousel-img { + @apply hidden w-full rounded-lg bg-white object-contain cursor-zoom-in; + + &.active { + @apply block; + } +} +@utility donate-2026-carousel-prev { + @apply w-8 h-8 bg-gray-200 rounded text-center font-bold text-base leading-8 hover:bg-gray-300 select-none; +} +@utility donate-2026-carousel-next { + @apply w-8 h-8 bg-gray-200 rounded text-center font-bold text-base leading-8 hover:bg-gray-300 select-none; +} +@utility donate-2026-eyebrow { + @apply uppercase tracking-wider text-sm font-bold text-le-yellow mb-2; +} +@utility donate-2026-lightbox { + @apply hidden fixed inset-0 z-[999] bg-black/70 items-center justify-center; + + &.active { + @apply flex; + } +} +@utility donate-2026-sticky-cta { + @apply fixed bottom-0 left-0 w-full z-[1000] lg:hidden; + transform: translateY(100%); + transition: transform 0.2s ease-in-out; + + &.visible { + transform: translateY(0); + } +} diff --git a/themes/le-2025/assets/css/le-2025-theme-input.css b/themes/le-2025/assets/css/le-2025-theme-input.css index f5384b05b..32e15b8e5 100644 --- a/themes/le-2025/assets/css/le-2025-theme-input.css +++ b/themes/le-2025/assets/css/le-2025-theme-input.css @@ -673,3 +673,5 @@ .prose-content .pull-quote-right blockquote { @apply mt-0 pt-0 border-0 pl-0; } + +@import "./donate-2026.css"; diff --git a/themes/le-2025/assets/js/donate-2026.js b/themes/le-2025/assets/js/donate-2026.js new file mode 100644 index 000000000..00e5ed2aa --- /dev/null +++ b/themes/le-2025/assets/js/donate-2026.js @@ -0,0 +1,97 @@ +const Donate2026 = { + init() { + const page = document.getElementById('donate-2026-page'); + if (!page) return; + + this.initCarousels(); + this.initLightbox(); + this.initStickyCTA(); + }, + + initCarousels() { + document.querySelectorAll('.donate-2026-carousel').forEach(carousel => { + const images = carousel.querySelectorAll('.donate-2026-carousel-img'); + const prevBtn = carousel.querySelector('.donate-2026-carousel-prev'); + const nextBtn = carousel.querySelector('.donate-2026-carousel-next'); + const counter = carousel.querySelector('.donate-2026-carousel-counter'); + if (images.length <= 1) return; + + let current = 0; + + const show = (index) => { + images[current].classList.remove('active'); + current = (index + images.length) % images.length; + images[current].classList.add('active'); + if (counter) counter.textContent = `${current + 1} / ${images.length}`; + }; + + prevBtn.addEventListener('click', () => show(current - 1)); + nextBtn.addEventListener('click', () => show(current + 1)); + + images.forEach(img => { + img.addEventListener('click', () => { + const fullSrc = img.getAttribute('data-full'); + if (fullSrc) this.openLightbox(fullSrc); + }); + }); + }); + }, + + initLightbox() { + const lightbox = document.getElementById('donate-2026-lightbox'); + const lightboxImg = document.getElementById('donate-2026-lightbox-img'); + if (!lightbox || !lightboxImg) return; + + lightbox.addEventListener('click', (e) => { + if (e.target === lightboxImg) return; + this.closeLightbox(); + }); + + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape' && lightbox.getAttribute('aria-hidden') === 'false') { + this.closeLightbox(); + } + }); + }, + + openLightbox(src) { + const lightbox = document.getElementById('donate-2026-lightbox'); + const lightboxImg = document.getElementById('donate-2026-lightbox-img'); + lightboxImg.src = src; + lightbox.setAttribute('aria-hidden', 'false'); + lightbox.classList.add('active'); + document.body.style.overflow = 'hidden'; + }, + + closeLightbox() { + const lightbox = document.getElementById('donate-2026-lightbox'); + lightbox.setAttribute('aria-hidden', 'true'); + lightbox.classList.remove('active'); + document.body.style.overflow = ''; + }, + + initStickyCTA() { + const cta = document.getElementById('donate-2026-sticky-cta'); + const anchor = document.getElementById('donate-2026-form-anchor'); + if (!cta || !anchor) return; + + const update = () => { + const rect = anchor.getBoundingClientRect(); + const formVisible = rect.top >= -100 && rect.top <= window.innerHeight + 100; + cta.classList.toggle('visible', !formVisible); + }; + + cta.querySelector('a').addEventListener('click', (e) => { + e.preventDefault(); + anchor.scrollIntoView({ behavior: 'smooth' }); + }); + + document.addEventListener('scroll', update, { passive: true }); + window.addEventListener('resize', update); + update(); + } +}; + +document.addEventListener('DOMContentLoaded', () => { + Donate2026.init(); +}); diff --git a/themes/le-2025/layouts/page/donate-2026.html b/themes/le-2025/layouts/page/donate-2026.html new file mode 100644 index 000000000..e63c71326 --- /dev/null +++ b/themes/le-2025/layouts/page/donate-2026.html @@ -0,0 +1,48 @@ +{{ define "main" }} + + +{{ with resources.Get "js/donate-2026.js" }} + {{ if eq hugo.Environment "development" }} + {{ with . | js.Build }} + + {{ end }} + {{ else }} + {{ $opts := dict "minify" true }} + {{ with . | js.Build $opts | fingerprint }} + + {{ end }} + {{ end }} +{{ end }} +{{ end }} diff --git a/themes/le-2025/layouts/partials/donate-2026/campaign-hero.html b/themes/le-2025/layouts/partials/donate-2026/campaign-hero.html new file mode 100644 index 000000000..f0c963743 --- /dev/null +++ b/themes/le-2025/layouts/partials/donate-2026/campaign-hero.html @@ -0,0 +1,6 @@ +
+
+

{{ T "donate_2026_hero_title" }}

+

{{ T "donate_2026_hero_body" }}

+
+
diff --git a/themes/le-2025/layouts/partials/donate-2026/campaign-item.html b/themes/le-2025/layouts/partials/donate-2026/campaign-item.html new file mode 100644 index 000000000..69996f771 --- /dev/null +++ b/themes/le-2025/layouts/partials/donate-2026/campaign-item.html @@ -0,0 +1,25 @@ +{{- $id := .id -}} + From d7f162f2e05a51463fede43a112f2002778bc15d Mon Sep 17 00:00:00 2001 From: scottmakestech <83726258+scottmakestech@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:54:12 -0500 Subject: [PATCH 2/5] Donate 2026 page updates --- config/_default/server.toml | 3 + content/en/donate-2026.html | 5 +- data/donate-2026.json | 37 ---- i18n/en.toml | 165 ++++++++++++++++- themes/le-2025/assets/css/donate-2026.css | 43 ----- .../assets/css/le-2025-theme-input.css | 57 +++++- themes/le-2025/assets/js/donate-2026.js | 171 +++++++++++------- themes/le-2025/layouts/page/donate-2026.html | 42 ++--- .../components/accordion-item-2026.html | 34 ++++ .../partials/donate-2026/campaign-hero.html | 6 - .../partials/donate-2026/campaign-item.html | 25 --- .../partials/donate-accordion-2026.html | 54 ++++++ .../donate-content-2026/become-a-sponsor.html | 6 + .../donate-content-2026/donate-by-check.html | 4 + .../donate-cryptocurrency.html | 6 + .../donate-content-2026/donate-stock.html | 28 +++ .../donor-advised-funds.html | 4 + .../employer-matching-gifts.html | 4 + .../donate-content-2026/legal-details.html | 5 + .../donate-content-2026/mailing-address.html | 7 + .../donate-content-2026/org-address.html | 7 + .../planned-legacy-giving.html | 8 + .../qualified-charitable-distribution.html | 15 ++ .../layouts/partials/donation-forms-2026.html | 49 +++++ .../layouts/partials/donorbox-2026.html | 44 +++++ .../partials/funding-details-2026.html | 5 + 26 files changed, 617 insertions(+), 217 deletions(-) delete mode 100644 data/donate-2026.json delete mode 100644 themes/le-2025/assets/css/donate-2026.css create mode 100644 themes/le-2025/layouts/partials/components/accordion-item-2026.html delete mode 100644 themes/le-2025/layouts/partials/donate-2026/campaign-hero.html delete mode 100644 themes/le-2025/layouts/partials/donate-2026/campaign-item.html create mode 100644 themes/le-2025/layouts/partials/donate-accordion-2026.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/become-a-sponsor.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/donate-by-check.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/donate-cryptocurrency.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/donate-stock.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/donor-advised-funds.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/employer-matching-gifts.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/legal-details.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/mailing-address.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/org-address.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/planned-legacy-giving.html create mode 100644 themes/le-2025/layouts/partials/donate-content-2026/qualified-charitable-distribution.html create mode 100644 themes/le-2025/layouts/partials/donation-forms-2026.html create mode 100644 themes/le-2025/layouts/partials/donorbox-2026.html create mode 100644 themes/le-2025/layouts/partials/funding-details-2026.html diff --git a/config/_default/server.toml b/config/_default/server.toml index 5c7c6ac07..1e8f78ea6 100644 --- a/config/_default/server.toml +++ b/config/_default/server.toml @@ -39,6 +39,8 @@ Content-Security-Policy = """ https://js.stripe.com/v3/ https://sdks.shopifycdn.com https://www.paypal.com + https://widget.thegivingblock.com + https://js.dev.shift4.com ; img-src 'self' data: blob: https://www.google-analytics.com @@ -59,6 +61,7 @@ Content-Security-Policy = """ https://js.stripe.com/v2/ https://www.paypal.com https://outreach.abetterinternet.org + https://widget.thegivingblock.com/ ; connect-src 'self' https://d4twhgtvn0ff5.cloudfront.net/ diff --git a/content/en/donate-2026.html b/content/en/donate-2026.html index f3e684815..0b80a6eae 100644 --- a/content/en/donate-2026.html +++ b/content/en/donate-2026.html @@ -1,9 +1,10 @@ --- -title: Support Let's Encrypt +title: "Support ISRG, the nonprofit behind Let’s Encrypt, Prossimo and Divvi Up today!" slug: donate-2026 type: page layout: donate-2026 no_donate_footer: true useContainer: false -lastmod: 2026-06-05 +imageHero: true +lastmod: 2026-07-07 --- diff --git a/data/donate-2026.json b/data/donate-2026.json deleted file mode 100644 index 2c96b8f8c..000000000 --- a/data/donate-2026.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "items": [ - { - "id": "item-1", - "eyebrow": "Donate $40+ [PLACEHOLDER]", - "title": "Item One [PLACEHOLDER]", - "description": "Replace this description with the actual merch item details.", - "images": [ - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Puzzle-1.png", "full": "/images/donate-2024/Selections/Puzzle/Donate-2024-Gift-Puzzle-1.png" }, - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Puzzle-2.jpg", "full": "/images/donate-2024/Selections/Puzzle/Donate-2024-Gift-Puzzle-2.png" }, - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Puzzle-3.png", "full": "/images/donate-2024/Selections/Puzzle/Donate-2024-Gift-Puzzle-3.png" } - ] - }, - { - "id": "item-2", - "eyebrow": "Donate $40+ [PLACEHOLDER]", - "title": "Item Two [PLACEHOLDER]", - "description": "Replace this description with the actual merch item details.", - "images": [ - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Print-1.jpg", "full": "/images/donate-2024/Selections/Poster/Donate-2024-Gift-Print-1.png" }, - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Print-2.jpg", "full": "/images/donate-2024/Selections/Poster/Donate-2024-Gift-Print-2.png" }, - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Print-3.jpg", "full": "/images/donate-2024/Selections/Poster/Donate-2024-Gift-Print-3.png" } - ] - }, - { - "id": "item-3", - "eyebrow": "Donate $40+ [PLACEHOLDER]", - "title": "Item Three [PLACEHOLDER]", - "description": "Replace this description with the actual merch item details.", - "images": [ - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Shirt-1.jpg", "full": "/images/donate-2024/Selections/Tee/Donate-2024-Gift-Shirt-1.png" }, - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Shirt-2.jpg", "full": "/images/donate-2024/Selections/Tee/Donate-2024-Gift-Shirt-2.png" }, - { "thumb": "/images/donate-2024/thumbs/Thumbnail-Donate-2024-Gift-Shirt-3.jpg", "full": "/images/donate-2024/Selections/Tee/Donate-2024-Gift-Shirt-3.png" } - ] - } - ] -} diff --git a/i18n/en.toml b/i18n/en.toml index f4f6f2153..a5b9fb8e6 100644 --- a/i18n/en.toml +++ b/i18n/en.toml @@ -550,13 +550,164 @@ other = "We are able to accept most cryptocurrency donations {{ .cryptoLink }}." [donate_page_crypto_link_text] other = "here" -# ── Donate 2026 Campaign ────────────────────────────────── +[donate_2026_page_title] +other = "Support ISRG, the nonprofit behind Let’s Encrypt, Prossimo and Divvi Up today!" -[donate_2026_hero_title] -other = "Encryption for Everybody." +[donate_2026_funding_details_stat_text] +other = "Donate during our Summer Campaign and receive a limited time only t-shirt, “Preparing for a PQ World.”" -[donate_2026_hero_body] -other = "For over a decade, Let's Encrypt has provided billions of free TLS certificates. Each one made possible thanks to the generosity of people like you. Donate today to help us continue this work, and we'll say thanks with a gift of your choosing." +[donate_2026_ways_to_give_heading] +other = "More Ways to Give" -[donate_2026_cta_button] -other = "Donate Now" +[donate_2026_employer_matching_gifts_title] +other = "Employer matching gifts" + +[donate_2026_employer_matching_gifts_text] +other = "Many organizations match donations to nonprofits made by employees. Check if your organization has a matching program and double your impact!" + +[donate_2026_become_a_sponsor_title] +other = "Become a sponsor" + +[donate_2026_become_a_sponsor_text] +other = "Nearly 100 companies and organizations support our work – from two-person businesses to nonprofits to Fortune 100 companies. Join our roster of generous sponsors that are helping to provide a more secure and privacy respecting Internet for billions of people." + +[donate_2026_become_a_sponsor_link_text] +other = "Learn more here." + +[donate_2026_donate_stock_title] +other = "Donate stock" + +[donate_2026_donate_stock_intro_text] +other = "Appreciated securities or mutual fund shares that you've owned for more than one year can be excellent charitable gifts." + +[donate_2026_donate_stock_brokerage_firm] +other = "Brokerage Firm:" + +[donate_2026_donate_stock_brokerage_firm_value] +other = "Vanguard" + +[donate_2026_donate_stock_account_name] +other = "Account Name:" + +[donate_2026_donate_stock_account_name_value] +other = "Internet Security Research Group" + +[donate_2026_donate_stock_account_number] +other = "Account #:" + +[donate_2026_donate_stock_account_number_value] +other = "44865458" + +[donate_2026_donate_stock_dtc_number] +other = "DTC #:" + +[donate_2026_donate_stock_dtc_number_value] +other = "0062" + +[donate_2026_donate_stock_tax_id] +other = "Tax ID #:" + +[donate_2026_donate_stock_tax_id_value] +other = "46-3344200" + +[donate_2026_donate_stock_outro_text] +other = "Please contact us if you are transferring securities at {{ .donateEmailLink }} to ensure that we are able to credit you for your gift." + +[donate_2026_donate_cryptocurrency_title] +other = "Donate cryptocurrency" + +[donate_2026_donate_cryptocurrency_link_text] +other = "this page" + +[donate_2026_donate_cryptocurrency_text] +other = "We are able to accept most cryptocurrency by visiting {{ .cryptoLink }}. We do incur processing fees through these transactions, so please consider covering the fees to help ensure your gift has the greatest impact." + +[donate_2026_donor_advised_funds_title] +other = "Donor Advised Funds (DAFs)" + +[donate_2026_donor_advised_funds_text] +other = "Simply inform your DAF sponsor that you’d like to make a gift to:" + +[donate_2026_org_name] +other = "Internet Security Research Group" + +[donate_2026_org_ein] +other = "EIN: 46-3344200" + +[donate_2026_org_address_line1] +other = "548 Market St" + +[donate_2026_org_address_line2] +other = "PMB 77519" + +[donate_2026_org_address_line3] +other = "San Francisco, California 94104-5401" + +[donate_2026_planned_legacy_giving_title] +other = "Planned/Legacy giving" + +[donate_2026_planned_legacy_giving_text] +other = "Please consider making ISRG a beneficiary of your will or retirement plan to help protect Internet users by lowering monetary, technological, and informational barriers to a more secure and privacy-respecting Internet." + +[donate_2026_planned_legacy_giving_notify_text] +other = "Have you already included ISRG in your estate plans? Let us know at {{ .donateEmailLink }}." + +[donate_2026_planned_legacy_giving_confidentiality_text] +other = "While documenting your planned gift is confidential and non-binding, it allows us to plan for the future and thank you for your generosity today." + +[donate_2026_planned_legacy_giving_advisor_text] +other = "Please seek the advice of your financial or legal advisor." + +[donate_2026_qualified_charitable_distribution_title] +other = "Qualified Charitable Distribution" + +[donate_2026_qualified_charitable_distribution_text] +other = "If you are 70½ or older, you can give directly from your US-based IRA to ISRG without paying income tax on the distribution. This option is often called an IRA charitable rollover or a qualified charitable distribution (QCD). You can give up to an annual maximum set by the IRS, which adjusts each year, so confirm the current amount with your advisor." + +[donate_2026_qualified_charitable_distribution_advisor_text] +other = "Please seek the advice of your financial or legal advisor." + +[donate_2026_qualified_charitable_distribution_instructions_text] +other = "To make your gift, ask your IRA administrator to send the distribution directly to ISRG. Give them our legal name and federal tax ID so they can identify us. Please also let us know about your gift at {{ .donateEmailLink }}. Many IRA administrators send distributions without identifying the donor, so a quick note from you lets us thank you and honor your wishes for the gift." + +[donate_2026_qualified_charitable_distribution_legal_name_heading] +other = "Legal details" + +[donate_2026_legal_name_label] +other = "Legal name:" + +[donate_2026_legal_address_label] +other = "Address:" + +[donate_2026_org_full_address] +other = "548 Market St, PMB 77519, San Francisco, California 94104-5401" + +[donate_2026_federal_tax_id_label] +other = "Federal tax ID number:" + +[donate_2026_federal_tax_id_value] +other = "46-3344200" + +[donate_2026_mailing_address_heading] +other = "Mailing Address" + +[donate_2026_mailing_address_intro] +other = "(only for check-processing)" + +[donate_2026_mailing_address_attention] +other = "Internet Security Research Group" + +[donate_2026_mailing_address_line1] +other = "ATTN: Advancement Department" + +[donate_2026_mailing_address_line2] +other = "PO Box 18666" + +[donate_2026_mailing_address_line3] +other = "Minneapolis, MN 55418-0666, USA" + +[donate_2026_donate_by_check_title] +other = "Donate by check" + +[donate_2026_donate_by_check_text] +other = "You can donate by personal check payable to \"ISRG\" at the address below:" diff --git a/themes/le-2025/assets/css/donate-2026.css b/themes/le-2025/assets/css/donate-2026.css deleted file mode 100644 index 6728b54b2..000000000 --- a/themes/le-2025/assets/css/donate-2026.css +++ /dev/null @@ -1,43 +0,0 @@ -/* ── Donate 2026 Campaign ──────────────────────────────── */ -@utility donate-2026-item { - @apply flex flex-col md:flex-row gap-6 pb-10 border-b border-gray-200; - - &:last-child { - @apply border-b-0; - } -} -@utility donate-2026-carousel { - @apply w-full md:w-48 flex-shrink-0; -} -@utility donate-2026-carousel-img { - @apply hidden w-full rounded-lg bg-white object-contain cursor-zoom-in; - - &.active { - @apply block; - } -} -@utility donate-2026-carousel-prev { - @apply w-8 h-8 bg-gray-200 rounded text-center font-bold text-base leading-8 hover:bg-gray-300 select-none; -} -@utility donate-2026-carousel-next { - @apply w-8 h-8 bg-gray-200 rounded text-center font-bold text-base leading-8 hover:bg-gray-300 select-none; -} -@utility donate-2026-eyebrow { - @apply uppercase tracking-wider text-sm font-bold text-le-yellow mb-2; -} -@utility donate-2026-lightbox { - @apply hidden fixed inset-0 z-[999] bg-black/70 items-center justify-center; - - &.active { - @apply flex; - } -} -@utility donate-2026-sticky-cta { - @apply fixed bottom-0 left-0 w-full z-[1000] lg:hidden; - transform: translateY(100%); - transition: transform 0.2s ease-in-out; - - &.visible { - transform: translateY(0); - } -} diff --git a/themes/le-2025/assets/css/le-2025-theme-input.css b/themes/le-2025/assets/css/le-2025-theme-input.css index 32e15b8e5..e4a3d0a5b 100644 --- a/themes/le-2025/assets/css/le-2025-theme-input.css +++ b/themes/le-2025/assets/css/le-2025-theme-input.css @@ -104,6 +104,61 @@ @apply md:ml-auto w-full; } } + +#cmp-DonationForms2026 { + max-width: 560px; + margin: 0 auto; + text-align: center; +} + +#cmp-DonationForms2026 .donate-2026-tabs { + display: inline-flex; + background: #f6f7f9; + border-radius: 999px; + padding: 4px; + margin-bottom: 2rem; +} + +#cmp-DonationForms2026 .donate-2026-tab { + border: 0; + background: transparent; + color: #6b6f76; + font: inherit; + font-weight: 600; + padding: 0.55rem 1.1rem; + border-radius: 999px; + cursor: pointer; +} + +#cmp-DonationForms2026 .donate-2026-tab[aria-selected='true'] { + background: #ffffff; + color: #1b1b1b; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); +} + +#cmp-DonationForms2026 .donate-2026-embed-panel { + display: none; +} + +#cmp-DonationForms2026 .donate-2026-embed-panel.active { + display: block; +} + +#cmp-DonationForms2026 .donate-2026-embed-frame { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +#cmp-DonationForms2026 iframe { + max-width: 500px; + min-width: 250px; + max-height: none; + width: 100%; + margin-left: auto; + margin-right: auto; +} @utility donate-2025-stat { @apply font-bold text-[128px] leading-[167px]; } @@ -673,5 +728,3 @@ .prose-content .pull-quote-right blockquote { @apply mt-0 pt-0 border-0 pl-0; } - -@import "./donate-2026.css"; diff --git a/themes/le-2025/assets/js/donate-2026.js b/themes/le-2025/assets/js/donate-2026.js index 00e5ed2aa..ad453a911 100644 --- a/themes/le-2025/assets/js/donate-2026.js +++ b/themes/le-2025/assets/js/donate-2026.js @@ -1,94 +1,131 @@ const Donate2026 = { init() { - const page = document.getElementById('donate-2026-page'); + const page = document.getElementById('page-Donate2026'); if (!page) return; - this.initCarousels(); - this.initLightbox(); - this.initStickyCTA(); + this.page = page; + this.forms = page.querySelector('#cmp-DonationForms2026'); + + window.addEventListener('hashchange', () => { + this.syncAccordionToLocation(); + }); + + window.addEventListener('popstate', () => { + this.syncAccordionToLocation(); + }); + + this.bindDonationTabs(); + this.bindAccordionLinks(); + + if (window.location.hash) { + this.syncAccordionToLocation(); + } }, - initCarousels() { - document.querySelectorAll('.donate-2026-carousel').forEach(carousel => { - const images = carousel.querySelectorAll('.donate-2026-carousel-img'); - const prevBtn = carousel.querySelector('.donate-2026-carousel-prev'); - const nextBtn = carousel.querySelector('.donate-2026-carousel-next'); - const counter = carousel.querySelector('.donate-2026-carousel-counter'); - if (images.length <= 1) return; - - let current = 0; - - const show = (index) => { - images[current].classList.remove('active'); - current = (index + images.length) % images.length; - images[current].classList.add('active'); - if (counter) counter.textContent = `${current + 1} / ${images.length}`; - }; - - prevBtn.addEventListener('click', () => show(current - 1)); - nextBtn.addEventListener('click', () => show(current + 1)); - - images.forEach(img => { - img.addEventListener('click', () => { - const fullSrc = img.getAttribute('data-full'); - if (fullSrc) this.openLightbox(fullSrc); - }); + bindDonationTabs() { + if (!this.forms) return; + + this.tabs = Array.from(this.forms.querySelectorAll('.donate-2026-tab')); + this.panels = Array.from(this.forms.querySelectorAll('.donate-2026-embed-panel')); + + if (!this.tabs.length || !this.panels.length) return; + + this.tabs.forEach(tab => { + tab.addEventListener('click', () => { + this.activateDonationTab(tab.dataset.panel); }); }); + + const selectedTab = this.tabs.find(tab => tab.getAttribute('aria-selected') === 'true') || this.tabs[0]; + this.activateDonationTab(selectedTab.dataset.panel); }, - initLightbox() { - const lightbox = document.getElementById('donate-2026-lightbox'); - const lightboxImg = document.getElementById('donate-2026-lightbox-img'); - if (!lightbox || !lightboxImg) return; + activateDonationTab(panelName) { + if (!panelName || !this.tabs || !this.panels) return; - lightbox.addEventListener('click', (e) => { - if (e.target === lightboxImg) return; - this.closeLightbox(); + this.tabs.forEach(tab => { + const isSelected = tab.dataset.panel === panelName; + tab.setAttribute('aria-selected', isSelected ? 'true' : 'false'); + tab.setAttribute('tabindex', isSelected ? '0' : '-1'); }); - document.addEventListener('keydown', (e) => { - if (e.key === 'Escape' && lightbox.getAttribute('aria-hidden') === 'false') { - this.closeLightbox(); - } + this.panels.forEach(panel => { + const isActive = panel.id === `donate-2026-panel-${panelName}`; + panel.classList.toggle('active', isActive); + panel.hidden = !isActive; + }); + }, + + bindAccordionLinks() { + this.page.querySelectorAll('.accordion-button').forEach(button => { + button.addEventListener('click', () => { + const item = button.closest('.accordion-item'); + if (!item) return; + + const isOpen = item.classList.contains('is-open'); + this.updateHistory(item.id, isOpen); + }); }); }, - openLightbox(src) { - const lightbox = document.getElementById('donate-2026-lightbox'); - const lightboxImg = document.getElementById('donate-2026-lightbox-img'); - lightboxImg.src = src; - lightbox.setAttribute('aria-hidden', 'false'); - lightbox.classList.add('active'); - document.body.style.overflow = 'hidden'; + updateHistory(id, isOpen) { + const url = new URL(window.location.href); + url.hash = isOpen ? id : ''; + window.history.pushState({}, '', `${url.pathname}${url.search}${url.hash}`); }, - closeLightbox() { - const lightbox = document.getElementById('donate-2026-lightbox'); - lightbox.setAttribute('aria-hidden', 'true'); - lightbox.classList.remove('active'); - document.body.style.overflow = ''; + syncAccordionToLocation() { + const hash = window.location.hash.replace(/^#/, ''); + + if (!hash) { + this.closeAllAccordions(); + return; + } + + this.openAccordionById(hash); }, - initStickyCTA() { - const cta = document.getElementById('donate-2026-sticky-cta'); - const anchor = document.getElementById('donate-2026-form-anchor'); - if (!cta || !anchor) return; + closeAllAccordions() { + this.page.querySelectorAll('.accordion-item').forEach(item => { + const button = item.querySelector('.accordion-button'); + const content = item.querySelector('.accordion-content'); + const icon = item.querySelector('.accordion-icon'); - const update = () => { - const rect = anchor.getBoundingClientRect(); - const formVisible = rect.top >= -100 && rect.top <= window.innerHeight + 100; - cta.classList.toggle('visible', !formVisible); - }; + if (!button || !content) return; - cta.querySelector('a').addEventListener('click', (e) => { - e.preventDefault(); - anchor.scrollIntoView({ behavior: 'smooth' }); + button.classList.remove('active'); + button.setAttribute('aria-expanded', 'false'); + content.classList.add('hidden'); + item.classList.remove('is-open'); + + if (icon) icon.textContent = '+'; }); + }, + + openAccordionById(id) { + const target = document.getElementById(id); + if (!target) return; - document.addEventListener('scroll', update, { passive: true }); - window.addEventListener('resize', update); - update(); + this.closeAllAccordions(); + + const item = target.classList.contains('accordion-item') ? target : target.closest('.accordion-item'); + if (!item) return; + + const button = item.querySelector('.accordion-button'); + const content = item.querySelector('.accordion-content'); + const icon = item.querySelector('.accordion-icon'); + + if (!button || !content) return; + + button.classList.add('active'); + button.setAttribute('aria-expanded', 'true'); + content.classList.remove('hidden'); + item.classList.add('is-open'); + if (icon) icon.textContent = '−'; + + requestAnimationFrame(() => { + item.scrollIntoView({ block: 'start' }); + }); } }; diff --git a/themes/le-2025/layouts/page/donate-2026.html b/themes/le-2025/layouts/page/donate-2026.html index e63c71326..79b1139b0 100644 --- a/themes/le-2025/layouts/page/donate-2026.html +++ b/themes/le-2025/layouts/page/donate-2026.html @@ -1,38 +1,24 @@ {{ define "main" }} -