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); --- - -
-

- Join the Community -

-
{config.landing.community}
+ +
{config.landing.community}
+
+ )} -

Speakers

-
- { - core.people - .filter((p) => !core.teams["core-team"].includes(p.id)) - .filter((p) => p.imageUrl) - .map((person) => ( -
- - - -
- )) - } -
- -
- -
- -

Git Contributors

-
- { - // filter(p => !core.teams['core-team'].includes(getPersonByGH(p.login)?.id)) - contributors.items.map((contrib) => ( -
- - + {section.name === "socialLinks" && ( + - )) - } -
+ )} -
- - - -
-
+ {section.name === "speakers" && ( +
+

Speakers

+ +
+ )} + + {section.name === "core contributors" && ( +
+

Core Contributors

+ +
+ )} + + {section.name === "contributors" && ( +
+

Contributors

+
+ {contributors.items.map((contrib) => ( +
+ + + +
+ ))} +
+
+ + + +
+
+ )} + + {section.name === "testimonials" && ( +
+

+ What People Have To Say About US +

+ +
+ )} + + {section.name === "membersGrid" && ( +
+

Members

+ +
+ )} + + )) +} diff --git a/src/components/AboutItemGrid.astro b/src/components/AboutItemGrid.astro index 14cb84c..7eb9573 100644 --- a/src/components/AboutItemGrid.astro +++ b/src/components/AboutItemGrid.astro @@ -2,236 +2,107 @@ import AboutItem from "../components/AboutItem.astro"; --- -
- -
-
- General public - Projects - Startupers -
-
- Developers - Audit companies - Investors -
+ +
+
+

+ 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. +

+
- - -
-
- -
- - Market stats - - - - Like Crunchbase, but free forever - -
-
+
+
+ +

+ By developing free and open tools,
we empower people to make informed + decisions: +

-
- -
- - Privacy Ranking - - - - Scoring and review of current privacy projects - +
+
+
+
+
-
-
- -
- - Academy - - - Education for general public how to reach privacy - -
-
-
- -
- - Research - - - - Anual reports, Frameworks, Tools, Books - -
-
-
- -
- - Data - - - +
+ + PRIVACY EXPLORER + +
+ For Projects, Use-case list, Market & Funding info
- - -
-
- -
- - Advocacy - - - - Branding “decentralization = privacy” - -
-
-
- -
- - Events - - - - Meetups, Summits, Hackathons, Camps - +
+
+
+
-
-
- -
- - Ecosystems collaboration - - - Networks, Alliances, Media -
-
-
- -
- - Standartisation - - - - Privacy-features, security audit (example) - -
-
-
- -
- - Incubation - - - Product managers facilitation, Business sustainability +
+
+ + HACKATHON IDEA GENERATOR + +
+ Helps developers build applications that address real-world + problems, that people will actually use.
- - -
-
-
- - GENERAL PUBLIC - -
    -
  • Milions of educated users
  • -
  • Higher privacy culture
  • -
+
+
+
+
-
- - PROJECTS +
+
+ + WEEK IN PRIVACY + +
+ Weekly newsletter with round-up of the most important news + happening around privacy in Web3 -
    -
  • Better privacy features
  • -
  • New use-cases
  • -
  • Efficient demos
  • -
-
-
- - SECURITY AUDIT COMPANIES - -
    -
  • New “privacy audit” category
  • -
  • Significant growth of audited projects.
  • -
-
-
-
-
- - DEVELOPERS - -
    -
  • More devs building privacy
  • -
  • More sustainable projects.
  • -
-
-
- - STARTUPERS - -
    -
  • More privacy-oriented projects
  • -
  • Longer runway
  • -
- -
+
+ + + +
+
+

+ We make privacy accessible for everyone, empowering people to learn and + implement best practices effectively. +

+

+ From mentoring at hackathons, guidelines for developers, and the + Cypherpunk Academy - we offer training, incubation, and acceleration + programs. +

