@qwickapps/react-framework 1.5.6 → 1.5.8

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 (121) hide show
  1. package/dist/components/AccessibilityChecker.d.ts.map +1 -1
  2. package/dist/components/Html.d.ts +1 -1
  3. package/dist/components/Html.d.ts.map +1 -1
  4. package/dist/components/Logo.d.ts.map +1 -1
  5. package/dist/components/Markdown.d.ts +2 -2
  6. package/dist/components/Markdown.d.ts.map +1 -1
  7. package/dist/components/QwickApp.d.ts.map +1 -1
  8. package/dist/components/SafeSpan.d.ts +1 -1
  9. package/dist/components/SafeSpan.d.ts.map +1 -1
  10. package/dist/components/base/ModelView.d.ts +1 -1
  11. package/dist/components/base/ModelView.d.ts.map +1 -1
  12. package/dist/components/blocks/Article.d.ts +1 -1
  13. package/dist/components/blocks/Article.d.ts.map +1 -1
  14. package/dist/components/blocks/CardListGrid.d.ts.map +1 -1
  15. package/dist/components/blocks/Code.d.ts.map +1 -1
  16. package/dist/components/blocks/Content.d.ts.map +1 -1
  17. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
  18. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  19. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  20. package/dist/components/blocks/Footer.d.ts.map +1 -1
  21. package/dist/components/blocks/Image.d.ts.map +1 -1
  22. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  23. package/dist/components/blocks/ProductCard.d.ts.map +1 -1
  24. package/dist/components/blocks/Section.d.ts.map +1 -1
  25. package/dist/components/blocks/Text.d.ts +8 -1
  26. package/dist/components/blocks/Text.d.ts.map +1 -1
  27. package/dist/components/buttons/Button.d.ts.map +1 -1
  28. package/dist/components/buttons/PaletteSwitcher.d.ts.map +1 -1
  29. package/dist/components/buttons/ThemeSwitcher.d.ts.map +1 -1
  30. package/dist/components/forms/FormBlock.d.ts +1 -1
  31. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  32. package/dist/components/forms/SchemaFormRenderer.d.ts +28 -0
  33. package/dist/components/forms/SchemaFormRenderer.d.ts.map +1 -0
  34. package/dist/components/forms/index.d.ts +2 -0
  35. package/dist/components/forms/index.d.ts.map +1 -1
  36. package/dist/components/index.d.ts +1 -0
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  39. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  40. package/dist/components/layout/CollapsibleLayout/CollapsibleLayout.d.ts.map +1 -1
  41. package/dist/components/layout/GridLayout.d.ts +5 -0
  42. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  43. package/dist/components/plugins/DataTable.d.ts +57 -0
  44. package/dist/components/plugins/DataTable.d.ts.map +1 -0
  45. package/dist/components/plugins/StatCard.d.ts +44 -0
  46. package/dist/components/plugins/StatCard.d.ts.map +1 -0
  47. package/dist/components/plugins/index.d.ts +13 -0
  48. package/dist/components/plugins/index.d.ts.map +1 -0
  49. package/dist/components/shared/createSerializableView.d.ts.map +1 -1
  50. package/dist/contexts/NavigationContext.d.ts.map +1 -1
  51. package/dist/hooks/useBaseProps.d.ts +1 -1
  52. package/dist/hooks/useBaseProps.d.ts.map +1 -1
  53. package/dist/index.esm.js +5939 -5532
  54. package/dist/index.js +6028 -5618
  55. package/dist/palettes/manifest.json +19 -19
  56. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -1
  57. package/dist/utils/iconMap.d.ts +21 -8
  58. package/dist/utils/iconMap.d.ts.map +1 -1
  59. package/package.json +1 -2
  60. package/src/__tests__/utils/iconMap.test.tsx +197 -0
  61. package/src/components/AccessibilityChecker.tsx +10 -7
  62. package/src/components/ErrorBoundary.tsx +3 -3
  63. package/src/components/Html.tsx +17 -12
  64. package/src/components/Logo.tsx +1 -8
  65. package/src/components/Markdown.tsx +10 -10
  66. package/src/components/QwickApp.tsx +8 -1
  67. package/src/components/ResponsiveMenu.tsx +1 -1
  68. package/src/components/SafeSpan.tsx +9 -9
  69. package/src/components/Scaffold.tsx +4 -4
  70. package/src/components/base/ModelView.tsx +2 -2
  71. package/src/components/blocks/Article.tsx +7 -7
  72. package/src/components/blocks/CardListGrid.tsx +1 -3
  73. package/src/components/blocks/Code.tsx +10 -8
  74. package/src/components/blocks/Content.tsx +2 -4
  75. package/src/components/blocks/CoverImageHeader.tsx +3 -4
  76. package/src/components/blocks/FeatureCard.tsx +2 -4
  77. package/src/components/blocks/FeatureGrid.tsx +2 -4
  78. package/src/components/blocks/Footer.tsx +2 -4
  79. package/src/components/blocks/Image.tsx +8 -5
  80. package/src/components/blocks/PageBannerHeader.tsx +3 -4
  81. package/src/components/blocks/ProductCard.tsx +8 -5
  82. package/src/components/blocks/Section.tsx +6 -4
  83. package/src/components/blocks/Text.tsx +15 -7
  84. package/src/components/buttons/Button.tsx +8 -6
  85. package/src/components/buttons/PaletteSwitcher.tsx +6 -8
  86. package/src/components/buttons/ThemeSwitcher.tsx +8 -9
  87. package/src/components/forms/Captcha.tsx +1 -1
  88. package/src/components/forms/FormBlock.tsx +3 -5
  89. package/src/components/forms/FormCheckbox.tsx +1 -1
  90. package/src/components/forms/FormField.tsx +1 -1
  91. package/src/components/forms/FormSelect.tsx +1 -1
  92. package/src/components/forms/SchemaFormRenderer.tsx +268 -0
  93. package/src/components/forms/__tests__/SchemaFormRenderer.test.tsx +212 -0
  94. package/src/components/forms/index.ts +3 -0
  95. package/src/components/index.ts +1 -0
  96. package/src/components/input/ChoiceInputField.tsx +2 -1
  97. package/src/components/input/HtmlInputField.tsx +14 -9
  98. package/src/components/input/TextField.tsx +1 -1
  99. package/src/components/layout/CollapsibleLayout/CollapsibleLayout.tsx +6 -8
  100. package/src/components/layout/GridLayout.tsx +4 -0
  101. package/src/components/plugins/DataTable.tsx +259 -0
  102. package/src/components/plugins/StatCard.tsx +122 -0
  103. package/src/components/plugins/__tests__/DataTable.test.tsx +158 -0
  104. package/src/components/plugins/index.ts +14 -0
  105. package/src/components/shared/createSerializableView.tsx +8 -6
  106. package/src/contexts/NavigationContext.tsx +21 -15
  107. package/src/hooks/useBaseProps.ts +1 -1
  108. package/src/schemas/transformers/ReactNodeTransformer.ts +13 -10
  109. package/src/utils/iconMap.tsx +290 -174
  110. /package/dist/palettes/{palette-autumn.1.5.6.css → palette-autumn.1.5.8.css} +0 -0
  111. /package/dist/palettes/{palette-autumn.1.5.6.min.css → palette-autumn.1.5.8.min.css} +0 -0
  112. /package/dist/palettes/{palette-cosmic.1.5.6.css → palette-cosmic.1.5.8.css} +0 -0
  113. /package/dist/palettes/{palette-cosmic.1.5.6.min.css → palette-cosmic.1.5.8.min.css} +0 -0
  114. /package/dist/palettes/{palette-default.1.5.6.css → palette-default.1.5.8.css} +0 -0
  115. /package/dist/palettes/{palette-default.1.5.6.min.css → palette-default.1.5.8.min.css} +0 -0
  116. /package/dist/palettes/{palette-ocean.1.5.6.css → palette-ocean.1.5.8.css} +0 -0
  117. /package/dist/palettes/{palette-ocean.1.5.6.min.css → palette-ocean.1.5.8.min.css} +0 -0
  118. /package/dist/palettes/{palette-spring.1.5.6.css → palette-spring.1.5.8.css} +0 -0
  119. /package/dist/palettes/{palette-spring.1.5.6.min.css → palette-spring.1.5.8.min.css} +0 -0
  120. /package/dist/palettes/{palette-winter.1.5.6.css → palette-winter.1.5.8.css} +0 -0
  121. /package/dist/palettes/{palette-winter.1.5.6.min.css → palette-winter.1.5.8.min.css} +0 -0
