@qwickapps/react-framework 1.5.6 β†’ 1.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/components/QwickApp.d.ts.map +1 -1
  2. package/dist/contexts/NavigationContext.d.ts.map +1 -1
  3. package/dist/hooks/useBaseProps.d.ts +12 -1161
  4. package/dist/hooks/useBaseProps.d.ts.map +1 -1
  5. package/dist/index.esm.js +387 -232
  6. package/dist/index.js +385 -230
  7. package/dist/palettes/manifest.json +19 -19
  8. package/dist/palettes/palette-autumn.1.4.9.css +172 -0
  9. package/dist/palettes/palette-autumn.1.4.9.min.css +1 -0
  10. package/dist/palettes/palette-autumn.1.5.0.css +172 -0
  11. package/dist/palettes/palette-autumn.1.5.0.min.css +1 -0
  12. package/dist/palettes/palette-autumn.1.5.1.css +172 -0
  13. package/dist/palettes/palette-autumn.1.5.1.min.css +1 -0
  14. package/dist/palettes/palette-autumn.1.5.2.css +172 -0
  15. package/dist/palettes/palette-autumn.1.5.2.min.css +1 -0
  16. package/dist/palettes/palette-autumn.1.5.3.css +172 -0
  17. package/dist/palettes/palette-autumn.1.5.3.min.css +1 -0
  18. package/dist/palettes/palette-autumn.1.5.4.css +172 -0
  19. package/dist/palettes/palette-autumn.1.5.4.min.css +1 -0
  20. package/dist/palettes/palette-autumn.1.5.5.css +172 -0
  21. package/dist/palettes/palette-autumn.1.5.5.min.css +1 -0
  22. package/dist/palettes/palette-autumn.1.5.7.css +172 -0
  23. package/dist/palettes/palette-autumn.1.5.7.min.css +1 -0
  24. package/dist/palettes/palette-cosmic.1.4.9.css +172 -0
  25. package/dist/palettes/palette-cosmic.1.4.9.min.css +1 -0
  26. package/dist/palettes/palette-cosmic.1.5.0.css +172 -0
  27. package/dist/palettes/palette-cosmic.1.5.0.min.css +1 -0
  28. package/dist/palettes/palette-cosmic.1.5.1.css +172 -0
  29. package/dist/palettes/palette-cosmic.1.5.1.min.css +1 -0
  30. package/dist/palettes/palette-cosmic.1.5.2.css +172 -0
  31. package/dist/palettes/palette-cosmic.1.5.2.min.css +1 -0
  32. package/dist/palettes/palette-cosmic.1.5.3.css +172 -0
  33. package/dist/palettes/palette-cosmic.1.5.3.min.css +1 -0
  34. package/dist/palettes/palette-cosmic.1.5.4.css +172 -0
  35. package/dist/palettes/palette-cosmic.1.5.4.min.css +1 -0
  36. package/dist/palettes/palette-cosmic.1.5.5.css +172 -0
  37. package/dist/palettes/palette-cosmic.1.5.5.min.css +1 -0
  38. package/dist/palettes/palette-cosmic.1.5.7.css +172 -0
  39. package/dist/palettes/palette-cosmic.1.5.7.min.css +1 -0
  40. package/dist/palettes/palette-default.1.4.9.css +178 -0
  41. package/dist/palettes/palette-default.1.4.9.min.css +1 -0
  42. package/dist/palettes/palette-default.1.5.0.css +178 -0
  43. package/dist/palettes/palette-default.1.5.0.min.css +1 -0
  44. package/dist/palettes/palette-default.1.5.1.css +178 -0
  45. package/dist/palettes/palette-default.1.5.1.min.css +1 -0
  46. package/dist/palettes/palette-default.1.5.2.css +178 -0
  47. package/dist/palettes/palette-default.1.5.2.min.css +1 -0
  48. package/dist/palettes/palette-default.1.5.3.css +178 -0
  49. package/dist/palettes/palette-default.1.5.3.min.css +1 -0
  50. package/dist/palettes/palette-default.1.5.4.css +178 -0
  51. package/dist/palettes/palette-default.1.5.4.min.css +1 -0
  52. package/dist/palettes/palette-default.1.5.5.css +178 -0
  53. package/dist/palettes/palette-default.1.5.5.min.css +1 -0
  54. package/dist/palettes/palette-default.1.5.7.css +178 -0
  55. package/dist/palettes/palette-default.1.5.7.min.css +1 -0
  56. package/dist/palettes/palette-ocean.1.4.9.css +172 -0
  57. package/dist/palettes/palette-ocean.1.4.9.min.css +1 -0
  58. package/dist/palettes/palette-ocean.1.5.0.css +172 -0
  59. package/dist/palettes/palette-ocean.1.5.0.min.css +1 -0
  60. package/dist/palettes/palette-ocean.1.5.1.css +172 -0
  61. package/dist/palettes/palette-ocean.1.5.1.min.css +1 -0
  62. package/dist/palettes/palette-ocean.1.5.2.css +172 -0
  63. package/dist/palettes/palette-ocean.1.5.2.min.css +1 -0
  64. package/dist/palettes/palette-ocean.1.5.3.css +172 -0
  65. package/dist/palettes/palette-ocean.1.5.3.min.css +1 -0
  66. package/dist/palettes/palette-ocean.1.5.4.css +172 -0
  67. package/dist/palettes/palette-ocean.1.5.4.min.css +1 -0
  68. package/dist/palettes/palette-ocean.1.5.5.css +172 -0
  69. package/dist/palettes/palette-ocean.1.5.5.min.css +1 -0
  70. package/dist/palettes/palette-ocean.1.5.7.css +172 -0
  71. package/dist/palettes/palette-ocean.1.5.7.min.css +1 -0
  72. package/dist/palettes/palette-spring.1.4.9.css +160 -0
  73. package/dist/palettes/palette-spring.1.4.9.min.css +1 -0
  74. package/dist/palettes/palette-spring.1.5.0.css +160 -0
  75. package/dist/palettes/palette-spring.1.5.0.min.css +1 -0
  76. package/dist/palettes/palette-spring.1.5.1.css +160 -0
  77. package/dist/palettes/palette-spring.1.5.1.min.css +1 -0
  78. package/dist/palettes/palette-spring.1.5.2.css +160 -0
  79. package/dist/palettes/palette-spring.1.5.2.min.css +1 -0
  80. package/dist/palettes/palette-spring.1.5.3.css +166 -0
  81. package/dist/palettes/palette-spring.1.5.3.min.css +1 -0
  82. package/dist/palettes/palette-spring.1.5.4.css +166 -0
  83. package/dist/palettes/palette-spring.1.5.4.min.css +1 -0
  84. package/dist/palettes/palette-spring.1.5.5.css +166 -0
  85. package/dist/palettes/palette-spring.1.5.5.min.css +1 -0
  86. package/dist/palettes/palette-spring.1.5.7.css +166 -0
  87. package/dist/palettes/palette-spring.1.5.7.min.css +1 -0
  88. package/dist/palettes/palette-winter.1.4.9.css +172 -0
  89. package/dist/palettes/palette-winter.1.4.9.min.css +1 -0
  90. package/dist/palettes/palette-winter.1.5.0.css +172 -0
  91. package/dist/palettes/palette-winter.1.5.0.min.css +1 -0
  92. package/dist/palettes/palette-winter.1.5.1.css +172 -0
  93. package/dist/palettes/palette-winter.1.5.1.min.css +1 -0
  94. package/dist/palettes/palette-winter.1.5.2.css +172 -0
  95. package/dist/palettes/palette-winter.1.5.2.min.css +1 -0
  96. package/dist/palettes/palette-winter.1.5.3.css +172 -0
  97. package/dist/palettes/palette-winter.1.5.3.min.css +1 -0
  98. package/dist/palettes/palette-winter.1.5.4.css +172 -0
  99. package/dist/palettes/palette-winter.1.5.4.min.css +1 -0
  100. package/dist/palettes/palette-winter.1.5.5.css +172 -0
  101. package/dist/palettes/palette-winter.1.5.5.min.css +1 -0
  102. package/dist/palettes/palette-winter.1.5.7.css +172 -0
  103. package/dist/palettes/palette-winter.1.5.7.min.css +1 -0
  104. package/dist/utils/iconMap.d.ts +21 -8
  105. package/dist/utils/iconMap.d.ts.map +1 -1
  106. package/package.json +1 -1
  107. package/src/__tests__/utils/iconMap.test.tsx +197 -0
  108. package/src/components/QwickApp.tsx +8 -1
  109. package/src/contexts/NavigationContext.tsx +21 -15
  110. package/src/utils/iconMap.tsx +209 -153
