// Navigation icons (D-11). The registry stores lucide names; ported Winter // plugins may still send icon-* names, which map onto lucide equivalents. // Named imports only: a namespace import would bundle every lucide icon. import type { Component } from 'vue' import { Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpRight, Bell, Book, Bookmark, Box, Briefcase, Building, Calendar, Camera, CassetteTape, ChartBar, Check, ChevronDown, ChevronLeft, ChevronRight, Circle, CircleAlert, CircleCheck, CircleQuestionMark, ClipboardList, Clock, Cloud, Code, Copy, CreditCard, Database, Disc, Disc3, Download, ExternalLink, File, FileText, Files, Flag, Folder, Funnel, Gauge, Globe, GraduationCap, Heart, House, Image, Inbox, Info, Key, Languages, LayoutGrid, Leaf, Library, LifeBuoy, Link, List, ListOrdered, Lock, LogOut, Mail, MapPin, MessageCircle, MicVocal, Minus, Network, Palette, PanelLeftClose, PanelLeftOpen, Paperclip, Pause, Pencil, Phone, Play, Plus, Puzzle, RefreshCw, Search, SearchX, Settings, ShieldCheck, ShoppingCart, Star, Sun, Table, Tags, Trash2, TriangleAlert, Trophy, Upload, User, UserMinus, UserPlus, Users, UsersRound, WandSparkles, Wrench, X, } from '@lucide/vue' export const icons: Readonly> = { archive: Archive, 'arrow-down': ArrowDown, 'arrow-left': ArrowLeft, 'arrow-right': ArrowRight, 'arrow-up': ArrowUp, 'arrow-up-right': ArrowUpRight, bell: Bell, book: Book, bookmark: Bookmark, box: Box, briefcase: Briefcase, building: Building, calendar: Calendar, camera: Camera, 'cassette-tape': CassetteTape, 'chart-bar': ChartBar, check: Check, 'chevron-down': ChevronDown, 'chevron-left': ChevronLeft, 'chevron-right': ChevronRight, circle: Circle, 'circle-alert': CircleAlert, 'circle-check': CircleCheck, 'circle-question-mark': CircleQuestionMark, 'clipboard-list': ClipboardList, clock: Clock, cloud: Cloud, code: Code, copy: Copy, 'credit-card': CreditCard, database: Database, disc: Disc, 'disc-3': Disc3, download: Download, 'external-link': ExternalLink, file: File, 'file-text': FileText, files: Files, flag: Flag, folder: Folder, funnel: Funnel, gauge: Gauge, globe: Globe, 'graduation-cap': GraduationCap, heart: Heart, house: House, image: Image, inbox: Inbox, info: Info, key: Key, languages: Languages, 'layout-grid': LayoutGrid, leaf: Leaf, library: Library, 'life-buoy': LifeBuoy, link: Link, list: List, 'list-ordered': ListOrdered, lock: Lock, 'log-out': LogOut, mail: Mail, 'map-pin': MapPin, 'message-circle': MessageCircle, 'mic-vocal': MicVocal, minus: Minus, network: Network, palette: Palette, 'panel-left-close': PanelLeftClose, 'panel-left-open': PanelLeftOpen, paperclip: Paperclip, pause: Pause, pencil: Pencil, phone: Phone, play: Play, plus: Plus, puzzle: Puzzle, 'refresh-cw': RefreshCw, search: Search, 'search-x': SearchX, settings: Settings, 'shield-check': ShieldCheck, 'shopping-cart': ShoppingCart, star: Star, sun: Sun, table: Table, tags: Tags, 'trash-2': Trash2, 'triangle-alert': TriangleAlert, trophy: Trophy, upload: Upload, user: User, 'user-minus': UserMinus, 'user-plus': UserPlus, users: Users, 'users-round': UsersRound, 'wand-sparkles': WandSparkles, wrench: Wrench, x: X, } /** Winter backend icon classes mapped to lucide names. */ export const winterIcons: Readonly> = { 'icon-archive': 'archive', 'icon-bar-chart': 'chart-bar', 'icon-bell': 'bell', 'icon-book': 'book', 'icon-bookmark': 'bookmark', 'icon-briefcase': 'briefcase', 'icon-building': 'building', 'icon-calendar': 'calendar', 'icon-camera': 'camera', 'icon-check': 'check', 'icon-check-circle': 'circle-check', 'icon-circle': 'circle', 'icon-clock': 'clock', 'icon-clock-o': 'clock', 'icon-cloud': 'cloud', 'icon-code': 'code', 'icon-cog': 'settings', 'icon-cogs': 'settings', 'icon-comment': 'message-circle', 'icon-comments': 'message-circle', 'icon-comments-o': 'message-circle', 'icon-copy': 'copy', 'icon-credit-card': 'credit-card', 'icon-cube': 'box', 'icon-dashboard': 'gauge', 'icon-database': 'database', 'icon-download': 'download', 'icon-edit': 'pencil', 'icon-envelope': 'mail', 'icon-envelope-o': 'mail', 'icon-exclamation-triangle': 'triangle-alert', 'icon-external-link': 'external-link', 'icon-file': 'file', 'icon-file-o': 'file', 'icon-file-text': 'file-text', 'icon-file-text-o': 'file-text', 'icon-files-o': 'files', 'icon-filter': 'funnel', 'icon-flag': 'flag', 'icon-folder': 'folder', 'icon-folder-o': 'folder', 'icon-globe': 'globe', 'icon-graduation-cap': 'graduation-cap', 'icon-group': 'users', 'icon-heart': 'heart', 'icon-home': 'house', 'icon-inbox': 'inbox', 'icon-info-circle': 'info', 'icon-key': 'key', 'icon-language': 'languages', 'icon-leaf': 'leaf', 'icon-life-ring': 'life-buoy', 'icon-link': 'link', 'icon-list': 'list', 'icon-list-alt': 'clipboard-list', 'icon-list-ol': 'list-ordered', 'icon-list-ul': 'list', 'icon-lock': 'lock', 'icon-magic': 'wand-sparkles', 'icon-map-marker': 'map-pin', 'icon-minus': 'minus', 'icon-paperclip': 'paperclip', 'icon-pause': 'pause', 'icon-pencil': 'pencil', 'icon-phone': 'phone', 'icon-photo': 'image', 'icon-picture-o': 'image', 'icon-play': 'play', 'icon-plus': 'plus', 'icon-question': 'circle-question-mark', 'icon-question-circle': 'circle-question-mark', 'icon-refresh': 'refresh-cw', 'icon-search': 'search', 'icon-shopping-cart': 'shopping-cart', 'icon-sign-out': 'log-out', 'icon-sitemap': 'network', 'icon-star': 'star', 'icon-table': 'table', 'icon-tachometer': 'gauge', 'icon-tags': 'tags', 'icon-th': 'layout-grid', 'icon-th-large': 'layout-grid', 'icon-times': 'x', 'icon-trash': 'trash-2', 'icon-trash-o': 'trash-2', 'icon-trophy': 'trophy', 'icon-upload': 'upload', 'icon-user': 'user', 'icon-users': 'users', 'icon-warning': 'triangle-alert', 'icon-wrench': 'wrench', } /** Brand icon for names neither lucide map knows. */ export const fallbackIcon: Component = Sun /** An own entry of a map: names come from the server, so inherited object * members such as "constructor" or "toString" never count as icons. */ function own(map: Readonly>, key: string): T | undefined { return Object.hasOwn(map, key) ? map[key] : undefined } export function iconFor(name: string | null | undefined): Component { if (!name) { return fallbackIcon } const key = name.trim() return own(icons, key) ?? own(icons, own(winterIcons, key) ?? '') ?? fallbackIcon }