| 'use client'; |
|
|
| import { motion } from 'framer-motion'; |
| import { cn } from '@/lib/utils'; |
| import { useActiveTab, useAppStore } from '@/store/app-store'; |
|
|
| const tabs = [ |
| { id: 'analyze' as const, label: 'Analyze Note', icon: '📝' }, |
| { id: 'settings' as const, label: 'Settings', icon: '⚙️' }, |
| ]; |
|
|
| export function TabNavigation() { |
| const activeTab = useActiveTab(); |
| const setActiveTab = useAppStore((state) => state.setActiveTab); |
|
|
| return ( |
| <nav className="flex items-center gap-1 p-1 glass rounded-2xl"> |
| {tabs.map((tab) => ( |
| <button |
| key={tab.id} |
| onClick={() => setActiveTab(tab.id)} |
| className={cn( |
| 'relative flex items-center gap-2 px-4 py-2 rounded-xl', |
| 'text-sm font-medium', |
| 'transition-colors duration-200', |
| activeTab === tab.id |
| ? 'text-[var(--foreground)]' |
| : 'text-[var(--foreground)]/60 hover:text-[var(--foreground)]/80' |
| )} |
| > |
| {activeTab === tab.id && ( |
| <motion.div |
| layoutId="activeTab" |
| className="absolute inset-0 glass-elevated rounded-xl" |
| transition={{ |
| type: 'spring', |
| stiffness: 500, |
| damping: 35, |
| }} |
| /> |
| )} |
| <span className="relative z-10">{tab.icon}</span> |
| <span className="relative z-10 hidden sm:inline">{tab.label}</span> |
| </button> |
| ))} |
| </nav> |
| ); |
| } |
|
|
| |
| export function MobileTabBar() { |
| const activeTab = useActiveTab(); |
| const setActiveTab = useAppStore((state) => state.setActiveTab); |
|
|
| return ( |
| <nav |
| className={cn( |
| 'fixed bottom-0 left-0 right-0 z-50', |
| 'glass-elevated', |
| 'border-t border-[var(--glass-border-subtle)]', |
| 'md:hidden', |
| 'pb-[env(safe-area-inset-bottom)]' |
| )} |
| > |
| <div className="flex items-center justify-around h-16"> |
| {tabs.map((tab) => ( |
| <button |
| key={tab.id} |
| onClick={() => setActiveTab(tab.id)} |
| className={cn( |
| 'relative flex flex-col items-center gap-1 px-6 py-2', |
| 'text-xs font-medium', |
| 'transition-colors duration-200', |
| activeTab === tab.id |
| ? 'text-[var(--suggestion-accent)]' |
| : 'text-[var(--foreground)]/60' |
| )} |
| > |
| <span className="text-xl">{tab.icon}</span> |
| <span>{tab.label.split(' ')[0]}</span> |
| {activeTab === tab.id && ( |
| <motion.div |
| layoutId="mobileActiveTab" |
| className="absolute -bottom-1 left-1/2 -translate-x-1/2 w-8 h-1 rounded-full bg-[var(--suggestion-accent)]" |
| transition={{ |
| type: 'spring', |
| stiffness: 500, |
| damping: 35, |
| }} |
| /> |
| )} |
| </button> |
| ))} |
| </div> |
| </nav> |
| ); |
| } |
|
|