Compare commits

..

No commits in common. "revert-1-refine-website" and "main" have entirely different histories.

136 changed files with 11099 additions and 10561 deletions

80
.github/workflows/deploy.yml vendored Normal file
View file

@ -0,0 +1,80 @@
name: Deploy Next.js site to Pages
on:
# Runs on pushes targeting the main branch
push:
branches:
- main
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 10
run_install: false
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Setup Pages
id: setup_pages
uses: actions/configure-pages@v5
- name: Restore cache
uses: actions/cache@v4
with:
path: |
.next/cache
# Generate a new cache whenever packages or source files change.
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
# If source files changed but packages didn't, rebuild from a prior cache.
restore-keys: |
${{ runner.os }}-nextjs-${{ hashFiles('**/pnpm-lock.yaml') }}-
- name: Build with Next.js
run: pnpm run build
env:
PAGES_BASE_PATH: ${{ steps.setup_pages.outputs.base_path }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./out
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

View file

@ -1,41 +0,0 @@
# https://github.com/actions/deploy-pages#usage
name: Deploy to GitHub Pages
on:
workflow_dispatch:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: "20"
# Pick your own package manager and build script
- run: npm install
- run: npx nuxt build --preset github_pages
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./.output/public
# Deployment job
deploy:
# Add a dependency to the build job
needs: build
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:
pages: write # to deploy to Pages
id-token: write # to verify the deployment originates from an appropriate source
# Deploy to the github_pages environment
environment:
name: github_pages
url: ${{ steps.deployment.outputs.page_url }}
# Specify runner + deployment step
runs-on: ubuntu-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

53
.gitignore vendored
View file

@ -1,24 +1,39 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# Node dependencies
node_modules
# dependencies
/node_modules
/.pnp
.pnp.js
.yarn/install-state.gz
# Logs
logs
*.log
# testing
/coverage
# Misc
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
.fleet
.idea
*.pem
# Local env files
.env
.env.*
!.env.example
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
.contentlayer
.content-collections

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "drop-base"]
path = drop-base
url = https://github.com/Drop-OSS/drop-base.git

View file

@ -658,4 +658,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
<https://www.gnu.org/licenses/>.

13
app.vue
View file

@ -1,13 +0,0 @@
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
<script setup lang="ts">
useHead({
titleTemplate(title) {
return title ? `${title} | Drop OSS` : "Drop OSS";
},
});
</script>

View file

@ -1,69 +0,0 @@
$motiva: (
("MotivaSansThin.ttf", "ttf", 100, normal),
("MotivaSansLight.woff.ttf", "woff", 300, normal),
("MotivaSansRegular.woff.ttf", "woff", 400, normal),
("MotivaSansMedium.woff.ttf", "woff", 500, normal),
("MotivaSansBold.woff.ttf", "woff", 600, normal),
("MotivaSansExtraBold.ttf", "woff", 700, normal),
("MotivaSansBlack.woff.ttf", "woff", 900, normal)
);
$helvetica: (
("Helvetica.woff", "woff", 400, normal),
("Helvetica-Oblique.woff", "woff", 400, italic),
("Helvetica-Bold.woff", "woff", 600, normal),
("Helvetica-BoldOblique.woff", "woff", 600, italic),
("helvetica-light-587ebe5a59211.woff2", "woff2", 300, normal)
);
@each $file, $format, $weight, $style in $motiva {
@font-face {
font-family: "Motiva Sans";
src: url("/fonts/motiva/#{$file}") format($format);
font-weight: $weight;
font-style: $style;
}
}
@each $file, $format, $weight, $style in $helvetica {
@font-face {
font-family: "Helvetica";
src: url("/fonts/helvetica/#{$file}") format($format);
font-weight: $weight;
font-style: $style;
}
}
@font-face {
font-family: "Inter";
src: url("/fonts/inter/InterVariable.ttf");
font-style: normal;
}
@font-face {
font-family: "Inter";
src: url("/fonts/inter/InterVariable-Italic.ttf");
font-style: italic;
}
.carousel__icon {
color: #f4f4f5;
}
.carousel__pagination-button::after {
background-color: #3f3f46;
border-radius: 999999px;
}
.carousel__pagination-button:hover::after {
background-color: #27272a;
border-radius: 999999px;
}
.carousel__pagination-button--active::after {
background-color: #a1a1aa;
}
.carousel__pagination-button--active:hover::after {
background-color: #d4d4d8;
}
html {
background-color: oklch(0.21 0.006 285.885);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View file

@ -1,27 +0,0 @@
<template>
<div class="flex flex-row flex-wrap gap-2 justify-center">
<button
v-for="(_, i) in amount"
@click="() => slideTo(i)"
:class="[
currentSlide == i ? 'bg-blue-600 w-6' : 'bg-zinc-700 w-3',
'transition-all cursor-pointer h-2 rounded-full',
]"
/>
</div>
</template>
<script setup lang="ts">
const maxSlide = inject("maxSlide", ref(1));
const minSlide = inject("minSlide", ref(1));
const currentSlide = inject("currentSlide", ref(1));
const nav: { slideTo?: (index: number) => any } = inject("nav", {});
const amount = computed(() => maxSlide.value - minSlide.value + 1);
function slideTo(index: number) {
if (!nav.slideTo) return console.warn(`error moving slide: nav not defined`);
const offsetIndex = index + minSlide.value;
nav.slideTo(offsetIndex);
}
</script>

View file

@ -1,3 +0,0 @@
<template>
<span class="inline-flex items-center rounded-md bg-blue-600/10 px-2 py-1 text-xs font-medium text-blue-400 ring-1 ring-blue-600/40 ring-inset">Coming Soon&trade;</span>
</template>

View file

@ -1,72 +0,0 @@
<template>
<footer>
<div class="mx-auto max-w-7xl overflow-hidden px-6 py-20 sm:py-24 lg:px-8">
<nav
class="-mb-6 flex flex-wrap justify-center gap-x-12 gap-y-3 text-sm/6"
aria-label="Footer"
>
<a
v-for="item in navigation.main"
:key="item.name"
:href="item.href"
class="text-zinc-400 hover:text-white"
>{{ item.name }}</a
>
</nav>
<div class="mt-16 flex justify-center gap-x-10">
<a
v-for="item in navigation.social"
:key="item.name"
:href="item.href"
class="text-zinc-400 hover:text-zinc-300"
>
<span class="sr-only">{{ item.name }}</span>
<component :is="item.icon" class="size-6" aria-hidden="true" />
</a>
</div>
<p class="mt-10 text-center text-sm/6 text-zinc-400">
&copy; {{ new Date().getFullYear() }} Drop OSS. Licensed under GNU
Affero General Public License v3.0.
</p>
</div>
</footer>
</template>
<script setup>
import { defineComponent, h } from "vue";
const navigation = {
main: [
],
social: [
{
name: "GitHub",
href: "https://github.com/Drop-OSS/",
icon: defineComponent({
render: () =>
h("svg", { fill: "currentColor", viewBox: "0 0 24 24" }, [
h("path", {
"fill-rule": "evenodd",
d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",
"clip-rule": "evenodd",
}),
]),
}),
},
{
name: "YouTube",
href: "#",
icon: defineComponent({
render: () =>
h("svg", { fill: "currentColor", viewBox: "0 0 24 24" }, [
h("path", {
"fill-rule": "evenodd",
d: "M19.812 5.418c.861.23 1.538.907 1.768 1.768C21.998 8.746 22 12 22 12s0 3.255-.418 4.814a2.504 2.504 0 0 1-1.768 1.768c-1.56.419-7.814.419-7.814.419s-6.255 0-7.814-.419a2.505 2.505 0 0 1-1.768-1.768C2 15.255 2 12 2 12s0-3.255.417-4.814a2.507 2.507 0 0 1 1.768-1.768C5.744 5 11.998 5 11.998 5s6.255 0 7.814.418ZM15.194 12 10 15V9l5.194 3Z",
"clip-rule": "evenodd",
}),
]),
}),
},
],
};
</script>

View file

@ -1,253 +0,0 @@
<template>
<header class="isolate z-10 absolute top-0 inset-x-0">
<nav
class="mx-auto flex max-w-7xl items-center justify-between p-6 lg:px-8"
aria-label="Global"
>
<div class="flex lg:flex-1">
<NuxtLink href="/" class="-m-1.5 p-1.5">
<span class="sr-only">Drop</span>
<Logo class="h-8 w-auto" />
</NuxtLink>
</div>
<div class="flex lg:hidden">
<button
type="button"
class="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-zinc-300"
@click="mobileMenuOpen = true"
>
<span class="sr-only">Open main menu</span>
<Bars3Icon class="size-6" aria-hidden="true" />
</button>
</div>
<PopoverGroup class="hidden lg:flex lg:gap-x-12">
<!--
<Popover>
<PopoverButton
class="flex items-center gap-x-1 text-sm/6 font-semibold text-zinc-100"
>
Features
<ChevronDownIcon
class="size-5 flex-none text-zinc-400"
aria-hidden="true"
/>
</PopoverButton>
<transition
enter-active-class="transition ease-out duration-200"
enter-from-class="opacity-0 -translate-y-1"
enter-to-class="opacity-100 translate-y-0"
leave-active-class="transition ease-in duration-150"
leave-from-class="opacity-100 translate-y-0"
leave-to-class="opacity-0 -translate-y-1"
>
<PopoverPanel
class="absolute inset-x-0 top-0 -z-10 bg-zinc-900 pt-14 shadow-lg ring-1 ring-zinc-900/5"
>
<div
class="mx-auto grid max-w-7xl grid-cols-4 gap-x-4 px-6 py-10 lg:px-8 xl:gap-x-8"
>
<div
v-for="item in features"
:key="item.name"
class="transition group relative rounded-lg p-6 text-sm/6 hover:bg-zinc-800"
>
<div
class="transition flex size-11 items-center justify-center rounded-lg bg-zinc-950 group-hover:bg-zinc-900"
>
<component
:is="item.icon"
class="transition size-6 text-blue-600 group-hover:text-blue-500"
aria-hidden="true"
/>
</div>
<NuxtLink
:href="item.href"
class="transition mt-6 block font-semibold text-zinc-100"
>
{{ item.name }}
<span class="absolute inset-0" />
</NuxtLink>
<p class="mt-1 text-zinc-400">{{ item.description }}</p>
</div>
</div>
<div class="bg-zinc-950 h-3" />
</PopoverPanel>
</transition>
</Popover>
-->
<NuxtLink
href="/"
class="text-sm/6 font-semibold text-zinc-100"
>Home</NuxtLink
>
<NuxtLink
href="/comparison"
class="text-sm/6 font-semibold text-zinc-100"
>Comparison</NuxtLink
>
<!--
<a href="#" class="text-sm/6 font-semibold text-zinc-100"
>Marketplace</a
>
<a href="#" class="text-sm/6 font-semibold text-zinc-100">Company</a>
-->
</PopoverGroup>
<div class="hidden lg:flex" />
<div class="hidden lg:flex lg:flex-1 lg:justify-end">
<a
href="https://wiki.droposs.org/guides/quickstart.html"
class="text-sm/6 font-semibold text-zinc-100"
>Quickstart <span aria-hidden="true">&rarr;</span></a
>
</div>
</nav>
<Dialog
class="lg:hidden"
@close="mobileMenuOpen = false"
:open="mobileMenuOpen"
>
<div class="fixed inset-0 z-10" />
<DialogPanel
class="fixed inset-y-0 right-0 z-10 w-full overflow-y-auto bg-zinc-900 px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-zinc-900/10"
>
<div class="flex items-center justify-between">
<NuxtLink href="/" class="-m-1.5 p-1.5">
<span class="sr-only">Your Company</span>
<Logo class="h-8 w-auto" alt="Drop logo" />
</NuxtLink>
<button
type="button"
class="-m-2.5 rounded-md p-2.5 text-zinc-400"
@click="mobileMenuOpen = false"
>
<span class="sr-only">Close menu</span>
<XMarkIcon class="size-6" aria-hidden="true" />
</button>
</div>
<div class="mt-6 flow-root">
<div class="-my-6 divide-y divide-zinc-500/10">
<div class="space-y-2 py-6">
<!--<Disclosure as="div" class="-mx-3" v-slot="{ open }">
<DisclosureButton
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base/7 font-semibold text-zinc-100 hover:bg-zinc-800"
>
Product
<ChevronDownIcon
:class="[open ? 'rotate-180' : '', 'size-5 flex-none']"
aria-hidden="true"
/>
</DisclosureButton>
<DisclosurePanel class="mt-2 space-y-2">
<DisclosureButton
v-for="item in [...products, ...callsToAction]"
:key="item.name"
as="a"
:href="item.href"
class="block rounded-lg py-2 pl-6 pr-3 text-sm/7 font-semibold text-zinc-300 hover:bg-zinc-800"
>{{ item.name }}</DisclosureButton
>
</DisclosurePanel>
</Disclosure>-->
<NuxtLink
href="/"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-zinc-100 hover:bg-zinc-800"
>Home</NuxtLink
>
<NuxtLink
href="/comparison"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-zinc-100 hover:bg-zinc-800"
>Comparison</NuxtLink
>
<NuxtLink
href="https://wiki.droposs.org/"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-zinc-100 hover:bg-zinc-800"
>Documentation</NuxtLink
>
</div>
<div class="py-6">
<a
href="https://wiki.droposs.org/guides/quickstart.html"
class="-mx-3 block rounded-lg px-3 py-2.5 text-base/7 font-semibold text-zinc-100 hover:bg-zinc-800"
>Get started &rarr;</a
>
</div>
</div>
</div>
</DialogPanel>
</Dialog>
</header>
</template>
<script setup lang="ts">
import { ref } from "vue";
import {
Dialog,
DialogPanel,
Disclosure,
DisclosureButton,
DisclosurePanel,
Popover,
PopoverButton,
PopoverGroup,
PopoverPanel,
} from "@headlessui/vue";
import {
Bars3Icon,
ChartPieIcon,
CursorArrowRaysIcon,
FingerPrintIcon,
ServerStackIcon,
ShareIcon,
SquaresPlusIcon,
XMarkIcon,
} from "@heroicons/vue/24/outline";
import {
ChevronDownIcon,
PhoneIcon,
PlayCircleIcon,
RectangleGroupIcon,
} from "@heroicons/vue/20/solid";
import SteamIcon from "./SteamIcon.vue";
const features = [
{
name: "Library Management",
description:
"Learn how Drop can help you manage your library, and enhance it with metadata.",
href: "/features/library",
icon: ServerStackIcon,
},
{
name: "Sharing",
description:
"Learn how Drop allows you to share your game library with friends & family.",
href: "/features/sharing",
icon: ShareIcon,
},
{
name: "Steamworks",
description:
"Learn how Drop's Steamworks library can emulate Steam's features on your Drop server.",
href: "#",
icon: SteamIcon,
},
{
name: "Integrations",
description:
"Learn how to integrate your other tools and software with Drop.",
href: "#",
icon: SquaresPlusIcon,
},
];
const router = useRouter();
router.afterEach(() => {
mobileMenuOpen.value = false;
});
const mobileMenuOpen = ref(false);
</script>

File diff suppressed because it is too large Load diff

View file

@ -1,17 +0,0 @@
<template>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
viewBox="-1.5 0 259 259"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
preserveAspectRatio="xMidYMid"
>
<g>
<path
d="M127.778579,0 C60.4203546,0 5.24030561,52.412282 0,119.013983 L68.7236558,147.68805 C74.5451924,143.665561 81.5845466,141.322185 89.1497766,141.322185 C89.8324924,141.322185 90.5059824,141.340637 91.1702465,141.377541 L121.735621,96.668877 L121.735621,96.0415165 C121.735621,69.1388208 143.425688,47.2457835 170.088511,47.2457835 C196.751333,47.2457835 218.441401,69.1388208 218.441401,96.0415165 C218.441401,122.944212 196.751333,144.846475 170.088511,144.846475 C169.719475,144.846475 169.359666,144.83725 168.99063,144.828024 L125.398299,176.205276 C125.425977,176.786507 125.444428,177.367738 125.444428,177.939743 C125.444428,198.144443 109.160732,214.575753 89.1497766,214.575753 C71.5836817,214.575753 56.8868387,201.917832 53.5655182,185.163615 L4.40997549,164.654462 C19.6326942,218.967277 69.0834655,258.786219 127.778579,258.786219 C198.596511,258.786219 256,200.847629 256,129.393109 C256,57.9293643 198.596511,0 127.778579,0 Z M80.3519677,196.332478 L64.6033732,189.763644 C67.389592,195.63131 72.2239585,200.539484 78.6359521,203.233444 C92.4932392,209.064206 108.472481,202.430791 114.247888,188.435116 C117.043333,181.663313 117.061785,174.190342 114.294018,167.400086 C111.526251,160.609831 106.295171,155.31417 99.5879487,152.491048 C92.9176301,149.695603 85.7767911,149.797088 79.5031858,152.186594 L95.777656,158.976849 C105.999942,163.276114 110.834309,175.122157 106.571948,185.436702 C102.318812,195.751247 90.574254,200.631743 80.3519677,196.332478 Z M202.30901,96.0424391 C202.30901,78.1165345 187.85204,63.5211763 170.092201,63.5211763 C152.323137,63.5211763 137.866167,78.1165345 137.866167,96.0424391 C137.866167,113.968344 152.323137,128.554476 170.092201,128.554476 C187.85204,128.554476 202.30901,113.968344 202.30901,96.0424391 Z M145.938821,95.9870838 C145.938821,82.4988323 156.779242,71.5661525 170.138331,71.5661525 C183.506646,71.5661525 194.347066,82.4988323 194.347066,95.9870838 C194.347066,109.475335 183.506646,120.408015 170.138331,120.408015 C156.779242,120.408015 145.938821,109.475335 145.938821,95.9870838 Z"
fill="currentColor"
></path>
</g>
</svg>
</template>

30
content-collections.ts Normal file
View file

@ -0,0 +1,30 @@
import { defineCollection, defineConfig } from '@content-collections/core'
import { compileMDX } from '@content-collections/mdx'
import { z } from 'zod'
const posts = defineCollection({
name: 'Posts',
directory: 'posts',
include: '*.mdx',
schema: z.object({
title: z.string(),
date: z.string(),
image: z.string(),
author: z.string(),
tags: z.string(),
}),
async transform(data, context) {
const paragraph = data.content
.split('\n')
.filter((e) => !e.startsWith('#'))
.at(0)
const excerpt = paragraph!.split(' ').slice(0, 20).join(' ') + '...'
const mdx = await compileMDX(context, data)
return { ...data, excerpt, url: `/news/${data._meta.path}`, mdx }
},
})
export default defineConfig({
collections: [posts],
})

@ -1 +0,0 @@
Subproject commit 01fd41c65ae288eb19bbc92b2625733afe51c101

View file

@ -1,34 +0,0 @@
<template>
<NuxtLayout>
<main
class="grid min-h-full place-items-center px-6 py-24 sm:py-32 lg:px-8"
>
<div class="text-center">
<p class="text-base font-semibold text-blue-600">
{{ error?.statusCode ?? 500 }}
</p>
<h1
class="mt-4 text-balance text-5xl font-semibold tracking-tight text-zinc-100 sm:text-7xl"
>
{{ error?.statusMessage ?? "An unknown error occurred." }}
</h1>
<p
class="mt-6 text-pretty text-lg font-medium text-zinc-400 sm:text-xl/8"
>
{{ error?.message }}
</p>
<div class="mt-10 flex items-center justify-center gap-x-6">
<NuxtLink
href="/"
class="rounded-md bg-blue-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
>Go back home</NuxtLink
>
</div>
</div>
</main>
</NuxtLayout>
</template>
<script setup lang="ts">
const error = useError();
</script>

22
eslint.config.mjs Normal file
View file

@ -0,0 +1,22 @@
import { FlatCompat } from '@eslint/eslintrc'
import { dirname } from 'path'
import { fileURLToPath } from 'url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const compat = new FlatCompat({
baseDirectory: __dirname,
})
const eslintConfig = [
...compat.extends('next/core-web-vitals', 'next/typescript'),
{
rules: {
'@next/next/no-img-element': 'off',
'prefer-const': 'off',
},
},
]
export default eslintConfig

View file

@ -1,97 +0,0 @@
<template>
<div class="relative min-h-screen w-full flex flex-col">
<Header />
<main class="grow">
<slot />
</main>
<Footer />
<!-- shadows -->
<div class="fixed w-screen h-screen -z-10">
<div
class="absolute inset-x-0 transform-gpu overflow-hidden blur-3xl top-[10rem]"
aria-hidden="true"
>
<div
class="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-cyan-500 to-blue-600 opacity-20 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]"
style="
clip-path: polygon(
74.1% 44.1%,
100% 61.6%,
97.5% 26.9%,
85.5% 0.1%,
80.7% 2%,
72.5% 32.5%,
60.2% 62.4%,
52.4% 68.1%,
47.5% 58.3%,
45.2% 34.5%,
27.5% 76.7%,
0.1% 64.9%,
17.9% 100%,
27.6% 76.8%,
76.1% 97.7%,
74.1% 44.1%
);
"
/>
</div>
<div
class="absolute inset-x-0 transform-gpu overflow-hidden blur-3xl -top-[15rem]"
aria-hidden="true"
>
<div
class="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-blue-600 to-blue-100 opacity-20 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]"
style="
clip-path: polygon(
74.1% 44.1%,
100% 61.6%,
97.5% 26.9%,
85.5% 0.1%,
80.7% 2%,
72.5% 32.5%,
60.2% 62.4%,
52.4% 68.1%,
47.5% 58.3%,
45.2% 34.5%,
27.5% 76.7%,
0.1% 64.9%,
17.9% 100%,
27.6% 76.8%,
76.1% 97.7%,
74.1% 44.1%
);
"
/>
</div>
<div
class="absolute left-[10%] inset-x-0 transform-gpu overflow-hidden blur-3xl top-[50vh]"
aria-hidden="true"
>
<div
class="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[60deg] bg-gradient-to-tr from-blue-600 to-blue-100 opacity-20 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]"
style="
clip-path: polygon(
74.1% 44.1%,
100% 61.6%,
97.5% 26.9%,
85.5% 0.1%,
80.7% 2%,
72.5% 32.5%,
60.2% 62.4%,
52.4% 68.1%,
47.5% 58.3%,
45.2% 34.5%,
27.5% 76.7%,
0.1% 64.9%,
17.9% 100%,
27.6% 76.8%,
76.1% 97.7%,
74.1% 44.1%
);
"
/>
</div>
</div>
</div>
</template>

5
next.config.mjs Normal file
View file

@ -0,0 +1,5 @@
import { withContentCollections } from '@content-collections/next'
/** @type {import('next').NextConfig} */
const nextConfig = { reactStrictMode: true, output: 'export' }
export default withContentCollections(nextConfig)

View file

@ -1,18 +0,0 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: "2024-11-01",
devtools: { enabled: true },
modules: ["@nuxtjs/tailwindcss", "vue3-carousel-nuxt"],
extends: ["./drop-base"],
css: ["~/assets/core.scss"],
app: {
head: {
link: [{ rel: "icon", href: "/favicon.ico" }],
},
},
carousel: {
prefix: "Vue",
},
ssr: false,
});

View file

@ -1,25 +1,46 @@
{
"name": "nuxt-app",
"name": "radiant",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"typegen": "sanity schema extract --path=src/sanity/extract.json && sanity typegen generate && rm ./src/sanity/extract.json"
},
"dependencies": {
"@headlessui/vue": "^1.7.23",
"@heroicons/vue": "^2.2.0",
"@nuxtjs/tailwindcss": "6.13.1",
"nuxt": "^3.15.2",
"vue": "latest",
"vue-router": "latest",
"vue3-carousel-nuxt": "^1.1.5"
"@headlessui/react": "^2.2.6",
"@heroicons/react": "^2.2.0",
"@octokit/core": "^7.0.3",
"clsx": "^2.1.1",
"dayjs": "^1.11.13",
"feed": "^5.1.0",
"framer-motion": "^12.23.11",
"next": "15.4.4",
"react": "^19",
"react-dom": "^19",
"react-use-measure": "^2.1.7",
"styled-components": "^6"
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
"devDependencies": {
"sass-embedded": "^1.83.4"
"@content-collections/core": "^0.11.1",
"@content-collections/mdx": "^0.2.2",
"@content-collections/next": "^0.2.7",
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4.1.11",
"@types/mdx": "^2.0.13",
"@types/node": "^24",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "15.4.4",
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"prettier-plugin-organize-imports": "^4.2.0",
"prettier-plugin-tailwindcss": "^0.6.14",
"tailwindcss": "^4.1.11",
"typescript": "^5",
"zod": "^4.1.5"
}
}

