Compare commits

...

6 Commits

Author SHA1 Message Date
DecDuck 107ee40f43 Merge branch 'develop' into v0.4.0 2026-03-30 22:22:56 +11:00
DecDuck ee2e3e5e32 Merge remote-tracking branch 'server/libarchive-backend' into v0.4.0 2026-03-30 19:19:54 +11:00
DecDuck 9ce40297ea Merge remote-tracking branch 'promo/v0.4.0' into v0.4.0 2026-03-30 19:15:58 +11:00
DecDuck 6a9d74ef84 feat: move to libarchive backend 2026-03-01 22:57:22 +11:00
DecDuck 581198f9e6 fix: vulns 2026-03-01 22:11:57 +11:00
DecDuck 1a6b11df68 feat: dark mode 2026-02-18 15:23:24 +11:00
22 changed files with 553 additions and 494 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

+13 -13
View File
@@ -25,14 +25,14 @@ function Header() {
<section className="mt-16 grid grid-cols-1 lg:grid-cols-2 lg:gap-12"> <section className="mt-16 grid grid-cols-1 lg:grid-cols-2 lg:gap-12">
<div className="max-w-lg"> <div className="max-w-lg">
<h2 className="text-2xl font-medium tracking-tight">Our mission</h2> <h2 className="text-2xl font-medium tracking-tight">Our mission</h2>
<p className="mt-6 text-sm/6 text-gray-600"> <p className="mt-6 text-sm/6 text-zinc-400">
We aim to build a &quot;Steam-like experience for DRM-free We aim to build a &quot;Steam-like experience for DRM-free
games&quot;. One of the major sticking points of DRM games, and why games&quot;. One of the major sticking points of DRM games, and why
platforms like Steam have done so well, is that they provide awesome platforms like Steam have done so well, is that they provide awesome
features like worldwide play-together, social features, and useful features like worldwide play-together, social features, and useful
overlays and tools. We aim to replicate this for <i>any</i> game. overlays and tools. We aim to replicate this for <i>any</i> game.
</p> </p>
<p className="mt-8 text-sm/6 text-gray-600"> <p className="mt-8 text-sm/6 text-zinc-400">
Don&apos;t get us wrong, we don&apos;t think Steam or Valve is bad. Don&apos;t get us wrong, we don&apos;t think Steam or Valve is bad.
They are unusually consumer-friendly, and provide a great service. They are unusually consumer-friendly, and provide a great service.
They will always have a place, providing a marketplace for DRM They will always have a place, providing a marketplace for DRM
@@ -41,16 +41,16 @@ function Header() {
</div> </div>
<div className="max-lg:mt-16 lg:col-span-1"> <div className="max-lg:mt-16 lg:col-span-1">
<Subheading>The Numbers</Subheading> <Subheading>The Numbers</Subheading>
<hr className="mt-6 border-t border-gray-200" /> <hr className="mt-6 border-t border-zinc-800" />
<dl className="mt-6 grid grid-cols-1 gap-x-8 gap-y-4 sm:grid-cols-2"> <dl className="mt-6 grid grid-cols-1 gap-x-8 gap-y-4 sm:grid-cols-2">
<div className="flex flex-col gap-y-2 border-b border-dotted border-gray-200 pb-4"> <div className="flex flex-col gap-y-2 border-b border-dotted border-zinc-800 pb-4">
<dt className="text-sm/6 text-gray-600">Lines of code</dt> <dt className="text-sm/6 text-zinc-400">Lines of code</dt>
<dd className="order-first text-6xl font-medium tracking-tight"> <dd className="order-first text-6xl font-medium tracking-tight">
<AnimatedNumber start={10} end={40} />k <AnimatedNumber start={10} end={40} />k
</dd> </dd>
</div> </div>
<div className="flex flex-col gap-y-2 border-b border-dotted border-gray-200 pb-4"> <div className="flex flex-col gap-y-2 border-b border-dotted border-zinc-800 pb-4">
<dt className="text-sm/6 text-gray-600"> <dt className="text-sm/6 text-zinc-400">
Individual open-source projects Individual open-source projects
</dt> </dt>
<dd className="order-first text-6xl font-medium tracking-tight"> <dd className="order-first text-6xl font-medium tracking-tight">
@@ -59,13 +59,13 @@ function Header() {
</dd> </dd>
</div> </div>
<div className="flex flex-col gap-y-2 max-sm:border-b max-sm:border-dotted max-sm:border-gray-200 max-sm:pb-4"> <div className="flex flex-col gap-y-2 max-sm:border-b max-sm:border-dotted max-sm:border-gray-200 max-sm:pb-4">
<dt className="text-sm/6 text-gray-600">Docker pulls</dt> <dt className="text-sm/6 text-zinc-400">Docker pulls</dt>
<dd className="order-first text-6xl font-medium tracking-tight"> <dd className="order-first text-6xl font-medium tracking-tight">
<AnimatedNumber start={0} end={48.8} decimals={1} />k <AnimatedNumber start={0} end={48.8} decimals={1} />k
</dd> </dd>
</div> </div>
<div className="flex flex-col gap-y-2"> <div className="flex flex-col gap-y-2">
<dt className="text-sm/6 text-gray-600">Contributors</dt> <dt className="text-sm/6 text-zinc-400">Contributors</dt>
<dd className="order-first text-6xl font-medium tracking-tight"> <dd className="order-first text-6xl font-medium tracking-tight">
&gt; &gt;
<AnimatedNumber start={0} end={15} /> <AnimatedNumber start={0} end={15} />
@@ -91,7 +91,7 @@ function FrequentlyAskedQuestions() {
<dt className="text-sm font-semibold"> <dt className="text-sm font-semibold">
Do you intend to replace Steam? Do you intend to replace Steam?
</dt> </dt>
<dd className="mt-4 text-sm/6 text-gray-600"> <dd className="mt-4 text-sm/6 text-zinc-400">
No. Drop is not a replacement for Steam, in the sense that we will No. Drop is not a replacement for Steam, in the sense that we will
ever offer a marketplace for developers to sell games. Drop can ever offer a marketplace for developers to sell games. Drop can
replace Steam <i>for an individual</i>, if they only played replace Steam <i>for an individual</i>, if they only played
@@ -102,7 +102,7 @@ function FrequentlyAskedQuestions() {
<dt className="text-sm font-semibold"> <dt className="text-sm font-semibold">
Will Drop ever cost money or require a subscription? Will Drop ever cost money or require a subscription?
</dt> </dt>
<dd className="mt-4 text-sm/6 text-gray-600"> <dd className="mt-4 text-sm/6 text-zinc-400">
We believe in <strong>paying for services, not code</strong>. All We believe in <strong>paying for services, not code</strong>. All
our projects are and always will be open source (AGPLv3), and we our projects are and always will be open source (AGPLv3), and we
endeavour to allow users to self-host as much of it as possible. endeavour to allow users to self-host as much of it as possible.
@@ -114,7 +114,7 @@ function FrequentlyAskedQuestions() {
</dl> </dl>
<dl> <dl>
<dt className="text-sm font-semibold">Is Drop legal?</dt> <dt className="text-sm font-semibold">Is Drop legal?</dt>
<dd className="mt-4 text-sm/6 text-gray-600"> <dd className="mt-4 text-sm/6 text-zinc-400">
Yes. Officially, Drop is <strong>only</strong> for DRM-free games, Yes. Officially, Drop is <strong>only</strong> for DRM-free games,
like the ones you purchase from GOG or download from itch.io,{' '} like the ones you purchase from GOG or download from itch.io,{' '}
<strong>and</strong> that you have a license to redistribute. We <strong>and</strong> that you have a license to redistribute. We
@@ -126,7 +126,7 @@ function FrequentlyAskedQuestions() {
</dl> </dl>
<dl> <dl>
<dt className="text-sm font-semibold">How can I support Drop or get involved?</dt> <dt className="text-sm font-semibold">How can I support Drop or get involved?</dt>
<dd className="mt-4 text-sm/6 text-gray-600"> <dd className="mt-4 text-sm/6 text-zinc-400">
Thank you for helping us out! If you&apos;re looking to contribute Thank you for helping us out! If you&apos;re looking to contribute
code, check out our{' '} code, check out our{' '}
<Link <Link
+1 -1
View File
@@ -15,7 +15,7 @@ export default function RootLayout({
}>) { }>) {
return ( return (
<html lang="en"> <html lang="en">
<body className="text-gray-950 antialiased"> <body className="text-zinc-100 bg-zinc-950 antialiased">
{children} {children}
</body> </body>
</html> </html>
+3 -3
View File
@@ -61,7 +61,7 @@ export default async function BlogPost({
className="aspect-square size-6 rounded-full object-cover" className="aspect-square size-6 rounded-full object-cover"
/> />
)} )}
<div className="text-sm/5 text-gray-700">{author.name}</div> <div className="text-sm/5 text-zinc-300">{author.name}</div>
</div> </div>
)} )}
{ {
@@ -69,7 +69,7 @@ export default async function BlogPost({
{tags.map((tag) => ( {tags.map((tag) => (
<div <div
key={tag} key={tag}
className="rounded-full border border-dotted border-gray-300 bg-gray-50 px-2 text-sm/6 font-medium text-gray-500" className="rounded-full border border-dotted border-zinc-800 bg-zinc-900 px-2 text-sm/6 font-medium text-zinc-400"
> >
{tag} {tag}
</div> </div>
@@ -77,7 +77,7 @@ export default async function BlogPost({
</div> </div>
} }
</div> </div>
<div className="text-gray-700"> <div className="text-zinc-400">
<div className="max-w-2xl xl:mx-auto"> <div className="max-w-2xl xl:mx-auto">
{post.image && ( {post.image && (
<img <img
+1 -1
View File
@@ -17,7 +17,7 @@ export default function About() {
<Container> <Container>
<Navbar /> <Navbar />
</Container> </Container>
<main className="grid min-h-full place-items-center bg-white px-6 py-24 sm:py-32 lg:px-8"> <main className="grid min-h-full place-items-center px-6 py-24 sm:py-32 lg:px-8">
<div className="text-center"> <div className="text-center">
<Subheading>404</Subheading> <Subheading>404</Subheading>
<Heading> <Heading>
+51 -18
View File
@@ -5,8 +5,8 @@ import { Footer } from '@/components/footer'
import { Gradient } from '@/components/gradient' import { Gradient } from '@/components/gradient'
import { LogoCluster } from '@/components/logo-cluster' import { LogoCluster } from '@/components/logo-cluster'
import { Navbar } from '@/components/navbar' import { Navbar } from '@/components/navbar'
import { Screenshot } from '@/components/screenshot'
import { Heading, Subheading } from '@/components/text' import { Heading, Subheading } from '@/components/text'
import { ArrowDownCircleIcon } from '@heroicons/react/24/solid'
import type { Metadata } from 'next' import type { Metadata } from 'next'
export const metadata: Metadata = { export const metadata: Metadata = {
@@ -21,16 +21,18 @@ function Hero() {
<Container className="relative"> <Container className="relative">
<Navbar /> <Navbar />
<div className="pt-16 pb-24 sm:pt-24 sm:pb-32 md:pt-32 md:pb-48"> <div className="pt-16 pb-24 sm:pt-24 sm:pb-32 md:pt-32 md:pb-48">
<h1 className="font-display text-6xl/[0.9] font-medium tracking-tight text-balance text-gray-950 sm:text-8xl/[0.8] md:text-9xl/[0.8]"> <h1 className="font-display text-6xl/[0.9] font-medium tracking-tight text-balance text-zinc-100 sm:text-8xl/[0.8] md:text-9xl/[0.8]">
An open Steam. An open Steam.
</h1> </h1>
<p className="mt-8 max-w-lg text-xl/7 font-medium text-gray-950/75 sm:text-2xl/8"> <p className="mt-8 max-w-lg text-xl/7 font-medium text-zinc-100/75 sm:text-2xl/8">
Drop is an open-source, self-hosted alternative to platforms like Drop is an open-source, self-hosted alternative to platforms like
Steam and Epic. Steam and Epic.
</p> </p>
<div className="mt-12 flex flex-col gap-x-6 gap-y-4 sm:flex-row"> <div className="mt-12 flex flex-col gap-x-6 gap-y-4 sm:flex-row">
<Button href="https://docs.droposs.org/docs/guides/quickstart">Get started</Button> <Button href="https://docs.droposs.org/docs/guides/quickstart">
<Button variant="secondary" href="/about"> Get started
</Button>
<Button variant="outline" href="/about">
About About
</Button> </Button>
</div> </div>
@@ -42,18 +44,49 @@ function Hero() {
function FeatureSection() { function FeatureSection() {
return ( return (
<div className="overflow-hidden"> <div className="py-24 sm:py-32">
<Container className="pb-24"> <div className="mx-auto max-w-7xl px-6 lg:px-8">
<Heading as="h2" className="max-w-3xl"> <div className="mx-auto max-w-2xl sm:text-center">
A better experience for DRM&#8209;free games. <Subheading>Drop OSS</Subheading>
</Heading> <Heading as="h3" className="mt-2 max-w-4xl">
<Screenshot The ultimate self-hosted game manager.
width={3408} </Heading>
height={1846}
src="/screenshots/app.webp" <p className="mt-6 text-lg/8 text-zinc-400">
className="mt-16 h-144 sm:h-auto sm:w-304" Drop is built from the ground up to be flexible, fast, and
/> beautiful. It's designed to scale with your library, and handle
</Container> thousands of games.
</p>
</div>
</div>
<div className="relative overflow-hidden pt-16">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<img
alt="App screenshot"
src="/gallery/store.png"
width={1920}
height={1071}
className="mb-[-5%] rounded-xl shadow-2xl ring-1 ring-gray-900/10"
/>
<div aria-hidden="true" className="relative">
<div className="absolute -inset-x-20 bottom-0 bg-linear-to-t from-zinc-950 pt-[7%]" />
</div>
</div>
</div>
<div className="mx-auto mt-16 max-w-7xl px-6 sm:mt-20 md:mt-24 lg:px-8">
<dl className="mx-auto grid max-w-2xl grid-cols-1 gap-x-6 gap-y-10 text-base/7 text-zinc-400 sm:grid-cols-2 lg:mx-0 lg:max-w-none lg:grid-cols-3 lg:gap-x-8 lg:gap-y-16">
<div className="relative pl-9">
<dt className="inline font-semibold text-zinc-100">
<ArrowDownCircleIcon
aria-hidden="true"
className="absolute top-1 left-1 size-5 text-blue-600"
/>
ADASDASD
</dt>{' '}
<dd className="inline">ASDASDASDAS</dd>
</div>
</dl>
</div>
</div> </div>
) )
} }
@@ -132,7 +165,7 @@ export default function Home() {
<div className="overflow-hidden"> <div className="overflow-hidden">
<Hero /> <Hero />
<main> <main>
<div className="bg-linear-to-b from-white from-50% to-gray-100 py-32"> <div className="bg-linear-to-b pb-16">
<FeatureSection /> <FeatureSection />
<BentoSection /> <BentoSection />
</div> </div>
+1 -2
View File
@@ -26,7 +26,7 @@ function CTA() {
<div className="mt-12 grid grid-cols-1 gap-12 lg:grid-cols-2"> <div className="mt-12 grid grid-cols-1 gap-12 lg:grid-cols-2">
<div className="max-w-lg"> <div className="max-w-lg">
<p className="text-sm/6 text-gray-600"> <p className="text-sm/6 text-zinc-400">
If you&apos;re looking to give back to the project financially - If you&apos;re looking to give back to the project financially -
first off, thank you. It really does help a lot. There are two first off, thank you. It really does help a lot. There are two
options for contributing: our OpenCollective, which funds options for contributing: our OpenCollective, which funds
@@ -45,7 +45,6 @@ function CTA() {
<Button <Button
className="w-full sm:w-auto" className="w-full sm:w-auto"
href="/about#team" href="/about#team"
variant="secondary"
> >
Team &rarr; Team &rarr;
</Button> </Button>
+4 -11
View File
@@ -29,28 +29,21 @@ export function BentoCard({
data-dark={dark ? 'true' : undefined} data-dark={dark ? 'true' : undefined}
className={clsx( className={clsx(
className, className,
'group relative flex flex-col overflow-hidden rounded-lg', 'group relative flex flex-col overflow-hidden rounded-lg ring-1',
'bg-white shadow-xs ring-1 ring-black/5', 'bg-zinc-900 ring-white/15',
'data-dark:bg-gray-800 data-dark:ring-white/15',
)} )}
> >
<div className="relative h-80 shrink-0"> <div className="relative h-80 shrink-0">
{graphic} {graphic}
{fade.includes('top') && (
<div className="absolute inset-0 bg-linear-to-b from-white to-50% group-data-dark:from-gray-800 group-data-dark:from-[-25%]" />
)}
{fade.includes('bottom') && (
<div className="absolute inset-0 bg-linear-to-t from-white to-20% group-data-dark:from-gray-800 group-data-dark:from-[-25%]" />
)}
</div> </div>
<div className="relative p-10"> <div className="relative p-10">
<Subheading as="h3" dark={dark}> <Subheading as="h3" dark={dark}>
{eyebrow} {eyebrow}
</Subheading> </Subheading>
<p className="mt-1 text-2xl/8 font-medium tracking-tight text-gray-950 group-data-dark:text-white"> <p className="mt-1 text-2xl/8 font-medium tracking-tight text-white">
{title} {title}
</p> </p>
<p className="mt-2 max-w-[600px] text-sm/6 text-gray-600 group-data-dark:text-gray-400"> <p className="mt-2 max-w-[600px] text-sm/6 text-gray-400">
{description} {description}
</p> </p>
</div> </div>
+7 -7
View File
@@ -5,22 +5,22 @@ import { Link } from './link'
const variants = { const variants = {
primary: clsx( primary: clsx(
'inline-flex items-center justify-center px-4 py-[calc(--spacing(2)-1px)]', 'inline-flex items-center justify-center px-4 py-[calc(--spacing(2)-1px)]',
'rounded-full border border-transparent bg-gray-950 shadow-md', 'rounded-lg border border-transparent bg-gray-950 shadow-md',
'text-base font-medium whitespace-nowrap text-white', 'text-base font-medium whitespace-nowrap text-white',
'data-disabled:bg-gray-950 data-disabled:opacity-40 data-hover:bg-gray-800', 'data-disabled:bg-gray-950 data-disabled:opacity-40 data-hover:bg-gray-800',
), ),
secondary: clsx( secondary: clsx(
'relative inline-flex items-center justify-center px-4 py-[calc(--spacing(2)-1px)]', 'relative inline-flex items-center justify-center px-4 py-[calc(--spacing(2)-1px)]',
'rounded-full border border-transparent bg-white/15 shadow-md ring-1 ring-[#D15052]/15', 'rounded-lg border border-transparent bg-white/15 shadow-md ring-1 ring-[#D15052]/15',
'after:absolute after:inset-0 after:rounded-full after:shadow-[inset_0_0_2px_1px_#ffffff4d]', 'after:absolute after:inset-0 after:rounded-full after:shadow-[inset_0_0_2px_1px_#ffffff4d]',
'text-base font-medium whitespace-nowrap text-gray-950', 'text-base font-medium whitespace-nowrap text-zinc-100',
'data-disabled:bg-white/15 data-disabled:opacity-40 data-hover:bg-white/20', 'data-disabled:bg-white/15 data-disabled:opacity-40 data-hover:bg-white/20',
), ),
outline: clsx( outline: clsx(
'inline-flex items-center justify-center px-2 py-[calc(--spacing(1.5)-1px)]', 'inline-flex items-center justify-center px-4 py-[calc(--spacing(1.5)-1px)]',
'rounded-lg border border-transparent shadow-sm ring-1 ring-black/10', 'rounded-lg border border-transparent shadow-sm ring-1 ring-white/5',
'text-sm font-medium whitespace-nowrap text-gray-950', 'text-sm font-medium whitespace-nowrap text-zinc-100',
'data-disabled:bg-transparent data-disabled:opacity-40 data-hover:bg-gray-50', 'data-disabled:bg-transparent data-disabled:opacity-40 data-hover:bg-zinc-900',
), ),
} }
+24 -23
View File
@@ -39,7 +39,7 @@ function GameVaultLogo() {
return ( return (
<div className="inline-flex items-center gap-x-2 text-xl font-bold"> <div className="inline-flex items-center gap-x-2 text-xl font-bold">
<img src="/icons/gamevault.png" alt="GameVault Logo" className="size-8" /> <img src="/icons/gamevault.png" alt="GameVault Logo" className="size-8" />
<span className="relative whitespace-nowrap text-purple-900"> <span className="relative whitespace-nowrap text-zinc-100">
<svg <svg
aria-hidden="true" aria-hidden="true"
viewBox="0 0 418 42" viewBox="0 0 418 42"
@@ -56,7 +56,7 @@ function GameVaultLogo() {
function GameVaultPlus() { function GameVaultPlus() {
return ( return (
<div className="inline-flex items-center gap-x-1 rounded-full bg-gray-100 px-2 py-1 text-xs"> <div className="inline-flex items-center gap-x-1 rounded-full bg-zinc-800 px-2 py-1 text-xs">
<img <img
src="/icons/gamevault-plus.png" src="/icons/gamevault-plus.png"
alt="GameVault+ icon" alt="GameVault+ icon"
@@ -69,7 +69,7 @@ function GameVaultPlus() {
function ComingSoon() { function ComingSoon() {
return ( return (
<div className="inline-flex items-center gap-x-1 rounded-full bg-gray-100 px-2 py-1 text-xs"> <div className="inline-flex items-center gap-x-1 rounded-full bg-zinc-900 px-2 py-1 text-xs">
coming soon&trade; coming soon&trade;
</div> </div>
) )
@@ -121,6 +121,7 @@ const projects: Array<{
'Installer/setup games': true, 'Installer/setup games': true,
'Portable games': true, 'Portable games': true,
'Archives support': 'All 7-zip formats', 'Archives support': 'All 7-zip formats',
'Automatic import': 'Bulk-import tool',
}, },
Metadata: { Metadata: {
'Additional with plugins': false, 'Additional with plugins': false,
@@ -230,7 +231,7 @@ const projects: Array<{
'Non-versioned layout': true, 'Non-versioned layout': true,
'Automatic import': true, 'Automatic import': true,
'Archives support': 'All 7-zip formats', 'Archives support': 'All 7-zip formats',
'Portable games': true 'Portable games': true,
}, },
Metadata: { Metadata: {
IGDB: true, IGDB: true,
@@ -279,14 +280,14 @@ function Header() {
) )
} }
function PricingCards() { function ProjectCards() {
return ( return (
<div className="relative py-24"> <div className="relative py-24">
<Gradient className="absolute inset-x-2 top-48 bottom-0 rounded-4xl ring-1 ring-black/5 ring-inset" /> <Gradient className="absolute inset-x-2 top-48 bottom-0 rounded-4xl ring-1 ring-black/5 ring-inset" />
<Container className="relative"> <Container className="relative">
<div className="grid grid-cols-1 gap-8 lg:grid-cols-3"> <div className="grid grid-cols-1 gap-8 lg:grid-cols-3">
{projects.map((tier, tierIndex) => ( {projects.map((tier, tierIndex) => (
<PricingCard key={tierIndex} tier={tier} /> <ProjectCard key={tierIndex} tier={tier} />
))} ))}
</div> </div>
</Container> </Container>
@@ -294,22 +295,22 @@ function PricingCards() {
) )
} }
function PricingCard({ tier }: { tier: (typeof projects)[number] }) { function ProjectCard({ tier }: { tier: (typeof projects)[number] }) {
return ( return (
<div className="-m-2 grid grid-cols-1 rounded-4xl shadow-[inset_0_0_2px_1px_#ffffff4d] ring-1 ring-black/5 max-lg:mx-auto max-lg:w-full max-lg:max-w-md"> <div className="-m-2 grid grid-cols-1 rounded-4xl shadow-[inset_0_0_2px_1px_#ffffff4d] ring-1 ring-white/5 max-lg:mx-auto max-lg:w-full max-lg:max-w-md">
<div className="grid grid-cols-1 rounded-4xl p-2 shadow-md shadow-black/5"> <div className="grid grid-cols-1 rounded-4xl p-2 shadow-md shadow-black/5">
<div className="rounded-3xl bg-white p-10 pb-9 shadow-2xl ring-1 ring-black/5"> <div className="rounded-3xl bg-zinc-900 p-10 pb-9 shadow-2xl ring-1 ring-black/5">
<div className="flex w-full items-center justify-center pb-8"> <div className="flex w-full items-center justify-center pb-8">
{tier.logo()} {tier.logo()}
</div> </div>
<Subheading>{tier.name}</Subheading> <Subheading>{tier.name}</Subheading>
<p className="mt-2 text-sm/6 text-gray-950/75">{tier.description}</p> <p className="mt-2 text-sm/6 text-zinc-100/75">{tier.description}</p>
<div className="mt-8"> <div className="mt-8">
<Button href={tier.href}>Learn more &rarr;</Button> <Button href={tier.href}>Learn more &rarr;</Button>
</div> </div>
<div className="mt-8"> <div className="mt-8">
<h3 className="text-sm/6 font-medium text-gray-950"> <h3 className="text-sm/6 font-medium text-zinc-100">
Key features: Key features:
</h3> </h3>
<ul className="mt-3 space-y-3"> <ul className="mt-3 space-y-3">
@@ -324,10 +325,10 @@ function PricingCard({ tier }: { tier: (typeof projects)[number] }) {
) )
} }
function PricingTable({ function ProjectTable({
selectedTier: selectedProject, selectedProject,
}: { }: {
selectedTier: (typeof projects)[number] selectedProject: (typeof projects)[number]
}) { }) {
function onlyUnique<T>(value: T, index: number, array: Array<T>) { function onlyUnique<T>(value: T, index: number, array: Array<T>) {
return array.indexOf(value) === index return array.indexOf(value) === index
@@ -385,7 +386,7 @@ function PricingTable({
<Menu> <Menu>
<MenuButton className="flex items-center justify-between gap-2 font-medium"> <MenuButton className="flex items-center justify-between gap-2 font-medium">
{selectedProject.name} {selectedProject.name}
<ChevronUpDownIcon className="size-4 fill-gray-900" /> <ChevronUpDownIcon className="size-4 fill-zinc-100" />
</MenuButton> </MenuButton>
<MenuItems <MenuItems
anchor="bottom start" anchor="bottom start"
@@ -444,7 +445,7 @@ function PricingTable({
colSpan={4} colSpan={4}
className="px-0 pt-10 pb-0 group-first-of-type:pt-5" className="px-0 pt-10 pb-0 group-first-of-type:pt-5"
> >
<div className="-mx-4 rounded-lg bg-gray-50 px-4 py-3 text-sm/6 font-semibold"> <div className="-mx-4 rounded-lg bg-zinc-900 px-4 py-3 text-sm/6 font-semibold">
{section} {section}
</div> </div>
</th> </th>
@@ -452,11 +453,11 @@ function PricingTable({
{features[section].map((name) => ( {features[section].map((name) => (
<tr <tr
key={name} key={name}
className="border-b border-gray-100 last:border-none" className="border-b border-zinc-800 last:border-none"
> >
<th <th
scope="row" scope="row"
className="px-0 py-4 text-sm/6 font-normal text-gray-600" className="px-0 py-4 text-sm/6 font-normal text-zinc-200"
> >
{name} {name}
</th> </th>
@@ -488,7 +489,7 @@ function PricingTable({
</span> </span>
</> </>
) : ( ) : (
<div className="text-xs">{value}</div> <div className="text-xs text-zinc-400">{value}</div>
)} )}
</td> </td>
) )
@@ -514,10 +515,10 @@ function FeatureItem({
return ( return (
<li <li
data-disabled={disabled ? true : undefined} data-disabled={disabled ? true : undefined}
className="flex items-center gap-4 text-sm/6 text-gray-950/75 data-disabled:text-gray-950/25" className="flex items-center gap-4 text-sm/6 text-zinc-100/75 data-disabled:text-zinc-100/40"
> >
<span className="inline-flex h-6 items-center self-start"> <span className="inline-flex h-6 items-center self-start">
<PlusIcon className="size-3.75 shrink-0 fill-gray-950/25" /> <PlusIcon className="size-3.75 shrink-0 fill-zinc-100/25" />
</span> </span>
{disabled && <span className="sr-only">Coming soon:</span>} {disabled && <span className="sr-only">Coming soon:</span>}
{description} {description}
@@ -553,8 +554,8 @@ export default function Pricing() {
<Navbar /> <Navbar />
</Container> </Container>
<Header /> <Header />
<PricingCards /> <ProjectCards />
<PricingTable selectedTier={tier} /> <ProjectTable selectedProject={tier} />
<Footer /> <Footer />
</main> </main>
) )
+6 -6
View File
@@ -226,14 +226,14 @@ function DownloadCard({
return ( return (
<div className="-m-2 grid grid-cols-1 rounded-4xl shadow-[inset_0_0_2px_1px_#ffffff4d] ring-1 ring-black/5 max-lg:mx-auto max-lg:w-full max-lg:max-w-md"> <div className="-m-2 grid grid-cols-1 rounded-4xl shadow-[inset_0_0_2px_1px_#ffffff4d] ring-1 ring-black/5 max-lg:mx-auto max-lg:w-full max-lg:max-w-md">
<div className="grid grid-cols-1 rounded-4xl p-2 shadow-md shadow-black/5"> <div className="grid grid-cols-1 rounded-4xl p-2 shadow-md shadow-black/5">
<div className="flex h-full flex-col justify-between rounded-3xl bg-white p-10 pb-9 shadow-2xl ring-1 ring-black/5"> <div className="flex h-full flex-col justify-between rounded-3xl bg-zinc-900/50 p-10 pb-9 shadow-2xl ring-1 ring-white/5">
<div> <div>
<div className="flex w-full items-center justify-center gap-x-4"> <div className="flex w-full items-center justify-center gap-x-4">
{data.icon()} {data.icon()}
<Heading>{data.name}</Heading> <Heading>{data.name}</Heading>
</div> </div>
<p className="mt-3 text-sm/6 text-gray-950/75"> <p className="mt-3 text-sm/6 text-zinc-100/75">
{data.description} {data.description}
</p> </p>
</div> </div>
@@ -266,11 +266,11 @@ export default function DownloadCards() {
<Container> <Container>
<div className="flex flex-col items-center"> <div className="flex flex-col items-center">
<Listbox value={currentVersion} onChange={setCurrentVersion}> <Listbox value={currentVersion} onChange={setCurrentVersion}>
<Label className="block text-sm/6 font-medium text-gray-900"> <Label className="block text-sm/6 font-medium text-zinc-100">
Version Version
</Label> </Label>
<div className="relative mt-2"> <div className="relative mt-2">
<ListboxButton className="grid w-full min-w-[10rem] cursor-default grid-cols-1 rounded-md bg-white py-1.5 pr-2 pl-3 text-left text-gray-900 outline-1 -outline-offset-1 outline-gray-300 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-blue-600 sm:text-sm/6"> <ListboxButton className="grid w-full min-w-[10rem] cursor-default grid-cols-1 rounded-md bg-zinc-900 py-1.5 pr-2 pl-3 text-left text-zinc-100 outline-1 -outline-offset-1 outline-zinc-800 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-blue-600 sm:text-sm/6">
<span className="col-start-1 row-start-1 truncate pr-6"> <span className="col-start-1 row-start-1 truncate pr-6">
{currentVersion} {currentVersion}
</span> </span>
@@ -282,13 +282,13 @@ export default function DownloadCards() {
<ListboxOptions <ListboxOptions
transition transition
className="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg outline-1 outline-black/5 data-leave:transition data-leave:duration-100 data-leave:ease-in data-closed:data-leave:opacity-0 sm:text-sm" className="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-zinc-900 py-1 text-base shadow-lg outline-1 outline-white/5 data-leave:transition data-leave:duration-100 data-leave:ease-in data-closed:data-leave:opacity-0 sm:text-sm"
> >
{Object.keys(releasePages).map((version) => ( {Object.keys(releasePages).map((version) => (
<ListboxOption <ListboxOption
key={version} key={version}
value={version} value={version}
className="group relative cursor-default py-2 pr-9 pl-3 text-gray-900 select-none data-focus:bg-blue-600 data-focus:text-white data-focus:outline-hidden" className="group relative cursor-default py-2 pr-9 pl-3 text-zinc-100 select-none data-focus:bg-blue-600 data-focus:text-white data-focus:outline-hidden"
> >
<span className="block truncate font-normal group-data-selected:font-semibold"> <span className="block truncate font-normal group-data-selected:font-semibold">
{version} {version}
+34 -36
View File
@@ -12,11 +12,11 @@ function CallToAction() {
<div className="relative pt-20 pb-16 text-center sm:py-24"> <div className="relative pt-20 pb-16 text-center sm:py-24">
<hgroup> <hgroup>
<Subheading>Get started</Subheading> <Subheading>Get started</Subheading>
<p className="mt-6 text-3xl font-medium tracking-tight text-gray-950 sm:text-5xl"> <p className="mt-6 text-3xl font-medium tracking-tight text-white sm:text-5xl">
Ready to dive in? Ready to dive in?
</p> </p>
</hgroup> </hgroup>
<p className="mx-auto mt-6 max-w-xs text-sm/6 text-gray-500"> <p className="mx-auto mt-6 max-w-xs text-sm/6 text-zinc-400">
Get started hosting Drop in 10 minutes or less, and explore all the Get started hosting Drop in 10 minutes or less, and explore all the
features it has to offer. features it has to offer.
</p> </p>
@@ -33,7 +33,7 @@ function CallToAction() {
} }
function SitemapHeading({ children }: { children: React.ReactNode }) { function SitemapHeading({ children }: { children: React.ReactNode }) {
return <h3 className="text-sm/6 font-medium text-gray-950/50">{children}</h3> return <h3 className="text-sm/6 font-medium text-zinc-100/50">{children}</h3>
} }
function SitemapLinks({ children }: { children: React.ReactNode }) { function SitemapLinks({ children }: { children: React.ReactNode }) {
@@ -45,7 +45,7 @@ function SitemapLink(props: React.ComponentPropsWithoutRef<typeof Link>) {
<li> <li>
<Link <Link
{...props} {...props}
className="font-medium text-gray-950 data-hover:text-gray-950/75" className="font-medium text-zinc-100 data-hover:text-zinc-100/75"
/> />
</li> </li>
) )
@@ -164,8 +164,8 @@ function SocialLinks() {
function Copyright() { function Copyright() {
return ( return (
<div className="text-xs text-gray-500"> <div className="text-xs text-zinc-400">
&copy; {new Date().getFullYear()} Drop OSS. Licensed under AGPLv3 and &copy; {new Date().getFullYear()} Drop OSS. Website licensed under AGPLv3 and
Tailwind UI Plus (where applicable). Tailwind UI Plus (where applicable).
</div> </div>
) )
@@ -173,39 +173,37 @@ function Copyright() {
export function Footer() { export function Footer() {
return ( return (
<footer> <footer className="relative m-2 overflow-hidden rounded-4xl">
<Gradient className="relative"> <Gradient className="absolute inset-0 rounded-4xl" />
<div className="absolute inset-2 rounded-4xl bg-white/80" /> <Container>
<Container> <CallToAction />
<CallToAction /> <PlusGrid className="pb-16">
<PlusGrid className="pb-16"> <PlusGridRow>
<PlusGridRow> <div className="grid grid-cols-2 gap-y-10 pb-6 lg:grid-cols-6 lg:gap-8">
<div className="grid grid-cols-2 gap-y-10 pb-6 lg:grid-cols-6 lg:gap-8"> <div className="col-span-2 flex">
<div className="col-span-2 flex"> <PlusGridItem className="pt-6 lg:pb-6">
<PlusGridItem className="pt-6 lg:pb-6"> <Logo className="h-9" />
<Logo className="h-9" />
</PlusGridItem>
</div>
<div className="col-span-2 grid grid-cols-2 gap-x-8 gap-y-12 lg:col-span-4 lg:grid-cols-subgrid lg:pt-6">
<Sitemap />
</div>
</div>
</PlusGridRow>
<PlusGridRow className="flex justify-between">
<div>
<PlusGridItem className="py-3">
<Copyright />
</PlusGridItem> </PlusGridItem>
</div> </div>
<div className="flex"> <div className="col-span-2 grid grid-cols-2 gap-x-8 gap-y-12 lg:col-span-4 lg:grid-cols-subgrid lg:pt-6">
<PlusGridItem className="flex items-center gap-8 py-3"> <Sitemap />
<SocialLinks />
</PlusGridItem>
</div> </div>
</PlusGridRow> </div>
</PlusGrid> </PlusGridRow>
</Container> <PlusGridRow className="flex justify-between">
</Gradient> <div>
<PlusGridItem className="py-3">
<Copyright />
</PlusGridItem>
</div>
<div className="flex">
<PlusGridItem className="flex items-center gap-8 py-3">
<SocialLinks />
</PlusGridItem>
</div>
</PlusGridRow>
</PlusGrid>
</Container>
</footer> </footer>
) )
} }
+2 -2
View File
@@ -9,7 +9,7 @@ export function Gradient({
{...props} {...props}
className={clsx( className={clsx(
className, className,
'bg-linear-115 from-blue-100 from-28% via-sky-200 via-70% to-cyan-100 sm:bg-linear-145', 'bg-linear-115 from-blue-900 from-28% via-sky-800 via-70% to-cyan-900 sm:bg-linear-145 opacity-30',
)} )}
/> />
) )
@@ -21,7 +21,7 @@ export function GradientBackground() {
<div <div
className={clsx( className={clsx(
'absolute -top-44 -right-60 h-60 w-xl transform-gpu md:right-0', 'absolute -top-44 -right-60 h-60 w-xl transform-gpu md:right-0',
'bg-linear-115 from-blue-200 from-28% via-sky-100 via-70% to-blue-200', 'bg-linear-115 from-blue-700 from-28% via-sky-800 via-70% to-blue-600',
'rotate-[-10deg] rounded-full blur-3xl', 'rotate-[-10deg] rounded-full blur-3xl',
)} )}
/> />
+7 -7
View File
@@ -6,22 +6,22 @@ const components: MDXComponents = {
<p className="my-8 text-base/8 first:mt-0 last:mb-0">{children}</p> <p className="my-8 text-base/8 first:mt-0 last:mb-0">{children}</p>
), ),
h1: ({ children }) => ( h1: ({ children }) => (
<h2 className="mt-12 mb-10 text-4xl/8 font-medium tracking-tight text-gray-950 first:mt-0 last:mb-0"> <h2 className="mt-12 mb-10 text-4xl/8 font-medium tracking-tight text-zinc-100 first:mt-0 last:mb-0">
{children} {children}
</h2> </h2>
), ),
h2: ({ children }) => ( h2: ({ children }) => (
<h2 className="mt-12 mb-10 text-2xl/8 font-medium tracking-tight text-gray-950 first:mt-0 last:mb-0"> <h2 className="mt-12 mb-10 text-2xl/8 font-medium tracking-tight text-zinc-100 first:mt-0 last:mb-0">
{children} {children}
</h2> </h2>
), ),
h3: ({ children }) => ( h3: ({ children }) => (
<h3 className="mt-12 mb-10 text-xl/8 font-medium tracking-tight text-gray-950 first:mt-0 last:mb-0"> <h3 className="mt-12 mb-10 text-xl/8 font-medium tracking-tight text-zinc-100 first:mt-0 last:mb-0">
{children} {children}
</h3> </h3>
), ),
blockquote: ({ children }) => ( blockquote: ({ children }) => (
<blockquote className="my-10 border-l-2 border-l-gray-300 pl-6 text-base/8 text-gray-950 first:mt-0 last:mb-0"> <blockquote className="my-10 border-l-2 border-l-zinc-700 pl-6 text-base/8 text-zinc-100 first:mt-0 last:mb-0">
{children} {children}
</blockquote> </blockquote>
), ),
@@ -32,9 +32,9 @@ const components: MDXComponents = {
className="w-full rounded-2xl" className="w-full rounded-2xl"
/> />
), ),
hr: () => <hr className="my-8 border-t border-gray-200" />, hr: () => <hr className="my-8 border-t border-zinc-800" />,
strong: ({ children }) => ( strong: ({ children }) => (
<strong className="font-semibold text-gray-950">{children}</strong> <strong className="font-semibold text-zinc-100">{children}</strong>
), ),
code: ({ children }) => ( code: ({ children }) => (
<> <>
@@ -60,7 +60,7 @@ const components: MDXComponents = {
return ( return (
<Link <Link
{...props} {...props}
className="font-medium text-blue-600 underline decoration-blue-400 underline-offset-4 data-hover:decoration-blue-600" className="font-medium text-blue-400 underline decoration-blue-400 underline-offset-4 data-hover:decoration-blue-600"
> >
{props.children} {props.children}
</Link> </Link>
+5 -5
View File
@@ -27,7 +27,7 @@ function DesktopNav() {
<PlusGridItem key={href} className="relative flex"> <PlusGridItem key={href} className="relative flex">
<Link <Link
href={href} href={href}
className="flex items-center px-4 py-3 text-base font-medium text-gray-950 bg-blend-multiply data-hover:bg-black/2.5" className="flex items-center px-4 py-3 text-base font-medium text-zinc-100 bg-blend-multiply data-hover:bg-white/2.5"
> >
{label} {label}
</Link> </Link>
@@ -40,7 +40,7 @@ function DesktopNav() {
function MobileNavButton() { function MobileNavButton() {
return ( return (
<DisclosureButton <DisclosureButton
className="flex size-12 items-center justify-center self-center rounded-lg data-hover:bg-black/5 lg:hidden" className="flex size-12 items-center justify-center self-center rounded-lg data-hover:bg-white/5 lg:hidden"
aria-label="Open main menu" aria-label="Open main menu"
> >
<Bars2Icon className="size-6" /> <Bars2Icon className="size-6" />
@@ -63,15 +63,15 @@ function MobileNav() {
}} }}
key={href} key={href}
> >
<Link href={href} className="text-base font-medium text-gray-950"> <Link href={href} className="text-base font-medium text-zinc-100">
{label} {label}
</Link> </Link>
</motion.div> </motion.div>
))} ))}
</div> </div>
<div className="absolute left-1/2 w-screen -translate-x-1/2"> <div className="absolute left-1/2 w-screen -translate-x-1/2">
<div className="absolute inset-x-0 top-0 border-t border-black/5" /> <div className="absolute inset-x-0 top-0 border-t border-white/5" />
<div className="absolute inset-x-0 top-2 border-t border-black/5" /> <div className="absolute inset-x-0 top-2 border-t border-white/5" />
</div> </div>
</DisclosurePanel> </DisclosurePanel>
) )
+11 -11
View File
@@ -26,14 +26,14 @@ function FeaturedPosts() {
const postAuthors = fetchPostAuthors() const postAuthors = fetchPostAuthors()
return ( return (
<div className="mt-16 bg-linear-to-t from-gray-100 pb-14"> <div className="mt-16 pb-14">
<Container> <Container>
<h2 className="text-2xl font-medium tracking-tight">Featured</h2> <h2 className="text-2xl font-medium tracking-tight">Featured</h2>
<div className="mt-6 grid grid-cols-1 gap-8 lg:grid-cols-3"> <div className="mt-6 grid grid-cols-1 gap-8 lg:grid-cols-3">
{featuredPosts.map((post) => ( {featuredPosts.map((post) => (
<div <div
key={post._meta.path} key={post._meta.path}
className="relative flex flex-col rounded-3xl bg-white p-2 shadow-md ring-1 shadow-black/5 ring-black/5" className="relative flex flex-col rounded-3xl bg-zinc-900 p-2 shadow-md ring-1 shadow-white/5 ring-white/5"
> >
{post.image && ( {post.image && (
<img <img
@@ -43,7 +43,7 @@ function FeaturedPosts() {
/> />
)} )}
<div className="flex flex-1 flex-col p-8"> <div className="flex flex-1 flex-col p-8">
<div className="text-sm/5 text-gray-700"> <div className="text-sm/5 text-zinc-400">
{dayjs(post.date).format('dddd, MMMM D, YYYY')} {dayjs(post.date).format('dddd, MMMM D, YYYY')}
</div> </div>
<div className="mt-2 text-base/7 font-medium"> <div className="mt-2 text-base/7 font-medium">
@@ -52,7 +52,7 @@ function FeaturedPosts() {
{post.title} {post.title}
</Link> </Link>
</div> </div>
<div className="mt-2 flex-1 text-sm/6 text-gray-500"> <div className="mt-2 flex-1 text-sm/6 text-zinc-400">
{post.excerpt} {post.excerpt}
</div> </div>
{postAuthors[post.author ?? ''] && ( {postAuthors[post.author ?? ''] && (
@@ -62,7 +62,7 @@ function FeaturedPosts() {
src={postAuthors[post.author ?? ''].avatar} src={postAuthors[post.author ?? ''].avatar}
className="aspect-square size-6 rounded-full object-cover" className="aspect-square size-6 rounded-full object-cover"
/> />
<div className="text-sm/5 text-gray-700"> <div className="text-sm/5 text-zinc-300">
{postAuthors[post.author ?? ''].name} {postAuthors[post.author ?? ''].name}
</div> </div>
</div> </div>
@@ -94,7 +94,7 @@ function Posts({ page, category }: { page: number; category?: string }) {
{posts.map((post) => ( {posts.map((post) => (
<div <div
key={post._meta.path} key={post._meta.path}
className="relative grid grid-cols-1 border-b border-b-gray-100 py-10 first:border-t first:border-t-gray-200 max-sm:gap-3 sm:grid-cols-3" className="relative grid grid-cols-1 border-b border-b-zinc-900 py-10 first:border-t first:border-t-zinc-900 max-sm:gap-3 sm:grid-cols-3"
> >
<div> <div>
<div className="text-sm/5 max-sm:text-gray-700 sm:font-medium"> <div className="text-sm/5 max-sm:text-gray-700 sm:font-medium">
@@ -109,7 +109,7 @@ function Posts({ page, category }: { page: number; category?: string }) {
className="aspect-square size-6 rounded-full object-cover" className="aspect-square size-6 rounded-full object-cover"
/> />
} }
<div className="text-sm/5 text-gray-700"> <div className="text-sm/5 text-zinc-300">
{postAuthors[post.author ?? ''].name} {postAuthors[post.author ?? ''].name}
</div> </div>
</div> </div>
@@ -117,7 +117,7 @@ function Posts({ page, category }: { page: number; category?: string }) {
</div> </div>
<div className="sm:col-span-2 sm:max-w-2xl"> <div className="sm:col-span-2 sm:max-w-2xl">
<h2 className="text-sm/5 font-medium">{post.title}</h2> <h2 className="text-sm/5 font-medium">{post.title}</h2>
<p className="mt-3 text-sm/6 text-gray-500">{post.excerpt}</p> <p className="mt-3 text-sm/6 text-zinc-300">{post.excerpt}</p>
<div className="mt-4"> <div className="mt-4">
<Link <Link
href={post.url} href={post.url}
@@ -180,9 +180,9 @@ function Pagination({
data-active={i + 1 === page ? true : undefined} data-active={i + 1 === page ? true : undefined}
className={clsx( className={clsx(
'size-7 rounded-lg text-center text-sm/7 font-medium', 'size-7 rounded-lg text-center text-sm/7 font-medium',
'data-hover:bg-gray-100', 'data-hover:bg-zinc-900',
'data-active:shadow-sm data-active:ring-1 data-active:ring-black/10', 'data-active:shadow-sm data-active:ring-1 data-active:ring-white/10',
'data-active:data-hover:bg-gray-50', 'data-active:data-hover:bg-zinc-900',
)} )}
> >
{i + 1} {i + 1}
+5 -5
View File
@@ -28,10 +28,10 @@ export function PlusGridRow({
aria-hidden="true" aria-hidden="true"
className="absolute inset-y-0 left-1/2 -z-10 w-screen -translate-x-1/2" className="absolute inset-y-0 left-1/2 -z-10 w-screen -translate-x-1/2"
> >
<div className="absolute inset-x-0 top-0 border-t border-black/5"></div> <div className="absolute inset-x-0 top-0 border-t border-white/5"></div>
<div className="absolute inset-x-0 top-2 border-t border-black/5"></div> <div className="absolute inset-x-0 top-2 border-t border-white/5"></div>
<div className="absolute inset-x-0 bottom-0 hidden border-b border-black/5 group-last/row:block"></div> <div className="absolute inset-x-0 bottom-0 hidden border-b border-white/5 group-last/row:block"></div>
<div className="absolute inset-x-0 bottom-2 hidden border-b border-black/5 group-last/row:block"></div> <div className="absolute inset-x-0 bottom-2 hidden border-b border-white/5 group-last/row:block"></div>
</div> </div>
{children} {children}
</div> </div>
@@ -83,7 +83,7 @@ export function PlusGridIcon({
aria-hidden="true" aria-hidden="true"
className={clsx( className={clsx(
className, className,
'absolute size-[15px] fill-black/10', 'absolute size-[15px] fill-white/10',
yClass, yClass,
xClass, xClass,
)} )}
+4 -13
View File
@@ -76,19 +76,10 @@ function SponsorCard({
ref={ref} ref={ref}
style={{ opacity }} style={{ opacity }}
{...props} {...props}
className="relative flex aspect-9/16 w-64 shrink-0 snap-start scroll-ml-(--scroll-padding) flex-col justify-end overflow-hidden rounded-3xl sm:aspect-3/4 sm:w-72" className="relative flex w-64 rounded-3xl sm:w-72 bg-black"
> >
<img
alt=""
src={img}
className="absolute inset-x-0 top-0 aspect-square w-full object-contain"
/>
<div
aria-hidden="true"
className="absolute inset-0 rounded-3xl bg-linear-to-t from-black from-[calc(7/16*100%)] ring-1 ring-gray-950/10 ring-inset sm:from-25%"
/>
<figure className="relative p-10"> <figure className="relative p-10">
<figcaption className="mt-6 border-t border-white/20 pt-6"> <figcaption className="pb-3 border-b border-white/20">
<p className="text-sm/6 font-medium text-white">{name}</p> <p className="text-sm/6 font-medium text-white">{name}</p>
<p className="text-sm/6 font-medium"> <p className="text-sm/6 font-medium">
<span className="bg-linear-to-r from-sky-300 from-28% via-blue-200 via-70% to-cyan-300 bg-clip-text text-transparent"> <span className="bg-linear-to-r from-sky-300 from-28% via-blue-200 via-70% to-cyan-300 bg-clip-text text-transparent">
@@ -272,8 +263,8 @@ export function Sponsors() {
data-active={activeIndex === i ? true : undefined} data-active={activeIndex === i ? true : undefined}
aria-label={`Scroll to sponsorship from ${name}`} aria-label={`Scroll to sponsorship from ${name}`}
className={clsx( className={clsx(
'size-2.5 cursor-pointer rounded-full border border-transparent bg-gray-300 transition', 'size-2.5 cursor-pointer rounded-full border border-transparent bg-zinc-600 transition',
'data-active:bg-gray-400 data-hover:bg-gray-400', 'data-active:bg-blue-700 data-hover:bg-zinc-900',
'forced-colors:data-active:bg-[Highlight] forced-colors:data-focus:outline-offset-4', 'forced-colors:data-active:bg-[Highlight] forced-colors:data-focus:outline-offset-4',
)} )}
/> />
+7 -6
View File
@@ -27,8 +27,8 @@ function Person({
<img alt="" src={img} className="size-12 rounded-full" /> <img alt="" src={img} className="size-12 rounded-full" />
<div className="text-sm/6"> <div className="text-sm/6">
<h3 className="font-medium group-hover:underline">{name}</h3> <h3 className="font-medium group-hover:underline">{name}</h3>
<p className="text-gray-500">{description}</p> <p className="text-zinc-400">{description}</p>
<p className="text-xs font-semibold text-gray-400 uppercase"> <p className="text-xs font-semibold text-blue-600/80">
{contributions} contribution(s) {contributions} contribution(s)
</p> </p>
</div> </div>
@@ -105,14 +105,14 @@ export function Team() {
</Lead> </Lead>
<div className="mt-12 grid grid-cols-1 gap-12 lg:grid-cols-2"> <div className="mt-12 grid grid-cols-1 gap-12 lg:grid-cols-2">
<div className="max-w-lg"> <div className="max-w-lg">
<p className="text-sm/6 text-gray-600"> <p className="text-sm/6 text-zinc-400">
Drop OSS was started, mostly on a whim, in response to frustrations Drop OSS was started, mostly on a whim, in response to frustrations
with the controlled nature of DRM games, and the missing comforts of with the controlled nature of DRM games, and the missing comforts of
DRM-free games. Since then, we&apos;ve put together a small circle DRM-free games. Since then, we&apos;ve put together a small circle
of dedicated maintainers and contributors to develop Drop and all of dedicated maintainers and contributors to develop Drop and all
its amazing features. its amazing features.
</p> </p>
<p className="mt-8 text-sm/6 text-gray-600"> <p className="mt-8 text-sm/6 text-zinc-400">
If you know a little code, you can help out! We heavily encourage If you know a little code, you can help out! We heavily encourage
contributions, especially if you&apos;re passionate about the contributions, especially if you&apos;re passionate about the
project and enjoy writing code. We use a variety of stacks across project and enjoy writing code. We use a variety of stacks across
@@ -124,8 +124,9 @@ export function Team() {
className="w-full sm:w-auto" className="w-full sm:w-auto"
href="https://developer.droposs.org/contributing" href="https://developer.droposs.org/contributing"
target="_blank" target="_blank"
variant="outline"
> >
Contribute Contribute &rarr;
</Button> </Button>
</div> </div>
</div> </div>
@@ -133,7 +134,7 @@ export function Team() {
<Subheading id="team" as="h3" className="mt-24"> <Subheading id="team" as="h3" className="mt-24">
The team The team
</Subheading> </Subheading>
<hr className="mt-6 border-t border-gray-200" /> <hr className="mt-6 border-t border-zinc-800" />
<ul <ul
role="list" role="list"
className="mx-auto mt-16 grid grid-cols-1 gap-8 sm:grid-cols-3 lg:grid-cols-4" className="mx-auto mt-16 grid grid-cols-1 gap-8 sm:grid-cols-3 lg:grid-cols-4"
+2 -2
View File
@@ -19,7 +19,7 @@ export function Heading({
data-dark={dark ? 'true' : undefined} data-dark={dark ? 'true' : undefined}
className={clsx( className={clsx(
className, className,
'text-4xl font-medium tracking-tighter text-pretty text-gray-950 data-dark:text-white sm:text-6xl', 'text-4xl font-medium tracking-tighter text-pretty text-white sm:text-6xl',
)} )}
/> />
) )
@@ -37,7 +37,7 @@ export function Subheading({
data-dark={dark ? 'true' : undefined} data-dark={dark ? 'true' : undefined}
className={clsx( className={clsx(
className, className,
'font-mono text-xs/5 font-semibold tracking-widest text-gray-500 uppercase data-dark:text-gray-400', 'font-mono text-xs/5 font-semibold tracking-widest uppercase text-zinc-500',
)} )}
/> />
) )
+328 -317
View File
File diff suppressed because it is too large Load Diff
+37 -5
View File
@@ -1,13 +1,45 @@
onlyBuiltDependencies: onlyBuiltDependencies:
- "@bufbuild/buf" - '@bufbuild/buf'
- "@parcel/watcher" - '@parcel/watcher'
- "@prisma/client" - '@prisma/client'
- "@prisma/engines" - '@prisma/engines'
- "@tailwindcss/oxide" - '@tailwindcss/oxide'
- argon2 - argon2
- esbuild - esbuild
- prisma - prisma
- sharp - sharp
- unrs-resolver - unrs-resolver
overrides:
'@isaacs/brace-expansion@<=5.0.0': '>=5.0.1'
ajv@<6.14.0: '>=6.14.0'
devalue@<=5.6.2: '>=5.6.3'
devalue@>=5.1.0 <5.6.2: '>=5.6.2'
devalue@>=5.3.0 <=5.6.1: '>=5.6.2'
diff@>=6.0.0 <8.0.3: '>=8.0.3'
hono@<4.11.10: '>=4.11.10'
hono@<4.11.7: '>=4.11.7'
lodash-es@>=4.0.0 <=4.17.22: '>=4.17.23'
lodash@>=4.0.0 <=4.17.22: '>=4.17.23'
minimatch@<3.1.3: '>=3.1.3'
minimatch@<3.1.4: '>=3.1.4'
minimatch@>=10.0.0 <10.2.1: '>=10.2.1'
minimatch@>=10.0.0 <10.2.3: '>=10.2.3'
minimatch@>=5.0.0 <5.1.7: '>=5.1.7'
minimatch@>=5.0.0 <5.1.8: '>=5.1.8'
minimatch@>=9.0.0 <9.0.6: '>=9.0.6'
minimatch@>=9.0.0 <9.0.7: '>=9.0.7'
node-forge@<1.3.2: '>=1.3.2'
qs@<6.14.1: '>=6.14.1'
qs@>=6.7.0 <=6.14.1: '>=6.14.2'
rollup@>=4.0.0 <4.59.0: '>=4.59.0'
serialize-javascript@<=7.0.2: '>=7.0.3'
seroval@<1.4.1: '>=1.4.1'
seroval@<=1.4.0: '>=1.4.1'
tar@<7.5.7: '>=7.5.7'
tar@<7.5.8: '>=7.5.8'
tar@<=7.5.2: '>=7.5.3'
tar@<=7.5.3: '>=7.5.4'
undici@>=7.0.0 <7.18.2: '>=7.18.2'
shamefullyHoist: true shamefullyHoist: true