/** * The single icon map for the whole app. * * Astryx resolves exactly 26 SEMANTIC names through the theme's icon registry * (``). Everything else must be passed as a component. * Rather than let feature files import from lucide-react ad hoc — which is how * an icon set drifts — every non-semantic glyph is named once, here. * * Rule: `` for anything in SEMANTIC_ICONS, * `` for everything else. */ import { ArrowRight, BadgeCheck, Barcode, Bell, BookOpen, Building2, CalendarClock, CalendarDays, Camera, ChartLine, ChevronsUpDown, CircleAlert, CircleHelp, Clock, Code, Coins, Columns3, CreditCard, Disc3, DoorOpen, Download, Expand, Footprints, Gift, Globe, History, IndianRupee, Info, Keyboard, LayoutDashboard, Lightbulb, Lock, LogOut, Maximize2, Megaphone, Menu, MessageSquare, Headphones, LayoutGrid, Laptop, List, Microwave, Refrigerator, Smartphone, Snowflake, Star, Tablet, Tv, WashingMachine, Watch, Package, Mic, Minimize2, PanelLeftClose, PanelLeftOpen, PanelRightClose, PanelRightOpen, Paperclip, Plus, Percent, Plug, Route, RotateCw, Send, Settings, ShieldCheck, Shrink, ShoppingBag, ShoppingCart, Sliders, Square, SquarePen, ScanBarcode, Sparkles, Store, Tag, Target, Ticket, TrendingDown, TrendingUp, Trophy, Sun, Moon, User, UserCheck, UserPlus, Users, UserX, } from 'lucide-react'; import type {IconType} from '@astryxdesign/core/Icon'; export const ICONS = { // Expansion & Resize expand: Expand, restore: Shrink, fullscreen: Maximize2, minimize: Minimize2, // Navigation dashboard: LayoutDashboard, commerce: ShoppingCart, stores: Store, products: Package, // Product catalogue — one glyph per product kind, plus the view toggle. productTv: Tv, productMobile: Smartphone, productLaptop: Laptop, productTablet: Tablet, productFridge: Refrigerator, productWasher: WashingMachine, productAc: Snowflake, productMicrowave: Microwave, productAudio: Headphones, productWearable: Watch, rating: Star, viewGrid: LayoutGrid, viewList: List, barcode: Barcode, scanBarcode: ScanBarcode, tag: Tag, cameras: Camera, lyts: Gift, staff: Users, settings: Settings, // Settings Modules business: Building2, roles: ShieldCheck, integrations: Plug, api: Code, security: Lock, preferences: Sliders, // Dashboard metrics visitors: Footprints, purchases: ShoppingCart, revenue: IndianRupee, activeRewards: BadgeCheck, conversion: Percent, lyt: Coins, // Customer activities. // // One glyph per activity in the loyalty ecosystem. Named with an `activity` // prefix rather than folded into the metric block above because several // collide with an existing concept and must not be merged with it: a `visit` // is a customer walking in, which is not the `visitors` KPI; `activityShop` // is the shop ACTIVITY, while `purchases` is the transaction metric. activityWalk: Footprints, activityVisit: DoorOpen, activitySelfie: Camera, activitySpin: Disc3, activityScratch: Ticket, activityBrand: Megaphone, activityChallenge: Target, activityFriend: UserPlus, activityShop: ShoppingBag, activityEvent: CalendarDays, // Store intelligence journey: Route, campaign: Megaphone, insight: Lightbulb, arrowRight: ArrowRight, // Dashboard controls compare: Columns3, // Trend / delta up: TrendingUp, down: TrendingDown, // Loyaly AI ai: Sparkles, analytics: ChartLine, chat: MessageSquare, mic: Mic, send: Send, panelClose: PanelRightClose, panelOpen: PanelRightOpen, newChat: SquarePen, reload: RotateCw, history: History, attach: Paperclip, plus: Plus, stop: Square, // Shell // One control drives the sidebar in all three states, so it needs all three // glyphs: the hamburger below the drawer breakpoint, and the panel pair // above it. PanelLeft*, not PanelRight* — those belong to the Loyaly AI rail // on the opposite edge, and pointing both controls the same way would make // the header read as two buttons for one panel. menu: Menu, sidebarOpen: PanelLeftOpen, sidebarClose: PanelLeftClose, notifications: Bell, sun: Sun, moon: Moon, // Account menu language: Globe, help: CircleHelp, billing: CreditCard, download: Download, profile: User, signOut: LogOut, switcher: ChevronsUpDown, // Help panel. `info` duplicates a semantic name on purpose: the account menu // config types its icons as components, so it cannot pass the string form. docs: BookOpen, keyboard: Keyboard, info: Info, sessions: Clock, // Staff / rewards present: UserCheck, absent: UserX, late: Clock, leaderboard: Trophy, expiry: CalendarClock, alert: CircleAlert, } satisfies Record; export type IconKey = keyof typeof ICONS; /** * The names that resolve through the theme registry. Prefer these over an * equivalent lucide import so the icon follows the theme. */ export const SEMANTIC_ICONS = [ 'close', 'chevronDown', 'chevronLeft', 'chevronRight', 'check', 'success', 'error', 'warning', 'info', 'calendar', 'clock', 'externalLink', 'menu', 'moreHorizontal', 'search', 'arrowUp', 'arrowDown', 'arrowsUpDown', 'funnel', 'eyeSlash', 'viewColumns', 'copy', 'checkDouble', 'wrench', 'stop', 'microphone', ] as const;