diff --git a/public/events/masonry/1.webp b/public/events/masonry/1.webp new file mode 100644 index 0000000..a8a1e92 Binary files /dev/null and b/public/events/masonry/1.webp differ diff --git a/public/events/masonry/2.webp b/public/events/masonry/2.webp new file mode 100644 index 0000000..67711fb Binary files /dev/null and b/public/events/masonry/2.webp differ diff --git a/public/events/masonry/3.webp b/public/events/masonry/3.webp new file mode 100644 index 0000000..c711b96 Binary files /dev/null and b/public/events/masonry/3.webp differ diff --git a/public/events/masonry/4.webp b/public/events/masonry/4.webp new file mode 100644 index 0000000..5a26a3e Binary files /dev/null and b/public/events/masonry/4.webp differ diff --git a/public/events/masonry/5.webp b/public/events/masonry/5.webp new file mode 100644 index 0000000..25ba17b Binary files /dev/null and b/public/events/masonry/5.webp differ diff --git a/public/events/masonry/6.webp b/public/events/masonry/6.webp new file mode 100644 index 0000000..c516f03 Binary files /dev/null and b/public/events/masonry/6.webp differ diff --git a/public/events/masonry/7.webp b/public/events/masonry/7.webp new file mode 100644 index 0000000..56c798b Binary files /dev/null and b/public/events/masonry/7.webp differ diff --git a/public/events/masonry/8.webp b/public/events/masonry/8.webp new file mode 100644 index 0000000..bc40740 Binary files /dev/null and b/public/events/masonry/8.webp differ diff --git a/public/events/masonry/9.webp b/public/events/masonry/9.webp new file mode 100644 index 0000000..e8c39a2 Binary files /dev/null and b/public/events/masonry/9.webp differ diff --git a/public/hp-bg-redesign.webp b/public/hp-bg-redesign.webp new file mode 100644 index 0000000..0d0b6de Binary files /dev/null and b/public/hp-bg-redesign.webp differ diff --git a/public/icons/signal.svg b/public/icons/signal.svg new file mode 100644 index 0000000..cc07d87 --- /dev/null +++ b/public/icons/signal.svg @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/public/review.png b/public/review.png new file mode 100644 index 0000000..41954b9 Binary files /dev/null and b/public/review.png differ diff --git a/public/scripts/text-scramble.js b/public/scripts/text-scramble.js new file mode 100644 index 0000000..0cbf305 --- /dev/null +++ b/public/scripts/text-scramble.js @@ -0,0 +1,99 @@ +function applyScrambleEffect() { + const glitchTextElements = document.querySelectorAll('.glitch-text'); + const glitchTextHoverElements = document.querySelectorAll('.glitch-text-hover'); + + function animateScramble(element, text, duration = 2000) { + const chars = []; + element.innerHTML = ''; // Clear the original text + + // Measure the element's width before animation starts + const preScrambleWidth = element.offsetWidth; + element.style.width = `${preScrambleWidth}px`; + + for (let t = 0; t < text.length; t++) { + const span = document.createElement('span'); + + // Check if the character is a space, then use to preserve it + span.innerHTML = text[t] === ' ' ? ' ' : text[t]; + chars[t] = span; + span.style.display = 'inline-block'; + element.appendChild(span); + } + + const rand = Math.random; + const SECONDS = 1000; + const FPS = 30; + const animationLength = duration; + + function animate3(k) { + const kk = k * text.length; + for (let i = 0; i < text.length; i++) { + if (kk < i) { + chars[i].innerHTML = String.fromCharCode(~~(65 + rand() * 26)); + } else { + // Preserve spaces with + chars[i].innerHTML = text[i] === ' ' ? ' ' : text[i]; + } + } + } + + // Animation loop + let start = Date.now(); + function animate() { + const current = Date.now(); + const time = current - start; + const k = time / animationLength; + + if (k < 1) { + setTimeout(animate, SECONDS / FPS); + animate3(k); + } else { + // Ensure the final text is revealed once the animation is complete + for (let i = 0; i < text.length; i++) { + chars[i].innerHTML = text[i] === ' ' ? ' ' : text[i]; + } + // Restore the original width (optional if you want to revert to normal) + element.style.width = 'auto'; + // Allow new hover events after the animation completes + element.isAnimating = false; + } + } + + animate(); + } + + // Use Intersection Observer to observe when the element comes into view + const observer = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const element = entry.target; + const text = element.innerText; + animateScramble(element, text); + observer.unobserve(element); // Stop observing after the animation has been triggered + } + }); + }, { + threshold: 0.1 // Trigger when 10% of the element is visible + }); + + // Observe each glitchTextElement for when it comes into view + glitchTextElements.forEach((element) => { + observer.observe(element); + }); + + glitchTextHoverElements.forEach((element) => { + const text = element.innerText; + + element.isAnimating = false; + + element.addEventListener('mouseenter', () => { + if (!element.isAnimating) { + element.isAnimating = true; // Set flag to prevent re-triggering during animation + animateScramble(element, text, 800); + } + }); + }); + } + + document.addEventListener('DOMContentLoaded', applyScrambleEffect); + \ No newline at end of file diff --git a/src/components/AboutFooter.astro b/src/components/AboutFooter.astro index 199f1f9..6e85303 100644 --- a/src/components/AboutFooter.astro +++ b/src/components/AboutFooter.astro @@ -2,114 +2,147 @@ import * as config from "../config.yaml"; import core from "../core.json"; import contributors from "../contributors.json"; -import { getPersonByGH } from "../lib/core.js"; -import PeopleCarousel from "../components/PeopleCarousel.astro"; +import SpeakerGrid from "./SpeakerGrid.astro"; +import SliderTestimonial from "./SliderTestimonial.astro"; +import MembersGrid from "./MembersGrid.astro"; -function findPerson(src) { - const p = core.people.find((p) => - src.refs?.twitter - ? p.refs?.twitter === src.refs.twitter - : src.refs?.bsky - ? p.refs.bsky === src.refs.bsky - : {} - ); - if (p) { - p.ct = src; - } - return p; -} +// Accept sectionsConfig as a prop +const { + sectionsConfig = [ + { name: "community", visible: true, order: 1 }, + { name: "socialLinks", visible: true, order: 2 }, + { name: "speakers", visible: true, order: 3 }, + { name: "core contributors", visible: true, order: 4 }, + { name: "contributors", visible: true, order: 5 }, + { name: "testimonials", visible: true, order: 6 }, + { name: "membersGrid", visible: true, order: 7 }, + { name: "communityPartners", visible: true, order: 8 }, + ], +} = Astro.props; -function personLink(person) { - return person.refs?.twitter - ? `https://twitter.com/${person.refs.twitter}` - : person.refs?.bsky - ? `https://bsky.app/profile/${person.refs.bsky}` - : "#"; -} +console.log(sectionsConfig); +// Function to sort sections by order +const sortedSections = sectionsConfig + .filter((section) => section.visible) + .sort((a, b) => a.order - b.order); --- - -
+ )} -+ We cultivate and foster a culture of privacy in web3 making data free + and public. +
++ Check our annual reports, infographics, privacy awards, newsletter, and + guidelines. +
+
+ By developing free and open tools,
we empower people to make informed
+ decisions:
+
@{person.refs.twitter}
+ )} + {/*{truncateCaption(person.caption)}
*/} ++ Members are our chosen collaborators for mutual support and + growth. Rather than one-time deals for individual events or + projects, we strive for consistent collaboration to achieve + lasting impact. +
+ + Become an integral part of our community! Join us with building + privacy platform we all need. + ++ Zcash / + Firo / + Firn / + Privacy Scaling Exploration / + Railgun / + ENS / + Navio (ex Navcoin) / + Panther / + AragonTKResearch / + Secret Network / + Waku +
++ Members are our chosen collaborators for mutual support and + growth. Rather than one-time deals for individual events or + projects, we strive for consistent collaboration to achieve + lasting impact. +
+ + Become an integral part of our community! Join us with building + privacy platform we all need. + ++ Members are our chosen collaborators for mutual support and + growth. Rather than one-time deals for individual events or + projects, we strive for consistent collaboration to achieve + lasting impact. +
++ Ensure visibility at all our events [Congresses, Summits & + Hackathons] +
+Grow impact through strategic, targeted communications.
+Participate in speaking engagements and mentorship roles.
+More details about the deals from our partners.
++ Reach and interact with specific, highly-relevant audiences. +
++ "{testimonials[currentTestimonial].text}" +
+@{person.refs.twitter}
+ )} +{truncateCaption(person.caption)}
+
{genHeading(title)}
@@ -176,7 +177,7 @@ function genHeading(str) {
+ This is the kind of support we value most: open-source, grassroots + initiatives driven by individual passion and the desire to create + something meaningful. +
++ We thrive on uniting diverse perspectives, skills, and visions. Both + online and offline, we bring together tech and non-tech individuals, + activists, key players, hackers, lawyers, researchers, philosophers, + policymakers, local communities, and grassroots movements. +
+ +