+ +
+
+
diff --git a/src/components/EventItem.astro b/src/components/EventItem.astro index 618c9a7..0f3e3a3 100644 --- a/src/components/EventItem.astro +++ b/src/components/EventItem.astro @@ -71,7 +71,7 @@ const eventPoster = getEventPoster(item) } {/*
*/} {item.links?.rsvp && - + }
diff --git a/src/components/EventMasonry.astro b/src/components/EventMasonry.astro new file mode 100644 index 0000000..72fbd84 --- /dev/null +++ b/src/components/EventMasonry.astro @@ -0,0 +1,142 @@ +--- +const { + images = [ + "/events/masonry/1.webp", + "/events/masonry/2.webp", + "/events/masonry/3.webp", + "/events/masonry/4.webp", + "/events/masonry/5.webp", + "/events/masonry/6.webp", + "/events/masonry/7.webp", + "/events/masonry/8.webp", + "/events/masonry/9.webp", + ], +} = Astro.props; +--- + +
+ { + images.slice(0, 4).map((image, index) => ( +
+ {`Image +
+ )) + } +
+ +
+ { + images.slice(4).map((image, index) => ( +
+ {`Image +
+ )) + } +
+ + + + diff --git a/src/components/MembersGrid.astro b/src/components/MembersGrid.astro new file mode 100644 index 0000000..5a00a57 --- /dev/null +++ b/src/components/MembersGrid.astro @@ -0,0 +1,129 @@ +--- +const { people, team } = Astro.props; +// Dummy data for now: +let filteredPeople = [ + { + id: "guy-zyskind", + name: "Guy Zyskind", + caption: + "Founder of [Secret Network](https://scrt.network/), CEO [SCRT Labs](https://www.scrtlabs.com/)", + country: "is", + refs: { + twitter: "GuyZys", + }, + imageUrl: "https://data.web3privacy.info/img/people/guy-zyskind.jpg", + thumbs: { + "64": "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-64px.webp", + "128": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-128px.webp", + "400": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-400px.webp", + }, + }, + { + id: "guy-zyskind", + name: "Guy Zyskind", + caption: + "Founder of [Secret Network](https://scrt.network/), CEO [SCRT Labs](https://www.scrtlabs.com/)", + country: "is", + refs: { + twitter: "GuyZys", + }, + imageUrl: "https://data.web3privacy.info/img/people/guy-zyskind.jpg", + thumbs: { + "64": "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-64px.webp", + "128": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-128px.webp", + "400": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-400px.webp", + }, + }, + { + id: "guy-zyskind", + name: "Guy Zyskind", + caption: + "Founder of [Secret Network](https://scrt.network/), CEO [SCRT Labs](https://www.scrtlabs.com/)", + country: "is", + refs: { + twitter: "GuyZys", + }, + imageUrl: "https://data.web3privacy.info/img/people/guy-zyskind.jpg", + thumbs: { + "64": "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-64px.webp", + "128": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-128px.webp", + "400": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-400px.webp", + }, + }, + { + id: "guy-zyskind", + name: "Guy Zyskind", + caption: + "Founder of [Secret Network](https://scrt.network/), CEO [SCRT Labs](https://www.scrtlabs.com/)", + country: "is", + refs: { + twitter: "GuyZys", + }, + imageUrl: "https://data.web3privacy.info/img/people/guy-zyskind.jpg", + thumbs: { + "64": "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-64px.webp", + "128": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-128px.webp", + "400": + "https://data.web3privacy.info/img/people/thumbs/guy-zyskind-400px.webp", + }, + }, +]; + +// NOTE: Uncomment this if you want to filter people dynamically based upon a specific parameter + +// const filteredPeople = people +// .filter((p) => !team.includes(p.id)) +// .filter((p) => p.imageUrl); + +// Limit the number of members to 12 (2 rows with a max of 6 columns each) +const limitedPeople = filteredPeople.slice(0, 12); + +function personLink(person) { + return person.refs?.twitter + ? `https://twitter.com/${person.refs.twitter}` + : person.refs?.bsky + ? `https://bsky.app/profile/${person.refs.bsky}` + : "#"; +} + +function truncateCaption(caption) { + if (!caption) return ""; + const words = caption.split(" "); + if (words.length > 10) { + return words.slice(0, 20).join(" ") + "..."; + } + return caption; +} +--- + +
+ { + limitedPeople.map((person) => ( +
+ + {person.name} + +
+

{person.name}

+ {person.refs && person.refs.twitter && ( +

@{person.refs.twitter}

+ )} + {/*

{truncateCaption(person.caption)}

*/} +
+
+ )) + } +
diff --git a/src/components/MembershipOtherOptionsWidget.astro b/src/components/MembershipOtherOptionsWidget.astro new file mode 100644 index 0000000..a9eca03 --- /dev/null +++ b/src/components/MembershipOtherOptionsWidget.astro @@ -0,0 +1,176 @@ +
+
+
+

SPONSORSHIP

+
+
+
+
+
+

+ 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. + +
+ + + +
+
+
+
+
+
+
+

DONATE

+
+
+
+
+
+

+ 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. +

+

+ Support our independence, help us to advocate for freedom +

+
+ +
+
+
+
+
+
+

+ SPEAK at our events +

+
+
+
+
+
+

+ At Web3Privacy Now, we are dedicated to fostering growth, + innovation, and collaboration. We offer a supportive environment + where like-minded individuals come together to share knowledge, + spark creativity, and drive positive change. +

+
+
+ +
+
+
+
+
diff --git a/src/components/MembershipWidget.astro b/src/components/MembershipWidget.astro new file mode 100644 index 0000000..b9f3134 --- /dev/null +++ b/src/components/MembershipWidget.astro @@ -0,0 +1,163 @@ +--- +import core from "../core.json"; +--- + +
+
+
+

INDIVIDUAL

+
+
+
+
+
+

+ 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. + +
+ + Benefits + +
    +
  • You are supporting a good thing!
  • +
  • Guaranteed access to all our events
  • +
  • Swag Privacy Pack
  • +
  • Deals from our partners
  • +
  • Voting rights in our association
  • +
+
+
+ +
+
+ Price + + €100 / Year + + +

+ After making your donation, kindly send us the tx hash, your + T-shirt size, and let us know if you would like your membership + to be public or kept private. +

+
+ +
+
+
+
+
+
+
+

+ Organisations +

+
+
+
+
+
+

+ 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. +

+
+
+ + Benefits + +
    +
  • + Greater Exposure +

    + Ensure visibility at all our events [Congresses, Summits & + Hackathons] +

    +
  • +
  • + Access to Talent + +

    Grow impact through strategic, targeted communications.

    +
  • +
  • + Tought Leadership + +

    Participate in speaking engagements and mentorship roles.

    +
  • +
  • + + Deals from our partners + + +

    More details about the deals from our partners.

    +
  • +
  • + Focused Engagement +

    + Reach and interact with specific, highly-relevant audiences. +

    +
  • +
+
+
+
+
+
+ Our membership has multiple tiers ranging from + + 7,000 to 70,000 € / year + + Membership for registered non-profit organizations is + + + 3,000 € / year + +
+ +
+ +
+
+
+
+
+
+
diff --git a/src/components/SliderTestimonial.astro b/src/components/SliderTestimonial.astro new file mode 100644 index 0000000..6828b84 --- /dev/null +++ b/src/components/SliderTestimonial.astro @@ -0,0 +1,176 @@ +--- +const testimonials = [ + { + author: "Matteo", + text: `balance between Transparency and Privacy, accountable and unaccountable, manifest and secret, convex and concave, 1 and 0 is one of the most fun puzzles.`, + imageUrl: "/review.png", + }, + { + author: "Jane", + text: `This platform has opened my eyes to the potential of blockchain technology in a way that I never imagined. The community is vibrant and full of innovation.`, + imageUrl: "/review.png", + }, + { + author: "Alex", + text: `It's amazing to see how much transparency can coexist with privacy, and this is the best representation of how it can work. Great work!`, + imageUrl: "/review.png", + }, +]; + +let currentTestimonial = 0; +--- + +
+
+
+
+ Review Image +
+
+
+

+ {testimonials[currentTestimonial].author}: +

+

+ "{testimonials[currentTestimonial].text}" +

+
+
+
+ + +
+ +
+
+ +
+ +
+ { + testimonials.map((_, index) => ( +
+
+
+ + diff --git a/src/components/SpeakerGrid.astro b/src/components/SpeakerGrid.astro new file mode 100644 index 0000000..91924ea --- /dev/null +++ b/src/components/SpeakerGrid.astro @@ -0,0 +1,49 @@ +--- +const { people, team } = Astro.props; + +// Filter the people and limit the results to 12 +const filteredPeople = people + .filter((p) => !team.includes(p.id)) + .filter((p) => p.imageUrl) + .slice(0, 12); // Limit to the first 12 people + +function personLink(person) { + return person.refs?.twitter + ? `https://twitter.com/${person.refs.twitter}` + : person.refs?.bsky + ? `https://bsky.app/profile/${person.refs.bsky}` + : "#"; +} + +function truncateCaption(caption) { + if (!caption) return ""; + const words = caption.split(" "); + if (words.length > 10) { + return words.slice(0, 20).join(" ") + "..."; + } + return caption; +} +--- + +
+ {filteredPeople.map((person) => ( +
+ + {person.name} + +
+

{person.name}

+ {person.refs && person.refs.twitter && ( +

@{person.refs.twitter}

+ )} +

{truncateCaption(person.caption)}

+
+
+ ))} +
diff --git a/src/layouts/base.astro b/src/layouts/base.astro index 18c93b3..2d6b0c0 100644 --- a/src/layouts/base.astro +++ b/src/layouts/base.astro @@ -151,11 +151,16 @@ function genHeading(str) { banner && typeof banner !== "object" && (
-