- Move React/Vite frontend to apps/web/ (@budgetwise/web)
- Add apps/appwrite/ (@budgetwise/appwrite) to source-control the
Appwrite backend: declarative schema in appwrite.json (5 collections),
CLI-based deploy.sh for containerized use, functions/ dir for future
Appwrite Functions
- Add turbo.json for task orchestration (build, deploy, dev)
- Replace .gitlab-ci.yml with Woodpecker CI pipelines in .woodpecker/:
web-production.yml — push to main → build + rsync to prod
web-staging.yml — push to staging → build + rsync to staging
web-preview.yml — PR open → deploy to {pr}.{domain}; PR close → cleanup
appwrite.yml — schema changes in apps/appwrite/ → CLI deploy
- All secrets injected via Woodpecker CI (no committed .env files)
38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import { NavLink } from 'react-router-dom';
|
|
import { LayoutDashboard, Wallet, CreditCard, MoreHorizontal } from 'lucide-react';
|
|
import { clsx } from '../../lib/utils';
|
|
|
|
const navItems = [
|
|
{ to: '/', icon: LayoutDashboard, label: 'Dashboard' },
|
|
{ to: '/buckets', icon: Wallet, label: 'Buckets' },
|
|
{ to: '/debts', icon: CreditCard, label: 'Debts' },
|
|
{ to: '/more', icon: MoreHorizontal, label: 'More' },
|
|
];
|
|
|
|
export function BottomNav() {
|
|
return (
|
|
<nav className="fixed bottom-0 inset-x-0 z-40 bg-surface-overlay/90 backdrop-blur border-t border-slate-800 safe-area-bottom">
|
|
<div className="flex">
|
|
{navItems.map(({ to, icon: Icon, label }) => (
|
|
<NavLink
|
|
key={to}
|
|
to={to}
|
|
end={to === '/'}
|
|
className={({ isActive }) =>
|
|
clsx(
|
|
'flex-1 flex flex-col items-center justify-center py-2.5 gap-0.5 transition-colors',
|
|
isActive ? 'text-accent' : 'text-slate-500 hover:text-slate-300',
|
|
)
|
|
}
|
|
>
|
|
<Icon size={22} />
|
|
<span className="text-[10px] font-medium">{label}</span>
|
|
</NavLink>
|
|
))}
|
|
</div>
|
|
{/* Safe area spacer for iOS/Android notch */}
|
|
<div className="h-safe-area-inset-bottom" />
|
|
</nav>
|
|
);
|
|
}
|