@@ -1,81 +1,101 @@
1
1
  /**
2
2
  * Icon Mapping Utility
3
- *
3
+ *
4
4
  * Provides centralized icon mapping for both Material-UI components and emoji representations.
5
5
  * Used across the framework for consistent icon rendering in buttons, navigation, admin UI, etc.
6
- *
6
+ *
7
+ * Features:
8
+ * - Static map for commonly used icons with emoji support
9
+ * - Fallback to HelpOutline icon for unmapped icons (with console warning)
10
+ * - Runtime icon registration via registerIcon() for app-specific icons
11
+ *
7
12
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
13
  */
9
14
 
10
15
  import React from 'react';
16
+
17
+ // Material UI Icons - sorted alphabetically
11
18
  import {
19
+ AccountCircle,
20
+ Add,
21
+ Architecture,
22
+ ArrowBack,
23
+ ArrowForward,
12
24
  Article,
13
- Home,
25
+ AttachMoney,
26
+ Autorenew,
27
+ Block,
14
28
  Book,
15
- Download,
29
+ Business,
30
+ Check,
31
+ CheckCircle,
32
+ Close,
33
+ Cloud,
16
34
  CloudDownload,
17
35
  CloudUpload,
36
+ Code,
18
37
  Computer,
19
- Settings,
38
+ Construction,
20
39
  Dashboard,
40
+ Delete,
41
+ Download,
42
+ Edit,
43
+ Email,
44
+ Explore,
45
+ Favorite,
46
+ Group,
47
+ Help,
48
+ HelpOutline,
49
+ Home,
21
50
  Info,
51
+ InsertPhoto,
52
+ IntegrationInstructions,
22
53
  Inventory,
23
54
  Inventory2,
24
- Help,
25
- Add,
26
- Edit,
27
- Delete,
28
- Check,
29
- Close,
30
- ArrowForward,
31
- ArrowBack,
55
+ Key,
56
+ Layers,
57
+ LibraryBooks,
58
+ LocalOffer,
59
+ Lock,
60
+ LockOpen,
61
+ Login,
62
+ Logout,
63
+ ManageAccounts,
64
+ Memory,
32
65
  Menu,
33
- Search,
34
- Favorite,
35
- Star,
36
- Share,
66
+ Notifications,
67
+ People,
68
+ Person,
69
+ PersonSearch,
70
+ Phone,
71
+ PhotoLibrary,
72
+ PlayArrow,
73
+ Psychology,
74
+ Refresh,
75
+ Rocket,
76
+ RotateRight,
77
+ Route,
37
78
  Save,
79
+ Search,
80
+ Security,
38
81
  Send,
39
- Email,
40
- Phone,
41
- Person,
42
- Group,
43
- Business,
82
+ Settings,
83
+ Share,
84
+ Shield,
44
85
  ShoppingCart,
45
86
  Speed,
87
+ Star,
88
+ Storage,
46
89
  SupportAgent,
90
+ Sync,
91
+ TrendingUp,
47
92
  Tune,
48
- AttachMoney,
49
- Lock,
50
- LockOpen,
93
+ VerifiedUser,
51
94
  Visibility,
52
95
  VisibilityOff,
53
- // New icons for seed content
54
- Psychology,
55
- Autorenew,
56
- Code,
57
- IntegrationInstructions,
58
- Construction,
59
- Work,
60
- Layers,
61
- TrendingUp,
62
- Route,
63
- Sync,
64
- Architecture,
65
- Security,
66
- VerifiedUser,
67
- // Additional icons for control panels and admin UIs
68
96
  VpnKey,
69
- Key,
70
- PersonSearch,
71
- ManageAccounts,
72
- Storage,
73
- Refresh,
74
- Block,
75
- CheckCircle,
76
- RotateRight,
77
- Memory,
78
- LocalOffer,
97
+ Work,
98
+ WorkspacePremium,
79
99
  } from '@mui/icons-material';
