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/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..aa0ad91 --- /dev/null +++ b/public/scripts/text-scramble.js @@ -0,0 +1,99 @@ +function applyScrambleEffect() { + const glitchTextOnceElements = document.querySelectorAll('.glitch-text'); + const glitchTextRepeatElements = document.querySelectorAll('.glitch-text-interval'); + + function animateScramble(element, text, duration = 1000) { + const chars = []; + element.innerHTML = ''; + const preScrambleWidth = element.offsetWidth; + element.style.width = `${preScrambleWidth}px`; + + for (let t = 0; t < text.length; t++) { + const span = document.createElement('span'); + 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 { + chars[i].innerHTML = text[i] === ' ' ? ' ' : text[i]; + } + } + } + + 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 { + for (let i = 0; i < text.length; i++) { + chars[i].innerHTML = text[i] === ' ' ? ' ' : text[i]; + } + element.style.width = 'auto'; + element.isAnimating = false; + } + } + + animate(); + } + + 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); + } + }); + }, { + threshold: 0.1 + }); + + glitchTextOnceElements.forEach((element) => { + observer.observe(element); + }); + + glitchTextRepeatElements.forEach((element) => { + const text = element.innerText; + + animateScramble(element, text); + + const intervalId = setInterval(() => { + if (!element.isAnimating) { + animateScramble(element, text); + } + }, 5000); + + element.addEventListener('mouseenter', () => { + if (!element.isAnimating) { + clearInterval(intervalId); + animateScramble(element, text, 800); + element.isAnimating = true; + + setTimeout(() => { + element.isAnimating = false; + }, 1000); + } + }); + }); + } + + document.addEventListener('DOMContentLoaded', applyScrambleEffect); + \ No newline at end of file diff --git a/src/components/AboutFooter.astro b/src/components/AboutFooter.astro index 199f1f9..75bcbf4 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)}
-
-
+ {genHeading(title)}+