diff --git a/src/components/contact-form.tsx b/src/components/contact-form.tsx
deleted file mode 100644
index d8615df..0000000
--- a/src/components/contact-form.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import {Turnstile} from '@marsidev/react-turnstile';
-import {useState} from 'react';
-import toast from 'react-hot-toast';
-
-export function ContactForm() {
- const [submitted, setSubmitted] = useState(false);
- const [loading, setLoading] = useState(false);
-
- if (submitted) {
- return (
-
-
Message received
-
I'll get back to you as soon as possible
-
- );
- }
-
- return (
- <>
-
-
Let's talk 📬
-
- Drop me a message with the form below, I'll get back to the non-spam
-
-
-
-
- >
- );
-}
diff --git a/src/components/hover-card.tsx b/src/components/hover-card.tsx
deleted file mode 100644
index 1f02868..0000000
--- a/src/components/hover-card.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import clsx from 'clsx';
-import type {PropsWithChildren} from 'react';
-
-export const hoverClassName =
- 'transform-gpu transition-all duration-500 will-change-[outline,_transform] group-hover:scale-95 active:scale-100';
-
-export function CardHoverEffect({children, ...props}: PropsWithChildren<{className?: string}>) {
- return {children}
;
-}
diff --git a/src/components/spinquee.tsx b/src/components/spinquee.tsx
deleted file mode 100644
index d6f24ed..0000000
--- a/src/components/spinquee.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import {MotionValue, motion, useSpring, useTransform} from 'framer-motion';
-import {useCallback, useEffect, useState, type PropsWithChildren} from 'react';
-
-export interface SpinqueeProps {
- children: React.ReactNode[];
- size: number;
-}
-
-function duplicateChildren(children: React.ReactNode[], multiplier: number) {
- return [...Array(multiplier)].flatMap(() => children);
-}
-
-function Item({
- children,
- index,
- angle,
- total,
- size,
- activeIndex,
-}: PropsWithChildren<{
- index: number;
- angle: MotionValue;
- total: number;
- size: number;
- activeIndex: number;
-}>) {
- const isActive = index % total === activeIndex;
-
- return (
- value + index * (360 / total)),
- }}
- >
-
- {children}
-
-
- );
-}
-
-export function Spinquee({children, size}: SpinqueeProps) {
- const angle = useSpring(0, {
- stiffness: 1200,
- damping: 30,
- mass: 0.05,
- });
- const [activeIndex, setActiveIndex] = useState(0);
- const [container, setContainer] = useState(null);
-
- const duplicatedChildren = duplicateChildren(children, 10);
-
- const snapToNearest = useCallback(() => {
- const currentAngle = angle.get();
- const anglePerItem = 360 / duplicatedChildren.length;
- const nearestIndex = Math.round(currentAngle / anglePerItem) % duplicatedChildren.length;
- const nearestAngle = nearestIndex * anglePerItem;
- angle.set(nearestAngle);
- setActiveIndex(nearestIndex);
- }, [angle, duplicatedChildren.length]);
-
- useEffect(() => {
- if (!container) return;
-
- let timeout: NodeJS.Timeout;
- const wheel = (e: WheelEvent) => {
- angle.set(angle.get() + e.deltaY / 10);
- clearTimeout(timeout);
- timeout = setTimeout(snapToNearest, 150); // Adjust delay as needed
- };
-
- container.addEventListener('wheel', wheel);
-
- return () => {
- container.removeEventListener('wheel', wheel);
- };
- }, [container, angle, snapToNearest]);
-
- return (
-
-
- {duplicatedChildren.map((child, index) => (
- -
- {child}
-
- ))}
-
-
- );
-}
diff --git a/src/components/time.tsx b/src/components/time.tsx
deleted file mode 100644
index 762246f..0000000
--- a/src/components/time.tsx
+++ /dev/null
@@ -1,150 +0,0 @@
-import clsx from 'clsx';
-import {motion} from 'framer-motion';
-import {useEffect, useRef, useState} from 'react';
-import {UKTimeFormatter, daysUntilBirthday} from '../utils/constants';
-
-function Night({time}: {time: Date}) {
- const canvasRef = useRef(null);
-
- useEffect(() => {
- const canvas = canvasRef.current;
-
- if (!canvas) {
- return;
- }
-
- const ctx = canvas.getContext('2d');
-
- if (!ctx) {
- return;
- }
-
- // Thx Ana
- // https://github.com/AnaArsonist/anahoward.me/blob/b41ec1a5112526c03f4e09bc4226506ce529523f/src/components/time-components/NightComponent.tsx#L35
- for (let i = 0; i < 50; i++) {
- ctx.fillStyle = 'white';
- ctx.beginPath();
- ctx.arc(
- Math.random() * canvas.width,
- Math.random() * canvas.height,
- Math.random() * 2,
- 0,
- Math.PI * 2,
- );
- ctx.fill();
- }
- }, [canvasRef]);
-
- return (
-
-
-
-
-
- {UKTimeFormatter.format(time)}
-
-
-
- in the uk
-
-
-
- );
-}
-
-function Day({time}: {time: Date}) {
- return (
-
-
-
-
-
{UKTimeFormatter.format(time)}
-
-
- in the uk
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export function Time() {
- const [time, setTime] = useState(() => new Date());
-
- const isNight = time.getHours() >= 17 || time.getHours() < 6;
-
- useEffect(() => {
- const interval = setInterval(() => {
- setTime(new Date());
- }, 1000);
-
- return () => clearInterval(interval);
- }, []);
-
- return (
-
- {isNight ?
:
}
-
-
-
-
- {daysUntilBirthday} days
-
- until birthday
-
-
-
-
- );
-}
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 978e548..1a96754 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -178,7 +178,7 @@ export default function Home(props: Props) {
realtime. In the meantime, you can check out
this Four Tet DJ set that I love