80
100
 
81
101
  /**
@@ -87,140 +107,175 @@ export interface IconMapping {
87
107
  }
88
108
 
89
109
  /**
90
- * Centralized icon registry mapping icon names to their representations
91
- * Supports both Material-UI components and emoji for different contexts
110
+ * Centralized icon registry mapping icon names to their representations.
111
+ * Sorted alphabetically by category, then by key within each category.
112
+ *
113
+ * For icons not in this map, getIconComponent() will return a HelpOutline fallback
114
+ * and log a warning. Use registerIcon() to add app-specific icons at runtime.
92
115
  */
93
116
  export const iconMap: Record<string, IconMapping> = {
94
- // Navigation & Layout
95
- home: { emoji: '🏠', component: Home },
96
- menu: { emoji: '☰', component: Menu },
97
- dashboard: { emoji: 'πŸ“Š', component: Dashboard },
98
-
99
- // Information & Help
100
- info: { emoji: 'ℹ️', component: Info },
101
- about: { emoji: 'ℹ️', component: Info },
102
- help: { emoji: '❓', component: Help },
103
- book: { emoji: 'πŸ“–', component: Book },
104
-
105
- // Communication
106
- email: { emoji: 'πŸ“§', component: Email },
107
- contact: { emoji: 'πŸ“§', component: Email },
108
- phone: { emoji: 'πŸ“±', component: Phone },
109
- send: { emoji: 'πŸ“€', component: Send },
110
-
111
- // Actions
117
+ // === Actions ===
112
118
  add: { emoji: 'βž•', component: Add },
113
- edit: { emoji: '✏️', component: Edit },
114
- delete: { emoji: 'πŸ—‘οΈ', component: Delete },
115
- save: { emoji: 'πŸ’Ύ', component: Save },
116
119
  check: { emoji: 'βœ“', component: Check },
120
+ check_circle: { emoji: 'βœ…', component: CheckCircle },
117
121
  close: { emoji: 'βœ•', component: Close },
118
-
119
- // Navigation
120
- arrowforward: { emoji: 'β†’', component: ArrowForward },
121
- arrowback: { emoji: '←', component: ArrowBack },
122
-
123
- // Content
122
+ delete: { emoji: 'πŸ—‘οΈ', component: Delete },
123
+ edit: { emoji: '✏️', component: Edit },
124
+ refresh: { emoji: 'πŸ”„', component: Refresh },
125
+ rotate_right: { emoji: 'πŸ”„', component: RotateRight },
126
+ save: { emoji: 'πŸ’Ύ', component: Save },
124
127
  search: { emoji: 'πŸ”', component: Search },
128
+ send: { emoji: 'πŸ“€', component: Send },
125
129
  share: { emoji: 'πŸ”—', component: Share },
126
- download: { emoji: '⬇️', component: Download },
127
- clouddownload: { emoji: 'β˜οΈβ¬‡οΈ', component: CloudDownload },
128
- cloudupload: { emoji: 'β˜οΈβ¬†οΈ', component: CloudUpload },
129
-
130
- // User & Social
131
- person: { emoji: 'πŸ‘€', component: Person },
132
- user: { emoji: 'πŸ‘€', component: Person },
133
- group: { emoji: 'πŸ‘₯', component: Group },
134
- favorite: { emoji: '❀️', component: Favorite },
135
- star: { emoji: '⭐', component: Star },
136
- verified_user: { emoji: 'βœ…', component: VerifiedUser },
137
-
138
- // Business
139
- business: { emoji: '🏒', component: Business },
140
- shoppingcart: { emoji: 'πŸ›’', component: ShoppingCart },
141
- cart: { emoji: 'πŸ›’', component: ShoppingCart },
142
- attachmoney: { emoji: 'πŸ’°', component: AttachMoney },
143
-
144
- // Security
130
+ sync: { emoji: 'πŸ”„', component: Sync },
131
+
132
+ // === Authentication & Security ===
133
+ block: { emoji: '🚫', component: Block },
134
+ key: { emoji: 'πŸ”‘', component: Key },
145
135
  lock: { emoji: 'πŸ”’', component: Lock },
146
- lockopen: { emoji: 'πŸ”“', component: LockOpen },
136
+ lock_open: { emoji: 'πŸ”“', component: LockOpen },
137
+ lockopen: { emoji: 'πŸ”“', component: LockOpen }, // alias
138
+ login: { emoji: 'πŸ”‘', component: Login },
139
+ logout: { emoji: 'πŸšͺ', component: Logout },
140
+ security: { emoji: 'πŸ”', component: Security },
141
+ shield: { emoji: 'πŸ›‘οΈ', component: Shield },
142
+ verified_user: { emoji: 'βœ…', component: VerifiedUser },
147
143
  visibility: { emoji: 'πŸ‘οΈ', component: Visibility },
148
- visibilityoff: { emoji: 'πŸ™ˆ', component: VisibilityOff },
149
-
150
- // System
151
- settings: { emoji: 'βš™οΈ', component: Settings },
152
- computer: { emoji: 'πŸ’»', component: Computer },
153
-
154
- // Content Types
155
- article: { emoji: 'πŸ“°', component: Article },
156
- blog: { emoji: 'πŸ“', component: Book },
157
- news: { emoji: 'πŸ“°', component: Book },
158
- products: { emoji: 'πŸ›οΈ', component: ShoppingCart },
159
- services: { emoji: 'βš™οΈ', component: Settings },
160
- portfolio: { emoji: 'πŸ’Ό', component: Business },
161
- gallery: { emoji: 'πŸ–ΌοΈ', component: Business },
162
- inventory: { emoji: 'πŸ“¦', component: Inventory },
163
- inventory_2: { emoji: 'πŸ“¦', component: Inventory2 },
164
- speed: { emoji: '⚑', component: Speed },
144
+ visibility_off: { emoji: 'πŸ™ˆ', component: VisibilityOff },
145
+ visibilityoff: { emoji: 'πŸ™ˆ', component: VisibilityOff }, // alias
146
+ vpn_key: { emoji: 'πŸ”', component: VpnKey },
147
+
148
+ // === Business & Commerce ===
149
+ attach_money: { emoji: 'πŸ’°', component: AttachMoney },
150
+ attachmoney: { emoji: 'πŸ’°', component: AttachMoney }, // alias
151
+ business: { emoji: '🏒', component: Business },
152
+ cart: { emoji: 'πŸ›’', component: ShoppingCart }, // alias
153
+ shopping_cart: { emoji: 'πŸ›’', component: ShoppingCart },
154
+ shoppingcart: { emoji: 'πŸ›’', component: ShoppingCart }, // alias
155
+ work: { emoji: 'πŸ’Ό', component: Work },
156
+ workspace_premium: { emoji: '⭐', component: WorkspacePremium },
157
+
158
+ // === Communication ===
159
+ contact: { emoji: 'πŸ“§', component: Email }, // alias
160
+ email: { emoji: 'πŸ“§', component: Email },
161
+ mail: { emoji: 'πŸ“§', component: Email }, // alias
162
+ notifications: { emoji: 'πŸ””', component: Notifications },
163
+ phone: { emoji: 'πŸ“±', component: Phone },
165
164
  support_agent: { emoji: 'πŸ›ŽοΈ', component: SupportAgent },
166
- tune: { emoji: 'πŸŽ›οΈ', component: Tune },
167
165
 
168
- // Development & Technology
169
- code: { emoji: 'πŸ’»', component: Code },
170
- psychology: { emoji: '🧠', component: Psychology },
166
+ // === Content & Media ===
167
+ article: { emoji: 'πŸ“°', component: Article },
168
+ blog: { emoji: 'πŸ“', component: Book }, // alias
169
+ book: { emoji: 'πŸ“–', component: Book },
170
+ gallery: { emoji: 'πŸ–ΌοΈ', component: InsertPhoto }, // alias
171
+ image: { emoji: 'πŸ–ΌοΈ', component: InsertPhoto },
172
+ insert_photo: { emoji: 'πŸ–ΌοΈ', component: InsertPhoto },
173
+ library_books: { emoji: 'πŸ“š', component: LibraryBooks },
174
+ news: { emoji: 'πŸ“°', component: Article }, // alias
175
+ photo_library: { emoji: 'πŸ“Έ', component: PhotoLibrary },
176
+ play: { emoji: '▢️', component: PlayArrow }, // alias
177
+ play_arrow: { emoji: '▢️', component: PlayArrow },
178
+ portfolio: { emoji: 'πŸ’Ό', component: Business }, // alias
179
+
180
+ // === Development & Technology ===
181
+ architecture: { emoji: 'πŸ›οΈ', component: Architecture },
171
182
  autorenew: { emoji: 'πŸ”„', component: Autorenew },
172
- integration_instructions: { emoji: 'πŸ”Œ', component: IntegrationInstructions },
183
+ cloud: { emoji: '☁️', component: Cloud },
184
+ cloud_download: { emoji: 'β˜οΈβ¬‡οΈ', component: CloudDownload },
185
+ cloud_upload: { emoji: 'β˜οΈβ¬†οΈ', component: CloudUpload },
186
+ clouddownload: { emoji: 'β˜οΈβ¬‡οΈ', component: CloudDownload }, // alias
187
+ cloudupload: { emoji: 'β˜οΈβ¬†οΈ', component: CloudUpload }, // alias
188
+ code: { emoji: 'πŸ’»', component: Code },
189
+ computer: { emoji: 'πŸ’»', component: Computer },
173
190
  construction: { emoji: '🚧', component: Construction },
174
- work: { emoji: 'πŸ’Ό', component: Work },
191
+ integration_instructions: { emoji: 'πŸ”Œ', component: IntegrationInstructions },
192
+ memory: { emoji: '🧠', component: Memory },
193
+ psychology: { emoji: '🧠', component: Psychology },
194
+ rocket: { emoji: 'πŸš€', component: Rocket },
195
+ storage: { emoji: 'πŸ’Ύ', component: Storage },
196
+
197
+ // === Navigation & Layout ===
198
+ arrow_back: { emoji: '←', component: ArrowBack },
199
+ arrow_forward: { emoji: 'β†’', component: ArrowForward },
200
+ arrowback: { emoji: '←', component: ArrowBack }, // alias
201
+ arrowforward: { emoji: 'β†’', component: ArrowForward }, // alias
202
+ dashboard: { emoji: 'πŸ“Š', component: Dashboard },
203
+ download: { emoji: '⬇️', component: Download },
204
+ explore: { emoji: '🧭', component: Explore },
205
+ home: { emoji: '🏠', component: Home },
175
206
  layers: { emoji: 'πŸ“š', component: Layers },
176
- trending_up: { emoji: 'πŸ“ˆ', component: TrendingUp },
207
+ menu: { emoji: '☰', component: Menu },
177
208
  route: { emoji: 'πŸ—ΊοΈ', component: Route },
178
- sync: { emoji: 'πŸ”„', component: Sync },
179
- architecture: { emoji: 'πŸ›οΈ', component: Architecture },
180
- security: { emoji: 'πŸ”', component: Security },
209
+ settings: { emoji: 'βš™οΈ', component: Settings },
210
+ trending_up: { emoji: 'πŸ“ˆ', component: TrendingUp },
211
+ tune: { emoji: 'πŸŽ›οΈ', component: Tune },
181
212
 
182
- // Control Panel & Admin UI Icons
183
- key: { emoji: 'πŸ”‘', component: Key },
184
- vpn_key: { emoji: 'πŸ”', component: VpnKey },
185
- person_search: { emoji: 'πŸ”', component: PersonSearch },
186
- manage_accounts: { emoji: 'πŸ‘₯', component: ManageAccounts },
187
- storage: { emoji: 'πŸ’Ύ', component: Storage },
188
- refresh: { emoji: 'πŸ”„', component: Refresh },
189
- block: { emoji: '🚫', component: Block },
190
- check_circle: { emoji: 'βœ…', component: CheckCircle },
191
- rotate_right: { emoji: 'πŸ”„', component: RotateRight },
192
- memory: { emoji: '🧠', component: Memory },
213
+ // === Products & Inventory ===
214
+ inventory: { emoji: 'πŸ“¦', component: Inventory },
215
+ inventory_2: { emoji: 'πŸ“¦', component: Inventory2 },
193
216
  local_offer: { emoji: '🏷️', component: LocalOffer },
217
+ products: { emoji: 'πŸ›οΈ', component: ShoppingCart }, // alias
218
+ services: { emoji: 'βš™οΈ', component: Settings }, // alias
219
+ speed: { emoji: '⚑', component: Speed },
220
+
221
+ // === Status & Feedback ===
222
+ about: { emoji: 'ℹ️', component: Info }, // alias
223
+ favorite: { emoji: '❀️', component: Favorite },
224
+ heart: { emoji: '❀️', component: Favorite }, // alias
225
+ help: { emoji: '❓', component: Help },
226
+ info: { emoji: 'ℹ️', component: Info },
227
+ star: { emoji: '⭐', component: Star },
228
+
229
+ // === Users & People ===
230
+ account_circle: { emoji: 'πŸ‘€', component: AccountCircle },
231
+ group: { emoji: 'πŸ‘₯', component: Group },
232
+ manage_accounts: { emoji: 'πŸ‘€', component: ManageAccounts },
233
+ people: { emoji: 'πŸ‘₯', component: People },
234
+ person: { emoji: 'πŸ‘€', component: Person },
235
+ person_search: { emoji: 'πŸ”', component: PersonSearch },
236
+ user: { emoji: 'πŸ‘€', component: Person }, // alias
237
+ users: { emoji: 'πŸ‘₯', component: People }, // alias
194
238
  };
