Compare commits
4 commits
3971642848
...
e3d28e4127
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3d28e4127 | ||
|
|
4de2c40482 | ||
|
|
4fabde57bd | ||
|
|
e9ba8d292d |
5 changed files with 71 additions and 12 deletions
43
apps/web/src/components/NotFound.tsx
Normal file
43
apps/web/src/components/NotFound.tsx
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
import { Link } from "@tanstack/react-router";
|
||||
|
||||
export default function NotFound() {
|
||||
return (
|
||||
<section className="relative flex flex-col items-center justify-center py-24 text-center overflow-hidden">
|
||||
<div className="absolute inset-0 -z-10">
|
||||
<div className="absolute top-0 left-1/2 h-72 w-184 -translate-x-1/2 rounded-full bg-(--color-primary) opacity-[0.10] blur-3xl" />
|
||||
<div className="absolute top-10 left-1/2 h-72 w-184 -translate-x-1/2 rounded-full bg-(--color-accent) opacity-[0.10] blur-3xl" />
|
||||
</div>
|
||||
|
||||
<div className="-rotate-1 mb-4">
|
||||
<span className="inline-flex items-center gap-2 rounded-full bg-(--color-surface) px-4 py-1 text-xs font-semibold tracking-widest uppercase text-(--color-accent) border border-(--color-primary-light)">
|
||||
lost in translation
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-8xl font-black tracking-tight text-(--color-text) leading-none">
|
||||
4
|
||||
<span className="inline-block rotate-1 px-3 py-1 bg-(--color-primary) text-white rounded-xl">
|
||||
0
|
||||
</span>
|
||||
4
|
||||
</h1>
|
||||
|
||||
<p className="mt-6 text-lg font-medium text-(--color-text-muted) max-w-sm">
|
||||
This page doesn't exist. Maybe it never did - or maybe you{" "}
|
||||
<span className="text-(--color-accent) font-bold">
|
||||
just guessed wrong
|
||||
</span>
|
||||
.
|
||||
</p>
|
||||
|
||||
<div className="mt-8">
|
||||
<Link
|
||||
to="/"
|
||||
className="px-7 py-3 rounded-full text-white font-bold text-sm bg-(--color-primary) hover:bg-(--color-primary-dark)"
|
||||
>
|
||||
Back to home
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
|
@ -7,8 +7,8 @@ const Hero = () => {
|
|||
return (
|
||||
<section className="relative pt-10 md:pt-16 pb-10 md:pb-14">
|
||||
<div className="absolute inset-0 -z-10">
|
||||
<div className="absolute -top-24 left-1/2 h-72 w-[46rem] -translate-x-1/2 rounded-full bg-(--color-primary) opacity-[0.10] blur-3xl" />
|
||||
<div className="absolute -top-10 left-1/2 h-72 w-[46rem] -translate-x-1/2 rounded-full bg-(--color-accent) opacity-[0.10] blur-3xl" />
|
||||
<div className="absolute -top-24 left-1/2 h-72 w-184 -translate-x-1/2 rounded-full bg-(--color-primary) opacity-[0.10] blur-3xl" />
|
||||
<div className="absolute -top-10 left-1/2 h-72 w-184 -translate-x-1/2 rounded-full bg-(--color-accent) opacity-[0.10] blur-3xl" />
|
||||
</div>
|
||||
|
||||
<div className="grid items-center gap-10 md:grid-cols-2">
|
||||
|
|
@ -28,9 +28,11 @@ const Hero = () => {
|
|||
</h1>
|
||||
|
||||
<p className="mt-5 text-lg md:text-xl font-medium text-(--color-text-muted) max-w-xl mx-auto md:mx-0">
|
||||
A word appears. You pick the translation. You score points.
|
||||
Then you queue up a room and{" "}
|
||||
<span className="text-(--color-accent) font-bold">beat friends</span>{" "}
|
||||
A word appears. You pick the translation. You score points. Then you
|
||||
queue up a room and{" "}
|
||||
<span className="text-(--color-accent) font-bold">
|
||||
beat friends
|
||||
</span>{" "}
|
||||
in real time.
|
||||
</p>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { createRootRoute, Outlet } from "@tanstack/react-router";
|
||||
import { TanStackRouterDevtools } from "@tanstack/react-router-devtools";
|
||||
import Navbar from "../components/navbar/NavBar";
|
||||
import NotFound from "../components/NotFound";
|
||||
|
||||
const RootLayout = () => {
|
||||
return (
|
||||
|
|
@ -14,4 +15,7 @@ const RootLayout = () => {
|
|||
);
|
||||
};
|
||||
|
||||
export const Route = createRootRoute({ component: RootLayout });
|
||||
export const Route = createRootRoute({
|
||||
component: RootLayout,
|
||||
notFoundComponent: NotFound,
|
||||
});
|
||||
|
|
|
|||
|
|
@ -8,9 +8,6 @@ Labels: `[feature]` `[infra]` `[security]` `[ux]` `[debt]`
|
|||
|
||||
Things that are actively in progress or should be picked up immediately. Mostly operational risk and the remaining phase 7 hardening work.
|
||||
|
||||
- **404 and redirect handling** `[ux]`
|
||||
Unknown routes return raw errors. Add a catch-all route on the frontend for client-side 404s. Consider a Caddy fallback for unrecognized subdomains.
|
||||
|
||||
- **React error boundaries** `[ux]`
|
||||
Catch and display runtime errors gracefully instead of crashing the entire app.
|
||||
|
||||
|
|
@ -29,9 +26,6 @@ Things that are actively in progress or should be picked up immediately. Mostly
|
|||
- **Conditionally register OAuth providers** `[debt]`
|
||||
Better Auth logs warnings when social providers are registered without credentials (`Social provider google is missing clientId or clientSecret`). Instead of registering all providers unconditionally, only add a provider to the config when its credentials are present in the environment. Keeps local dev clean for contributors who don't have OAuth apps set up.
|
||||
|
||||
- **Multiplayer GameService unit tests** `[debt]`
|
||||
round evaluation, scoring, tie-breaking, timeout handling
|
||||
|
||||
---
|
||||
|
||||
## next
|
||||
|
|
@ -117,6 +111,8 @@ Directionally right, timing is unclear. Revisit when the next/now work is done.
|
|||
|
||||
Shipped milestones, newest first.
|
||||
|
||||
- **04 - 2026 - 404 and redirect handling** - Unknown routes return raw errors. Add a catch-all route on the frontend for client-side 404s.
|
||||
- **04 - 2026 - Multiplayer GameService unit tests** - round evaluation, scoring, tie-breaking, timeout handling
|
||||
- **04 - 2026 - Security headers with helmet** - Add helmet middleware to set secure HTTP response headers.
|
||||
- **04 - 2026 - Rate limiting on API endpoints** - At minimum: auth endpoints (brute force prevention) and game endpoints (spam prevention)
|
||||
- **04 - 2026 — Migrations in deploy pipeline** — Drizzle migrate runs as a CI/CD step before the API container restarts
|
||||
|
|
|
|||
|
|
@ -1,5 +1,19 @@
|
|||
# notes
|
||||
|
||||
|
||||
## prompt
|
||||
|
||||
ive attached the readme of my project. this is my current task:
|
||||
|
||||
task description.
|
||||
|
||||
1. tell me which files you need to see to get the full context of the problem
|
||||
2. walk me text-only through the problem and the solution
|
||||
3. if we need to update multiple files: lets go through them one by one, no matter how many files
|
||||
4. if we go through a file, we'll do it slowly section by section, no matter how many sections
|
||||
5. how to name the current feature branch? also tell me when its time to git commit and provide a commit message
|
||||
6. if we have multiple options to do something, also always provide options that reflect current industry standards and best practices
|
||||
|
||||
## tasks
|
||||
|
||||
- **IMPORTANT** db migrations have to be part of the deployment pipeline!!!!!!!!!!!!!!!!!!
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue