Skip to content

Commit 4e3451a

Browse files
feat: UX gap fixes — 404 page, empty state, hover states (#146)
* feat: add branded 404 page for unmatched routes Closes #137 * feat: add empty column guidance with Inbox icon and hint text Closes #139 * feat: enhance landing page hover states and add footer nav links - Add hover lift effect (-translate-y-1) to feature and step cards - Add group hover transitions to HowItWorksSection step cards - Add cursor-pointer to interactive cards - Add Privacy and Terms links to footer Closes #140
1 parent abe756a commit 4e3451a

File tree

5 files changed

+69
-5
lines changed

5 files changed

+69
-5
lines changed

src/app/(landing)/FeaturesSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export const FeaturesSection = memo(function FeaturesSection() {
8787
{features.map((feature, index) => (
8888
<div
8989
key={index}
90-
className="group border-border bg-background/50 hover:bg-background hover:border-primary/20 relative rounded-2xl border p-8 backdrop-blur-sm transition-all duration-300 hover:shadow-lg"
90+
className="group border-border bg-background/50 hover:bg-background hover:border-primary/20 relative cursor-pointer rounded-2xl border p-8 backdrop-blur-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-lg"
9191
>
9292
<div className="text-primary mb-4 transition-transform duration-300 group-hover:scale-110">
9393
{feature.icon}

src/app/(landing)/Footer.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ export const Footer = memo(function Footer() {
1717
<span className="text-foreground text-sm font-medium">GitBox</span>
1818
</div>
1919
<div className="text-muted-foreground flex items-center gap-6 text-sm">
20+
<a
21+
href="/privacy"
22+
className="hover:text-foreground transition-colors"
23+
>
24+
Privacy
25+
</a>
26+
<a href="/terms" className="hover:text-foreground transition-colors">
27+
Terms
28+
</a>
2029
<a
2130
href="https://github.com/laststance/gitbox"
2231
target="_blank"
@@ -28,7 +37,11 @@ export const Footer = memo(function Footer() {
2837
</a>
2938
<span>
3039
Made by{' '}
31-
<a href="https://laststance.io/" target="_blank">
40+
<a
41+
href="https://laststance.io/"
42+
target="_blank"
43+
className="hover:text-foreground transition-colors"
44+
>
3245
Laststance.io
3346
</a>
3447
</span>

src/app/(landing)/HowItWorksSection.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ export const HowItWorksSection = memo(function HowItWorksSection() {
4949
{steps.map((item, index) => (
5050
<div
5151
key={index}
52-
className="border-border/50 bg-background/30 relative flex gap-4 rounded-xl border p-6"
52+
className="group border-border/50 bg-background/30 hover:bg-background/60 hover:border-primary/20 relative flex cursor-pointer gap-4 rounded-xl border p-6 transition-all duration-300 hover:-translate-y-1 hover:shadow-md"
5353
>
54-
<div className="bg-primary/10 text-primary flex h-12 w-12 shrink-0 items-center justify-center rounded-full text-lg font-bold">
54+
<div className="bg-primary/10 text-primary flex h-12 w-12 shrink-0 items-center justify-center rounded-full text-lg font-bold transition-transform duration-300 group-hover:scale-110">
5555
{item.step}
5656
</div>
5757
<div>

src/app/not-found.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Columns3 } from 'lucide-react'
2+
import Link from 'next/link'
3+
import { memo } from 'react'
4+
5+
import { Button } from '@/components/ui/button'
6+
7+
/**
8+
* Root 404 page for unmatched routes.
9+
* Displayed when authenticated users navigate to URLs that don't exist.
10+
* Unauthenticated users are redirected to /login by proxy.ts before reaching this page.
11+
*/
12+
const NotFound = memo(function NotFound() {
13+
return (
14+
<div className="bg-background flex min-h-screen flex-col items-center justify-center gap-8 p-4">
15+
{/* Faded brand icon */}
16+
<div className="text-muted-foreground/20">
17+
<Columns3 className="h-24 w-24" strokeWidth={1} />
18+
</div>
19+
20+
<div className="text-center">
21+
<h1 className="text-foreground text-6xl font-bold tracking-tight">
22+
404
23+
</h1>
24+
<p className="text-muted-foreground mt-3 text-lg">
25+
This page doesn&apos;t exist or has been moved.
26+
</p>
27+
</div>
28+
29+
<div className="flex gap-3">
30+
<Button asChild variant="default">
31+
<Link href="/boards">Go to Boards</Link>
32+
</Button>
33+
<Button asChild variant="outline">
34+
<Link href="/">Back to Home</Link>
35+
</Button>
36+
</div>
37+
</div>
38+
)
39+
})
40+
41+
export default NotFound

src/components/Board/StatusColumn.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { useDroppable } from '@dnd-kit/core'
44
import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'
55
import { motion, AnimatePresence, useReducedMotion } from 'framer-motion'
6-
import { MoreHorizontal, Pencil, Trash2, Plus } from 'lucide-react'
6+
import { MoreHorizontal, Pencil, Trash2, Plus, Inbox } from 'lucide-react'
77
import React, { memo } from 'react'
88

99
import { Button } from '@/components/ui/button'
@@ -184,6 +184,16 @@ export const StatusColumn = memo<StatusColumnProps>(
184184
</motion.div>
185185
))}
186186
</AnimatePresence>
187+
188+
{/* Empty column guidance */}
189+
{cards.length === 0 && (
190+
<div className="flex flex-col items-center gap-2 py-8 text-center">
191+
<Inbox className="text-muted-foreground/40 h-8 w-8" />
192+
<p className="text-muted-foreground text-xs">
193+
Drop repos here or click &quot;Add Repo&quot; below
194+
</p>
195+
</div>
196+
)}
187197
</div>
188198
</SortableContext>
189199

0 commit comments

Comments
 (0)