195
239
 
196
240
  /**
197
241
  * Get emoji representation of an icon
198
- * @param iconName - Icon name (case-insensitive)
242
+ * @param iconName - Icon name (case-insensitive, supports snake_case)
199
243
  * @param fallback - Fallback emoji if icon not found (default: πŸ”—)
200
244
  * @returns Emoji string
201
245
  */
202
246
  export function getIconEmoji(iconName: string | undefined, fallback: string = 'πŸ”—'): string {
203
247
  if (!iconName) return fallback;
204
- const mapping = iconMap[iconName.toLowerCase()];
205
- return mapping?.emoji || iconName;
248
+ const normalized = iconName.toLowerCase();
249
+ const mapping = iconMap[normalized];
250
+ return mapping?.emoji || fallback;
206
251
  }
207
252
 
208
253
  /**
209
- * Get Material-UI component representation of an icon
210
- * @param iconName - Icon name (case-insensitive)
211
- * @returns React element or null if not found
254
+ * Get Material-UI component representation of an icon.
255
+ *
256
+ * Uses the static iconMap for known icons. For unmapped icons,
257
+ * returns a HelpOutline fallback and logs a warning.
258
+ *
259
+ * @param iconName - Icon name (case-insensitive, supports snake_case)
260
+ * @returns React element (mapped icon or HelpOutline fallback), or null if no name provided
212
261
  */