View file

@ -1,461 +0,0 @@
<template>
<div class="py-24 sm:py-32">
<div class="mx-auto max-w-4xl px-6 max-lg:text-center lg:max-w-7xl lg:px-8">
<h1
class="text-balance text-5xl font-semibold tracking-tight text-zinc-100 sm:text-6xl lg:text-pretty"
>
What's the
<span class="font-mono px-2 py-1 rounded-xl text-zinc-300 bg-zinc-900"
>git diff</span
>?
</h1>
<p
class="mt-6 max-w-2xl text-pretty text-lg font-medium text-zinc-400 max-lg:mx-auto sm:text-xl/8"
>
What's the difference between Drop and the other options available to
me? This guide, put together by the Drop team, explains the difference
in use-case and features.
</p>
<div class="mt-8 rounded-md bg-blue-600/20 backdrop-blur p-4">
<div class="flex">
<div class="shrink-0">
<InformationCircleIcon
class="size-5 text-blue-400"
aria-hidden="true"
/>
</div>
<div class="ml-3 flex-1 md:flex md:justify-between">
<p class="text-sm text-blue-400">
This comparison was made by the Drop team, and may inaccurately
represent some options. If you are a developer or maintainer for
one of these projects, feel free to reach out to us to get your
project removed or updated.
</p>
<p class="mt-3 text-sm md:ml-6 md:mt-0">
<a
href="https://github.com/Drop-OSS/drop-website"
target="_blank"
class="whitespace-nowrap font-medium text-blue-400 hover:text-blue-500"
>
GitHub
<span aria-hidden="true"> &rarr;</span>
</a>
</p>
</div>
</div>
</div>
</div>
<div class="relative py-16 sm:py-24">
<div
class="absolute inset-x-0 bottom-0 top-48 bg-zinc-950/20 backdrop-blur-xl"
/>
<div class="relative mx-auto max-w-2xl px-6 lg:max-w-7xl lg:px-8">
<!-- change cols if add more projects -->
<div class="w-fit grid grid-cols-1 gap-10 lg:grid-cols-3 mx-auto">
<div
v-for="project in projects"
:key="project.name"
class="-m-2 grid grid-cols-1 rounded-[2rem] 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
class="grid grid-cols-1 rounded-[2rem] p-2 shadow-md shadow-black/5"
>
<div
class="rounded-3xl bg-zinc-950 p-10 pb-9 shadow-2xl ring-1 ring-black/5"
>
<h2 class="text-2xl font-semibold text-blue-400">
{{ project.name }}
</h2>
<p class="mt-2 text-pretty text-sm/6 text-zinc-400">
{{ project.description }}
</p>
<div class="mt-8">
<NuxtLink
:href="project.href"
:aria-label="`Check out ${project.name}`"
class="inline-block rounded-md bg-blue-600 px-3.5 py-2 text-center text-sm/6 font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
>Check it out &rarr;</NuxtLink
>
</div>
<div class="mt-8">
<h3 class="text-sm/6 font-medium text-zinc-100">
Feature highlights
</h3>
<ul class="flex flex-col mt-3 gap-y-3">
<li
v-for="highlight in project.highlights"
:key="highlight.description"
class="group inline-flex flex-col gap-1 items-start text-sm/6 text-zinc-400"
>
<div class="inline-flex items-center gap-3">
<span class="inline-flex h-6 items-center">
<PlusIcon
class="size-4 fill-blue-600"
aria-hidden="true"
/>
</span>
{{ highlight.description }}
</div>
<ComingSoon v-if="(highlight as any)['comingsoon']" />
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mx-auto max-w-2xl px-6 pt-16 sm:pt-24 lg:max-w-7xl lg:px-8">
<table class="w-full text-left max-sm:hidden">
<caption class="sr-only">
Project comparison
</caption>
<colgroup>
<!-- add or remove columns when updating project -->
<col class="w-2/5" />
<col class="w-1/5" />
<col class="w-1/5" />
<col class="w-1/5" />
</colgroup>
<thead>
<tr>
<td class="p-0" />
<th
v-for="project in projects"
:key="project.name"
scope="col"
class="p-1 sticky top-4 text-center"
>
<div class="text-xl font-semibold text-zinc-100">
{{ project.name }}
</div>
</th>
</tr>
</thead>
<tbody v-for="section in sections" :key="section.name" class="group">
<tr>
<th
scope="colgroup"
colspan="4"
class="px-0 pb-0 pt-10 group-first-of-type:pt-5"
>
<div
class="-mx-4 rounded-lg px-4 py-3 text-sm/6 font-semibold text-zinc-100"
>
{{ section.name }}
</div>
</th>
</tr>
<tr
v-for="feature in section.features"
:key="feature.name"
class="border-b border-zinc-600 last:border-none"
>
<th
scope="row"
class="px-0 py-4 text-sm/6 font-normal text-zinc-300"
>
{{ feature.name }}
</th>
<td
v-for="tier in projects"
:key="tier.name"
class="p-4 text-center"
>
<template v-if="typeof feature.projects[tier.name] === 'string'">
<span class="sr-only">{{ tier.name }} includes:</span>
<span class="text-sm/6 text-zinc-400">{{
feature.projects[tier.name]
}}</span>
</template>
<template v-else>
<CheckIcon
v-if="feature.projects[tier.name] === true"
class="inline-block size-6 fill-green-600"
aria-hidden="true"
/>
<MinusIcon
v-else
class="inline-block size-6 fill-gray-400"
aria-hidden="true"
/>
<span class="sr-only">{{
feature.projects[tier.name] === true
? `Included in ${tier.name}`
: `Not included in ${tier.name}`
}}</span>
</template>
</td>
</tr>
</tbody>
</table>
<TabGroup class="sm:hidden" as="div">
<TabList class="grid grid-cols-3 gap-x-1">
<Tab
as="template"
v-for="tier in projects"
:key="tier.name"
v-slot="{ selected }"
>
<button
:class="[
selected ? 'border-blue-600' : 'border-zinc-600',
'border-b-2 text-zinc-100 pb-1',
]"
>
{{ tier.name }}
</button>
</Tab>
</TabList>
<TabPanels as="template">
<TabPanel v-for="tier in projects" :key="tier.name">
<template v-for="section in sections" :key="section.name">
<div
class="-mx-6 mt-10 rounded-lg px-6 py-3 text-sm/6 font-semibold text-zinc-100 group-first-of-type:mt-5"
>
{{ section.name }}
</div>
<dl>
<div
v-for="feature in section.features"
:key="feature.name"
class="grid grid-cols-2 border-b border-zinc-700 py-4 last:border-none"
>
<dt class="text-sm/6 font-normal text-gray-400">
{{ feature.name }}
</dt>
<dd class="text-center">
<span
v-if="typeof feature.projects[tier.name] === 'string'"
class="text-sm/6 text-zinc-400"
>{{ feature.projects[tier.name] }}</span
>
<template v-else>
<CheckIcon
v-if="feature.projects[tier.name] === true"
class="inline-block size-6 fill-green-600"
aria-hidden="true"
/>
<MinusIcon
v-else
class="inline-block size-6 fill-gray-400"
aria-hidden="true"
/>
<span class="sr-only">{{
feature.projects[tier.name] === true ? "Yes" : "No"
}}</span>
</template>
</dd>
</div>
</dl>
</template>
</TabPanel>
</TabPanels>
</TabGroup>
</div>
</div>
</template>
<script setup lang="ts">
import { CheckIcon, MinusIcon, PlusIcon } from "@heroicons/vue/16/solid";
import { Tab, TabGroup, TabList, TabPanel, TabPanels } from "@headlessui/vue";
import { InformationCircleIcon } from "@heroicons/vue/24/outline";
const projects = [
{
name: "Drop",
description: "An open Steam.",
href: "/",
highlights: [
{ description: "First-class Linux support" },
{ description: "Lightweight game upgrades" },
{ description: "Multiple metadata sources" },
{ description: "Cloud-saves & playtime tracking", comingsoon: true },
{ description: "Steamworks replacement library", comingsoon: true },
],
},
{
name: "GameVault",
description: "Create your own gaming platform.",
href: "https://gamevau.lt/",
highlights: [
{ description: "First-class Windows support" },
{ description: "Native Windows app" },
{ description: "Share with family & friends" },
{ description: "Playtime tracking" },
{ description: "Paid support & optional features" },
{ description: "Paid Playnite integration" },
],
},
{
name: "LANCommander",
description: "An open-source digital game platform.",
href: "https://github.com/LANCommander/LANCommander",
highlights: [
{ description: "License key management" },
{ description: "Dedicated server management" },
{ description: "PowerShell scripting" },
{ description: "Cloud-saves" },
{ description: "P2P downloads & VPN networking", comingsoon: true },
],
},
] as const;
type Names = (typeof projects)[number]["name"];
const sections: Array<{
name: string;
features: Array<{
name: string;
projects: { [key in Names]?: boolean | string };
}>;
}> = [
{
name: "Library Management",
features: [
{
name: "Metadata fetching",
projects: { Drop: true, GameVault: "Only IGDB", LANCommander: false },
},
{
name: "Game versioning",
projects: { Drop: true },
},
{
name: "Redistributables",
projects: { LANCommander: true },
},
{
name: "License key management",
projects: { LANCommander: true },
},
{
name: "Automatic import",
projects: { GameVault: true },
},
{
name: "Collections",
projects: { Drop: true, LANCommander: true },
},
],
},
{
name: "Deployment",
features: [
{
name: "Docker",
projects: { Drop: true, GameVault: true, LANCommander: true },
},
{
name: "CapRover",
projects: { GameVault: true },
},
{
name: "TrueNAS",
projects: { GameVault: true },
},
{
name: "UNRAID",
projects: { GameVault: true },
},
{
name: "Synology",
projects: { GameVault: true },
},
{
name: "Native",
projects: {
GameVault: true,
Drop: "Possible, unsupported",
LANCommander: true,
},
},
{
name: "ARM support",
projects: {
Drop: true,
LANCommander: true,
},
},
],
},
{
name: "Operating Systems",
features: [
{
name: "Windows",
projects: { Drop: true, GameVault: true, LANCommander: true },
},
{
name: "macOS",
projects: { Drop: true, LANCommander: true },
},
{
name: "Linux",
projects: {
Drop: true,
LANCommander: true,
GameVault: "Unsupported, using Wine",
},
},
],
},
{
name: "Integrations",
features: [
{
name: "Playnite",
projects: { GameVault: "Paid feature ($)" },
},
{
name: "Discord",
projects: {
GameVault: "Paid feature ($)",
LANCommander: "Coming soon",
},
},
{
name: "Steam",
projects: { GameVault: "Paid feature ($)" },
},
],
},
{
name: "Other",
features: [
{
name: "Paid support option",
projects: { GameVault: true },
},
{
name: "Cloud saves",
projects: {
Drop: "Coming soon",
LANCommander: true,
GameVault: "Paid feature ($)",
},
},
{
name: "Dedicated server management",
projects: { LANCommander: true },
},
{
name: "Steamworks library",
projects: { Drop: "Coming soon" },
},
{
name: "P2P downloads",
projects: { Drop: "Coming soon", LANCommander: "Coming soon" },
},
{
name: "Remote LAN/automatic networking",
projects: { Drop: "Coming soon", LANCommander: "Coming soon" },
},
],
},
];
useHead({
title: "What's the `git diff`?",
});
</script>

View file

