Updated the about pages items, footer, grid items, updated the about footer, added images and svgs, updated the config form membership to get involved. Add styles changes, use mono font for the unscramble text effect.

This commit is contained in:
NoobDeveloper412 2024-09-12 09:21:15 +05:00
parent 3a1666ee8e
commit 57138409c1
11 changed files with 678 additions and 352 deletions

13
public/icons/signal.svg Normal file
View file

@ -0,0 +1,13 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_140_218)">
<path
d="M18.24 0.701236L18.78 2.88374C16.6557 3.40615 14.6227 4.24691 12.75 5.37749L11.595 3.44999C13.6587 2.20398 15.8991 1.27725 18.24 0.701236ZM29.76 0.701236L29.22 2.88374C31.3442 3.40615 33.3772 4.24691 35.25 5.37749L36.4125 3.44999C34.3464 2.20329 32.1035 1.27654 29.76 0.701236ZM3.44999 11.595C2.20398 13.6587 1.27725 15.8991 0.701236 18.24L2.88374 18.78C3.40615 16.6557 4.24691 14.6227 5.37749 12.75L3.44999 11.595ZM2.24999 24C2.24926 22.9092 2.33074 21.8198 2.49374 20.7412L0.269986 20.4037C-0.0899954 22.7877 -0.0899954 25.2122 0.269986 27.5962L2.49374 27.2587C2.33074 26.1802 2.24926 25.0908 2.24999 24ZM36.405 44.55L35.25 42.6225C33.3796 43.7524 31.3491 44.5931 29.2275 45.1162L29.7675 47.2987C32.1058 46.722 34.3435 45.7953 36.405 44.55ZM45.75 24C45.7507 25.0908 45.6692 26.1802 45.5062 27.2587L47.73 27.5962C48.09 25.2122 48.09 22.7877 47.73 20.4037L45.5062 20.7412C45.6692 21.8198 45.7507 22.9092 45.75 24ZM47.2987 29.76L45.1162 29.22C44.5938 31.3442 43.7531 33.3772 42.6225 35.25L44.55 36.4125C45.7967 34.3464 46.7234 32.1035 47.2987 29.76ZM27.2587 45.51C25.0984 45.835 22.9016 45.835 20.7412 45.51L20.4037 47.7337C22.7877 48.0937 25.2122 48.0937 27.5962 47.7337L27.2587 45.51ZM41.5087 36.9037C40.2115 38.6606 38.6579 40.2129 36.9 41.5087L38.235 43.32C40.1743 41.8941 41.8884 40.1851 43.32 38.25L41.5087 36.9037ZM36.9 6.49124C38.6582 7.78819 40.2118 9.34175 41.5087 11.1L43.32 9.74999C41.893 7.81602 40.1839 6.10701 38.25 4.67999L36.9 6.49124ZM6.49124 11.1C7.78819 9.34175 9.34175 7.78819 11.1 6.49124L9.74999 4.67999C7.81602 6.10701 6.10701 7.81602 4.67999 9.74999L6.49124 11.1ZM44.55 11.595L42.6225 12.75C43.7524 14.6204 44.5931 16.6508 45.1162 18.7725L47.2987 18.2325C46.722 15.8942 45.7953 13.6564 44.55 11.595ZM20.7412 2.49374C22.9016 2.16871 25.0984 2.16871 27.2587 2.49374L27.5962 0.269986C25.2122 -0.0899954 22.7877 -0.0899954 20.4037 0.269986L20.7412 2.49374ZM7.64624 43.9162L2.99999 45L4.08374 40.3537L1.89374 39.84L0.809986 44.4862C0.722695 44.859 0.731962 45.2479 0.836911 45.616C0.941859 45.9842 1.13902 46.3195 1.40973 46.5902C1.68044 46.861 2.01575 47.0581 2.38393 47.1631C2.75211 47.268 3.14098 47.2773 3.51374 47.19L8.15624 46.125L7.64624 43.9162ZM2.36249 37.8337L4.55249 38.3437L5.30249 35.1225C4.2093 33.2852 3.39421 31.2961 2.88374 29.22L0.701236 29.76C1.1905 31.7484 1.93413 33.6655 2.91374 35.4637L2.36249 37.8337ZM12.8625 42.7087L9.64124 43.4587L10.1512 45.6487L12.5212 45.0975C14.3195 46.0771 16.2365 46.8207 18.225 47.31L18.765 45.1275C16.6932 44.6109 14.7093 43.7908 12.8775 42.6937L12.8625 42.7087ZM24 4.49999C20.5159 4.50179 17.0959 5.43705 14.0957 7.20848C11.0955 8.97992 8.62472 11.5228 6.94032 14.5727C5.25593 17.6226 4.41944 21.0681 4.51787 24.5508C4.61629 28.0336 5.64603 31.4263 7.49999 34.3762L5.62499 42.375L13.6237 40.5C16.182 42.1113 19.0799 43.1056 22.0885 43.4045C25.0971 43.7033 28.134 43.2985 30.9593 42.222C33.7845 41.1455 36.3208 39.4267 38.3676 37.2015C40.4145 34.9764 41.9159 32.3057 42.7532 29.4006C43.5906 26.4954 43.7409 23.4354 43.1924 20.4622C42.6439 17.4889 41.4115 14.684 39.5926 12.2689C37.7738 9.85375 35.4182 7.89467 32.7121 6.54637C30.006 5.19808 27.0234 4.4975 24 4.49999Z"
fill="white" />
</g>
<defs>
<clipPath id="clip0_140_218">
<rect width="48" height="48" fill="white" />
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
public/review.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -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 &nbsp; to preserve it
span.innerHTML = text[t] === ' ' ? '&nbsp;' : 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 &nbsp;
chars[i].innerHTML = text[i] === ' ' ? '&nbsp;' : 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] === ' ' ? '&nbsp;' : 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);

