gsxui

Icon

Gallery

House
Settings
User
Users
Mail
Search
Heart
Star
Trash2
Copy
Plus
Minus
Check
X
ChevronDown
ArrowRight
Bell
Calendar
Camera
Clock
Cloud
Download
Upload
Pencil
ExternalLink
Eye
File
Folder
Globe
Image
Info
Link
Lock
LogOut
Menu
MessageCircle
Moon
Sun
Play
ShoppingCart
// Package icon holds the site's example gsx components for ui/icon.
package icon

import (
	"github.com/gsxhq/gsx"
	uiicon "github.com/gsxhq/gsxui/ui/icon"
)

// namedIcon pairs a display label with one of the 1,748 tag-callable
// Lucide icon components ui/icon/icon_defs.go generates.
type namedIcon struct {
	Name   string
	Render func(...gsx.Attr) gsx.Node
}

// popular is a hand-picked slice of well-known icons โ€” the full set lives
// in ui/icon/icon_defs.go; search isn't in scope for v1.
var popular = []namedIcon{
	{"House", uiicon.House}, {"Settings", uiicon.Settings}, {"User", uiicon.User},
	{"Users", uiicon.Users}, {"Mail", uiicon.Mail}, {"Search", uiicon.Search},
	{"Heart", uiicon.Heart}, {"Star", uiicon.Star}, {"Trash2", uiicon.Trash2},
	{"Copy", uiicon.Copy}, {"Plus", uiicon.Plus}, {"Minus", uiicon.Minus},
	{"Check", uiicon.Check}, {"X", uiicon.X}, {"ChevronDown", uiicon.ChevronDown},
	{"ArrowRight", uiicon.ArrowRight}, {"Bell", uiicon.Bell}, {"Calendar", uiicon.Calendar},
	{"Camera", uiicon.Camera}, {"Clock", uiicon.Clock}, {"Cloud", uiicon.Cloud},
	{"Download", uiicon.Download}, {"Upload", uiicon.Upload}, {"Pencil", uiicon.Pencil},
	{"ExternalLink", uiicon.ExternalLink}, {"Eye", uiicon.Eye}, {"File", uiicon.File},
	{"Folder", uiicon.Folder}, {"Globe", uiicon.Globe}, {"Image", uiicon.Image},
	{"Info", uiicon.Info}, {"Link", uiicon.Link}, {"Lock", uiicon.Lock},
	{"LogOut", uiicon.LogOut}, {"Menu", uiicon.Menu}, {"MessageCircle", uiicon.MessageCircle},
	{"Moon", uiicon.Moon}, {"Sun", uiicon.Sun}, {"Play", uiicon.Play},
	{"ShoppingCart", uiicon.ShoppingCart},
}

// Gallery renders 40 well-known icons in a static grid โ€” 1,748 icons ship
// in total.
component Gallery() {
	<div class="grid grid-cols-4 gap-6 sm:grid-cols-5 md:grid-cols-8">
		{ for _, ic := range popular {
			<div class="flex flex-col items-center gap-2">
				{ ic.Render(gsx.Attr{Key: "class", Value: "size-5"}) }
				<span class="text-xs text-muted-foreground">{ ic.Name }</span>
			</div>
		} }
	</div>
}

Sizes and color

package icon

import uiicon "github.com/gsxhq/gsxui/ui/icon"

// Sizes shows icons take the same class-merge story as every other
// component: size-* controls the box, text-* tints the stroke (stroke
// uses currentColor).
component Sizes() {
	<div class="flex items-center gap-4">
		<uiicon.Star class="size-4"/>
		<uiicon.Star class="size-6"/>
		<uiicon.Star class="size-8 text-primary"/>
		<uiicon.Star class="size-10 text-destructive"/>
	</div>
}