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