@ -1,79 +0,0 @@
<template>
<div class="py-24 sm:py-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto max-w-2xl sm:text-center">
<h2 class="text-base/7 font-semibold text-blue-400">Admin UI</h2>
<p
class="mt-2 text-pretty text-4xl font-semibold tracking-tight text-white sm:text-balance sm:text-5xl"
>
Powerful metadata tools.
</p>
<p class="mt-6 text-lg/8 text-gray-300">
Drop includes versatile tools to customise and edit the metadata
attached to your library. Add or remove any images, update the name or
icon, or edit the description.
</p>
</div>
</div>
<div class="relative overflow-hidden pt-16">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<img
src="@/assets/ss/admin-metadata.png"
alt="App screenshot"
class="rounded-xl shadow-2xl ring-1 ring-white/10"
/>
</div>
</div>
<div class="mx-auto mt-16 max-w-7xl px-6 sm:mt-20 md:mt-24 lg:px-8">
<dl
class="mx-auto grid max-w-2xl grid-cols-1 gap-x-6 gap-y-10 text-base/7 text-gray-300 sm:grid-cols-2 lg:mx-0 lg:max-w-none lg:grid-cols-3 lg:gap-x-8 lg:gap-y-16"
>
<div
v-for="feature in features"
:key="feature.name"
class="relative pl-9"
>
<dt class="inline font-semibold text-white">
<component
:is="feature.icon"
class="absolute left-1 top-1 size-5 text-blue-500"
aria-hidden="true"
/>
{{ feature.name }}
</dt>
{{ " " }}
<dd class="inline">{{ feature.description }}</dd>
</div>
</dl>
</div>
</div>
</template>
<script setup lang="ts">
import { DocumentDuplicateIcon, PencilIcon, ServerStackIcon } from "@heroicons/vue/24/outline";
const features = [
{
name: "Multiple sources.",
description:
"Drop lets you configure more than one source to pull metadata from. Then, choose between them when importing your game.",
icon: DocumentDuplicateIcon,
},
{
name: "Markdown descriptions.",
description:
"Descriptions are parsed as markdown, so you can use all the formatting you like. Freely edit the description, and enjoy as it auto-saves.",
icon: PencilIcon,
},
{
name: "Image library.",
description:
"Upload and store all the images required for your game. Freely replace images without losing the originals, and customise the cover and banner of your store page.",
icon: ServerStackIcon,
},
];
useHead({
title: "Library"
})
</script>

View file

@ -1,3 +0,0 @@
<template>
</template>

File diff suppressed because one or more lines are too long

5985
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load diff

8
pnpm-workspace.yaml Normal file
View file

@ -0,0 +1,8 @@
onlyBuiltDependencies:
- '@tailwindcss/oxide'
- contentlayer
- contentlayer2
- esbuild
- protobufjs
- sharp
- unrs-resolver

5
postcss.config.js Normal file
View file

@ -0,0 +1,5 @@
module.exports = {
plugins: {
'@tailwindcss/postcss': {},
},
}

47
posts/roadmap2025.mdx Normal file
View file