View file

@ -2,114 +2,147 @@
import * as config from "../config.yaml"; import * as config from "../config.yaml";
import core from "../core.json"; import core from "../core.json";
import contributors from "../contributors.json"; import contributors from "../contributors.json";
import { getPersonByGH } from "../lib/core.js"; import SpeakerGrid from "./SpeakerGrid.astro";
import PeopleCarousel from "../components/PeopleCarousel.astro"; import SliderTestimonial from "./SliderTestimonial.astro";
import MembersGrid from "./MembersGrid.astro";
function findPerson(src) { // Accept sectionsConfig as a prop
const p = core.people.find((p) => const {
src.refs?.twitter sectionsConfig = [
? p.refs?.twitter === src.refs.twitter { name: "community", visible: true, order: 1 },
: src.refs?.bsky { name: "socialLinks", visible: true, order: 2 },
? p.refs.bsky === src.refs.bsky { name: "speakers", visible: true, order: 3 },
: {} { name: "core contributors", visible: true, order: 4 },
); { name: "contributors", visible: true, order: 5 },
if (p) { { name: "testimonials", visible: true, order: 6 },
p.ct = src; { name: "membersGrid", visible: true, order: 7 },
} { name: "communityPartners", visible: true, order: 8 },
return p; ],
} } = Astro.props;
function personLink(person) { console.log(sectionsConfig);
return person.refs?.twitter // Function to sort sections by order
? `https://twitter.com/${person.refs.twitter}` const sortedSections = sectionsConfig
: person.refs?.bsky .filter((section) => section.visible)
? `https://bsky.app/profile/${person.refs.bsky}` .sort((a, b) => a.order - b.order);
: "#";
}
--- ---
<!-- <div class="mt-20"> {
<h1><a href="https://docs.web3privacy.info/follow-us">Follow us</a></h1> sortedSections.map((section) => (
<div class="w3pn-wgrid"> <div>
{config.landing.follow.map((item) => ( {section.name === "community" && (
<a href={item.url || core.links[item.link]} target="_blank"> <div class="middle-pane-medium mt-16">
<span><span class="icon" class:list={[item.ico || ""]}></span></span> <h1>
<span class="title">{item.name}</span> <a
<span>{item.text}</span> class="glitch-text"
href="https://docs.web3privacy.info/get-involved"
>
Join the Community
</a> </a>
))} </h1>
</div> <div>{config.landing.community}</div>
</div> </div>
<div class="mt-10"> )}
<h1><a href="https://docs.web3privacy.info/communication">Coordination</a></h1>
<div class="w3pn-wgrid">
{config.landing.coord.map((item) => (
<a href={item.url || core.links[item.link]} target="_blank">
<span><span class="icon" class:list={[item.ico || ""]}></span></span>
<span class="title">{item.name}</span>
<span>{item.text}</span>
</a>
))}
</div>
</div> -->
<div class="mt-16">
<h1>
<a href="https://docs.web3privacy.info/get-involved">Join the Community</a>
</h1>
<div>{config.landing.community}</div>
<h2 class="my-6">Speakers</h2> {section.name === "socialLinks" && (
<div class="flex gap-3 flex-wrap items-center"> <div class="grid place-items-center grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-2 pt-4 w-full">
{ <a
core.people href={core.links.twitter}
.filter((p) => !core.teams["core-team"].includes(p.id)) class="bg-[#101010] w-full flex items-center justify-center w-full h-40 overflow-hidden"
.filter((p) => p.imageUrl) >
.map((person) => ( <button class="flex flex-col items-center justify-center">
<div> <div class="icon twitter" />
<a href={personLink(person)}> @web3privacy
<img </button>
src={person.imageUrl} </a>
title={person.name} <a
class="w-14 rounded-full aspect-square" href={core.links.telegram}
/> class="bg-[#101010] w-full flex items-center justify-center w-full h-40 overflow-hidden"
</a> >
</div> <button class="flex flex-col items-center justify-center">
)) <div class="icon telegram" />
} Telegram
</div> </button>
</a>
<div class="flex gap-3 lg:gap-6 pt-4 flex-wrap mt-4 mb-14"> <a
<a href={core.links.cfp} class="button inverted" href={core.links.signal}
><button>Submit your proposal (CfP)</button></a class="bg-[#101010] w-full flex items-center justify-center w-full h-40 overflow-hidden"
> >
</div> <button class="flex flex-col items-center justify-center">
<div class="icon">
<h2 class="my-6">Git Contributors</h2> <img src="/icons/signal.svg" alt="" />
<div class="flex gap-3 flex-wrap mb-4 items-center"> </div>
{ Signal
// filter(p => !core.teams['core-team'].includes(getPersonByGH(p.login)?.id)) </button>
contributors.items.map((contrib) => ( </a>
<div> <a
<a href={contrib.html_url} target="_blank" title={contrib.login}> href={core.links.matrix}
<img class="bg-[#101010] w-full flex items-center justify-center w-full h-40 overflow-hidden"
src={contrib.avatar_url} >
class="w-14 rounded-full aspect-square" <button class="flex flex-col items-center justify-center">
/> <div class="icon matrix" />
matrix
</button>
</a> </a>
</div> </div>
)) )}
}
</div>
<div class="flex gap-4 lg:gap-6 pt-4 flex-wrap"> {section.name === "speakers" && (
<a href={core.links.telegram} class="button inverted" <div class="middle-pane-medium mt-16">
><button>Telegram</button></a <h1 class="my-6 glitch-text">Speakers</h1>
> <SpeakerGrid people={core.people} team={core.teams["core-team"]} />
<a href={core.links.signal} class="button inverted" </div>
><button>Signal</button></a )}
>
<a href={core.links.matrix} class="button inverted" {section.name === "core contributors" && (
><button>matrix hub</button></a <div class="middle-pane-medium mt-16">
> <h1 class="my-6 glitch-text">Core Contributors</h1>
</div> <SpeakerGrid people={core.people} team={core.teams["core-team"]} />
</div> </div>
)}
{section.name === "contributors" && (
<div class="middle-pane-medium">
<h1 class="my-6 glitch-text">Contributors</h1>
<div class="flex gap-3 flex-wrap mb-4 items-center">
{contributors.items.map((contrib) => (
<div>
<a
href={contrib.html_url}
target="_blank"
title={contrib.login}
>
<img
src={contrib.avatar_url}
class="w-14 rounded-full aspect-square"
/>
</a>
</div>
))}
</div>
<div class="flex gap-4 lg:gap-6 pt-4 flex-wrap">
<a href={core.links.telegram} class="button inverted">
<button>Become a Contributor</button>
</a>
</div>
</div>
)}
{section.name === "testimonials" && (
<div class="middle-pane-medium">
<h1 class="my-6 mt-16 glitch-text">
What People Have To Say About US
</h1>
<SliderTestimonial />
</div>
)}
{section.name === "membersGrid" && (
<div class="middle-pane-medium mt-16">
<h1 class="my-6 glitch-text">Members</h1>
<MembersGrid people={core.people} team={core.teams["core-team"]} />
</div>
)}
</div>
))
}

