@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.
- package/dist/components/AccessibilityChecker.d.ts.map +1 -1
- package/dist/components/Html.d.ts +1 -1
- package/dist/components/Html.d.ts.map +1 -1
- package/dist/components/Logo.d.ts.map +1 -1
- package/dist/components/Markdown.d.ts +2 -2
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/QwickApp.d.ts.map +1 -1
- package/dist/components/SafeSpan.d.ts +1 -1
- package/dist/components/SafeSpan.d.ts.map +1 -1
- package/dist/components/base/ModelView.d.ts +1 -1
- package/dist/components/base/ModelView.d.ts.map +1 -1
- package/dist/components/blocks/Article.d.ts +1 -1
- package/dist/components/blocks/Article.d.ts.map +1 -1
- package/dist/components/blocks/CardListGrid.d.ts.map +1 -1
- package/dist/components/blocks/Code.d.ts.map +1 -1
- package/dist/components/blocks/Content.d.ts.map +1 -1
- package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
- package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
- package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
- package/dist/components/blocks/Footer.d.ts.map +1 -1
- package/dist/components/blocks/Image.d.ts.map +1 -1
- package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
- package/dist/components/blocks/ProductCard.d.ts.map +1 -1
- package/dist/components/blocks/Section.d.ts.map +1 -1
- package/dist/components/blocks/Text.d.ts +8 -1
- package/dist/components/blocks/Text.d.ts.map +1 -1
- package/dist/components/buttons/Button.d.ts.map +1 -1
- package/dist/components/buttons/PaletteSwitcher.d.ts.map +1 -1
- package/dist/components/buttons/ThemeSwitcher.d.ts.map +1 -1
- package/dist/components/forms/FormBlock.d.ts +1 -1
- package/dist/components/forms/FormBlock.d.ts.map +1 -1
- package/dist/components/forms/SchemaFormRenderer.d.ts +28 -0
- package/dist/components/forms/SchemaFormRenderer.d.ts.map +1 -0
- package/dist/components/forms/index.d.ts +2 -0
- package/dist/components/forms/index.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
- package/dist/components/input/HtmlInputField.d.ts.map +1 -1
- package/dist/components/layout/CollapsibleLayout/CollapsibleLayout.d.ts.map +1 -1
- package/dist/components/layout/GridLayout.d.ts +5 -0
- package/dist/components/layout/GridLayout.d.ts.map +1 -1
- package/dist/components/plugins/DataTable.d.ts +57 -0
- package/dist/components/plugins/DataTable.d.ts.map +1 -0
- package/dist/components/plugins/StatCard.d.ts +44 -0
- package/dist/components/plugins/StatCard.d.ts.map +1 -0
- package/dist/components/plugins/index.d.ts +13 -0
- package/dist/components/plugins/index.d.ts.map +1 -0
- package/dist/components/shared/createSerializableView.d.ts.map +1 -1
- package/dist/contexts/NavigationContext.d.ts.map +1 -1
- package/dist/hooks/useBaseProps.d.ts +1 -1
- package/dist/hooks/useBaseProps.d.ts.map +1 -1
- package/dist/index.esm.js +5939 -5532
- package/dist/index.js +6028 -5618
- package/dist/palettes/manifest.json +19 -19
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -1
- package/dist/utils/iconMap.d.ts +21 -8
- package/dist/utils/iconMap.d.ts.map +1 -1
- package/package.json +1 -2
- package/src/__tests__/utils/iconMap.test.tsx +197 -0
- package/src/components/AccessibilityChecker.tsx +10 -7
- package/src/components/ErrorBoundary.tsx +3 -3
- package/src/components/Html.tsx +17 -12
- package/src/components/Logo.tsx +1 -8
- package/src/components/Markdown.tsx +10 -10
- package/src/components/QwickApp.tsx +8 -1
- package/src/components/ResponsiveMenu.tsx +1 -1
- package/src/components/SafeSpan.tsx +9 -9
- package/src/components/Scaffold.tsx +4 -4
- package/src/components/base/ModelView.tsx +2 -2
- package/src/components/blocks/Article.tsx +7 -7
- package/src/components/blocks/CardListGrid.tsx +1 -3
- package/src/components/blocks/Code.tsx +10 -8
- package/src/components/blocks/Content.tsx +2 -4
- package/src/components/blocks/CoverImageHeader.tsx +3 -4
- package/src/components/blocks/FeatureCard.tsx +2 -4
- package/src/components/blocks/FeatureGrid.tsx +2 -4
- package/src/components/blocks/Footer.tsx +2 -4
- package/src/components/blocks/Image.tsx +8 -5
- package/src/components/blocks/PageBannerHeader.tsx +3 -4
- package/src/components/blocks/ProductCard.tsx +8 -5
- package/src/components/blocks/Section.tsx +6 -4
- package/src/components/blocks/Text.tsx +15 -7
- package/src/components/buttons/Button.tsx +8 -6
- package/src/components/buttons/PaletteSwitcher.tsx +6 -8
- package/src/components/buttons/ThemeSwitcher.tsx +8 -9
- package/src/components/forms/Captcha.tsx +1 -1
- package/src/components/forms/FormBlock.tsx +3 -5
- package/src/components/forms/FormCheckbox.tsx +1 -1
- package/src/components/forms/FormField.tsx +1 -1
- package/src/components/forms/FormSelect.tsx +1 -1
- package/src/components/forms/SchemaFormRenderer.tsx +268 -0
- package/src/components/forms/__tests__/SchemaFormRenderer.test.tsx +212 -0
- package/src/components/forms/index.ts +3 -0
- package/src/components/index.ts +1 -0
- package/src/components/input/ChoiceInputField.tsx +2 -1
- package/src/components/input/HtmlInputField.tsx +14 -9
- package/src/components/input/TextField.tsx +1 -1
- package/src/components/layout/CollapsibleLayout/CollapsibleLayout.tsx +6 -8
- package/src/components/layout/GridLayout.tsx +4 -0
- package/src/components/plugins/DataTable.tsx +259 -0
- package/src/components/plugins/StatCard.tsx +122 -0
- package/src/components/plugins/__tests__/DataTable.test.tsx +158 -0
- package/src/components/plugins/index.ts +14 -0
- package/src/components/shared/createSerializableView.tsx +8 -6
- package/src/contexts/NavigationContext.tsx +21 -15
- package/src/hooks/useBaseProps.ts +1 -1
- package/src/schemas/transformers/ReactNodeTransformer.ts +13 -10
- package/src/utils/iconMap.tsx +290 -174
- /package/dist/palettes/{palette-autumn.1.5.6.css → palette-autumn.1.5.8.css} +0 -0
- /package/dist/palettes/{palette-autumn.1.5.6.min.css → palette-autumn.1.5.8.min.css} +0 -0
- /package/dist/palettes/{palette-cosmic.1.5.6.css → palette-cosmic.1.5.8.css} +0 -0
- /package/dist/palettes/{palette-cosmic.1.5.6.min.css → palette-cosmic.1.5.8.min.css} +0 -0
- /package/dist/palettes/{palette-default.1.5.6.css → palette-default.1.5.8.css} +0 -0
- /package/dist/palettes/{palette-default.1.5.6.min.css → palette-default.1.5.8.min.css} +0 -0
- /package/dist/palettes/{palette-ocean.1.5.6.css → palette-ocean.1.5.8.css} +0 -0
- /package/dist/palettes/{palette-ocean.1.5.6.min.css → palette-ocean.1.5.8.min.css} +0 -0
- /package/dist/palettes/{palette-spring.1.5.6.css → palette-spring.1.5.8.css} +0 -0
- /package/dist/palettes/{palette-spring.1.5.6.min.css → palette-spring.1.5.8.min.css} +0 -0
- /package/dist/palettes/{palette-winter.1.5.6.css → palette-winter.1.5.8.css} +0 -0
- /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
|
-
|
|
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
|
-
|
|
223
|
-
|
|
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 (
|
|
227
|
-
return
|
|
229
|
+
if (typedProps.title && typeof typedProps.title === 'string') {
|
|
230
|
+
return typedProps.title;
|
|
228
231
|
}
|
|
229
232
|
|
|
230
|
-
if (
|
|
231
|
-
return
|
|
233
|
+
if (typedProps.label && typeof typedProps.label === 'string') {
|
|
234
|
+
return typedProps.label;
|
|
232
235
|
}
|
|
233
236
|
|
|
234
|
-
if (
|
|
235
|
-
return
|
|
237
|
+
if (typedProps.text && typeof typedProps.text === 'string') {
|
|
238
|
+
return typedProps.text;
|
|
236
239
|
}
|
|
237
240
|
|
|
238
241
|
return null;
|
package/src/utils/iconMap.tsx
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
*
|
|
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
|
-
//
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
//
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
226
|
+
menu: { emoji: '☰', component: Menu },
|
|
177
227
|
route: { emoji: '🗺️', component: Route },
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
228
|
+
settings: { emoji: '⚙️', component: Settings },
|
|
229
|
+
trending_up: { emoji: '📈', component: TrendingUp },
|
|
230
|
+
tune: { emoji: '🎛️', component: Tune },
|
|
181
231
|
|
|
182
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
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
|
|
205
|
-
|
|
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
|
-
*
|
|
211
|
-
*
|
|
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
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|