Skip to content

Commit a9b6b1d

Browse files
authored
Merge pull request #69 from NiHaiden/v2.1
2 parents 06052a6 + f230080 commit a9b6b1d

19 files changed

+1874
-2127
lines changed

app/[locale]/layout.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Metadata } from "next";
22
import { Inter, Poltawski_Nowy } from "next/font/google";
3+
import { Geist, Geist_Mono } from 'next/font/google'
34
import "./globals.css";
45
import { Toaster } from "@/components/ui/toaster";
56
import { DiscourseScript } from "./discourse-script";
@@ -8,14 +9,15 @@ import { NextIntlClientProvider } from "next-intl";
89
import { getLocale, getMessages } from "next-intl/server";
910

1011
const inter = Inter({ subsets: ["latin"] });
12+
const geist = Geist({subsets: ["latin"]});
1113
const serifFont = Poltawski_Nowy({ subsets: ["latin"] });
1214

1315
export const metadata: Metadata = {
1416
title: "Aurora - The Linux-based ultimate workstation",
1517
description: "The ultimate productivity workstation, stable and streamlined for you.",
1618
openGraph: {
1719
type: "website",
18-
images: ["/wallpaper.jpg"]
20+
images: ["/aurora_wallpaper_september_2025.png"]
1921
},
2022
icons: {
2123
icon: "/aurora-logo.svg",
@@ -34,7 +36,7 @@ export default async function RootLayout({
3436
<head>
3537
<UmamiScript />
3638
</head>
37-
<body className={inter.className}>
39+
<body className={geist.className}>
3840
<DiscourseScript />
3941
<link rel="icon" href="/favicon.ico" sizes="any" />
4042
<NextIntlClientProvider messages={messages}>

components/BlurText.tsx

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import { motion, Transition, Easing } from 'motion/react';
2+
import { useEffect, useRef, useState, useMemo } from 'react';
3+
4+
type BlurTextProps = {
5+
text?: string;
6+
delay?: number;
7+
className?: string;
8+
animateBy?: 'words' | 'letters';
9+
direction?: 'top' | 'bottom';
10+
threshold?: number;
11+
rootMargin?: string;
12+
animationFrom?: Record<string, string | number>;
13+
animationTo?: Array<Record<string, string | number>>;
14+
easing?: Easing | Easing[];
15+
onAnimationComplete?: () => void;
16+
stepDuration?: number;
17+
};
18+
19+
const buildKeyframes = (
20+
from: Record<string, string | number>,
21+
steps: Array<Record<string, string | number>>
22+
): Record<string, Array<string | number>> => {
23+
const keys = new Set<string>([...Object.keys(from), ...steps.flatMap(s => Object.keys(s))]);
24+
25+
const keyframes: Record<string, Array<string | number>> = {};
26+
keys.forEach(k => {
27+
keyframes[k] = [from[k], ...steps.map(s => s[k])];
28+
});
29+
return keyframes;
30+
};
31+
32+
const BlurText: React.FC<BlurTextProps> = ({
33+
text = '',
34+
delay = 200,
35+
className = '',
36+
animateBy = 'words',
37+
direction = 'top',
38+
threshold = 0.1,
39+
rootMargin = '0px',
40+
animationFrom,
41+
animationTo,
42+
easing = (t: number) => t,
43+
onAnimationComplete,
44+
stepDuration = 0.35
45+
}) => {
46+
const elements = animateBy === 'words' ? text.split(' ') : text.split('');
47+
const [inView, setInView] = useState(false);
48+
const ref = useRef<HTMLParagraphElement>(null);
49+
50+
useEffect(() => {
51+
if (!ref.current) return;
52+
const observer = new IntersectionObserver(
53+
([entry]) => {
54+
if (entry.isIntersecting) {
55+
setInView(true);
56+
observer.unobserve(ref.current as Element);
57+
}
58+
},
59+
{ threshold, rootMargin }
60+
);
61+
observer.observe(ref.current);
62+
return () => observer.disconnect();
63+
}, [threshold, rootMargin]);
64+
65+
const defaultFrom = useMemo(
66+
() =>
67+
direction === 'top' ? { filter: 'blur(10px)', opacity: 0, y: -50 } : { filter: 'blur(10px)', opacity: 0, y: 50 },
68+
[direction]
69+
);
70+
71+
const defaultTo = useMemo(
72+
() => [
73+
{
74+
filter: 'blur(5px)',
75+
opacity: 0.5,
76+
y: direction === 'top' ? 5 : -5
77+
},
78+
{ filter: 'blur(0px)', opacity: 1, y: 0 }
79+
],
80+
[direction]
81+
);
82+
83+
const fromSnapshot = animationFrom ?? defaultFrom;
84+
const toSnapshots = animationTo ?? defaultTo;
85+
86+
const stepCount = toSnapshots.length + 1;
87+
const totalDuration = stepDuration * (stepCount - 1);
88+
const times = Array.from({ length: stepCount }, (_, i) => (stepCount === 1 ? 0 : i / (stepCount - 1)));
89+
90+
return (
91+
<p ref={ref} className={`blur-text ${className} flex flex-wrap`}>
92+
{elements.map((segment, index) => {
93+
const animateKeyframes = buildKeyframes(fromSnapshot, toSnapshots);
94+
95+
const spanTransition: Transition = {
96+
duration: totalDuration,
97+
times,
98+
delay: (index * delay) / 1000,
99+
ease: easing
100+
};
101+
102+
return (
103+
<motion.span
104+
key={index}
105+
initial={fromSnapshot}
106+
animate={inView ? animateKeyframes : fromSnapshot}
107+
transition={spanTransition}
108+
onAnimationComplete={index === elements.length - 1 ? onAnimationComplete : undefined}
109+
style={{
110+
display: 'inline-block',
111+
willChange: 'transform, filter, opacity'
112+
}}
113+
>
114+
{segment === ' ' ? '\u00A0' : segment}
115+
{animateBy === 'words' && index < elements.length - 1 && '\u00A0'}
116+
</motion.span>
117+
);
118+
})}
119+
</p>
120+
);
121+
};
122+
123+
export default BlurText;

components/SpotlightCard.tsx

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import React, { useRef, useState } from 'react';
2+
3+
interface Position {
4+
x: number;
5+
y: number;
6+
}
7+
8+
interface SpotlightCardProps extends React.PropsWithChildren {
9+
className?: string;
10+
spotlightColor?: `rgba(${number}, ${number}, ${number}, ${number})`;
11+
}
12+
13+
const SpotlightCard: React.FC<SpotlightCardProps> = ({
14+
children,
15+
className = '',
16+
spotlightColor = 'rgba(255, 255, 255, 0.25)'
17+
}) => {
18+
const divRef = useRef<HTMLDivElement>(null);
19+
const [isFocused, setIsFocused] = useState<boolean>(false);
20+
const [position, setPosition] = useState<Position>({ x: 0, y: 0 });
21+
const [opacity, setOpacity] = useState<number>(0);
22+
23+
const handleMouseMove: React.MouseEventHandler<HTMLDivElement> = e => {
24+
if (!divRef.current || isFocused) return;
25+
26+
const rect = divRef.current.getBoundingClientRect();
27+
setPosition({ x: e.clientX - rect.left, y: e.clientY - rect.top });
28+
};
29+
30+
const handleFocus = () => {
31+
setIsFocused(true);
32+
setOpacity(0.6);
33+
};
34+
35+
const handleBlur = () => {
36+
setIsFocused(false);
37+
setOpacity(0);
38+
};
39+
40+
const handleMouseEnter = () => {
41+
setOpacity(0.6);
42+
};
43+
44+
const handleMouseLeave = () => {
45+
setOpacity(0);
46+
};
47+
48+
return (
49+
<div
50+
ref={divRef}
51+
onMouseMove={handleMouseMove}
52+
onFocus={handleFocus}
53+
onBlur={handleBlur}
54+
onMouseEnter={handleMouseEnter}
55+
onMouseLeave={handleMouseLeave}
56+
className={`relative rounded-3xl border border-neutral-800 bg-neutral-900 overflow-hidden p-8 ${className}`}
57+
>
58+
<div
59+
className="pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-500 ease-in-out"
60+
style={{
61+
opacity,
62+
background: `radial-gradient(circle at ${position.x}px ${position.y}px, ${spotlightColor}, transparent 80%)`
63+
}}
64+
/>
65+
{children}
66+
</div>
67+
);
68+
};
69+
70+
export default SpotlightCard;

components/nav/Navbar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const Navbar = ({
3535
className={`fixed ${isTop ? "top-4" : "top-0 lg:top-4"} z-30 w-full text-white transition duration-300 ease-in-out`}
3636
>
3737
<div
38-
className={`container mx-auto flex w-full max-w-screen-2xl flex-col flex-wrap items-center lg:p-2 p-4 md:flex-row lg:w-2/3 ${isTop ? "bg-transparent" : "bg-aurora-blue/30 px-2 backdrop-blur-2xl lg:rounded-3xl"}`}
38+
className={`container mx-auto flex w-full max-w-screen-2xl flex-col flex-wrap items-center lg:p-2 p-4 md:flex-row lg:w-2/3 ${isTop ? "bg-transparent" : "bg-gray-300/10 px-2 backdrop-blur-2xl lg:rounded-3xl"}`}
3939
>
4040
<div className="mb-4 hidden w-full flex-row items-center justify-between gap-4 font-medium text-white md:mb-0 lg:flex">
4141
<div

components/sections/about/about-aurora-new.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default function AboutAuroraNew({
1818
newsRef: RefObject<HTMLDivElement>;
1919
}) {
2020
return (
21-
<main className={"min-h-dvh bg-gray-950 p-10 text-white"}>
21+
<main className={"min-h-dvh p-10 bg-zinc-950 text-white"}>
2222
<div ref={aboutRef} className={"flex flex-row gap-10"}>
2323
<div className="flex w-full flex-col items-center justify-center gap-44">
2424
<YourNewDesktop />

0 commit comments

Comments
 (0)