NeonCharlie-24 commited on
Commit
9f98cf1
·
unverified ·
1 Parent(s): 98b9d63

Feat/validate lucide icons (#21)

Browse files

* fetch ludice-react icon names from unpkg.com and store in static JSON file.

* Added Lucide icon validation to config models.

* Replaced the unpkg.com icon name fetcher script with a script that reads directly from the local npm package.

multi_llm_chatbot_backend/app/config.py CHANGED
@@ -21,7 +21,23 @@ logger = logging.getLogger(__name__)
21
  # Pydantic models
22
  # ---------------------------------------------------------------------------
23
 
24
- class FeatureConfig(BaseModel):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  title: str = ""
26
  description: str = ""
27
  icon: str = "HelpCircle"
@@ -53,7 +69,7 @@ class LoginConfig(BaseModel):
53
  academic_stages: List[AcademicStage] = []
54
 
55
 
56
- class ExampleCategory(BaseModel):
57
  title: str
58
  icon: str = "BookOpen"
59
  color: str = "#3B82F6"
@@ -66,7 +82,7 @@ class ChatPageConfig(BaseModel):
66
  examples: List[ExampleCategory] = []
67
 
68
 
69
- class PersonaItemConfig(BaseModel):
70
  id: str
71
  name: str
72
  enabled: bool = True
 
21
  # Pydantic models
22
  # ---------------------------------------------------------------------------
23
 
24
+ class _IconValidatorMixin(BaseModel):
25
+ """Validates that the ``icon`` field is a known Lucide icon name."""
26
+
27
+ @model_validator(mode="after")
28
+ def _validate_icon(self):
29
+ from app.utils.lucide_icons import get_valid_icon_names
30
+
31
+ valid = get_valid_icon_names()
32
+ if valid and self.icon not in valid:
33
+ raise ValueError(
34
+ f"Unknown icon {self.icon!r}. "
35
+ f"Must be a valid Lucide icon name."
36
+ )
37
+ return self
38
+
39
+
40
+ class FeatureConfig(_IconValidatorMixin):
41
  title: str = ""
42
  description: str = ""
43
  icon: str = "HelpCircle"
 
69
  academic_stages: List[AcademicStage] = []
70
 
71
 
72
+ class ExampleCategory(_IconValidatorMixin):
73
  title: str
74
  icon: str = "BookOpen"
75
  color: str = "#3B82F6"
 
82
  examples: List[ExampleCategory] = []
83
 
84
 
85
+ class PersonaItemConfig(_IconValidatorMixin):
86
  id: str
87
  name: str
88
  enabled: bool = True
multi_llm_chatbot_backend/app/tests/test_lucide_icons.py ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytest
2
+ from pydantic import ValidationError
3
+ from app.utils.lucide_icons import get_valid_icon_names
4
+ from app.config import FeatureConfig, ExampleCategory, PersonaItemConfig
5
+
6
+
7
+ @pytest.fixture(autouse=True)
8
+ def _clear_icon_cache():
9
+ get_valid_icon_names.cache_clear()
10
+ yield
11
+ get_valid_icon_names.cache_clear()
12
+
13
+
14
+ # ---------------------------------------------------------------------------
15
+ # Icon registry tests
16
+ # ---------------------------------------------------------------------------
17
+
18
+
19
+ def test_returns_known_icons():
20
+ icons = get_valid_icon_names()
21
+ assert len(icons) > 1500
22
+ assert "HelpCircle" in icons
23
+ assert "BookOpen" in icons
24
+
25
+
26
+ def test_rejects_invalid_icon():
27
+ icons = get_valid_icon_names()
28
+ assert "NotARealIcon" not in icons
29
+
30
+
31
+ # ---------------------------------------------------------------------------
32
+ # Icon validation tests
33
+ # ---------------------------------------------------------------------------
34
+
35
+
36
+ def test_feature_config_accepts_valid_icon():
37
+ feature = FeatureConfig(title="Test", description="desc", icon="BookOpen")
38
+ assert feature.icon == "BookOpen"
39
+
40
+
41
+ def test_example_category_accepts_valid_icon():
42
+ example = ExampleCategory(title="Test", icon="Brain")
43
+ assert example.icon == "Brain"
44
+
45
+
46
+ def test_persona_item_accepts_valid_icon():
47
+ persona = PersonaItemConfig(id="test", name="Test", icon="Heart")
48
+ assert persona.icon == "Heart"
49
+
50
+
51
+ def test_default_icons_are_valid():
52
+ feature = FeatureConfig(title="Test", description="desc")
53
+ assert feature.icon == "HelpCircle"
54
+
55
+ example = ExampleCategory(title="Test")
56
+ assert example.icon == "BookOpen"
57
+
58
+ persona = PersonaItemConfig(id="test", name="Test")
59
+ assert persona.icon == "HelpCircle"
60
+
61
+
62
+ def test_feature_config_rejects_invalid_icon():
63
+ with pytest.raises(ValidationError, match="Unknown icon"):
64
+ FeatureConfig(title="Test", description="desc", icon="NotARealIcon")
65
+
66
+
67
+ def test_example_category_rejects_invalid_icon():
68
+ with pytest.raises(ValidationError, match="Unknown icon"):
69
+ ExampleCategory(title="Test", icon="TotallyFake")
70
+
71
+
72
+ def test_persona_item_rejects_invalid_icon():
73
+ with pytest.raises(ValidationError, match="Unknown icon"):
74
+ PersonaItemConfig(id="test", name="Test", icon="Nope")
multi_llm_chatbot_backend/app/utils/_lucide_icon_names.json ADDED
@@ -0,0 +1,1866 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": "0.544.0",
3
+ "icons": [
4
+ "AArrowDown",
5
+ "AArrowUp",
6
+ "ALargeSmall",
7
+ "Accessibility",
8
+ "Activity",
9
+ "ActivitySquare",
10
+ "AirVent",
11
+ "Airplay",
12
+ "AlarmCheck",
13
+ "AlarmClock",
14
+ "AlarmClockCheck",
15
+ "AlarmClockMinus",
16
+ "AlarmClockOff",
17
+ "AlarmClockPlus",
18
+ "AlarmMinus",
19
+ "AlarmPlus",
20
+ "AlarmSmoke",
21
+ "Album",
22
+ "AlertCircle",
23
+ "AlertOctagon",
24
+ "AlertTriangle",
25
+ "AlignCenter",
26
+ "AlignCenterHorizontal",
27
+ "AlignCenterVertical",
28
+ "AlignEndHorizontal",
29
+ "AlignEndVertical",
30
+ "AlignHorizontalDistributeCenter",
31
+ "AlignHorizontalDistributeEnd",
32
+ "AlignHorizontalDistributeStart",
33
+ "AlignHorizontalJustifyCenter",
34
+ "AlignHorizontalJustifyEnd",
35
+ "AlignHorizontalJustifyStart",
36
+ "AlignHorizontalSpaceAround",
37
+ "AlignHorizontalSpaceBetween",
38
+ "AlignJustify",
39
+ "AlignLeft",
40
+ "AlignRight",
41
+ "AlignStartHorizontal",
42
+ "AlignStartVertical",
43
+ "AlignVerticalDistributeCenter",
44
+ "AlignVerticalDistributeEnd",
45
+ "AlignVerticalDistributeStart",
46
+ "AlignVerticalJustifyCenter",
47
+ "AlignVerticalJustifyEnd",
48
+ "AlignVerticalJustifyStart",
49
+ "AlignVerticalSpaceAround",
50
+ "AlignVerticalSpaceBetween",
51
+ "Ambulance",
52
+ "Ampersand",
53
+ "Ampersands",
54
+ "Amphora",
55
+ "Anchor",
56
+ "Angry",
57
+ "Annoyed",
58
+ "Antenna",
59
+ "Anvil",
60
+ "Aperture",
61
+ "AppWindow",
62
+ "AppWindowMac",
63
+ "Apple",
64
+ "Archive",
65
+ "ArchiveRestore",
66
+ "ArchiveX",
67
+ "AreaChart",
68
+ "Armchair",
69
+ "ArrowBigDown",
70
+ "ArrowBigDownDash",
71
+ "ArrowBigLeft",
72
+ "ArrowBigLeftDash",
73
+ "ArrowBigRight",
74
+ "ArrowBigRightDash",
75
+ "ArrowBigUp",
76
+ "ArrowBigUpDash",
77
+ "ArrowDown",
78
+ "ArrowDown01",
79
+ "ArrowDown10",
80
+ "ArrowDownAZ",
81
+ "ArrowDownAz",
82
+ "ArrowDownCircle",
83
+ "ArrowDownFromLine",
84
+ "ArrowDownLeft",
85
+ "ArrowDownLeftFromCircle",
86
+ "ArrowDownLeftFromSquare",
87
+ "ArrowDownLeftSquare",
88
+ "ArrowDownNarrowWide",
89
+ "ArrowDownRight",
90
+ "ArrowDownRightFromCircle",
91
+ "ArrowDownRightFromSquare",
92
+ "ArrowDownRightSquare",
93
+ "ArrowDownSquare",
94
+ "ArrowDownToDot",
95
+ "ArrowDownToLine",
96
+ "ArrowDownUp",
97
+ "ArrowDownWideNarrow",
98
+ "ArrowDownZA",
99
+ "ArrowDownZa",
100
+ "ArrowLeft",
101
+ "ArrowLeftCircle",
102
+ "ArrowLeftFromLine",
103
+ "ArrowLeftRight",
104
+ "ArrowLeftSquare",
105
+ "ArrowLeftToLine",
106
+ "ArrowRight",
107
+ "ArrowRightCircle",
108
+ "ArrowRightFromLine",
109
+ "ArrowRightLeft",
110
+ "ArrowRightSquare",
111
+ "ArrowRightToLine",
112
+ "ArrowUp",
113
+ "ArrowUp01",
114
+ "ArrowUp10",
115
+ "ArrowUpAZ",
116
+ "ArrowUpAz",
117
+ "ArrowUpCircle",
118
+ "ArrowUpDown",
119
+ "ArrowUpFromDot",
120
+ "ArrowUpFromLine",
121
+ "ArrowUpLeft",
122
+ "ArrowUpLeftFromCircle",
123
+ "ArrowUpLeftFromSquare",
124
+ "ArrowUpLeftSquare",
125
+ "ArrowUpNarrowWide",
126
+ "ArrowUpRight",
127
+ "ArrowUpRightFromCircle",
128
+ "ArrowUpRightFromSquare",
129
+ "ArrowUpRightSquare",
130
+ "ArrowUpSquare",
131
+ "ArrowUpToLine",
132
+ "ArrowUpWideNarrow",
133
+ "ArrowUpZA",
134
+ "ArrowUpZa",
135
+ "ArrowsUpFromLine",
136
+ "Asterisk",
137
+ "AsteriskSquare",
138
+ "AtSign",
139
+ "Atom",
140
+ "AudioLines",
141
+ "AudioWaveform",
142
+ "Award",
143
+ "Axe",
144
+ "Axis3D",
145
+ "Axis3d",
146
+ "Baby",
147
+ "Backpack",
148
+ "Badge",
149
+ "BadgeAlert",
150
+ "BadgeCent",
151
+ "BadgeCheck",
152
+ "BadgeDollarSign",
153
+ "BadgeEuro",
154
+ "BadgeHelp",
155
+ "BadgeIndianRupee",
156
+ "BadgeInfo",
157
+ "BadgeJapaneseYen",
158
+ "BadgeMinus",
159
+ "BadgePercent",
160
+ "BadgePlus",
161
+ "BadgePoundSterling",
162
+ "BadgeQuestionMark",
163
+ "BadgeRussianRuble",
164
+ "BadgeSwissFranc",
165
+ "BadgeTurkishLira",
166
+ "BadgeX",
167
+ "BaggageClaim",
168
+ "Ban",
169
+ "Banana",
170
+ "Bandage",
171
+ "Banknote",
172
+ "BanknoteArrowDown",
173
+ "BanknoteArrowUp",
174
+ "BanknoteX",
175
+ "BarChart",
176
+ "BarChart2",
177
+ "BarChart3",
178
+ "BarChart4",
179
+ "BarChartBig",
180
+ "BarChartHorizontal",
181
+ "BarChartHorizontalBig",
182
+ "Barcode",
183
+ "Barrel",
184
+ "Baseline",
185
+ "Bath",
186
+ "Battery",
187
+ "BatteryCharging",
188
+ "BatteryFull",
189
+ "BatteryLow",
190
+ "BatteryMedium",
191
+ "BatteryPlus",
192
+ "BatteryWarning",
193
+ "Beaker",
194
+ "Bean",
195
+ "BeanOff",
196
+ "Bed",
197
+ "BedDouble",
198
+ "BedSingle",
199
+ "Beef",
200
+ "Beer",
201
+ "BeerOff",
202
+ "Bell",
203
+ "BellDot",
204
+ "BellElectric",
205
+ "BellMinus",
206
+ "BellOff",
207
+ "BellPlus",
208
+ "BellRing",
209
+ "BetweenHorizonalEnd",
210
+ "BetweenHorizonalStart",
211
+ "BetweenHorizontalEnd",
212
+ "BetweenHorizontalStart",
213
+ "BetweenVerticalEnd",
214
+ "BetweenVerticalStart",
215
+ "BicepsFlexed",
216
+ "Bike",
217
+ "Binary",
218
+ "Binoculars",
219
+ "Biohazard",
220
+ "Bird",
221
+ "Bitcoin",
222
+ "Blend",
223
+ "Blinds",
224
+ "Blocks",
225
+ "Bluetooth",
226
+ "BluetoothConnected",
227
+ "BluetoothOff",
228
+ "BluetoothSearching",
229
+ "Bold",
230
+ "Bolt",
231
+ "Bomb",
232
+ "Bone",
233
+ "Book",
234
+ "BookA",
235
+ "BookAlert",
236
+ "BookAudio",
237
+ "BookCheck",
238
+ "BookCopy",
239
+ "BookDashed",
240
+ "BookDown",
241
+ "BookHeadphones",
242
+ "BookHeart",
243
+ "BookImage",
244
+ "BookKey",
245
+ "BookLock",
246
+ "BookMarked",
247
+ "BookMinus",
248
+ "BookOpen",
249
+ "BookOpenCheck",
250
+ "BookOpenText",
251
+ "BookPlus",
252
+ "BookTemplate",
253
+ "BookText",
254
+ "BookType",
255
+ "BookUp",
256
+ "BookUp2",
257
+ "BookUser",
258
+ "BookX",
259
+ "Bookmark",
260
+ "BookmarkCheck",
261
+ "BookmarkMinus",
262
+ "BookmarkPlus",
263
+ "BookmarkX",
264
+ "BoomBox",
265
+ "Bot",
266
+ "BotMessageSquare",
267
+ "BotOff",
268
+ "BottleWine",
269
+ "BowArrow",
270
+ "Box",
271
+ "BoxSelect",
272
+ "Boxes",
273
+ "Braces",
274
+ "Brackets",
275
+ "Brain",
276
+ "BrainCircuit",
277
+ "BrainCog",
278
+ "BrickWall",
279
+ "BrickWallFire",
280
+ "BrickWallShield",
281
+ "Briefcase",
282
+ "BriefcaseBusiness",
283
+ "BriefcaseConveyorBelt",
284
+ "BriefcaseMedical",
285
+ "BringToFront",
286
+ "Brush",
287
+ "BrushCleaning",
288
+ "Bubbles",
289
+ "Bug",
290
+ "BugOff",
291
+ "BugPlay",
292
+ "Building",
293
+ "Building2",
294
+ "Bus",
295
+ "BusFront",
296
+ "Cable",
297
+ "CableCar",
298
+ "Cake",
299
+ "CakeSlice",
300
+ "Calculator",
301
+ "Calendar",
302
+ "Calendar1",
303
+ "CalendarArrowDown",
304
+ "CalendarArrowUp",
305
+ "CalendarCheck",
306
+ "CalendarCheck2",
307
+ "CalendarClock",
308
+ "CalendarCog",
309
+ "CalendarDays",
310
+ "CalendarFold",
311
+ "CalendarHeart",
312
+ "CalendarMinus",
313
+ "CalendarMinus2",
314
+ "CalendarOff",
315
+ "CalendarPlus",
316
+ "CalendarPlus2",
317
+ "CalendarRange",
318
+ "CalendarSearch",
319
+ "CalendarSync",
320
+ "CalendarX",
321
+ "CalendarX2",
322
+ "Camera",
323
+ "CameraOff",
324
+ "CandlestickChart",
325
+ "Candy",
326
+ "CandyCane",
327
+ "CandyOff",
328
+ "Cannabis",
329
+ "Captions",
330
+ "CaptionsOff",
331
+ "Car",
332
+ "CarFront",
333
+ "CarTaxiFront",
334
+ "Caravan",
335
+ "CardSim",
336
+ "Carrot",
337
+ "CaseLower",
338
+ "CaseSensitive",
339
+ "CaseUpper",
340
+ "CassetteTape",
341
+ "Cast",
342
+ "Castle",
343
+ "Cat",
344
+ "Cctv",
345
+ "ChartArea",
346
+ "ChartBar",
347
+ "ChartBarBig",
348
+ "ChartBarDecreasing",
349
+ "ChartBarIncreasing",
350
+ "ChartBarStacked",
351
+ "ChartCandlestick",
352
+ "ChartColumn",
353
+ "ChartColumnBig",
354
+ "ChartColumnDecreasing",
355
+ "ChartColumnIncreasing",
356
+ "ChartColumnStacked",
357
+ "ChartGantt",
358
+ "ChartLine",
359
+ "ChartNetwork",
360
+ "ChartNoAxesColumn",
361
+ "ChartNoAxesColumnDecreasing",
362
+ "ChartNoAxesColumnIncreasing",
363
+ "ChartNoAxesCombined",
364
+ "ChartNoAxesGantt",
365
+ "ChartPie",
366
+ "ChartScatter",
367
+ "ChartSpline",
368
+ "Check",
369
+ "CheckCheck",
370
+ "CheckCircle",
371
+ "CheckCircle2",
372
+ "CheckLine",
373
+ "CheckSquare",
374
+ "CheckSquare2",
375
+ "ChefHat",
376
+ "Cherry",
377
+ "ChevronDown",
378
+ "ChevronDownCircle",
379
+ "ChevronDownSquare",
380
+ "ChevronFirst",
381
+ "ChevronLast",
382
+ "ChevronLeft",
383
+ "ChevronLeftCircle",
384
+ "ChevronLeftSquare",
385
+ "ChevronRight",
386
+ "ChevronRightCircle",
387
+ "ChevronRightSquare",
388
+ "ChevronUp",
389
+ "ChevronUpCircle",
390
+ "ChevronUpSquare",
391
+ "ChevronsDown",
392
+ "ChevronsDownUp",
393
+ "ChevronsLeft",
394
+ "ChevronsLeftRight",
395
+ "ChevronsLeftRightEllipsis",
396
+ "ChevronsRight",
397
+ "ChevronsRightLeft",
398
+ "ChevronsUp",
399
+ "ChevronsUpDown",
400
+ "Chrome",
401
+ "Chromium",
402
+ "Church",
403
+ "Cigarette",
404
+ "CigaretteOff",
405
+ "Circle",
406
+ "CircleAlert",
407
+ "CircleArrowDown",
408
+ "CircleArrowLeft",
409
+ "CircleArrowOutDownLeft",
410
+ "CircleArrowOutDownRight",
411
+ "CircleArrowOutUpLeft",
412
+ "CircleArrowOutUpRight",
413
+ "CircleArrowRight",
414
+ "CircleArrowUp",
415
+ "CircleCheck",
416
+ "CircleCheckBig",
417
+ "CircleChevronDown",
418
+ "CircleChevronLeft",
419
+ "CircleChevronRight",
420
+ "CircleChevronUp",
421
+ "CircleDashed",
422
+ "CircleDivide",
423
+ "CircleDollarSign",
424
+ "CircleDot",
425
+ "CircleDotDashed",
426
+ "CircleEllipsis",
427
+ "CircleEqual",
428
+ "CircleFadingArrowUp",
429
+ "CircleFadingPlus",
430
+ "CircleGauge",
431
+ "CircleHelp",
432
+ "CircleMinus",
433
+ "CircleOff",
434
+ "CircleParking",
435
+ "CircleParkingOff",
436
+ "CirclePause",
437
+ "CirclePercent",
438
+ "CirclePlay",
439
+ "CirclePlus",
440
+ "CirclePoundSterling",
441
+ "CirclePower",
442
+ "CircleQuestionMark",
443
+ "CircleSlash",
444
+ "CircleSlash2",
445
+ "CircleSlashed",
446
+ "CircleSmall",
447
+ "CircleStar",
448
+ "CircleStop",
449
+ "CircleUser",
450
+ "CircleUserRound",
451
+ "CircleX",
452
+ "CircuitBoard",
453
+ "Citrus",
454
+ "Clapperboard",
455
+ "Clipboard",
456
+ "ClipboardCheck",
457
+ "ClipboardClock",
458
+ "ClipboardCopy",
459
+ "ClipboardEdit",
460
+ "ClipboardList",
461
+ "ClipboardMinus",
462
+ "ClipboardPaste",
463
+ "ClipboardPen",
464
+ "ClipboardPenLine",
465
+ "ClipboardPlus",
466
+ "ClipboardSignature",
467
+ "ClipboardType",
468
+ "ClipboardX",
469
+ "Clock",
470
+ "Clock1",
471
+ "Clock10",
472
+ "Clock11",
473
+ "Clock12",
474
+ "Clock2",
475
+ "Clock3",
476
+ "Clock4",
477
+ "Clock5",
478
+ "Clock6",
479
+ "Clock7",
480
+ "Clock8",
481
+ "Clock9",
482
+ "ClockAlert",
483
+ "ClockArrowDown",
484
+ "ClockArrowUp",
485
+ "ClockFading",
486
+ "ClockPlus",
487
+ "ClosedCaption",
488
+ "Cloud",
489
+ "CloudAlert",
490
+ "CloudCheck",
491
+ "CloudCog",
492
+ "CloudDownload",
493
+ "CloudDrizzle",
494
+ "CloudFog",
495
+ "CloudHail",
496
+ "CloudLightning",
497
+ "CloudMoon",
498
+ "CloudMoonRain",
499
+ "CloudOff",
500
+ "CloudRain",
501
+ "CloudRainWind",
502
+ "CloudSnow",
503
+ "CloudSun",
504
+ "CloudSunRain",
505
+ "CloudUpload",
506
+ "Cloudy",
507
+ "Clover",
508
+ "Club",
509
+ "Code",
510
+ "Code2",
511
+ "CodeSquare",
512
+ "CodeXml",
513
+ "Codepen",
514
+ "Codesandbox",
515
+ "Coffee",
516
+ "Cog",
517
+ "Coins",
518
+ "Columns",
519
+ "Columns2",
520
+ "Columns3",
521
+ "Columns3Cog",
522
+ "Columns4",
523
+ "ColumnsSettings",
524
+ "Combine",
525
+ "Command",
526
+ "Compass",
527
+ "Component",
528
+ "Computer",
529
+ "ConciergeBell",
530
+ "Cone",
531
+ "Construction",
532
+ "Contact",
533
+ "Contact2",
534
+ "ContactRound",
535
+ "Container",
536
+ "Contrast",
537
+ "Cookie",
538
+ "CookingPot",
539
+ "Copy",
540
+ "CopyCheck",
541
+ "CopyMinus",
542
+ "CopyPlus",
543
+ "CopySlash",
544
+ "CopyX",
545
+ "Copyleft",
546
+ "Copyright",
547
+ "CornerDownLeft",
548
+ "CornerDownRight",
549
+ "CornerLeftDown",
550
+ "CornerLeftUp",
551
+ "CornerRightDown",
552
+ "CornerRightUp",
553
+ "CornerUpLeft",
554
+ "CornerUpRight",
555
+ "Cpu",
556
+ "CreativeCommons",
557
+ "CreditCard",
558
+ "Croissant",
559
+ "Crop",
560
+ "Cross",
561
+ "Crosshair",
562
+ "Crown",
563
+ "Cuboid",
564
+ "CupSoda",
565
+ "CurlyBraces",
566
+ "Currency",
567
+ "Cylinder",
568
+ "Dam",
569
+ "Database",
570
+ "DatabaseBackup",
571
+ "DatabaseZap",
572
+ "DecimalsArrowLeft",
573
+ "DecimalsArrowRight",
574
+ "Delete",
575
+ "Dessert",
576
+ "Diameter",
577
+ "Diamond",
578
+ "DiamondMinus",
579
+ "DiamondPercent",
580
+ "DiamondPlus",
581
+ "Dice1",
582
+ "Dice2",
583
+ "Dice3",
584
+ "Dice4",
585
+ "Dice5",
586
+ "Dice6",
587
+ "Dices",
588
+ "Diff",
589
+ "Disc",
590
+ "Disc2",
591
+ "Disc3",
592
+ "DiscAlbum",
593
+ "Divide",
594
+ "DivideCircle",
595
+ "DivideSquare",
596
+ "Dna",
597
+ "DnaOff",
598
+ "Dock",
599
+ "Dog",
600
+ "DollarSign",
601
+ "Donut",
602
+ "DoorClosed",
603
+ "DoorClosedLocked",
604
+ "DoorOpen",
605
+ "Dot",
606
+ "DotSquare",
607
+ "Download",
608
+ "DownloadCloud",
609
+ "DraftingCompass",
610
+ "Drama",
611
+ "Dribbble",
612
+ "Drill",
613
+ "Drone",
614
+ "Droplet",
615
+ "DropletOff",
616
+ "Droplets",
617
+ "Drum",
618
+ "Drumstick",
619
+ "Dumbbell",
620
+ "Ear",
621
+ "EarOff",
622
+ "Earth",
623
+ "EarthLock",
624
+ "Eclipse",
625
+ "Edit",
626
+ "Edit2",
627
+ "Edit3",
628
+ "Egg",
629
+ "EggFried",
630
+ "EggOff",
631
+ "Ellipsis",
632
+ "EllipsisVertical",
633
+ "Equal",
634
+ "EqualApproximately",
635
+ "EqualNot",
636
+ "EqualSquare",
637
+ "Eraser",
638
+ "EthernetPort",
639
+ "Euro",
640
+ "EvCharger",
641
+ "Expand",
642
+ "ExternalLink",
643
+ "Eye",
644
+ "EyeClosed",
645
+ "EyeOff",
646
+ "Facebook",
647
+ "Factory",
648
+ "Fan",
649
+ "FastForward",
650
+ "Feather",
651
+ "Fence",
652
+ "FerrisWheel",
653
+ "Figma",
654
+ "File",
655
+ "FileArchive",
656
+ "FileAudio",
657
+ "FileAudio2",
658
+ "FileAxis3D",
659
+ "FileAxis3d",
660
+ "FileBadge",
661
+ "FileBadge2",
662
+ "FileBarChart",
663
+ "FileBarChart2",
664
+ "FileBox",
665
+ "FileChartColumn",
666
+ "FileChartColumnIncreasing",
667
+ "FileChartLine",
668
+ "FileChartPie",
669
+ "FileCheck",
670
+ "FileCheck2",
671
+ "FileClock",
672
+ "FileCode",
673
+ "FileCode2",
674
+ "FileCog",
675
+ "FileCog2",
676
+ "FileDiff",
677
+ "FileDigit",
678
+ "FileDown",
679
+ "FileEdit",
680
+ "FileHeart",
681
+ "FileImage",
682
+ "FileInput",
683
+ "FileJson",
684
+ "FileJson2",
685
+ "FileKey",
686
+ "FileKey2",
687
+ "FileLineChart",
688
+ "FileLock",
689
+ "FileLock2",
690
+ "FileMinus",
691
+ "FileMinus2",
692
+ "FileMusic",
693
+ "FileOutput",
694
+ "FilePen",
695
+ "FilePenLine",
696
+ "FilePieChart",
697
+ "FilePlay",
698
+ "FilePlus",
699
+ "FilePlus2",
700
+ "FileQuestion",
701
+ "FileQuestionMark",
702
+ "FileScan",
703
+ "FileSearch",
704
+ "FileSearch2",
705
+ "FileSignature",
706
+ "FileSliders",
707
+ "FileSpreadsheet",
708
+ "FileStack",
709
+ "FileSymlink",
710
+ "FileTerminal",
711
+ "FileText",
712
+ "FileType",
713
+ "FileType2",
714
+ "FileUp",
715
+ "FileUser",
716
+ "FileVideo",
717
+ "FileVideo2",
718
+ "FileVideoCamera",
719
+ "FileVolume",
720
+ "FileVolume2",
721
+ "FileWarning",
722
+ "FileX",
723
+ "FileX2",
724
+ "Files",
725
+ "Film",
726
+ "Filter",
727
+ "FilterX",
728
+ "Fingerprint",
729
+ "FireExtinguisher",
730
+ "Fish",
731
+ "FishOff",
732
+ "FishSymbol",
733
+ "Flag",
734
+ "FlagOff",
735
+ "FlagTriangleLeft",
736
+ "FlagTriangleRight",
737
+ "Flame",
738
+ "FlameKindling",
739
+ "Flashlight",
740
+ "FlashlightOff",
741
+ "FlaskConical",
742
+ "FlaskConicalOff",
743
+ "FlaskRound",
744
+ "FlipHorizontal",
745
+ "FlipHorizontal2",
746
+ "FlipVertical",
747
+ "FlipVertical2",
748
+ "Flower",
749
+ "Flower2",
750
+ "Focus",
751
+ "FoldHorizontal",
752
+ "FoldVertical",
753
+ "Folder",
754
+ "FolderArchive",
755
+ "FolderCheck",
756
+ "FolderClock",
757
+ "FolderClosed",
758
+ "FolderCode",
759
+ "FolderCog",
760
+ "FolderCog2",
761
+ "FolderDot",
762
+ "FolderDown",
763
+ "FolderEdit",
764
+ "FolderGit",
765
+ "FolderGit2",
766
+ "FolderHeart",
767
+ "FolderInput",
768
+ "FolderKanban",
769
+ "FolderKey",
770
+ "FolderLock",
771
+ "FolderMinus",
772
+ "FolderOpen",
773
+ "FolderOpenDot",
774
+ "FolderOutput",
775
+ "FolderPen",
776
+ "FolderPlus",
777
+ "FolderRoot",
778
+ "FolderSearch",
779
+ "FolderSearch2",
780
+ "FolderSymlink",
781
+ "FolderSync",
782
+ "FolderTree",
783
+ "FolderUp",
784
+ "FolderX",
785
+ "Folders",
786
+ "Footprints",
787
+ "ForkKnife",
788
+ "ForkKnifeCrossed",
789
+ "Forklift",
790
+ "FormInput",
791
+ "Forward",
792
+ "Frame",
793
+ "Framer",
794
+ "Frown",
795
+ "Fuel",
796
+ "Fullscreen",
797
+ "FunctionSquare",
798
+ "Funnel",
799
+ "FunnelPlus",
800
+ "FunnelX",
801
+ "GalleryHorizontal",
802
+ "GalleryHorizontalEnd",
803
+ "GalleryThumbnails",
804
+ "GalleryVertical",
805
+ "GalleryVerticalEnd",
806
+ "Gamepad",
807
+ "Gamepad2",
808
+ "GanttChart",
809
+ "GanttChartSquare",
810
+ "Gauge",
811
+ "GaugeCircle",
812
+ "Gavel",
813
+ "Gem",
814
+ "GeorgianLari",
815
+ "Ghost",
816
+ "Gift",
817
+ "GitBranch",
818
+ "GitBranchPlus",
819
+ "GitCommit",
820
+ "GitCommitHorizontal",
821
+ "GitCommitVertical",
822
+ "GitCompare",
823
+ "GitCompareArrows",
824
+ "GitFork",
825
+ "GitGraph",
826
+ "GitMerge",
827
+ "GitPullRequest",
828
+ "GitPullRequestArrow",
829
+ "GitPullRequestClosed",
830
+ "GitPullRequestCreate",
831
+ "GitPullRequestCreateArrow",
832
+ "GitPullRequestDraft",
833
+ "Github",
834
+ "Gitlab",
835
+ "GlassWater",
836
+ "Glasses",
837
+ "Globe",
838
+ "Globe2",
839
+ "GlobeLock",
840
+ "Goal",
841
+ "Gpu",
842
+ "Grab",
843
+ "GraduationCap",
844
+ "Grape",
845
+ "Grid",
846
+ "Grid2X2",
847
+ "Grid2X2Check",
848
+ "Grid2X2Plus",
849
+ "Grid2X2X",
850
+ "Grid2x2",
851
+ "Grid2x2Check",
852
+ "Grid2x2Plus",
853
+ "Grid2x2X",
854
+ "Grid3X3",
855
+ "Grid3x2",
856
+ "Grid3x3",
857
+ "Grip",
858
+ "GripHorizontal",
859
+ "GripVertical",
860
+ "Group",
861
+ "Guitar",
862
+ "Ham",
863
+ "Hamburger",
864
+ "Hammer",
865
+ "Hand",
866
+ "HandCoins",
867
+ "HandFist",
868
+ "HandGrab",
869
+ "HandHeart",
870
+ "HandHelping",
871
+ "HandMetal",
872
+ "HandPlatter",
873
+ "Handbag",
874
+ "Handshake",
875
+ "HardDrive",
876
+ "HardDriveDownload",
877
+ "HardDriveUpload",
878
+ "HardHat",
879
+ "Hash",
880
+ "HatGlasses",
881
+ "Haze",
882
+ "HdmiPort",
883
+ "Heading",
884
+ "Heading1",
885
+ "Heading2",
886
+ "Heading3",
887
+ "Heading4",
888
+ "Heading5",
889
+ "Heading6",
890
+ "HeadphoneOff",
891
+ "Headphones",
892
+ "Headset",
893
+ "Heart",
894
+ "HeartCrack",
895
+ "HeartHandshake",
896
+ "HeartMinus",
897
+ "HeartOff",
898
+ "HeartPlus",
899
+ "HeartPulse",
900
+ "Heater",
901
+ "HelpCircle",
902
+ "HelpingHand",
903
+ "Hexagon",
904
+ "Highlighter",
905
+ "History",
906
+ "Home",
907
+ "Hop",
908
+ "HopOff",
909
+ "Hospital",
910
+ "Hotel",
911
+ "Hourglass",
912
+ "House",
913
+ "HouseHeart",
914
+ "HousePlug",
915
+ "HousePlus",
916
+ "HouseWifi",
917
+ "IceCream",
918
+ "IceCream2",
919
+ "IceCreamBowl",
920
+ "IceCreamCone",
921
+ "IdCard",
922
+ "IdCardLanyard",
923
+ "Image",
924
+ "ImageDown",
925
+ "ImageMinus",
926
+ "ImageOff",
927
+ "ImagePlay",
928
+ "ImagePlus",
929
+ "ImageUp",
930
+ "ImageUpscale",
931
+ "Images",
932
+ "Import",
933
+ "Inbox",
934
+ "Indent",
935
+ "IndentDecrease",
936
+ "IndentIncrease",
937
+ "IndianRupee",
938
+ "Infinity",
939
+ "Info",
940
+ "Inspect",
941
+ "InspectionPanel",
942
+ "Instagram",
943
+ "Italic",
944
+ "IterationCcw",
945
+ "IterationCw",
946
+ "JapaneseYen",
947
+ "Joystick",
948
+ "Kanban",
949
+ "KanbanSquare",
950
+ "KanbanSquareDashed",
951
+ "Kayak",
952
+ "Key",
953
+ "KeyRound",
954
+ "KeySquare",
955
+ "Keyboard",
956
+ "KeyboardMusic",
957
+ "KeyboardOff",
958
+ "Lamp",
959
+ "LampCeiling",
960
+ "LampDesk",
961
+ "LampFloor",
962
+ "LampWallDown",
963
+ "LampWallUp",
964
+ "LandPlot",
965
+ "Landmark",
966
+ "Languages",
967
+ "Laptop",
968
+ "Laptop2",
969
+ "LaptopMinimal",
970
+ "LaptopMinimalCheck",
971
+ "Lasso",
972
+ "LassoSelect",
973
+ "Laugh",
974
+ "Layers",
975
+ "Layers2",
976
+ "Layers3",
977
+ "Layout",
978
+ "LayoutDashboard",
979
+ "LayoutGrid",
980
+ "LayoutList",
981
+ "LayoutPanelLeft",
982
+ "LayoutPanelTop",
983
+ "LayoutTemplate",
984
+ "Leaf",
985
+ "LeafyGreen",
986
+ "Lectern",
987
+ "LetterText",
988
+ "Library",
989
+ "LibraryBig",
990
+ "LibrarySquare",
991
+ "LifeBuoy",
992
+ "Ligature",
993
+ "Lightbulb",
994
+ "LightbulbOff",
995
+ "LineChart",
996
+ "LineSquiggle",
997
+ "Link",
998
+ "Link2",
999
+ "Link2Off",
1000
+ "Linkedin",
1001
+ "List",
1002
+ "ListCheck",
1003
+ "ListChecks",
1004
+ "ListChevronsDownUp",
1005
+ "ListChevronsUpDown",
1006
+ "ListCollapse",
1007
+ "ListEnd",
1008
+ "ListFilter",
1009
+ "ListFilterPlus",
1010
+ "ListIndentDecrease",
1011
+ "ListIndentIncrease",
1012
+ "ListMinus",
1013
+ "ListMusic",
1014
+ "ListOrdered",
1015
+ "ListPlus",
1016
+ "ListRestart",
1017
+ "ListStart",
1018
+ "ListTodo",
1019
+ "ListTree",
1020
+ "ListVideo",
1021
+ "ListX",
1022
+ "Loader",
1023
+ "Loader2",
1024
+ "LoaderCircle",
1025
+ "LoaderPinwheel",
1026
+ "Locate",
1027
+ "LocateFixed",
1028
+ "LocateOff",
1029
+ "LocationEdit",
1030
+ "Lock",
1031
+ "LockKeyhole",
1032
+ "LockKeyholeOpen",
1033
+ "LockOpen",
1034
+ "LogIn",
1035
+ "LogOut",
1036
+ "Logs",
1037
+ "Lollipop",
1038
+ "Luggage",
1039
+ "MSquare",
1040
+ "Magnet",
1041
+ "Mail",
1042
+ "MailCheck",
1043
+ "MailMinus",
1044
+ "MailOpen",
1045
+ "MailPlus",
1046
+ "MailQuestion",
1047
+ "MailQuestionMark",
1048
+ "MailSearch",
1049
+ "MailWarning",
1050
+ "MailX",
1051
+ "Mailbox",
1052
+ "Mails",
1053
+ "Map",
1054
+ "MapMinus",
1055
+ "MapPin",
1056
+ "MapPinCheck",
1057
+ "MapPinCheckInside",
1058
+ "MapPinHouse",
1059
+ "MapPinMinus",
1060
+ "MapPinMinusInside",
1061
+ "MapPinOff",
1062
+ "MapPinPen",
1063
+ "MapPinPlus",
1064
+ "MapPinPlusInside",
1065
+ "MapPinX",
1066
+ "MapPinXInside",
1067
+ "MapPinned",
1068
+ "MapPlus",
1069
+ "Mars",
1070
+ "MarsStroke",
1071
+ "Martini",
1072
+ "Maximize",
1073
+ "Maximize2",
1074
+ "Medal",
1075
+ "Megaphone",
1076
+ "MegaphoneOff",
1077
+ "Meh",
1078
+ "MemoryStick",
1079
+ "Menu",
1080
+ "MenuSquare",
1081
+ "Merge",
1082
+ "MessageCircle",
1083
+ "MessageCircleCode",
1084
+ "MessageCircleDashed",
1085
+ "MessageCircleHeart",
1086
+ "MessageCircleMore",
1087
+ "MessageCircleOff",
1088
+ "MessageCirclePlus",
1089
+ "MessageCircleQuestion",
1090
+ "MessageCircleQuestionMark",
1091
+ "MessageCircleReply",
1092
+ "MessageCircleWarning",
1093
+ "MessageCircleX",
1094
+ "MessageSquare",
1095
+ "MessageSquareCode",
1096
+ "MessageSquareDashed",
1097
+ "MessageSquareDiff",
1098
+ "MessageSquareDot",
1099
+ "MessageSquareHeart",
1100
+ "MessageSquareLock",
1101
+ "MessageSquareMore",
1102
+ "MessageSquareOff",
1103
+ "MessageSquarePlus",
1104
+ "MessageSquareQuote",
1105
+ "MessageSquareReply",
1106
+ "MessageSquareShare",
1107
+ "MessageSquareText",
1108
+ "MessageSquareWarning",
1109
+ "MessageSquareX",
1110
+ "MessagesSquare",
1111
+ "Mic",
1112
+ "Mic2",
1113
+ "MicOff",
1114
+ "MicVocal",
1115
+ "Microchip",
1116
+ "Microscope",
1117
+ "Microwave",
1118
+ "Milestone",
1119
+ "Milk",
1120
+ "MilkOff",
1121
+ "Minimize",
1122
+ "Minimize2",
1123
+ "Minus",
1124
+ "MinusCircle",
1125
+ "MinusSquare",
1126
+ "Monitor",
1127
+ "MonitorCheck",
1128
+ "MonitorCog",
1129
+ "MonitorDot",
1130
+ "MonitorDown",
1131
+ "MonitorOff",
1132
+ "MonitorPause",
1133
+ "MonitorPlay",
1134
+ "MonitorSmartphone",
1135
+ "MonitorSpeaker",
1136
+ "MonitorStop",
1137
+ "MonitorUp",
1138
+ "MonitorX",
1139
+ "Moon",
1140
+ "MoonStar",
1141
+ "MoreHorizontal",
1142
+ "MoreVertical",
1143
+ "Mountain",
1144
+ "MountainSnow",
1145
+ "Mouse",
1146
+ "MouseOff",
1147
+ "MousePointer",
1148
+ "MousePointer2",
1149
+ "MousePointerBan",
1150
+ "MousePointerClick",
1151
+ "MousePointerSquareDashed",
1152
+ "Move",
1153
+ "Move3D",
1154
+ "Move3d",
1155
+ "MoveDiagonal",
1156
+ "MoveDiagonal2",
1157
+ "MoveDown",
1158
+ "MoveDownLeft",
1159
+ "MoveDownRight",
1160
+ "MoveHorizontal",
1161
+ "MoveLeft",
1162
+ "MoveRight",
1163
+ "MoveUp",
1164
+ "MoveUpLeft",
1165
+ "MoveUpRight",
1166
+ "MoveVertical",
1167
+ "Music",
1168
+ "Music2",
1169
+ "Music3",
1170
+ "Music4",
1171
+ "Navigation",
1172
+ "Navigation2",
1173
+ "Navigation2Off",
1174
+ "NavigationOff",
1175
+ "Network",
1176
+ "Newspaper",
1177
+ "Nfc",
1178
+ "NonBinary",
1179
+ "Notebook",
1180
+ "NotebookPen",
1181
+ "NotebookTabs",
1182
+ "NotebookText",
1183
+ "NotepadText",
1184
+ "NotepadTextDashed",
1185
+ "Nut",
1186
+ "NutOff",
1187
+ "Octagon",
1188
+ "OctagonAlert",
1189
+ "OctagonMinus",
1190
+ "OctagonPause",
1191
+ "OctagonX",
1192
+ "Omega",
1193
+ "Option",
1194
+ "Orbit",
1195
+ "Origami",
1196
+ "Outdent",
1197
+ "Package",
1198
+ "Package2",
1199
+ "PackageCheck",
1200
+ "PackageMinus",
1201
+ "PackageOpen",
1202
+ "PackagePlus",
1203
+ "PackageSearch",
1204
+ "PackageX",
1205
+ "PaintBucket",
1206
+ "PaintRoller",
1207
+ "Paintbrush",
1208
+ "Paintbrush2",
1209
+ "PaintbrushVertical",
1210
+ "Palette",
1211
+ "Palmtree",
1212
+ "Panda",
1213
+ "PanelBottom",
1214
+ "PanelBottomClose",
1215
+ "PanelBottomDashed",
1216
+ "PanelBottomInactive",
1217
+ "PanelBottomOpen",
1218
+ "PanelLeft",
1219
+ "PanelLeftClose",
1220
+ "PanelLeftDashed",
1221
+ "PanelLeftInactive",
1222
+ "PanelLeftOpen",
1223
+ "PanelLeftRightDashed",
1224
+ "PanelRight",
1225
+ "PanelRightClose",
1226
+ "PanelRightDashed",
1227
+ "PanelRightInactive",
1228
+ "PanelRightOpen",
1229
+ "PanelTop",
1230
+ "PanelTopBottomDashed",
1231
+ "PanelTopClose",
1232
+ "PanelTopDashed",
1233
+ "PanelTopInactive",
1234
+ "PanelTopOpen",
1235
+ "PanelsLeftBottom",
1236
+ "PanelsLeftRight",
1237
+ "PanelsRightBottom",
1238
+ "PanelsTopBottom",
1239
+ "PanelsTopLeft",
1240
+ "Paperclip",
1241
+ "Parentheses",
1242
+ "ParkingCircle",
1243
+ "ParkingCircleOff",
1244
+ "ParkingMeter",
1245
+ "ParkingSquare",
1246
+ "ParkingSquareOff",
1247
+ "PartyPopper",
1248
+ "Pause",
1249
+ "PauseCircle",
1250
+ "PauseOctagon",
1251
+ "PawPrint",
1252
+ "PcCase",
1253
+ "Pen",
1254
+ "PenBox",
1255
+ "PenLine",
1256
+ "PenOff",
1257
+ "PenSquare",
1258
+ "PenTool",
1259
+ "Pencil",
1260
+ "PencilLine",
1261
+ "PencilOff",
1262
+ "PencilRuler",
1263
+ "Pentagon",
1264
+ "Percent",
1265
+ "PercentCircle",
1266
+ "PercentDiamond",
1267
+ "PercentSquare",
1268
+ "PersonStanding",
1269
+ "PhilippinePeso",
1270
+ "Phone",
1271
+ "PhoneCall",
1272
+ "PhoneForwarded",
1273
+ "PhoneIncoming",
1274
+ "PhoneMissed",
1275
+ "PhoneOff",
1276
+ "PhoneOutgoing",
1277
+ "Pi",
1278
+ "PiSquare",
1279
+ "Piano",
1280
+ "Pickaxe",
1281
+ "PictureInPicture",
1282
+ "PictureInPicture2",
1283
+ "PieChart",
1284
+ "PiggyBank",
1285
+ "Pilcrow",
1286
+ "PilcrowLeft",
1287
+ "PilcrowRight",
1288
+ "PilcrowSquare",
1289
+ "Pill",
1290
+ "PillBottle",
1291
+ "Pin",
1292
+ "PinOff",
1293
+ "Pipette",
1294
+ "Pizza",
1295
+ "Plane",
1296
+ "PlaneLanding",
1297
+ "PlaneTakeoff",
1298
+ "Play",
1299
+ "PlayCircle",
1300
+ "PlaySquare",
1301
+ "Plug",
1302
+ "Plug2",
1303
+ "PlugZap",
1304
+ "PlugZap2",
1305
+ "Plus",
1306
+ "PlusCircle",
1307
+ "PlusSquare",
1308
+ "Pocket",
1309
+ "PocketKnife",
1310
+ "Podcast",
1311
+ "Pointer",
1312
+ "PointerOff",
1313
+ "Popcorn",
1314
+ "Popsicle",
1315
+ "PoundSterling",
1316
+ "Power",
1317
+ "PowerCircle",
1318
+ "PowerOff",
1319
+ "PowerSquare",
1320
+ "Presentation",
1321
+ "Printer",
1322
+ "PrinterCheck",
1323
+ "Projector",
1324
+ "Proportions",
1325
+ "Puzzle",
1326
+ "Pyramid",
1327
+ "QrCode",
1328
+ "Quote",
1329
+ "Rabbit",
1330
+ "Radar",
1331
+ "Radiation",
1332
+ "Radical",
1333
+ "Radio",
1334
+ "RadioReceiver",
1335
+ "RadioTower",
1336
+ "Radius",
1337
+ "RailSymbol",
1338
+ "Rainbow",
1339
+ "Rat",
1340
+ "Ratio",
1341
+ "Receipt",
1342
+ "ReceiptCent",
1343
+ "ReceiptEuro",
1344
+ "ReceiptIndianRupee",
1345
+ "ReceiptJapaneseYen",
1346
+ "ReceiptPoundSterling",
1347
+ "ReceiptRussianRuble",
1348
+ "ReceiptSwissFranc",
1349
+ "ReceiptText",
1350
+ "ReceiptTurkishLira",
1351
+ "RectangleCircle",
1352
+ "RectangleEllipsis",
1353
+ "RectangleGoggles",
1354
+ "RectangleHorizontal",
1355
+ "RectangleVertical",
1356
+ "Recycle",
1357
+ "Redo",
1358
+ "Redo2",
1359
+ "RedoDot",
1360
+ "RefreshCcw",
1361
+ "RefreshCcwDot",
1362
+ "RefreshCw",
1363
+ "RefreshCwOff",
1364
+ "Refrigerator",
1365
+ "Regex",
1366
+ "RemoveFormatting",
1367
+ "Repeat",
1368
+ "Repeat1",
1369
+ "Repeat2",
1370
+ "Replace",
1371
+ "ReplaceAll",
1372
+ "Reply",
1373
+ "ReplyAll",
1374
+ "Rewind",
1375
+ "Ribbon",
1376
+ "Rocket",
1377
+ "RockingChair",
1378
+ "RollerCoaster",
1379
+ "Rose",
1380
+ "Rotate3D",
1381
+ "Rotate3d",
1382
+ "RotateCcw",
1383
+ "RotateCcwKey",
1384
+ "RotateCcwSquare",
1385
+ "RotateCw",
1386
+ "RotateCwSquare",
1387
+ "Route",
1388
+ "RouteOff",
1389
+ "Router",
1390
+ "Rows",
1391
+ "Rows2",
1392
+ "Rows3",
1393
+ "Rows4",
1394
+ "Rss",
1395
+ "Ruler",
1396
+ "RulerDimensionLine",
1397
+ "RussianRuble",
1398
+ "Sailboat",
1399
+ "Salad",
1400
+ "Sandwich",
1401
+ "Satellite",
1402
+ "SatelliteDish",
1403
+ "SaudiRiyal",
1404
+ "Save",
1405
+ "SaveAll",
1406
+ "SaveOff",
1407
+ "Scale",
1408
+ "Scale3D",
1409
+ "Scale3d",
1410
+ "Scaling",
1411
+ "Scan",
1412
+ "ScanBarcode",
1413
+ "ScanEye",
1414
+ "ScanFace",
1415
+ "ScanHeart",
1416
+ "ScanLine",
1417
+ "ScanQrCode",
1418
+ "ScanSearch",
1419
+ "ScanText",
1420
+ "ScatterChart",
1421
+ "School",
1422
+ "School2",
1423
+ "Scissors",
1424
+ "ScissorsLineDashed",
1425
+ "ScissorsSquare",
1426
+ "ScissorsSquareDashedBottom",
1427
+ "ScreenShare",
1428
+ "ScreenShareOff",
1429
+ "Scroll",
1430
+ "ScrollText",
1431
+ "Search",
1432
+ "SearchCheck",
1433
+ "SearchCode",
1434
+ "SearchSlash",
1435
+ "SearchX",
1436
+ "Section",
1437
+ "Send",
1438
+ "SendHorizonal",
1439
+ "SendHorizontal",
1440
+ "SendToBack",
1441
+ "SeparatorHorizontal",
1442
+ "SeparatorVertical",
1443
+ "Server",
1444
+ "ServerCog",
1445
+ "ServerCrash",
1446
+ "ServerOff",
1447
+ "Settings",
1448
+ "Settings2",
1449
+ "Shapes",
1450
+ "Share",
1451
+ "Share2",
1452
+ "Sheet",
1453
+ "Shell",
1454
+ "Shield",
1455
+ "ShieldAlert",
1456
+ "ShieldBan",
1457
+ "ShieldCheck",
1458
+ "ShieldClose",
1459
+ "ShieldEllipsis",
1460
+ "ShieldHalf",
1461
+ "ShieldMinus",
1462
+ "ShieldOff",
1463
+ "ShieldPlus",
1464
+ "ShieldQuestion",
1465
+ "ShieldQuestionMark",
1466
+ "ShieldUser",
1467
+ "ShieldX",
1468
+ "Ship",
1469
+ "ShipWheel",
1470
+ "Shirt",
1471
+ "ShoppingBag",
1472
+ "ShoppingBasket",
1473
+ "ShoppingCart",
1474
+ "Shovel",
1475
+ "ShowerHead",
1476
+ "Shredder",
1477
+ "Shrimp",
1478
+ "Shrink",
1479
+ "Shrub",
1480
+ "Shuffle",
1481
+ "Sidebar",
1482
+ "SidebarClose",
1483
+ "SidebarOpen",
1484
+ "Sigma",
1485
+ "SigmaSquare",
1486
+ "Signal",
1487
+ "SignalHigh",
1488
+ "SignalLow",
1489
+ "SignalMedium",
1490
+ "SignalZero",
1491
+ "Signature",
1492
+ "Signpost",
1493
+ "SignpostBig",
1494
+ "Siren",
1495
+ "SkipBack",
1496
+ "SkipForward",
1497
+ "Skull",
1498
+ "Slack",
1499
+ "Slash",
1500
+ "SlashSquare",
1501
+ "Slice",
1502
+ "Sliders",
1503
+ "SlidersHorizontal",
1504
+ "SlidersVertical",
1505
+ "Smartphone",
1506
+ "SmartphoneCharging",
1507
+ "SmartphoneNfc",
1508
+ "Smile",
1509
+ "SmilePlus",
1510
+ "Snail",
1511
+ "Snowflake",
1512
+ "SoapDispenserDroplet",
1513
+ "Sofa",
1514
+ "SortAsc",
1515
+ "SortDesc",
1516
+ "Soup",
1517
+ "Space",
1518
+ "Spade",
1519
+ "Sparkle",
1520
+ "Sparkles",
1521
+ "Speaker",
1522
+ "Speech",
1523
+ "SpellCheck",
1524
+ "SpellCheck2",
1525
+ "Spline",
1526
+ "SplinePointer",
1527
+ "Split",
1528
+ "SplitSquareHorizontal",
1529
+ "SplitSquareVertical",
1530
+ "Spool",
1531
+ "Spotlight",
1532
+ "SprayCan",
1533
+ "Sprout",
1534
+ "Square",
1535
+ "SquareActivity",
1536
+ "SquareArrowDown",
1537
+ "SquareArrowDownLeft",
1538
+ "SquareArrowDownRight",
1539
+ "SquareArrowLeft",
1540
+ "SquareArrowOutDownLeft",
1541
+ "SquareArrowOutDownRight",
1542
+ "SquareArrowOutUpLeft",
1543
+ "SquareArrowOutUpRight",
1544
+ "SquareArrowRight",
1545
+ "SquareArrowUp",
1546
+ "SquareArrowUpLeft",
1547
+ "SquareArrowUpRight",
1548
+ "SquareAsterisk",
1549
+ "SquareBottomDashedScissors",
1550
+ "SquareChartGantt",
1551
+ "SquareCheck",
1552
+ "SquareCheckBig",
1553
+ "SquareChevronDown",
1554
+ "SquareChevronLeft",
1555
+ "SquareChevronRight",
1556
+ "SquareChevronUp",
1557
+ "SquareCode",
1558
+ "SquareDashed",
1559
+ "SquareDashedBottom",
1560
+ "SquareDashedBottomCode",
1561
+ "SquareDashedKanban",
1562
+ "SquareDashedMousePointer",
1563
+ "SquareDashedTopSolid",
1564
+ "SquareDivide",
1565
+ "SquareDot",
1566
+ "SquareEqual",
1567
+ "SquareFunction",
1568
+ "SquareGanttChart",
1569
+ "SquareKanban",
1570
+ "SquareLibrary",
1571
+ "SquareM",
1572
+ "SquareMenu",
1573
+ "SquareMinus",
1574
+ "SquareMousePointer",
1575
+ "SquareParking",
1576
+ "SquareParkingOff",
1577
+ "SquarePause",
1578
+ "SquarePen",
1579
+ "SquarePercent",
1580
+ "SquarePi",
1581
+ "SquarePilcrow",
1582
+ "SquarePlay",
1583
+ "SquarePlus",
1584
+ "SquarePower",
1585
+ "SquareRadical",
1586
+ "SquareRoundCorner",
1587
+ "SquareScissors",
1588
+ "SquareSigma",
1589
+ "SquareSlash",
1590
+ "SquareSplitHorizontal",
1591
+ "SquareSplitVertical",
1592
+ "SquareSquare",
1593
+ "SquareStack",
1594
+ "SquareStar",
1595
+ "SquareStop",
1596
+ "SquareTerminal",
1597
+ "SquareUser",
1598
+ "SquareUserRound",
1599
+ "SquareX",
1600
+ "SquaresExclude",
1601
+ "SquaresIntersect",
1602
+ "SquaresSubtract",
1603
+ "SquaresUnite",
1604
+ "Squircle",
1605
+ "SquircleDashed",
1606
+ "Squirrel",
1607
+ "Stamp",
1608
+ "Star",
1609
+ "StarHalf",
1610
+ "StarOff",
1611
+ "Stars",
1612
+ "StepBack",
1613
+ "StepForward",
1614
+ "Stethoscope",
1615
+ "Sticker",
1616
+ "StickyNote",
1617
+ "StopCircle",
1618
+ "Store",
1619
+ "StretchHorizontal",
1620
+ "StretchVertical",
1621
+ "Strikethrough",
1622
+ "Subscript",
1623
+ "Subtitles",
1624
+ "Sun",
1625
+ "SunDim",
1626
+ "SunMedium",
1627
+ "SunMoon",
1628
+ "SunSnow",
1629
+ "Sunrise",
1630
+ "Sunset",
1631
+ "Superscript",
1632
+ "SwatchBook",
1633
+ "SwissFranc",
1634
+ "SwitchCamera",
1635
+ "Sword",
1636
+ "Swords",
1637
+ "Syringe",
1638
+ "Table",
1639
+ "Table2",
1640
+ "TableCellsMerge",
1641
+ "TableCellsSplit",
1642
+ "TableColumnsSplit",
1643
+ "TableConfig",
1644
+ "TableOfContents",
1645
+ "TableProperties",
1646
+ "TableRowsSplit",
1647
+ "Tablet",
1648
+ "TabletSmartphone",
1649
+ "Tablets",
1650
+ "Tag",
1651
+ "Tags",
1652
+ "Tally1",
1653
+ "Tally2",
1654
+ "Tally3",
1655
+ "Tally4",
1656
+ "Tally5",
1657
+ "Tangent",
1658
+ "Target",
1659
+ "Telescope",
1660
+ "Tent",
1661
+ "TentTree",
1662
+ "Terminal",
1663
+ "TerminalSquare",
1664
+ "TestTube",
1665
+ "TestTube2",
1666
+ "TestTubeDiagonal",
1667
+ "TestTubes",
1668
+ "Text",
1669
+ "TextAlignCenter",
1670
+ "TextAlignEnd",
1671
+ "TextAlignJustify",
1672
+ "TextAlignStart",
1673
+ "TextCursor",
1674
+ "TextCursorInput",
1675
+ "TextInitial",
1676
+ "TextQuote",
1677
+ "TextSearch",
1678
+ "TextSelect",
1679
+ "TextSelection",
1680
+ "TextWrap",
1681
+ "Theater",
1682
+ "Thermometer",
1683
+ "ThermometerSnowflake",
1684
+ "ThermometerSun",
1685
+ "ThumbsDown",
1686
+ "ThumbsUp",
1687
+ "Ticket",
1688
+ "TicketCheck",
1689
+ "TicketMinus",
1690
+ "TicketPercent",
1691
+ "TicketPlus",
1692
+ "TicketSlash",
1693
+ "TicketX",
1694
+ "Tickets",
1695
+ "TicketsPlane",
1696
+ "Timer",
1697
+ "TimerOff",
1698
+ "TimerReset",
1699
+ "ToggleLeft",
1700
+ "ToggleRight",
1701
+ "Toilet",
1702
+ "ToolCase",
1703
+ "Tornado",
1704
+ "Torus",
1705
+ "Touchpad",
1706
+ "TouchpadOff",
1707
+ "TowerControl",
1708
+ "ToyBrick",
1709
+ "Tractor",
1710
+ "TrafficCone",
1711
+ "Train",
1712
+ "TrainFront",
1713
+ "TrainFrontTunnel",
1714
+ "TrainTrack",
1715
+ "TramFront",
1716
+ "Transgender",
1717
+ "Trash",
1718
+ "Trash2",
1719
+ "TreeDeciduous",
1720
+ "TreePalm",
1721
+ "TreePine",
1722
+ "Trees",
1723
+ "Trello",
1724
+ "TrendingDown",
1725
+ "TrendingUp",
1726
+ "TrendingUpDown",
1727
+ "Triangle",
1728
+ "TriangleAlert",
1729
+ "TriangleDashed",
1730
+ "TriangleRight",
1731
+ "Trophy",
1732
+ "Truck",
1733
+ "TruckElectric",
1734
+ "TurkishLira",
1735
+ "Turntable",
1736
+ "Turtle",
1737
+ "Tv",
1738
+ "Tv2",
1739
+ "TvMinimal",
1740
+ "TvMinimalPlay",
1741
+ "Twitch",
1742
+ "Twitter",
1743
+ "Type",
1744
+ "TypeOutline",
1745
+ "Umbrella",
1746
+ "UmbrellaOff",
1747
+ "Underline",
1748
+ "Undo",
1749
+ "Undo2",
1750
+ "UndoDot",
1751
+ "UnfoldHorizontal",
1752
+ "UnfoldVertical",
1753
+ "Ungroup",
1754
+ "University",
1755
+ "Unlink",
1756
+ "Unlink2",
1757
+ "Unlock",
1758
+ "UnlockKeyhole",
1759
+ "Unplug",
1760
+ "Upload",
1761
+ "UploadCloud",
1762
+ "Usb",
1763
+ "User",
1764
+ "User2",
1765
+ "UserCheck",
1766
+ "UserCheck2",
1767
+ "UserCircle",
1768
+ "UserCircle2",
1769
+ "UserCog",
1770
+ "UserCog2",
1771
+ "UserLock",
1772
+ "UserMinus",
1773
+ "UserMinus2",
1774
+ "UserPen",
1775
+ "UserPlus",
1776
+ "UserPlus2",
1777
+ "UserRound",
1778
+ "UserRoundCheck",
1779
+ "UserRoundCog",
1780
+ "UserRoundMinus",
1781
+ "UserRoundPen",
1782
+ "UserRoundPlus",
1783
+ "UserRoundSearch",
1784
+ "UserRoundX",
1785
+ "UserSearch",
1786
+ "UserSquare",
1787
+ "UserSquare2",
1788
+ "UserStar",
1789
+ "UserX",
1790
+ "UserX2",
1791
+ "Users",
1792
+ "Users2",
1793
+ "UsersRound",
1794
+ "Utensils",
1795
+ "UtensilsCrossed",
1796
+ "UtilityPole",
1797
+ "Variable",
1798
+ "Vault",
1799
+ "VectorSquare",
1800
+ "Vegan",
1801
+ "VenetianMask",
1802
+ "Venus",
1803
+ "VenusAndMars",
1804
+ "Verified",
1805
+ "Vibrate",
1806
+ "VibrateOff",
1807
+ "Video",
1808
+ "VideoOff",
1809
+ "Videotape",
1810
+ "View",
1811
+ "Voicemail",
1812
+ "Volleyball",
1813
+ "Volume",
1814
+ "Volume1",
1815
+ "Volume2",
1816
+ "VolumeOff",
1817
+ "VolumeX",
1818
+ "Vote",
1819
+ "Wallet",
1820
+ "Wallet2",
1821
+ "WalletCards",
1822
+ "WalletMinimal",
1823
+ "Wallpaper",
1824
+ "Wand",
1825
+ "Wand2",
1826
+ "WandSparkles",
1827
+ "Warehouse",
1828
+ "WashingMachine",
1829
+ "Watch",
1830
+ "Waves",
1831
+ "WavesLadder",
1832
+ "Waypoints",
1833
+ "Webcam",
1834
+ "Webhook",
1835
+ "WebhookOff",
1836
+ "Weight",
1837
+ "Wheat",
1838
+ "WheatOff",
1839
+ "WholeWord",
1840
+ "Wifi",
1841
+ "WifiCog",
1842
+ "WifiHigh",
1843
+ "WifiLow",
1844
+ "WifiOff",
1845
+ "WifiPen",
1846
+ "WifiSync",
1847
+ "WifiZero",
1848
+ "Wind",
1849
+ "WindArrowDown",
1850
+ "Wine",
1851
+ "WineOff",
1852
+ "Workflow",
1853
+ "Worm",
1854
+ "WrapText",
1855
+ "Wrench",
1856
+ "X",
1857
+ "XCircle",
1858
+ "XOctagon",
1859
+ "XSquare",
1860
+ "Youtube",
1861
+ "Zap",
1862
+ "ZapOff",
1863
+ "ZoomIn",
1864
+ "ZoomOut"
1865
+ ]
1866
+ }
multi_llm_chatbot_backend/app/utils/lucide_icons.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Lucide icon name registry.
3
+
4
+ Reads a pre-generated list of valid PascalCase Lucide icon names from a
5
+ bundled JSON file. Regenerate with::
6
+
7
+ python3 scripts/generate_icon_names.py
8
+ """
9
+
10
+ import json
11
+ import logging
12
+ from functools import lru_cache
13
+ from pathlib import Path
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ _ICON_NAMES_JSON = Path(__file__).resolve().parent / "_lucide_icon_names.json"
18
+
19
+
20
+ @lru_cache(maxsize=1)
21
+ def get_valid_icon_names() -> frozenset[str]:
22
+ """Return the set of valid PascalCase Lucide icon names."""
23
+ try:
24
+ data = json.loads(_ICON_NAMES_JSON.read_text(encoding="utf-8"))
25
+ except (OSError, json.JSONDecodeError) as exc:
26
+ logger.error("Failed to read icon names from %s: %s", _ICON_NAMES_JSON, exc)
27
+ return frozenset()
28
+
29
+ icons = frozenset(data["icons"])
30
+ logger.info("Loaded %d Lucide icon names (v%s)", len(icons), data.get("version"))
31
+ return icons
scripts/generate_icon_names.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Fetch valid Lucide icon names by introspecting the installed lucide-react package.
3
+
4
+ Requires node_modules to be installed in phd-advisor-frontend/:
5
+
6
+ cd phd-advisor-frontend && npm install
7
+ python3 scripts/generate_icon_names.py
8
+ """
9
+
10
+ import json
11
+ import subprocess
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ REPO_ROOT = Path(__file__).resolve().parents[1]
16
+ PACKAGE_JSON = REPO_ROOT / "phd-advisor-frontend" / "package.json"
17
+ FRONTEND_DIR = REPO_ROOT / "phd-advisor-frontend"
18
+ OUTPUT_FILE = (
19
+ REPO_ROOT
20
+ / "multi_llm_chatbot_backend"
21
+ / "app"
22
+ / "utils"
23
+ / "_lucide_icon_names.json"
24
+ )
25
+
26
+ JS_SNIPPET = """\
27
+ const icons = require('lucide-react');
28
+ const names = Object.keys(icons).filter(k => /^[A-Z]/.test(k) && !k.endsWith('Icon') && !k.startsWith('Lucide')).sort();
29
+ console.log(JSON.stringify(names));
30
+ """
31
+
32
+
33
+ def main() -> int:
34
+ package_data = json.loads(PACKAGE_JSON.read_text(encoding="utf-8"))
35
+ version = package_data["dependencies"]["lucide-react"].lstrip("^~")
36
+
37
+ node_modules = FRONTEND_DIR / "node_modules" / "lucide-react"
38
+ if not node_modules.exists():
39
+ print(
40
+ f"Error: lucide-react not found at {node_modules}\n"
41
+ f"Run 'cd phd-advisor-frontend && npm install' first.",
42
+ file=sys.stderr,
43
+ )
44
+ return 1
45
+
46
+ print(f"Introspecting lucide-react@{version} exports via Node ...")
47
+ result = subprocess.run(
48
+ ["node", "-e", JS_SNIPPET],
49
+ cwd=str(FRONTEND_DIR),
50
+ capture_output=True,
51
+ text=True,
52
+ )
53
+
54
+ if result.returncode != 0:
55
+ print(f"Node failed:\n{result.stderr}", file=sys.stderr)
56
+ return 1
57
+
58
+ pascal_names = json.loads(result.stdout)
59
+
60
+ OUTPUT_FILE.write_text(
61
+ json.dumps({"version": version, "icons": pascal_names}, indent=2) + "\n",
62
+ encoding="utf-8",
63
+ )
64
+ print(f"Wrote {len(pascal_names)} icon names (v{version}) to {OUTPUT_FILE}")
65
+ return 0
66
+
67
+
68
+ if __name__ == "__main__":
69
+ sys.exit(main())