View file

@ -2,236 +2,137 @@
import AboutItem from "../components/AboutItem.astro"; import AboutItem from "../components/AboutItem.astro";
--- ---
<div> <AboutItem title="RESEARCH" subtext="">
<AboutItem <div class="w-full">
title="AUDIENCES" <div class="flex flex-col gap-[8px]">
subtext="For all of them we are building private platform to discuss and build privavy tooling and research" <p>
> We cultivate and foster a culture of privacy in web3 making data free
<div class="w-full grid grid-cols-2"> and public.
<div class="flex flex-col gap-[8px] text-white font-bold"> </p>
<span> General public </span> <p>
<span> Projects </span> Check our annual reports, infographics, privacy awards, newsletter, and
<span> Startupers</span> guidelines.
</div> </p>
<div class="flex flex-col gap-[8px] text-white font-bold"> <a class="button inverted"><button>web3privacy Research</button></a>
<span> Developers </span>
<span> Audit companies </span>
<span> Investors</span>
</div>
</div> </div>
</AboutItem> </div>
<AboutItem </AboutItem>
title="PLATFORM" <AboutItem title="PROJECTS & TOOLS PRODUCTION" subtext="">
subtext="We need to create activation points, that will push community around privacy forward and establish new connections" <p class="mb-5">
> By developing free and open tools, <br /> we empower people to make informed
<div class="flex flex-col gap-[8px] items-start"> decisions:
<div class="flex gap-[12px] md:items-center items-start w-full"> </p>
<img src="/icons/query_stats.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span
class="font-bold text-white leading-[1rem] w-full max-w-[110px]"
>
Market stats
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Like Crunchbase, but free forever
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full"> <div class="flex flex-col gap-5">
<img src="/icons/star_half.svg" class="inline-block" /> <div class="flex gap-[12px] md:items-center items-start w-full">
<div <div class="flex flex-row space-x-5 w-full">
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full" <div>
> <img src="/icons/database.svg" class="inline-block" />
<span
class="font-bold text-white leading-[1rem] w-full max-w-[140px]"
>
Privacy Ranking
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Scoring and review of current privacy projects
</span>
</div> </div>
</div> <div>
<div class="flex gap-[12px] md:items-center items-start w-full"> <div class="flex items-center flex-nowrap space-x-5">
<img src="/icons/school.svg" class="inline-block" /> <span class="font-bold text-white"> PRIVACY EXPLORER </span>
<div </div>
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full" <span class="text-[1rem] mt-0 w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Academy
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full"
>Education for general public how to reach privacy
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/experiment.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Research
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Anual reports, Frameworks, Tools, Books
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/database.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Data
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full"
>For Projects, Use-case list, Market & Funding info >For Projects, Use-case list, Market & Funding info
</span> </span>
</div> </div>
</div> </div>
</div> </div>
</AboutItem>
<AboutItem
title="ACTIVATIONS"
subtext="With all of that we want to focus everybody more in web3 related privacy issues, those are our estimates and long-term goals"
>
<div class="flex flex-col gap-[8px] items-start">
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/visibility_lock.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit">
Advocacy
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Branding “decentralization = privacy”
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full"> <div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/calendar_today.svg" class="inline-block" /> <div class="flex flex-row space-x-5 w-full">
<div <div>
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full" <img src="/icons/database.svg" class="inline-block" />
>
<span class="font-bold text-white leading-[1rem] w-fit">
Events
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Meetups, Summits, Hackathons, Camps
</span>
</div> </div>
</div> <div>
<div class="flex gap-[12px] md:items-center items-start w-full"> <div class="flex items-center flex-nowrap space-x-5">
<img src="/icons/group_work.svg" class="inline-block" /> <span class="font-bold text-white w-fit">
<div HACKATHON IDEA GENERATOR
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full" </span>
> </div>
<span <span class="text-[1rem] mt-0 w-full"
class="font-bold text-white leading-[1rem] w-full max-w-[220px]" >Helps developers build applications that address real-world
> problems, that people will actually use.
Ecosystems collaboration
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full"> Networks, Alliances, Media </span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/encrypted.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Standartisation
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Privacy-features, security audit (example)
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/local_florist.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Incubation
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full"
>Product managers facilitation, Business sustainability
</span> </span>
</div> </div>
</div> </div>
</div> </div>
</AboutItem> <div class="flex gap-[12px] md:items-center items-start w-full">
<AboutItem variant="secondary" title="GOALS"> <div class="flex flex-row space-x-5 w-full">
<div class="flex md:flex-row flex-col gap-[32px]"> <div>
<div class="flex flex-col gap-[16px]"> <img src="/icons/database.svg" class="inline-block" />
<div class="flex flex-col gap-[4px]">
<span class="font-bold text-white my-2 leading-[1rem] uppercase">
GENERAL PUBLIC
</span>
<ul class="list-decimal ml-[18px]">
<li>Milions of educated users</li>
<li>Higher privacy culture</li>
</ul>
</div> </div>
<div class="flex flex-col gap-[4px]"> <div>
<span class="font-bold text-white my-2 leading-[1rem] uppercase"> <div class="flex items-center flex-nowrap space-x-5">
PROJECTS <span class="font-bold text-white w-fit"> WEEK IN PRIVACY </span>
</div>
<span class="text-[1rem] mt-0 w-full"
>Weekly newsletter with round-up of the most important news
happening around privacy in Web3
</span> </span>
<ul class="list-decimal ml-[18px]">
<li>Better privacy features</li>
<li>New use-cases</li>
<li>Efficient demos</li>
</ul>
</div>
<div class="flex flex-col gap-[4px]">
<span class="font-bold text-white my-2 leading-[1rem] uppercase">
SECURITY AUDIT COMPANIES
</span>
<ul class="list-decimal ml-[18px]">
<li>New “privacy audit” category</li>
<li>Significant growth of audited projects.</li>
</ul>
</div>
</div>
<div class="flex flex-col gap-[16px]">
<div class="flex flex-col gap-[4px]">
<span class="font-bold text-white mb-2 mt-0 leading-[1rem] uppercase">
DEVELOPERS
</span>
<ul class="list-decimal ml-[18px] w-full">
<li>More devs building privacy</li>
<li>More sustainable projects.</li>
</ul>
</div>
<div class="flex flex-col gap-[4px] w-full">
<span class="font-bold text-white my-2 leading-[1rem] uppercase">
STARTUPERS
</span>
<ul class="list-decimal ml-[18px]">
<li>More privacy-oriented projects</li>
<li>Longer runway</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</AboutItem> </div>
</div>
<!-- <div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/star_half.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-full max-w-[140px]">
Privacy Ranking
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Scoring and review of current privacy projects
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/school.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Academy
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full"
>Education for general public how to reach privacy
</span>
</div>
</div>
<div class="flex gap-[12px] md:items-center items-start w-full">
<img src="/icons/experiment.svg" class="inline-block" />
<div
class="flex md:flex-row flex-col md:items-center md:gap-[12px] w-full"
>
<span class="font-bold text-white leading-[1rem] w-fit max-w-[140px]">
Research
</span>
<span class="md:block hidden">-</span>
<span class="text-[1rem] w-full">
Anual reports, Frameworks, Tools, Books
</span>
</div>
</div> -->
</AboutItem>
<AboutItem title="EDUCATION" subtext="">
<div class="w-full">
<div class="flex flex-col gap-[8px]">
<p>
We make privacy accessible for everyone, empowering people to learn and
implement best practices effectively.
</p>
<p>
From mentoring at hackathons, guidelines for developers, and the
Cypherpunk Academy - we offer training, incubation, and acceleration
programs.
</p>
<a class="button inverted"><button>Privacy Academy</button></a>
</div>
</div>
</AboutItem>