213
262
  export function getIconComponent(iconName: string | undefined): React.ReactElement | null {
214
263
  if (!iconName) return null;
215
-
216
- const mapping = iconMap[iconName.toLowerCase()];
217
- if (!mapping?.component) {
218
- console.warn(`[IconMap] Icon "${iconName}" not found in registry`);
219
- return null;
264
+
265
+ const normalized = iconName.toLowerCase();
266
+ const mapping = iconMap[normalized];
267
+
268
+ if (mapping?.component) {
269
+ const IconComponent = mapping.component;
270
+ return <IconComponent />;
271
+ }
272
+
273
+ // Fallback: Return HelpOutline icon and warn about unmapped icon
274
+ // Use registerIcon() to add app-specific icons at runtime
275
+ if (process.env.NODE_ENV !== 'production') {
276
+ console.warn(`[IconMap] Icon "${iconName}" not found. Add it to iconMap or use registerIcon().`);
220
277
  }
221
-
222
- const IconComponent = mapping.component;
223
- return <IconComponent />;
278
+ return <HelpOutline />;
224
279
  }
225
280
 
226
281
  /**
@@ -232,14 +287,15 @@ export function registerIcon(name: string, mapping: IconMapping): void {
232
287
  }
233
288
 
234
289
  /**
235
- * Check if an icon is registered
290
+ * Check if an icon is registered in the static map
291
+ * If false, getIconComponent will return HelpOutline fallback
236
292
  */
237
293
  export function hasIcon(iconName: string): boolean {
238
294
  return iconName.toLowerCase() in iconMap;
239
295
  }
240
296
 
241
297
  /**
242
- * Get all registered icon names
298
+ * Get all registered icon names from the static map
243
299
  */
244
300
  export function getRegisteredIcons(): string[] {
245
301
  return Object.keys(iconMap);