Merge pull request #15 from web3privacy/dk/codebase-update

dk/codebase-update
This commit is contained in:
DanielKlein 2024-09-02 17:59:09 +02:00 committed by GitHub
commit 8b9a1e0071
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
43 changed files with 11215 additions and 7639 deletions

View file

@ -10,7 +10,15 @@ const emits = defineEmits(['selected'])
<div <div
border-2px border-2px
:class="[inverted ? 'border-app-black bg-app-white hover:bg-app-black text-app-black hover:text-app-white' : 'bg-app-black border-app-white hover:bg-app-white text-app-white hover:text-app-black']" :class="[inverted ? 'border-app-black bg-app-white hover:bg-app-black text-app-black hover:text-app-white' : 'bg-app-black border-app-white hover:bg-app-white text-app-white hover:text-app-black']"
flex items-center justify-center px-24px py-16px font-700 leading-40px cursor-pointer @click="emits('selected')" flex
items-center
justify-center
px-24px
py-16px
font-700
leading-40px
cursor-pointer
@click="emits('selected')"
> >
{{ text }} {{ text }}
</div> </div>

View file

@ -5,13 +5,31 @@ defineProps<{
</script> </script>
<template> <template>
<div flex items-center gap-12px px-12px py-6px cursor-pointer text-app-white :class="[border ? 'border-2px border-app-white' : 'border-0']" hover:text-app-black hover:bg-app-white> <div
flex
items-center
gap-12px
px-12px
py-6px
cursor-pointer
text-app-white
:class="[border ? 'border-2px border-app-white' : 'border-0']"
hover:text-app-black
hover:bg-app-white
>
<template v-if="!!$slots.prefix"> <template v-if="!!$slots.prefix">
<div text-24px> <div text-24px>
<slot v-if="!!$slots.prefix" name="prefix" /> <slot
v-if="!!$slots.prefix"
name="prefix"
/>
</div> </div>
</template> </template>
<div text="14px" leading-32px font-700> <div
text="14px"
leading-32px
font-700
>
<slot /> <slot />
</div> </div>
</div> </div>

View file

@ -11,63 +11,175 @@ const { switcher } = storeToRefs(useData())
<NuxtLink <NuxtLink
:to="`/project/${project.id}`" :to="`/project/${project.id}`"
:class="switcher ? 'flex-row' : 'lg:flex-col'" :class="switcher ? 'flex-row' : 'lg:flex-col'"
flex w-full gap-16px hover:bg="#121212" transition-all flex
w-full
gap-16px
hover:bg="#121212"
transition-all
> >
<div relative max-w="96px lg:200px" w-full h="96px lg:200px" :class="switcher ? '' : 'lg:max-w-full! lg:w-full '"> <div
<div flex items-center justify-center w-full my-auto h-full> relative
<NuxtImg :src="project?.image || '/no-image-1-1.svg'" class="w-full h-auto" max-h="md:196px 96px" self-center z-10 object-fit bg="#121212" /> max-w="96px lg:200px"
w-full
h="96px lg:200px"
:class="switcher ? '' : 'lg:max-w-full! lg:w-full '"
>
<div
flex
items-center
justify-center
w-full
my-auto
h-full
>
<NuxtImg
:src="project?.image || '/no-image-1-1.svg'"
class="w-full h-auto"
max-h="md:196px 96px"
self-center
z-10
object-fit
bg="#121212"
/>
</div> </div>
<ClientOnly> <ClientOnly>
<Badge <Badge
v-if="project.percentage" v-if="project.percentage"
absolute bottom-0.5 lg:bottom-0 right-0.5 lg:right-0 mr-2px mb-2px absolute
bottom-0.5
lg:bottom-0
right-0.5
lg:right-0
mr-2px
mb-2px
:text="`${project.percentage}%`" :text="`${project.percentage}%`"
class="leading-12px! text-12px! lg:text-18px! border-0!" px="4px! lg:16px!" py="4px! lg:8px!" class="leading-12px! text-12px! lg:text-18px! border-0!"
px="4px! lg:16px!"
py="4px! lg:8px!"
/> />
</ClientOnly> </ClientOnly>
</div> </div>
<div h="96px lg:200px" lg:py-24px lg:pr-24px flex flex-col justify-center lg:justify-between lg:gap-24px w-full text-white :class="switcher ? '' : 'lg:p-16px! lg:py-16px!'"> <div
<div w-full h-fit flex flex-col gap-8px> h="96px lg:200px"
<div w-fit flex items-center gap-8px @click.prevent="navigateTo(project.website, { external: true, open: { target: '_blank' } })"> lg:py-24px
<h1 text="18px lg:24px app-white" font-700 line-clamp-1 hover:underline underline-offset-3> lg:pr-24px
flex
flex-col
justify-center
lg:justify-between
lg:gap-24px
w-full
text-white
:class="switcher ? '' : 'lg:p-16px! lg:py-16px!'"
>
<div
w-full
h-fit
flex
flex-col
gap-8px
>
<div
w-fit
flex
items-center
gap-8px
@click.prevent="navigateTo(project.website, { external: true, open: { target: '_blank' } })"
>
<h1
text="18px lg:24px app-white"
font-700
line-clamp-1
hover:underline
underline-offset-3
>
{{ project.title1 }} {{ project.title1 }}
</h1> </h1>
<UnoIcon i-web-open text-16px /> <UnoIcon
i-web-open
text-16px
/>
</div> </div>
<h2 text="14px app-text-grey" overflow-hidden text-ellipsis line-clamp-2 lg:line-clamp-2> <h2
text="14px app-text-grey"
overflow-hidden
text-ellipsis
line-clamp-2
lg:line-clamp-2
>
{{ project.description }} {{ project.description }}
</h2> </h2>
</div> </div>
<div w-full flex justify-between> <div
<div w-full max-w-692px grid whitespace-nowrap :class="switcher ? 'grid-cols-5' : 'grid-cols-3'" gap-24px lg:grid hidden> w-full
flex
justify-between
>
<div
w-full
max-w-692px
grid
whitespace-nowrap
:class="switcher ? 'grid-cols-5' : 'grid-cols-3'"
gap-24px
lg:grid
hidden
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project?.github" :check-undefined="project?.github"
:link="project?.github" :link="project?.github"
title="Github" bold text-size="18px" title="Github"
bold
text-size="18px"
> >
<div flex items-center gap-8px> <div
<UnoIcon i-web-github text-16px /> flex
items-center
gap-8px
>
<UnoIcon
i-web-github
text-16px
/>
<span>{{ project?.github ? 'YES' : 'NO' }}</span> <span>{{ project?.github ? 'YES' : 'NO' }}</span>
</div> </div>
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.readyness" :check-undefined="project.readyness"
title="Readyness" text-size="18px" title="Readyness"
text-size="18px"
> >
<div flex items-center gap-12px> <div
<UnoIcon i-web-live text-10px :class="(project.readyness === 'Mainnet') ? 'color-#18FF2F' : (project.readyness === 'Testnet') ? 'color-#FFA800' : (project.readyness === 'Alpha') ? 'color-#FF0000' : ''" /> flex
items-center
gap-12px
>
<UnoIcon
i-web-live
text-10px
:class="(project.readyness === 'Mainnet') ? 'color-#18FF2F' : (project.readyness === 'Testnet') ? 'color-#FFA800' : (project.readyness === 'Alpha') ? 'color-#FF0000' : ''"
/>
<span :class="(project.readyness === 'Alpha') ? 'color-#FFA800' : 'color-white'">{{ project.readyness }}</span> <span :class="(project.readyness === 'Alpha') ? 'color-#FFA800' : 'color-white'">{{ project.readyness }}</span>
</div> </div>
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="true" title="Team" text-size="18px"> <ProjectInfoItem
:check-undefined="true"
title="Team"
text-size="18px"
>
<span v-if="project.team?.length">{{ `${project.team?.length} members` }}</span> <span v-if="project.team?.length">{{ `${project.team?.length} members` }}</span>
<span v-else color="#FF0000">{{ 'Anonymous' }}</span> <span
v-else
color="#FF0000"
>{{ 'Anonymous' }}</span>
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project?.docs" :check-undefined="project?.docs"
:link="project?.docs" :link="project?.docs"
:color="project?.docs ? '#18FF2F' : '#FF0000'" :color="project?.docs ? '#18FF2F' : '#FF0000'"
title="Docs" bold text-size="18px" title="Docs"
bold
text-size="18px"
> >
{{ project?.docs ? 'YES' : 'NO' }} {{ project?.docs ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
@ -75,17 +187,59 @@ const { switcher } = storeToRefs(useData())
:check-undefined="project.audits" :check-undefined="project.audits"
:link="project?.audits?.[0]?.link ?? undefined" :link="project?.audits?.[0]?.link ?? undefined"
:color="project?.audits ? '#18FF2F' : '#FF0000'" :color="project?.audits ? '#18FF2F' : '#FF0000'"
title="Audit" bold text-size="18px" title="Audit"
bold
text-size="18px"
> >
{{ project.audits ? 'YES' : 'NO' }} {{ project.audits ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div hidden lg:flex items-center gap-16px> <div
<UnoIcon v-if="project.forum" i-web-forum text-28px opacity-50 hover:opacity-100 @click.prevent="navigateTo(project.forum, { external: true, open: { target: '_blank' } })" /> hidden
<UnoIcon v-if="project.explorer" i-web-explorer text-32px opacity-50 hover:opacity-100 @click.prevent="navigateTo(project.explorer, { external: true, open: { target: '_blank' } })" /> lg:flex
<UnoIcon v-if="project.twitter" i-web-twitter_x text-22px opacity-50 hover:opacity-100 @click.prevent="navigateTo(project.twitter, { external: true, open: { target: '_blank' } })" /> items-center
<UnoIcon v-if="project.coingecko" i-web-coingecko text-24px opacity-50 hover:opacity-100 @click.prevent="navigateTo(project.coingecko, { external: true, open: { target: '_blank' } })" /> gap-16px
<UnoIcon v-if="project.newsletter" i-web-news text-28px opacity-50 hover:opacity-100 @click.prevent="navigateTo(project.newsletter, { external: true, open: { target: '_blank' } })" /> >
<UnoIcon
v-if="project.forum"
i-web-forum
text-28px
opacity-50
hover:opacity-100
@click.prevent="navigateTo(project.forum, { external: true, open: { target: '_blank' } })"
/>
<UnoIcon
v-if="project.explorer"
i-web-explorer
text-32px
opacity-50
hover:opacity-100
@click.prevent="navigateTo(project.explorer, { external: true, open: { target: '_blank' } })"
/>
<UnoIcon
v-if="project.twitter"
i-web-twitter_x
text-22px
opacity-50
hover:opacity-100
@click.prevent="navigateTo(project.twitter, { external: true, open: { target: '_blank' } })"
/>
<UnoIcon
v-if="project.coingecko"
i-web-coingecko
text-24px
opacity-50
hover:opacity-100
@click.prevent="navigateTo(project.coingecko, { external: true, open: { target: '_blank' } })"
/>
<UnoIcon
v-if="project.newsletter"
i-web-news
text-28px
opacity-50
hover:opacity-100
@click.prevent="navigateTo(project.newsletter, { external: true, open: { target: '_blank' } })"
/>
</div> </div>
</div> </div>
</div> </div>

View file

@ -10,9 +10,20 @@ defineProps<{
<div <div
hover:bg-app-bg-grey hover:bg-app-bg-grey
:class="[selected ? 'bg-app-white' : 'bg-transparent']" :class="[selected ? 'bg-app-white' : 'bg-transparent']"
flex items-center gap-8px py-10px px-16px text-18px font-400 leading-24px cursor-pointer flex
items-center
gap-8px
py-10px
px-16px
text-18px
font-400
leading-24px
cursor-pointer
>
<h1
hover:text-app-white
:class="[selected ? 'text-app-black font-700 opacity-100' : 'text-app-white opacity-50']"
> >
<h1 hover:text-app-white :class="[selected ? 'text-app-black font-700 opacity-100' : 'text-app-white opacity-50']">
{{ title }} {{ title }}
</h1> </h1>
<p text-app-text-grey> <p text-app-text-grey>

View file

@ -19,19 +19,26 @@ function onOptionSelected(value: string) {
</script> </script>
<template> <template>
<HeadlessListbox v-model="selectedValue" as="div"> <HeadlessListbox
v-model="selectedValue"
as="div"
>
<div class="relative mt-2 font-700 font-24px"> <div class="relative mt-2 font-700 font-24px">
<HeadlessListboxButton <HeadlessListboxButton
class="relative w-full cursor-pointer py-8px p-16px text-left border-2px text-app-white sm:text-sm sm:leading-6" class="relative w-full cursor-pointer py-8px p-16px text-left border-2px text-app-white sm:text-sm sm:leading-6"
> >
<span class="block truncate mr-8px">{{ isOptionSelected?.label }} <span opacity-50>({{ isOptionSelected?.count }})</span></span> <span class="block truncate mr-8px">{{ isOptionSelected?.label }} <span opacity-50>({{ isOptionSelected?.count }})</span></span>
<span class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"> <span class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2">
<UnoIcon i-heroicons-solid-chevron-down text-app-white /> <UnoIcon
i-heroicons-solid-chevron-down
text-app-white
/>
</span> </span>
</HeadlessListboxButton> </HeadlessListboxButton>
<transition <transition
leave-active-class="transition ease-in duration-100" leave-from-class="opacity-100" leave-active-class="transition ease-in duration-100"
leave-from-class="opacity-100"
leave-to-class="opacity-0" leave-to-class="opacity-0"
> >
<HeadlessListboxOptions <HeadlessListboxOptions
@ -39,14 +46,20 @@ function onOptionSelected(value: string) {
> >
<HeadlessListboxOption <HeadlessListboxOption
v-for="option in props.options" v-for="option in props.options"
:key="option.value" v-slot="{ active, selected }" as="template" :key="option.value"
:value="option.value" @click="onOptionSelected(option.value)" v-slot="{ active, selected }"
as="template"
:value="option.value"
@click="onOptionSelected(option.value)"
> >
<li <li
class="w-full relative cursor-pointer select-none py-8px p-16px" class="w-full relative cursor-pointer select-none py-8px p-16px"
:class="[active ? 'bg-#ffffff1a' : 'text-white']" :class="[active ? 'bg-#ffffff1a' : 'text-white']"
> >
<span class="block truncate" :class="[selected ? 'font-semibold' : 'font-normal']"> <span
class="block truncate"
:class="[selected ? 'font-semibold' : 'font-normal']"
>
{{ option.label }} {{ option.label }}
<span opacity-50>({{ option.count }})</span> <span opacity-50>({{ option.count }})</span>
</span> </span>

View file

@ -5,8 +5,16 @@ defineProps<{
</script> </script>
<template> <template>
<NuxtLink :to="to" flex gap-12px target="_blank"> <NuxtLink
<UnoIcon i-heroicons-solid-pencil text-24px /> :to="to"
flex
gap-12px
target="_blank"
>
<UnoIcon
i-heroicons-solid-pencil
text-24px
/>
<slot /> <slot />
</NuxtLink> </NuxtLink>
</template> </template>

View file

@ -4,66 +4,239 @@
<template> <template>
<div app-container> <div app-container>
<div mt-48px> <div mt-48px>
<hr border-t-2px border-white opacity-10 w-full> <hr
border-t-2px
border-white
opacity-10
w-full
>
</div> </div>
<div p-24px flex items-center> <div
<div shrink-0 flex gap-32px justify-start> p-24px
<NuxtImg src="/logo.svg" max-w-120px sm:w-160px cursor-pointer @click="navigateTo('/')" /> flex
items-center
>
<div
shrink-0
flex
gap-32px
justify-start
>
<NuxtImg
src="/logo.svg"
max-w-120px
sm:w-160px
cursor-pointer
@click="navigateTo('/')"
/>
</div> </div>
<div w-full h-fit flex justify-end items-center gap-16px sm:gap-32px mt-0> <div
<NuxtLink to="https://twitter.com/web3privacy" target="_blank" flex items-center gap-12px> w-full
<UnoIcon i-web-twitter_x opacity-50 text-22px /> h-fit
<span hover:underline hidden lg:block text-16px>{{ '@web3privacy' }}</span> flex
justify-end
items-center
gap-16px
sm:gap-32px
mt-0
>
<NuxtLink
to="https://twitter.com/web3privacy"
target="_blank"
flex
items-center
gap-12px
>
<UnoIcon
i-web-twitter_x
opacity-50
text-22px
/>
<span
hover:underline
hidden
lg:block
text-16px
>{{ '@web3privacy' }}</span>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://t.me/web3privacynow" target="_blank" flex items-center gap-12px> <NuxtLink
<UnoIcon i-web-telegram1 opacity-50 text-24px /> to="https://t.me/web3privacynow"
<span hover:underline hidden lg:block text-16px>{{ 'Telegram' }}</span> target="_blank"
flex
items-center
gap-12px
>
<UnoIcon
i-web-telegram1
opacity-50
text-24px
/>
<span
hover:underline
hidden
lg:block
text-16px
>{{ 'Telegram' }}</span>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://matrix.web3privacy.info/" target="_blank" flex items-center gap-12px> <NuxtLink
<UnoIcon i-web-matrix opacity-50 text-24px /> to="https://matrix.web3privacy.info/"
<span hover:underline hidden lg:block text-16px>{{ 'Matrix' }}</span> target="_blank"
flex
items-center
gap-12px
>
<UnoIcon
i-web-matrix
opacity-50
text-24px
/>
<span
hover:underline
hidden
lg:block
text-16px
>{{ 'Matrix' }}</span>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://github.com/web3privacy" target="_blank" flex items-center gap-12px> <NuxtLink
<UnoIcon i-web-github opacity-50 text-24px /> to="https://github.com/web3privacy"
<span hover:underline hidden lg:block text-16px>{{ 'GitHub' }}</span> target="_blank"
flex
items-center
gap-12px
>
<UnoIcon
i-web-github
opacity-50
text-24px
/>
<span
hover:underline
hidden
lg:block
text-16px
>{{ 'GitHub' }}</span>
</NuxtLink> </NuxtLink>
</div> </div>
</div> </div>
<div text="14px sm:16px" px-24px grid grid-cols-2 sm:grid-cols-3 gap-16px mt-32px mb-16px> <div
<NuxtLink to="https://docs.web3privacy.info/manifesto" opacity-50 hover:underline> text="14px sm:16px"
px-24px
grid
grid-cols-2
sm:grid-cols-3
gap-16px
mt-32px
mb-16px
>
<NuxtLink
to="https://docs.web3privacy.info/manifesto"
opacity-50
hover:underline
>
{{ 'Manifesto' }} {{ 'Manifesto' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://docs.web3privacy.info/get-involved" opacity-50 hover:underline> <NuxtLink
to="https://docs.web3privacy.info/get-involved"
opacity-50
hover:underline
>
{{ 'How to get involved' }} {{ 'How to get involved' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://github.com/web3privacy/grants" opacity-50 hover:underline> <NuxtLink
to="https://github.com/web3privacy/grants"
opacity-50
hover:underline
>
{{ 'Grants / Support Us' }} {{ 'Grants / Support Us' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://web3privacy.info/events" opacity-50 hover:underline> <NuxtLink
to="https://web3privacy.info/events"
opacity-50
hover:underline
>
{{ 'Events' }} {{ 'Events' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://mirror.xyz/0x0f1F3DAf416B74DB3DE55Eb4D7513a80F4841073/" opacity-50 hover:underline> <NuxtLink
to="https://mirror.xyz/0x0f1F3DAf416B74DB3DE55Eb4D7513a80F4841073/"
opacity-50
hover:underline
>
{{ 'Articles' }} {{ 'Articles' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://docs.web3privacy.info/events/" opacity-50 hover:underline> <NuxtLink
to="https://docs.web3privacy.info/events/"
opacity-50
hover:underline
>
{{ 'Talks' }} {{ 'Talks' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://docs.web3privacy.info/projects/privacy-explorer/" opacity-50 hover:underline> <NuxtLink
to="https://docs.web3privacy.info/projects/privacy-explorer/"
opacity-50
hover:underline
>
{{ 'Privacy Explorer' }} {{ 'Privacy Explorer' }}
</NuxtLink> </NuxtLink>
<NuxtLink to="https://github.com/web3privacy/web3privacy" opacity-50 hover:underline> <NuxtLink
to="https://github.com/web3privacy/web3privacy"
opacity-50
hover:underline
>
{{ 'Privacy database' }} {{ 'Privacy database' }}
</NuxtLink> </NuxtLink>
</div> </div>
<hr block sm:hidden border-t-2px border-white opacity-10 w-full> <hr
<div px-24px my-16px sm:mt-32px flex flex-col sm:flex-row w-full items-center justify-between gap-18px> block
<a w-full opacity-50 text-14px leading-24px font-400>{{ 'All rights not reserved, Creative commons 2024 - Web3Privacy z.s.' }}</a> sm:hidden
<div w-full sm:w-fit sm:justify-end items-center flex flex-row gap-6px> border-t-2px
<span text-14px text-app-text-grey whitespace-nowrap>{{ 'Developed by' }}</span> border-white
opacity-10
w-full
>
<div
px-24px
my-16px
sm:mt-32px
flex
flex-col
sm:flex-row
w-full
items-center
justify-between
gap-18px
>
<a
w-full
opacity-50
text-14px
leading-24px
font-400
>{{ 'All rights not reserved, Creative commons 2024 - Web3Privacy z.s.' }}</a>
<div
w-full
sm:w-fit
sm:justify-end
items-center
flex
flex-row
gap-6px
>
<span
text-14px
text-app-text-grey
whitespace-nowrap
>{{ 'Developed by' }}</span>
<div <div
shrink-0 shrink-0
bg="[url(/develit-logo-white.svg)]" duration-300 bg-no-repeat bg-center bg="[url(/develit-logo-white.svg)]"
cursor-pointer w-full max-w-104px h-32px hover:bg="[url(/develit-logo-color.svg)]" duration-300
bg-no-repeat
bg-center
cursor-pointer
w-full
max-w-104px
h-32px
hover:bg="[url(/develit-logo-color.svg)]"
@click="navigateTo('https://develit.io/', { external: true })" @click="navigateTo('https://develit.io/', { external: true })"
/> />
</div> </div>

View file

@ -6,8 +6,14 @@ defineProps<{
<template> <template>
<div relative> <div relative>
<button class="peer" type="button"> <button
<UnoIcon i-heroicons-solid-information-circle class="w-20px h-20px opacity-50 hover:opacity-100 text-app-white" /> class="peer"
type="button"
>
<UnoIcon
i-heroicons-solid-information-circle
class="w-20px h-20px opacity-50 hover:opacity-100 text-app-white"
/>
</button> </button>
<div <div
class="peer-hover:visible top-20px left-20px absolute invisible z-100 inline-block px-3 py-2 text-sm font-medium text-app-black bg-app-white" class="peer-hover:visible top-20px left-20px absolute invisible z-100 inline-block px-3 py-2 text-sm font-medium text-app-black bg-app-white"

View file

@ -6,7 +6,14 @@ defineProps<{
</script> </script>
<template> <template>
<NuxtLink text-14px hover:text-app-white leading-32px uppercase cursor-pointer :class="[selected ? 'text-app-white font-700 underline underline-offset-4px hover:no-underline' : 'text-app-text-grey font-500']"> <NuxtLink
text-14px
hover:text-app-white
leading-32px
uppercase
cursor-pointer
:class="[selected ? 'text-app-white font-700 underline underline-offset-4px hover:no-underline' : 'text-app-text-grey font-500']"
>
{{ title }} {{ title }}
</NuxtLink> </NuxtLink>
</template> </template>

View file

@ -19,89 +19,391 @@ watch(y, (newY, oldY) => {
</script> </script>
<template> <template>
<div v-if="showMenu" w-full flex flex-col items-center> <div
<NuxtLink to="https://web3privacy.info/" bg-black hover:bg-white w-full text-center justify-center py-14px cursor-pointer text-app-text-grey class="hover:text-black" hover:underline underline-offset-1 text-16px font-400 uppercase> v-if="showMenu"
w-full
flex
flex-col
items-center
>
<NuxtLink
to="https://web3privacy.info/"
bg-black
hover:bg-white
w-full
text-center
justify-center
py-14px
cursor-pointer
text-app-text-grey
class="hover:text-black"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
HOME HOME
</NuxtLink> </NuxtLink>
<NuxtLink bg-black hover:bg-white w-full text-center justify-center py-14px cursor-pointer text-white class="hover:text-black" hover:underline underline-offset-1 text-16px font-400 to="/"> <NuxtLink
bg-black
hover:bg-white
w-full
text-center
justify-center
py-14px
cursor-pointer
text-white
class="hover:text-black"
hover:underline
underline-offset-1
text-16px
font-400
to="/"
>
PROJECTS PROJECTS
</NuxtLink> </NuxtLink>
<NuxtLink to="https://web3privacy.info/events/" bg-black hover:bg-white w-full text-center justify-center py-14px cursor-pointer text-app-text-grey class="hover:text-black" hover:underline underline-offset-1 text-16px font-400 uppercase> <NuxtLink
to="https://web3privacy.info/events/"
bg-black
hover:bg-white
w-full
text-center
justify-center
py-14px
cursor-pointer
text-app-text-grey
class="hover:text-black"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
EVENTS EVENTS
</NuxtLink> </NuxtLink>
<NuxtLink bg-black hover:bg-white w-full justify-center to="https://mirror.xyz/0x0f1F3DAf416B74DB3DE55Eb4D7513a80F4841073/" flex items-center py-14px cursor-pointer text-app-text-grey class="hover:text-black" hover:underline underline-offset-1 text-16px font-400 uppercase> <NuxtLink
bg-black
hover:bg-white
w-full
justify-center
to="https://mirror.xyz/0x0f1F3DAf416B74DB3DE55Eb4D7513a80F4841073/"
flex
items-center
py-14px
cursor-pointer
text-app-text-grey
class="hover:text-black"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
ARTICLES ARTICLES
<UnoIcon ml-10px i-web-open1 text-11px /> <UnoIcon
ml-10px
i-web-open1
text-11px
/>
</NuxtLink> </NuxtLink>
<NuxtLink bg-black hover:bg-white w-full justify-center to="https://docs.web3privacy.info/" flex items-center py-14px cursor-pointer text-app-text-grey class="hover:text-black" hover:underline underline-offset-1 text-16px font-400 uppercase> <NuxtLink
bg-black
hover:bg-white
w-full
justify-center
to="https://docs.web3privacy.info/"
flex
items-center
py-14px
cursor-pointer
text-app-text-grey
class="hover:text-black"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
DOCS DOCS
<UnoIcon ml-10px i-web-open1 text-11px /> <UnoIcon
ml-10px
i-web-open1
text-11px
/>
</NuxtLink> </NuxtLink>
</div> </div>
<div w-full sticky md:relative top-0 z-100 bg-black lg:bg-app-bg-dark_grey> <div
<div v-if="!isProjectRoute" relative app-container w-full h-full> w-full
sticky
md:relative
top-0
z-100
bg-black
lg:bg-app-bg-dark_grey
>
<div
v-if="!isProjectRoute"
relative
app-container
w-full
h-full
>
<img <img
absolute w-full h-167px sm:h-207px md:h-303px object-cover src="/web3privacy_eye.webp" z-101 absolute
w-full
h-167px
sm:h-207px
md:h-303px
object-cover
src="/web3privacy_eye.webp"
z-101
class="object-pos-custom left--11% top-0 max-w-250px sm:max-w-335px md:max-w-588px" class="object-pos-custom left--11% top-0 max-w-250px sm:max-w-335px md:max-w-588px"
:class="[(!showText && width < 768) ? 'opacity-0' : 'opacity-10', (!showText && width < 768) ? 'translate-y--128px' : 'translate-y-0px']" duration-200ms :class="[(!showText && width < 768) ? 'opacity-0' : 'opacity-10', (!showText && width < 768) ? 'translate-y--128px' : 'translate-y-0px']"
duration-200ms
> >
</div> </div>
<div app-container flex items-center justify-between h-80px py-6 gap-24px> <div
<div flex gap-16px w-full relative z-105> app-container
<UnoIcon shrink-0 i-web-hamburger text-24px lg:hidden @click="showMenu ? showMenu = false : showMenu = true" /> flex
<NuxtImg max-w-160px w-full src="/logo.svg" cursor-pointer @click="navigateTo('/')" /> items-center
justify-between
h-80px
py-6
gap-24px
>
<div
flex
gap-16px
w-full
relative
z-105
>
<UnoIcon
shrink-0
i-web-hamburger
text-24px
lg:hidden
@click="showMenu ? showMenu = false : showMenu = true"
/>
<NuxtImg
max-w-160px
w-full
src="/logo.svg"
cursor-pointer
@click="navigateTo('/')"
/>
</div> </div>
<div hidden lg:flex items-center justify-center> <div
<NuxtLink to="https://web3privacy.info/" py-2 px-4 cursor-pointer text-app-text-grey class="hover:text-[#c2c2c2]" hover:underline underline-offset-1 text-16px font-400 uppercase> hidden
lg:flex
items-center
justify-center
>
<NuxtLink
to="https://web3privacy.info/"
py-2
px-4
cursor-pointer
text-app-text-grey
class="hover:text-[#c2c2c2]"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
HOME HOME
</NuxtLink> </NuxtLink>
<NuxtLink py-2 px-4 cursor-pointer text-white class="hover:text-[#c2c2c2]" hover:underline underline-offset-1 text-16px font-400 to="/"> <NuxtLink
py-2
px-4
cursor-pointer
text-white
class="hover:text-[#c2c2c2]"
hover:underline
underline-offset-1
text-16px
font-400
to="/"
>
DASHBOARD DASHBOARD
</NuxtLink> </NuxtLink>
<NuxtLink to="https://web3privacy.info/events/" py-2 px-4 cursor-pointer text-app-text-grey class="hover:text-[#c2c2c2]" hover:underline underline-offset-1 text-16px font-400 uppercase> <NuxtLink
to="https://web3privacy.info/events/"
py-2
px-4
cursor-pointer
text-app-text-grey
class="hover:text-[#c2c2c2]"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
EVENTS EVENTS
</NuxtLink> </NuxtLink>
<NuxtLink to="https://mirror.xyz/0x0f1F3DAf416B74DB3DE55Eb4D7513a80F4841073/" flex items-center py-2 px-4 cursor-pointer text-app-text-grey class="hover:text-[#c2c2c2]" hover:underline underline-offset-1 text-16px font-400 uppercase> <NuxtLink
to="https://mirror.xyz/0x0f1F3DAf416B74DB3DE55Eb4D7513a80F4841073/"
flex
items-center
py-2
px-4
cursor-pointer
text-app-text-grey
class="hover:text-[#c2c2c2]"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
ARTICLES ARTICLES
<UnoIcon ml-10px i-web-open1 text-11px /> <UnoIcon
ml-10px
i-web-open1
text-11px
/>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://docs.web3privacy.info/" flex items-center py-2 px-4 cursor-pointer text-app-text-grey class="hover:text-[#c2c2c2]" hover:underline underline-offset-1 text-16px font-400 uppercase> <NuxtLink
to="https://docs.web3privacy.info/"
flex
items-center
py-2
px-4
cursor-pointer
text-app-text-grey
class="hover:text-[#c2c2c2]"
hover:underline
underline-offset-1
text-16px
font-400
uppercase
>
DOCS DOCS
<UnoIcon ml-10px i-web-open1 text-11px /> <UnoIcon
ml-10px
i-web-open1
text-11px
/>
</NuxtLink> </NuxtLink>
</div> </div>
<div w-full h-full flex justify-end items-start lg:grow-0 gap-3 lg:gap-6 pt-1 lg:pt-2.5> <div
w-full
h-full
flex
justify-end
items-start
lg:grow-0
gap-3
lg:gap-6
pt-1
lg:pt-2.5
>
<NuxtLink to="https://twitter.com/web3privacy"> <NuxtLink to="https://twitter.com/web3privacy">
<UnoIcon target="_blank" i-web-twitter_x text-18px sm:text-24px opacity-50 hover:opacity-100 /> <UnoIcon
target="_blank"
i-web-twitter_x
text-18px
sm:text-24px
opacity-50
hover:opacity-100
/>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://t.me/web3privacynow"> <NuxtLink to="https://t.me/web3privacynow">
<UnoIcon target="_blank" i-web-telegram1 text-20px sm:text-24px opacity-50 hover:opacity-100 /> <UnoIcon
target="_blank"
i-web-telegram1
text-20px
sm:text-24px
opacity-50
hover:opacity-100
/>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://matrix.to/#/#web3privacy:gwei.cz"> <NuxtLink to="https://matrix.to/#/#web3privacy:gwei.cz">
<UnoIcon target="_blank" i-web-matrix text-20px sm:text-24px opacity-50 hover:opacity-100 /> <UnoIcon
target="_blank"
i-web-matrix
text-20px
sm:text-24px
opacity-50
hover:opacity-100
/>
</NuxtLink> </NuxtLink>
<NuxtLink to="https://github.com/web3privacy" target="_blank"> <NuxtLink
<UnoIcon i-web-github text-20px sm:text-24px opacity-50 hover:opacity-100 /> to="https://github.com/web3privacy"
target="_blank"
>
<UnoIcon
i-web-github
text-20px
sm:text-24px
opacity-50
hover:opacity-100
/>
</NuxtLink> </NuxtLink>
</div> </div>
</div> </div>
</div> </div>
<div <div
v-if="isProjectRoute" top-96px z-99 sticky md:static v-if="isProjectRoute"
:class="[(!showBar && width < 768) ? 'translate-y--128px' : 'translate-y-0px']" duration-200ms top-96px
z-99
sticky
md:static
:class="[(!showBar && width < 768) ? 'translate-y--128px' : 'translate-y-0px']"
duration-200ms
> >
<ProjectNavigation md:mt-16px /> <ProjectNavigation md:mt-16px />
</div> </div>
<div v-else bg-black lg:bg-app-bg-dark_grey>
<div <div
app-container flex items-center gap-32px pb-16px pt-16px sm:pb-32px v-else
bg-black
lg:bg-app-bg-dark_grey
>
<div
app-container
flex
items-center
gap-32px
pb-16px
pt-16px
sm:pb-32px
>
<div
w-full
flex
flex-col
items-center
:class="[!showText && width < 768 ? 'opacity-0' : 'opacity-100']"
duration-200ms
relative
z-101
>
<img
src="/explorer.webp"
max-w-155px
sm:max-w-342px
>
<p
mt-24px
hidden
md:block
text-14px
text-center
font-400
leading-24px
text-app-text-grey
> >
<div w-full flex flex-col items-center :class="[!showText && width < 768 ? 'opacity-0' : 'opacity-100']" duration-200ms relative z-101>
<img src="/explorer.webp" max-w-155px sm:max-w-342px>
<p mt-24px hidden md:block text-14px text-center font-400 leading-24px text-app-text-grey>
{{ 'There are challenges in finding crucial technical details and comparing various privacy-focused projects.' }}<br> {{ 'There are challenges in finding crucial technical details and comparing various privacy-focused projects.' }}<br>
{{ 'To address this, we created a platform that standardizes and expands the current ' }} {{ 'To address this, we created a platform that standardizes and expands the current ' }}
<NuxtLink to="https://web3privacy.info/" target="_blank" underline text-white> <NuxtLink
to="https://web3privacy.info/"
target="_blank"
underline
text-white
>
{{ 'Web3Privacy ecosystem research.' }} {{ 'Web3Privacy ecosystem research.' }}
</NuxtLink><br> </NuxtLink><br>
{{ 'Our goal is to make this valuable information accessible to the wider Web3 community.' }} {{ 'Our goal is to make this valuable information accessible to the wider Web3 community.' }}
@ -109,10 +411,19 @@ watch(y, (newY, oldY) => {
<NuxtLink <NuxtLink
to="https://github.com/web3privacy/privacy-projects-db" to="https://github.com/web3privacy/privacy-projects-db"
target="_blank" target="_blank"
mt-12px flex text-14px items-center gap-8px sm:text-16px hover:underline mt-12px
flex
text-14px
items-center
gap-8px
sm:text-16px
hover:underline
> >
{{ 'Learn how to contribute' }} {{ 'Learn how to contribute' }}
<UnoIcon i-heroicons-solid-arrow-right text-24px /> <UnoIcon
i-heroicons-solid-arrow-right
text-24px
/>
</NuxtLink> </NuxtLink>
</div> </div>
</div> </div>

View file

@ -3,9 +3,28 @@
</script> </script>
<template> <template>
<NuxtLink w-fit px-16px py-8px flex items-center gap-12px text-app-white hover:text-app-black hover:bg-app-white uppercase cursor-pointer> <NuxtLink
<UnoIcon i-heroicons-solid-arrow-left text-24px /> w-fit
<div text="16px" leading-24px font-400> px-16px
py-8px
flex
items-center
gap-12px
text-app-white
hover:text-app-black
hover:bg-app-white
uppercase
cursor-pointer
>
<UnoIcon
i-heroicons-solid-arrow-left
text-24px
/>
<div
text="16px"
leading-24px
font-400
>
<slot /> <slot />
</div> </div>
</NuxtLink> </NuxtLink>

View file

@ -7,11 +7,20 @@ defineProps<{
</script> </script>
<template> <template>
<ProjectDetailCategoryDivider title="ACTIVITY" badge-text="3/10"> <ProjectDetailCategoryDivider
<UnoIcon i-web-code_v2 text-24px /> title="ACTIVITY"
badge-text="3/10"
>
<UnoIcon
i-web-code_v2
text-24px
/>
</ProjectDetailCategoryDivider> </ProjectDetailCategoryDivider>
<ProjectDetailContainer> <ProjectDetailContainer>
<div lg:flex lg:justify-between> <div
lg:flex
lg:justify-between
>
<div mt-32px> <div mt-32px>
<ProjectActivityLaunch <ProjectActivityLaunch
v-if="project.history" v-if="project.history"
@ -21,9 +30,22 @@ defineProps<{
:to="project.history?.link" :to="project.history?.link"
/> />
</div> </div>
<div flex flex-col gap-24px mt-16px> <div
<ProjectActivityGithub :active-devs="13" last-commit="26/11/2022" :stars="45" /> flex
<ProjectActivityTwitter :followers="13" posts="26/11/202" :retweets="1654" /> flex-col
gap-24px
mt-16px
>
<ProjectActivityGithub
:active-devs="13"
last-commit="26/11/2022"
:stars="45"
/>
<ProjectActivityTwitter
:followers="13"
posts="26/11/202"
:retweets="1654"
/>
</div> </div>
</div> </div>
</ProjectDetailContainer> </ProjectDetailContainer>

View file

@ -7,23 +7,85 @@ defineProps<{
</script> </script>
<template> <template>
<div relative grid grid-cols-2 border-2px gap-y-8px gap-x-32px p-24px lg:grid-cols-3> <div
<h1 px-8px text-14px font-700 bg-black absolute top--10px left-16px> relative
grid
grid-cols-2
border-2px
gap-y-8px
gap-x-32px
p-24px
lg:grid-cols-3
>
<h1
px-8px
text-14px
font-700
bg-black
absolute
top--10px
left-16px
>
{{ 'GITHUB ACTIVITY' }} {{ 'GITHUB ACTIVITY' }}
</h1> </h1>
<div flex flex-col> <div
<span text-14px font-400 text-app-text-grey leading-24px>{{ 'Active Developers' }}</span> flex
<span text-14px font-700 leading-24px>{{ activeDevs }}</span> flex-col
>
<span
text-14px
font-400
text-app-text-grey
leading-24px
>{{ 'Active Developers' }}</span>
<span
text-14px
font-700
leading-24px
>{{ activeDevs }}</span>
</div> </div>
<div flex flex-col> <div
<span text-14px font-400 text-app-text-grey leading-24px>{{ 'Last commit' }}</span> flex
<span text-14px font-700 leading-24px>{{ lastCommit }}</span> flex-col
>
<span
text-14px
font-400
text-app-text-grey
leading-24px
>{{ 'Last commit' }}</span>
<span
text-14px
font-700
leading-24px
>{{ lastCommit }}</span>
</div> </div>
<div flex gap-6px lg:flex-col lg:gap-0> <div
<span text-14px font-400 text-app-text-grey leading-24px>{{ 'Github stars' }}</span> flex
<div flex items-center gap-4px> gap-6px
<UnoIcon i-web-star text-16px /> lg:flex-col
<span text-14px font-400 leading-24px>{{ stars }}</span> lg:gap-0
>
<span
text-14px
font-400
text-app-text-grey
leading-24px
>{{ 'Github stars' }}</span>
<div
flex
items-center
gap-4px
>
<UnoIcon
i-web-star
text-16px
/>
<span
text-14px
font-400
leading-24px
>{{ stars }}</span>
</div> </div>
</div> </div>
</div> </div>

View file

@ -8,28 +8,86 @@ defineProps<{
</script> </script>
<template> <template>
<div flex items-start gap-18px> <div
<svg width="30" height="153" viewBox="0 0 30 153" fill="none" xmlns="http://www.w3.org/2000/svg"> flex
<path d="M12.5002 5.01788L12.5012 149.5" stroke="white" stroke-dasharray="1 4" /> items-start
<circle cx="13" cy="6" r="6" fill="white" /> gap-18px
<rect y="129" width="30" height="24" fill="url(#paint0_linear_558_22)" /> >
<svg
width="30"
height="153"
viewBox="0 0 30 153"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12.5002 5.01788L12.5012 149.5"
stroke="white"
stroke-dasharray="1 4"
/>
<circle
cx="13"
cy="6"
r="6"
fill="white"
/>
<rect
y="129"
width="30"
height="24"
fill="url(#paint0_linear_558_22)"
/>
<defs> <defs>
<linearGradient id="paint0_linear_558_22" x1="15" y1="129" x2="15" y2="150.5" gradientUnits="userSpaceOnUse"> <linearGradient
id="paint0_linear_558_22"
x1="15"
y1="129"
x2="15"
y2="150.5"
gradientUnits="userSpaceOnUse"
>
<stop stop-opacity="0" /> <stop stop-opacity="0" />
<stop offset="1" /> <stop offset="1" />
</linearGradient> </linearGradient>
</defs> </defs>
</svg> </svg>
<div flex flex-col gap-8px> <div
<div flex flex-col> flex
<span text-14px font-700>{{ network }}</span> flex-col
<span text-14px font-400>{{ date }}</span> gap-8px
>
<div
flex
flex-col
>
<span
text-14px
font-700
>{{ network }}</span>
<span
text-14px
font-400
>{{ date }}</span>
</div> </div>
<div flex flex-col> <div
<span text-14px font-400>{{ 'Launch' }}</span> flex
<span text-14px font-400 text-app-text-grey>{{ launchType }}</span> flex-col
>
<span
text-14px
font-400
>{{ 'Launch' }}</span>
<span
text-14px
font-400
text-app-text-grey
>{{ launchType }}</span>
</div> </div>
<NuxtLink underline underline-offset-4 :to="to"> <NuxtLink
underline
underline-offset-4
:to="to"
>
{{ 'Learn more' }} {{ 'Learn more' }}
</NuxtLink> </NuxtLink>
</div> </div>

View file

@ -7,22 +7,81 @@ defineProps<{
</script> </script>
<template> <template>
<div relative grid grid-cols-2 border-2px gap-y-8px gap-x-32px p-24px lg-grid-cols-3> <div
<h1 px-8px text-14px font-700 bg-black absolute top--10px left-16px> relative
grid
grid-cols-2
border-2px
gap-y-8px
gap-x-32px
p-24px
lg-grid-cols-3
>
<h1
px-8px
text-14px
font-700
bg-black
absolute
top--10px
left-16px
>
{{ 'TWITTER ACTIVITY' }} {{ 'TWITTER ACTIVITY' }}
</h1> </h1>
<div flex flex-col> <div
<span text-14px font-400 text-app-text-grey leading-24px>{{ 'Followers #' }}</span> flex
<span text-14px font-700 leading-24px>{{ followers }}</span> flex-col
>
<span
text-14px
font-400
text-app-text-grey
leading-24px
>{{ 'Followers #' }}</span>
<span
text-14px
font-700
leading-24px
>{{ followers }}</span>
</div> </div>
<div flex flex-col> <div
<span text-14px font-400 text-app-text-grey leading-24px>{{ 'Posts' }}</span> flex
<span text-14px font-700 leading-24px>{{ posts }}</span> flex-col
>
<span
text-14px
font-400
text-app-text-grey
leading-24px
>{{ 'Posts' }}</span>
<span
text-14px
font-700
leading-24px
>{{ posts }}</span>
</div> </div>
<div flex gap-6px lg:flex-col lg:gap-0> <div
<span text-14px font-400 text-app-text-grey leading-24px>{{ 'Retweets' }}</span> flex
<div flex items-center gap-4px> gap-6px
<span text-14px font-400 leading-24px>{{ retweets }}x</span> lg:flex-col
lg:gap-0
>
<span
text-14px
font-400
text-app-text-grey
leading-24px
>{{ 'Retweets' }}</span>
<div
flex
items-center
gap-4px
>
<span
text-14px
font-400
leading-24px
>{{ retweets }}x</span>
</div> </div>
</div> </div>
</div> </div>

View file

@ -6,13 +6,37 @@ defineProps<{
</script> </script>
<template> <template>
<div w-full flex justify-between gap-8px lg:gap-32px mt-36px> <div
<div flex items-center gap-8px text-16px font-700 lg:max-w-320px lg:w-full lg:justify-end> w-full
flex
justify-between
gap-8px
lg:gap-32px
mt-36px
>
<div
flex
items-center
gap-8px
text-16px
font-700
lg:max-w-320px
lg:w-full
lg:justify-end
>
<slot /> <slot />
{{ title }} {{ title }}
</div> </div>
<div w-full flex items-center> <div
<hr border-t-2px border-white w-full> w-full
flex
items-center
>
<hr
border-t-2px
border-white
w-full
>
<!-- <Badge text-16px h-32px :text="badgeText" /> --> <!-- <Badge text-16px h-32px :text="badgeText" /> -->
</div> </div>
</div> </div>

View file

@ -1,6 +1,14 @@
<template> <template>
<div lg:flex gap-32px> <div
<div hidden w-full max-w-320px lg:block /> lg:flex
gap-32px
>
<div
hidden
w-full
max-w-320px
lg:block
/>
<div w-full> <div w-full>
<slot /> <slot />
</div> </div>

View file

@ -14,11 +14,23 @@ function showMoreProjects() {
</script> </script>
<template> <template>
<div flex flex-col items-start> <div
<div v-if="displayedProjects.length" grid :class="switcher ? 'grid-cols-1 lg:grid-cols-1' : 'xl:grid-cols-3 lg:grid-cols-3 sm:grid-cols-2 grid-cols-1'" gap-16px text-white w-full> flex
flex-col
items-start
>
<div
v-if="displayedProjects.length"
grid
:class="switcher ? 'grid-cols-1 lg:grid-cols-1' : 'xl:grid-cols-3 lg:grid-cols-3 sm:grid-cols-2 grid-cols-1'"
gap-16px
text-white
w-full
>
<Card <Card
v-for="project in displayedProjects" v-for="project in displayedProjects"
:key="project.id" :project="project" :key="project.id"
:project="project"
/> />
</div> </div>
<div v-else> <div v-else>
@ -26,8 +38,14 @@ function showMoreProjects() {
</div> </div>
<button <button
v-if="displayedProjects.length < projects.length" v-if="displayedProjects.length < projects.length"
mt-29px text="14px" leading-24px font-700 px-12px mt-29px
py-4px border-2px border-app-white text="14px"
leading-24px
font-700
px-12px
py-4px
border-2px
border-app-white
@click="showMoreProjects" @click="showMoreProjects"
> >
Load more projects Load more projects

View file

@ -22,7 +22,7 @@ const availableSupport = computed(() => {
- audit: yes / no - audit: yes / no
*/ */
const calculateScore = computed(() => { const calculateScore = computed(() => {
const criterias: { value: string; key: string }[] = [ const criterias: { value: keyof ProjectIndexable, key: keyof ProjectIndexable | '' }[] = [
{ value: 'product_readiness', key: '' }, { value: 'product_readiness', key: '' },
{ value: 'github', key: 'links' }, { value: 'github', key: 'links' },
{ value: 'docs', key: 'links' }, { value: 'docs', key: 'links' },
@ -35,9 +35,9 @@ const calculateScore = computed(() => {
let value let value
// value = ((criterias[i].key ?? props.project[criterias[i].value as keyof typeof props.project]) ?? null === null) ? null : (props.project as ProjectIndexable)[criterias[i].key][criterias[i].value] // value = ((criterias[i].key ?? props.project[criterias[i].value as keyof typeof props.project]) ?? null === null) ? null : (props.project as ProjectIndexable)[criterias[i].key][criterias[i].value]
const indexableProject = (props.project as ProjectIndexable) const indexableProject = props.project as ProjectIndexable
if (criterias[i].key !== '') if (criterias[i].key !== '')
value = indexableProject?.[criterias[i].key]?.[criterias[i].value] value = (indexableProject[criterias[i].key] as any)?.[criterias[i].value]
else else
value = indexableProject?.[criterias[i].value] value = indexableProject?.[criterias[i].value]
@ -61,7 +61,7 @@ function fulfilled(value: any): boolean {
return true return true
break break
case 'object': case 'object':
if (Object.keys(value).length > 0) if (Object.keys(value!).length > 0)
return true return true
break break
default: default:
@ -74,43 +74,94 @@ const logo = props.project?.logos?.at(0)?.url
</script> </script>
<template> <template>
<div lg:flex lg:gap-32px> <div
lg:flex
lg:gap-32px
>
<NuxtImg <NuxtImg
lg:max-w-320px lg:max-h-320px shrink :src="logo ?? '/no-image-1-1.svg'" lg:max-w-320px
lg:max-h-320px
shrink
:src="logo ?? '/no-image-1-1.svg'"
class="bg-app-bg-grey object-cover max-w-full h-full vertical-align[middle] block border-0 w-full h-[300px]" class="bg-app-bg-grey object-cover max-w-full h-full vertical-align[middle] block border-0 w-full h-[300px]"
/> />
<div grow> <div grow>
<div flex flex-col justify-between gap-32px lg:flex-row lg:items-center> <div
flex
flex-col
justify-between
gap-32px
lg:flex-row
lg:items-center
>
<div mt-24px> <div mt-24px>
<NuxtLink <NuxtLink
:to="project.links?.web" target="_blank" flex items-center gap-12px hover:underline :to="project.links?.web"
target="_blank"
flex
items-center
gap-12px
hover:underline
underline-offset-3 underline-offset-3
> >
<h1 text="24px sm:32px app-white" leading-32px font-700> <h1
text="24px sm:32px app-white"
leading-32px
font-700
>
{{ project.name }} {{ project.name }}
</h1> </h1>
<UnoIcon i-web-openinnew text-16px /> <UnoIcon
i-web-openinnew
text-16px
/>
</NuxtLink> </NuxtLink>
<h2 text="16px app-text-grey" leading-24px mt-8px> <h2
text="16px app-text-grey"
leading-24px
mt-8px
>
{{ project.project_type ?? '---' }} {{ project.project_type ?? '---' }}
</h2> </h2>
</div> </div>
<div <div
border-2px class="border-app-black bg-app-white text-app-black" flex items-center justify-center px-32px border-2px
py-16px text-32px font-700 leading-40px cursor-pointer class="border-app-black bg-app-white text-app-black"
flex
items-center
justify-center
px-32px
py-16px
text-32px
font-700
leading-40px
cursor-pointer
> >
{{ `${calculateScore}%` }} {{ `${calculateScore}%` }}
</div> </div>
</div> </div>
<div grid grid-cols-2 gap-16px my-32px lg:grid-cols-4> <div
<ProjectInfoItem :check-undefined="project.links?.github" title="Github" bold text-size="18px"> grid
grid-cols-2
gap-16px
my-32px
lg:grid-cols-4
>
<ProjectInfoItem
:check-undefined="project.links?.github"
title="Github"
bold
text-size="18px"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-code /> <UnoIcon i-web-code />
</template> </template>
{{ project.links?.github ? 'YES' : 'NO' }} {{ project.links?.github ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.project_status?.version" title="Product readyness" bold :check-undefined="project.project_status?.version"
title="Product readyness"
bold
text-size="18px" text-size="18px"
> >
<template #prefix> <template #prefix>
@ -118,39 +169,80 @@ const logo = props.project?.logos?.at(0)?.url
</template> </template>
{{ project.project_status?.version }} {{ project.project_status?.version }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.team?.length" title="Team" bold text-size="18px"> <ProjectInfoItem
:check-undefined="project.team?.length"
title="Team"
bold
text-size="18px"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-team /> <UnoIcon i-web-team />
</template> </template>
{{ `${project.team?.length} members` }} {{ `${project.team?.length} members` }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.links?.docs" title="Docs" bold text-size="18px"> <ProjectInfoItem
:check-undefined="project.links?.docs"
title="Docs"
bold
text-size="18px"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-docs text-28px /> <UnoIcon
i-web-docs
text-28px
/>
</template> </template>
{{ project.links?.docs ? 'YES' : 'NO' }} {{ project.links?.docs ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.audits" title="Audit" bold text-size="18px"> <ProjectInfoItem
:check-undefined="project.audits"
title="Audit"
bold
text-size="18px"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-audit text-28px /> <UnoIcon
i-web-audit
text-28px
/>
</template> </template>
{{ project.audits ? 'YES' : 'NO' }} {{ project.audits ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.links" title="Available support" bold text-size="18px"> <ProjectInfoItem
:check-undefined="project.links"
title="Available support"
bold
text-size="18px"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-support text-28px /> <UnoIcon
i-web-support
text-28px
/>
</template> </template>
{{ `${availableSupport} channels` }} {{ `${availableSupport} channels` }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div grid grid-cols-2 gap-16px my-32px lg:grid-cols-4> <div
grid
grid-cols-2
gap-16px
my-32px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.network" tooltip-link="/" title="Ecosystem" :check-undefined="project.blockchain_features?.network"
tooltip-link="/"
title="Ecosystem"
bold bold
> >
{{ project.blockchain_features?.network }} {{ project.blockchain_features?.network }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem invisible title="Last update" bold> <ProjectInfoItem
invisible
title="Last update"
bold
>
17/11/2023 23:22 17/11/2023 23:22
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>

View file

@ -33,15 +33,34 @@ function tooltipMouseOut() {
</script> </script>
<template> <template>
<div flex items-start relative> <div
<div h-full flex items-center text-32px gap-12px> flex
items-start
relative
>
<div
h-full
flex
items-center
text-32px
gap-12px
>
<slot name="prefix" /> <slot name="prefix" />
<div /> <div />
</div> </div>
<div class="peer" flex flex-col justify-center w-full> <div
class="peer"
flex
flex-col
justify-center
w-full
>
<h3 <h3
v-if="title" v-if="title"
ref="heading" w-fit text="14px sm:16px app-text-grey" leading-24px ref="heading"
w-fit
text="14px sm:16px app-text-grey"
leading-24px
:class="[tooltip ? 'cursor-pointer underline underline-offset-5 decoration-dotted hover:decoration-solid hover:text-app-white' : '']" :class="[tooltip ? 'cursor-pointer underline underline-offset-5 decoration-dotted hover:decoration-solid hover:text-app-white' : '']"
@mouseover="showTooltip = true" @mouseover="showTooltip = true"
@mouseout="headingMouseOut()" @mouseout="headingMouseOut()"
@ -49,23 +68,47 @@ function tooltipMouseOut() {
{{ title }} {{ title }}
</h3> </h3>
<template v-if="checkUndefined === undefined || checkUndefined === null"> <template v-if="checkUndefined === undefined || checkUndefined === null">
<span opacity-50 leading-24px font-700 text-14px :class="`sm:text-${textSize ?? '16px'}`">{{ 'N/A' }}</span> <span
opacity-50
leading-24px
font-700
text-14px
:class="`sm:text-${textSize ?? '16px'}`"
>{{ 'N/A' }}</span>
</template> </template>
<template v-else> <template v-else>
<template v-if="link"> <template v-if="link">
<div <div
flex gap-6px items-center justify-start hover:underline hover:text-white text-14px flex
gap-6px
items-center
justify-start
hover:underline
hover:text-white
text-14px
:color="color ?? '#FFF'" :color="color ?? '#FFF'"
class="hoverEl" class="hoverEl"
:class="`sm:text-${textSize ?? '16px'} font-${bold ? '700' : '400'} opacity-${opacity}`" :class="`sm:text-${textSize ?? '16px'} font-${bold ? '700' : '400'} opacity-${opacity}`"
leading-24px @click.prevent="navigateTo(link, { external: true, open: { target: '_blank' } })" leading-24px
@click.prevent="navigateTo(link, { external: true, open: { target: '_blank' } })"
> >
<slot /> <slot />
<UnoIcon i-web-openinnew text-16px text-app-text-grey class="customHover" /> <UnoIcon
i-web-openinnew
text-16px
text-app-text-grey
class="customHover"
/>
</div> </div>
</template> </template>
<div v-else :color="color ?? '#FFF'" text-14px :class="`sm:text-${textSize ?? '16px'} font-${bold ? '700' : '400'} opacity-${opacity}`" leading-24px> <div
v-else
:color="color ?? '#FFF'"
text-14px
:class="`sm:text-${textSize ?? '16px'} font-${bold ? '700' : '400'} opacity-${opacity}`"
leading-24px
>
<slot /> <slot />
</div> </div>
</template> </template>
@ -82,12 +125,23 @@ function tooltipMouseOut() {
{{ tooltip }} {{ tooltip }}
<NuxtLink <NuxtLink
v-if="tooltipLink" v-if="tooltipLink"
mt-12px text-14px font-400 leading-20px underline underline-offset-2 mt-12px
text-14px
font-400
leading-20px
underline
underline-offset-2
:to="tooltipLink" :to="tooltipLink"
> >
{{ 'Learn More' }} {{ 'Learn More' }}
</NuxtLink> </NuxtLink>
<div w-16px h-16px absolute bg-white class="top--8px left-50% translate-x--50% rotate-45 z-99" /> <div
w-16px
h-16px
absolute
bg-white
class="top--8px left-50% translate-x--50% rotate-45 z-99"
/>
</div> </div>
</div> </div>
</template> </template>

View file

@ -2,10 +2,21 @@
</script> </script>
<template> <template>
<ProjectDetailCategoryDivider title="MARKET" badge-text="3/10"> <ProjectDetailCategoryDivider
<UnoIcon i-web-code_v2 text-24px /> title="MARKET"
badge-text="3/10"
>
<UnoIcon
i-web-code_v2
text-24px
/>
</ProjectDetailCategoryDivider> </ProjectDetailCategoryDivider>
<ProjectDetailContainer> <ProjectDetailContainer>
<div mt-32px w-full h-500px bg-dark /> <div
mt-32px
w-full
h-500px
bg-dark
/>
</ProjectDetailContainer> </ProjectDetailContainer>
</template> </template>

View file

@ -9,16 +9,63 @@ const githubProjectUrl = computed(() => {
</script> </script>
<template> <template>
<div app-container w-full flex items-center justify-between md:bg-transparent px-8px> <div
<NavigationButton w-230px @click="$router.back()"> app-container
<span block md:hidden>{{ 'BACK' }}</span> w-full
<span hidden whitespace-nowrap md:block>{{ 'BACK TO LIST' }}</span> flex
items-center
justify-between
md:bg-transparent
px-8px
>
<NavigationButton
w-230px
@click="$router.back()"
>
<span
block
md:hidden
>{{ 'BACK' }}</span>
<span
hidden
whitespace-nowrap
md:block
>{{ 'BACK TO LIST' }}</span>
</NavigationButton> </NavigationButton>
<hr hidden md:block border-t-2px border-white w-full> <hr
<div flex gap-16px> hidden
<EditButton px-16px py-8px hover:bg-white hover:text-black :to="githubProjectUrl"> md:block
<span text-16px whitespace-nowrap font-400 leading-24px hidden md:block>{{ 'EDIT RESEARCH' }}</span> border-t-2px
<span text-16px whitespace-nowrap font-400 leading-24px block md:hidden>{{ 'EDIT' }}</span> border-white
w-full
>
<div
flex
gap-16px
>
<EditButton
px-16px
py-8px
hover:bg-white
hover:text-black
:to="githubProjectUrl"
>
<span
text-16px
whitespace-nowrap
font-400
leading-24px
hidden
md:block
>{{ 'EDIT RESEARCH' }}</span>
<span
text-16px
whitespace-nowrap
font-400
leading-24px
block
md:hidden
>{{ 'EDIT' }}</span>
</EditButton> </EditButton>
<!-- <ShareButton> <!-- <ShareButton>
<span text-16px font-400 hidden md:block>{{ 'SHARE' }}</span> <span text-16px font-400 hidden md:block>{{ 'SHARE' }}</span>

View file

@ -7,109 +7,224 @@ defineProps<{
</script> </script>
<template> <template>
<ProjectDetailCategoryDivider title="OPENESS" badge-text="3/10"> <ProjectDetailCategoryDivider
<UnoIcon i-web-code_v2 text-24px /> title="OPENESS"
badge-text="3/10"
>
<UnoIcon
i-web-code_v2
text-24px
/>
</ProjectDetailCategoryDivider> </ProjectDetailCategoryDivider>
<ProjectDetailContainer> <ProjectDetailContainer>
<div mt-32px text="14px sm:16px" leading-24px font-400> <div
mt-32px
text="14px sm:16px"
leading-24px
font-400
>
<h3 text-app-text-grey> <h3 text-app-text-grey>
{{ 'Project Description' }} {{ 'Project Description' }}
</h3> </h3>
<span text="14px sm:16px" leading-20px>{{ project.description ?? '---' }}</span> <span
text="14px sm:16px"
leading-20px
>{{ project.description ?? '---' }}</span>
</div> </div>
<div mt-24px> <div mt-24px>
<h3 text="14px sm:16px app-text-grey" leading-20px> <h3
text="14px sm:16px app-text-grey"
leading-20px
>
{{ 'Infrastructure links' }} {{ 'Infrastructure links' }}
</h3> </h3>
<div grid grid-cols-2 gap-16px mt-8px lg:grid-cols-4> <div
<ProjectOpenessLink v-if="project.links?.web" :to="project.links?.web"> grid
grid-cols-2
gap-16px
mt-8px
lg:grid-cols-4
>
<ProjectOpenessLink
v-if="project.links?.web"
:to="project.links?.web"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-website /> <UnoIcon i-web-website />
</template> </template>
{{ 'Website' }} {{ 'Website' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.blog" :to="project.links.blog"> <ProjectOpenessLink
v-if="project.links?.blog"
:to="project.links.blog"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-website /> <UnoIcon i-web-website />
</template> </template>
{{ 'Blog' }} {{ 'Blog' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.github" :to="project.links?.github"> <ProjectOpenessLink
v-if="project.links?.github"
:to="project.links?.github"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-github opacity-30 text-27px /> <UnoIcon
i-web-github
opacity-30
text-27px
/>
</template> </template>
{{ 'Github' }} {{ 'Github' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.docs" :to="project.links?.docs"> <ProjectOpenessLink
v-if="project.links?.docs"
:to="project.links?.docs"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-documents text-24px /> <UnoIcon
i-web-documents
text-24px
/>
</template> </template>
{{ 'Docs' }} {{ 'Docs' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.block_explorer" :to="project.links.block_explorer"> <ProjectOpenessLink
v-if="project.links?.block_explorer"
:to="project.links.block_explorer"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-explorer opacity-30 /> <UnoIcon
i-web-explorer
opacity-30
/>
</template> </template>
{{ 'Explorer' }} {{ 'Explorer' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.snapshot" :to="project.links.snapshot"> <ProjectOpenessLink
v-if="project.links?.snapshot"
:to="project.links.snapshot"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-snapshot text-32px /> <UnoIcon
i-web-snapshot
text-32px
/>
</template> </template>
{{ 'Snapshot' }} {{ 'Snapshot' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.token" :to="project.links.token"> <ProjectOpenessLink
v-if="project.links?.token"
:to="project.links.token"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-token text-28px /> <UnoIcon
i-web-token
text-28px
/>
</template> </template>
{{ 'Token' }} {{ 'Token' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.coingecko" :to="project.links.coingecko"> <ProjectOpenessLink
v-if="project.links?.coingecko"
:to="project.links.coingecko"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-coingecko opacity-30 text-24px /> <UnoIcon
i-web-coingecko
opacity-30
text-24px
/>
</template> </template>
{{ 'Coingecko' }} {{ 'Coingecko' }}
</ProjectOpenessLink> </ProjectOpenessLink>
</div> </div>
</div> </div>
<div mt-24px> <div mt-24px>
<h3 text="14px sm:16px app-text-grey" leading-20px> <h3
text="14px sm:16px app-text-grey"
leading-20px
>
{{ 'Socials' }} {{ 'Socials' }}
</h3> </h3>
<div grid grid-cols-2 gap-16px mt-8px lg:grid-cols-4> <div
<ProjectOpenessLink v-if="project.links?.forum" :to="project.links.forum"> grid
grid-cols-2
gap-16px
mt-8px
lg:grid-cols-4
>
<ProjectOpenessLink
v-if="project.links?.forum"
:to="project.links.forum"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-forum opacity-30 text-28px /> <UnoIcon
i-web-forum
opacity-30
text-28px
/>
</template> </template>
{{ 'Forum' }} {{ 'Forum' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.discord" :to="project.links.discord"> <ProjectOpenessLink
v-if="project.links?.discord"
:to="project.links.discord"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-discord text-27px /> <UnoIcon
i-web-discord
text-27px
/>
</template> </template>
{{ 'Discord' }} {{ 'Discord' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.twitter" :to="project.links.twitter"> <ProjectOpenessLink
v-if="project.links?.twitter"
:to="project.links.twitter"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-twitter_x opacity-30 text-22px /> <UnoIcon
i-web-twitter_x
opacity-30
text-22px
/>
</template> </template>
{{ 'Twitter' }} {{ 'Twitter' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.lens" :to="project.links.lens"> <ProjectOpenessLink
v-if="project.links?.lens"
:to="project.links.lens"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-lens text-32px /> <UnoIcon
i-web-lens
text-32px
/>
</template> </template>
{{ 'Lens' }} {{ 'Lens' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.farcaster" :to="project.links.farcaster"> <ProjectOpenessLink
v-if="project.links?.farcaster"
:to="project.links.farcaster"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-farcaster text-26px /> <UnoIcon
i-web-farcaster
text-26px
/>
</template> </template>
{{ 'Farcaster' }} {{ 'Farcaster' }}
</ProjectOpenessLink> </ProjectOpenessLink>
<ProjectOpenessLink v-if="project.links?.telegram" :to="project.links.telegram"> <ProjectOpenessLink
v-if="project.links?.telegram"
:to="project.links.telegram"
>
<template #prefix> <template #prefix>
<UnoIcon i-web-telegram opacity-30 text-22px /> <UnoIcon
i-web-telegram
opacity-30
text-22px
/>
</template> </template>
{{ 'Telegram' }} {{ 'Telegram' }}
</ProjectOpenessLink> </ProjectOpenessLink>
@ -118,30 +233,63 @@ defineProps<{
<div mt-24px> <div mt-24px>
<ProjectOpenessTeamMembers :members="project.team" /> <ProjectOpenessTeamMembers :members="project.team" />
</div> </div>
<div grid grid-cols-2 items-start mt-32px gap-y-26px lg:grid-cols-4> <div
<ProjectInfoItem :check-undefined="project.product_launch_day" title="Product launch day"> grid
grid-cols-2
items-start
mt-32px
gap-y-26px
lg:grid-cols-4
>
<ProjectInfoItem
:check-undefined="project.product_launch_day"
title="Product launch day"
>
{{ project.product_launch_day }} {{ project.product_launch_day }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
title="Opensource" bold title="Opensource"
bold
:check-undefined="project.blockchain_features?.opensource" :check-undefined="project.blockchain_features?.opensource"
:color=" project.blockchain_features?.opensource ? '#A8FF18' : '#FF0000'" :color=" project.blockchain_features?.opensource ? '#A8FF18' : '#FF0000'"
> >
{{ project.blockchain_features?.opensource ? 'Yes' : 'No' }} {{ project.blockchain_features?.opensource ? 'Yes' : 'No' }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div mt-32px w-full> <div
<ProjectInfoItem mt-32px
:check-undefined="project.funding"
title="Funding" bold
w-full w-full
> >
<template v-for="fund in project.funding" :key="fund.name"> <ProjectInfoItem
<div mt-16px grid grid-cols-2 sm:grid-cols-4> :check-undefined="project.funding"
title="Funding"
bold
w-full
>
<template
v-for="fund in project.funding"
:key="fund.name"
>
<div
mt-16px
grid
grid-cols-2
sm:grid-cols-4
>
<span v-if="fund.name">{{ fund.name }}</span> <span v-if="fund.name">{{ fund.name }}</span>
<span v-if="fund.time" font-400>{{ fund.time }}</span> <span
<span v-if="fund.time" font-400 text-app-text-grey>{{ fund.type }}</span> v-if="fund.time"
<span v-if="fund.time" font-400>{{ fund.value }}</span> font-400
>{{ fund.time }}</span>
<span
v-if="fund.time"
font-400
text-app-text-grey
>{{ fund.type }}</span>
<span
v-if="fund.time"
font-400
>{{ fund.value }}</span>
</div> </div>
</template> </template>
</ProjectInfoItem> </ProjectInfoItem>

View file

@ -5,12 +5,33 @@ defineProps<{
</script> </script>
<template> <template>
<NuxtLink :to="to" flex items-center gap-12px> <NuxtLink
<div flex justify-center items-center w-32px h-32px text-32px> :to="to"
flex
items-center
gap-12px
>
<div
flex
justify-center
items-center
w-32px
h-32px
text-32px
>
<slot name="prefix" /> <slot name="prefix" />
</div> </div>
<div flex flex-col justify-center> <div
<div text="14px sm:16px app-white" font-400 leading-24px hover:underline> flex
flex-col
justify-center
>
<div
text="14px sm:16px app-white"
font-400
leading-24px
hover:underline
>
<slot /> <slot />
</div> </div>
</div> </div>

File diff suppressed because one or more lines are too long

View file

@ -10,38 +10,101 @@ const props = defineProps<{
<template> <template>
<div> <div>
<h3 text="14px sm:16px app-text-grey" leading-24px> <h3
text="14px sm:16px app-text-grey"
leading-24px
>
{{ 'Team members' }} {{ 'Team members' }}
</h3> </h3>
<div grid grid-cols-1 gap-16px mt-12px sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4> <div
grid
grid-cols-1
gap-16px
mt-12px
sm:grid-cols-2
md:grid-cols-3
lg:grid-cols-4
>
<template v-if="props.members?.length"> <template v-if="props.members?.length">
<template v-for="member in members" :key="member.name"> <template
<div flex gap-12px> v-for="member in members"
:key="member.name"
>
<div
flex
gap-12px
>
<template v-if="member.link"> <template v-if="member.link">
<NuxtImg :src="member.link" width="48" height="48" :alt="member.name" /> <NuxtImg
:src="member.link"
width="48"
height="48"
:alt="member.name"
/>
</template> </template>
<template v-else> <template v-else>
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg
<circle opacity="0.2" cx="24" cy="24" r="23.5" stroke="white" /> width="48"
height="48"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle
opacity="0.2"
cx="24"
cy="24"
r="23.5"
stroke="white"
/>
<g opacity="0.2"> <g opacity="0.2">
<mask id="mask0_2200_7716" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="12" y="12" width="24" height="24"> <mask
<rect x="12" y="12" width="24" height="24" fill="#D9D9D9" /> id="mask0_2200_7716"
style="mask-type:alpha"
maskUnits="userSpaceOnUse"
x="12"
y="12"
width="24"
height="24"
>
<rect
x="12"
y="12"
width="24"
height="24"
fill="#D9D9D9"
/>
</mask> </mask>
<g mask="url(#mask0_2200_7716)"> <g mask="url(#mask0_2200_7716)">
<path d="M24 24C22.9 24 21.9583 23.6083 21.175 22.825C20.3917 22.0417 20 21.1 20 20C20 18.9 20.3917 17.9583 21.175 17.175C21.9583 16.3917 22.9 16 24 16C25.1 16 26.0417 16.3917 26.825 17.175C27.6083 17.9583 28 18.9 28 20C28 21.1 27.6083 22.0417 26.825 22.825C26.0417 23.6083 25.1 24 24 24ZM16 32V29.2C16 28.6333 16.1458 28.1125 16.4375 27.6375C16.7292 27.1625 17.1167 26.8 17.6 26.55C18.6333 26.0333 19.6833 25.6458 20.75 25.3875C21.8167 25.1292 22.9 25 24 25C25.1 25 26.1833 25.1292 27.25 25.3875C28.3167 25.6458 29.3667 26.0333 30.4 26.55C30.8833 26.8 31.2708 27.1625 31.5625 27.6375C31.8542 28.1125 32 28.6333 32 29.2V32H16Z" fill="white" /> <path
d="M24 24C22.9 24 21.9583 23.6083 21.175 22.825C20.3917 22.0417 20 21.1 20 20C20 18.9 20.3917 17.9583 21.175 17.175C21.9583 16.3917 22.9 16 24 16C25.1 16 26.0417 16.3917 26.825 17.175C27.6083 17.9583 28 18.9 28 20C28 21.1 27.6083 22.0417 26.825 22.825C26.0417 23.6083 25.1 24 24 24ZM16 32V29.2C16 28.6333 16.1458 28.1125 16.4375 27.6375C16.7292 27.1625 17.1167 26.8 17.6 26.55C18.6333 26.0333 19.6833 25.6458 20.75 25.3875C21.8167 25.1292 22.9 25 24 25C25.1 25 26.1833 25.1292 27.25 25.3875C28.3167 25.6458 29.3667 26.0333 30.4 26.55C30.8833 26.8 31.2708 27.1625 31.5625 27.6375C31.8542 28.1125 32 28.6333 32 29.2V32H16Z"
fill="white"
/>
</g> </g>
</g> </g>
</svg> </svg>
</template> </template>
<div flex flex-col> <div
<span text="14px sm:16px" font-700>{{ member.name }}</span> flex
<span text="14px sm:16px app-text-grey" font-400>{{ member.role ?? 'N/A' }}</span> flex-col
>
<span
text="14px sm:16px"
font-700
>{{ member.name }}</span>
<span
text="14px sm:16px app-text-grey"
font-400
>{{ member.role ?? 'N/A' }}</span>
</div> </div>
</div> </div>
</template> </template>
</template> </template>
<template v-else> <template v-else>
<span text-14px opacity-50>{{ 'N/A' }}</span> <span
text-14px
opacity-50
>{{ 'N/A' }}</span>
</template> </template>
</div> </div>
</div> </div>

View file

@ -7,27 +7,43 @@ defineProps<{
</script> </script>
<template> <template>
<ProjectDetailCategoryDivider title="PRIVACY" badge-text="3/10"> <ProjectDetailCategoryDivider
<UnoIcon i-web-code_v2 text-24px /> title="PRIVACY"
badge-text="3/10"
>
<UnoIcon
i-web-code_v2
text-24px
/>
</ProjectDetailCategoryDivider> </ProjectDetailCategoryDivider>
<ProjectDetailContainer> <ProjectDetailContainer>
<div grid grid-cols-2 items-start mt-32px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.p2p" :check-undefined="project.blockchain_features?.p2p"
bold title="Peer to Peer (P2P)" bold
title="Peer to Peer (P2P)"
> >
{{ project.blockchain_features?.p2p ? 'YES' : 'NO' }} {{ project.blockchain_features?.p2p ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.tracebility?.kyc" :check-undefined="project.tracebility?.kyc"
bold :color="project.tracebility?.kyc ? '#FF0000' : '#18FF2F'" bold
:color="project.tracebility?.kyc ? '#FF0000' : '#18FF2F'"
title="Know Your Customer (KYC)" title="Know Your Customer (KYC)"
> >
{{ project.tracebility?.kyc ? 'YES' : 'NO' }} {{ project.tracebility?.kyc ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.storage" :check-undefined="project.storage"
bold title="Decentralized storage" bold
title="Decentralized storage"
:color="project.storage?.decentralized ? '#18FF2F' : '#FF0000'" :color="project.storage?.decentralized ? '#18FF2F' : '#FF0000'"
> >
{{ project.storage?.decentralized ? 'YES' : 'NO' }} {{ project.storage?.decentralized ? 'YES' : 'NO' }}
@ -40,88 +56,163 @@ defineProps<{
{{ project.default_privacy ? 'YES' : 'NO' }} {{ project.default_privacy ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div grid grid-cols-2 items-start mt-32px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.revealed_recipient" :check-undefined="project.blockchain_features?.revealed_recipient"
:color="project.blockchain_features?.revealed_recipient ? '#FF0000' : '#18FF2F'" :color="project.blockchain_features?.revealed_recipient ? '#FF0000' : '#18FF2F'"
bold title="Revealed recipient" bold
title="Revealed recipient"
> >
{{ project.blockchain_features?.revealed_recipient ? 'YES' : 'NO' }} {{ project.blockchain_features?.revealed_recipient ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.revealed_sender" :check-undefined="project.blockchain_features?.revealed_sender"
:color="project.blockchain_features?.revealed_sender ? '#FF0000' : '#18FF2F'" :color="project.blockchain_features?.revealed_sender ? '#FF0000' : '#18FF2F'"
bold title="Revealed sender" bold
title="Revealed sender"
> >
{{ project.blockchain_features?.revealed_sender ? 'YES' : 'NO' }} {{ project.blockchain_features?.revealed_sender ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.revealed_ammount" :check-undefined="project.blockchain_features?.revealed_ammount"
:color="project.blockchain_features?.revealed_ammount ? '#FF0000' : '#18FF2F'" :color="project.blockchain_features?.revealed_ammount ? '#FF0000' : '#18FF2F'"
bold title="Revealed amount" bold
title="Revealed amount"
> >
{{ project.blockchain_features?.revealed_ammount ? 'YES' : 'NO' }} {{ project.blockchain_features?.revealed_ammount ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.reversability_condition" :check-undefined="project.blockchain_features?.reversability_condition"
bold title="Reversability" bold
title="Reversability"
> >
{{ project.blockchain_features?.reversability_condition }} {{ project.blockchain_features?.reversability_condition }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div grid grid-cols-2 items-start mt-32px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.connected_tx" :check-undefined="project.blockchain_features?.connected_tx"
:color="project.blockchain_features?.connected_tx ? '#FF0000' : '#18FF2F'" :color="project.blockchain_features?.connected_tx ? '#FF0000' : '#18FF2F'"
bold title="Connected Txs" bold
title="Connected Txs"
> >
{{ project.blockchain_features?.connected_tx ? 'YES' : 'NO' }} {{ project.blockchain_features?.connected_tx ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.blockchain_features?.data_masking" bold title="Data masking"> <ProjectInfoItem
:check-undefined="project.blockchain_features?.data_masking"
bold
title="Data masking"
>
{{ project.blockchain_features?.data_masking }} {{ project.blockchain_features?.data_masking }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.blockchain_features?.tx_history" bold title="Tx history"> <ProjectInfoItem
:check-undefined="project.blockchain_features?.tx_history"
bold
title="Tx history"
>
{{ project.blockchain_features?.tx_history ? 'YES' : 'NO' }} {{ project.blockchain_features?.tx_history ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div my-24px> <div my-24px>
<hr border-t-2px border-white opacity-20 w-80px> <hr
border-t-2px
border-white
opacity-20
w-80px
>
</div> </div>
<div grid grid-cols-2 items-start mt-32px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.privacy_policy" :check-undefined="project.privacy_policy"
:color="project.privacy_policy?.defined ? '#18FF2F' : '#FF0000'" :color="project.privacy_policy?.defined ? '#18FF2F' : '#FF0000'"
bold title="Privacy Policy" bold
title="Privacy Policy"
> >
{{ project.privacy_policy?.defined ? 'YES' : 'NO' }} {{ project.privacy_policy?.defined ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.tracebility?.tracked_data" title="Collected data"> <ProjectInfoItem
:check-undefined="project.tracebility?.tracked_data"
title="Collected data"
>
{{ project.tracebility?.tracked_data }} {{ project.tracebility?.tracked_data }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.privacy_policy?.data_usage" title="Data usage"> <ProjectInfoItem
:check-undefined="project.privacy_policy?.data_usage"
title="Data usage"
>
{{ project.privacy_policy?.data_usage }} {{ project.privacy_policy?.data_usage }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.blockchain_features?.frontend_anonymity" bold title="Frontend anonymity"> <ProjectInfoItem
:check-undefined="project.blockchain_features?.frontend_anonymity"
bold
title="Frontend anonymity"
>
{{ project.blockchain_features?.frontend_anonymity }} {{ project.blockchain_features?.frontend_anonymity }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div my-24px> <div my-24px>
<hr border-t-2px border-white opacity-20 w-80px> <hr
border-t-2px
border-white
opacity-20
w-80px
>
</div> </div>
<div grid grid-cols-2 items-start mt-32px gap-y-16px> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.compliance" :check-undefined="project.compliance"
:color="project.compliance ? '#FF0000' : '#18FF2F'" :color="project.compliance ? '#FF0000' : '#18FF2F'"
bold title="Compliance" bold
title="Compliance"
> >
{{ project.compliance ? 'YES' : 'NO' }} {{ project.compliance ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div grid grid-cols-2 items-start mt-32px gap-y-16px> <div
<ProjectInfoItem :check-undefined="project.tracebility?.sign_in_type_requirments" bold title="Sign-in requirements"> grid
grid-cols-2
items-start
mt-32px
gap-y-16px
>
<ProjectInfoItem
:check-undefined="project.tracebility?.sign_in_type_requirments"
bold
title="Sign-in requirements"
>
{{ project.tracebility?.sign_in_type_requirments }} {{ project.tracebility?.sign_in_type_requirments }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.blockchain_features?.identity_integration" title="Identity integrations"> <ProjectInfoItem
:check-undefined="project.blockchain_features?.identity_integration"
title="Identity integrations"
>
{{ project.blockchain_features?.identity_integration }} {{ project.blockchain_features?.identity_integration }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>

View file

@ -7,14 +7,28 @@ defineProps<{
</script> </script>
<template> <template>
<ProjectDetailCategoryDivider title="SECURITY" badge-text="3/10"> <ProjectDetailCategoryDivider
<UnoIcon i-web-code_v2 text-24px /> title="SECURITY"
badge-text="3/10"
>
<UnoIcon
i-web-code_v2
text-24px
/>
</ProjectDetailCategoryDivider> </ProjectDetailCategoryDivider>
<ProjectDetailContainer> <ProjectDetailContainer>
<div grid grid-cols-2 items-start mt-32px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.blockchain_features?.asset_custody_type" :check-undefined="project.blockchain_features?.asset_custody_type"
bold title="Asset custody" bold
title="Asset custody"
> >
{{ project.blockchain_features?.asset_custody_type }} {{ project.blockchain_features?.asset_custody_type }}
</ProjectInfoItem> </ProjectInfoItem>
@ -27,12 +41,17 @@ defineProps<{
</b> </b>
{{ ` ${project.blockchain_features?.upgradability?.type}` }} {{ ` ${project.blockchain_features?.upgradability?.type}` }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.social_trust" title="Social dependency"> <ProjectInfoItem
:check-undefined="project.social_trust"
title="Social dependency"
>
{{ project.social_trust }} {{ project.social_trust }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.third_party_dependency" :check-undefined="project.third_party_dependency"
bold :color="project.third_party_dependency ? '#FF0000' : '#18FF2F'" title="Third-party dependency" bold
:color="project.third_party_dependency ? '#FF0000' : '#18FF2F'"
title="Third-party dependency"
> >
{{ project.third_party_dependency ? 'YES' : 'NO' }} {{ project.third_party_dependency ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
@ -45,19 +64,36 @@ defineProps<{
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div my-24px> <div my-24px>
<hr border-t-2px border-white opacity-20 w-80px> <hr
border-t-2px
border-white
opacity-20
w-80px
>
</div> </div>
<div v-if="project.audits"> <div v-if="project.audits">
<h2 text-18px text-app-text-grey my-24px> <h2
text-18px
text-app-text-grey
my-24px
>
Audits Audits
</h2> </h2>
<template v-for="audit in project.audits" :key="audit.name"> <template
v-for="audit in project.audits"
:key="audit.name"
>
<ProjectSecurityAudit <ProjectSecurityAudit
:audit-name="audit.name" :audit-name="audit.name"
:audit-url="audit.link" :audit-url="audit.link"
:date="audit.time" :date="audit.time"
> >
<NuxtImg :src="audit.logo ?? '/no-image-1-1.svg'" w-64px h-64px object-cover /> <NuxtImg
:src="audit.logo ?? '/no-image-1-1.svg'"
w-64px
h-64px
object-cover
/>
</ProjectSecurityAudit> </ProjectSecurityAudit>
</template> </template>
</div> </div>

View file

@ -7,14 +7,38 @@ defineProps<{
</script> </script>
<template> <template>
<div flex items-center gap-16px> <div
flex
items-center
gap-16px
>
<slot /> <slot />
<div flex flex-col text-14px font-700 leading-24px> <div
<NuxtLink hover:underline flex items-center gap-8px :to="auditUrl"> flex
flex-col
text-14px
font-700
leading-24px
>
<NuxtLink
hover:underline
flex
items-center
gap-8px
:to="auditUrl"
>
{{ auditName }} {{ auditName }}
<UnoIcon v-if="auditUrl" i-web-openinnew text-16px /> <UnoIcon
v-if="auditUrl"
i-web-openinnew
text-16px
/>
</NuxtLink> </NuxtLink>
<span text-14px font-400 leading-24px>{{ date }}</span> <span
text-14px
font-400
leading-24px
>{{ date }}</span>
</div> </div>
</div> </div>
</template> </template>

View file

@ -7,14 +7,28 @@ defineProps<{
</script> </script>
<template> <template>
<ProjectDetailCategoryDivider title="TECHNOLOGY" badge-text="3/10"> <ProjectDetailCategoryDivider
<UnoIcon i-web-code_v2 text-24px /> title="TECHNOLOGY"
badge-text="3/10"
>
<UnoIcon
i-web-code_v2
text-24px
/>
</ProjectDetailCategoryDivider> </ProjectDetailCategoryDivider>
<ProjectDetailContainer> <ProjectDetailContainer>
<div grid grid-cols-2 items-start mt-32px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-2
items-start
mt-32px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.technology?.type" :check-undefined="project.technology?.type"
title="Technology type" bold title="Technology type"
bold
> >
{{ project.technology?.type }} {{ project.technology?.type }}
</ProjectInfoItem> </ProjectInfoItem>
@ -32,22 +46,52 @@ defineProps<{
> >
{{ project.licences }} {{ project.licences }}
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem :check-undefined="project.links?.whitepaper" title="Whitepaper" bold :link="project.links?.whitepaper"> <ProjectInfoItem
:check-undefined="project.links?.whitepaper"
title="Whitepaper"
bold
:link="project.links?.whitepaper"
>
{{ project.links?.whitepaper ? 'YES' : 'NO' }} {{ project.links?.whitepaper ? 'YES' : 'NO' }}
</ProjectInfoItem> </ProjectInfoItem>
</div> </div>
<div grid grid-cols-1 items-start mt-16px gap-y-16px lg:grid-cols-4> <div
grid
grid-cols-1
items-start
mt-16px
gap-y-16px
lg:grid-cols-4
>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.project_status" :check-undefined="project.project_status"
title="Version" title="Version"
bold bold
> >
<div v-if="project.project_status?.live_status" flex items-center gap-12px> <div
<UnoIcon i-web-live text-10px class="color-#B5E26B" /> v-if="project.project_status?.live_status"
flex
items-center
gap-12px
>
<UnoIcon
i-web-live
text-10px
class="color-#B5E26B"
/>
<span>{{ `Live on ${project.project_status.version}` }}</span> <span>{{ `Live on ${project.project_status.version}` }}</span>
</div> </div>
<div v-else flex items-center gap-12px> <div
<UnoIcon i-web-live text-10px class="color-#e26b6b" /> v-else
flex
items-center
gap-12px
>
<UnoIcon
i-web-live
text-10px
class="color-#e26b6b"
/>
<span>{{ 'Offline' }}</span> <span>{{ 'Offline' }}</span>
</div> </div>
</ProjectInfoItem> </ProjectInfoItem>
@ -60,9 +104,13 @@ defineProps<{
</ProjectInfoItem> </ProjectInfoItem>
<ProjectInfoItem <ProjectInfoItem
:check-undefined="project.client_diversability" :check-undefined="project.client_diversability"
title="Client diversability" bold title="Client diversability"
bold
>
<template
v-for="item in project.client_diversability"
:key="item.name"
> >
<template v-for="item in project.client_diversability" :key="item.name">
<NuxtLink :to="item.link"> <NuxtLink :to="item.link">
{{ item.name }} {{ item.name }}
</NuxtLink><br> </NuxtLink><br>

View file

@ -12,33 +12,103 @@ const isSearchFocused = ref(false)
</script> </script>
<template> <template>
<div flex justify-between gap-16px items-centeer> <div
<div border-2px flex items-center max-w-320px w-full hover:opacity-100 :class="isSearchFocused ? 'opacity-100' : 'opacity-25'"> flex
<div px-12px py-0px flex w-fit> justify-between
gap-16px
items-centeer
>
<div
border-2px
flex
items-center
max-w-320px
w-full
hover:opacity-100
:class="isSearchFocused ? 'opacity-100' : 'opacity-25'"
>
<div
px-12px
py-0px
flex
w-fit
>
<UnoIcon <UnoIcon
i-web-search text-16px i-web-search
text-16px
:class="isSearchFocused ? 'opacity-100' : 'opacity-50' " :class="isSearchFocused ? 'opacity-100' : 'opacity-50' "
class="uno-icon" class="uno-icon"
/> />
</div> </div>
<input <input
v-model="filter.query" type="text" v-model="filter.query"
bg-transparent border-transparent type="text"
focus:border-transparent focus:ring-0 bg-transparent
h-full w-full outline-none @focus="isSearchFocused = true" @blur="isSearchFocused = false" border-transparent
focus:border-transparent
focus:ring-0
h-full
w-full
outline-none
@focus="isSearchFocused = true"
@blur="isSearchFocused = false"
> >
</div> </div>
<div> <div>
<div flex gap-24px items-center w-full> <div
<div gap-12px items-center xl:flex hidden invisible> flex
<UnoIcon i-web-list text-16px cursor-pointer hover:opacity-100 :class="switcher ? 'opacity-100' : 'opacity-50'" @click="switcher = true" /> gap-24px
<UnoIcon i-web-blocks text-16px cursor-pointer hover:opacity-100 :class="!switcher ? 'opacity-100' : 'opacity-50'" @click="switcher = false" /> items-center
w-full
>
<div
gap-12px
items-center
xl:flex
hidden
invisible
>
<UnoIcon
i-web-list
text-16px
cursor-pointer
hover:opacity-100
:class="switcher ? 'opacity-100' : 'opacity-50'"
@click="switcher = true"
/>
<UnoIcon
i-web-blocks
text-16px
cursor-pointer
hover:opacity-100
:class="!switcher ? 'opacity-100' : 'opacity-50'"
@click="switcher = false"
/>
</div> </div>
<div flex gap-12px items-center w-full> <div
<h4 xl:block hidden text-16px opacity-50 w-fit> flex
gap-12px
items-center
w-full
>
<h4
xl:block
hidden
text-16px
opacity-50
w-fit
>
Sort by Sort by
</h4> </h4>
<SelectBox v-model="filter.sortby" :black-and-white="false" :options="options" w-99px sm:w-162px text-black :is-margin-top="false" /> <SelectBox
v-model="filter.sortby"
:black-and-white="false"
:options="options"
w-99px
sm:w-162px
text-black
:is-margin-top="false"
/>
</div> </div>
</div> </div>
</div> </div>

View file

@ -18,33 +18,50 @@ const selectedValue = useVModel(props, 'modelValue', emits)
</script> </script>
<template> <template>
<HeadlessListbox v-model="selectedValue" as="div"> <HeadlessListbox
<div class="relative font-700" :class="[isMarginTop ? 'mt-2' : 'mt-0', blackAndWhite ? 'bg-app-black' : 'bg-app-white']"> v-model="selectedValue"
as="div"
>
<div
class="relative font-700"
:class="[isMarginTop ? 'mt-2' : 'mt-0', blackAndWhite ? 'bg-app-black' : 'bg-app-white']"
>
<HeadlessListboxButton <HeadlessListboxButton
class="relative w-full cursor-pointer py-8px p-16px text-left border-2px sm:text-sm sm:leading-6" :class="[blackAndWhite ? ' text-app-white' : 'text-app-black']" class="relative w-full cursor-pointer py-8px p-16px text-left border-2px sm:text-sm sm:leading-6"
:class="[blackAndWhite ? ' text-app-white' : 'text-app-black']"
> >
<span class="block truncate mr-8px">{{ props.options.find(option => option.value === selectedValue)?.label }}</span> <span class="block truncate mr-8px">{{ props.options.find(option => option.value === selectedValue)?.label }}</span>
<span class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"> <span class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2">
<UnoIcon i-heroicons-solid-chevron-down :class="[blackAndWhite ? ' text-app-white' : 'text-app-black']" /> <UnoIcon
i-heroicons-solid-chevron-down
:class="[blackAndWhite ? ' text-app-white' : 'text-app-black']"
/>
</span> </span>
</HeadlessListboxButton> </HeadlessListboxButton>
<transition <transition
leave-active-class="transition ease-in duration-100" leave-from-class="opacity-100" leave-active-class="transition ease-in duration-100"
leave-from-class="opacity-100"
leave-to-class="opacity-0" leave-to-class="opacity-0"
> >
<HeadlessListboxOptions <HeadlessListboxOptions
class="absolute z-100 max-h-60 w-full divide-y-2px border-2px border-t-0 overflow-auto bg-app-black text-app-white focus:outline-none sm:text-sm" class="absolute z-100 max-h-60 w-full divide-y-2px border-2px border-t-0 overflow-auto bg-app-black text-app-white focus:outline-none sm:text-sm"
> >
<HeadlessListboxOption <HeadlessListboxOption
v-for="option in props.options" :key="option.value" v-slot="{ active, selected }" v-for="option in props.options"
as="template" :value="option.value" :key="option.value"
v-slot="{ active, selected }"
as="template"
:value="option.value"
> >
<li <li
class="w-full relative cursor-pointer select-none py-8px p-16px" class="w-full relative cursor-pointer select-none py-8px p-16px"
:class="[active ? 'bg-#ffffff1a' : 'text-white']" :class="[active ? 'bg-#ffffff1a' : 'text-white']"
> >
<span class="block truncate" :class="[selected ? 'font-semibold' : 'font-normal']">{{ option.label }}</span> <span
class="block truncate"
:class="[selected ? 'font-semibold' : 'font-normal']"
>{{ option.label }}</span>
</li> </li>
</HeadlessListboxOption> </HeadlessListboxOption>
</HeadlessListboxOptions> </HeadlessListboxOptions>

View file

@ -2,8 +2,14 @@
</script> </script>
<template> <template>
<div flex gap-12px> <div
<UnoIcon i-heroicons-solid-share text-24px /> flex
gap-12px
>
<UnoIcon
i-heroicons-solid-share
text-24px
/>
<slot /> <slot />
</div> </div>
</template> </template>

View file

@ -12,8 +12,23 @@ const selectedValue = useVModel(props, 'modelValue', emits)
</script> </script>
<template> <template>
<div flex items-center gap-16px> <div
<div v-for="option in options" :key="option.value" :class="[selectedValue === option.value ? 'font-700 text-app-black bg-app-white' : 'font-400 text-app-white border-app-white']" text-24px leading-32px px-16px py-8px border-2px cursor-pointer @click="selectedValue = option.value"> flex
items-center
gap-16px
>
<div
v-for="option in options"
:key="option.value"
:class="[selectedValue === option.value ? 'font-700 text-app-black bg-app-white' : 'font-400 text-app-white border-app-white']"
text-24px
leading-32px
px-16px
py-8px
border-2px
cursor-pointer
@click="selectedValue = option.value"
>
{{ option.label }} {{ option.label }}
</div> </div>
</div> </div>

12
eslint.config.mjs Normal file
View file

@ -0,0 +1,12 @@
// @ts-check
import withNuxt from './.nuxt/eslint.config.mjs'
export default withNuxt(
// Your custom configs here
{
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'vue/multi-word-component-names': 'off',
},
},
)

View file

@ -14,7 +14,7 @@ const selectedCategory = computed(() => {
const sortedFilteredCategories = computed(() => ([ const sortedFilteredCategories = computed(() => ([
categories.value.find(c => c.id === 'defi')!, categories.value.find(c => c.id === 'defi')!,
...categories.value.sort((a, b) => a.name.localeCompare(b.name)).filter(c => c.id !== 'defi'), ...[...categories.value].sort((a, b) => a.name.localeCompare(b.name)).filter(c => c.id !== 'defi'),
])) ]))
const { showBar } = storeToRefs(useNavigaiton()) const { showBar } = storeToRefs(useNavigaiton())
@ -38,39 +38,95 @@ watch([scrollY, top, y], (newValues, oldValues) => {
</script> </script>
<template> <template>
<div ref="swipeEl" flex flex-col min-h-100vh h-full w-full> <div
ref="swipeEl"
flex
flex-col
min-h-100vh
h-full
w-full
>
<Navigation /> <Navigation />
<div app-container mt-32px> <div
<div flex w-full xl:gap-32px> app-container
mt-32px
>
<div
flex
w-full
xl:gap-32px
>
<div w-fit> <div w-fit>
<div <div
ref="scrollEl" ref="scrollEl"
class="no-scrollbar" class="no-scrollbar"
h-100vh overflow-y-auto sticky top-32px hidden xl:block min-w-234px pb-48px h-100vh
overflow-y-auto
sticky
top-32px
hidden
xl:block
min-w-234px
pb-48px
> >
<Category <Category
v-for="category in sortedFilteredCategories" v-for="category in sortedFilteredCategories"
:key="category.id" :title="category.name" :key="category.id"
:count="category.projectsCount" :selected="selectedCategoryId === category.id" :title="category.name"
:count="category.projectsCount"
:selected="selectedCategoryId === category.id"
@click="[navigateTo(`/category/${category.id}`), selectedCategoryId = category.id]" @click="[navigateTo(`/category/${category.id}`), selectedCategoryId = category.id]"
/> />
</div> </div>
</div> </div>
<div w-full> <div w-full>
<div flex flex-col gap-16px w-full> <div
<div xl:hidden block> flex
<h2 text-14px font-700> flex-col
gap-16px
w-full
>
<div
xl:hidden
block
>
<h2
text-14px
font-700
>
Choose category Choose category
</h2> </h2>
<CategorySelectBox v-model="selectedCategoryId" :options="extendedOptions" w-full @selected="selectedCategoryId === 'all' ? navigateTo(`/`) : navigateTo(`/category/${selectedCategoryId}`)" /> <CategorySelectBox
v-model="selectedCategoryId"
:options="extendedOptions"
w-full
@selected="selectedCategoryId === 'all' ? navigateTo(`/`) : navigateTo(`/category/${selectedCategoryId}`)"
/>
</div> </div>
<SearchBox /> <SearchBox />
</div> </div>
<div flex gap-28px items-center my-24px mt-28px> <div
<h2 v-if="selectedCategoryId" w-max font-700 text-18px sm:text-28px whitespace-nowrap> flex
gap-28px
items-center
my-24px
mt-28px
>
<h2
v-if="selectedCategoryId"
w-max
font-700
text-18px
sm:text-28px
whitespace-nowrap
>
{{ selectedCategoryId === 'all' ? `${filteredProjectsCount} All Projects` : `${filteredProjectsCount ?? 0} ${selectedCategory?.name}` }} {{ selectedCategoryId === 'all' ? `${filteredProjectsCount} All Projects` : `${filteredProjectsCount ?? 0} ${selectedCategory?.name}` }}
</h2> </h2>
<div h-2px w="full" bg-white /> <div
h-2px
w="full"
bg-white
/>
</div> </div>
<slot /> <slot />
</div> </div>

View file

@ -12,7 +12,11 @@ watch(y, (newY, oldY) => {
</script> </script>
<template> <template>
<div ref="swipeEl" h-full w-full> <div
ref="swipeEl"
h-full
w-full
>
<Navigation /> <Navigation />
<slot /> <slot />
</div> </div>

View file

@ -1,6 +1,7 @@
// https://nuxt.com/docs/api/configuration/nuxt-config // https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({ export default defineNuxtConfig({
modules: [ modules: [
'@nuxt/eslint',
'@vueuse/nuxt', '@vueuse/nuxt',
'@unocss/nuxt', '@unocss/nuxt',
'@pinia/nuxt', '@pinia/nuxt',
@ -21,8 +22,6 @@ export default defineNuxtConfig({
// when using generate, payload js assets included in sw precache manifest // when using generate, payload js assets included in sw precache manifest
// but missing on offline, disabling extraction it until fixed // but missing on offline, disabling extraction it until fixed
payloadExtraction: false, payloadExtraction: false,
inlineSSRStyles: false,
reactivityTransform: true,
// typedPages: true, // typedPages: true,
componentIslands: true, componentIslands: true,
}, },
@ -32,6 +31,11 @@ export default defineNuxtConfig({
colorMode: { colorMode: {
classSuffix: '', classSuffix: '',
}, },
eslint: {
config: {
stylistic: true,
},
},
nitro: { nitro: {
preset: 'vercel', preset: 'vercel',
esbuild: { esbuild: {

View file

@ -1,7 +1,7 @@
{ {
"name": "develitesse-nuxt", "name": "develitesse-nuxt",
"private": true, "private": true,
"packageManager": "pnpm@8.12.1", "packageManager": "pnpm@9.9.0",
"scripts": { "scripts": {
"build": "nuxt build", "build": "nuxt build",
"cleanup": "nuxt cleanup", "cleanup": "nuxt cleanup",
@ -16,29 +16,35 @@
"typecheck": "nuxt typecheck --no-emit" "typecheck": "nuxt typecheck --no-emit"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "0.43.1", "@formkit/auto-animate": "^0.8.2",
"@formkit/auto-animate": "^0.8.1", "@iconify-json/heroicons-outline": "^1.2.0",
"@iconify-json/heroicons-outline": "^1.1.10", "@iconify-json/heroicons-solid": "^1.2.0",
"@iconify-json/heroicons-solid": "^1.1.11", "@nuxt/devtools": "^1.4.1",
"@nuxt/devtools": "^1.0.6", "@nuxt/eslint": "0.5.5",
"@nuxt/image": "^1.1.0", "@nuxt/image": "^1.8.0",
"@nuxt/test-utils": "^3.9.0", "@nuxt/test-utils": "^3.14.1",
"@nuxtjs/color-mode": "^3.3.2", "@nuxtjs/color-mode": "^3.4.4",
"@pinia/nuxt": "^0.5.1", "@pinia/nuxt": "^0.5.4",
"@unocss/nuxt": "^0.58.0", "@unocss/nuxt": "^0.62.3",
"@vueuse/nuxt": "^10.7.0", "@vueuse/nuxt": "^11.0.3",
"eslint": "^8.56.0", "eslint": "^9.9.1",
"nuxt": "^3.8.2", "nuxt": "^3.13.0",
"nuxt-headlessui": "^1.1.4", "nuxt-headlessui": "^1.2.0",
"nuxt-lodash": "^2.5.3", "nuxt-lodash": "^2.5.3",
"pinia": "^2.1.7", "pinia": "^2.2.2",
"pnpm": "^8.12.1", "taze": "^0.16.7",
"taze": "^0.13.0", "typescript": "^5.5.4",
"typescript": "^5.3.3", "vitest": "^2.0.5",
"vitest": "^1.1.0", "vue-tsc": "^2.1.4"
"vue-tsc": "^1.8.25"
}, },
"overrides": { "overrides": {
"vue": "latest" "vue": "latest"
},
"simple-git-hooks": {
"commit-msg": "npx commitlint --edit $1",
"pre-commit": "npx lint-staged"
},
"lint-staged": {
"*": "eslint --fix"
} }
} }

View file

@ -33,7 +33,12 @@ useSeoMeta({
<template> <template>
<div v-if="project"> <div v-if="project">
<div app-container> <div app-container>
<div flex flex-col gap-48px mt-54px> <div
flex
flex-col
gap-48px
mt-54px
>
<div> <div>
<div> <div>
<ProjectHeading :project="project" /> <ProjectHeading :project="project" />

View file

@ -7,26 +7,39 @@ const options: InputOption[] = [
const loremIpsum: string = 'Description just text Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tempus nulla quis enim vulputate semper. Duis varius nibh sed magna tincidunt pellentesque.' const loremIpsum: string = 'Description just text Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tempus nulla quis enim vulputate semper. Duis varius nibh sed magna tincidunt pellentesque.'
const cardData = { // const cardData = {
image: 'https://ctrlv.cz/Epud', // image: 'https://ctrlv.cz/Epud',
title1: 'title1', // title1: 'title1',
title2: 'title2', // title2: 'title2',
percentage: 84, // percentage: 84,
anonymity: true, // anonymity: true,
decentralized: true, // decentralized: true,
opensource: true, // opensource: true,
license: 'MIT', // license: 'MIT',
datatracking: true, // datatracking: true,
compliance: true, // compliance: true,
} // }
const selectedOption = ref('all') const selectedOption = ref('all')
</script> </script>
<template> <template>
<div flex flex-col items-start justify-start gap-8px> <div
<Category title="All Projects" :count="503" /> flex
<Category title="All Projects" :count="503" selected /> flex-col
items-start
justify-start
gap-8px
>
<Category
title="All Projects"
:count="503"
/>
<Category
title="All Projects"
:count="503"
selected
/>
<Button mt-16px> <Button mt-16px>
<template #prefix> <template #prefix>
<UnoIcon i-heroicons-solid-pencil /> <UnoIcon i-heroicons-solid-pencil />
@ -36,19 +49,39 @@ const selectedOption = ref('all')
<Button> <Button>
Save Research Save Research
</Button> </Button>
<MenuItem title="Dashboard" mt-16px /> <MenuItem
<MenuItem title="Dashboard" selected /> title="Dashboard"
mt-16px
/>
<MenuItem
title="Dashboard"
selected
/>
<Badge text="84%" /> <Badge text="84%" />
<Badge text="84%" inverted /> <Badge
<SelectBox v-model="selectedOption" mt-16px :options="options" /> text="84%"
<h1 custom-link mt-16px> inverted
/>
<SelectBox
v-model="selectedOption"
mt-16px
:options="options"
/>
<h1
custom-link
mt-16px
>
Custom Link Custom Link
</h1> </h1>
<Helper :info="loremIpsum" /> <Helper :info="loremIpsum" />
<NavigationButton @click="$router.back()"> <NavigationButton @click="$router.back()">
Back Back
</NavigationButton> </NavigationButton>
<Tabs v-model="selectedOption" mt-16px :options="options" /> <Tabs
v-model="selectedOption"
mt-16px
:options="options"
/>
<!-- <Card <!-- <Card
v-if="cardData" v-if="cardData"
id="test" id="test"

File diff suppressed because it is too large Load diff

View file

@ -145,5 +145,5 @@ export interface ProjectShallow {
} }
export interface ProjectIndexable extends Project { export interface ProjectIndexable extends Project {
[key: string]: any [key: string]: unknown
} }