@ -0,0 +1,47 @@
---
title: 2025 Roadmap
date: 2025-09-03
image: /news/roadmap-sep32025.png
author: decduck
tags: Roadmap, Planning
---
As 2025 draws to a close, we've thought about where we want Drop to be by the end of the year. As a project, we've come a long way since our first commit in [September of 2024](https://github.com/Drop-OSS/drop/commit/e1a789fa363946f74ecc21b9800c7e84563b46c3). Since then, we've had three, major releases (v0.1.0, v0.2.0, v0.3.0), each time adding lots of cool new features. With that in mind, here's what we're planning to do before the year's end - no promises, though.
---
## Redistributable support
Redistributables are generally library/framework files that need to be installed before a game will run. Often games on Steam will automatically install things like the "Visual C++ Redistributable", or similar, to ensure the game works properly and has all the installed libraries it needs.
Drop extends this traditional idea of 'redistributables' into a general idea - anything that only needs to be downloaded for several games. Drop will also support attaching launch commands to these redistributables for one specific purpose:
## Emulation support
Through the redistributable system described above, admins will be able to add and import their favourite emulators as a "redistributable", and configure a launch command. That may look something like this:
```
MyEmulator.exe --rom-file {rom} --fullscreen
```
And then you'll be able to configure this redistributable as a platform. You'll be able to specify file extensions, name the platform, and attach an SVG icon as metadata. Then, when you import an emulated game, Drop will automatically download the emulator and use the above launch command to start your game.
For admins, Drop will automatically search for files with the extensions provided and add it to the existing file-extension based suggestions for imports.
This system, while may seem a little complicated, has the following benefits:
1. **Drop doesn't need specific integration with most emulators.** Most emulators have a CLI (command line interface), even if the documentation for it is a little buried. This means admins will be able to get almost any emulator working without writing any new code.
2. **More flexibility than just emulators.** Lots of other useful tools and applications fit into this model. Your favourite optimisation tool, tracking tool, mod launcher, what have you - all can be done through this system.
3. **Better UX and control for admins.** Rather than Drop hardcoding a massive list of emulation targets that are available, and developers having to maintain that list, Drop allows admins to use only what they need, and fix things themselves.
## Playtime tracking
Drop will being tracking and syncing playtime statistics with the configured server. Under the hood, each play 'session' will be tracked individually, even if Drop only displays aggregated amounts.
This opens up the potential for cool statistics down the line. We don't have many ideas, but features like "What are my friends playing?" and "Am I burning out?" come to mind. Endless possibilities.
---
Unfortunately, as it is for most people, these coming months will be very busy for the team, so we may not get to everything on this list. But who knows, maybe we'll complete it and more?
Regardless, Drop's future development is secure, and we're excited to be implementing new and awesome features for people to enjoy.

8
prettier.config.js Normal file
View file

@ -0,0 +1,8 @@
/** @type {import('prettier').Options} */
module.exports = {
singleQuote: true,
semi: false,
plugins: ['prettier-plugin-organize-imports', 'prettier-plugin-tailwindcss'],
tailwindFunctions: ['clsx'],
tailwindStylesheet: './src/styles/tailwind.css',
}

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
public/avatars/decduck.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
public/avatars/sponsor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

4
public/dot-texture.svg Normal file
View file

@ -0,0 +1,4 @@
<svg width="12" height="32" viewBox="0 0 12 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="2" height="2" fill="white" fill-opacity="0.1"/>
<rect y="16" width="2" height="2" fill="white" fill-opacity="0.05"/>
</svg>

After

Width:  |  Height:  |  Size: 233 B

23
public/drop.crt Normal file
View file

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIIDyzCCArOgAwIBAgIUOY7l2v2Z37NBHvnC9erDT9t3HOEwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCQVUxDzANBgNVBAcMBlN5ZG5leTERMA8GA1UECgwIRHJv
cCBPU1MxETAPBgNVBAsMCFNlY3VyaXR5MREwDwYDVQQDDAhEcm9wIE9TUzEjMCEG
CSqGSIb3DQEJARYUc2VjdXJpdHlAZHJvcG9zcy5vcmcwHhcNMjUwODAyMDEwOTI2
WhcNMzAwODAxMDEwOTI2WjB8MQswCQYDVQQGEwJBVTEPMA0GA1UEBwwGU3lkbmV5
MREwDwYDVQQKDAhEcm9wIE9TUzERMA8GA1UECwwIU2VjdXJpdHkxETAPBgNVBAMM
CERyb3AgT1NTMSMwIQYJKoZIhvcNAQkBFhRzZWN1cml0eUBkcm9wb3NzLm9yZzCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMIUBYAHKrPwo2DPqjPxj83i
QEz7KPO3/Ezn/2QKnoV/wzOZwB8vMDEVpm5A4d1G+nyxDEDHTXG8TpFQnU/tjEHV
ZxqPxfCet+sgigEqmpo77ZPCgaF1VRFTfRp4h36jghl++CquMU5RX5g+HHNUSl71
PIISaiP8TJAmMEjKEFOO9uy0vHj1w8L0jo/IaiALoaOKw9N2o5sE2WI6u2kRXkBt
lmDPHNIS37v+wWbPDuFQ5ya7hNal/CMLLDNGJ4Bd3fGkN1/X7mjVMmSORSeutN90
WKJDLDrXmMzhaokvWq820OGbaGSGZ94bC/k9IKlBaUZHYbu/X07gzsoA+AbRIhsC
AwEAAaNFMEMwEgYDVR0TAQH/BAgwBgEB/wIBAzAOBgNVHQ8BAf8EBAMCAcYwHQYD
VR0OBBYEFFW5xDSAZI+4g5bf10eeXjBkfPCkMA0GCSqGSIb3DQEBCwUAA4IBAQAF
ewFl69mGBgGtDrKD5LrXj0P795rnBhkCSOgILyZaDS/DpT2kE3Ty9VXbJ6gKtcN5
vy3463TEgyHwNyWeyGIQpgvSrSheU0xtqKKN5iHaK/czIgOHqi7G3hp8Es11T9lY
xIInAba9Fa3/JI+MnSm2m0GRfI8nL5AFZws11DLzKZkKrozMbWpf+MhbeWBK0Zc6
Y9w8aZvpLCZJ1DKQz/mfVXvmVQCCCNgrNDuI6OWzX9KlPIcizY14nh4K6FM4goy8
3Eyr2mG6bxkRy0nCzB7gzzJunFOcCVZDmSZ4enhG9jWs6SCDdcQmHlqGedeaq8ON
PJJgQBp0IfOqoWivon6a
-----END CERTIFICATE-----

BIN
public/drop.der Normal file

Binary file not shown.

BIN
public/favicon-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

View file

@ -1,14 +1,17 @@
<template>
<svg
class="text-blue-400"
<svg
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
preserveAspectRatio="xMidYMid meet"
>
<style>
:root {
color: oklch(70.7% 0.165 254.624)
}
</style>
<path
d="M4 13.5C4 11.0008 5.38798 8.76189 7.00766 7C8.43926 5.44272 10.0519 4.25811 11.0471 3.5959C11.6287 3.20893 12.3713 3.20893 12.9529 3.5959C13.9481 4.25811 15.5607 5.44272 16.9923 7C18.612 8.76189 20 11.0008 20 13.5C20 17.9183 16.4183 21.5 12 21.5C7.58172 21.5 4 17.9183 4 13.5Z"
stroke="currentColor"
stroke-width="2"
/>
</svg>
</template>
</svg>

Before

Width:  |  Height:  |  Size: 503 B

After

Width:  |  Height:  |  Size: 578 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 KiB

BIN
public/gallery/devices.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

BIN
public/gallery/store.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
public/icons/gamevault.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

View file

@ -0,0 +1,29 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 579 579" width="579" height="579">
<title>giantbomb</title>
<style>
.s0 { fill: #f7961d }
.s1 { fill: #ffffff }
.s2 { fill: #888888 }
.s3 { fill: #ec2024 }
.s4 { fill: #666666 }
.s5 { fill: #000000 }
</style>
<path class="s0" d="m441.27 91.8q1.23 5.36 1.4 10.85 0.18 5.5-0.7 10.92-0.88 5.43-2.79 10.58-1.91 5.16-4.77 9.85c-8.1 13.08-22.41 23.08-37.78 25.33q0.21 0.25 0.42 0.5 0.2 0.26 0.4 0.52 0.19 0.26 0.38 0.52 0.19 0.27 0.37 0.54c1.84 2.81 0.46 7.78-3.7 7.08-6.94-1.17-11.51-8.89-13.39-15.14q-0.22-0.74-0.41-1.49-0.18-0.76-0.32-1.52-0.14-0.76-0.23-1.53-0.1-0.77-0.15-1.54c-7.9 9.09-12.2 22.5-13.26 33.41q-0.13 1.31-0.2 2.7 3.89 2.27 7.62 4.78 3.74 2.5 7.31 5.24 3.58 2.73 6.98 5.68 3.39 2.95 6.6 6.11 2.56 2.47 5 5.05 2.44 2.58 4.77 5.27 2.32 2.68 4.52 5.48 2.19 2.79 4.26 5.68 2.28-0.96 4.5-2.05 2.21-1.09 4.37-2.31 2.15-1.21 4.24-2.54 2.08-1.33 4.09-2.77c22-15.85 37.67-41.13 37.68-68.75 0.01-21.49-10.26-43.19-27.21-56.45z"/>
<path class="s1" d="m395.06 205.19q5.06 4.9 9.72 10.25c10.4-4.88 20.3-11.58 26.43-21.46 6.43-10.37 8.16-23.53 2.42-34.56-0.58-1.11-2.33-1.77-3.33-0.72q-2.53 2.71-5.28 5.2-2.75 2.48-5.71 4.72-2.96 2.24-6.1 4.21-3.14 1.98-6.44 3.67c-5 2.5-10.67 4.42-16.31 3.27-5.33-1.09-9.17-4.86-13-8.42-1-0.91-3-0.7-3.08 1q-0.09 2.15-0.03 4.3 0.06 2.14 0.26 4.28 0.21 2.14 0.55 4.27 0.35 2.12 0.84 4.21 2.54 1.78 5 3.65 2.46 1.88 4.85 3.86 2.38 1.97 4.69 4.04 2.3 2.07 4.52 4.23z"/>
<path fill-rule="evenodd" class="s2" d="m360.82 446.69c-56.31 56.31-147.34 56.31-203.65 0-56.3-56.31-56.3-147.34 0-203.65 56.31-56.3 147.34-56.3 203.65 0 56.31 56.31 56.31 147.34 0 203.65z"/>
<path class="s3" d="m441.27 91.8q0.42 1.85 0.71 3.73 0.29 1.87 0.46 3.77 0.17 1.89 0.21 3.78 0.05 1.9-0.03 3.8c3.15 6.71 6.71 13.27 9.44 20.17 4.35 11 6.83 21.8 5.45 33.63-1.25 10.66-5 20.86-9.76 30.42-2.38 4.76-5 9.39-7.77 14-1.87 3.11-4.13 6.2-5.93 9.46 20.28-15.94 34.42-40 34.43-66.29 0.01-21.51-10.26-43.21-27.21-56.47z"/>
<path class="s4" d="m189.34 415.41c-12.15-12.15-22.04-26.38-29.17-42.02-7.14-15.63-11.43-32.42-12.65-49.57-1.22-17.14 0.64-34.37 5.48-50.86 4.85-16.49 12.61-31.98 22.92-45.73-34.37 24.3-56.38 62.43-60.25 104.34-3.87 41.92 10.8 83.43 40.14 113.61 29.34 30.18 70.42 46.02 112.43 43.33 42.01-2.68 80.74-23.61 106-57.28-13.76 9.72-29.12 16.95-45.38 21.35-16.26 4.41-33.17 5.93-49.96 4.5-16.78-1.44-33.19-5.81-48.46-12.92-15.28-7.1-29.19-16.84-41.1-28.75z"/>
<path class="s1" d="m380.91 321.48q-1.24 0-2.42-0.4-1.18-0.41-2.16-1.17-0.98-0.76-1.67-1.8-0.69-1.04-1-2.24-1.99-7.6-4.96-14.87-2.98-7.27-6.89-14.08-3.91-6.82-8.69-13.05-4.77-6.24-10.33-11.79c-1.4-1.41-2.19-3.32-2.19-5.3-0.01-1.99 0.79-3.9 2.19-5.31 1.41-1.4 3.32-2.19 5.3-2.2 1.99 0 3.9 0.8 5.31 2.2q6.26 6.26 11.64 13.28 5.38 7.03 9.78 14.71 4.41 7.67 7.76 15.87 3.35 8.19 5.59 16.75c0.29 1.11 0.32 2.27 0.09 3.39-0.23 1.12-0.72 2.18-1.42 3.08-0.7 0.91-1.6 1.64-2.63 2.15-1.02 0.5-2.15 0.77-3.3 0.77z"/>
<path fill-rule="evenodd" class="s5" d="m226.89 286.65c-6.85 25.62-22.75 43.56-35.56 40.13-12.81-3.42-17.62-26.9-10.77-52.52 6.86-25.62 22.75-43.56 35.56-40.14 12.82 3.43 17.63 26.91 10.77 52.53z"/>
<path fill-rule="evenodd" class="s5" d="m319.96 297.98c-3.7 29.21-18.5 51.33-33.11 49.48-14.6-1.85-23.41-26.97-19.7-56.18 3.7-29.21 18.5-51.33 33.11-49.48 14.6 1.86 23.41 26.97 19.7 56.18z"/>
<path fill-rule="evenodd" class="s1" d="m313.47 279.79c-1.94 15.32-11.45 26.69-21.27 25.44-9.82-1.24-16.19-14.63-14.25-29.95 1.95-15.31 11.46-26.69 21.28-25.44 9.82 1.24 16.18 14.63 14.24 29.95z"/>
<path fill-rule="evenodd" class="s1" d="m222.3 266.39c-3.08 12.42-12.01 20.86-19.97 18.89-7.96-1.98-11.9-13.61-8.82-26.03 3.08-12.42 12-20.87 19.96-18.89 7.96 1.97 11.91 13.61 8.83 26.03z"/>
<path class="s2" d="m371.43 232.44q6.61 6.58 12.4 13.9 5.8 7.31 10.69 15.26 4.89 7.94 8.82 16.41 3.93 8.46 6.83 17.33 0.21-0.16 0.41-0.33 0.2-0.17 0.39-0.34 0.2-0.17 0.39-0.35 0.19-0.18 0.38-0.36c14.06-14.06 2.66-48.25-25.46-76.37-28.12-28.12-62.28-39.51-76.37-25.46q-0.18 0.19-0.36 0.38-0.18 0.19-0.35 0.39-0.17 0.19-0.34 0.39-0.17 0.2-0.33 0.41 8.87 2.9 17.33 6.83 8.47 3.93 16.41 8.82 7.95 4.89 15.26 10.69 7.32 5.79 13.9 12.4z"/>
<path class="s5" d="m387.31 190.71c2.8 3.45 7.07 5.74 10.17 9 3.1 3.26 5.37 7.36 8.15 11 2.27 3 6.34-0.24 5.21-3.36-1.75-4.81-5.69-9.25-9.34-12.74-3.33-3.18-7.55-6.94-12.22-7.72-2.06-0.34-3.16 2.31-2 3.77zm6.69-5.97c4 3.17 8.26 5.62 11.82 9.35 3.22 3.37 5.31 7.87 8.72 10.93 1.83 1.64 4.58-0.57 4.22-2.69-0.83-4.93-5.6-9.85-9.11-13.15-3.81-3.57-8.34-7.22-13.46-8.62-0.54-0.19-1.13-0.17-1.66 0.04-0.54 0.21-0.98 0.6-1.24 1.11-0.27 0.51-0.34 1.09-0.21 1.65 0.13 0.56 0.46 1.05 0.92 1.38zm9-6.48l-0.07-0.18-1.54 1.3c2.84 2 6.07 3.32 8.82 5.59 3.79 3.12 6.25 7 9.45 10.65q0.36 0.38 0.88 0.45 0.51 0.05 0.95-0.22 0.44-0.29 0.6-0.79 0.15-0.5-0.05-0.98c-1.71-4.38-5.49-8.08-9-11.05-2.39-2-7.55-6.61-11-6q-0.26 0.05-0.49 0.2-0.22 0.14-0.38 0.36-0.15 0.22-0.21 0.48-0.06 0.27-0.02 0.53 0.02 0.11 0.06 0.21 0.03 0.1 0.07 0.2 0.05 0.1 0.11 0.19 0.05 0.09 0.12 0.18c0.69 1 2.07-0.09 1.69-1.09zm4.93-2.7c2.74 1.88 5.57 3.61 8.16 5.69q1 0.84 1.94 1.74 0.94 0.9 1.82 1.86 0.88 0.97 1.69 1.99 0.81 1.02 1.55 2.09c0.35 0.48 1.13 0 0.86-0.56-3-6-9.82-10.32-15.49-13.6-0.52-0.3-1.05 0.43-0.54 0.78z"/>
<path class="s5" d="m468.85 110.61q-2.84-5.7-6.57-10.87-3.72-5.16-8.24-9.65-4.52-4.49-9.71-8.18-5.19-3.69-10.91-6.49c-3.94-1.91-8.12 3.14-6.22 6.8 7.54 14.52 7.58 32.72-1.35 46.71-8.1 12.69-21 19.15-35.33 21.82 0-0.12-0.08-0.23-0.12-0.35-1.36-4.65-0.62-9 1.42-13.34 2.04-4.34-4.28-8.64-7.7-5.4-7.3 6.92-13.81 13.29-18.4 22.42q-1.47 2.95-2.65 6.02-1.19 3.07-2.08 6.23-0.89 3.17-1.49 6.41-0.59 3.23-0.88 6.51 4 1.91 7.94 4.14c0-0.92 0.11-1.82 0.2-2.7 1.06-10.92 5.36-24.33 13.26-33.41q0.05 0.77 0.15 1.54 0.09 0.77 0.23 1.53 0.14 0.76 0.32 1.52 0.19 0.75 0.41 1.49c1.88 6.25 6.45 14 13.39 15.14 4.16 0.7 5.53-4.27 3.7-7.08q-0.18-0.27-0.37-0.54-0.19-0.26-0.38-0.52-0.2-0.26-0.4-0.52-0.21-0.25-0.42-0.5c15.35-2.26 29.66-12.26 37.76-25.34q2.86-4.7 4.77-9.85 1.91-5.16 2.79-10.59 0.88-5.43 0.71-10.92-0.18-5.5-1.41-10.86c16.95 13.26 27.22 35 27.21 56.42 0 27.63-15.68 52.9-37.68 68.75q-2 1.45-4.09 2.78-2.08 1.33-4.23 2.54-2.15 1.22-4.37 2.31-2.22 1.09-4.49 2.06 2.3 3.24 4.4 6.62 1.23-0.48 2.44-1 1.21-0.52 2.41-1.07 1.2-0.56 2.37-1.15 1.18-0.59 2.34-1.22 5.15-2.81 9.93-6.22 4.78-3.41 9.13-7.36 4.34-3.95 8.18-8.39 3.84-4.44 7.13-9.3c17.44-25.74 21.11-58.86 6.9-86.94zm-216.68 321.9c9.83-13.32 24.63-18.51 40.66-18.51 0.68 0 0.68-3.71-0.1-3.91-16.67-4.13-33.88 7.34-40.61 22.1v0.32z"/>
<path class="s1" d="m339.61 354.78c-1.31-2.47-4.52-3-6.84-1.79l-18.24 9.47q-3.45 0.72-6.89 1.54-3.43 0.82-6.84 1.73-3.4 0.91-6.79 1.91-3.38 1.01-6.73 2.11-0.21-0.93-0.79-1.69-0.57-0.75-1.41-1.2-0.84-0.44-1.79-0.5-0.95-0.05-1.84 0.29c-24.15 7.26-49.64 7.8-74.61 5.72q-0.37-0.03-0.75 0.02-0.37 0.04-0.73 0.15-0.36 0.11-0.69 0.28-0.34 0.18-0.63 0.41-1.46-0.57-2.91-1.18-1.44-0.62-2.87-1.27-1.42-0.65-2.83-1.35-1.4-0.69-2.79-1.43c-4.11-2.18-9.86 2.48-6.84 6.84l2.58 3.72q0.01 0.13 0.09 0.26 0.43 1.21 1.04 2.35 0.6 1.13 1.36 2.17 0.77 1.03 1.67 1.95 0.9 0.92 1.93 1.69 1.01 1.12 2.12 2.14 0.59 0.6 1.36 0.97 0.76 0.36 1.61 0.44 0.84 0.07 1.66-0.14 0.82-0.22 1.51-0.71 3.25 1.06 6.56 1.91 3.31 0.85 6.66 1.49 3.36 0.65 6.75 1.08 3.39 0.44 6.8 0.66 0.1 0.01 0.19 0.01 0.1 0.01 0.19 0.01 0.1 0 0.2-0.01 0.09 0 0.19-0.01 6 1.06 12.07 1.55 6.07 0.48 12.15 0.39 6.09-0.08 12.14-0.75 6.06-0.67 12.02-1.9 0.45 0.44 1 0.75 0.55 0.31 1.17 0.47 0.61 0.15 1.24 0.14 0.63-0.01 1.24-0.18l24.33-5.7c6.68-1.57 13.48-2.89 19.73-5.81 10.83-5.1 18.36-17.51 12.25-29z"/>
<path class="s5" d="m346.94 345.7q-0.01-0.73-0.22-1.44-0.21-0.7-0.6-1.32-0.39-0.62-0.93-1.11-0.54-0.5-1.19-0.83-0.41-0.28-0.88-0.47-0.46-0.19-0.96-0.27-0.49-0.08-1-0.06-0.5 0.03-0.98 0.17-0.43 0.07-0.84 0.23-0.41 0.16-0.77 0.4-0.37 0.24-0.67 0.55-0.31 0.31-0.54 0.68-1.99 1.62-4.08 3.11-2.09 1.49-4.28 2.84-2.18 1.35-4.45 2.56-2.27 1.2-4.61 2.26-2.56 1.04-5.15 1.98-2.6 0.95-5.23 1.8-2.62 0.85-5.28 1.6-2.66 0.75-5.34 1.4-5.58 1.46-11.22 2.65-5.64 1.19-11.32 2.11-5.69 0.92-11.42 1.57-5.73 0.64-11.48 1.02-5.79 0.37-11.59 0.45-5.8 0.08-11.59-0.13-5.8-0.2-11.57-0.7-5.78-0.49-11.53-1.27-2.53-0.31-5.04-0.74-2.51-0.43-5-0.97-2.49-0.55-4.95-1.21-2.46-0.67-4.89-1.45-1.16-0.39-2.31-0.8-1.15-0.42-2.28-0.86-1.14-0.45-2.26-0.93-1.13-0.47-2.24-0.98c-3.25-1.54-5.98-3.54-9.39-4.26-1.89-0.39-3.45 2-2.56 3.65 1.56 2.82 4.37 5.06 7.51 6.88q0.1 0.11 0.22 0.21 0.11 0.1 0.24 0.18 0.12 0.08 0.26 0.15 0.14 0.06 0.28 0.11 0.3 0.44 0.58 0.88 0.29 0.45 0.56 0.9 0.28 0.45 0.54 0.91 0.26 0.46 0.51 0.93 1.58 2.48 3.09 5 2.55 4.32 4.66 8.87 1.14 2.44 2.17 4.92 1.04 2.48 1.97 5 0.93 2.52 1.75 5.08 0.83 2.56 1.55 5.15c1.82 6.52 3.21 13.14 4.44 19.79 1.23 6.65 1.09 14.61 3.84 20.67q0.01 0.19 0.05 0.37 0.03 0.18 0.1 0.36 0.07 0.17 0.17 0.33 0.1 0.16 0.22 0.3c4.09 5 12.47 7.09 18.42 8.8q2.67 0.77 5.37 1.41 2.7 0.63 5.43 1.13 2.73 0.51 5.48 0.87 2.75 0.36 5.52 0.59 5.63 0.47 11.27 0.39 5.65-0.07 11.27-0.68 5.61-0.62 11.14-1.77 5.53-1.15 10.92-2.83c13.62-4.28 26.92-11 37.26-21 10.34-10 16.8-22.73 20.13-36.56 3.78-15.84 4.09-32.27 3.72-48.57zm-43.94 87.3c-14.69 8.92-31.63 13.46-48.71 14.5q-3.22 0.17-6.44 0.16-3.22 0-6.44-0.18-3.21-0.17-6.42-0.52-3.2-0.34-6.38-0.86-1.74-0.28-3.46-0.6-1.73-0.33-3.45-0.7-1.72-0.38-3.42-0.8-1.71-0.43-3.4-0.9c-2.53-0.69-5.09-1.75-7.69-2.39 0.39-3.88-0.71-8-1.31-11.84-0.6-3.84-1.29-7.85-2.07-11.76q-0.58-2.92-1.25-5.82-0.68-2.9-1.44-5.78-0.76-2.87-1.61-5.72-0.86-2.86-1.8-5.68-0.94-2.87-2.03-5.69-1.1-2.82-2.34-5.57-1.24-2.76-2.62-5.44-1.39-2.69-2.91-5.3c-0.47-0.79-1.06-1.88-1.74-3.09q2.28 0.74 4.6 1.38 2.31 0.64 4.65 1.19 2.33 0.55 4.69 1.01 2.36 0.45 4.73 0.81 6.1 0.95 12.25 1.57 6.15 0.62 12.32 0.91 6.17 0.29 12.35 0.25 6.17-0.04 12.34-0.41 6.34-0.34 12.65-1.03 6.31-0.68 12.57-1.7 6.26-1.03 12.46-2.39 6.2-1.36 12.32-3.05c11.06-3.07 23-6.7 32.59-13.4-0.23 13.53-0.83 27.2-4.51 40.24-4.62 16.38-14.43 29.75-29.08 38.6zm-79 12.3l0.31 0.07z"/>
<path class="s5" d="m335.25 378c-10.56 4-20.86 8.21-31.89 11q-4.58 1.16-9.21 2.12-4.62 0.95-9.29 1.69-4.67 0.74-9.36 1.26-4.7 0.52-9.41 0.83-4.61 0.31-9.23 0.42-4.62 0.1-9.24 0-4.62-0.1-9.23-0.4-4.61-0.3-9.2-0.81c-6-0.68-12.08-1.56-18.06-2.64q-4.84-0.87-9.63-2c-1.87-0.44-3.7-1-6.05-1.54q1.22 3.1 2.28 6.26 0.2 0.6 0.38 1.2 1.79 5.47 3.24 11l0.17 0.35-0.06 0.11q1.32 5.11 2.37 10.3c0.78 3.9 1.45 7.83 2.07 11.76 0.62 3.93 1.7 8 1.31 11.84 2.6 0.63 5.16 1.7 7.69 2.39 2.53 0.69 4.82 1.23 7.25 1.75q0-1.07 0.13-2.13 0.13-1.06 0.38-2.1 0.25-1.04 0.63-2.04 0.37-1 0.86-1.95c0.2-0.48 0.38-1 0.54-1.45l0.32-0.12q1.45-2.43 3.32-4.55 1.88-2.12 4.12-3.85 2.24-1.73 4.77-3.01 2.52-1.28 5.24-2.07l0.14-0.06c5.41-1.57 11.34-1.72 16.46 0.26q-0.51 0.55-1 1.12h0.76q0.16 0.05 0.33 0.08 0.16 0.04 0.33 0.06 0.16 0.03 0.33 0.04 0.17 0 0.34 0l1.58-0.08q1.12-0.8 2.28-1.54 1.16-0.73 2.37-1.39 1.21-0.66 2.45-1.24 1.25-0.58 2.53-1.09c13.19-3.23 28.43-0.16 38.47 8.78q0.12 0.11 0.23 0.22 0.11 0.12 0.21 0.25 0.1 0.12 0.18 0.26 0.09 0.13 0.17 0.27h0.09q3.87-3.2 7.2-6.95 3.33-3.76 6.05-7.98 2.72-4.22 4.76-8.81 2.03-4.58 3.34-9.43 0.97-3.44 1.67-7 0.28-1.38 0.52-2.76c0.39-2.19 0.75-4.42 1-6.63z"/>
<path class="s3" d="m254.31 447.53c17.08-1 34-5.58 48.71-14.5q1-0.61 1.99-1.25 0.98-0.65 1.94-1.33 0.95-0.67 1.89-1.38 0.93-0.72 1.84-1.46-0.08-0.15-0.17-0.29-0.09-0.14-0.2-0.28-0.1-0.13-0.22-0.25-0.11-0.13-0.24-0.24c-10-8.94-25.27-12-38.47-8.78q-2.86 1.11-5.54 2.62-2.68 1.51-5.12 3.38-2.44 1.87-4.59 4.07-2.15 2.19-3.97 4.67c-1.21 1.65-0.08-0.26 0-0.32q0.66-1.43 1.44-2.8 0.77-1.37 1.65-2.68 0.88-1.3 1.86-2.54 0.98-1.23 2.05-2.38c-7.74-3-17.37-1.12-24.22 3.18-6.45 4.06-12.88 11.94-12.73 19.95q3.22 0.7 6.49 1.21 3.17 0.51 6.37 0.86 3.19 0.34 6.4 0.52 3.21 0.17 6.42 0.18 3.21 0.01 6.42-0.16z"/>
<path class="s5" d="m414.66 312.25q3.84-3.83 7.67-7.67 1.11-1.13 2.12-2.35 1.01-1.22 1.9-2.53 0.89-1.3 1.66-2.69 0.77-1.38 1.41-2.83c6.24-14.07 3-30.39-2.68-44.07-7.06-17-18.51-32.16-31.67-44.93-12.61-12.23-27.39-22.87-43.9-29.13-14-5.3-30.73-7.74-44.37-0.17-4.81 2.67-8.46 6.61-12.3 10.45l-2.27 2.27c-0.15 0.15-0.34 0.43-0.53 0.53-0.45 0.22-1.78-0.28-2.32-0.38q-7.55-1.45-15.23-2.18-6.87-0.65-13.77-0.71-6.9-0.06-13.78 0.47-6.88 0.53-13.68 1.65-6.81 1.12-13.5 2.82-6.38 1.63-12.6 3.78-6.22 2.15-12.24 4.81-6.02 2.67-11.8 5.83-5.78 3.15-11.27 6.78-5.68 3.76-11.02 7.99-5.34 4.22-10.3 8.89-4.97 4.66-9.52 9.72-4.56 5.06-8.67 10.49-3.82 5.05-7.22 10.38-3.4 5.34-6.37 10.93-2.96 5.59-5.47 11.41-2.51 5.81-4.54 11.8c-2.72 8.07-4.79 16.34-6.19 24.74-1.41 8.39-2.15 16.89-2.21 25.4-0.06 8.51 0.56 17.02 1.85 25.43 1.29 8.42 3.25 16.72 5.85 24.82q1.96 6.04 4.4 11.91 2.43 5.87 5.33 11.52 2.91 5.65 6.25 11.06 3.35 5.4 7.12 10.51 4.16 5.64 8.8 10.9 4.63 5.26 9.7 10.09 5.08 4.84 10.55 9.22 5.48 4.37 11.31 8.26 6.36 4.23 13.09 7.82 6.73 3.6 13.78 6.53 7.05 2.92 14.35 5.16 7.3 2.23 14.78 3.75 7.59 1.53 15.29 2.32 7.71 0.79 15.45 0.84 7.74 0.05 15.46-0.64 7.71-0.69 15.32-2.12 7.51-1.41 14.84-3.55 7.34-2.13 14.43-4.96 7.1-2.83 13.89-6.34 6.78-3.5 13.2-7.65 6.04-3.91 11.71-8.35 5.68-4.44 10.93-9.37 5.25-4.92 10.04-10.3 4.8-5.37 9.09-11.15c5.21-7.01 9.83-14.44 13.81-22.21 3.97-7.77 7.3-15.86 9.94-24.19 2.64-8.32 4.59-16.85 5.82-25.49 1.23-8.65 1.74-17.38 1.53-26.11q-0.08-3.68-0.32-7.35-0.24-3.67-0.64-7.33-0.41-3.66-0.98-7.29-0.57-3.63-1.31-7.24zm-104.75-120.12c8.38-8.38 22-6.61 32.25-3.31 12.32 4 23.6 11.05 33.57 19.21q4.18 3.39 8.07 7.1 3.9 3.7 7.5 7.7 3.6 4 6.88 8.27 3.27 4.26 6.21 8.77c6.14 9.52 11.35 20.26 12.94 31.59 1.11 7.89 0.21 16.61-5.64 22.54l-1.49 1.49q-2.25-6.9-5.13-13.57-2.88-6.67-6.35-13.05-3.48-6.37-7.52-12.4-4.05-6.03-8.63-11.67-4.63-5.71-9.77-10.97-5.13-5.26-10.73-10.03-5.59-4.77-11.6-9.01-6-4.24-12.37-7.91-3.53-2.03-7.16-3.88-3.64-1.84-7.36-3.5-3.72-1.65-7.52-3.11-3.81-1.46-7.68-2.72zm-105.1 286.19c-46.27-18.81-79.49-60.25-87.78-109.51-8.29-49.26 9.54-99.29 47.12-132.21 37.57-32.91 89.51-44 137.25-29.31 47.74 14.7 84.45 53.08 97.01 101.43q1.48 5.77 2.48 11.63 1.01 5.87 1.53 11.8 0.52 5.93 0.56 11.88 0.04 5.95-0.41 11.89-0.45 6.1-1.43 12.14-0.98 6.04-2.46 11.97-1.49 5.94-3.49 11.72-1.99 5.79-4.47 11.38-2.43 5.44-5.3 10.67-2.86 5.23-6.14 10.21-3.29 4.97-6.96 9.67-3.68 4.69-7.72 9.07c-9.89 10.66-21.33 19.76-33.93 26.99-12.61 7.23-26.24 12.52-40.43 15.68-14.18 3.16-28.77 4.15-43.25 2.95-14.49-1.21-28.71-4.59-42.18-10.05z"/>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

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

@ -0,0 +1,13 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
<title>igdb</title>
<style>
.s0 { fill: #000000 }
</style>
<g id="Layer_1">
<path class="s0" d="m55.7 84.3h5.3v23.9h-5.3z"/>
<path class="s0" d="m67.2 96.3v-0.1c0-6.7 5.3-12.3 12.5-12.3 4.3 0 6.9 1.2 9.4 3.3l-3.3 4c-1.9-1.6-3.5-2.5-6.3-2.5-3.8 0-6.8 3.4-6.8 7.5 0 4.4 3 7.6 7.2 7.6 1.9 0 3.6-0.5 4.9-1.4v-3.4h-5.2v-4.6h10.3v10.4q-1 0.9-2.2 1.6-1.2 0.7-2.5 1.2-1.3 0.5-2.7 0.7-1.4 0.3-2.8 0.3c-7.4 0-12.5-5.2-12.5-12.3z"/>
<path fill-rule="evenodd" class="s0" d="m96.3 84.3h9.3c7.5 0 12.6 5.2 12.6 11.9 0 6.8-5.1 12-12.6 12h-9.3zm5.2 4.7v14.4h4.1c4.3 0 7.2-2.9 7.2-7.1v-0.1c0-4.2-2.9-7.2-7.2-7.2z"/>
<path fill-rule="evenodd" class="s0" d="m124.3 84.3h11c2.7 0 4.9 0.8 6.2 2.1q0.4 0.4 0.8 0.9 0.3 0.5 0.5 1 0.2 0.5 0.3 1.1 0.1 0.5 0.1 1.1v0.1c0 2.6-1.5 4.1-3.1 5.1 2.7 1.1 4.4 2.7 4.4 5.9 0 4.4-3.5 6.6-8.9 6.6h-11.3zm13.7 7c0-1.5-1.3-2.4-3.5-2.4h-5.1v5h4.8c2.3 0 3.8-0.7 3.8-2.5zm-2.6 6.9h-6v5.3h6.2c2.3 0 3.7-0.8 3.7-2.6v-0.1c0-1.6-1.2-2.6-3.9-2.6z"/>
<path fill-rule="evenodd" class="s0" d="m157.2 127l-1.9-0.3q-13.7-2.2-27.5-3.3-13.8-1-27.7-1-13.8 0-27.7 1-13.8 1.1-27.5 3.3l-1.9 0.3v-55h114.2zm-57.1-8.1q6.8 0 13.5 0.3 6.8 0.3 13.5 0.8 6.7 0.5 13.4 1.3 6.7 0.7 13.4 1.7v-47.7h-107.5v47.7q6.6-1 13.3-1.7 6.7-0.8 13.5-1.3 6.7-0.5 13.4-0.8 6.8-0.3 13.5-0.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,17 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 450 450" width="450" height="450">
<title>pcgamingwiki</title>
<style>
.s0 { fill: #365798 }
.s1 { fill: #a5b6d9 }
.s2 { fill: #a5b6d8 }
</style>
<path class="s0" d="m127 127.2l106.3-39.6 89.7 13.6v242.6 6.8l-88.9 11.8-107.1-35.7z"/>
<path class="s1" d="m133 321.3l-0.3-188.3 92.1-34-0.2 251.3zm107.2 29.2v-250.2l73.4 9.9v231.2z"/>
<path class="s0" d="m178 262.5l-41.2-2.4-0.3-72.6 41.6-3.9zm4-79.3l37-4.6-0.3 85.2-36.8-1.1zm-45.7-0.6v-46.1l41.7-13.6 0.3 55zm83.1-75.1l0.2 65-37.6 4.8v-56.4zm-59.9 215.5v-55.7l33.6 2.2v63.5zm58.5 19.1l-4.1-1.5c0.9-5.3-4.5-7.6-4.5-1.4l-4.4-1.3c-0.2-5.2-3.3-7.5-5-1.6l-2.3-0.7-0.1-65.8 2.9 0.2c-1 6.5 5.6 6.7 4.8 0.4l4.8 0.3c-1 6.8 5.5 6.8 4.8 0.3l3 0.2zm-80.9-76.3l19.5 1.4-0.1 25.6-19.4-2.7zm19.7 30.6l-0.2 26.2-19.6-4.8v-24.3zm87.3-192l66 8.7v225.1l-65.9 8.3z"/>
<path class="s1" d="m147.9 175.1l5.8-21.8-3.8 1.7 5.1-18.7 6-1.7-4.5 12.6 4.5-2.4z"/>
<path class="s2" d="m193 163.2c0.3-0.8 0.6-1.5 0.9-2.3 3.3 1.4 6.3 2.4 9.6 0.5 3.2-1.9 5.4-5.8 6.6-9.2 2.4-6.7 2.4-15.8-2-21.7-5.3-7.2-12.9-3.4-16.5 3.3-1.1 2.1-2.7 7.4-2.9 10.7-0.1 1.6 0 3.3 0.2 5 0.2 1.9 1.2 3.9 1 5.9-0.1 0.6-0.4 1-1.1 1.1-4-6.6-1.8-17.3 1.2-23.8 3-6.5 11.3-13.1 18-6.9 6.1 5.7 6.7 16.1 5 23.8-1.5 6.8-6.2 16.9-14.7 16.2-1.4-0.4-4.4-1.1-5.3-2.6zm4.9-10.9c-0.8-2.7 2.7-4.6 3.5-6.7 0.5-1.2 0-2.3-0.5-3.3-1.2-0.6-2.1-0.3-2.6 0.9-0.8 2.1-1.5 3.5-3 5.2-0.8-3.2-0.3-6.9 1.6-9.7 1-1.5 3.1-2.2 4.6-1.6 4.9 1.8 3.4 10.1 1.3 13.4-1.2 1.7-3.1 1.8-4.9 1.8zm0.8-6.1c-1.9 5.3-4.7 11.2-6.7 15.7-0.2-0.1-0.3-0.1-0.4-0.2-0.8-0.9-1.3-2-1.8-3.1-0.2-0.4 0-0.9 0.3-1.2 3.1-3.4 5.4-8.3 8.6-11.2z"/>
<path class="s1" d="m171.7 306.2c-1.4 2.8-1 5.9-1.4 9-2.3-0.6-4-5.1-4.4-7.1 0.4-2.3 1.6-4.1 3.1-5.9 0.7-0.9 0.9-1.7 0.5-2.7-0.2-0.4-0.1-0.9-0.5-1.2-2.1 0.4-3.3 1.9-4.7 3.3-1.6-1.7-1.2-7.9 0-9.7 2-0.4 3.7 0.2 5.4 1.4 1.3-1.2 1.3-2.4 0.2-3.7-0.9-1-3.5-2.1-4-3.1-0.4-1.5 2.4-6.5 4.1-6.4 1.8 2.7 2.9 5.8 3.6 9 0.6 0.3 1.2 0.5 1.9 0.4 0.4-3.7-0.5-7.2-1.6-10.6 0.1-0.1 0.2-0.2 0.2-0.2 2 0.1 4 0.5 5.5 2 3.5 3.4-2.7 9.9 0.1 13.8 2.5-2.4 2.5-5.5 4.4-8.1 1.9 2.4 3.6 7.3 3.2 10.4-1.6 2-2.9 3.1-6.8 3.4 0.1 0.9-0.4 1.7-0.2 2.7 2.1 2.2 4.4 1.9 7.1 1.7 0.4 1.9-1.6 8-3.1 9.4-3-1.4-4.5-4.2-6.2-6.9-0.6 0.5-1.1 0.9-1.5 1.4 0.4 3.1 4.3 6.9 3.8 9.6-1.3 0.6-2.7 1-4.2 0.8-1.5-0.2-2.1-1-2.4-2.6-0.7-3.3 0.8-7.6-2.1-10.1zm28.1 5.2v-15.1l16.1 2.6v16zm-0.1-33l16.1 1.7v15.8l-16.1-2.3zm16.1 39.2v15.8l-16-4.4v-15.1zm-76-7.5v-6.8l3.2 0.5 3.9-3.9 0.2 16-3.9-5zm9.5-6c0.3-0.1 2.5-2 2.8-1.9 1.5 4.1 1.3 7.4-0.5 11.7l-2.1-2.9c0.7-3.1 0.7-3.9-0.3-6.9zm2.3 12.9c-51.1 38.7-25.5 19.3 0 0zm117.2 18.9l-16.7 2v-89.7l16.7-0.9zm21.3-121.7c-2.6 11.9-15.6 10.8-18.5 0.7l-21.9 0.7v-16.1l21.2-0.8c5.4-12.8 15.3-10.9 19.4 0l15.7 0.1 0.4 14.6zm-40.9-56.2v-5.7l57.3 1.8v4.6zm-109.8 125.9l14.8 2.3-4.5-10.3-1.9 3.6-3.2-6.9z"/>
<path fill-rule="evenodd" class="s0" d="m280.8 219c-4.04 0-7.3-5.5-7.3-12.3 0-6.8 3.26-12.3 7.3-12.3 4.04 0 7.3 5.5 7.3 12.3 0 6.8-3.26 12.3-7.3 12.3z"/>
<path class="s1" d="m169.1 236.4c-0.4 0.7-0.4 1.6 0.1 2.2l-6.2 9.5h1.6l5.9-8.7c0.8 0.1 1.6-0.2 2-0.9 0.6-0.9 0.3-2.1-0.6-2.7-1-0.6-2.2-0.3-2.8 0.6zm-26.3 7.1l-2.3 3.1 1.1 1 1.9-2.6 1.7 0.1c0.1 0.2 0.2 0.3 0.4 0.5 0.8 0.8 2 0.8 2.8 0 0.8-0.8 0.8-2 0-2.8-0.8-0.8-2-0.8-2.8 0-0.2 0.2-0.4 0.5-0.5 0.9zm4.8-16.3c-1 0-1.9 0.9-1.9 1.9 0 1 0.9 1.9 1.9 1.9 0.9 0 1.6-0.6 1.8-1.4l10.5 0.3 4.1 5.1c0 0.2-0.1 0.4-0.1 0.6 0 1.1 0.9 2 2 2 1.1 0 2-0.9 2-2 0-1.1-0.9-2-2-2-0.4 0-0.7 0.1-1 0.3l-4.5-5.4-11.4-0.3c-0.2-0.7-0.8-1-1.4-1zm-4.7 4h-1.9v-1.6c1.5 0 2.3-0.4 3.1 0.9 1.6 2.4 3 5 4.5 7.4 0.7 1.2 1.5 2.5 2.3 3.7 1.1 1.8 1.4 1.9 3.5 2 1.5 0.1 3 0.1 4.5 0.1 1.6 0 1.5-1.3 3-1.2 1.3 1.2 1.3 2.8 0 4-1.4 0.1-1.3-1.4-2.3-1.4h-4.6c-2.3 0-2.9 0.5-4.1-1.3-2.6-4.2-5.3-8.4-8-12.6zm1.7 6.3c0 1-0.9 1.9-1.9 1.9-1 0-1.9-0.9-1.9-1.9 0-1 0.9-1.9 1.9-1.9 1 0 1.9 0.9 1.9 1.9zm3.1-36.8c-0.8 0-1.5 0.6-1.8 1.3l-5.4 0.2 0.1 1.5 5.4-0.2c0.3 0.7 1 1.2 1.9 1.2 1.1 0 1.9-1 1.9-2.1 0-1.1-1-1.9-2.1-1.9zm13.4 4.8c-1.1 0-2 0.9-1.9 2 0 1.1 0.9 2 2 1.9 0.8 0 1.4-0.5 1.7-1.2l6-0.2c0.3 0.7 1 1.1 1.8 1.1 1.1 0 2-0.9 1.9-2 0-1.1-0.9-2-2-1.9-0.9 0-1.6 0.6-1.8 1.4l-5.8 0.2c-0.3-0.8-1-1.4-1.9-1.3zm-10.5-7.2l-1 1.1 4.7 4.1 19.2-0.7-0.1-1.5-18.5 0.7zm-9.9 12.2v-1.4l16.2-0.9 16.9 24.6-1.3 0.8-16.6-24zm31.4 6c0.5-0.6 0.6-1.5 0.3-2.2l1.6-2.3v-2l-2.8 3.4c-0.7-0.3-1.6 0-2.1 0.6-0.7 0.8-0.6 2.1 0.2 2.8 0.8 0.6 2.1 0.5 2.8-0.3zm-7.6 0.1c0.5 0.7 1.3 1 2.1 0.8l7.3 10.5v-2.3l-6-9c0.4-0.7 0.4-1.5 0-2.2-0.6-0.9-1.8-1.1-2.7-0.5-1.2 0.6-1.4 1.9-0.7 2.7zm-8.3-2.2c-0.8 0-1.5 0.6-1.8 1.3l-13.6 0.7 0.1 1.5 13.6-0.7c0.3 0.7 1 1.2 1.9 1.2 1.1 0 1.9-1 1.9-2.1 0-1.1-1-2-2.1-1.9zm4.2 7.8l-19.3 0.5v1.5l18.6-0.5 4.1 5.3c0 0.2-0.1 0.4-0.1 0.6 0 1.1 0.9 2 2 2 1.1 0 2-0.9 2-2 0-1.1-0.9-2-2-2-0.4 0-0.7 0.1-1 0.3zm9 25c0.3 0.6 1.2 0 1.4 0.9-0.2 1-2.1 0.1-2.7 0.2-0.3-1 2-3.6 2.6-4.5 0.7-0.3 2.2 0 3 0 0.1 0.7 0.1 1.3-0.4 1.8-0.8 0-1.6-0.3-2.4-0.4-0.5 0.7-1 1.3-1.5 2zm-18.6-13.6c-1.1 0-2 0.9-1.9 2 0 1.1 0.9 2 2 1.9 0.8 0 1.4-0.5 1.7-1.2l5.3-0.1c0.3 0.7 1 1.1 1.8 1.1 1.1 0 2-0.9 1.9-2 0-1.1-0.9-2-2-1.9-0.9 0-1.6 0.6-1.8 1.4l-5.1 0.1c-0.3-0.8-1-1.4-1.9-1.3z"/>
<path fill-rule="evenodd" class="s1" d="m188.8 206.9h22.6v31.6h-22.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
public/icons/rommmark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

16
public/key.gpg Normal file
View file

@ -0,0 +1,16 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaI1UGxYJKwYBBAHaRw8BAQdAuywOb0ODn+sYTU01SAt5Zhnrg06Fu434sQaQ
IQal/0+0H0Ryb3AgT1NTIDxzZWN1cml0eUBkcm9wb3NzLm9yZz6IlgQTFgoAPhYh
BNJmUJMa2VepK+lzaoRc4skSKQf6BQJojVQbAhsDBQkB4TOABQsJCAcCBhUKCQgL
AgQWAgMBAh4BAheAAAoJEIRc4skSKQf6pusBAOedfWEsKtkhgAYml4PtkEq2BLEA
58w66EKuPu0ypM0dAQDDRdgEpsTgg6uUJlnQ93d6PJxgvNo20qq9tyDviCWxDYh1
BBAWCgAdFiEEMTpKS+QtsauEUrDQOZnj7+ye63QFAmiNVOgACgkQOZnj7+ye63SC
hwEA31IuEjccUm8miPOJ1KZApGXpDMfyolpqgfD2jx5YzuYA/RqWh9OIa4LwLNjl
kvWwLnc7X+sE8pSyY3QDNv/VO5oKuDgEaI1UGxIKKwYBBAGXVQEFAQEHQE0/It0Y
r8WjZetfhMBBdoz5FHw4V4qkqzT2cN8JchMrAwEIB4h+BBgWCgAmFiEE0mZQkxrZ
V6kr6XNqhFziyRIpB/oFAmiNVBsCGwwFCQHhM4AACgkQhFziyRIpB/pE+QEAuyDc
OM5bNbNqIkt/GvSne6WqGTJZenWUjvMKI7rKYWEA/38JAhY/OQLoyIt0pTBaJ8pQ
JxHMLckNYF1whCZFloAM
=GsUn
-----END PGP PUBLIC KEY BLOCK-----

BIN
public/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -1 +0,0 @@

BIN
public/screenshots/app.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
public/screenshots/news.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

21
public/site.webmanifest Normal file
View file

@ -0,0 +1,21 @@
{
"name": "Drop OSS",
"short_name": "Drop",
"icons": [
{
"src": "/web-app-manifest-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/web-app-manifest-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"theme_color": "#3f3f46",
"background_color": "#3f3f46",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,3 +0,0 @@
{
"extends": "../.nuxt/tsconfig.server.json"
}

171
src/app/about/page.tsx Normal file
View file

@ -0,0 +1,171 @@
import { AnimatedNumber } from '@/components/animated-number'
import { Container } from '@/components/container'
import { Footer } from '@/components/footer'
import { GradientBackground } from '@/components/gradient'
import { Navbar } from '@/components/navbar'
import { Team } from '@/components/team'
import { Heading, Lead, Subheading } from '@/components/text'
import type { Metadata } from 'next'
import Link from 'next/link'
export const metadata: Metadata = {
title: 'About',
description:
'About Drop OSS - what we do, what we believe, and what we aim to achieve.',
}
function Header() {
return (
<Container className="mt-16">
<Heading as="h1">An open Steam.</Heading>
<Lead className="mt-6 max-w-3xl">
We&apos;re building an open-source alternative to platforms like Steam
and Epic Games, enabling anyone to have full control over their gaming.
</Lead>
<section className="mt-16 grid grid-cols-1 lg:grid-cols-2 lg:gap-12">
<div className="max-w-lg">
<h2 className="text-2xl font-medium tracking-tight">Our mission</h2>
<p className="mt-6 text-sm/6 text-gray-600">
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
platforms like Steam have done so well, is that they provide awesome
features like worldwide play-together, social features, and useful
overlays and tools. We aim to replicate this for <i>any</i> game.
</p>
<p className="mt-8 text-sm/6 text-gray-600">
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 will always have a place, providing a marketplace for DRM
games. Drop aims to be the alternative.
</p>
</div>
<div className="max-lg:mt-16 lg:col-span-1">
<Subheading>The Numbers</Subheading>
<hr className="mt-6 border-t border-gray-200" />
<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">
<dt className="text-sm/6 text-gray-600">Lines of code</dt>
<dd className="order-first text-6xl font-medium tracking-tight">
<AnimatedNumber start={10} end={40} />k
</dd>
</div>
<div className="flex flex-col gap-y-2 border-b border-dotted border-gray-200 pb-4">
<dt className="text-sm/6 text-gray-600">
Individual open-source projects
</dt>
<dd className="order-first text-6xl font-medium tracking-tight">
&gt;
<AnimatedNumber start={0} end={5} />
</dd>
</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">
<dt className="text-sm/6 text-gray-600">Docker pulls</dt>
<dd className="order-first text-6xl font-medium tracking-tight">
<AnimatedNumber start={0} end={48.8} decimals={1} />k
</dd>
</div>
<div className="flex flex-col gap-y-2">
<dt className="text-sm/6 text-gray-600">Contributors</dt>
<dd className="order-first text-6xl font-medium tracking-tight">
&gt;
<AnimatedNumber start={0} end={15} />
</dd>
</div>
</dl>
</div>
</section>
</Container>
)
}
function FrequentlyAskedQuestions() {
return (
<Container className="mt-32">
<section id="faqs" className="scroll-mt-8">
<Subheading className="">Frequently asked questions</Subheading>
<Heading as="div" className="mt-2">
Your questions answered.
</Heading>
<div className="mt-16 mb-32 max-w-xl space-y-12">
<dl>
<dt className="text-sm font-semibold">
Do you intend to replace Steam?
</dt>
<dd className="mt-4 text-sm/6 text-gray-600">
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
replace Steam <i>for an individual</i>, if they only played
DRM-free games that they bought from outside of Steam (like GOG).
</dd>
</dl>
<dl>
<dt className="text-sm font-semibold">
Will Drop ever cost money or require a subscription?
</dt>
<dd className="mt-4 text-sm/6 text-gray-600">
We believe in <strong>paying for services, not code</strong>. All
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.
Where that is not possible, we may launch a subscription service -
likely as a feature for multiplayer, to play between self-hosted
Drop instances. Naturally, this service will also be available to
self-host.
</dd>
</dl>
<dl>
<dt className="text-sm font-semibold">Is Drop legal?</dt>
<dd className="mt-4 text-sm/6 text-gray-600">
Yes. Officially, Drop is <strong>only</strong> for DRM-free games,
like the ones you purchase from GOG or download from itch.io,{' '}
<strong>and</strong> that you have a license to redistribute. We
cannot control whether you use Drop with cracked, pirated, or
DRM-bypassed games or not, and do not condone the use of
torrenting and automation software to automatically download
games.
</dd>
</dl>
<dl>
<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">
Thank you for helping us out! If you&apos;re looking to contribute
code, check out our{' '}
<Link
href="https://developer.droposs.org/contributing"
className="text-blue-500 hover:underline"
target="_blank"
>
developer contributing guide
</Link>
. If you&apos;re looking to contribute financially, you can join
our{' '}
<Link
href="https://opencollective.com/drop-oss"
className="text-blue-500 hover:underline"
target="_blank"
>
OpenCollective
</Link>
, or click on individual contributors above and add to their
personal pockets.
</dd>
</dl>
</div>
</section>
</Container>
)
}
export default function About() {
return (
<main className="overflow-hidden">
<GradientBackground />
<Container>
<Navbar />
</Container>
<Header />
<Team />
<FrequentlyAskedQuestions />
<Footer />
</main>
)
}

View file

@ -0,0 +1,14 @@
import Comparison from "@/components/comparison";
import type { Metadata } from "next";
import { Suspense } from "react";
export const metadata: Metadata = {
title: 'Comparison',
description:
'A breakdown of the different projects you may be interested in, and the pros & cons of each.',
}
export default function ComparisonPage() {
return <Suspense><Comparison /></Suspense>
}

42
src/app/download/page.tsx Normal file
View file

@ -0,0 +1,42 @@
import { Container } from '@/components/container'
import DownloadCards from '@/components/downloads'
import { Footer } from '@/components/footer'
import { GradientBackground } from '@/components/gradient'
import { Navbar } from '@/components/navbar'
import { Heading, Lead, Subheading } from '@/components/text'
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'Download',
description: 'Download the latest version of the Drop client.',
}
function Header() {
return (
<Container className="mt-16">
<Heading as="h1" className="leading-12">
Download
</Heading>
<Lead className="mt-6 max-w-3xl">
Download the latest version of the Drop Desktop Client for your platform.
</Lead>
<Subheading className="mt-2">Last updated 15-11-2025</Subheading>
</Container>
)
}
export default function DownloadPage() {
return (
<main className="overflow-hidden">
<GradientBackground />
<Container>
<Navbar />
</Container>
<Header />
<DownloadCards />
<Footer />
</main>
)
}

BIN
src/app/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

25
src/app/gallery/page.tsx Normal file
View file

@ -0,0 +1,25 @@
import { Container } from '@/components/container'
import { Footer } from '@/components/footer'
import { Gallery } from '@/components/gallery-modal'
import { GradientBackground } from '@/components/gradient'
import { Navbar } from '@/components/navbar'
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'Gallery',
description: 'A collection of screenshots, across all components of Drop.',
}
export default function About() {
return (
<main className="overflow-hidden">
<GradientBackground />
<Container>
<Navbar />
</Container>
<Gallery />
<Footer />
</main>
)
}

Some files were not shown because too many files have changed in this diff Show more