Add dedicated AI tab for quick access to AI tools

- Claude, ChatGPT, Perplexity, Phind, Cursor
- v0, Replicate, Hugging Face, Together AI
- Grid layout for easy browsing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-02-02 00:28:09 +00:00
parent 24bbcaecd6
commit ad83449aac

View File

@@ -5,15 +5,28 @@ import { Header, SearchBar, ServiceCard, BookmarkCard, CategorySection, Icon } f
import { usePortal } from '@/lib/PortalContext';
import { categoryLabels, categoryOrder, bookmarkCategoryLabels, bookmarkCategoryOrder, ServiceCategory, BookmarkCategory } from '@/lib/services';
type TabId = 'services' | 'bookmarks' | 'whyrating' | 'settings';
type TabId = 'services' | 'bookmarks' | 'ai' | 'whyrating' | 'settings';
const tabs: { id: TabId; label: string; icon: string }[] = [
{ id: 'whyrating', label: 'WhyRating', icon: 'star' },
{ id: 'services', label: 'Services', icon: 'server' },
{ id: 'ai', label: 'AI', icon: 'bot' },
{ id: 'bookmarks', label: 'Bookmarks', icon: 'external-link' },
{ id: 'settings', label: 'Settings', icon: 'settings' },
];
const aiTools = [
{ name: 'Claude', url: 'https://claude.ai', icon: 'bot', description: 'Anthropic AI assistant' },
{ name: 'ChatGPT', url: 'https://chat.openai.com', icon: 'message-square', description: 'OpenAI chat assistant' },
{ name: 'Perplexity', url: 'https://perplexity.ai', icon: 'search', description: 'AI-powered search' },
{ name: 'Phind', url: 'https://phind.com', icon: 'code', description: 'AI for developers' },
{ name: 'Cursor', url: 'https://cursor.com', icon: 'terminal', description: 'AI-first code editor' },
{ name: 'v0', url: 'https://v0.dev', icon: 'layout', description: 'Vercel AI UI generator' },
{ name: 'Replicate', url: 'https://replicate.com', icon: 'cpu', description: 'ML model hosting' },
{ name: 'Hugging Face', url: 'https://huggingface.co', icon: 'smile', description: 'ML models & datasets' },
{ name: 'Together AI', url: 'https://together.ai', icon: 'users', description: 'Open model inference' },
];
const whyratingLinks = [
{ name: 'Brand Site', url: 'http://brand.nuc.lan', icon: 'palette', description: 'WhyRating brand guidelines and assets' },
{ name: 'Templates Site', url: 'http://templates.nuc.lan', icon: 'layout', description: 'WhyRating email and document templates' },
@@ -143,6 +156,39 @@ export default function Home() {
</>
);
case 'ai':
return (
<div className="max-w-4xl">
<div className="mb-6">
<h2 className="text-xl font-semibold text-slate-900 dark:text-stone-100 mb-2">
AI Tools & Platforms
</h2>
<p className="text-sm text-slate-500 dark:text-stone-500">
Quick access to AI assistants and platforms
</p>
</div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{aiTools.map(tool => (
<a
key={tool.name}
href={tool.url}
target="_blank"
rel="noopener noreferrer"
className="flex items-center gap-3 p-4 bg-white dark:bg-stone-900 rounded-xl border border-slate-100 dark:border-stone-700/50 shadow-sm hover:shadow-md hover:border-slate-200 dark:hover:border-stone-600/50 transition-all"
>
<div className="w-10 h-10 flex items-center justify-center rounded-lg bg-slate-100 dark:bg-stone-800">
<Icon name={tool.icon} size={20} className="text-slate-600 dark:text-stone-400" />
</div>
<div className="flex-1 min-w-0">
<h3 className="font-medium text-slate-900 dark:text-stone-100">{tool.name}</h3>
<p className="text-xs text-slate-500 dark:text-stone-500 truncate">{tool.description}</p>
</div>
</a>
))}
</div>
</div>
);
case 'whyrating':
return (
<div className="max-w-2xl">