328929004b
Ensure consistent styling for the bottom navigation component by adjusting CSS classes and z-index for proper layering. Replit-Commit-Author: Agent Replit-Commit-Session-Id: ceced2fc-aa46-458d-ba87-ddd4b7bb1518 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/659922a9-0087-461c-90dd-6d9a58b81d4d/ceced2fc-aa46-458d-ba87-ddd4b7bb1518/Fqw4LkD
80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
import { Button } from '@/components/ui/button';
|
|
import { Badge } from '@/components/ui/badge';
|
|
import { Home, Calendar, LayoutGrid, Plus, Settings } from 'lucide-react';
|
|
import { useState } from 'react';
|
|
|
|
interface BottomNavigationProps {
|
|
onTabChange?: (tab: string) => void;
|
|
onCreateTask?: () => void;
|
|
activeTab?: string;
|
|
}
|
|
|
|
export default function BottomNavigation({ onTabChange, onCreateTask, activeTab = 'tasks' }: BottomNavigationProps) {
|
|
const [currentTab, setCurrentTab] = useState(activeTab);
|
|
|
|
const tabs = [
|
|
{ id: 'tasks', label: 'Tasks', icon: Home, badge: 3 },
|
|
{ id: 'calendar', label: 'Calendar', icon: Calendar },
|
|
{ id: 'create', label: 'Create', icon: Plus, isCreate: true },
|
|
{ id: 'kanban', label: 'Board', icon: LayoutGrid },
|
|
{ id: 'templates', label: 'Templates', icon: Settings }
|
|
];
|
|
|
|
const handleTabClick = (tabId: string, isCreate?: boolean) => {
|
|
if (isCreate) {
|
|
onCreateTask?.();
|
|
console.log('Create task triggered');
|
|
return;
|
|
}
|
|
|
|
setCurrentTab(tabId);
|
|
onTabChange?.(tabId);
|
|
console.log('Tab changed to:', tabId);
|
|
};
|
|
|
|
return (
|
|
<div className="fixed bottom-0 left-0 right-0 bg-background border-t border-border z-40">
|
|
<div className="flex items-center justify-around px-2 py-2 safe-area-inset-bottom">
|
|
{tabs.map((tab) => {
|
|
const isActive = currentTab === tab.id && !tab.isCreate;
|
|
const Icon = tab.icon;
|
|
|
|
return (
|
|
<Button
|
|
key={tab.id}
|
|
variant={tab.isCreate ? "default" : isActive ? "secondary" : "ghost"}
|
|
size={tab.isCreate ? "icon" : "sm"}
|
|
onClick={() => handleTabClick(tab.id, tab.isCreate)}
|
|
className={`relative flex flex-col gap-1 h-auto py-2 px-3 ${
|
|
tab.isCreate
|
|
? 'w-12 h-12 rounded-full shadow-lg'
|
|
: 'flex-1 max-w-[80px]'
|
|
}`}
|
|
data-testid={`nav-${tab.id}`}
|
|
>
|
|
<Icon className={`${
|
|
tab.isCreate ? 'w-6 h-6' : 'w-5 h-5'
|
|
}`} />
|
|
|
|
{!tab.isCreate && (
|
|
<span className="text-xs font-medium">
|
|
{tab.label}
|
|
</span>
|
|
)}
|
|
|
|
{tab.badge && !tab.isCreate && (
|
|
<Badge
|
|
variant="destructive"
|
|
className="absolute -top-1 -right-1 w-5 h-5 flex items-center justify-center text-xs p-0 min-w-[20px]"
|
|
data-testid={`badge-${tab.id}`}
|
|
>
|
|
{tab.badge}
|
|
</Badge>
|
|
)}
|
|
</Button>
|
|
);
|
|
})}
|
|
</div>
|
|
</div>
|
|
);
|
|
} |