"use client" import { Button } from "@/components/ui/button" import { Card } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { cn } from "@/lib/utils" import { Separator } from "@radix-ui/react-dropdown-menu" import { motion, useAnimation, useInView } from "framer-motion" import { Car, Code, Coffee, DollarSign, ExternalLink, Eye, GitFork, Heart, Plus, Search, Server, Share2, Sparkles, Star, TrendingUp, } from "lucide-react" import Link from "next/link" import { useEffect, useRef, useState } from "react" import { AuroraText } from "./magicui/aurora-text" import { InteractiveHoverButton } from "./magicui/interactive-hover-button" import { NumberTicker } from "./magicui/number-ticker" import { HoverCard, HoverCardContent, HoverCardTrigger } from "./ui/hover-card" interface IconCardProps { name: string imageUrl: string } function IconCard({ name, imageUrl }: IconCardProps) { return (
{name}

{name}

) } function ElegantShape({ className, delay = 0, width = 400, height = 100, rotate = 0, gradient = "from-rose-500/[0.5]", mobileWidth, mobileHeight, }: { className?: string delay?: number width?: number height?: number rotate?: number gradient?: string mobileWidth?: number mobileHeight?: number }) { const controls = useAnimation() const [isMobile, setIsMobile] = useState(false) const ref = useRef(null) const isInView = useInView(ref, { once: true, amount: 0.1 }) useEffect(() => { const checkMobile = () => { setIsMobile(window.innerWidth < 768) } checkMobile() window.addEventListener("resize", checkMobile) return () => window.removeEventListener("resize", checkMobile) }, []) useEffect(() => { if (isInView) { controls.start({ opacity: 1, y: 0, rotate: rotate, transition: { type: "spring", stiffness: 50, damping: 20, duration: 1.8, delay, ease: [0.23, 0.86, 0.39, 0.96], opacity: { duration: 1.2 }, }, }) } }, [controls, delay, isInView, rotate]) return (
) } export function HeroSection({ totalIcons, stars }: { totalIcons: number; stars: number }) { const [searchQuery, setSearchQuery] = useState("") return (

Your definitive source for
dashboard icons

A collection of{" "} curated icons for services, applications and tools, designed specifically for dashboards and app directories.

Browse icons
) } export default function GiveUsAStarButton({ stars }: { stars: string | number }) { return (

What is Starring?

Starring a repository on GitHub is like bookmarking it.
It helps you keep track of projects you find interesting and shows appreciation to the project maintainers.
You can star a repository by clicking the 'Star' button, usually found in the top-right corner of the repository's page on GitHub.

How your star helps us:
  • Increases our visibility in GitHub search results
  • Attracts more contributors to improve the project
  • Encourages more forks and community involvement
  • Grow the library with more icons
) } export function GiveUsLoveButton() { return (

Support us without spending

We keep our service free through minimal, non-intrusive ads.

Please consider disabling your ad-blocker

We only show ads on the icon detail pages (/icons/{"{id}"}) and never on the main site.

Note: If you use a network-wide ad blocker (like Pi-hole or AdGuard Home), you may need to whitelist "carbonads.net" specifically.

Our Privacy Promise:
  • We don't track your browsing habits
  • We don't sell your personal data
  • We only use essential cookies
Spread the word

Don't want to disable your ad blocker? You can still help us by sharing our website with others who might find it useful.

) } export function GiveUsMoneyButton() { const openCollectiveUrl = "https://opencollective.com/homarr" return (

Support our open source work

Your donations help us maintain and improve our free, open-source project.

What is OpenCollective?

OpenCollective is a transparent funding platform for open source projects. All donations and expenses are publicly visible, ensuring complete transparency in how funds are used.

Where your money goes:
  • Hosting and infrastructure costs
  • Development time for new features
  • Coffee to fuel late-night coding sessions
  • A new Lamborghini (although we'd love to)
) } interface SearchInputProps { searchQuery: string setSearchQuery: React.Dispatch> totalIcons: number } function SearchInput({ searchQuery, setSearchQuery, totalIcons }: SearchInputProps) { return (
setSearchQuery(e.target.value)} /> ) }