Skip to content

Commit 03a281a

Browse files
authored
Merge pull request #60 from theredmoose/feature/green-theme-redesign
Green theme redesign + mobile UX improvements
2 parents 30ff282 + 5a257e7 commit 03a281a

13 files changed

Lines changed: 180 additions & 185 deletions

src/App.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -252,27 +252,28 @@ function App() {
252252
default: // 'family'
253253
return (
254254
<div className="flex flex-col min-h-0 flex-1">
255-
{/* Blue app header */}
256-
<div className="px-6 py-4 bg-blue-700 border-b border-blue-800 shadow-sm flex items-center justify-between">
257-
<div>
258-
<h1 className="text-lg font-black text-white tracking-tight">Gear Guru</h1>
259-
<p className="text-blue-200 text-xs">Sports equipment sizing</p>
260-
</div>
261-
<div className="flex items-center gap-3">
262-
<span className="text-blue-200 text-xs truncate max-w-[100px]">
263-
{user.displayName || user.email}
264-
</span>
255+
{/* App header */}
256+
<div className="px-6 bg-white border-b border-slate-100 shadow-sm">
257+
{/* spacing row above */}
258+
<div className="h-5" />
259+
{/* centered logo row */}
260+
<div className="flex items-center justify-center relative">
261+
<h1 className="text-xl font-black text-slate-900 tracking-tighter uppercase text-center">
262+
Gear <span style={{ color: '#008751' }}>Guru</span>
263+
</h1>
265264
<button
266265
onClick={() => setView('settings')}
267-
className="p-1.5 hover:bg-blue-600 rounded-full transition-colors"
266+
className="absolute right-0 p-3 bg-slate-50 border border-slate-100 rounded-2xl text-emerald-700 shadow-sm hover:bg-white transition-all"
268267
aria-label="Open settings"
269268
>
270-
<Settings className="w-5 h-5 text-white" />
269+
<Settings className="w-5 h-5" />
271270
</button>
272271
</div>
272+
{/* spacing row below */}
273+
<div className="h-5" />
273274
</div>
274275

275-
<div className="flex-1 overflow-y-auto bg-white px-6 py-6">
276+
<div className="flex-1 overflow-y-auto bg-[#F8FAFC] px-6 py-6">
276277
{loading && <p className="loading">Loading...</p>}
277278
{error && <p className="error-state">{getOperationErrorMessage(error, 'load')}</p>}
278279

src/components/BottomNav.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ const TABS: { id: TopLevelTab; label: string; Icon: React.ElementType }[] = [
1616

1717
export function BottomNav({ activeTab, onChange }: BottomNavProps) {
1818
return (
19-
<div className="bg-blue-700 border-t border-blue-800 px-4 py-3 flex justify-between items-center rounded-t-3xl shadow-[0_-8px_20px_-5px_rgba(0,0,0,0.2)]">
19+
<div className="bg-white border-t border-slate-100 px-8 py-5 flex justify-between items-center shadow-[0_-4px_20px_-5px_rgba(0,0,0,0.08)]">
2020
{TABS.map(({ id, label, Icon }) => {
2121
const active = activeTab === id;
2222
return (
2323
<button
2424
key={id}
2525
onClick={() => onChange(id)}
26-
className={`flex flex-col items-center gap-1 transition-all min-w-[56px] ${
27-
active ? 'text-white scale-110' : 'text-blue-300 opacity-70 hover:opacity-100'
26+
className={`flex flex-col items-center gap-2 transition-all min-w-[56px] ${
27+
active ? 'text-[#008751] scale-110' : 'text-slate-300 hover:text-emerald-400'
2828
}`}
2929
>
3030
<Icon className="w-6 h-6" />
31-
<span className="text-[10px] font-bold">{label}</span>
31+
<span className="text-[10px] font-black uppercase tracking-tighter">{label}</span>
3232
</button>
3333
);
3434
})}

src/components/GearCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function GearCard({
6464

6565
return (
6666
<div
67-
className="gear-card bg-white border border-slate-200 rounded-2xl p-3.5 flex items-center gap-3 shadow-sm hover:shadow-md active:scale-[0.98] transition-all cursor-pointer mb-3"
67+
className="gear-card bg-white border border-slate-200 rounded-3xl p-3.5 flex items-center gap-3 shadow-sm hover:shadow-md active:scale-[0.98] transition-all cursor-pointer mb-3"
6868
onClick={() => onEdit(item)}
6969
>
7070
{/* Icon tile or photo */}
@@ -159,7 +159,7 @@ export function GearCard({
159159
{/* Actions */}
160160
<div className="flex flex-col gap-1 flex-shrink-0">
161161
<button
162-
className="w-8 h-8 flex items-center justify-center rounded-full hover:bg-slate-100 transition-colors text-slate-400 hover:text-blue-600"
162+
className="w-8 h-8 flex items-center justify-center rounded-full hover:bg-slate-100 transition-colors text-slate-400 hover:text-[#008751]"
163163
onClick={handleEdit}
164164
aria-label="Edit gear"
165165
>

src/components/GearInventory.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,17 @@ export function GearInventory({
4444

4545
return (
4646
<div className="flex flex-col min-h-0 flex-1">
47-
{/* Blue app header */}
48-
<div className="px-6 py-4 bg-blue-700 border-b border-blue-800 shadow-sm flex items-center gap-3">
47+
{/* Header */}
48+
<div className="px-6 py-4 bg-white border-b border-slate-100 shadow-sm flex items-center gap-3">
4949
<button
50-
className="w-8 h-8 flex items-center justify-center rounded-full hover:bg-blue-600 transition-colors text-white flex-shrink-0"
50+
className="p-3 bg-slate-50 border border-slate-100 rounded-2xl text-emerald-700 shadow-sm hover:bg-white transition-all flex-shrink-0"
5151
onClick={onBack}
5252
aria-label="Back"
5353
>
5454
<ChevronLeft className="w-5 h-5" />
5555
<span className="sr-only">← Home</span>
5656
</button>
57-
<h1 className="text-lg font-black text-white tracking-tight flex-1">Family Gear</h1>
57+
<h1 className="text-base font-black text-slate-900 uppercase tracking-tight flex-1">Family Gear</h1>
5858
</div>
5959

6060
{/* Filter bar */}
@@ -66,7 +66,7 @@ export function GearInventory({
6666
id="owner-filter"
6767
value={filterOwnerId}
6868
onChange={(e) => setFilterOwnerId(e.target.value)}
69-
className="flex-1 text-sm font-bold text-slate-700 bg-slate-50 border border-slate-200 rounded-xl px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-400"
69+
className="flex-1 text-sm font-bold text-slate-700 bg-slate-50 border border-slate-200 rounded-xl px-3 py-2 focus:outline-none focus:ring-2 focus:ring-[#008751]/30"
7070
>
7171
<option value="all">All Members</option>
7272
{members.map((member) => (
@@ -78,7 +78,7 @@ export function GearInventory({
7878
</div>
7979

8080
{/* Content */}
81-
<div className="flex-1 overflow-y-auto bg-white px-6 py-4">
81+
<div className="flex-1 overflow-y-auto bg-[#F8FAFC] px-6 py-6">
8282
{filteredItems.length === 0 ? (
8383
<div className="flex flex-col items-center justify-center py-16 gap-4">
8484
<p className="text-slate-400 font-bold text-sm">No gear found.</p>
@@ -102,7 +102,7 @@ export function GearInventory({
102102
{member.name}
103103
</h2>
104104
<button
105-
className="text-xs font-bold text-blue-600 hover:text-blue-800 transition-colors"
105+
className="text-xs font-bold text-[#008751] hover:text-emerald-800 transition-colors"
106106
onClick={() => onAddGear(member.id)}
107107
>
108108
+ Add

src/components/MeasureScreen.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export function MeasureScreen({ members, onSelectMember }: MeasureScreenProps) {
1212
return (
1313
<div className="flex flex-col min-h-0 flex-1">
1414
<ScreenHeader title="Measure" />
15-
<div className="flex-1 overflow-y-auto bg-white px-6 py-6">
15+
<div className="flex-1 overflow-y-auto bg-[#F8FAFC] px-6 py-6">
1616
<p className="text-[11px] text-slate-400 font-bold uppercase tracking-widest mb-4">
1717
Select a member to update measurements
1818
</p>
@@ -22,7 +22,7 @@ export function MeasureScreen({ members, onSelectMember }: MeasureScreenProps) {
2222
No family members yet. Add someone on the Family tab.
2323
</p>
2424
) : (
25-
<div className="space-y-3">
25+
<div className="space-y-4">
2626
{members.map((member) => {
2727
const { measurements } = member;
2828
const showWarning = shouldWarnGrowth(member);
@@ -37,11 +37,13 @@ export function MeasureScreen({ members, onSelectMember }: MeasureScreenProps) {
3737
<button
3838
key={member.id}
3939
onClick={() => onSelectMember(member)}
40-
className="w-full bg-slate-50 border border-slate-100 rounded-2xl p-4 flex items-center justify-between shadow-sm hover:shadow-md active:scale-[0.98] transition-all text-left"
40+
className="w-full bg-slate-50 border border-slate-100 rounded-3xl p-4 flex items-center justify-between shadow-sm hover:shadow-md active:scale-[0.98] transition-all text-left"
4141
>
4242
<div className="flex items-center gap-3">
43-
<div className="w-10 h-10 rounded-full bg-blue-700 flex items-center justify-center text-white font-black text-lg">
44-
{member.name.charAt(0).toUpperCase()}
43+
<div className="w-12 h-12 rounded-2xl bg-gradient-to-br from-emerald-50 to-slate-100 border border-slate-100 flex items-center justify-center flex-shrink-0">
44+
<span className="text-xl font-black text-[#008751] select-none">
45+
{member.name.charAt(0).toUpperCase()}
46+
</span>
4547
</div>
4648
<div>
4749
<p className="text-sm font-black text-slate-900">
@@ -53,7 +55,7 @@ export function MeasureScreen({ members, onSelectMember }: MeasureScreenProps) {
5355
</p>
5456
</div>
5557
</div>
56-
<span className="text-[10px] font-black text-blue-700 uppercase tracking-widest">
58+
<span className="text-[10px] font-black text-[#008751] uppercase tracking-widest">
5759
Edit →
5860
</span>
5961
</button>

src/components/MemberCard.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ export function MemberCard({ member, onSelect, onEdit, onDelete }: MemberCardPro
4545

4646
return (
4747
<div
48-
className="bg-white border border-slate-200 rounded-2xl p-4 flex items-center justify-between shadow-sm hover:shadow-md active:scale-[0.98] transition-all cursor-pointer mb-3"
48+
className="bg-white border border-slate-200 rounded-3xl p-4 flex items-center justify-between shadow-sm hover:shadow-md active:scale-[0.98] transition-all cursor-pointer mb-3"
4949
onClick={() => onSelect(member)}
5050
>
5151
<div className="flex items-center gap-3">
5252
{/* Avatar */}
53-
<div className="w-11 h-11 rounded-full bg-blue-700 flex items-center justify-center flex-shrink-0">
54-
<span className="text-lg font-black text-white">
53+
<div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-emerald-50 to-slate-100 border border-slate-100 flex items-center justify-center flex-shrink-0">
54+
<span className="text-2xl font-black text-[#008751] select-none">
5555
{member.name.charAt(0).toUpperCase()}
5656
</span>
5757
</div>
@@ -71,7 +71,7 @@ export function MemberCard({ member, onSelect, onEdit, onDelete }: MemberCardPro
7171
{/* Actions */}
7272
<div className="flex items-center gap-1">
7373
<button
74-
className="w-8 h-8 flex items-center justify-center rounded-full hover:bg-slate-100 transition-colors text-slate-400 hover:text-blue-600"
74+
className="w-8 h-8 flex items-center justify-center rounded-full hover:bg-slate-100 transition-colors text-slate-400 hover:text-[#008751]"
7575
onClick={handleEdit}
7676
aria-label="Edit member"
7777
>

0 commit comments

Comments
 (0)