PageSourceSearch

https://railsblocks.com/assets/lucide_callout_icons.js

js railsblocks.com collected 2026-09-25 20:24:38 UTC 3,071 bytes, 173 lines download raw bytes

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.