Skip to content

Commit f92fe77

Browse files
committed
feat: add framer-motion for animations and enhance SiteHeader with new icons and styles
1 parent 403994e commit f92fe77

4 files changed

Lines changed: 88 additions & 7 deletions

File tree

package-lock.json

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"dependencies": {
1717
"@supabase/ssr": "^0.8.0",
1818
"@supabase/supabase-js": "^2.95.3",
19+
"framer-motion": "^12.38.0",
1920
"lucide-react": "^0.563.0",
2021
"next": "16.1.6",
2122
"react": "19.2.3",

src/app/globals.css

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,21 @@ body {
185185
background: rgba(141, 174, 148, 0.35);
186186
color: var(--catsafe-tone-ink);
187187
}
188+
189+
@layer base {
190+
button,
191+
[role="button"],
192+
input[type="button"],
193+
input[type="submit"],
194+
input[type="reset"] {
195+
cursor: pointer;
196+
}
197+
198+
button:disabled,
199+
[role="button"][aria-disabled="true"],
200+
input[type="button"]:disabled,
201+
input[type="submit"]:disabled,
202+
input[type="reset"]:disabled {
203+
cursor: not-allowed;
204+
}
205+
}

src/components/ui/site-header.tsx

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
"use client";
2+
13
import Image from 'next/image';
2-
import { ArrowLeft } from 'lucide-react';
4+
import { ArrowLeft, Home, Search } from 'lucide-react';
5+
import { motion } from 'framer-motion';
36

47
interface SiteHeaderProps {
58
pathname: string;
@@ -11,7 +14,7 @@ interface SiteHeaderProps {
1114
}
1215

1316
const navButtonClass =
14-
'inline-flex min-h-10 items-center justify-center rounded-full px-3.5 py-2 text-xs font-medium tracking-[0.08em] uppercase whitespace-nowrap transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-300 active:scale-[0.97] sm:px-4.5 sm:text-sm';
17+
'relative z-10 inline-flex min-h-10 items-center justify-center gap-2 rounded-full px-3.5 py-2 text-xs font-semibold tracking-[0.05em] uppercase whitespace-nowrap transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-300 active:scale-[0.97] sm:px-4.5 sm:text-sm';
1518

1619
export function SiteHeader({
1720
pathname,
@@ -59,17 +62,25 @@ export function SiteHeader({
5962
</div>
6063
)}
6164

62-
<nav aria-label="Primary" className="flex shrink-0 items-center gap-1.5">
65+
<nav aria-label="Primary" className="flex shrink-0 items-center gap-1 rounded-full p-1 bg-slate-100/80 border border-slate-200 shadow-inner">
6366
<button
6467
type="button"
6568
onClick={onGoHome}
6669
aria-current={resolvedActiveNav === 'home' ? 'page' : undefined}
6770
className={`${navButtonClass} ${
6871
resolvedActiveNav === 'home'
69-
? 'border border-emerald-200 bg-emerald-100/90 text-emerald-950 shadow-sm'
70-
: 'text-slate-600 hover:bg-white hover:text-emerald-800'
72+
? 'text-emerald-950'
73+
: 'text-slate-500 hover:text-emerald-800 hover:bg-black/5'
7174
}`}
7275
>
76+
{resolvedActiveNav === 'home' && (
77+
<motion.div
78+
layoutId="active-nav-pill"
79+
className="absolute inset-0 -z-10 rounded-full border border-emerald-200 bg-emerald-100 shadow-sm"
80+
transition={{ type: 'spring', stiffness: 400, damping: 30 }}
81+
/>
82+
)}
83+
<Home className="w-3.5 h-3.5 sm:w-4 sm:h-4" />
7384
Home
7485
</button>
7586
<button
@@ -79,10 +90,18 @@ export function SiteHeader({
7990
aria-current={resolvedActiveNav === 'directory' ? 'page' : undefined}
8091
className={`${navButtonClass} ${
8192
resolvedActiveNav === 'directory'
82-
? 'border border-emerald-200 bg-emerald-100/90 text-emerald-950 shadow-sm'
83-
: 'text-slate-600 hover:bg-white hover:text-emerald-800'
93+
? 'text-emerald-950'
94+
: 'text-slate-500 hover:text-emerald-800 hover:bg-black/5'
8495
}`}
8596
>
97+
{resolvedActiveNav === 'directory' && (
98+
<motion.div
99+
layoutId="active-nav-pill"
100+
className="absolute inset-0 -z-10 rounded-full border border-emerald-200 bg-emerald-100 shadow-sm"
101+
transition={{ type: 'spring', stiffness: 400, damping: 30 }}
102+
/>
103+
)}
104+
<Search className="w-3.5 h-3.5 sm:w-4 sm:h-4" />
86105
<span className="sm:hidden">Directory</span>
87106
<span className="hidden sm:inline">Plant Directory</span>
88107
</button>

0 commit comments

Comments
 (0)