@@ -185,7 +185,8 @@ export class ReactNodeTransformer {
185
185
  }
186
186
 
187
187
  // Use Html component to render HTML content safely
188
- return createElement(Html, { key, children: props.children });
188
+ const typedProps = props as Record<string, unknown>;
189
+ return createElement(Html, { key, children: typedProps.children });
189
190
  }
190
191
 
191
192
  /**
@@ -217,22 +218,24 @@ export class ReactNodeTransformer {
217
218
  * @returns Text content or null
218
219
  */
219
220
  private static extractTextContent(props: unknown): string | null {
220
- if (!props) return null;
221
+ if (!props || typeof props !== 'object') return null;
221
222
 
222
- if (typeof props.children === 'string') {
223
- return props.children;
223
+ const typedProps = props as Record<string, unknown>;
224
+
225
+ if (typeof typedProps.children === 'string') {
226
+ return typedProps.children;
224
227
  }
225
228
 
226
- if (props.title && typeof props.title === 'string') {
227
- return props.title;
229
+ if (typedProps.title && typeof typedProps.title === 'string') {
230
+ return typedProps.title;
228
231
  }
229
232
 
230
- if (props.label && typeof props.label === 'string') {
231
- return props.label;
233
+ if (typedProps.label && typeof typedProps.label === 'string') {
234
+ return typedProps.label;
232
235
  }
233
236
 
234
- if (props.text && typeof props.text === 'string') {
235
- return props.text;
237
+ if (typedProps.text && typeof typedProps.text === 'string') {
238
+ return typedProps.text;
236
239
  }
237
240
 
238
241
  return null;
@@ -1,82 +1,121 @@
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';
11
- import {
12
- Article,
13
- Home,
14
- Book,
15
- Download,
16
- CloudDownload,
17
- CloudUpload,
18
- Computer,
19
- Settings,
20
- Dashboard,
21
- Info,
22
- Inventory,
23
- Inventory2,
24
- Help,
25
- Add,
26
- Edit,
27
- Delete,
28
- Check,
29
- Close,
30
- ArrowForward,
31
- ArrowBack,
32
- Menu,
33
- Search,
34
- Favorite,
35
- Star,
36
- Share,
37
- Save,
38
- Send,
39
- Email,
40
- Phone,
41
- Person,
42
- Group,
43
- Business,
44
- ShoppingCart,
45
- Speed,
46
- SupportAgent,
47
- Tune,
48
- AttachMoney,
49
- Lock,
50
- LockOpen,
51
- Visibility,
52
- 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
- VpnKey,
69
- Key,
70
- PersonSearch,
71
- ManageAccounts,
72
- Storage,
73
- Refresh,
74
- Block,
75
- CheckCircle,
76
- RotateRight,
77
- Memory,
78
- LocalOffer,
79
- } from '@mui/icons-material';
16
+
17
+ // Material UI Icons - Direct imports to avoid loading the entire barrel index
18
+ // This prevents EMFILE errors when Node.js tries to parse thousands of icon exports
19
+ import AccountCircle from '@mui/icons-material/AccountCircle';
20
+ import Add from '@mui/icons-material/Add';
21
+ import Architecture from '@mui/icons-material/Architecture';
22
+ import ArrowBack from '@mui/icons-material/ArrowBack';
23
+ import ArrowForward from '@mui/icons-material/ArrowForward';
24
+ import Article from '@mui/icons-material/Article';
25
+ import AttachMoney from '@mui/icons-material/AttachMoney';
26
+ import Autorenew from '@mui/icons-material/Autorenew';
27
+ import Block from '@mui/icons-material/Block';
28
+ import Book from '@mui/icons-material/Book';
29
+ import Business from '@mui/icons-material/Business';
30
+ import Check from '@mui/icons-material/Check';
31
+ import CheckCircle from '@mui/icons-material/CheckCircle';
32
+ import Close from '@mui/icons-material/Close';
33
+ import Cloud from '@mui/icons-material/Cloud';
34
+ import CloudDownload from '@mui/icons-material/CloudDownload';
35
+ import CloudUpload from '@mui/icons-material/CloudUpload';
36
+ import Code from '@mui/icons-material/Code';
37
+ import Computer from '@mui/icons-material/Computer';
38
+ import Construction from '@mui/icons-material/Construction';
39
+ import Dashboard from '@mui/icons-material/Dashboard';
40
+ import Delete from '@mui/icons-material/Delete';
41
+ import Download from '@mui/icons-material/Download';
42
+ import Edit from '@mui/icons-material/Edit';
43
+ import Email from '@mui/icons-material/Email';
44
+ import Explore from '@mui/icons-material/Explore';
45
+ import Favorite from '@mui/icons-material/Favorite';
46
+ import Group from '@mui/icons-material/Group';
47
+ import Help from '@mui/icons-material/Help';
48
+ import HelpOutline from '@mui/icons-material/HelpOutline';
49
+ import Home from '@mui/icons-material/Home';
50
+ import Info from '@mui/icons-material/Info';
51
+ import InsertPhoto from '@mui/icons-material/InsertPhoto';
52
+ import IntegrationInstructions from '@mui/icons-material/IntegrationInstructions';
53
+ import Inventory from '@mui/icons-material/Inventory';
54
+ import Inventory2 from '@mui/icons-material/Inventory2';
55
+ import Key from '@mui/icons-material/Key';
56
+ import Layers from '@mui/icons-material/Layers';
57
+ import LibraryBooks from '@mui/icons-material/LibraryBooks';
58
+ import LocalOffer from '@mui/icons-material/LocalOffer';
59
+ import Lock from '@mui/icons-material/Lock';
60
+ import LockOpen from '@mui/icons-material/LockOpen';
61
+ import Login from '@mui/icons-material/Login';
62
+ import Logout from '@mui/icons-material/Logout';
63
+ import ManageAccounts from '@mui/icons-material/ManageAccounts';
64
+ import Memory from '@mui/icons-material/Memory';
65
+ import Menu from '@mui/icons-material/Menu';
66
+ import Notifications from '@mui/icons-material/Notifications';
67
+ import People from '@mui/icons-material/People';
68
+ import Person from '@mui/icons-material/Person';
69
+ import PersonSearch from '@mui/icons-material/PersonSearch';
70
+ import Phone from '@mui/icons-material/Phone';
71
+ import PhotoLibrary from '@mui/icons-material/PhotoLibrary';
72
+ import PlayArrow from '@mui/icons-material/PlayArrow';
73
+ import Psychology from '@mui/icons-material/Psychology';
74
+ import Refresh from '@mui/icons-material/Refresh';
75
+ import Rocket from '@mui/icons-material/Rocket';
76
+ import RotateRight from '@mui/icons-material/RotateRight';
77
+ import Route from '@mui/icons-material/Route';
78
+ import Save from '@mui/icons-material/Save';
79
+ import Search from '@mui/icons-material/Search';
80
+ import Security from '@mui/icons-material/Security';
81
+ import Send from '@mui/icons-material/Send';
82
+ import Settings from '@mui/icons-material/Settings';
83
+ import Share from '@mui/icons-material/Share';
84
+ import Shield from '@mui/icons-material/Shield';
85
+ import ShoppingCart from '@mui/icons-material/ShoppingCart';
86
+ import Speed from '@mui/icons-material/Speed';
87
+ import Star from '@mui/icons-material/Star';
88
+ import Storage from '@mui/icons-material/Storage';
89
+ import SupportAgent from '@mui/icons-material/SupportAgent';
90
+ import Sync from '@mui/icons-material/Sync';
91
+ import TrendingUp from '@mui/icons-material/TrendingUp';
92
+ import Tune from '@mui/icons-material/Tune';
93
+ import VerifiedUser from '@mui/icons-material/VerifiedUser';
94
+ import Visibility from '@mui/icons-material/Visibility';
95
+ import VisibilityOff from '@mui/icons-material/VisibilityOff';
96
+ import VpnKey from '@mui/icons-material/VpnKey';
97
+ import Work from '@mui/icons-material/Work';
98
+ import WorkspacePremium from '@mui/icons-material/WorkspacePremium';
99
+ // Additional icons for components
100
+ import Accessibility from '@mui/icons-material/Accessibility';
101
+ import BrokenImage from '@mui/icons-material/BrokenImage';
102
+ import Circle from '@mui/icons-material/Circle';
103
+ import ContentCopy from '@mui/icons-material/ContentCopy';
104
+ import DarkMode from '@mui/icons-material/DarkMode';
105
+ import Error from '@mui/icons-material/Error';
106
+ import ExpandLess from '@mui/icons-material/ExpandLess';
107
+ import ExpandMore from '@mui/icons-material/ExpandMore';
108
+ import FormatBold from '@mui/icons-material/FormatBold';
109
+ import FormatItalic from '@mui/icons-material/FormatItalic';
110
+ import FormatUnderlined from '@mui/icons-material/FormatUnderlined';
111
+ import Launch from '@mui/icons-material/Launch';
112
+ import LightMode from '@mui/icons-material/LightMode';
113
+ import MoreVert from '@mui/icons-material/MoreVert';
114
+ import Palette from '@mui/icons-material/Palette';
115
+ import RadioButtonUnchecked from '@mui/icons-material/RadioButtonUnchecked';
116
+ import Schedule from '@mui/icons-material/Schedule';
117
+ import SettingsSystemDaydream from '@mui/icons-material/SettingsSystemDaydream';
118
+ import Warning from '@mui/icons-material/Warning';
80
119
 
81
120
  /**
82
121
  * Icon mapping entry with both Material-UI component and emoji representation
@@ -87,140 +126,216 @@ export interface IconMapping {
87
126
  }
88
127
 
89
128
  /**
90
- * Centralized icon registry mapping icon names to their representations
91
- * Supports both Material-UI components and emoji for different contexts
129
+ * Centralized icon registry mapping icon names to their representations.
130
+ * Sorted alphabetically by category, then by key within each category.
131
+ *
132
+ * For icons not in this map, getIconComponent() will return a HelpOutline fallback
133
+ * and log a warning. Use registerIcon() to add app-specific icons at runtime.
92
134
  */
93
135
  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
136
+ // === Actions ===
112
137
  add: { emoji: '➕', component: Add },
113
- edit: { emoji: '✏️', component: Edit },
114
- delete: { emoji: '🗑️', component: Delete },
115
- save: { emoji: '💾', component: Save },
116
138
  check: { emoji: '✓', component: Check },
139
+ check_circle: { emoji: '✅', component: CheckCircle },
117
140
  close: { emoji: '✕', component: Close },
118
-
119
- // Navigation
120
- arrowforward: { emoji: '', component: ArrowForward },
121
- arrowback: { emoji: '', component: ArrowBack },
122
-
123
- // Content
141
+ delete: { emoji: '🗑️', component: Delete },
142
+ edit: { emoji: '✏️', component: Edit },
143
+ refresh: { emoji: '🔄', component: Refresh },
144
+ rotate_right: { emoji: '🔄', component: RotateRight },
145
+ save: { emoji: '💾', component: Save },
124
146
  search: { emoji: '🔍', component: Search },
147
+ send: { emoji: '📤', component: Send },
125
148
  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
149
+ sync: { emoji: '🔄', component: Sync },
150
+
151
+ // === Authentication & Security ===
152
+ block: { emoji: '🚫', component: Block },
153
+ key: { emoji: '🔑', component: Key },
145
154
  lock: { emoji: '🔒', component: Lock },
146
- lockopen: { emoji: '🔓', component: LockOpen },
155
+ lock_open: { emoji: '🔓', component: LockOpen },
156
+ lockopen: { emoji: '🔓', component: LockOpen }, // alias
157
+ login: { emoji: '🔑', component: Login },
158
+ logout: { emoji: '🚪', component: Logout },
159
+ security: { emoji: '🔐', component: Security },
160
+ shield: { emoji: '🛡️', component: Shield },
161
+ verified_user: { emoji: '✅', component: VerifiedUser },
147
162
  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 },
163
+ visibility_off: { emoji: '🙈', component: VisibilityOff },
164
+ visibilityoff: { emoji: '🙈', component: VisibilityOff }, // alias
165
+ vpn_key: { emoji: '🔐', component: VpnKey },
166
+
167
+ // === Business & Commerce ===
168
+ attach_money: { emoji: '💰', component: AttachMoney },
169
+ attachmoney: { emoji: '💰', component: AttachMoney }, // alias
170
+ business: { emoji: '🏢', component: Business },
171
+ cart: { emoji: '🛒', component: ShoppingCart }, // alias
172
+ shopping_cart: { emoji: '🛒', component: ShoppingCart },
173
+ shoppingcart: { emoji: '🛒', component: ShoppingCart }, // alias
174
+ work: { emoji: '💼', component: Work },
175
+ workspace_premium: { emoji: '', component: WorkspacePremium },
176
+
177
+ // === Communication ===
178
+ contact: { emoji: '📧', component: Email }, // alias
179
+ email: { emoji: '📧', component: Email },
180
+ mail: { emoji: '📧', component: Email }, // alias
181
+ notifications: { emoji: '🔔', component: Notifications },
182
+ phone: { emoji: '📱', component: Phone },
165
183
  support_agent: { emoji: '🛎️', component: SupportAgent },
166
- tune: { emoji: '🎛️', component: Tune },
167
184
 
168
- // Development & Technology
169
- code: { emoji: '💻', component: Code },
170
- psychology: { emoji: '🧠', component: Psychology },
185
+ // === Content & Media ===
186
+ article: { emoji: '📰', component: Article },
187
+ blog: { emoji: '📝', component: Book }, // alias
188
+ book: { emoji: '📖', component: Book },
189
+ gallery: { emoji: '🖼️', component: InsertPhoto }, // alias
190
+ image: { emoji: '🖼️', component: InsertPhoto },
191
+ insert_photo: { emoji: '🖼️', component: InsertPhoto },
192
+ library_books: { emoji: '📚', component: LibraryBooks },
193
+ news: { emoji: '📰', component: Article }, // alias
194
+ photo_library: { emoji: '📸', component: PhotoLibrary },
195
+ play: { emoji: '▶️', component: PlayArrow }, // alias
196
+ play_arrow: { emoji: '▶️', component: PlayArrow },
197
+ portfolio: { emoji: '💼', component: Business }, // alias
198
+
199
+ // === Development & Technology ===
200
+ architecture: { emoji: '🏛️', component: Architecture },
171
201
  autorenew: { emoji: '🔄', component: Autorenew },
172
- integration_instructions: { emoji: '🔌', component: IntegrationInstructions },
202
+ cloud: { emoji: '☁️', component: Cloud },
203
+ cloud_download: { emoji: '☁️⬇️', component: CloudDownload },
204
+ cloud_upload: { emoji: '☁️⬆️', component: CloudUpload },
205
+ clouddownload: { emoji: '☁️⬇️', component: CloudDownload }, // alias
206
+ cloudupload: { emoji: '☁️⬆️', component: CloudUpload }, // alias
207
+ code: { emoji: '💻', component: Code },
208
+ computer: { emoji: '💻', component: Computer },
173
209
  construction: { emoji: '🚧', component: Construction },
174
- work: { emoji: '💼', component: Work },
210
+ integration_instructions: { emoji: '🔌', component: IntegrationInstructions },
211
+ memory: { emoji: '🧠', component: Memory },
212
+ psychology: { emoji: '🧠', component: Psychology },
213
+ rocket: { emoji: '🚀', component: Rocket },
214
+ storage: { emoji: '💾', component: Storage },
215
+
216
+ // === Navigation & Layout ===
217
+ arrow_back: { emoji: '←', component: ArrowBack },
218
+ arrow_forward: { emoji: '→', component: ArrowForward },
219
+ arrowback: { emoji: '←', component: ArrowBack }, // alias
220
+ arrowforward: { emoji: '→', component: ArrowForward }, // alias
221
+ dashboard: { emoji: '📊', component: Dashboard },
222
+ download: { emoji: '⬇️', component: Download },
223
+ explore: { emoji: '🧭', component: Explore },
224
+ home: { emoji: '🏠', component: Home },
175
225
  layers: { emoji: '📚', component: Layers },
176
- trending_up: { emoji: '📈', component: TrendingUp },
226
+ menu: { emoji: '', component: Menu },
177
227
  route: { emoji: '🗺️', component: Route },
178
- sync: { emoji: '🔄', component: Sync },
179
- architecture: { emoji: '🏛️', component: Architecture },
180
- security: { emoji: '🔐', component: Security },
228
+ settings: { emoji: '⚙️', component: Settings },
229
+ trending_up: { emoji: '📈', component: TrendingUp },
230
+ tune: { emoji: '🎛️', component: Tune },
181
231
 
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 },
232
+ // === Products & Inventory ===
233
+ inventory: { emoji: '📦', component: Inventory },
234
+ inventory_2: { emoji: '📦', component: Inventory2 },
193
235
  local_offer: { emoji: '🏷️', component: LocalOffer },
236
+ products: { emoji: '🛍️', component: ShoppingCart }, // alias
237
+ services: { emoji: '⚙️', component: Settings }, // alias
238
+ speed: { emoji: '⚡', component: Speed },
239
+
240
+ // === Status & Feedback ===
241
+ about: { emoji: 'ℹ️', component: Info }, // alias
242
+ favorite: { emoji: '❤️', component: Favorite },
243
+ heart: { emoji: '❤️', component: Favorite }, // alias
244
+ help: { emoji: '❓', component: Help },
245
+ info: { emoji: 'ℹ️', component: Info },
246
+ star: { emoji: '⭐', component: Star },
247
+
248
+ // === Users & People ===
249
+ account_circle: { emoji: '👤', component: AccountCircle },
250
+ group: { emoji: '👥', component: Group },
251
+ manage_accounts: { emoji: '👤', component: ManageAccounts },
252
+ people: { emoji: '👥', component: People },
253
+ person: { emoji: '👤', component: Person },
254
+ person_search: { emoji: '🔍', component: PersonSearch },
255
+ user: { emoji: '👤', component: Person }, // alias
256
+ users: { emoji: '👥', component: People }, // alias
257
+
258
+ // === UI & Interaction ===
259
+ accessibility: { emoji: '♿', component: Accessibility },
260
+ broken_image: { emoji: '🖼️', component: BrokenImage },
261
+ brokenimage: { emoji: '🖼️', component: BrokenImage }, // alias
262
+ circle: { emoji: '⭕', component: Circle },
263
+ content_copy: { emoji: '📋', component: ContentCopy },
264
+ contentcopy: { emoji: '📋', component: ContentCopy }, // alias
265
+ copy: { emoji: '📋', component: ContentCopy }, // alias
266
+ dark_mode: { emoji: '🌙', component: DarkMode },
267
+ darkmode: { emoji: '🌙', component: DarkMode }, // alias
268
+ error: { emoji: '❌', component: Error },
269
+ expand_less: { emoji: '▲', component: ExpandLess },
270
+ expandless: { emoji: '▲', component: ExpandLess }, // alias
271
+ expand_more: { emoji: '▼', component: ExpandMore },
272
+ expandmore: { emoji: '▼', component: ExpandMore }, // alias
273
+ format_bold: { emoji: '𝐁', component: FormatBold },
274
+ formatbold: { emoji: '𝐁', component: FormatBold }, // alias
275
+ bold: { emoji: '𝐁', component: FormatBold }, // alias
276
+ format_italic: { emoji: '𝐼', component: FormatItalic },
277
+ formatitalic: { emoji: '𝐼', component: FormatItalic }, // alias
278
+ italic: { emoji: '𝐼', component: FormatItalic }, // alias
279
+ format_underlined: { emoji: 'U̲', component: FormatUnderlined },
280
+ formatunderlined: { emoji: 'U̲', component: FormatUnderlined }, // alias
281
+ underline: { emoji: 'U̲', component: FormatUnderlined }, // alias
282
+ launch: { emoji: '🚀', component: Launch },
283
+ open: { emoji: '🚀', component: Launch }, // alias
284
+ light_mode: { emoji: '☀️', component: LightMode },
285
+ lightmode: { emoji: '☀️', component: LightMode }, // alias
286
+ more_vert: { emoji: '⋮', component: MoreVert },
287
+ morevert: { emoji: '⋮', component: MoreVert }, // alias
288
+ more: { emoji: '⋮', component: MoreVert }, // alias
289
+ palette: { emoji: '🎨', component: Palette },
290
+ radio_button_unchecked: { emoji: '○', component: RadioButtonUnchecked },
291
+ radiobuttonunchecked: { emoji: '○', component: RadioButtonUnchecked }, // alias
292
+ schedule: { emoji: '📅', component: Schedule },
293
+ calendar: { emoji: '📅', component: Schedule }, // alias
294
+ settings_system_daydream: { emoji: '💻', component: SettingsSystemDaydream },
295
+ settingssystemdaydream: { emoji: '💻', component: SettingsSystemDaydream }, // alias
296
+ system: { emoji: '💻', component: SettingsSystemDaydream }, // alias
297
+ warning: { emoji: '⚠️', component: Warning },
194
298
  };
195
299
 
196
300
  /**
197
301
  * Get emoji representation of an icon
198
- * @param iconName - Icon name (case-insensitive)
302
+ * @param iconName - Icon name (case-insensitive, supports snake_case)
199
303
  * @param fallback - Fallback emoji if icon not found (default: 🔗)
200
304
  * @returns Emoji string
201
305
  */
202
306
  export function getIconEmoji(iconName: string | undefined, fallback: string = '🔗'): string {
203
307
  if (!iconName) return fallback;
204
- const mapping = iconMap[iconName.toLowerCase()];
205
- return mapping?.emoji || iconName;
308
+ const normalized = iconName.toLowerCase();
309
+ const mapping = iconMap[normalized];
310
+ return mapping?.emoji || fallback;
206
311
  }
207
312
 
208
313
  /**
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
314
+ * Get Material-UI component representation of an icon.
315
+ *
316
+ * Uses the static iconMap for known icons. For unmapped icons,
317
+ * returns a HelpOutline fallback and logs a warning.
318
+ *
319
+ * @param iconName - Icon name (case-insensitive, supports snake_case)
320
+ * @returns React element (mapped icon or HelpOutline fallback), or null if no name provided
212
321
  */
213
322
  export function getIconComponent(iconName: string | undefined): React.ReactElement | null {
214
323
  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;
324
+
325
+ const normalized = iconName.toLowerCase();
326
+ const mapping = iconMap[normalized];
327
+
328
+ if (mapping?.component) {
329
+ const IconComponent = mapping.component;
330
+ return <IconComponent />;
331
+ }
332
+
333
+ // Fallback: Return HelpOutline icon and warn about unmapped icon
334
+ // Use registerIcon() to add app-specific icons at runtime
335
+ if (process.env.NODE_ENV !== 'production') {
336
+ console.warn(`[IconMap] Icon "${iconName}" not found. Add it to iconMap or use registerIcon().`);
220
337
  }
221
-
222
- const IconComponent = mapping.component;
223
- return <IconComponent />;
338
+ return <HelpOutline />;
224
339
  }
225
340
 
226
341
  /**
@@ -232,14 +347,15 @@ export function registerIcon(name: string, mapping: IconMapping): void {
232
347
  }
233
348
 
234
349
  /**
235
- * Check if an icon is registered
350
+ * Check if an icon is registered in the static map
351
+ * If false, getIconComponent will return HelpOutline fallback
236
352
  */
237
353
  export function hasIcon(iconName: string): boolean {
238
354
  return iconName.toLowerCase() in iconMap;
239
355
  }
240
356
 
241
357
  /**
242
- * Get all registered icon names
358
+ * Get all registered icon names from the static map
243
359
  */
244
360
  export function getRegisteredIcons(): string[] {
245
361
  return Object.keys(iconMap);