diff --git a/projects/website/src/components/app-statistics.tsx b/projects/website/src/components/app-statistics.tsx
index 77df1a3..018408b 100644
--- a/projects/website/src/components/app-statistics.tsx
+++ b/projects/website/src/components/app-statistics.tsx
@@ -6,6 +6,7 @@ import { useQuery } from "@tanstack/react-query";
import { kyFetch } from "@ssr/common/utils/utils";
import { Config } from "@ssr/common/config";
import { useEffect, useState } from "react";
+import { User } from "lucide-react";
type AppStatisticsProps = {
/**
@@ -29,13 +30,24 @@ export function AppStats({ initialStatistics }: AppStatisticsProps) {
}, [data]);
return (
-
-
Site Statistics
-
-
-
-
-
+
+ } title="Tracked Players" value={statistics.trackedPlayers} />
+ } title="Tracked Scores" value={statistics.trackedScores} />
+ }
+ title="Additional Scores Data"
+ value={statistics.additionalScoresData}
+ />
+ }
+ title="Cached BeatSaver Maps"
+ value={statistics.cachedBeatSaverMaps}
+ />
+ }
+ title="Cached ScoreSaber Leaderboards"
+ value={statistics.cachedScoreSaberLeaderboards}
+ />
);
}
diff --git a/projects/website/src/components/home/data-collection.tsx b/projects/website/src/components/home/data-collection.tsx
new file mode 100644
index 0000000..5c8f5bd
--- /dev/null
+++ b/projects/website/src/components/home/data-collection.tsx
@@ -0,0 +1,26 @@
+import { Database } from "lucide-react";
+
+export default function DataCollection() {
+ return (
+
+ {/* Header */}
+
+
+
+
Data Collection
+
+
posidonium novum ancillae ius conclusionemque splendide vel.
+
+
+ {/* Content */}
+
+
+
+
+ );
+}
diff --git a/projects/website/src/components/home/friends.tsx b/projects/website/src/components/home/friends.tsx
new file mode 100644
index 0000000..85beec5
--- /dev/null
+++ b/projects/website/src/components/home/friends.tsx
@@ -0,0 +1,26 @@
+import { Database } from "lucide-react";
+
+export default function Friends() {
+ return (
+
+ {/* Header */}
+
+
+
+
Friends
+
+
posidonium novum ancillae ius conclusionemque splendide vel.
+
+
+ {/* Content */}
+
+
+
+
+ );
+}
diff --git a/projects/website/src/components/home/hero.tsx b/projects/website/src/components/home/hero.tsx
new file mode 100644
index 0000000..68ff029
--- /dev/null
+++ b/projects/website/src/components/home/hero.tsx
@@ -0,0 +1,82 @@
+import AnimatedShinyText from "@/components/ui/animated-shiny-text";
+import { ArrowRight, UserSearch } from "lucide-react";
+import Link from "next/link";
+import { Button } from "@/components/ui/button";
+import { SiGithub } from "react-icons/si";
+import { BorderBeam } from "@/components/ui/border-beam";
+import { Separator } from "@/components/ui/separator";
+
+export default function HeroSection() {
+ return (
+
+ );
+}
+
+function Alert() {
+ return (
+
+
+
+ Check out our Source Code
+
+
+
+ );
+}
+
+function Title() {
+ return (
+ <>
+
+ ScoreSaber Reloaded
+
+
+ Scoresaber Reloaded is a new way to view your scores and get more stats about your and your plays
+
+ >
+ );
+}
+
+function Buttons() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function AppPreview() {
+ return (
+
+
+
+
+ );
+}
diff --git a/projects/website/src/components/home/realtime-scores.tsx b/projects/website/src/components/home/realtime-scores.tsx
new file mode 100644
index 0000000..76dd43b
--- /dev/null
+++ b/projects/website/src/components/home/realtime-scores.tsx
@@ -0,0 +1,26 @@
+import { Database } from "lucide-react";
+
+export default function RealtimeScores() {
+ return (
+
+ {/* Header */}
+
+
+
+
Realtime Scores
+
+
posidonium novum ancillae ius conclusionemque splendide vel.
+
+
+ {/* Content */}
+
+
+
+
+ );
+}
diff --git a/projects/website/src/components/home/site-stats.tsx b/projects/website/src/components/home/site-stats.tsx
new file mode 100644
index 0000000..3dc17e3
--- /dev/null
+++ b/projects/website/src/components/home/site-stats.tsx
@@ -0,0 +1,24 @@
+import { Database } from "lucide-react";
+import { kyFetch } from "@ssr/common/utils/utils";
+import { AppStatistics } from "@ssr/common/types/backend/app-statistics";
+import { Config } from "@ssr/common/config";
+import { AppStats } from "@/components/app-statistics";
+
+export default async function SiteStats() {
+ const statistics = await kyFetch
(Config.apiUrl + "/statistics");
+ return (
+
+ {/* Header */}
+
+
+
+
Site Statistics
+
+
posidonium novum ancillae ius conclusionemque splendide vel.
+
+
+ {/* Content */}
+ {statistics &&
}
+
+ );
+}
diff --git a/projects/website/src/components/home/statistic.tsx b/projects/website/src/components/home/statistic.tsx
index a055384..e63d3ee 100644
--- a/projects/website/src/components/home/statistic.tsx
+++ b/projects/website/src/components/home/statistic.tsx
@@ -1,16 +1,22 @@
"use client";
import CountUp from "react-countup";
+import { ReactElement } from "react";
type Statistic = {
+ icon: ReactElement;
title: string;
value: number;
};
-export default function Statistic({ title, value }: Statistic) {
+export default function Statistic({ icon, title, value }: Statistic) {
return (
-
- {title}:
-
+
+ {icon}
+
{title}
+
+
+
+
);
}
diff --git a/projects/website/src/components/loaders/fullscreen-loader.tsx b/projects/website/src/components/loaders/fullscreen-loader.tsx
index 2fb5f3b..1c2a3bd 100644
--- a/projects/website/src/components/loaders/fullscreen-loader.tsx
+++ b/projects/website/src/components/loaders/fullscreen-loader.tsx
@@ -10,7 +10,7 @@ export default function FullscreenLoader({ reason }: Props) {
ScoreSaber Reloaded
-
{reason}
+
{reason}
diff --git a/projects/website/src/components/navbar/navbar.tsx b/projects/website/src/components/navbar/navbar.tsx
index 679dce1..32d4cdf 100644
--- a/projects/website/src/components/navbar/navbar.tsx
+++ b/projects/website/src/components/navbar/navbar.tsx
@@ -6,7 +6,6 @@ import NavbarButton from "./navbar-button";
import ProfileButton from "./profile-button";
import { TrendingUpIcon } from "lucide-react";
import FriendsButton from "@/components/navbar/friends-button";
-import { PiSwordFill } from "react-icons/pi";
type NavbarItem = {
name: string;
diff --git a/projects/website/src/components/ui/animated-shiny-text.tsx b/projects/website/src/components/ui/animated-shiny-text.tsx
new file mode 100644
index 0000000..46029c3
--- /dev/null
+++ b/projects/website/src/components/ui/animated-shiny-text.tsx
@@ -0,0 +1,35 @@
+import { CSSProperties, FC, ReactNode } from "react";
+import { cn } from "@/common/utils";
+
+interface AnimatedShinyTextProps {
+ children: ReactNode;
+ className?: string;
+ shimmerWidth?: number;
+}
+
+const AnimatedShinyText: FC
= ({ children, className, shimmerWidth = 100 }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default AnimatedShinyText;
diff --git a/projects/website/src/components/ui/border-beam.tsx b/projects/website/src/components/ui/border-beam.tsx
new file mode 100644
index 0000000..6030eac
--- /dev/null
+++ b/projects/website/src/components/ui/border-beam.tsx
@@ -0,0 +1,49 @@
+import { cn } from "@/common/utils";
+
+interface BorderBeamProps {
+ className?: string;
+ size?: number;
+ duration?: number;
+ borderWidth?: number;
+ anchor?: number;
+ colorFrom?: string;
+ colorTo?: string;
+ delay?: number;
+}
+
+export const BorderBeam = ({
+ className,
+ size = 200,
+ duration = 15,
+ anchor = 90,
+ borderWidth = 1.5,
+ colorFrom = "#ffaa40",
+ colorTo = "#9c40ff",
+ delay = 0,
+}: BorderBeamProps) => {
+ return (
+
+ );
+};
diff --git a/projects/website/src/components/ui/separator.tsx b/projects/website/src/components/ui/separator.tsx
new file mode 100644
index 0000000..7171a71
--- /dev/null
+++ b/projects/website/src/components/ui/separator.tsx
@@ -0,0 +1,21 @@
+"use client";
+
+import * as React from "react";
+import * as SeparatorPrimitive from "@radix-ui/react-separator";
+import { cn } from "@/common/utils";
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => (
+
+));
+Separator.displayName = SeparatorPrimitive.Root.displayName;
+
+export { Separator };
diff --git a/projects/website/tailwind.config.ts b/projects/website/tailwind.config.ts
index f703e27..0c5b861 100644
--- a/projects/website/tailwind.config.ts
+++ b/projects/website/tailwind.config.ts
@@ -64,6 +64,25 @@ const config: Config = {
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
+ animation: {
+ "shiny-text": "shiny-text 8s infinite",
+ "border-beam": "border-beam calc(var(--duration)*1s) infinite linear",
+ },
+ keyframes: {
+ "shiny-text": {
+ "0%, 90%, 100%": {
+ "background-position": "calc(-100% - var(--shiny-width)) 0",
+ },
+ "30%, 60%": {
+ "background-position": "calc(100% + var(--shiny-width)) 0",
+ },
+ },
+ "border-beam": {
+ "100%": {
+ "offset-distance": "100%",
+ },
+ },
+ },
},
},
plugins: [require("tailwindcss-animate")],