"use client" import { useState } from "react" import { SectionHeading } from "@/components/ui/section-heading" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Badge } from "@/components/ui/badge" // Import comprehensive Lucide React icons import { Home, Menu, Search, Settings, User, Users, UserPlus, UserMinus, UserCheck, UserX, ChevronLeft, ChevronRight, ChevronUp, ChevronDown, ChevronFirst, ChevronLast, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, ArrowUpRight, ArrowDownRight, ArrowUpLeft, ArrowDownLeft, MoreHorizontal, MoreVertical, Plus, Minus, X, Check, CheckCircle, XCircle, Mail, MailOpen, Send, MessageCircle, MessageSquare, Phone, PhoneCall, PhoneIncoming, PhoneOutgoing, Bell, BellRing, BellOff, Share, Share2, Link, Link2, ExternalLink, ImageIcon, Images, Video, Music, File, FileText, FileImage, FileVideo, FileAudio, Folder, FolderOpen, FolderPlus, Download, Upload, Camera, Mic, MicOff, Edit, Edit2, Edit3, Trash, Trash2, Copy, Save, Undo, Redo, RefreshCw, RotateCcw, RotateCw, Shuffle, Repeat, Repeat1, AlertCircle, AlertTriangle, Info, HelpCircle, CheckCircle2, Loader, Loader2, Zap, Star, Heart, ThumbsUp, ThumbsDown, Flag, Bookmark, Lock, Unlock, Key, Shield, ShieldCheck, ShieldAlert, Eye, EyeOff, Fingerprint, Clock, Calendar, CalendarDays, Timer, AlarmClock, Hourglass, ShoppingCart, ShoppingBag, CreditCard, DollarSign, Receipt, Tag, Tags, Gift, Smartphone, Tablet, Laptop, Monitor, Tv, Headphones, Speaker, Wifi, WifiOff, Bluetooth, Usb, HardDrive, Server, Database, Cloud, CloudDownload, CloudUpload, Car, Truck, Plane, Train, Ship, Bike, Bus, Fuel, MapPin, Map, Navigation, Navigation2, Sun, Moon, CloudRain, CloudSnow, Umbrella, Rainbow, Users2, UserCircle, Crown, Award, Trophy, Target, Gamepad2, Dice1, Dice6, Briefcase, Building, Building2, Store, Factory, Banknote, TrendingUp, TrendingDown, BarChart, BarChart2, BarChart3, PieChart, LineChart, Activity, Wrench, Hammer, Paintbrush, Scissors, Ruler, Calculator, Compass, Flashlight, Magnet, Thermometer, Scale, Gauge, Coffee, Wine, Beer, Pizza, Apple, Cherry, Grape, IceCream, Cake, TreePine, Flower, Leaf, Bug, Fish, Bird, Cat, Dog, Rabbit, Turtle, Layout, LayoutGrid, LayoutList, Columns, Rows, Square, Circle, Triangle, AlignLeft, AlignCenter, AlignRight, AlignJustify, Bold, Italic, Underline, Code, Code2, Terminal, GitBranch, GitCommit, GitMerge, GitPullRequest, Package, Package2, Boxes, Component, Layers, Puzzle, MoveUp, MoveDown, MoveLeft, MoveRight, Move, Move3d, MousePointer, MousePointer2, Play, Pause, CircleStopIcon as Stop, SkipBack, SkipForward, FastForward, Rewind, Volume, Volume1, Volume2, VolumeX, Globe, Globe2, Battery, BatteryLow, Signal, Book, BookOpen, Library, GraduationCap, School, Stethoscope, Pill, Cross, Anchor, Feather, Sidebar, PanelLeft, PanelRight, PanelTop, PanelBottom, Maximize, Minimize, Maximize2, Minimize2, PictureInPicture, Scan, QrCode, Barcode, AtSign, Hash, Percent, Quote, Filter, FilterX, ArrowUpDown, ZoomIn, ZoomOut, Focus, Crosshair, Locate, LocateFixed, Verified, Pipette, Eraser, Pen, PenTool, Brush, Palette, Contrast, Lightbulb, Handshake, Stamp, Medal, Ribbon, } from "lucide-react" // Define categorized icon collections const ICON_CATEGORIES = { "Navigation & UI": { icons: [ "Home", "Menu", "Search", "Settings", "ChevronLeft", "ChevronRight", "ChevronUp", "ChevronDown", "ChevronFirst", "ChevronLast", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "ArrowUpRight", "ArrowDownRight", "ArrowUpLeft", "ArrowDownLeft", "MoreHorizontal", "MoreVertical", "Plus", "Minus", "X", "Check", ], color: "bg-blue-500/10 text-blue-700 dark:text-blue-300", }, "Users & People": { icons: ["User", "Users", "UserPlus", "UserMinus", "UserCheck", "UserX", "Users2", "UserCircle", "Crown"], color: "bg-purple-500/10 text-purple-700 dark:text-purple-300", }, Communication: { icons: [ "Mail", "MailOpen", "Send", "MessageCircle", "MessageSquare", "Phone", "PhoneCall", "PhoneIncoming", "PhoneOutgoing", "Bell", "BellRing", "BellOff", "Share", "Share2", "Link", "Link2", "ExternalLink", "AtSign", ], color: "bg-green-500/10 text-green-700 dark:text-green-300", }, "Media & Files": { icons: [ "ImageIcon", "Images", "Video", "Music", "File", "FileText", "FileImage", "FileVideo", "FileAudio", "Folder", "FolderOpen", "FolderPlus", "Download", "Upload", "Camera", "Mic", "MicOff", ], color: "bg-orange-500/10 text-orange-700 dark:text-orange-300", }, "Actions & Editing": { icons: [ "Edit", "Edit2", "Edit3", "Trash", "Trash2", "Copy", "Save", "Undo", "Redo", "RefreshCw", "RotateCcw", "RotateCw", "Shuffle", "Repeat", "Repeat1", ], color: "bg-red-500/10 text-red-700 dark:text-red-300", }, "Status & Feedback": { icons: [ "AlertCircle", "AlertTriangle", "Info", "HelpCircle", "CheckCircle", "CheckCircle2", "XCircle", "Loader", "Loader2", "Zap", "Star", "Heart", "ThumbsUp", "ThumbsDown", "Flag", "Bookmark", ], color: "bg-yellow-500/10 text-yellow-700 dark:text-yellow-300", }, } // Create a flat mapping of all icons const LUCIDE_ICONS = { Home, Menu, Search, Settings, User, Users, UserPlus, UserMinus, UserCheck, UserX, ChevronLeft, ChevronRight, ChevronUp, ChevronDown, ChevronFirst, ChevronLast, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, ArrowUpRight, ArrowDownRight, ArrowUpLeft, ArrowDownLeft, MoreHorizontal, MoreVertical, Plus, Minus, X, Check, CheckCircle, XCircle, Mail, MailOpen, Send, MessageCircle, MessageSquare, Phone, PhoneCall, PhoneIncoming, PhoneOutgoing, Bell, BellRing, BellOff, Share, Share2, Link, Link2, ExternalLink, ImageIcon, Images, Video, Music, File, FileText, FileImage, FileVideo, FileAudio, Folder, FolderOpen, FolderPlus, Download, Upload, Camera, Mic, MicOff, Edit, Edit2, Edit3, Trash, Trash2, Copy, Save, Undo, Redo, RefreshCw, RotateCcw, RotateCw, Shuffle, Repeat, Repeat1, AlertCircle, AlertTriangle, Info, HelpCircle, CheckCircle2, Loader, Loader2, Zap, Star, Heart, ThumbsUp, ThumbsDown, Flag, Bookmark, Lock, Unlock, Key, Shield, ShieldCheck, ShieldAlert, Eye, EyeOff, Fingerprint, Clock, Calendar, CalendarDays, Timer, AlarmClock, Hourglass, ShoppingCart, ShoppingBag, CreditCard, DollarSign, Receipt, Tag, Tags, Gift, Smartphone, Tablet, Laptop, Monitor, Tv, Headphones, Speaker, Wifi, WifiOff, Bluetooth, Usb, HardDrive, Server, Database, Cloud, CloudDownload, CloudUpload, Car, Truck, Plane, Train, Ship, Bike, Bus, Fuel, MapPin, Map, Navigation, Navigation2, Sun, Moon, CloudRain, CloudSnow, Umbrella, Rainbow, Users2, UserCircle, Crown, Award, Trophy, Target, Gamepad2, Dice1, Dice6, Briefcase, Building, Building2, Store, Factory, Banknote, TrendingUp, TrendingDown, BarChart, BarChart2, BarChart3, PieChart, LineChart, Activity, Wrench, Hammer, Paintbrush, Scissors, Ruler, Calculator, Compass, Flashlight, Magnet, Thermometer, Scale, Gauge, Coffee, Wine, Beer, Pizza, Apple, Cherry, Grape, IceCream, Cake, TreePine, Flower, Leaf, Bug, Fish, Bird, Cat, Dog, Rabbit, Turtle, Layout, LayoutGrid, LayoutList, Columns, Rows, Square, Circle, Triangle, AlignLeft, AlignCenter, AlignRight, AlignJustify, Bold, Italic, Underline, Code, Code2, Terminal, GitBranch, GitCommit, GitMerge, GitPullRequest, Package, Package2, Boxes, Component, Layers, Puzzle, MoveUp, MoveDown, MoveLeft, MoveRight, Move, Move3d, MousePointer, MousePointer2, Play, Pause, Stop, SkipBack, SkipForward, FastForward, Rewind, Volume, Volume1, Volume2, VolumeX, Globe, Globe2, Battery, BatteryLow, Signal, Book, BookOpen, Library, GraduationCap, School, Stethoscope, Pill, Cross, Anchor, Feather, Sidebar, PanelLeft, PanelRight, PanelTop, PanelBottom, Maximize, Minimize, Maximize2, Minimize2, PictureInPicture, Scan, QrCode, Barcode, AtSign, Hash, Percent, Quote, Filter, FilterX, ArrowUpDown, ZoomIn, ZoomOut, Focus, Crosshair, Locate, LocateFixed, Verified, Pipette, Eraser, Pen, PenTool, Brush, Palette, Contrast, Lightbulb, Handshake, Stamp, Medal, Ribbon, } // Available icon sizes const ICON_SIZES = [ { size: 16, label: "16px (sm)" }, { size: 20, label: "20px (md)" }, { size: 24, label: "24px (lg)" }, { size: 32, label: "32px (xl)" }, { size: 40, label: "40px (2xl)" }, { size: 48, label: "48px (3xl)" }, ] // Convert PascalCase to kebab-case for display const formatIconName = (name: string) => { return name .replace(/([A-Z])/g, "-$1") .toLowerCase() .replace(/^-/, "") } // Convert PascalCase to readable title const formatIconTitle = (name: string) => { return name .replace(/([A-Z])/g, " $1") .replace(/^./, (str) => str.toUpperCase()) .trim() } // Get all icon names for search const getAllIconNames = () => { const allIcons: string[] = [] Object.values(ICON_CATEGORIES).forEach((category) => { allIcons.push(...category.icons) }) return allIcons } const allIconNames = getAllIconNames() export function IconographySection() { const [searchTerm, setSearchTerm] = useState("") const [selectedIcon, setSelectedIcon] = useState(null) const [selectedSize, setSelectedSize] = useState(24) const [copied, setCopied] = useState(false) // Filter icons based on search term const getFilteredCategories = () => { if (!searchTerm) return ICON_CATEGORIES const filtered: typeof ICON_CATEGORIES = {} Object.entries(ICON_CATEGORIES).forEach(([categoryName, category]) => { const matchingIcons = category.icons.filter( (iconName) => iconName.toLowerCase().includes(searchTerm.toLowerCase()) || formatIconName(iconName).includes(searchTerm.toLowerCase()) || formatIconTitle(iconName).toLowerCase().includes(searchTerm.toLowerCase()), ) if (matchingIcons.length > 0) { filtered[categoryName] = { ...category, icons: matchingIcons, } } }) return filtered } const filteredCategories = getFilteredCategories() const totalFilteredIcons = Object.values(filteredCategories).reduce((sum, category) => sum + category.icons.length, 0) // Copy icon code to clipboard const copyIconCode = (iconName: string, size: number) => { const importCode = `import { ${iconName} } from "lucide-react"` const componentCode = `<${iconName} size={${size}} />` const fullCode = `${importCode}\n\n${componentCode}` navigator.clipboard.writeText(fullCode) setCopied(true) setTimeout(() => setCopied(false), 2000) } // Copy just the JSX const copyJSXOnly = (iconName: string, size: number) => { const jsxCode = `<${iconName} size={${size}} />` navigator.clipboard.writeText(jsxCode) setCopied(true) setTimeout(() => setCopied(false), 2000) } // Render icon component const renderIcon = (iconName: string, size = 24) => { const IconComponent = LUCIDE_ICONS[iconName as keyof typeof LUCIDE_ICONS] return IconComponent ? : null } return (
{totalFilteredIcons} icons available Lucide React v0.400+
setSearchTerm(e.target.value)} className="w-80" />
Lucide React Icons Click any icon to view sizes and copy the code. Icons are organized by category for easy browsing. {Object.keys(filteredCategories).length > 0 ? (
{Object.entries(filteredCategories).map(([categoryName, category]) => (

{categoryName}

{category.icons.length} icons
{category.icons.map((iconName) => (
setSelectedIcon(iconName)} >
{renderIcon(iconName, 24)}

{iconName}

{formatIconName(iconName)}

{renderIcon(iconName, selectedSize)}

{iconName}

{formatIconTitle(iconName)}

{categoryName}
Available Sizes
{ICON_SIZES.map(({ size, label }) => ( ))}
Usage
// Import
{`import { ${iconName} } from "lucide-react"`}
// Usage
{`<${iconName} size={${selectedSize}} />`}
Lucide React MIT License
))}
))}
) : (

No icons found

Try searching with different keywords like "arrow", "user", or "settings"

)}
) }