@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
package/dist/index.esm.js CHANGED
@@ -4,11 +4,11 @@ import { useMediaQuery, Box, useTheme as useTheme$1, Paper, Typography, Tooltip,
4
4
  import React, { useMemo, useContext, useState, useCallback, useEffect, createContext, useReducer, useRef, isValidElement, createElement, useId, useLayoutEffect, Component, cloneElement } from 'react';
5
5
  import { MustacheTemplateProvider, MemoryCacheProvider, CachedDataProvider, Field, Editor, FieldType, Schema, Model, DataType } from '@qwickapps/schema';
6
6
  import { createTheme, ThemeProvider as ThemeProvider$1 } from '@mui/material/styles';
7
- import { Check, ContentCopy, Home, Menu, Dashboard, Info, Help, Book, Email, Phone, Send, Add, Edit, Delete, Save, Close, ArrowForward, ArrowBack, Search, Share, Download, CloudDownload, CloudUpload, Person, Group, Favorite, Star, VerifiedUser, Business, ShoppingCart, AttachMoney, Lock, LockOpen, Visibility, VisibilityOff, Settings, Computer, Article as Article$1, Inventory, Inventory2, Speed, SupportAgent, Tune, Code as Code$1, Psychology, Autorenew, IntegrationInstructions, Construction, Work, Layers, TrendingUp, Route, Sync, Architecture, Security, Key, VpnKey, PersonSearch, ManageAccounts, Storage, Refresh, Block, CheckCircle, RotateRight, Memory, LocalOffer, BrokenImage, MoreVert, FormatBold, FormatItalic, FormatUnderlined, ExpandMore, ExpandLess, Schedule, Launch, LightMode, DarkMode, SettingsSystemDaydream, Palette, Circle, RadioButtonUnchecked } from '@mui/icons-material';
7
+ import { Check, ContentCopy, Add, CheckCircle, Close, Delete, Edit, Refresh, RotateRight, Save, Search, Send, Share, Sync, Block, Key, Lock, LockOpen, Login, Logout, Security, Shield, VerifiedUser, Visibility, VisibilityOff, VpnKey, AttachMoney, Business, ShoppingCart, Work, WorkspacePremium, Email, Notifications, Phone, SupportAgent, Article as Article$1, Book, InsertPhoto, LibraryBooks, PhotoLibrary, PlayArrow, Architecture, Autorenew, Cloud, CloudDownload, CloudUpload, Code as Code$1, Computer, Construction, IntegrationInstructions, Memory, Psychology, Rocket, Storage, ArrowBack, ArrowForward, Dashboard, Download, Explore, Home, Layers, Menu, Route, Settings, TrendingUp, Tune, Inventory, Inventory2, LocalOffer, Speed, Info, Favorite, Help, Star, AccountCircle, Group, ManageAccounts, People, Person, PersonSearch, HelpOutline, BrokenImage, MoreVert, FormatBold, FormatItalic, FormatUnderlined, ExpandMore, ExpandLess, Schedule, Launch, LightMode, DarkMode, SettingsSystemDaydream, Palette, Circle, RadioButtonUnchecked } from '@mui/icons-material';
8
8
  import { IsOptional, ValidateIf, IsIn, IsInt, Min, IsString, IsNotEmpty, IsBoolean, IsNumber, Max, IsArray, ValidateNested, IsUrl, IsObject } from 'class-validator';
9
9
  import 'reflect-metadata';
10
10
  import { Type } from 'class-transformer';
11
- import { UNSAFE_NavigationContext, useNavigate, useLocation } from 'react-router-dom';
11
+ import { useInRouterContext, useNavigate, useLocation } from 'react-router-dom';
12
12
 
13
13
  /**
14
14
  * Breakpoint utilities for QwickApps React Framework
@@ -3073,181 +3073,189 @@ Code.transformCodeHighlight = element => {
3073
3073
  };
3074
3074
 
3075
3075
  /**
3076
- * Centralized icon registry mapping icon names to their representations
3077
- * Supports both Material-UI components and emoji for different contexts
3076
+ * Centralized icon registry mapping icon names to their representations.
3077
+ * Sorted alphabetically by category, then by key within each category.
3078
+ *
3079
+ * For icons not in this map, getIconComponent() will return a HelpOutline fallback
3080
+ * and log a warning. Use registerIcon() to add app-specific icons at runtime.
3078
3081
  */
3079
3082
  const iconMap = {
3080
- // Navigation & Layout
3081
- home: {
3082
- emoji: '🏠',
3083
- component: Home
3084
- },
3085
- menu: {
3086
- emoji: '☰',
3087
- component: Menu
3088
- },
3089
- dashboard: {
3090
- emoji: '📊',
3091
- component: Dashboard
3092
- },
3093
- // Information & Help
3094
- info: {
3095
- emoji: 'ℹ️',
3096
- component: Info
3097
- },
3098
- about: {
3099
- emoji: 'ℹ️',
3100
- component: Info
3101
- },
3102
- help: {
3103
- emoji: '❓',
3104
- component: Help
3105
- },
3106
- book: {
3107
- emoji: '📖',
3108
- component: Book
3109
- },
3110
- // Communication
3111
- email: {
3112
- emoji: '📧',
3113
- component: Email
3114
- },
3115
- contact: {
3116
- emoji: '📧',
3117
- component: Email
3118
- },
3119
- phone: {
3120
- emoji: '📱',
3121
- component: Phone
3122
- },
3123
- send: {
3124
- emoji: '📤',
3125
- component: Send
3126
- },
3127
- // Actions
3083
+ // === Actions ===
3128
3084
  add: {
3129
3085
  emoji: '➕',
3130
3086
  component: Add
3131
3087
  },
3132
- edit: {
3133
- emoji: '✏️',
3134
- component: Edit
3135
- },
3136
- delete: {
3137
- emoji: '🗑️',
3138
- component: Delete
3139
- },
3140
- save: {
3141
- emoji: '💾',
3142
- component: Save
3143
- },
3144
3088
  check: {
3145
3089
  emoji: '✓',
3146
3090
  component: Check
3147
3091
  },
3092
+ check_circle: {
3093
+ emoji: '✅',
3094
+ component: CheckCircle
3095
+ },
3148
3096
  close: {
3149
3097
  emoji: '✕',
3150
3098
  component: Close
3151
3099
  },
3152
- // Navigation
3153
- arrowforward: {
3154
- emoji: '→',
3155
- component: ArrowForward
3100
+ delete: {
3101
+ emoji: '🗑️',
3102
+ component: Delete
3156
3103
  },
3157
- arrowback: {
3158
- emoji: '',
3159
- component: ArrowBack
3104
+ edit: {
3105
+ emoji: '✏️',
3106
+ component: Edit
3107
+ },
3108
+ refresh: {
3109
+ emoji: '🔄',
3110
+ component: Refresh
3111
+ },
3112
+ rotate_right: {
3113
+ emoji: '🔄',
3114
+ component: RotateRight
3115
+ },
3116
+ save: {
3117
+ emoji: '💾',
3118
+ component: Save
3160
3119
  },
3161
- // Content
3162
3120
  search: {
3163
3121
  emoji: '🔍',
3164
3122
  component: Search
3165
3123
  },
3124
+ send: {
3125
+ emoji: '📤',
3126
+ component: Send
3127
+ },
3166
3128
  share: {
3167
3129
  emoji: '🔗',
3168
3130
  component: Share
3169
3131
  },
3170
- download: {
3171
- emoji: '⬇️',
3172
- component: Download
3132
+ sync: {
3133
+ emoji: '🔄',
3134
+ component: Sync
3173
3135
  },
3174
- clouddownload: {
3175
- emoji: '☁️⬇️',
3176
- component: CloudDownload
3136
+ // === Authentication & Security ===
3137
+ block: {
3138
+ emoji: '🚫',
3139
+ component: Block
3177
3140
  },
3178
- cloudupload: {
3179
- emoji: '☁️⬆️',
3180
- component: CloudUpload
3141
+ key: {
3142
+ emoji: '🔑',
3143
+ component: Key
3181
3144
  },
3182
- // User & Social
3183
- person: {
3184
- emoji: '👤',
3185
- component: Person
3145
+ lock: {
3146
+ emoji: '🔒',
3147
+ component: Lock
3186
3148
  },
3187
- user: {
3188
- emoji: '👤',
3189
- component: Person
3149
+ lock_open: {
3150
+ emoji: '🔓',
3151
+ component: LockOpen
3190
3152
  },
3191
- group: {
3192
- emoji: '👥',
3193
- component: Group
3153
+ lockopen: {
3154
+ emoji: '🔓',
3155
+ component: LockOpen
3194
3156
  },
3195
- favorite: {
3196
- emoji: '❤️',
3197
- component: Favorite
3157
+ // alias
3158
+ login: {
3159
+ emoji: '🔑',
3160
+ component: Login
3198
3161
  },
3199
- star: {
3200
- emoji: '',
3201
- component: Star
3162
+ logout: {
3163
+ emoji: '🚪',
3164
+ component: Logout
3165
+ },
3166
+ security: {
3167
+ emoji: '🔐',
3168
+ component: Security
3169
+ },
3170
+ shield: {
3171
+ emoji: '🛡️',
3172
+ component: Shield
3202
3173
  },
3203
3174
  verified_user: {
3204
3175
  emoji: '✅',
3205
3176
  component: VerifiedUser
3206
3177
  },
3207
- // Business
3178
+ visibility: {
3179
+ emoji: '👁️',
3180
+ component: Visibility
3181
+ },
3182
+ visibility_off: {
3183
+ emoji: '🙈',
3184
+ component: VisibilityOff
3185
+ },
3186
+ visibilityoff: {
3187
+ emoji: '🙈',
3188
+ component: VisibilityOff
3189
+ },
3190
+ // alias
3191
+ vpn_key: {
3192
+ emoji: '🔐',
3193
+ component: VpnKey
3194
+ },
3195
+ // === Business & Commerce ===
3196
+ attach_money: {
3197
+ emoji: '💰',
3198
+ component: AttachMoney
3199
+ },
3200
+ attachmoney: {
3201
+ emoji: '💰',
3202
+ component: AttachMoney
3203
+ },
3204
+ // alias
3208
3205
  business: {
3209
3206
  emoji: '🏢',
3210
3207
  component: Business
3211
3208
  },
3212
- shoppingcart: {
3209
+ cart: {
3213
3210
  emoji: '🛒',
3214
3211
  component: ShoppingCart
3215
3212
  },
3216
- cart: {
3213
+ // alias
3214
+ shopping_cart: {
3217
3215
  emoji: '🛒',
3218
3216
  component: ShoppingCart
3219
3217
  },
3220
- attachmoney: {
3221
- emoji: '💰',
3222
- component: AttachMoney
3218
+ shoppingcart: {
3219
+ emoji: '🛒',
3220
+ component: ShoppingCart
3223
3221
  },
3224
- // Security
3225
- lock: {
3226
- emoji: '🔒',
3227
- component: Lock
3222
+ // alias
3223
+ work: {
3224
+ emoji: '💼',
3225
+ component: Work
3228
3226
  },
3229
- lockopen: {
3230
- emoji: '🔓',
3231
- component: LockOpen
3227
+ workspace_premium: {
3228
+ emoji: '',
3229
+ component: WorkspacePremium
3232
3230
  },
3233
- visibility: {
3234
- emoji: '👁️',
3235
- component: Visibility
3231
+ // === Communication ===
3232
+ contact: {
3233
+ emoji: '📧',
3234
+ component: Email
3236
3235
  },
3237
- visibilityoff: {
3238
- emoji: '🙈',
3239
- component: VisibilityOff
3236
+ // alias
3237
+ email: {
3238
+ emoji: '📧',
3239
+ component: Email
3240
3240
  },
3241
- // System
3242
- settings: {
3243
- emoji: '⚙️',
3244
- component: Settings
3241
+ mail: {
3242
+ emoji: '📧',
3243
+ component: Email
3245
3244
  },
3246
- computer: {
3247
- emoji: '💻',
3248
- component: Computer
3245
+ // alias
3246
+ notifications: {
3247
+ emoji: '🔔',
3248
+ component: Notifications
3249
3249
  },
3250
- // Content Types
3250
+ phone: {
3251
+ emoji: '📱',
3252
+ component: Phone
3253
+ },
3254
+ support_agent: {
3255
+ emoji: '🛎️',
3256
+ component: SupportAgent
3257
+ },
3258
+ // === Content & Media ===
3251
3259
  article: {
3252
3260
  emoji: '📰',
3253
3261
  component: Article$1
@@ -3256,166 +3264,297 @@ const iconMap = {
3256
3264
  emoji: '📝',
3257
3265
  component: Book
3258
3266
  },
3267
+ // alias
3268
+ book: {
3269
+ emoji: '📖',
3270
+ component: Book
3271
+ },
3272
+ gallery: {
3273
+ emoji: '🖼️',
3274
+ component: InsertPhoto
3275
+ },
3276
+ // alias
3277
+ image: {
3278
+ emoji: '🖼️',
3279
+ component: InsertPhoto
3280
+ },
3281
+ insert_photo: {
3282
+ emoji: '🖼️',
3283
+ component: InsertPhoto
3284
+ },
3285
+ library_books: {
3286
+ emoji: '📚',
3287
+ component: LibraryBooks
3288
+ },
3259
3289
  news: {
3260
3290
  emoji: '📰',
3261
- component: Book
3291
+ component: Article$1
3262
3292
  },
3263
- products: {
3264
- emoji: '🛍️',
3265
- component: ShoppingCart
3293
+ // alias
3294
+ photo_library: {
3295
+ emoji: '📸',
3296
+ component: PhotoLibrary
3266
3297
  },
3267
- services: {
3268
- emoji: '⚙️',
3269
- component: Settings
3298
+ play: {
3299
+ emoji: '▶️',
3300
+ component: PlayArrow
3301
+ },
3302
+ // alias
3303
+ play_arrow: {
3304
+ emoji: '▶️',
3305
+ component: PlayArrow
3270
3306
  },
3271
3307
  portfolio: {
3272
3308
  emoji: '💼',
3273
3309
  component: Business
3274
3310
  },
3275
- gallery: {
3276
- emoji: '🖼️',
3277
- component: Business
3311
+ // alias
3312
+ // === Development & Technology ===
3313
+ architecture: {
3314
+ emoji: '🏛️',
3315
+ component: Architecture
3278
3316
  },
3279
- inventory: {
3280
- emoji: '📦',
3281
- component: Inventory
3317
+ autorenew: {
3318
+ emoji: '🔄',
3319
+ component: Autorenew
3282
3320
  },
3283
- inventory_2: {
3284
- emoji: '📦',
3285
- component: Inventory2
3321
+ cloud: {
3322
+ emoji: '☁️',
3323
+ component: Cloud
3286
3324
  },
3287
- speed: {
3288
- emoji: '',
3289
- component: Speed
3325
+ cloud_download: {
3326
+ emoji: '☁️⬇️',
3327
+ component: CloudDownload
3290
3328
  },
3291
- support_agent: {
3292
- emoji: '🛎️',
3293
- component: SupportAgent
3329
+ cloud_upload: {
3330
+ emoji: '☁️⬆️',
3331
+ component: CloudUpload
3294
3332
  },
3295
- tune: {
3296
- emoji: '🎛️',
3297
- component: Tune
3333
+ clouddownload: {
3334
+ emoji: '☁️⬇️',
3335
+ component: CloudDownload
3336
+ },
3337
+ // alias
3338
+ cloudupload: {
3339
+ emoji: '☁️⬆️',
3340
+ component: CloudUpload
3298
3341
  },
3299
- // Development & Technology
3342
+ // alias
3300
3343
  code: {
3301
3344
  emoji: '💻',
3302
3345
  component: Code$1
3303
3346
  },
3304
- psychology: {
3305
- emoji: '🧠',
3306
- component: Psychology
3347
+ computer: {
3348
+ emoji: '💻',
3349
+ component: Computer
3307
3350
  },
3308
- autorenew: {
3309
- emoji: '🔄',
3310
- component: Autorenew
3351
+ construction: {
3352
+ emoji: '🚧',
3353
+ component: Construction
3311
3354
  },
3312
3355
  integration_instructions: {
3313
3356
  emoji: '🔌',
3314
3357
  component: IntegrationInstructions
3315
3358
  },
3316
- construction: {
3317
- emoji: '🚧',
3318
- component: Construction
3359
+ memory: {
3360
+ emoji: '🧠',
3361
+ component: Memory
3319
3362
  },
3320
- work: {
3321
- emoji: '💼',
3322
- component: Work
3363
+ psychology: {
3364
+ emoji: '🧠',
3365
+ component: Psychology
3366
+ },
3367
+ rocket: {
3368
+ emoji: '🚀',
3369
+ component: Rocket
3370
+ },
3371
+ storage: {
3372
+ emoji: '💾',
3373
+ component: Storage
3374
+ },
3375
+ // === Navigation & Layout ===
3376
+ arrow_back: {
3377
+ emoji: '←',
3378
+ component: ArrowBack
3379
+ },
3380
+ arrow_forward: {
3381
+ emoji: '→',
3382
+ component: ArrowForward
3383
+ },
3384
+ arrowback: {
3385
+ emoji: '←',
3386
+ component: ArrowBack
3387
+ },
3388
+ // alias
3389
+ arrowforward: {
3390
+ emoji: '→',
3391
+ component: ArrowForward
3392
+ },
3393
+ // alias
3394
+ dashboard: {
3395
+ emoji: '📊',
3396
+ component: Dashboard
3397
+ },
3398
+ download: {
3399
+ emoji: '⬇️',
3400
+ component: Download
3401
+ },
3402
+ explore: {
3403
+ emoji: '🧭',
3404
+ component: Explore
3405
+ },
3406
+ home: {
3407
+ emoji: '🏠',
3408
+ component: Home
3323
3409
  },
3324
3410
  layers: {
3325
3411
  emoji: '📚',
3326
3412
  component: Layers
3327
3413
  },
3328
- trending_up: {
3329
- emoji: '📈',
3330
- component: TrendingUp
3414
+ menu: {
3415
+ emoji: '',
3416
+ component: Menu
3331
3417
  },
3332
3418
  route: {
3333
3419
  emoji: '🗺️',
3334
3420
  component: Route
3335
3421
  },
3336
- sync: {
3337
- emoji: '🔄',
3338
- component: Sync
3422
+ settings: {
3423
+ emoji: '⚙️',
3424
+ component: Settings
3339
3425
  },
3340
- architecture: {
3341
- emoji: '🏛️',
3342
- component: Architecture
3426
+ trending_up: {
3427
+ emoji: '📈',
3428
+ component: TrendingUp
3343
3429
  },
3344
- security: {
3345
- emoji: '🔐',
3346
- component: Security
3430
+ tune: {
3431
+ emoji: '🎛️',
3432
+ component: Tune
3347
3433
  },
3348
- // Control Panel & Admin UI Icons
3349
- key: {
3350
- emoji: '🔑',
3351
- component: Key
3434
+ // === Products & Inventory ===
3435
+ inventory: {
3436
+ emoji: '📦',
3437
+ component: Inventory
3352
3438
  },
3353
- vpn_key: {
3354
- emoji: '🔐',
3355
- component: VpnKey
3439
+ inventory_2: {
3440
+ emoji: '📦',
3441
+ component: Inventory2
3356
3442
  },
3357
- person_search: {
3358
- emoji: '🔍',
3359
- component: PersonSearch
3443
+ local_offer: {
3444
+ emoji: '🏷️',
3445
+ component: LocalOffer
3360
3446
  },
3361
- manage_accounts: {
3362
- emoji: '👥',
3363
- component: ManageAccounts
3447
+ products: {
3448
+ emoji: '🛍️',
3449
+ component: ShoppingCart
3364
3450
  },
3365
- storage: {
3366
- emoji: '💾',
3367
- component: Storage
3451
+ // alias
3452
+ services: {
3453
+ emoji: '⚙️',
3454
+ component: Settings
3368
3455
  },
3369
- refresh: {
3370
- emoji: '🔄',
3371
- component: Refresh
3456
+ // alias
3457
+ speed: {
3458
+ emoji: '⚡',
3459
+ component: Speed
3372
3460
  },
3373
- block: {
3374
- emoji: '🚫',
3375
- component: Block
3461
+ // === Status & Feedback ===
3462
+ about: {
3463
+ emoji: 'ℹ️',
3464
+ component: Info
3376
3465
  },
3377
- check_circle: {
3378
- emoji: '✅',
3379
- component: CheckCircle
3466
+ // alias
3467
+ favorite: {
3468
+ emoji: '❤️',
3469
+ component: Favorite
3380
3470
  },
3381
- rotate_right: {
3382
- emoji: '🔄',
3383
- component: RotateRight
3471
+ heart: {
3472
+ emoji: '❤️',
3473
+ component: Favorite
3384
3474
  },
3385
- memory: {
3386
- emoji: '🧠',
3387
- component: Memory
3475
+ // alias
3476
+ help: {
3477
+ emoji: '❓',
3478
+ component: Help
3388
3479
  },
3389
- local_offer: {
3390
- emoji: '🏷️',
3391
- component: LocalOffer
3392
- }
3480
+ info: {
3481
+ emoji: 'ℹ️',
3482
+ component: Info
3483
+ },
3484
+ star: {
3485
+ emoji: '⭐',
3486
+ component: Star
3487
+ },
3488
+ // === Users & People ===
3489
+ account_circle: {
3490
+ emoji: '👤',
3491
+ component: AccountCircle
3492
+ },
3493
+ group: {
3494
+ emoji: '👥',
3495
+ component: Group
3496
+ },
3497
+ manage_accounts: {
3498
+ emoji: '👤',
3499
+ component: ManageAccounts
3500
+ },
3501
+ people: {
3502
+ emoji: '👥',
3503
+ component: People
3504
+ },
3505
+ person: {
3506
+ emoji: '👤',
3507
+ component: Person
3508
+ },
3509
+ person_search: {
3510
+ emoji: '🔍',
3511
+ component: PersonSearch
3512
+ },
3513
+ user: {
3514
+ emoji: '👤',
3515
+ component: Person
3516
+ },
3517
+ // alias
3518
+ users: {
3519
+ emoji: '👥',
3520
+ component: People
3521
+ } // alias
3393
3522
  };
3394
3523
  /**
3395
3524
  * Get emoji representation of an icon
3396
- * @param iconName - Icon name (case-insensitive)
3525
+ * @param iconName - Icon name (case-insensitive, supports snake_case)
3397
3526
  * @param fallback - Fallback emoji if icon not found (default: 🔗)
3398
3527
  * @returns Emoji string
3399
3528
  */
3400
3529
  function getIconEmoji(iconName, fallback = '🔗') {
3401
3530
  if (!iconName) return fallback;
3402
- const mapping = iconMap[iconName.toLowerCase()];
3403
- return mapping?.emoji || iconName;
3531
+ const normalized = iconName.toLowerCase();
3532
+ const mapping = iconMap[normalized];
3533
+ return mapping?.emoji || fallback;
3404
3534
  }
3405
3535
  /**
3406
- * Get Material-UI component representation of an icon
3407
- * @param iconName - Icon name (case-insensitive)
3408
- * @returns React element or null if not found
3536
+ * Get Material-UI component representation of an icon.
3537
+ *
3538
+ * Uses the static iconMap for known icons. For unmapped icons,
3539
+ * returns a HelpOutline fallback and logs a warning.
3540
+ *
3541
+ * @param iconName - Icon name (case-insensitive, supports snake_case)
3542
+ * @returns React element (mapped icon or HelpOutline fallback), or null if no name provided
3409
3543
  */
3410
3544
  function getIconComponent(iconName) {
3411
3545
  if (!iconName) return null;
3412
- const mapping = iconMap[iconName.toLowerCase()];
3413
- if (!mapping?.component) {
3414
- console.warn(`[IconMap] Icon "${iconName}" not found in registry`);
3415
- return null;
3546
+ const normalized = iconName.toLowerCase();
3547
+ const mapping = iconMap[normalized];
3548
+ if (mapping?.component) {
3549
+ const IconComponent = mapping.component;
3550
+ return jsx(IconComponent, {});
3416
3551
  }
3417
- const IconComponent = mapping.component;
3418
- return jsx(IconComponent, {});
3552
+ // Fallback: Return HelpOutline icon and warn about unmapped icon
3553
+ // Use registerIcon() to add app-specific icons at runtime
3554
+ {
3555
+ console.warn(`[IconMap] Icon "${iconName}" not found. Add it to iconMap or use registerIcon().`);
3556
+ }
3557
+ return jsx(HelpOutline, {});
3419
3558
  }
3420
3559
  /**
3421
3560
  * Register a new icon or override an existing one
@@ -3425,13 +3564,14 @@ function registerIcon(name, mapping) {
3425
3564
  iconMap[name.toLowerCase()] = mapping;
3426
3565
  }
3427
3566
  /**
3428
- * Check if an icon is registered
3567
+ * Check if an icon is registered in the static map
3568
+ * If false, getIconComponent will return HelpOutline fallback
3429
3569
  */
3430
3570
  function hasIcon(iconName) {
3431
3571
  return iconName.toLowerCase() in iconMap;
3432
3572
  }
3433
3573
  /**
3434
- * Get all registered icon names
3574
+ * Get all registered icon names from the static map
3435
3575
  */
3436
3576
  function getRegisteredIcons() {
3437
3577
  return Object.keys(iconMap);
@@ -23373,14 +23513,20 @@ function ReactRouterNavigationProvider({
23373
23513
  reactRouterNavigate(to);
23374
23514
  }
23375
23515
  };
23516
+ // Defensive check for location - fall back to window.location if React Router's location is undefined
23517
+ const location = reactRouterLocation ? {
23518
+ pathname: reactRouterLocation.pathname,
23519
+ search: reactRouterLocation.search,
23520
+ hash: reactRouterLocation.hash
23521
+ } : typeof window !== 'undefined' ? {
23522
+ pathname: window.location.pathname,
23523
+ search: window.location.search,
23524
+ hash: window.location.hash
23525
+ } : undefined;
23376
23526
  return jsx(NavigationContext.Provider, {
23377
23527
  value: {
23378
23528
  navigate,
23379
- location: {
23380
- pathname: reactRouterLocation.pathname,
23381
- search: reactRouterLocation.search,
23382
- hash: reactRouterLocation.hash
23383
- }
23529
+ location
23384
23530
  },
23385
23531
  children: children
23386
23532
  });
@@ -23425,10 +23571,10 @@ function FallbackNavigationProvider({
23425
23571
  function NavigationProvider({
23426
23572
  children
23427
23573
  }) {
23428
- // Check if we're inside a React Router by checking its internal context
23429
- // useContext doesn't throw - it returns null if the context doesn't exist
23430
- const routerContext = useContext(UNSAFE_NavigationContext);
23431
- if (routerContext) {
23574
+ // Check if we're inside a React Router using the official hook
23575
+ // This is more reliable than checking internal UNSAFE contexts
23576
+ const isInRouter = useInRouterContext();
23577
+ if (isInRouter) {
23432
23578
  // We're inside a Router, use React Router's navigation
23433
23579
  return jsx(ReactRouterNavigationProvider, {
23434
23580
  children: children
@@ -25981,6 +26127,15 @@ const QwickApp = ({
25981
26127
  ...updates
25982
26128
  }));
25983
26129
  };
26130
+ // Sync logo prop changes with internal state (for dynamic logo updates)
26131
+ useEffect(() => {
26132
+ if (resolvedConfig.logo !== appConfig.logo) {
26133
+ setAppConfig(prev => ({
26134
+ ...prev,
26135
+ logo: resolvedConfig.logo
26136
+ }));
26137
+ }
26138
+ }, [resolvedConfig.logo]);
25984
26139
  const contextValue = {
25985
26140
  appName: resolvedConfig.appName,
25986
26141
  // Safe to use ! since we validated above