1import { createIcons, icons } from "lucide"; 2 3const FEATURED_ICON_NAMES = [ 4 "Hash", 5 "Accessibility", 6 "Activity", 7 "AlarmClock", 8 "AlertCircle", 9 "AlertTriangle", 10 "Archive", 11 "ArrowDown", 12 "ArrowLeft", 13 "ArrowRight", 14 "ArrowUp", 15 "AtSign", 16 "Award", 17 "BadgeCheck", 18 "Ban", 19 "Bell", 20 "Bookmark", 21 "Bot", 22 "Box", 23 "Brain", 24 "Briefcase", 25 "Calendar", 26 "Camera", 27 "ChartNoAxesColumn", 28 "Check", 29 "CircleCheck", 30 "CircleDashed", 31 "CircleDot", 32 "CircleHelp", 33 "CirclePlus", 34 "Clipboard", 35 "Clock", 36 "Cloud", 37 "Code", 38 "Cog", 39 "Compass", 40 "Copy", 41 "CreditCard", 42 "Database", 43 "Download", 44 "Eye", 45 "File", 46 "FileText", 47 "Flag", 48 "Folder", 49 "Gift", 50 "Globe", 51 "Goal", 52 "GraduationCap", 53 "Hammer", 54 "Heart", 55 "Home", 56 "Image", 57 "Inbox", 58 "Info", 59 "Key", 60 "Landmark", 61 "Layers", 62 "LayoutGrid", 63 "Lightbulb", 64 "Link", 65 "ListChecks", 66 "Lock", 67 "Mail", 68 "Map", 69 "Megaphone", 70 "MessageCircle", 71 "Monitor", 72 "MousePointerClick", 73 "Package", 74 "Paperclip", 75 "PenLine", 76 "Pin", 77 "Plane", 78 "Plug", 79 "Plus", 80 "Rocket", 81 "Search", 82 "Send", 83 "Settings", 84 "Shield", 85 "Sparkles", 86 "Star", 87 "Target", 88 "Terminal", 89 "ThumbsUp", 90 "Timer", 91 "Trash", 92 "Trophy", 93 "Upload", 94 "User", 95 "Users", 96 "Wallet", 97 "Workflow", 98 "Wrench", 99 "X", 100 "Zap", 101]; 102 103const iconIndex = Object.keys(icons) 104 .map((name) => { 105 const id = toKebabCase(name); 106 return { 107 id, 108 label: labelFor(name), 109 name, 110 rank: FEATURED_ICON_NAMES.indexOf(name), 111 search: `${id} ${labelFor(name)}`.toLowerCase(), 112 }; 113 }) 114 .sort((a, b) => { 115 if (a.rank !== -1 && b.rank !== -1) return a.rank - b.rank; 116 if (a.rank !== -1) return -1; 117 if (b.rank !== -1) return 1; 118 return a.label.localeCompare(b.label); 119 }); 120 121const svgCache = new Map(); 122 123function toKebabCase(name) { 124 return name 125 .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2") 126 .replace(/([a-z0-9])([A-Z])/g, "$1-$2") 127 .toLowerCase(); 128} 129 130function labelFor(name) { 131 return name 132 .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") 133 .replace(/([a-z0-9])([A-Z])/g, "$1 $2") 134 .replace(/\b\w/g, (letter) => letter.toUpperCase()); 135} 136 137function svgFor(id) { 138 if (svgCache.has(id)) return svgCache.get(id); 139 140 const container = document.createElement("span"); 141 const icon = document.createElement("i"); 142 icon.dataset.lucide = id; 143 container.append(icon); 144 145 createIcons({ 146 icons, 147 root: container, 148 attrs: { 149 "aria-hidden": "true", 150 focusable: "false", 151 "stroke-width": "2", 152 }, 153 }); 154 155 const svg = container.firstElementChild?.outerHTML || ""; 156 svgCache.set(id, svg); 157 return svg; 158} 159 160function search(query = "", limit = 240) { 161 const terms = query.trim().toLowerCase().split(/\s+/).filter(Boolean); 162 const matches = terms.length 163 ? iconIndex.filter((icon) => terms.every((term) => icon.search.includes(term))) 164 : iconIndex; 165 166 return matches.slice(0, limit).map((icon) => ({ 167 id: icon.id, 168 label: icon.label, 169 svg: svgFor(icon.id), 170 })); 171} 172 173window.LexxyLucideCalloutIcons = { search, svgFor };
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.