new design

This commit is contained in:
tree🌴 2023-04-25 07:45:35 +02:00
parent 29b0bacddc
commit 9f37c73cd6
38 changed files with 483 additions and 325 deletions

View file

@ -1,4 +1,5 @@
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Mono:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=DM+Mono:wght@300;400;500&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Major+Mono+Display:wght@400&display=swap');
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@ -6,16 +7,20 @@
@layer components { @layer components {
body { body {
@apply bg-[#0d1117]; @apply bg-black;
} }
* { * {
@apply font-mono; @apply font-mono font-light;
}
#header-shade {
@apply h-16 bg-gradient-to-b from-black to-transparent;
} }
footer a, footer a,
.markdown a { .markdown a {
@apply underline hover:no-underline; @apply underline hover:no-underline text-white;
} }
.markdown p { .markdown p {
@ -26,36 +31,38 @@
} }
.middle-pane-medium { .middle-pane-medium {
@apply max-w-7xl mx-auto px-4 xl:px-0; @apply max-w-7xl mx-auto px-6 xl:px-0;
} }
.middle-pane-big { .middle-pane-big {
@apply max-w-screen-2xl mx-auto px-6 2xl:px-0; @apply max-w-screen-2xl mx-auto px-6 2xl:px-0;
} }
.button { .button {
@apply px-3 py-1.5 text-black bg-white border border-black cursor-pointer; /*@apply px-3 py-1.5 text-black bg-white border border-black cursor-pointer;*/
@apply px-5 py-2 text-white bg-black border border-white cursor-pointer no-underline;
} }
.button:hover, .button-inactive { .button:hover,
@apply text-white bg-black border border-white; .button-inactive {
@apply text-black bg-white border border-black no-underline;
} }
.button:hover.button-inactive { .button:hover.button-inactive {
@apply cursor-default text-gray-600 border-gray-600; @apply cursor-default text-gray-600 border-gray-600;
} }
.button-inverse { .button-inverse {
@apply px-3 py-1.5 text-white bg-black border border-black cursor-pointer; @apply px-5 py-2 text-white bg-black border border-black cursor-pointer;
} }
.button-inverse:hover { .button-inverse:hover {
@apply text-black bg-white border border-black; @apply text-black bg-white border border-black;
} }
.section-header { .section-header {
@apply text-3xl md:text-5xl mb-8 md:mb-16 font-bold pt-10; @apply inline-block font-mono2 lowercase text-xl md:text-3xl mb-8 md:mb-16 font-light pt-4 mt-6 border-t-2;
} }
.section-subheader { .section-subheader {
@apply text-3xl font-bold mb-4 md:mb-8; @apply text-2xl font-mono2 lowercase mb-4 md:mb-8;
} }
.text-mild { .text-mild {
@apply text-white/70; @apply text-[#909090];
} }
.text-supermild { .text-supermild {
@apply text-white/40; @apply text-white/40;
@ -79,7 +86,7 @@
@apply text-black; @apply text-black;
} }
.table-custom td { .table-custom td {
@apply border border-b-0 border-l-0 border-r-0 border-gray-600; /*@apply border border-b-0 border-l-0 border-r-0 border-gray-800;*/
} }
.table-custom td.time { .table-custom td.time {
@apply text-sm; @apply text-sm;
@ -87,22 +94,71 @@
.external::after { .external::after {
padding-left: 10px; padding-left: 10px;
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13.5' height='13.5' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='white' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E"); content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='11' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='white' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E");
}
.darker .external::after {
padding-left: 10px;
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='11' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='%23999999' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E");
} }
.external.external-mild::after { .external.external-mild::after {
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13.5' height='13.5' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='silver' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E"); content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='silver' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E");
} }
.person-item:hover img { .person-item:hover img {
@apply grayscale-0 invert-0 blur-none; @apply grayscale-0 invert-0 blur-none;
} }
.person-item:hover .text-mild, person-item:hover .text-mild,
.person-item:hover .text-supermild, .person-item:hover .text-supermild {
.topic-item:hover .text-mild,
.topic-item:hover .text-supermild {
@apply text-black; @apply text-black;
} }
.eligible .text-mild { .eligible .text-mild {
@apply text-black; @apply text-black;
} }
.darker {
@apply text-[#999999];
}
#intro {
background-image: url(/bg.webp);
background-repeat: no-repeat;
background-size: cover;
background-color: black;
background-position: center;
}
.faq-item:hover .desc {
@apply text-white;
}
.topic-item:hover .topic-header {
@apply bg-white text-black;
}
.topic-item:hover .markdown {
@apply text-white;
}
.topic-img {
@apply inline-block w-5/6 mb-6;
}
.ticket-item {
position: relative;
}
.ticket-item .ticket-img {
z-index: -1;
position: absolute;
right: 0;
bottom: 0;
width: 16em;
height: 16em;
background-image: url(/ticket-full.png);
background-repeat: no-repeat;
background-size: cover;
background-color: black;
}
.ticket-item.party .ticket-img {
background-image: url(/ticket-party.png);
}
.ticket-item:hover .ticket-img {
filter: invert(100%);
}
} }

View file

@ -20,23 +20,23 @@
} }
</script> </script>
<div class="grid gap-4 grid-cols-2 md:grid-cols-3 lg:grid-cols-5">
{#each items.map(getPerson) as item} {#each items.map(getPerson) as item}
<div <div class="border hover:bg-white hover:text-black person-item" on:mouseenter={animateSpeaker}>
class="hover:bg-white hover:text-black p-2 {size === 'small'
? 'w-2/3 sm:w-48'
: 'w-2/3 sm:w-64'} person-item"
on:mouseenter={animateSpeaker}
>
<div> <div>
<img src="/people/{item.img}" class="grayscale invert aspect-square object-cover w-full" /> <img src="/people/{item.img}" class="grayscale invert aspect-square object-cover w-full" />
</div> </div>
<div class="mt-4 speaker-name animate-speaker text-xl">{item.name.toUpperCase()}</div> <div class="pb-3.5 px-5">
<div class="text-lg text-mild"> <div class="mt-4 speaker-name animate-speaker">{item.name.toUpperCase()}</div>
<a href={twitterLink(item.twitter)} class="hover:underline animate-speaker">@{item.twitter}</a <div class="text-mild">
<a href={twitterLink(item.twitter)} class="hover:underline animate-speaker"
>@{item.twitter}</a
> >
</div> </div>
{#if item.caption} {#if item.caption}
<div class="mt-2 text-base text-supermild"><SvelteMarkdown source={item.caption} /></div> <div class="mt-2 text-sm text-supermild"><SvelteMarkdown source={item.caption} /></div>
{/if} {/if}
</div> </div>
</div>
{/each} {/each}
</div>

View file

@ -1,120 +1,131 @@
<script> <script>
import { browser } from '$app/environment'; import { browser } from '$app/environment';
import { configureChains, createClient, disconnect, signMessage, getAccount } from '@wagmi/core' import { configureChains, createClient, disconnect, signMessage, getAccount } from '@wagmi/core';
import { arbitrum, mainnet, polygon, optimism, gnosis } from '@wagmi/core/chains' import { arbitrum, mainnet, polygon, optimism, gnosis } from '@wagmi/core/chains';
import { EthereumClient, modalConnectors, walletConnectProvider } from '@web3modal/ethereum' import { EthereumClient, modalConnectors, walletConnectProvider } from '@web3modal/ethereum';
import { Web3Modal } from '@web3modal/html' import { Web3Modal } from '@web3modal/html';
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
import SvelteMarkdown from 'svelte-markdown'; import SvelteMarkdown from 'svelte-markdown';
import { animateText, animateSection } from '$lib/helpers'; import { animateText, animateSection } from '$lib/helpers';
export let data; export let data;
const projectId = '43a2f1e1b1753e7d4e628b5a1827d319' const projectId = '43a2f1e1b1753e7d4e628b5a1827d319';
const chains = [mainnet, arbitrum, optimism, polygon, gnosis] const chains = [mainnet, arbitrum, optimism, polygon, gnosis];
const redeemUrl = 'https://tickets.web3privacy.info/w3ps1/redeem?voucher=' const redeemUrl = 'https://tickets.web3privacy.info/w3ps1/redeem?voucher=';
const badges = data.badges const badges = data.badges;
let web3Modal let web3Modal;
let enable = () => init() let enable = () => init();
let disable let disable;
let userBadges = null let userBadges = null;
let claimed = {} let claimed = {};
const web3store = writable({}) const web3store = writable({});
$: connected = $web3store.isConnected $: connected = $web3store.isConnected;
$: selectedAccount = $web3store.address $: selectedAccount = $web3store.address;
async function checkBadges(addr) { async function checkBadges(addr) {
const resp = await fetch(`${data.config.badgesApiUrl}/account/${addr}`) const resp = await fetch(`${data.config.badgesApiUrl}/account/${addr}`);
return resp.json() return resp.json();
} }
async function init() { async function init() {
const { provider } = configureChains(chains, [walletConnectProvider({ projectId })]);
const { provider } = configureChains(chains, [walletConnectProvider({ projectId })])
const wagmiClient = createClient({ const wagmiClient = createClient({
autoConnect: false, autoConnect: false,
connectors: [...modalConnectors({ appName: 'web3Modal', chains })], connectors: [...modalConnectors({ appName: 'web3Modal', chains })],
provider provider
})
const ethereumClient = new EthereumClient(wagmiClient, chains)
disable = async () => {
await disconnect()
userBadges = {}
web3store.set({})
}
enable = async () => {
await web3Modal.openModal()
}
web3Modal = new Web3Modal({ projectId }, ethereumClient)
await web3Modal.openModal()
const unsubscribe = web3Modal.subscribeModal(async (newState) => {
const account = getAccount()
web3store.set(account)
claimed = {}
userBadges = await checkBadges(account.address)
}); });
} const ethereumClient = new EthereumClient(wagmiClient, chains);
disable = async () => {
await disconnect();
userBadges = {};
web3store.set({});
};
enable = async () => {
await web3Modal.openModal();
};
web3Modal = new Web3Modal({ projectId }, ethereumClient);
await web3Modal.openModal();
const unsubscribe = web3Modal.subscribeModal(async (newState) => {
const account = getAccount();
web3store.set(account);
claimed = {};
userBadges = await checkBadges(account.address);
});
}
function claimHandler(badgeId) { function claimHandler(badgeId) {
return async () => { return async () => {
const badge = badges.find(b => b.id === badgeId) const badge = badges.find((b) => b.id === badgeId);
const addr = selectedAccount const addr = selectedAccount;
claimed[badgeId] = {} claimed[badgeId] = {};
const msg = `I want to get a discount on a ticket to Web3Privacy Prague 2023. My address is "${addr}" and I own "${badge.name}". ${new Date().toISOString()}` const msg = `I want to get a discount on a ticket to Web3Privacy Prague 2023. My address is "${addr}" and I own "${
badge.name
}". ${new Date().toISOString()}`;
let signature; let signature;
try { try {
signature = await signMessage({ message: msg }) signature = await signMessage({ message: msg });
} catch (e) { } catch (e) {
claimed[badgeId] = null; claimed[badgeId] = null;
return; return;
} }
if (!signature) { if (!signature) {
return null return null;
} }
claimed[badgeId] = { text: "Wait for the voucher to be generated from our ticketing system .." } claimed[badgeId] = {
text: 'Wait for the voucher to be generated from our ticketing system ..'
};
const query = { const query = {
addr, addr,
badgeId, badgeId,
msg, msg,
signature signature
} };
console.log(query) console.log(query);
const resp = await fetch(`${data.config.badgesApiUrl}/claim`, { const resp = await fetch(`${data.config.badgesApiUrl}/claim`, {
method: "POST", method: 'POST',
headers: { "Content-Type": "application/json" }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(query) body: JSON.stringify(query)
}) });
const res = await resp.json() const res = await resp.json();
claimed[badgeId] = { claimed[badgeId] = {
claimed: true, claimed: true,
voucher: res.voucher, voucher: res.voucher,
res res
};
};
} }
}
}
</script> </script>
{#if !connected} {#if !connected}
<div class="buttons"> <div class="buttons">
<button class="button is-link is-light" on:click={enable} on:mouseenter={(ev) => animateText(ev, 15)}>Connect using Web3 wallet</button> <button
class="button is-link is-light"
on:click={enable}
on:mouseenter={(ev) => animateText(ev, 15)}>Connect using Web3 wallet</button
>
</div>
<div class="text-supermild mt-4 text-base">
Once connected, you will see what discount you are entitled to - based on ownership of the
specific ZK Badges or SBT tokens.
</div> </div>
<div class="text-supermild mt-4 text-lg md:w-4/5 mx-auto">Once connected, you will see what discount you are entitled to - based on ownership of the specific ZK Badges or SBT tokens.</div>
{/if} {/if}
{#if connected} {#if connected}
<div> <div>
Connected as: <span class="font-bold">{selectedAccount}</span> Connected as: <span class="font-bold">{selectedAccount}</span>
<button class="button is-link is-light inline-block cursor-pointer" on:click={disable} on:mouseenter={animateText}>disconnect</button> <button
class="button is-link is-light inline-block cursor-pointer"
on:click={disable}
on:mouseenter={animateText}>disconnect</button
>
</div> </div>
<!--<p>Connected chain: chainId = {$chainId}</p> <!--<p>Connected chain: chainId = {$chainId}</p>
<p>Selected account: {$selectedAccount || 'not defined'</p> <p>Selected account: {$selectedAccount || 'not defined'</p>
@ -127,54 +138,97 @@
<div class="w-full mt-16"> <div class="w-full mt-16">
<div class="m-auto"> <div class="m-auto">
<div class="text-2xl font-bold mb-10" on:mouseenter={animateText}>Eligible ZK Badges / SBTs</div> <div class="text-xl font-mono2 lowercase mb-10" on:mouseenter={animateText}>
<div class="pb-8 lg:w-2/3 xl:w-2/3 mx-auto"> Eligible ZK Badges / SBTs
</div>
<div class="pb-8">
{#if connected && userBadges === null} {#if connected && userBadges === null}
<div>Loading ...<br><br>If you have any problems, please contact us in the public Signal group</div> <div>
Loading ...<br /><br />If you have any problems, please contact us in the public Signal
group
</div>
{:else} {:else}
{#each badges as badge} {#each badges as badge}
<div class="lg:flex justify-center mb-10 badge {userBadges?.badges && userBadges?.badges[badge?.id]?.eligible ? 'bg-white text-black eligible' : 'bg-[#0d1117]'} p-4" on:mouseenter={animateSection(30)}> <div
<div class="w-28 lg:w-40 mr-6 inline-block xl:block"><img src={badge.img} class="w-full {connected && userBadges && userBadges.badges[badge.id]?.eligible ? '' : 'grayscale'} badge-image" /></div> class="lg:flex justify-center mb-4 badge {userBadges?.badges &&
userBadges?.badges[badge?.id]?.eligible
? 'bg-white text-black eligible'
: 'border border-gray-800'} p-6"
on:mouseenter={animateSection(30)}
>
<div class="w-24 lg:w-32 mr-6 inline-block xl:block">
<img
src={badge.img}
class="w-full {connected && userBadges && userBadges.badges[badge.id]?.eligible
? ''
: 'grayscale'} badge-image"
/>
</div>
<div class="lg:text-left w-full"> <div class="lg:text-left w-full">
{#if badge.shortname}<div class="uppercase font-bold">{badge.shortname}</div>{/if} {#if badge.shortname}<div class="uppercase font-bold">{badge.shortname}</div>{/if}
<div class="{badge.shortname ? '' : 'font-bold'}"> <div class={badge.shortname ? '' : 'font-bold'}>
<a href={badge.url} target="_blank" class="external animate-section">{badge.name}</a> <a href={badge.url} target="_blank" class="external animate-section">{badge.name}</a
>
</div>
<div class="mt-2">
Price: <span class="font-bold"
>€{data.config.ticketBasePrice -
data.config.ticketBasePrice * (badge.discount / 100)}</span
>
({badge.discount}% discount)
</div> </div>
<div class="text-xl">Price: <span class="font-bold">{data.config.ticketBasePrice - data.config.ticketBasePrice*(badge.discount/100)}</span> ({badge.discount}% discount)</div>
{#if connected && userBadges} {#if connected && userBadges}
<div class="pt-2"> <div class="pt-2">
{#if claimed[badge.id]} {#if claimed[badge.id]}
{#if claimed[badge.id].voucher} {#if claimed[badge.id].voucher}
Your personal voucher: <a href="{redeemUrl+claimed[badge.id].voucher}" target="_blank" class="underline hover:no-underline external">{claimed[badge.id].voucher}</a> Your personal voucher: <a
href={redeemUrl + claimed[badge.id].voucher}
target="_blank"
class="underline hover:no-underline external">{claimed[badge.id].voucher}</a
>
<div class="pt-2"> <div class="pt-2">
<a href="{redeemUrl+claimed[badge.id].voucher}" target="_blank"><button class="button-inverse" on:mouseenter={(ev) => animateText(ev, 15)}>Buy ticket using voucher</button></a> <a href={redeemUrl + claimed[badge.id].voucher} target="_blank"
><button
class="button-inverse"
on:mouseenter={(ev) => animateText(ev, 15)}
>Buy ticket using voucher</button
></a
>
</div> </div>
{:else} {:else}
{claimed[badge.id].text || 'Please sign message in your wallet ..'} {claimed[badge.id].text || 'Please sign message in your wallet ..'}
{/if} {/if}
{:else if userBadges.badges[badge.id]?.eligible}
<button
class="button-inverse"
on:click={claimHandler(badge.id)}
on:mouseenter={(ev) => animateText(ev, 15)}>Eligible! Get discount!</button
>
{:else} {:else}
{#if userBadges.badges[badge.id]?.eligible} <button class="button button-inactive text-gray-600 border-gray-600"
<button class="button-inverse" on:click={claimHandler(badge.id)} on:mouseenter={(ev) => animateText(ev, 15)}>Eligible! Get discount!</button> >Not eligible</button
{:else} >
<button class="button button-inactive text-gray-600 border-gray-600">Not eligible</button>
{/if}
{/if} {/if}
</div> </div>
{/if} {/if}
{#if badge.text} {#if badge.text}
<div class="text-base pt-2 text-mild">{badge.text}</div> <div class="text-sm leading-6 pt-2 text-mild">{badge.text}</div>
{/if} {/if}
</div> </div>
</div> </div>
{/each} {/each}
{/if} {/if}
</div> </div>
<div class="text-2xl font-bold mb-8" on:mouseenter={animateText}>Other discounts (via form)</div> <div class="text-xl font-mono2 lowercase mb-8" on:mouseenter={animateText}>
<div class="text-lg md:w-4/5 mx-auto"> Other discounts (via form)
</div>
<div class="text-mild">
<SvelteMarkdown source={data.config.ticketsDiscounts} /> <SvelteMarkdown source={data.config.ticketsDiscounts} />
</div> </div>
<div class="mt-8 mb-8"> <div class="mt-8 mb-8">
<a href={data.config.ticketsDiscountForm}><button class="button" on:mouseenter={animateText}>Apply for a discount</button></a> <a href={data.config.ticketsDiscountForm}
><button class="button" on:mouseenter={animateText}>Apply for a discount</button></a
>
</div> </div>
</div> </div>
</div> </div>

View file

@ -4,7 +4,7 @@ date: 5. June 2023
venue: X10, Prague venue: X10, Prague
domain: prague.web3privacy.info domain: prague.web3privacy.info
image: '/web3privacy.png' image: '/web3privacy.png'
logo: '/web3privacy-cropped.jpg' logo: '/logo.svg'
twitter: web3privacy twitter: web3privacy
parent: Web3Privacy Now parent: Web3Privacy Now
venueMapUrl: https://goo.gl/maps/VCSC7wcNueEKgt996 venueMapUrl: https://goo.gl/maps/VCSC7wcNueEKgt996
@ -16,41 +16,53 @@ slogan: Diving into the culture of the Web3 privacy industry
aggregator: Prague Blockchain Week 2023 aggregator: Prague Blockchain Week 2023
aggregatorUrl: http://prgblockweek.com/ aggregatorUrl: http://prgblockweek.com/
sponsorUrl: https://prague.web3privacy.info/sponsors.pdf sponsorUrl: https://prague.web3privacy.info/sponsors.pdf
intro_first: If privacy is a human right, then we need to protect it.
intro: | intro: |
If privacy is a human right, then we need to protect it.
Privacy advocates worldwide are coming together to discuss how to mainstream privacy within the Web3 industry. So it will become a cultural phenomenon embodying both decentralisation & anti-surveillance capitalism practices. Privacy advocates worldwide are coming together to discuss how to mainstream privacy within the Web3 industry. So it will become a cultural phenomenon embodying both decentralisation & anti-surveillance capitalism practices.
The conference complements the research projects [Web3Privacy Now](http://web3privacy.info/) and was created by joining forces with the production team of the privacy hackathon [ETHBrno](https://ethbrno.cz/). The conference complements the research projects [Web3Privacy Now](http://web3privacy.info/) and was created by joining forces with the production team of the privacy hackathon [ETHBrno](https://ethbrno.cz/).
Part of [Prague Blockchain Week 2023](http://prgblockweek.com/).
#image: /Knowledge.png #image: /Knowledge.png
themes: themes:
- title: Regulations vs Privacy - title: Regulations vs Privacy
desc: 2023 will be a year of privacy regulations. Privacy coins will be banned, mixer's team become anon etc. How do we defend our rights for privacy? desc: 2023 will be a year of privacy regulations. Privacy coins will be banned, mixer's team become anon etc. How do we defend our rights for privacy?
img: regulations-vs-privacy
- title: MAINSTREAM ON-CHAIN PRIVACY - title: MAINSTREAM ON-CHAIN PRIVACY
desc: Majority of privacy services are tech oriented. It's hard to use them among non-technical people. What should industry do help people onboard into privacy with ease? desc: Majority of privacy services are tech oriented. It's hard to use them among non-technical people. What should industry do help people onboard into privacy with ease?
img: mainstream-privacy
- title: Human rights DAOs (pro-privacy) - title: Human rights DAOs (pro-privacy)
desc: How privacy-enhancing tools could protect DAOs working within non-democratic countries. desc: How privacy-enhancing tools could protect DAOs working within non-democratic countries.
img: human-rights-dao
- title: Identity (ID) - title: Identity (ID)
desc: Decentralised identity is the key to Web3, but at the same time to KYC & AML. Ethical way of building DID without embedded surveillence logic. desc: Decentralised identity is the key to Web3, but at the same time to KYC & AML. Ethical way of building DID without embedded surveillence logic.
img: identity
- title: Full-Stack Privacy - title: Full-Stack Privacy
desc: Full-Stack Privacy is achievable if we ensivion one. Combining both on-chain & off-chain privacy. desc: Full-Stack Privacy is achievable if we ensivion one. Combining both on-chain & off-chain privacy.
img: fullstack-privacy
- title: Private messaging protocols - title: Private messaging protocols
desc: We need resilient privacy-preserving, p2p communication layers for Web3, that allows free and uncensored human-to-human, machine-to-machine or hybrid communication. desc: We need resilient privacy-preserving, p2p communication layers for Web3, that allows free and uncensored human-to-human, machine-to-machine or hybrid communication.
img: private-messaging-protocols
- title: Lunarpunk vs Solarpunk - title: Lunarpunk vs Solarpunk
desc: For solarpunk to succeed it must integrate the lunarpunk unconscious. The only hope for solarpunk is to [go dark](https://www.egirlcapital.com/writings/107533289). Do you agree? desc: For solarpunk to succeed it must integrate the lunarpunk unconscious. The only hope for solarpunk is to [go dark](https://www.egirlcapital.com/writings/107533289). Do you agree?
img: lunarpunk-vs-solarpunk
- title: 'R&D: ZK, MPC, THE' - title: 'R&D: ZK, MPC, THE'
desc: There are many different cryptography technics for privacy preservation. How to balance them all & avoid 1-tool chokepoint? desc: There are many different cryptography technics for privacy preservation. How to balance them all & avoid 1-tool chokepoint?
img: rd-zk-mpc-the
- title: Privacy readiness levels - title: Privacy readiness levels
desc: Introduction of the privacy scoring mechanism to help non-tech people understand security level of the solution desc: Introduction of the privacy scoring mechanism to help non-tech people understand security level of the solution
img: privacy-readiness-levels
- title: Privacy wars - title: Privacy wars
desc: Why are privacy-blockchain socials so toxic? How could we stop hating each other & work together desc: Why are privacy-blockchain socials so toxic? How could we stop hating each other & work together
- title: Privacy workforce img: privacy-wars
- title: 'Privacy activism' - title: 'Privacy activism'
desc: 'Mapping down tools to protect privacy industry: from builders like Alexey Pertsev to projects.' desc: 'Mapping down tools to protect privacy industry: from builders like Alexey Pertsev to projects.'
img: privacy-activism
- title: Network states (with a privacy focus) - title: Network states (with a privacy focus)
desc: Time ot imagine the network state-as-a-grassroots movement for privacy, freedom & better future. desc: Time ot imagine the network state-as-a-grassroots movement for privacy, freedom & better future.
- title: Veksl img: network-states
desc: Easy onboarding to cryptocurrencies without KYC/AML using peer-to-peer tools is crucial for privacy. What options do we have today? # - title: Veksl
# desc: Easy onboarding to cryptocurrencies without KYC/AML using peer-to-peer tools is crucial for privacy. What options do we have today?
ticketsIntro: Be a part of the first Web3Privacy Summit experience… ticketsIntro: Be a part of the first Web3Privacy Summit experience…
#ticketsNote: Tickets will go on sale in April. #ticketsNote: Tickets will go on sale in April.
ticketing: true ticketing: true
@ -79,6 +91,7 @@ tickets:
- '"Privacy experience"' - '"Privacy experience"'
- Networking with attendees, speakers & sponsors - Networking with attendees, speakers & sponsors
note: '*Party access is included in the All-day Pass' note: '*Party access is included in the All-day Pass'
ticketTypeClass: party
faq: faq:
- title: What is Web3Privacy Now? - title: What is Web3Privacy Now?
text: | text: |

View file

@ -1,9 +1,8 @@
import config from '$lib/config.yaml'; import config from '$lib/config.yaml';
export async function load({ params, url, fetch }) { export async function load({ params, url, fetch }) {
const resp = await fetch(config.badgesApiUrl + '/badges');
const resp = await fetch(config.badgesApiUrl + "/badges") const badges = await resp.json();
const badges = await resp.json()
return { return {
config, config,

View file

@ -15,11 +15,11 @@
{ title: 'About', url: '#about' }, { title: 'About', url: '#about' },
{ title: 'Speakers', url: '#speakers' }, { title: 'Speakers', url: '#speakers' },
{ title: 'Program', url: '#program' }, { title: 'Program', url: '#program' },
{ title: 'Sponsors', url: '#sponsors' }, //{ title: 'Sponsors', url: '#sponsors' },
{ title: 'Ticket', url: '#ticket', class: 'button' },
{ title: 'FAQ', url: '#faq' }, { title: 'FAQ', url: '#faq' },
{ title: 'Chat', url: 'https://chat.web3privacy.info', external: true }, { title: 'Chat', url: 'https://chat.web3privacy.info', external: true },
{ title: 'Twitter', url: 'https://twitter.com/web3privacy', external: true } { title: 'Twitter', url: 'https://twitter.com/web3privacy', external: true },
{ title: 'Ticket', url: '#ticket', class: 'button' }
]; ];
const homepageAnimation = () => { const homepageAnimation = () => {
@ -69,25 +69,24 @@
</script> </script>
<div class="relative w-full min-h-screen text-white"> <div class="relative w-full min-h-screen text-white">
<div class="fixed w-full h-18 bg-black pt-2 pb-2 z-40"> <div class="fixed w-full h-18 z-40 " id="header">
<div class="middle-pane-big bg-black"> <div class="bg-black pb-2 pt-2">
<div class="flex"> <div class="middle-pane-big">
<div class="flex my-1">
<div class="flex items-center gap-4 grow"> <div class="flex items-center gap-4 grow">
<div class="w-16 py-2"> <div class="w-36 py-2">
<a href={data.config.parentUrl} target="_blank" <a href="/"><img src={data.config.logo} alt={data.config.title} /></a>
><img src={data.config.logo} alt={data.config.parent} /></a
>
</div> </div>
<!--h1 class="text-2xl uppercase">{data.config.title}</h1--> <!--h1 class="text-2xl uppercase">{data.config.title}</h1-->
</div> </div>
<div class="flex items-center gap-6 text-xl"> <div class="flex items-center lg:gap-8 xl:gap-14 text-base darker">
<button class="md:hidden text-3xl" on:click={(ev) => (navbar = !navbar)}>☰</button> <button class="lg:hidden text-3xl" on:click={(ev) => (navbar = !navbar)}>☰</button>
{#each menu.filter((i) => !i.hidden) as mi} {#each menu.filter((i) => !i.hidden) as mi}
<div class="hidden md:block"> <div class="hidden lg:block">
<a <a
class="{mi.class ? mi.class : 'hover:underline'} {choosed && class="{mi.class ? mi.class : 'hover:underline'} {choosed &&
mi.url === choosed[0].url mi.url === choosed[0].url
? 'font-bold underline' ? 'underline font-bold'
: null} {mi.external ? 'external' : ''}" : null} {mi.external ? 'external' : ''}"
href={mi.url} href={mi.url}
on:mouseenter={animateText} on:mouseenter={animateText}
@ -102,7 +101,7 @@
</div> </div>
</div> </div>
{#if navbar} {#if navbar}
<div class="w-full md:hidden p-4"> <div class="w-full lg:hidden p-4">
{#each menu.filter((i) => !i.hidden) as mi} {#each menu.filter((i) => !i.hidden) as mi}
<div class="my-3 mx-4"> <div class="my-3 mx-4">
<a href={mi.url} on:click={() => (navbar = false)} <a href={mi.url} on:click={() => (navbar = false)}
@ -115,32 +114,50 @@
</div> </div>
{/if} {/if}
</div> </div>
<div id="header-shade" />
</div>
<div class="w-full h-screen" id="intro"> <div class="w-full h-screen" id="intro">
<div class="w-full h-full flex items-center text-center"> <div class="w-full h-full flex items-center text-center">
<div class="mx-auto px-4"> <div class="mx-auto px-4">
<div <div
class="text-5xl md:text-8xl font-bold mb-4 md:mb-8 animation-crypt" class="text-4xl md:text-6xl font-bold mb-4 md:mb-8 animation-crypt font-mono2 font-thin lowercase"
on:mouseenter={animateText} on:mouseenter={animateText}
> >
{data.config.shortname.toUpperCase()} {data.config.shortname.toLowerCase()}
</div> </div>
<div class="text-3xl md:text-5xl md:mb-4 uppercase"> <div class="mt-12 text-xl mx-4">
<span class="">{data.config.date}</span> @ <p class="italic">
<a href={data.config.venueMapUrl} target="_blank" class="underline hover:no-underline" {data.config.slogan}
>{data.config.venue}</a <!-- Part of <a
>
</div>
<div class="mt-8 text-lg text-mild mx-4">
<p class="">{data.config.slogan}</p>
<p>
<a
href={data.config.aggregatorUrl} href={data.config.aggregatorUrl}
target="_blank" target="_blank"
class="underline hover:no-underline external external-mild" class="hover:underline external text-white"
>{data.config.aggregator}</a >{data.config.aggregator}</a
> -->
</p> </p>
<p />
</div>
<div class="mt-14 text-lg md:text-xl uppercase">
<div class="inline-block bg-white text-black font-medium md:w-auto w-3/4">
<div class="px-6 py-2.5 inline-block font-medium">
<span class="font-medium">{data.config.date}</span> AT
<a
href={data.config.venueMapUrl}
target="_blank"
class="underline hover:underline font-medium">{data.config.venue}</a
>
</div>
<div class="inline-block w-full md:w-auto">
<a href="/#ticket" on:click={handleAnchorClick}
><button class="uppercase text-lg w-full"
><div class="m-1 button-inverse" on:mouseenter={animateText}>
Buy Ticket
</div></button
></a
>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -152,7 +169,7 @@
<div class="middle-pane-big pt-10 mx-auto"> <div class="middle-pane-big pt-10 mx-auto">
<div class="flex gap-4"> <div class="flex gap-4">
<div class="grow"> <div class="grow">
<div class="w-32 sm:w-40"> <div class="w-32 lg:w-48">
<a href={data.config.parentUrl} <a href={data.config.parentUrl}
><img src={data.config.logo} alt={data.config.parent} /></a ><img src={data.config.logo} alt={data.config.parent} /></a
> >

View file

@ -19,19 +19,20 @@
</svelte:head> </svelte:head>
<div class="bg-black" id="about"> <div class="bg-black" id="about">
<div class="middle-pane-medium pb-16 text-xl text-center mx-auto"> <div class="middle-pane-medium pb-16 mx-auto">
<div class="py-16 md:py-32 md:w-2/3 mx-auto markdown multiline"> <div class="py-16 md:py-32 md:w-5/6 mx-auto text-mild" on:mouseenter={animateSection(15)}>
<p class="animate-section text-white font-mono2 lowercase">{data.config.intro_first}</p>
<div class="markdown multiline pt-10">
<SvelteMarkdown source={data.config.intro} /> <SvelteMarkdown source={data.config.intro} />
</div> </div>
<div class="section-header" on:mouseenter={animateText}>Key themes</div> </div>
<div class="grid md:grid-cols-3 gap-4 md:gap-10"> <div class="section-header" on:mouseenter={animateText}>Main topics</div>
<div class="grid grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-10">
{#each data.config.themes as ti} {#each data.config.themes as ti}
<div <div class="px-2 py-4 topic-item text-center" on:mouseenter={animateSection(5)}>
class="bg-[#0d1117] hover:text-black hover:bg-white px-4 py-6 topic-item" <img class="topic-img" src="/topics/{ti.img}.webp" />
on:mouseenter={animateSection(35)} <div class="topic-header inline-block px-3 py-1.5 text-lg">{ti.title.toUpperCase()}</div>
> <div class="mt-6 text-mild markdown animate-section text-sm leading-7">
<div class="text-2xl animate-section">{ti.title.toUpperCase()}</div>
<div class="mt-4 text-lg text-mild markdown">
<SvelteMarkdown source={ti.desc} /> <SvelteMarkdown source={ti.desc} />
</div> </div>
</div> </div>
@ -40,50 +41,57 @@
</div> </div>
</div> </div>
<div class="" id="speakers"> <div class="bg-black" id="speakers">
<div class="middle-pane-medium pt-16 text-xl text-center mx-auto mb-8"> <div class="middle-pane-medium pt-16 mx-auto mb-8">
<div class="section-header" on:mouseenter={animateText}>Speakers</div> <div class="section-header" on:mouseenter={animateText}>Speakers</div>
<div class="mx-auto"> <div class="mx-auto">
<div class="pb-12 flex flex-wrap justify-center gap-6">
<PeopleList items={data.config.speakers} people={data.config.people} /> <PeopleList items={data.config.speakers} people={data.config.people} />
</div> </div>
</div>
{#if data.config.speakersNote} {#if data.config.speakersNote}
<div class="text-xl text-supermild">{data.config.speakersNote}</div> <div class="text-supermild mt-6">{data.config.speakersNote}</div>
{/if} {/if}
</div> </div>
</div> </div>
<div id="hosts"> <div id="hosts">
<div class="middle-pane-medium pt-0 text-xl text-center mx-auto"> <div class="middle-pane-medium pt-0 mx-auto pb-32">
<div class="section-header" on:mouseenter={animateText}>Hosts</div> <div class="section-header" on:mouseenter={animateText}>Hosts</div>
<div class="mx-auto"> <div class="mx-auto">
<div class="pb-16 flex flex-wrap justify-center gap-6">
<PeopleList items={data.config.hosts} people={data.config.people} size="small" /> <PeopleList items={data.config.hosts} people={data.config.people} size="small" />
</div> </div>
</div> </div>
</div> </div>
<div class="" id="sponsors">
<div class="middle-pane-medium pt-16 mx-auto pb-32">
<div class="section-header" on:mouseenter={animateText}>Partners</div>
<div>
<a href={data.config.sponsorUrl}
><button class="button text-lg" on:mouseenter={animateText}>Become a partner</button></a
>
</div>
</div>
</div> </div>
<div class="bg-black" id="program"> <div class="bg-black" id="program">
<div class="middle-pane-medium pt-16 text-xl text-center mx-auto pb-32"> <div class="middle-pane-medium pt-16 mx-auto pb-32">
<div class="section-header" on:mouseenter={animateText}>Program</div> <div class="section-header" on:mouseenter={animateText}>Program</div>
{#if data.config.programNote} {#if data.config.programNote}
<div class="text-lg text-supermild mb-16">{data.config.programNote}</div> <div class="text-supermild mb-16">{data.config.programNote}</div>
{/if} {/if}
<div class="program xl:flex gap-10 xl:gap-4"> <div class="program xl:flex gap-10 xl:gap-4">
{#each data.config.stages {#each data.config.stages
.map((s) => ({ ...s, program: data.config.program[s.id] })) .map((s) => ({ ...s, program: data.config.program[s.id] }))
.filter((s) => s.program) as stage} .filter((s) => s.program) as stage}
<div class="w-auto xl:w-1/2 mb-10 xl:mb-0"> <div class="w-auto xl:w-1/2 mb-10 xl:mb-0">
<div class="text-3xl font-bold mb-4">{stage.name}</div> <div class="text-xl font-bold mb-4 font-mono2 lowercase">{stage.name}</div>
<table class="table-auto table-custom w-full mx-0 lg:mx-8"> <table class="table-auto table-custom w-full mt-8">
<thead> <!--thead>
<tr> <tr>
<th class="text-right">time</th> <th class="text-right text-sm">time</th>
<th class="text-left">topic</th> <th class="text-left text-sm">topic</th>
</tr> </tr>
</thead> </thead-->
<tbody> <tbody>
{#each stage.program as pi} {#each stage.program as pi}
@ -98,14 +106,14 @@
.join('<div class="xl:inline-block hidden mx-1">-</div>')} .join('<div class="xl:inline-block hidden mx-1">-</div>')}
</td> </td>
<td class="text-left"> <td class="text-left">
<div class="text-xl"> <div class="">
<span class="animate-section {pi.type === 'other' ? 'text-mild' : ''}" <span class="animate-section {pi.type === 'other' ? 'text-mild' : ''}"
>{pi.title}</span >{pi.title}</span
> >
{pi.speakers ? '― ' + pi.speakers[0]?.name : ''} {pi.speakers ? '― ' + pi.speakers[0]?.name : ''}
</div> </div>
{#if pi.desc} {#if pi.desc}
<div class="mt-2 text-base description text-mild markdown"> <div class="mt-2 text-sm description text-mild markdown">
<SvelteMarkdown source={pi.desc} /> <SvelteMarkdown source={pi.desc} />
</div> </div>
{/if} {/if}
@ -120,61 +128,45 @@
</div> </div>
</div> </div>
<div class="" id="sponsors"> <div class="" id="ticket">
<div class="middle-pane-medium pt-16 text-xl text-center mx-auto pb-32"> <div class="middle-pane-medium pt-16 mx-auto">
<div class="section-header" on:mouseenter={animateText}>Sponsors</div>
<div>
<a href={data.config.sponsorUrl}
><button
class="py-2 px-5 bg-white text-black hover:bg-black border border-bg-white hover:text-white"
on:mouseenter={animateText}>Become a Sponsor</button
></a
>
</div>
</div>
</div>
<div class="bg-black" id="ticket">
<div class="middle-pane-medium pt-16 text-xl text-center mx-auto">
<div class="section-header" on:mouseenter={animateText}>Ticket</div> <div class="section-header" on:mouseenter={animateText}>Ticket</div>
<div class="mb-8 text-lg text-mild">{data.config.ticketsIntro}</div> <div class="mb-8 text-mild">{data.config.ticketsIntro}</div>
<div class="grid lg:grid-cols-2 gap-10 md:w-2/3 mx-auto"> <div class="grid lg:grid-cols-2 gap-10 mx-auto">
{#each data.config.tickets as tt} {#each data.config.tickets as tt}
<div <div
class="bg-[#0d1117] hover:border-0 py-10 px-10 hover:text-black hover:bg-white {data class="ticket-item {tt.ticketTypeClass} border py-10 px-10 hover:text-black hover:bg-white {data
.config.ticketing .config.ticketing
? 'cursor-pointer' ? 'cursor-pointer'
: ''}" : ''}"
on:mouseenter={animateSection(40)} on:mouseenter={animateSection(40)}
on:click={() => (data.config.ticketing ? goto(data.config.ticketingUrl) : false)} on:click={() => (data.config.ticketing ? goto(data.config.ticketingUrl) : false)}
> >
<div class="text-3xl uppercase"> <div class="ticket-img" />
<div class="text-2xl uppercase">
<a href={data.config.ticketingUrl} class="animate-section">{tt.title}</a> <a href={data.config.ticketingUrl} class="animate-section">{tt.title}</a>
</div> </div>
<div class="text-xl mt-6 font-bold"> <div class="text-2xl mt-5 font-bold">
<a href={data.config.ticketingUrl}>{tt.price}</a> <a href={data.config.ticketingUrl}>{tt.price}</a>
</div> </div>
<ul class="mt-6 text-lg text-left list-disc px-6"> <ul class="mt-8 text-left list-disc px-6">
{#each tt.includes as ti} {#each tt.includes as ti}
<li>{ti}</li> <li class="mb-2 pl-2 text-sm">{ti}</li>
{/each} {/each}
</ul> </ul>
{#if tt.note} {#if tt.note}
<div class="mt-10 text-base">{tt.note}</div> <div class="mt-10 text-sm">{tt.note}</div>
{/if} {/if}
{#if tt.hint} {#if tt.hint}
<div class="mt-10 markdown text-base"><SvelteMarkdown source={tt.hint} /></div> <div class="mt-10 markdown text-sm"><SvelteMarkdown source={tt.hint} /></div>
{/if} {/if}
</div> </div>
{/each} {/each}
</div> </div>
{#if data.config.ticketing} {#if data.config.ticketing}
<div class="mt-10"> <div class="mt-10 text-xl">
<a href={data.config.ticketingUrl} <a href={data.config.ticketingUrl}
><button ><button class="button" on:mouseenter={animateText}>Buy a ticket</button></a
class="py-2 px-5 bg-white text-black hover:bg-black border border-bg-white hover:text-white"
on:mouseenter={animateText}>Buy a ticket</button
></a
> >
</div> </div>
{/if} {/if}
@ -182,7 +174,7 @@
<div class="mt-8 text-xl">{data.config.ticketsNote}</div> <div class="mt-8 text-xl">{data.config.ticketsNote}</div>
{/if} {/if}
</div> </div>
<div class="middle-pane-medium text-xl text-center mx-auto pt-20 pb-32"> <div class="middle-pane-medium mx-auto pt-20 pb-32">
<div class="section-subheader" on:mouseenter={animateText}>Get your discount</div> <div class="section-subheader" on:mouseenter={animateText}>Get your discount</div>
<div> <div>
<Web3Dialog {data} /> <Web3Dialog {data} />
@ -190,15 +182,16 @@
</div> </div>
</div> </div>
<div class="pb-36 bg-[#0e0e0e]" id="faq">
<div class="mb-36" id="faq"> <div class="middle-pane-medium pt-20 mx-auto">
<div class="middle-pane-medium pt-20 text-xl text-center mx-auto">
<div class="section-header" on:mouseenter={animateText}>FAQ</div> <div class="section-header" on:mouseenter={animateText}>FAQ</div>
<div class="grid md:grid-cols-2 gap-2 md:gap-10"> <div class="grid md:grid-cols-2 gap-8 md:gap-16">
{#each data.config.faq as fi} {#each data.config.faq as fi}
<div class="py-10 px-4 hover:bg-white hover:text-black" on:mouseenter={animateSection(15)}> <div class="faq-item cursor-help" on:mouseenter={animateSection(15)}>
<div class="text-2xl font-bold mb-6 animate-section">{fi.title}</div> <div class="text-xl mb-6 animate-section">{fi.title}</div>
<div class="text-lg markdown"><SvelteMarkdown source={fi.text} /></div> <div class="markdown text-sm text-mild desc leading-6">
<SvelteMarkdown source={fi.text} />
</div>
</div> </div>
{/each} {/each}
</div> </div>

BIN
static/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 KiB

BIN
static/bg.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

20
static/logo.svg Normal file
View file

@ -0,0 +1,20 @@
<svg width="213" height="56" viewBox="0 0 213 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.856 11.04H0V8H8.512V11.04H7.616L9.824 20.096H9.92L11.584 13.952L10.624 11.04H9.312V8H18.336V11.04H16.864L19.36 20.128H19.488L21.696 11.04H20.032V8H26.816V11.04H24.928L21.312 24H15.424L13.376 16.288L11.264 24H5.44L1.856 11.04Z" fill="white"/>
<path d="M40.3138 23.616C39.8231 23.7867 39.1831 23.936 38.3937 24.064C37.9457 24.128 37.4871 24.1813 37.0177 24.224C36.5697 24.288 36.1111 24.32 35.6418 24.32C33.9991 24.32 32.5271 23.9787 31.2257 23.296C29.9244 22.6133 28.9004 21.6533 28.1537 20.416C27.4284 19.1787 27.0658 17.7493 27.0658 16.128C27.0658 14.464 27.4284 12.992 28.1537 11.712C28.9004 10.432 29.9351 9.44 31.2577 8.736C32.5804 8.032 34.0951 7.68 35.8018 7.68C37.5084 7.68 39.0018 8.032 40.2817 8.736C41.5831 9.41867 42.5858 10.3893 43.2897 11.648C43.9937 12.8853 44.3564 14.3253 44.3778 15.968C44.3778 16.1173 44.3671 16.2773 44.3457 16.448C44.3457 16.5973 44.3351 16.7573 44.3138 16.928H32.7938C32.8791 17.9733 33.0498 18.8587 33.3058 19.584C33.5831 20.3093 33.9351 20.8533 34.3618 21.216C34.7884 21.5787 35.2791 21.76 35.8338 21.76C36.3244 21.76 36.8684 21.5787 37.4658 21.216C38.0844 20.8533 38.6178 20.4267 39.0658 19.936C39.5351 19.4453 39.8231 19.008 39.9297 18.624V18.432H43.1618V25.056H40.3138V23.616ZM38.6497 15.008C38.5431 13.92 38.3618 13.0347 38.1058 12.352C37.8498 11.648 37.5191 11.1253 37.1138 10.784C36.7084 10.4427 36.2391 10.272 35.7057 10.272C35.1724 10.272 34.7031 10.4533 34.2977 10.816C33.8924 11.1573 33.5618 11.68 33.3058 12.384C33.0711 13.088 32.9111 13.9627 32.8257 15.008H38.6497Z" fill="white"/>
<path d="M57.2525 24.32C56.2285 24.32 55.3325 24.128 54.5645 23.744C53.7965 23.3387 53.1458 22.7413 52.6125 21.952V24H47.3645V4.64H44.8045V1.6H52.8685V9.824C53.3805 9.12 53.9992 8.58667 54.7245 8.224C55.4712 7.86133 56.3138 7.68 57.2525 7.68C58.6392 7.68 59.8872 8.032 60.9965 8.736C62.1058 9.41867 62.9698 10.3893 63.5885 11.648C64.2072 12.9067 64.5165 14.3573 64.5165 16C64.5165 17.6427 64.2072 19.0933 63.5885 20.352C62.9698 21.6107 62.1058 22.592 60.9965 23.296C59.9085 23.9787 58.6605 24.32 57.2525 24.32ZM55.7165 21.056C56.2925 21.056 56.7832 20.8853 57.1885 20.544C57.6152 20.1813 57.9458 19.6267 58.1805 18.88C58.4152 18.1333 58.5325 17.1733 58.5325 16C58.5325 14.8267 58.4152 13.8667 58.1805 13.12C57.9458 12.352 57.6152 11.7973 57.1885 11.456C56.7832 11.1147 56.2925 10.944 55.7165 10.944C55.1192 10.944 54.5752 11.168 54.0845 11.616C53.6152 12.0427 53.2418 12.64 52.9645 13.408C52.7085 14.176 52.5805 15.04 52.5805 16C52.5805 16.9387 52.7085 17.792 52.9645 18.56C53.2418 19.328 53.6152 19.936 54.0845 20.384C54.5752 20.832 55.1192 21.056 55.7165 21.056Z" fill="white"/>
<path d="M67.3165 15.168H70.3245V15.328C70.3245 16.1387 70.5912 17.024 71.1245 17.984C71.6792 18.944 72.3832 19.7547 73.2365 20.416C74.1112 21.056 74.9858 21.376 75.8605 21.376C76.5005 21.376 77.0338 21.2053 77.4605 20.864C77.8872 20.5013 78.1965 20.0213 78.3885 19.424C78.6018 18.8053 78.7085 18.1013 78.7085 17.312C78.7085 16.4587 78.5912 15.744 78.3565 15.168C78.1218 14.592 77.8018 14.1653 77.3965 13.888C77.0125 13.5893 76.5752 13.44 76.0845 13.44C75.7218 13.44 75.3485 13.5147 74.9645 13.664C74.6018 13.8133 74.2605 14.0267 73.9405 14.304L73.6205 14.592L72.0845 12.544L78.6125 7.008H73.0125C72.4578 7.008 72.0312 7.04 71.7325 7.104C71.4552 7.168 71.2418 7.28533 71.0925 7.456C70.9645 7.62667 70.9005 7.89333 70.9005 8.256V9.344H67.8605V0H70.9325V1.6H84.9165V4.608L77.2365 11.52C77.5138 11.4133 77.8232 11.3387 78.1645 11.296C78.5058 11.232 78.8258 11.2 79.1245 11.2C80.2765 11.2 81.3112 11.456 82.2285 11.968C83.1672 12.4587 83.9032 13.1627 84.4365 14.08C84.9698 14.976 85.2365 16.0107 85.2365 17.184C85.2365 18.5493 84.8845 19.776 84.1805 20.864C83.4765 21.952 82.4632 22.816 81.1405 23.456C79.8178 24.0747 78.2498 24.384 76.4365 24.384C75.7538 24.384 75.0712 24.3093 74.3885 24.16C73.7058 24.0107 73.0978 23.808 72.5645 23.552C72.2232 23.4453 71.8605 23.3387 71.4765 23.232C71.1138 23.104 70.7512 22.9973 70.3885 22.912V24.928H67.3165V15.168Z" fill="white"/>
<path d="M53.248 48.632H55.712V48.888C55.8187 49.464 56.2453 50.0613 56.992 50.68C57.7387 51.2773 58.6453 51.7787 59.712 52.184C60.8 52.5893 61.856 52.792 62.88 52.792C63.4133 52.792 63.84 52.7067 64.16 52.536C64.5013 52.344 64.672 52.088 64.672 51.768C64.672 51.5333 64.576 51.3307 64.384 51.16C64.2133 50.9893 63.872 50.808 63.36 50.616C62.8693 50.424 62.1013 50.1787 61.056 49.88C59.328 49.432 57.9093 48.952 56.8 48.44C55.712 47.9067 54.88 47.256 54.304 46.488C53.728 45.72 53.44 44.7493 53.44 43.576C53.44 41.9973 53.9947 40.792 55.104 39.96C56.2347 39.1067 57.7173 38.68 59.552 38.68C60.256 38.68 60.8853 38.7227 61.44 38.808C61.9947 38.872 62.5813 38.9787 63.2 39.128C63.6907 39.2347 64.1813 39.352 64.672 39.48V37.976H67.392V45.112H64.864V44.92C64.7787 44.3867 64.3733 43.8427 63.648 43.288C62.9227 42.7333 62.0693 42.2747 61.088 41.912C60.128 41.5493 59.3067 41.368 58.624 41.368C58.2187 41.368 57.888 41.4533 57.632 41.624C57.376 41.7947 57.248 42.0187 57.248 42.296C57.248 42.68 57.4293 43 57.792 43.256C58.1547 43.4907 58.8267 43.7787 59.808 44.12C60.0213 44.184 60.2453 44.2587 60.48 44.344C60.736 44.408 60.992 44.4827 61.248 44.568C61.376 44.6107 61.5147 44.6533 61.664 44.696C61.8133 44.7387 61.952 44.7813 62.08 44.824C63.7227 45.336 64.992 45.8267 65.888 46.296C66.784 46.744 67.4453 47.288 67.872 47.928C68.32 48.5467 68.544 49.368 68.544 50.392C68.544 52.056 67.9893 53.3147 66.88 54.168C65.792 55 64.2987 55.416 62.4 55.416C61.952 55.416 61.4613 55.3947 60.928 55.352C60.3947 55.3093 59.8507 55.256 59.296 55.192C57.76 55.0213 56.64 54.8293 55.936 54.616V55.896H53.248V48.632Z" fill="white"/>
<path d="M77.5263 55.32C76.2889 55.32 75.2222 55.032 74.3262 54.456C73.4302 53.88 72.7369 53.0693 72.2463 52.024C71.7556 50.9573 71.5103 49.6987 71.5103 48.248V42.04H69.3982V39H77.0782V47.832C77.0782 49.1973 77.2702 50.232 77.6543 50.936C78.0383 51.6187 78.5716 51.96 79.2542 51.96C79.7663 51.96 80.2142 51.7787 80.5983 51.416C80.9823 51.032 81.2702 50.4987 81.4622 49.816C81.6756 49.1333 81.7822 48.3333 81.7822 47.416V42.04H79.1582V39H89.7822V42.04H87.3183V51.96H89.7822V55H82.0703V52.856C81.5796 53.6667 80.9502 54.2853 80.1823 54.712C79.4356 55.1173 78.5503 55.32 77.5263 55.32Z" fill="white"/>
<path d="M91.5857 51.96H94.0498V42.04H91.5857V39H99.2978V41.048C99.7884 40.2587 100.396 39.672 101.122 39.288C101.847 38.8827 102.7 38.68 103.682 38.68C104.791 38.68 105.751 38.936 106.562 39.448C107.372 39.96 108.002 40.7067 108.45 41.688C108.898 40.7067 109.527 39.96 110.338 39.448C111.17 38.936 112.162 38.68 113.314 38.68C115.255 38.68 116.77 39.2987 117.858 40.536C118.946 41.7733 119.49 43.5013 119.49 45.72V51.96H121.602V55H112.13V51.96H113.922V46.136C113.922 44.7707 113.74 43.7467 113.378 43.064C113.036 42.3813 112.546 42.04 111.906 42.04C111.436 42.04 111.02 42.2107 110.658 42.552C110.295 42.8933 110.018 43.3627 109.826 43.96C109.634 44.5573 109.538 45.2293 109.538 45.976V51.96H111.33V55H102.178V51.96H103.97V46.136C103.97 44.7707 103.788 43.7467 103.426 43.064C103.084 42.3813 102.594 42.04 101.954 42.04C101.484 42.04 101.068 42.232 100.706 42.616C100.343 42.9787 100.066 43.5013 99.8737 44.184C99.6817 44.8667 99.5857 45.656 99.5857 46.552V51.96H101.378V55H91.5857V51.96Z" fill="white"/>
<path d="M123.429 51.96H125.894V42.04H123.429V39H131.141V41.048C131.632 40.2587 132.24 39.672 132.965 39.288C133.691 38.8827 134.544 38.68 135.525 38.68C136.635 38.68 137.595 38.936 138.406 39.448C139.216 39.96 139.846 40.7067 140.294 41.688C140.742 40.7067 141.371 39.96 142.182 39.448C143.014 38.936 144.005 38.68 145.158 38.68C147.099 38.68 148.614 39.2987 149.702 40.536C150.79 41.7733 151.333 43.5013 151.333 45.72V51.96H153.445V55H143.973V51.96H145.766V46.136C145.766 44.7707 145.584 43.7467 145.221 43.064C144.88 42.3813 144.389 42.04 143.749 42.04C143.28 42.04 142.864 42.2107 142.501 42.552C142.139 42.8933 141.861 43.3627 141.669 43.96C141.477 44.5573 141.382 45.2293 141.382 45.976V51.96H143.174V55H134.021V51.96H135.814V46.136C135.814 44.7707 135.632 43.7467 135.27 43.064C134.928 42.3813 134.438 42.04 133.798 42.04C133.328 42.04 132.912 42.232 132.549 42.616C132.187 42.9787 131.91 43.5013 131.717 44.184C131.525 44.8667 131.43 45.656 131.43 46.552V51.96H133.221V55H123.429V51.96Z" fill="white"/>
<path d="M155.273 51.96H157.737V42.04H155.273V39H163.273V51.96H165.737V55H155.273V51.96ZM156.489 31.16H163.849L160.329 37.56H160.009L156.489 31.16Z" fill="white"/>
<path d="M174.139 55.16C172.475 55.16 171.173 54.712 170.234 53.816C169.317 52.92 168.859 51.6613 168.859 50.04V42.04H166.234V39H167.643C168.837 39 169.808 38.6587 170.555 37.976C171.301 37.2933 171.674 36.2693 171.674 34.904V34.2H174.395V39H178.939V42.04H174.395V49.88C174.395 50.5413 174.555 51.0533 174.874 51.416C175.216 51.7573 175.685 51.928 176.283 51.928C176.752 51.928 177.253 51.8747 177.786 51.768C178.341 51.64 178.811 51.5013 179.195 51.352V54.488C178.533 54.68 177.765 54.84 176.891 54.968C176.037 55.096 175.12 55.16 174.139 55.16Z" fill="white"/>
<path d="M86.992 27.36H89.456V11.04H86.992V8H94.704V10.016C95.2373 9.248 95.888 8.672 96.656 8.288C97.4453 7.88267 98.352 7.68 99.376 7.68C100.763 7.68 102.011 8.02133 103.12 8.704C104.229 9.38667 105.093 10.3573 105.712 11.616C106.331 12.8747 106.64 14.336 106.64 16C106.64 17.6427 106.32 19.0933 105.68 20.352C105.061 21.6107 104.197 22.592 103.088 23.296C102 23.9787 100.763 24.32 99.376 24.32C98.416 24.32 97.5733 24.1387 96.848 23.776C96.1227 23.4133 95.504 22.8693 94.992 22.144V27.52H98.992V30.4H86.992V27.36ZM97.84 21.056C98.3947 21.056 98.8853 20.8853 99.312 20.544C99.7387 20.1813 100.059 19.6267 100.272 18.88C100.507 18.1333 100.624 17.1733 100.624 16C100.624 14.8267 100.507 13.8667 100.272 13.12C100.059 12.352 99.7387 11.7973 99.312 11.456C98.8853 11.1147 98.3947 10.944 97.84 10.944C97.2213 10.944 96.6667 11.168 96.176 11.616C95.7067 12.0427 95.344 12.64 95.088 13.408C94.832 14.176 94.704 15.04 94.704 16C94.704 16.9387 94.832 17.792 95.088 18.56C95.344 19.328 95.7067 19.936 96.176 20.384C96.6667 20.832 97.2213 21.056 97.84 21.056Z" fill="white"/>
<path d="M107.929 20.96H110.394V11.04H107.929V8H115.642V10.176C115.962 9.408 116.42 8.81067 117.018 8.384C117.615 7.95733 118.298 7.744 119.065 7.744C119.385 7.744 119.759 7.808 120.186 7.936C120.313 7.97867 120.442 8.02133 120.57 8.064C120.698 8.10667 120.815 8.14933 120.922 8.192V6.688H123.77V15.168H121.018V14.72C121.018 14.208 120.847 13.6853 120.506 13.152C120.186 12.5973 119.78 12.1387 119.289 11.776C118.82 11.4133 118.394 11.232 118.009 11.232C117.604 11.232 117.242 11.4027 116.922 11.744C116.623 12.064 116.378 12.5333 116.186 13.152C116.015 13.7493 115.929 14.4747 115.929 15.328V20.96H119.834V24H107.929V20.96Z" fill="white"/>
<path d="M125.836 20.96H128.3V11.04H125.836V8H133.836V20.96H136.3V24H125.836V20.96ZM127.052 0.16H134.412L130.892 6.56H130.572L127.052 0.16Z" fill="white"/>
<path d="M139.109 11.04H137.125V8H147.397V11.04H145.221L148.389 19.52H148.485L151.685 11.04H149.061V8H157.029V11.04H155.045L149.861 24H144.357L139.109 11.04Z" fill="white"/>
<path d="M162.02 24.32C160.356 24.32 159.065 23.9253 158.148 23.136C157.23 22.3253 156.772 21.248 156.772 19.904C156.772 18.4747 157.337 17.3653 158.468 16.576C159.598 15.7867 161.273 15.3067 163.492 15.136C164.537 15.0507 165.358 14.912 165.956 14.72C166.574 14.528 167.022 14.2613 167.3 13.92C167.598 13.5573 167.748 13.088 167.748 12.512C167.748 11.7227 167.598 11.1573 167.3 10.816C167.001 10.4747 166.553 10.304 165.956 10.304C165.358 10.304 164.708 10.5067 164.004 10.912C163.321 11.3173 162.734 11.8187 162.244 12.416C161.753 13.0133 161.476 13.5787 161.412 14.112V14.368H158.564V6.944H161.38V8.32C162.169 8.23467 162.905 8.128 163.588 8C163.993 7.89334 164.42 7.81867 164.868 7.776C165.316 7.712 165.785 7.68 166.276 7.68C168.452 7.68 170.148 8.256 171.364 9.408C172.58 10.56 173.188 12.1707 173.188 14.24V20.96H175.236V24H167.908V21.536C167.289 22.4747 166.478 23.1787 165.476 23.648C164.494 24.096 163.342 24.32 162.02 24.32ZM164.356 21.312C164.91 21.312 165.454 21.1307 165.988 20.768C166.542 20.384 166.99 19.872 167.332 19.232C167.694 18.5707 167.876 17.824 167.876 16.992V15.296C167.598 15.5947 167.246 15.8613 166.82 16.096C166.393 16.3093 165.87 16.4693 165.252 16.576C164.377 16.7253 163.716 17.024 163.268 17.472C162.82 17.8987 162.596 18.4853 162.596 19.232C162.596 19.8507 162.756 20.352 163.076 20.736C163.396 21.12 163.822 21.312 164.356 21.312Z" fill="white"/>
<path d="M188.659 23.648C188.19 23.8187 187.539 23.9573 186.707 24.064C186.259 24.1493 185.811 24.2133 185.363 24.256C184.915 24.2987 184.467 24.32 184.019 24.32C182.355 24.32 180.862 23.968 179.539 23.264C178.216 22.5387 177.182 21.5467 176.435 20.288C175.71 19.008 175.347 17.5787 175.347 16C175.347 14.4 175.71 12.9707 176.435 11.712C177.182 10.4533 178.216 9.472 179.539 8.768C180.862 8.04267 182.355 7.68 184.019 7.68C184.808 7.68 185.619 7.75467 186.451 7.904C187.219 8.032 187.848 8.17067 188.339 8.32V6.944H191.187L191.155 14.816H188.179V14.56C188.115 14.0053 187.859 13.4187 187.411 12.8C186.963 12.1813 186.44 11.6587 185.843 11.232C185.246 10.8053 184.702 10.592 184.211 10.592C183.592 10.592 183.059 10.7947 182.611 11.2C182.163 11.6053 181.811 12.2133 181.555 13.024C181.32 13.8133 181.203 14.8053 181.203 16C181.203 17.1733 181.32 18.1653 181.555 18.976C181.811 19.7653 182.163 20.3627 182.611 20.768C183.059 21.1733 183.592 21.376 184.211 21.376C184.744 21.376 185.331 21.1733 185.971 20.768C186.611 20.3413 187.166 19.8187 187.635 19.2C188.104 18.5813 188.392 17.9947 188.499 17.44V17.184H191.475V25.056H188.659V23.648Z" fill="white"/>
<path d="M194.29 21.92H197.107V23.296C197.107 23.8933 197.32 24.5333 197.747 25.216C198.173 25.92 198.685 26.5067 199.283 26.976C199.901 27.4667 200.456 27.712 200.947 27.712C201.202 27.712 201.416 27.6267 201.587 27.456C201.757 27.2853 201.842 27.0613 201.842 26.784V26.752C201.842 26.56 201.768 26.2827 201.618 25.92C201.49 25.5787 201.17 24.8747 200.658 23.808C200.53 23.5307 200.381 23.232 200.21 22.912C200.061 22.592 199.901 22.2507 199.73 21.888L194.387 11.04H192.467V8H202.611V11.04H200.723L203.378 17.28C203.442 17.4507 203.517 17.6427 203.602 17.856C203.688 18.048 203.773 18.2507 203.859 18.464C204.051 18.9333 204.189 19.3067 204.275 19.584C204.317 19.392 204.36 19.2213 204.402 19.072C204.445 18.9013 204.499 18.72 204.562 18.528L207.09 11.04H204.434V8H212.37V11.04H210.195L206.546 20.48C206.525 20.5227 206.514 20.5653 206.514 20.608C206.514 20.6293 206.504 20.6613 206.482 20.704C206.29 21.2373 206.152 21.728 206.066 22.176C206.003 22.624 205.971 23.1147 205.971 23.648V24.16C205.971 25.5467 205.768 26.7307 205.363 27.712C204.979 28.6933 204.424 29.44 203.699 29.952C202.973 30.464 202.131 30.72 201.171 30.72C200.701 30.72 200.221 30.6773 199.73 30.592C199.24 30.528 198.781 30.432 198.355 30.304C197.885 30.176 197.491 30.016 197.171 29.824V31.296H194.29V21.92Z" fill="white"/>
<path d="M0.576 39H43.576V55H0.576V39Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/ticket-full.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
static/ticket-party.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

5
static/topics/convert.sh Executable file
View file

@ -0,0 +1,5 @@
#!/bin/bash
for file in *
do
cwebp -q 80 "$file" -o "${file%.png}.webp"
done

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
static/topics/identity.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
static/topics/identity.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View file

@ -7,7 +7,8 @@ module.exports = {
theme: { theme: {
extend: { extend: {
fontFamily: { fontFamily: {
mono: ['Ubuntu Mono', ...defaultTheme.fontFamily.mono] mono: ['DM Mono', ...defaultTheme.fontFamily.mono],
mono2: ['Major Mono Display', ...defaultTheme.fontFamily.mono]
} }
} }
}, },