View file

@ -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;
---
<div class="w-full mx-auto px-8 border-2 border-[#202020]">
<div class="relative testimonial-fade active" id="testimonial-container">
<div class="flex items-center justify-center overflow-hidden">
<div>
<img
src={testimonials[currentTestimonial].imageUrl}
class="grayscale"
alt="Review Image"
id="testimonial-image"
/>
</div>
<div class="relative lg:w-9/12">
<div class="relative py-12 px-8 text-gray-700 leading-relaxed">
<h2 class="font-bold" id="testimonial-author">
{testimonials[currentTestimonial].author}:
</h2>
<p class="leading-tight" id="testimonial-text">
"{testimonials[currentTestimonial].text}"
</p>
</div>
</div>
</div>
<!-- Navigation Buttons -->
<div class="absolute inset-y-0 left-0 lg:flex lg:items-center">
<button
class="mt-24 lg:mt-0 -ml-6 h-12 w-12 rounded-full p-3 shadow-lg"
id="prev-button"
>
<svg
class="h-full w-full text-white"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
d="M5.41 11H21a1 1 0 0 1 0 2H5.41l5.3 5.3a1 1 0 0 1-1.42 1.4l-7-7a1 1 0 0 1 0-1.4l7-7a1 1 0 0 1 1.42 1.4L5.4 11z"
></path>
</svg>
</button>
</div>
<div class="absolute inset-y-0 right-0 lg:flex lg:items-center">
<button
class="mt-24 lg:mt-0 -mr-6 h-12 w-12 rounded-full p-3 shadow-lg"
id="next-button"
>
<svg
class="h-full w-full text-white"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
d="M18.59 13H3a1 1 0 0 1 0-2h15.59l-5.3-5.3a1 1 0 1 1 1.42-1.4l7 7a1 1 0 0 1 0 1.4l-7 7a1 1 0 0 1-1.42-1.4l5.3-5.3z"
></path>
</svg>
</button>
</div>
<div
class="absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2"
>
{
testimonials.map((_, index) => (
<button
class={`h-3 w-3 rounded-full ${index === currentTestimonial ? "bg-white" : "bg-transparent border"}`}
id={`dot-${index}`}
/>
))
}
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
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;
const container = document.getElementById("testimonial-container");
const authorElement = document.getElementById("testimonial-author");
const textElement = document.getElementById("testimonial-text");
const imageElement = document.getElementById("testimonial-image");
const dots = testimonials.map((_, index) =>
document.getElementById(`dot-${index}`)
);
function showTestimonial(index) {
currentTestimonial = index;
const testimonial = testimonials[currentTestimonial];
// Add fade-out class before changing the content
container.classList.remove("active");
setTimeout(() => {
// Update content after fade-out
authorElement.innerText = testimonial.author;
textElement.innerText = `"${testimonial.text}"`;
imageElement.src = testimonial.imageUrl;
// Add fade-in class
container.classList.add("active");
}, 500); // Match with the CSS transition duration
// Update dots
dots.forEach((dot, i) => {
if (i === currentTestimonial) {
dot.classList.add("bg-white");
dot.classList.remove("bg-transparent", "border");
} else {
dot.classList.remove("bg-white");
dot.classList.add("bg-transparent", "border");
}
});
}
document.getElementById("prev-button").addEventListener("click", () => {
showTestimonial(
(currentTestimonial - 1 + testimonials.length) % testimonials.length
);
});
document.getElementById("next-button").addEventListener("click", () => {
showTestimonial((currentTestimonial + 1) % testimonials.length);
});
dots.forEach((dot, index) => {
dot.addEventListener("click", () => {
showTestimonial(index);
});
});
// Automatically change testimonial every 6 seconds
setInterval(() => {
showTestimonial((currentTestimonial + 1) % testimonials.length);
}, 6000);
});
</script>

