mirror of
https://github.com/AderKonstantin/aderktech-chronark.com-.git
synced 2025-06-08 13:48:42 +03:00
feat: /projects
This commit is contained in:
parent
68fe519e97
commit
c446b9dc08
@ -1,38 +1,38 @@
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import "../global.css";
|
||||
import { Inter } from "@next/font/google";
|
||||
import font from "@next/font/local";
|
||||
const pangea = font({
|
||||
src: [
|
||||
{
|
||||
path: "../public/fonts/PangeaAfrikanTrial-Light.woff2",
|
||||
weight: "100",
|
||||
style: "normal",
|
||||
},
|
||||
{
|
||||
path: "../public/fonts/PangeaAfrikanTrial-Regular.woff2",
|
||||
weight: "300",
|
||||
style: "normal",
|
||||
},
|
||||
{
|
||||
path: "../public/fonts/PangeaAfrikanTrial-Medium.woff2",
|
||||
weight: "500",
|
||||
style: "normal",
|
||||
},
|
||||
{
|
||||
path: "../public/fonts/PangeaAfrikanTrial-SemiBold.woff2",
|
||||
weight: "700",
|
||||
style: "normal",
|
||||
},
|
||||
{
|
||||
path: "../public/fonts/PangeaAfrikanTrial-Bold.woff2",
|
||||
weight: "900",
|
||||
style: "normal",
|
||||
},
|
||||
],
|
||||
variable: "--font-pangea",
|
||||
});
|
||||
import { Inter, Hanken_Grotesk } from "@next/font/google";
|
||||
// import font from "@next/font/local";
|
||||
// const pangea = font({
|
||||
// src: [
|
||||
// {
|
||||
// path: "../public/fonts/PangeaAfrikanTrial-Light.woff2",
|
||||
// weight: "100",
|
||||
// style: "normal",
|
||||
// },
|
||||
// {
|
||||
// path: "../public/fonts/PangeaAfrikanTrial-Regular.woff2",
|
||||
// weight: "300",
|
||||
// style: "normal",
|
||||
// },
|
||||
// {
|
||||
// path: "../public/fonts/PangeaAfrikanTrial-Medium.woff2",
|
||||
// weight: "500",
|
||||
// style: "normal",
|
||||
// },
|
||||
// {
|
||||
// path: "../public/fonts/PangeaAfrikanTrial-SemiBold.woff2",
|
||||
// weight: "700",
|
||||
// style: "normal",
|
||||
// },
|
||||
// {
|
||||
// path: "../public/fonts/PangeaAfrikanTrial-Bold.woff2",
|
||||
// weight: "900",
|
||||
// style: "normal",
|
||||
// },
|
||||
// ],
|
||||
// variable: "--font-pangea",
|
||||
// });
|
||||
|
||||
export const metadata = {
|
||||
title: "chronark.com",
|
||||
@ -44,13 +44,18 @@ const inter = Inter({
|
||||
variable: "--font-inter",
|
||||
});
|
||||
|
||||
const grotesk = Hanken_Grotesk({
|
||||
subsets: ["latin"],
|
||||
variable: "--font-grotesk",
|
||||
});
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en" className={[inter.variable, pangea.variable].join(" ")}>
|
||||
<html lang="en" className={[inter.variable, grotesk.variable].join(" ")}>
|
||||
<body
|
||||
className={`bg-black ${
|
||||
process.env.NODE_ENV === "development" ? "debug-screens" : undefined
|
||||
|
35
app/page.tsx
35
app/page.tsx
@ -13,13 +13,7 @@ const navigation = [
|
||||
export default function Home() {
|
||||
return (
|
||||
<div className="w-screen h-screen flex overflow-hidden flex-col items-center justify-center bg-gradient-to-tl from-black via-zinc-400/10 to-black">
|
||||
<div className="hidden animate-glow md:block w-screen animate-fade-left h-px bg-gradient-to-r from-zinc-300/0 via-zinc-300/50 to-zinc-300/0" />
|
||||
<h1 className="text-edge-outline cursor-default animate-title z-10 hover:text-zinc-50 duration-1000 font-display text-4xl sm:text-6xl md:text-9xl whitespace-nowrap bg-clip-text bg-zinc-200 font-bold text-transparent ">
|
||||
CHRONARK
|
||||
</h1>
|
||||
|
||||
<div className="hidden animate-glow md:block w-screen animate-fade-right h-px bg-gradient-to-r from-zinc-300/0 via-zinc-300/50 to-zinc-300/0" />
|
||||
<nav className="mt-16 animate-fade-in">
|
||||
<nav className="my-16 animate-fade-in">
|
||||
<ul className="flex items-center justify-center gap-4">
|
||||
{navigation.map((item) => (
|
||||
<Link
|
||||
@ -32,6 +26,33 @@ export default function Home() {
|
||||
))}
|
||||
</ul>
|
||||
</nav>
|
||||
<div className="hidden animate-glow md:block w-screen animate-fade-left h-px bg-gradient-to-r from-zinc-300/0 via-zinc-300/50 to-zinc-300/0" />
|
||||
<h1 className="text-edge-outline cursor-default animate-title z-10 hover:text-zinc-50 duration-1000 font-display text-4xl sm:text-6xl md:text-9xl whitespace-nowrap bg-clip-text bg-zinc-200 font-black text-transparent ">
|
||||
CHRONARK
|
||||
</h1>
|
||||
|
||||
<div className="hidden animate-glow md:block w-screen animate-fade-right h-px bg-gradient-to-r from-zinc-300/0 via-zinc-300/50 to-zinc-300/0" />
|
||||
<div className="my-16 animate-fade-in">
|
||||
<h2 className="text-zinc-500 text-sm ">
|
||||
Building serverless and open source solutions at{" "}
|
||||
<Link
|
||||
href="https://upstash.com"
|
||||
className="underline hover:text-zinc-300 duration-500"
|
||||
>
|
||||
Upstash
|
||||
</Link>
|
||||
|
||||
<br />
|
||||
and building{" "}
|
||||
<Link
|
||||
href="https://planetfall.io"
|
||||
className="underline hover:text-zinc-300 duration-500"
|
||||
>
|
||||
planetfall.io
|
||||
</Link>{" "}
|
||||
at night.
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
138
app/projects/default/page.tsx
Normal file
138
app/projects/default/page.tsx
Normal file
@ -0,0 +1,138 @@
|
||||
const stats = [
|
||||
{ label: "Founded", value: "2021" },
|
||||
{ label: "Employees", value: "37" },
|
||||
{ label: "Countries", value: "12" },
|
||||
{ label: "Raised", value: "$25M" },
|
||||
];
|
||||
|
||||
export default function Example() {
|
||||
return (
|
||||
<div className="py-24 sm:py-32">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div className="mx-auto grid max-w-2xl grid-cols-1 items-start gap-y-16 gap-x-8 sm:gap-y-24 lg:mx-0 lg:max-w-none lg:grid-cols-2">
|
||||
<div className="lg:pr-4">
|
||||
<div className="relative overflow-hidden rounded-3xl bg-gray-900 px-6 pb-9 pt-64 shadow-2xl sm:px-12 lg:max-w-lg lg:px-8 lg:pb-8 xl:px-10 xl:pb-10">
|
||||
<img
|
||||
className="absolute inset-0 h-full w-full object-cover brightness-125 saturate-0"
|
||||
src="https://images.unsplash.com/photo-1630569267625-157f8f9d1a7e?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2669&q=80"
|
||||
alt=""
|
||||
/>
|
||||
<div className="absolute inset-0 bg-gray-900 mix-blend-multiply" />
|
||||
<svg
|
||||
viewBox="0 0 1097 845"
|
||||
aria-hidden="true"
|
||||
className="absolute top-1/2 left-1/2 -ml-16 w-[68.5625rem] -translate-x-1/2 -translate-y-1/2 transform-gpu blur-3xl"
|
||||
>
|
||||
<path
|
||||
fill="url(#e7ccf164-908d-46dd-9194-2f8a16ad5a93)"
|
||||
fillOpacity=".4"
|
||||
d="M301.174 646.641 193.541 844.786 0 546.172l301.174 100.469 193.845-356.855c1.241 164.891 42.802 431.935 199.124 180.978 195.402-313.696 143.295-588.18 284.729-419.266 113.148 135.13 124.068 367.989 115.378 467.527L811.753 372.553l20.102 451.119-530.681-177.031Z"
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="e7ccf164-908d-46dd-9194-2f8a16ad5a93"
|
||||
x1="1097.04"
|
||||
x2="-141.165"
|
||||
y1=".22"
|
||||
y2="363.075"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop stopColor="#776FFF" />
|
||||
<stop offset={1} stopColor="#FF4694" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
<figure className="relative isolate">
|
||||
<svg
|
||||
viewBox="0 0 162 128"
|
||||
fill="none"
|
||||
aria-hidden="true"
|
||||
className="absolute -top-4 -left-2 -z-10 h-32 stroke-white/20"
|
||||
>
|
||||
<path
|
||||
id="0ef284b8-28c2-426e-9442-8655d393522e"
|
||||
d="M65.5697 118.507L65.8918 118.89C68.9503 116.314 71.367 113.253 73.1386 109.71C74.9162 106.155 75.8027 102.28 75.8027 98.0919C75.8027 94.237 75.16 90.6155 73.8708 87.2314C72.5851 83.8565 70.8137 80.9533 68.553 78.5292C66.4529 76.1079 63.9476 74.2482 61.0407 72.9536C58.2795 71.4949 55.276 70.767 52.0386 70.767C48.9935 70.767 46.4686 71.1668 44.4872 71.9924L44.4799 71.9955L44.4726 71.9988C42.7101 72.7999 41.1035 73.6831 39.6544 74.6492C38.2407 75.5916 36.8279 76.455 35.4159 77.2394L35.4047 77.2457L35.3938 77.2525C34.2318 77.9787 32.6713 78.3634 30.6736 78.3634C29.0405 78.3634 27.5131 77.2868 26.1274 74.8257C24.7483 72.2185 24.0519 69.2166 24.0519 65.8071C24.0519 60.0311 25.3782 54.4081 28.0373 48.9335C30.703 43.4454 34.3114 38.345 38.8667 33.6325C43.5812 28.761 49.0045 24.5159 55.1389 20.8979C60.1667 18.0071 65.4966 15.6179 71.1291 13.7305C73.8626 12.8145 75.8027 10.2968 75.8027 7.38572C75.8027 3.6497 72.6341 0.62247 68.8814 1.1527C61.1635 2.2432 53.7398 4.41426 46.6119 7.66522C37.5369 11.6459 29.5729 17.0612 22.7236 23.9105C16.0322 30.6019 10.618 38.4859 6.47981 47.558L6.47976 47.558L6.47682 47.5647C2.4901 56.6544 0.5 66.6148 0.5 77.4391C0.5 84.2996 1.61702 90.7679 3.85425 96.8404L3.8558 96.8445C6.08991 102.749 9.12394 108.02 12.959 112.654L12.959 112.654L12.9646 112.661C16.8027 117.138 21.2829 120.739 26.4034 123.459L26.4033 123.459L26.4144 123.465C31.5505 126.033 37.0873 127.316 43.0178 127.316C47.5035 127.316 51.6783 126.595 55.5376 125.148L55.5376 125.148L55.5477 125.144C59.5516 123.542 63.0052 121.456 65.9019 118.881L65.5697 118.507Z"
|
||||
/>
|
||||
<use href="#0ef284b8-28c2-426e-9442-8655d393522e" x={86} />
|
||||
</svg>
|
||||
<img
|
||||
src="https://tailwindui.com/img/logos/workcation-logo-white.svg"
|
||||
alt=""
|
||||
className="h-12 w-auto"
|
||||
/>
|
||||
<blockquote className="mt-6 text-xl font-semibold leading-8 text-white">
|
||||
<p>
|
||||
“Amet amet eget scelerisque tellus sit neque faucibus non
|
||||
eleifend. Integer eu praesent at a. Ornare arcu gravida
|
||||
natoque erat et cursus tortor.”
|
||||
</p>
|
||||
</blockquote>
|
||||
<figcaption className="mt-6 text-sm leading-6 text-gray-300">
|
||||
<strong className="font-semibold text-white">
|
||||
Judith Rogers,
|
||||
</strong>{" "}
|
||||
CEO at Workcation
|
||||
</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-base leading-7 text-gray-700 lg:max-w-lg">
|
||||
<p className="text-base font-semibold leading-7 text-indigo-600">
|
||||
Company values
|
||||
</p>
|
||||
<h1 className="mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
|
||||
On a mission to empower remote teams
|
||||
</h1>
|
||||
<div className="max-w-xl">
|
||||
<p className="mt-6">
|
||||
Faucibus commodo massa rhoncus, volutpat. Dignissim sed eget
|
||||
risus enim. Mattis mauris semper sed amet vitae sed turpis id.
|
||||
Id dolor praesent donec est. Odio penatibus risus viverra
|
||||
tellus varius sit neque erat velit. Faucibus commodo massa
|
||||
rhoncus, volutpat. Dignissim sed eget risus enim. Mattis
|
||||
mauris semper sed amet vitae sed turpis id.
|
||||
</p>
|
||||
<p className="mt-8">
|
||||
Et vitae blandit facilisi magna lacus commodo. Vitae sapien
|
||||
duis odio id et. Id blandit molestie auctor fermentum
|
||||
dignissim. Lacus diam tincidunt ac cursus in vel. Mauris
|
||||
varius vulputate et ultrices hac adipiscing egestas. Iaculis
|
||||
convallis ac tempor et ut. Ac lorem vel integer orci.
|
||||
</p>
|
||||
<p className="mt-8">
|
||||
Et vitae blandit facilisi magna lacus commodo. Vitae sapien
|
||||
duis odio id et. Id blandit molestie auctor fermentum
|
||||
dignissim. Lacus diam tincidunt ac cursus in vel. Mauris
|
||||
varius vulputate et ultrices hac adipiscing egestas. Iaculis
|
||||
convallis ac tempor et ut. Ac lorem vel integer orci.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<dl className="mt-10 grid grid-cols-2 gap-8 border-t border-gray-900/10 pt-10 sm:grid-cols-4">
|
||||
{stats.map((stat, statIdx) => (
|
||||
<div key={statIdx}>
|
||||
<dt className="text-sm font-semibold leading-6 text-gray-600">
|
||||
{stat.label}
|
||||
</dt>
|
||||
<dd className="mt-2 text-3xl font-bold leading-10 tracking-tight text-gray-900">
|
||||
{stat.value}
|
||||
</dd>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
<div className="mt-10 flex">
|
||||
<a
|
||||
href="#"
|
||||
className="text-base font-semibold leading-7 text-indigo-600"
|
||||
>
|
||||
Learn more about our company{" "}
|
||||
<span aria-hidden="true">→</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
9
app/projects/layout.tsx
Normal file
9
app/projects/layout.tsx
Normal file
@ -0,0 +1,9 @@
|
||||
export default function ProjectsLayout({
|
||||
children,
|
||||
}: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="bg-gradient-to-tl min-h-screen from-zinc-900 via-zinc-400/10 to-zinc-900">
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
}
|
258
app/projects/page.tsx
Normal file
258
app/projects/page.tsx
Normal file
@ -0,0 +1,258 @@
|
||||
import Link from "next/link";
|
||||
import React from "react";
|
||||
|
||||
type Project = {
|
||||
slug: string;
|
||||
title: string;
|
||||
description: string;
|
||||
href: string;
|
||||
date?: string;
|
||||
};
|
||||
|
||||
const projects: Project[] = [
|
||||
{
|
||||
slug: "upstash-kafka",
|
||||
title: "@upstash/kafka",
|
||||
href: "https://github.com/upstash/upstash-kafka",
|
||||
description:
|
||||
"A fully typed Kafka client built for Upstash Kafka and HTTP, perfect for serverless and edge runtimes.",
|
||||
date: "2022-01-08",
|
||||
},
|
||||
{
|
||||
slug: "upstash-redis",
|
||||
title: "@upstash/redis",
|
||||
href: "https://github.com/upstash/upstash-redis",
|
||||
description:
|
||||
"A fully typed Redis client built for Upstash Redis and HTTP, perfect for serverless and edge runtimes.",
|
||||
date: "2022-03-14",
|
||||
},
|
||||
{
|
||||
slug: "upstash-redis",
|
||||
title: "@upstash/ratelimit",
|
||||
href: "https://github.com/upstash/ratelimit",
|
||||
description:
|
||||
"Ratelimiting library for serverless and edge runtimes. Built on top of Upstash Redis.",
|
||||
date: "2020-06-06",
|
||||
},
|
||||
{
|
||||
slug: "upstash-edge-flags",
|
||||
title: "@upstash/edge-flags",
|
||||
href: "https://github.com/upstash/edge-flags",
|
||||
description: "Feature flags for edge functions.",
|
||||
date: "2022-12-12",
|
||||
},
|
||||
{
|
||||
slug: "upstash-cli",
|
||||
title: "@upstash/cli",
|
||||
href: "https://github.com/upstash/cli",
|
||||
description:
|
||||
"A CLI to provision and manage Upstash resources, including Redis and Kafka databases.",
|
||||
date: "2022-05-16",
|
||||
},
|
||||
{
|
||||
slug: "upstash-react-ui",
|
||||
title: "@upstash/react-cli",
|
||||
href: "https://github.com/upstash/react-ui",
|
||||
description:
|
||||
"A CLI React component to interact with Upstash Redis databases.",
|
||||
date: "2023-02-05",
|
||||
},
|
||||
{
|
||||
slug: "qstash",
|
||||
title: "QStash",
|
||||
href: "https://upstash.com/qstash",
|
||||
description:
|
||||
"QStash is a fully managed serverless queue and messaging service designed for the serverless era.",
|
||||
date: "2022-07-18",
|
||||
},
|
||||
{
|
||||
slug: "upstash-qstash-sdk",
|
||||
title: "@upstash/qstash",
|
||||
href: "https://github.com/upstash/sdk-qstash-ts",
|
||||
description: "A typescript client and consumer for QStash.",
|
||||
date: "2020-07-18",
|
||||
},
|
||||
{
|
||||
slug: "upstash-core-analytics",
|
||||
title: "@upstash/core-analytics",
|
||||
href: "https://github.com/upstash/core-analytics",
|
||||
description:
|
||||
"Low level utilities to build analytics tools on top of Redis.",
|
||||
date: "2023-02-13",
|
||||
},
|
||||
{
|
||||
slug: "upstash-auth-analytics",
|
||||
title: "@upstash/auth-analytics",
|
||||
href: "https://github.com/upstash/auth-analytics",
|
||||
description: "A library to record and analyse Auth.js user behaviour",
|
||||
},
|
||||
{
|
||||
slug: "upstash-web-analytics",
|
||||
title: "@upstash/web-analytics",
|
||||
href: "https://github.com/upstash/auth-analytics",
|
||||
description:
|
||||
"A library to record and analyse web page traffic and user behaviour",
|
||||
date: "2020-03-16",
|
||||
},
|
||||
{
|
||||
slug: "upstash-ratelimit-analytics",
|
||||
title: "Ratelimit Analytics",
|
||||
href: "https://github.com/upstash/ratelimit",
|
||||
description:
|
||||
"Near realtime analytics for your ratelimits. Integrated into the @upstash/ratelimit library.",
|
||||
date: "2023-03-01",
|
||||
},
|
||||
{
|
||||
slug: "planetfall",
|
||||
title: "Planetfall",
|
||||
href: "https://planetfall.io",
|
||||
description:
|
||||
"I'm building a SAAS, that provides global latency monitoring for your APIs and websites from edge locations around the world. Have you ever wondered how fast your API is in any part of the world? Planetfall allows you to find out and monitor it continuously.",
|
||||
date: "2023-04-01",
|
||||
},
|
||||
{
|
||||
slug: "terraform-provider-vercel",
|
||||
title: "Vercel Terraform Provider",
|
||||
href: "https://github.com/chronark/terraform-provider-vercel",
|
||||
description:
|
||||
"A Terraform provider for Vercel. It has been deprecated it when Vercel rolled out their official provider.",
|
||||
date: "2021-03-16",
|
||||
},
|
||||
{
|
||||
slug: "envshare",
|
||||
title: "EnvShare",
|
||||
href: "https://envshare.dev",
|
||||
description:
|
||||
"EnvShare is a simple tool to share environment variables securely. It uses AES-GCM to encrypt your data before sending it to the server. The encryption key never leaves your browser.",
|
||||
date: "2023-01-16",
|
||||
},
|
||||
{
|
||||
slug: "redis-query",
|
||||
title: "Redis Query",
|
||||
href: "https://github.com/chronark/redis-query",
|
||||
description:
|
||||
"Client side secondary indexing for Redis. It allows you to query your Redis data efficiently. Inspired by FaunaDB indices.",
|
||||
date: "2023-02-16",
|
||||
},
|
||||
{
|
||||
slug: "access",
|
||||
title: "@chronark/access",
|
||||
href: "https://github.com/chronark/access",
|
||||
description:
|
||||
"A minimal library for access control. It is designed to be used together with opaque access tokens by providing a simple interface to define roles with different access permissions and verifying requests to resources.",
|
||||
date: "2022-11-13",
|
||||
},
|
||||
];
|
||||
|
||||
export default function ProjectsPage() {
|
||||
const featured = projects.find((project) => project.slug === "planetfall")!;
|
||||
const top2 = projects.find((project) => project.slug === "envshare")!;
|
||||
const top3 = projects.find((project) => project.slug === "qstash")!;
|
||||
|
||||
const sorted = projects
|
||||
.filter(
|
||||
(project) =>
|
||||
project.slug !== featured.slug &&
|
||||
project.slug !== top2.slug &&
|
||||
project.slug !== top3.slug,
|
||||
)
|
||||
.sort(
|
||||
(a, b) =>
|
||||
new Date(b.date ?? Number.POSITIVE_INFINITY).getTime() -
|
||||
new Date(a.date ?? Number.POSITIVE_INFINITY).getTime(),
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="py-24 sm:py-32">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8 space-y-8 md:space-y-16">
|
||||
<div className="mx-auto max-w-2xl lg:mx-0">
|
||||
<h2 className="text-3xl font-bold tracking-tight text-zinc-100 sm:text-4xl">
|
||||
Projects
|
||||
</h2>
|
||||
<p className="text-zinc-400 mt-4">
|
||||
Some of the projects are from work and some are on my own time.
|
||||
</p>
|
||||
</div>
|
||||
<div className="w-full h-px bg-zinc-800" />
|
||||
|
||||
<div className="mx-auto grid grid-cols-1 gap-8 lg:grid-cols-2 ">
|
||||
<article className="mx-auto w-full max-w-2xl lg:mx-0 lg:max-w-lg">
|
||||
<div className="text-zinc-100 text-xs">
|
||||
{featured.date ? (
|
||||
<time dateTime={new Date(featured.date).toISOString()}>
|
||||
{featured.date}
|
||||
</time>
|
||||
) : (
|
||||
<span>SOON</span>
|
||||
)}
|
||||
</div>
|
||||
<h2
|
||||
id="featured-post"
|
||||
className="mt-4 text-3xl font-bold tracking-tight text-zinc-100 group-hover:text-white sm:text-4xl"
|
||||
>
|
||||
{featured.title}
|
||||
</h2>
|
||||
<p className="mt-4 text-lg leading-8 text-zinc-400 duration-150 group-hover:text-zinc-300">
|
||||
{featured.description}
|
||||
</p>
|
||||
<div className="mt-4">
|
||||
<Link
|
||||
className="text-zinc-200 hover:text-zinc-50"
|
||||
href={`/projects/${featured.slug}`}
|
||||
>
|
||||
Read more <span aria-hidden="true">→</span>
|
||||
</Link>
|
||||
</div>
|
||||
</article>
|
||||
<div className="mx-auto w-full max-w-2xl flex flex-col gap-8 border-t border-gray-900/10 pt-12 sm:pt-16 lg:mx-0 lg:max-w-none lg:border-t-0 lg:pt-0">
|
||||
{[top2, top3].map((project) => (
|
||||
<Card key={project.slug} project={project} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="w-full hidden md:block h-px bg-zinc-800" />
|
||||
|
||||
<div className="mx-auto grid max-w-2xl grid-cols-1 gap-4 lg:mx-0 lg:max-w-none md:grid-cols-2 lg:grid-cols-3">
|
||||
{sorted.map((project) => (
|
||||
<Card key={project.slug} project={project} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const Card: React.FC<{ project: Project; border?: boolean }> = ({
|
||||
project,
|
||||
border,
|
||||
}) => {
|
||||
return (
|
||||
<Link
|
||||
href={`/projects/${project.slug}`}
|
||||
className={`flex max-w-xl flex-col items-start group duration-200 transition-all py-4 lg:p-4 ${
|
||||
border
|
||||
? "hover:bg-zinc-900 hover:border-zinc-700 border border-zinc-800 rounded"
|
||||
: ""
|
||||
} `}
|
||||
>
|
||||
<div className="text-zinc-100 text-xs">
|
||||
{project.date ? (
|
||||
<time dateTime={new Date(project.date).toISOString()}>
|
||||
{project.date}
|
||||
</time>
|
||||
) : (
|
||||
<span>SOON</span>
|
||||
)}
|
||||
</div>
|
||||
<div className=" relative duration-150">
|
||||
<h3 className="mt-3 text-lg font-semibold leading-6 text-zinc-100 group-hover:text-white ">
|
||||
<span className="absolute inset-0" />
|
||||
{project.title}
|
||||
</h3>
|
||||
<p className="mt-5 text-sm leading-6 text-zinc-400 line-clamp-3 duration-150 group-hover:text-zinc-300">
|
||||
{project.description}
|
||||
</p>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
};
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -8,7 +8,7 @@ module.exports = {
|
||||
extend: {
|
||||
fontFamily: {
|
||||
sans: ["var(--font-inter)", ...defaultTheme.fontFamily.sans],
|
||||
display: ["var(--font-pangea)"],
|
||||
display: ["var(--font-grotesk)"],
|
||||
},
|
||||
|
||||
animation: {
|
||||
@ -31,10 +31,13 @@ module.exports = {
|
||||
},
|
||||
"fade-left": {
|
||||
"0%": {
|
||||
transform: "translateX(100%)",
|
||||
opacity: "0%",
|
||||
|
||||
},
|
||||
|
||||
"50%": {
|
||||
transform: "translateX(0%)",
|
||||
},
|
||||
|
||||
"75%": {
|
||||
opacity: "100%",
|
||||
},
|
||||
@ -44,9 +47,14 @@ module.exports = {
|
||||
},
|
||||
"fade-right": {
|
||||
"0%": {
|
||||
transform: "translateX(-100%)",
|
||||
|
||||
opacity: "0%",
|
||||
},
|
||||
|
||||
"50%": {
|
||||
transform: "translateX(0%)",
|
||||
},
|
||||
|
||||
"75%": {
|
||||
opacity: "100%",
|
||||
},
|
||||
@ -70,7 +78,7 @@ module.exports = {
|
||||
|
||||
"100%": {
|
||||
"line-height": "100%",
|
||||
"letter-spacing": "0em",
|
||||
"letter-spacing": "0.125em",
|
||||
|
||||
opacity: "100%",
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user