View file

@ -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;
}
---
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 gap-4">
{filteredPeople.map((person) => (
<div
class="max-w-xs w-full h-[340px] bg-transparent overflow-hidden p-1 space-y-1 mb-2"
>
<a href={personLink(person)}>
<img
src={person.imageUrl}
alt={person.name}
class="w-full h-48 object-cover"
/>
</a>
<div class="mt-4">
<h3 class="text-lg font-bold">{person.name}</h3>
{person.refs && person.refs.twitter && (
<p class="text-sm text-gray-500">@{person.refs.twitter}</p>
)}
<p class="text-sm">{truncateCaption(person.caption)}</p>
</div>
</div>
))}
</div>

View file

@ -22,7 +22,7 @@ header:
link: news link: news
- name: Docs - name: Docs
link: docs link: docs
- name: Membership - name: Get Involved
link: membership link: membership
url: /membership url: /membership
#- name: Manifesto #- name: Manifesto

View file

@ -155,7 +155,9 @@ function genHeading(str) {
<div class="text-left mt-10">{config.hero.text}</div> <div class="text-left mt-10">{config.hero.text}</div>
<div class="mt-6"> <div class="mt-6">
<a class="button" href="/about"> <a class="button" href="/about">
<button>About Web3Privacy Now</button> <button>
<strong>About US</strong>
</button>
</a> </a>
</div> </div>
</div> </div>
@ -167,7 +169,6 @@ function genHeading(str) {
<> <>
<div class="middle-pane-medium mt-8 sm:mt-14 mb-2 sm:mb-8"> <div class="middle-pane-medium mt-8 sm:mt-14 mb-2 sm:mb-8">
<div class="leading-none flex justify-center text-[4px] sm:text-[8px] text-white"> <div class="leading-none flex justify-center text-[4px] sm:text-[8px] text-white">
{/*<img src="/page-events.png" class="h-8 sm:h-14" title="Events" />*/}
<pre> <pre>
<code class="font-mono layout-heading "> <code class="font-mono layout-heading ">
{genHeading(title)} {genHeading(title)}
@ -176,7 +177,7 @@ function genHeading(str) {
</div> </div>
</div> </div>
<div class="flex items-center justify-center w-full text-center"> <div class="flex items-center justify-center w-full text-center">
<h3 class=" w-full max-w-[938px]">{subtext}</h3> <h3 class=" w-full max-w-[938px] glitch-text">{subtext}</h3>
</div> </div>
</> </>
) )
@ -188,40 +189,79 @@ function genHeading(str) {
<div <div
class="border border-t-2 border-b-0 border-l-0 border-r-0 border-[#0f0f0f] mt-20 pt-10 pb-10" class="border border-t-2 border-b-0 border-l-0 border-r-0 border-[#0f0f0f] mt-20 pt-10 pb-10"
> >
<div class="middle-pane-big"> <div
<div class="flex mx-6 gap-10 text-lg items-center flex-wrap align-top"
class="flex gap-10 text-lg items-center flex-wrap align-top" id="footerMenu"
id="footerMenu" >
> <a href="/" class="w3pn-logo w-52"></a>
<a href="/" class="w3pn-logo w-32"></a> <div class="text-md">
<div class="text-md"> <a
<a href="https://github.com/web3privacy/web"
href="https://github.com/web3privacy/web" class="text-white hover:underline">v{pkg.version}</a
class="text-white hover:underline">v{pkg.version}</a >
> </div>
</div> </div>
<div class="grow flex sm:justify-end">
<div class="sm:flex justify-center flex-wrap gap-4 lg:gap-10"> <div class="flex justify-between">
{ <div class="mx-6 py-10 text-center md:text-left">
config.footer.menu.map((item) => ( <div class="grid-1 grid gap-8 md:grid-cols-2 lg:grid-cols-3">
<div class="flex gap-4 items-center menuItem lg:mb-0 mb-2"> <div class="">
<div <p class="mb-4">
class="icon small opacity-50" <a href="#!">Manifesto</a>
class:list={[item.ico]} </p>
/> <p class="mb-4">
<div class="text-white hover:underline"> <a href="#!">How to get involved?</a>
<a href={item.url || core.links[item.link]}> </p>
{item.title} <p class="mb-4">
</a> <a href="#!">Grants / Support Us</a>
</div> </p>
</div> </div>
)) <div>
} <p class="mb-4">
<a href="#!">Events</a>
</p>
<p class="mb-4">
<a href="#!">Articles</a>
</p>
<p class="mb-4">
<a href="#!">Talks</a>
</p>
</div>
<div>
<p class="mb-4">
<a href="/#">Privacy Explorer</a>
</p>
<p class="mb-4">
<a href="/#">Privacy use-cases database</a>
</p>
</div> </div>
</div> </div>
</div> </div>
<div class="py-10 md:text-left">
<div class="grid-1 grid gap-4 md:grid-cols-2 lg:grid-cols-5">
{
config.footer.menu.map((item) => (
<div>
<p class="mb-4">
<a href={item.url || core.links[item.link]}>{item.title}</a>
</p>
</div>
))
}
</div>
</div>
</div>
<!--Copyright section-->
<div class="bg-black/5 p-6 text-start">
<a class="font-semibold" href="https://tw-elements.com/"
>All rights not reserved, Creative commons 2024 - Web3Privacy z.s.</a
>
</div> </div>
</div> </div>
<!-- Load TextScramble.js -->
<script src="/scripts/text-scramble.js" type="module"></script>
<script> <script>
document.querySelector(".hamburger").addEventListener("click", () => { document.querySelector(".hamburger").addEventListener("click", () => {
document.querySelector(".nav-links").classList.toggle("expanded"); document.querySelector(".nav-links").classList.toggle("expanded");

View file

@ -101,7 +101,7 @@ for (const e of upcomingEvents) {
<div class="mt-[26px]"> <div class="mt-[26px]">
<h1 class="glitch-text">why privacy</h1> <h1 class="glitch-text">why privacy</h1>
<p class="mt-0 glitch-text w-full"> <p class="mt-0 w-full">
In any society, privacy is essential for protecting civil liberties In any society, privacy is essential for protecting civil liberties
and human rights. and human rights.
<br /> <br />

View file

@ -28,13 +28,28 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }
/* Add animation */
.testimonial-fade {
opacity: 0;
transition: opacity 0.2s ease-in-out;
}
.testimonial-fade.active {
opacity: 1;
}
.glitch-text {
font-family: Major Mono Display, ui-monospace, SFMono-Regular, Menlo, Monaco,
Consolas, "Liberation Mono", "Courier New", monospace;
}
@tailwind components; @tailwind components;
@layer components { @layer components {
body, p, div { body, p, div {
@apply text-[#909090] leading-8; @apply text-[#C0C0C0] leading-8;
} }
h1, h2, h3, h4 { h1, h2, h3, h4 {
@ -58,7 +73,7 @@
} }
#intro { #intro {
background-image: url(/hp-bg.webp); background-image: url(/hp-bg-redesign.webp);
background-repeat: repeat; background-repeat: repeat;
background-color: #0f0f0f; background-color: #0f0f0f;
background-position: center; background-position: center;