@qwickapps/react-framework 1.5.7 → 1.5.9

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 (211) 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/SafeSpan.d.ts +1 -1
  8. package/dist/components/SafeSpan.d.ts.map +1 -1
  9. package/dist/components/base/ModelView.d.ts +1 -1
  10. package/dist/components/base/ModelView.d.ts.map +1 -1
  11. package/dist/components/blocks/Article.d.ts +1 -1
  12. package/dist/components/blocks/Article.d.ts.map +1 -1
  13. package/dist/components/blocks/CardListGrid.d.ts.map +1 -1
  14. package/dist/components/blocks/Code.d.ts.map +1 -1
  15. package/dist/components/blocks/Content.d.ts.map +1 -1
  16. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
  17. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  18. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  19. package/dist/components/blocks/Footer.d.ts.map +1 -1
  20. package/dist/components/blocks/Image.d.ts.map +1 -1
  21. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  22. package/dist/components/blocks/ProductCard.d.ts.map +1 -1
  23. package/dist/components/blocks/Section.d.ts.map +1 -1
  24. package/dist/components/blocks/Text.d.ts +8 -1
  25. package/dist/components/blocks/Text.d.ts.map +1 -1
  26. package/dist/components/buttons/Button.d.ts.map +1 -1
  27. package/dist/components/buttons/PaletteSwitcher.d.ts.map +1 -1
  28. package/dist/components/buttons/ThemeSwitcher.d.ts.map +1 -1
  29. package/dist/components/forms/FormBlock.d.ts +1 -1
  30. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  31. package/dist/components/forms/SchemaFormRenderer.d.ts +28 -0
  32. package/dist/components/forms/SchemaFormRenderer.d.ts.map +1 -0
  33. package/dist/components/forms/index.d.ts +2 -0
  34. package/dist/components/forms/index.d.ts.map +1 -1
  35. package/dist/components/index.d.ts +1 -0
  36. package/dist/components/index.d.ts.map +1 -1
  37. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  38. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  39. package/dist/components/layout/CollapsibleLayout/CollapsibleLayout.d.ts.map +1 -1
  40. package/dist/components/layout/GridLayout.d.ts +5 -0
  41. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  42. package/dist/components/plugins/DataTable.d.ts +57 -0
  43. package/dist/components/plugins/DataTable.d.ts.map +1 -0
  44. package/dist/components/plugins/StatCard.d.ts +44 -0
  45. package/dist/components/plugins/StatCard.d.ts.map +1 -0
  46. package/dist/components/plugins/index.d.ts +13 -0
  47. package/dist/components/plugins/index.d.ts.map +1 -0
  48. package/dist/components/shared/createSerializableView.d.ts.map +1 -1
  49. package/dist/hooks/useBaseProps.d.ts +1161 -12
  50. package/dist/hooks/useBaseProps.d.ts.map +1 -1
  51. package/dist/index.esm.js +5468 -5216
  52. package/dist/index.js +5572 -5317
  53. package/dist/palettes/manifest.json +19 -19
  54. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -1
  55. package/dist/utils/iconMap.d.ts.map +1 -1
  56. package/package.json +6 -5
  57. package/src/components/AccessibilityChecker.tsx +10 -7
  58. package/src/components/ErrorBoundary.tsx +3 -3
  59. package/src/components/Html.tsx +17 -12
  60. package/src/components/Logo.tsx +1 -8
  61. package/src/components/Markdown.tsx +12 -12
  62. package/src/components/ResponsiveMenu.tsx +1 -1
  63. package/src/components/SafeSpan.tsx +10 -10
  64. package/src/components/Scaffold.tsx +4 -4
  65. package/src/components/base/ModelView.tsx +2 -2
  66. package/src/components/blocks/Article.tsx +8 -8
  67. package/src/components/blocks/CardListGrid.tsx +1 -3
  68. package/src/components/blocks/Code.tsx +10 -8
  69. package/src/components/blocks/Content.tsx +2 -4
  70. package/src/components/blocks/CoverImageHeader.tsx +3 -4
  71. package/src/components/blocks/FeatureCard.tsx +2 -4
  72. package/src/components/blocks/FeatureGrid.tsx +2 -4
  73. package/src/components/blocks/Footer.tsx +2 -4
  74. package/src/components/blocks/Image.tsx +10 -7
  75. package/src/components/blocks/PageBannerHeader.tsx +3 -4
  76. package/src/components/blocks/ProductCard.tsx +8 -5
  77. package/src/components/blocks/Section.tsx +8 -6
  78. package/src/components/blocks/Text.tsx +22 -14
  79. package/src/components/buttons/Button.tsx +11 -9
  80. package/src/components/buttons/PaletteSwitcher.tsx +6 -8
  81. package/src/components/buttons/ThemeSwitcher.tsx +8 -9
  82. package/src/components/forms/Captcha.tsx +1 -1
  83. package/src/components/forms/FormBlock.tsx +3 -5
  84. package/src/components/forms/FormCheckbox.tsx +1 -1
  85. package/src/components/forms/FormField.tsx +1 -1
  86. package/src/components/forms/FormSelect.tsx +1 -1
  87. package/src/components/forms/SchemaFormRenderer.tsx +268 -0
  88. package/src/components/forms/__tests__/SchemaFormRenderer.test.tsx +212 -0
  89. package/src/components/forms/index.ts +3 -0
  90. package/src/components/index.ts +1 -0
  91. package/src/components/input/ChoiceInputField.tsx +2 -1
  92. package/src/components/input/HtmlInputField.tsx +14 -9
  93. package/src/components/input/TextField.tsx +1 -1
  94. package/src/components/layout/CollapsibleLayout/CollapsibleLayout.tsx +6 -8
  95. package/src/components/layout/GridLayout.tsx +4 -0
  96. package/src/components/plugins/DataTable.tsx +259 -0
  97. package/src/components/plugins/StatCard.tsx +122 -0
  98. package/src/components/plugins/__tests__/DataTable.test.tsx +158 -0
  99. package/src/components/plugins/index.ts +14 -0
  100. package/src/components/shared/createSerializableView.tsx +8 -6
  101. package/src/hooks/useBaseProps.ts +1 -1
  102. package/src/schemas/transformers/ReactNodeTransformer.ts +13 -10
  103. package/src/utils/iconMap.tsx +143 -83
  104. package/dist/palettes/palette-autumn.1.4.9.css +0 -172
  105. package/dist/palettes/palette-autumn.1.4.9.min.css +0 -1
  106. package/dist/palettes/palette-autumn.1.5.0.css +0 -172
  107. package/dist/palettes/palette-autumn.1.5.0.min.css +0 -1
  108. package/dist/palettes/palette-autumn.1.5.1.css +0 -172
  109. package/dist/palettes/palette-autumn.1.5.1.min.css +0 -1
  110. package/dist/palettes/palette-autumn.1.5.2.css +0 -172
  111. package/dist/palettes/palette-autumn.1.5.2.min.css +0 -1
  112. package/dist/palettes/palette-autumn.1.5.4.css +0 -172
  113. package/dist/palettes/palette-autumn.1.5.4.min.css +0 -1
  114. package/dist/palettes/palette-autumn.1.5.5.css +0 -172
  115. package/dist/palettes/palette-autumn.1.5.5.min.css +0 -1
  116. package/dist/palettes/palette-autumn.1.5.6.css +0 -172
  117. package/dist/palettes/palette-autumn.1.5.6.min.css +0 -1
  118. package/dist/palettes/palette-autumn.1.5.7.css +0 -172
  119. package/dist/palettes/palette-autumn.1.5.7.min.css +0 -1
  120. package/dist/palettes/palette-cosmic.1.4.9.css +0 -172
  121. package/dist/palettes/palette-cosmic.1.4.9.min.css +0 -1
  122. package/dist/palettes/palette-cosmic.1.5.0.css +0 -172
  123. package/dist/palettes/palette-cosmic.1.5.0.min.css +0 -1
  124. package/dist/palettes/palette-cosmic.1.5.1.css +0 -172
  125. package/dist/palettes/palette-cosmic.1.5.1.min.css +0 -1
  126. package/dist/palettes/palette-cosmic.1.5.2.css +0 -172
  127. package/dist/palettes/palette-cosmic.1.5.2.min.css +0 -1
  128. package/dist/palettes/palette-cosmic.1.5.4.css +0 -172
  129. package/dist/palettes/palette-cosmic.1.5.4.min.css +0 -1
  130. package/dist/palettes/palette-cosmic.1.5.5.css +0 -172
  131. package/dist/palettes/palette-cosmic.1.5.5.min.css +0 -1
  132. package/dist/palettes/palette-cosmic.1.5.6.css +0 -172
  133. package/dist/palettes/palette-cosmic.1.5.6.min.css +0 -1
  134. package/dist/palettes/palette-cosmic.1.5.7.css +0 -172
  135. package/dist/palettes/palette-cosmic.1.5.7.min.css +0 -1
  136. package/dist/palettes/palette-default.1.4.9.css +0 -178
  137. package/dist/palettes/palette-default.1.4.9.min.css +0 -1
  138. package/dist/palettes/palette-default.1.5.0.css +0 -178
  139. package/dist/palettes/palette-default.1.5.0.min.css +0 -1
  140. package/dist/palettes/palette-default.1.5.1.css +0 -178
  141. package/dist/palettes/palette-default.1.5.1.min.css +0 -1
  142. package/dist/palettes/palette-default.1.5.2.css +0 -178
  143. package/dist/palettes/palette-default.1.5.2.min.css +0 -1
  144. package/dist/palettes/palette-default.1.5.4.css +0 -178
  145. package/dist/palettes/palette-default.1.5.4.min.css +0 -1
  146. package/dist/palettes/palette-default.1.5.5.css +0 -178
  147. package/dist/palettes/palette-default.1.5.5.min.css +0 -1
  148. package/dist/palettes/palette-default.1.5.6.css +0 -178
  149. package/dist/palettes/palette-default.1.5.6.min.css +0 -1
  150. package/dist/palettes/palette-default.1.5.7.css +0 -178
  151. package/dist/palettes/palette-default.1.5.7.min.css +0 -1
  152. package/dist/palettes/palette-ocean.1.4.9.css +0 -172
  153. package/dist/palettes/palette-ocean.1.4.9.min.css +0 -1
  154. package/dist/palettes/palette-ocean.1.5.0.css +0 -172
  155. package/dist/palettes/palette-ocean.1.5.0.min.css +0 -1
  156. package/dist/palettes/palette-ocean.1.5.1.css +0 -172
  157. package/dist/palettes/palette-ocean.1.5.1.min.css +0 -1
  158. package/dist/palettes/palette-ocean.1.5.2.css +0 -172
  159. package/dist/palettes/palette-ocean.1.5.2.min.css +0 -1
  160. package/dist/palettes/palette-ocean.1.5.4.css +0 -172
  161. package/dist/palettes/palette-ocean.1.5.4.min.css +0 -1
  162. package/dist/palettes/palette-ocean.1.5.5.css +0 -172
  163. package/dist/palettes/palette-ocean.1.5.5.min.css +0 -1
  164. package/dist/palettes/palette-ocean.1.5.6.css +0 -172
  165. package/dist/palettes/palette-ocean.1.5.6.min.css +0 -1
  166. package/dist/palettes/palette-ocean.1.5.7.css +0 -172
  167. package/dist/palettes/palette-ocean.1.5.7.min.css +0 -1
  168. package/dist/palettes/palette-spring.1.4.9.css +0 -160
  169. package/dist/palettes/palette-spring.1.4.9.min.css +0 -1
  170. package/dist/palettes/palette-spring.1.5.0.css +0 -160
  171. package/dist/palettes/palette-spring.1.5.0.min.css +0 -1
  172. package/dist/palettes/palette-spring.1.5.1.css +0 -160
  173. package/dist/palettes/palette-spring.1.5.1.min.css +0 -1
  174. package/dist/palettes/palette-spring.1.5.2.css +0 -160
  175. package/dist/palettes/palette-spring.1.5.2.min.css +0 -1
  176. package/dist/palettes/palette-spring.1.5.4.css +0 -166
  177. package/dist/palettes/palette-spring.1.5.4.min.css +0 -1
  178. package/dist/palettes/palette-spring.1.5.5.css +0 -166
  179. package/dist/palettes/palette-spring.1.5.5.min.css +0 -1
  180. package/dist/palettes/palette-spring.1.5.6.css +0 -166
  181. package/dist/palettes/palette-spring.1.5.6.min.css +0 -1
  182. package/dist/palettes/palette-spring.1.5.7.css +0 -166
  183. package/dist/palettes/palette-spring.1.5.7.min.css +0 -1
  184. package/dist/palettes/palette-winter.1.4.9.css +0 -172
  185. package/dist/palettes/palette-winter.1.4.9.min.css +0 -1
  186. package/dist/palettes/palette-winter.1.5.0.css +0 -172
  187. package/dist/palettes/palette-winter.1.5.0.min.css +0 -1
  188. package/dist/palettes/palette-winter.1.5.1.css +0 -172
  189. package/dist/palettes/palette-winter.1.5.1.min.css +0 -1
  190. package/dist/palettes/palette-winter.1.5.2.css +0 -172
  191. package/dist/palettes/palette-winter.1.5.2.min.css +0 -1
  192. package/dist/palettes/palette-winter.1.5.4.css +0 -172
  193. package/dist/palettes/palette-winter.1.5.4.min.css +0 -1
  194. package/dist/palettes/palette-winter.1.5.5.css +0 -172
  195. package/dist/palettes/palette-winter.1.5.5.min.css +0 -1
  196. package/dist/palettes/palette-winter.1.5.6.css +0 -172
  197. package/dist/palettes/palette-winter.1.5.6.min.css +0 -1
  198. package/dist/palettes/palette-winter.1.5.7.css +0 -172
  199. package/dist/palettes/palette-winter.1.5.7.min.css +0 -1
  200. /package/dist/palettes/{palette-autumn.1.5.3.css → palette-autumn.1.5.9.css} +0 -0
  201. /package/dist/palettes/{palette-autumn.1.5.3.min.css → palette-autumn.1.5.9.min.css} +0 -0
  202. /package/dist/palettes/{palette-cosmic.1.5.3.css → palette-cosmic.1.5.9.css} +0 -0
  203. /package/dist/palettes/{palette-cosmic.1.5.3.min.css → palette-cosmic.1.5.9.min.css} +0 -0
  204. /package/dist/palettes/{palette-default.1.5.3.css → palette-default.1.5.9.css} +0 -0
  205. /package/dist/palettes/{palette-default.1.5.3.min.css → palette-default.1.5.9.min.css} +0 -0
  206. /package/dist/palettes/{palette-ocean.1.5.3.css → palette-ocean.1.5.9.css} +0 -0
  207. /package/dist/palettes/{palette-ocean.1.5.3.min.css → palette-ocean.1.5.9.min.css} +0 -0
  208. /package/dist/palettes/{palette-spring.1.5.3.css → palette-spring.1.5.9.css} +0 -0
  209. /package/dist/palettes/{palette-spring.1.5.3.min.css → palette-spring.1.5.9.min.css} +0 -0
  210. /package/dist/palettes/{palette-winter.1.5.3.css → palette-winter.1.5.9.css} +0 -0
  211. /package/dist/palettes/{palette-winter.1.5.3.min.css → palette-winter.1.5.9.min.css} +0 -0
@@ -64,7 +64,7 @@ function FeatureGridView({
64
64
  const { styleProps, htmlProps } = useBaseProps(restProps);
65
65
 
66
66
  // Mark as QwickApp component
67
- (FeatureGridView as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
67
+ Object.assign(FeatureGridView, { [QWICKAPP_COMPONENT]: true });
68
68
 
69
69
  // Map gap to spacing value for GridLayout
70
70
  const getSpacing = (): 'none' | 'tiny' | 'small' | 'medium' | 'large' | 'huge' => {
@@ -95,9 +95,7 @@ function FeatureGrid(props: FeatureGridProps) {
95
95
  // Always call hooks unconditionally
96
96
  const bindingResult = useDataBinding<FeatureGridModel>(
97
97
  dataSource || '',
98
- restProps as Partial<FeatureGridModel>,
99
- FeatureGridModel.getSchema(),
100
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
98
+ restProps as Partial<FeatureGridModel>
101
99
  );
102
100
 
103
101
  // If no dataSource, use traditional props
@@ -81,7 +81,7 @@ function FooterView({
81
81
  const { gridProps, styleProps, htmlProps } = useBaseProps(restProps);
82
82
 
83
83
  // Mark as QwickApp component
84
- (FooterView as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
84
+ Object.assign(FooterView, { [QWICKAPP_COMPONENT]: true });
85
85
  const theme = useTheme();
86
86
  const isMobile = useMediaQuery(theme.breakpoints.down('md'));
87
87
 
@@ -292,9 +292,7 @@ function Footer(props: FooterProps) {
292
292
  // Always call hooks unconditionally
293
293
  const bindingResult = useDataBinding<FooterModel>(
294
294
  dataSource || '',
295
- restProps as Partial<FooterModel>,
296
- FooterModel.getSchema(),
297
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
295
+ restProps as Partial<FooterModel>
298
296
  );
299
297
 
300
298
  // If no dataSource, use traditional props
@@ -17,7 +17,8 @@
17
17
 
18
18
  import React, { useState, useCallback } from 'react';
19
19
  import { Box, Skeleton, Typography, useTheme } from '@mui/material';
20
- import { BrokenImage as BrokenImageIcon } from '@mui/icons-material';
20
+ import BrokenImage from "@mui/icons-material/BrokenImage";
21
+ const BrokenImageIcon = BrokenImage;
21
22
  import { ImageFit, ImageLoading, ImagePosition } from '../../schemas/ImageSchema';
22
23
  import { createSerializableView, SerializableComponent } from '../shared/createSerializableView';
23
24
  import { ViewProps } from '../shared/viewProps';
@@ -231,19 +232,21 @@ interface PatternRegistry {
231
232
 
232
233
  // Register HTML patterns that Image component can handle
233
234
  (Image as unknown as { registerPatternHandlers: (registry: PatternRegistry) => void }).registerPatternHandlers = (registry: PatternRegistry): void => {
235
+ const typedRegistry = registry as { hasPattern?: (pattern: string) => boolean; registerPattern?: (pattern: string, handler: (element: Element) => Record<string, unknown>) => void };
236
+
234
237
  // Register img elements
235
- if (!registry.hasPattern('img')) {
236
- registry.registerPattern('img', transformImage);
238
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('img')) {
239
+ typedRegistry.registerPattern?.('img', transformImage);
237
240
  }
238
241
 
239
242
  // Register figure elements with img
240
- if (!registry.hasPattern('figure img')) {
241
- registry.registerPattern('figure img', transformFigureImage);
243
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('figure img')) {
244
+ typedRegistry.registerPattern?.('figure img', transformFigureImage);
242
245
  }
243
246
  };
244
247
 
245
248
  // Transform img elements to Image component
246
- function transformImage(element: Element): unknown {
249
+ function transformImage(element: Element): Record<string, unknown> {
247
250
  const src = element.getAttribute('src') || '';
248
251
  const alt = element.getAttribute('alt') || '';
249
252
  const width = element.getAttribute('width');
@@ -263,7 +266,7 @@ function transformImage(element: Element): unknown {
263
266
  }
264
267
 
265
268
  // Transform figure > img elements to Image component with caption support
266
- function transformFigureImage(element: Element): unknown {
269
+ function transformFigureImage(element: Element): Record<string, unknown> {
267
270
  const figure = element.closest('figure');
268
271
  const figcaption = figure?.querySelector('figcaption');
269
272
  const caption = figcaption?.textContent || '';
@@ -12,7 +12,8 @@
12
12
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
13
13
  */
14
14
 
15
- import { MoreVert as MoreIcon } from '@mui/icons-material';
15
+ import MoreVert from "@mui/icons-material/MoreVert";
16
+ const MoreIcon = MoreVert;
16
17
  import {
17
18
  Avatar,
18
19
  Box,
@@ -387,9 +388,7 @@ function PageBannerHeader(props: PageBannerHeaderProps) {
387
388
  // Always call hooks unconditionally
388
389
  const bindingResult = useDataBinding<PageBannerHeaderModel>(
389
390
  dataSource || '',
390
- restProps as Partial<PageBannerHeaderModel>,
391
- PageBannerHeaderModel.getSchema(),
392
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
391
+ restProps as Partial<PageBannerHeaderModel>
393
392
  );
394
393
 
395
394
  // If no dataSource, use traditional props
@@ -10,7 +10,12 @@
10
10
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
11
11
  */
12
12
 
13
- import { Schedule as ComingSoonIcon, Launch as LaunchIcon, Visibility as PreviewIcon } from '@mui/icons-material';
13
+ import Schedule from '@mui/icons-material/Schedule';
14
+ import Launch from '@mui/icons-material/Launch';
15
+ import Visibility from '@mui/icons-material/Visibility';
16
+ const ComingSoonIcon = Schedule;
17
+ const LaunchIcon = Launch;
18
+ const PreviewIcon = Visibility;
14
19
  import {
15
20
  Box,
16
21
  Chip,
@@ -406,14 +411,12 @@ function ProductCard(props: ProductCardProps) {
406
411
  const { dataSource, bindingOptions, ...restProps } = props;
407
412
 
408
413
  // Mark as QwickApp component
409
- (ProductCard as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
414
+ Object.assign(ProductCard, { [QWICKAPP_COMPONENT]: true });
410
415
 
411
416
  // Always call hooks unconditionally
412
417
  const bindingResult = useDataBinding<ProductCardModel>(
413
418
  dataSource || '',
414
- restProps as Partial<ProductCardModel>,
415
- ProductCardModel.getSchema(),
416
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
419
+ restProps as Partial<ProductCardModel>
417
420
  );
418
421
 
419
422
  // If no dataSource, use traditional props
@@ -168,19 +168,21 @@ interface PatternRegistry {
168
168
 
169
169
  // Register HTML patterns that Section component can handle
170
170
  (Section as unknown as { registerPatternHandlers: (registry: PatternRegistry) => void }).registerPatternHandlers = (registry: PatternRegistry): void => {
171
+ const typedRegistry = registry as { hasPattern?: (pattern: string) => boolean; registerPattern?: (pattern: string, handler: (element: Element) => Record<string, unknown>) => void };
172
+
171
173
  // Register section element pattern
172
- if (!registry.hasPattern('section')) {
173
- registry.registerPattern('section', (Section as unknown as { transformSection: (element: Element) => unknown }).transformSection);
174
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('section')) {
175
+ typedRegistry.registerPattern?.('section', (Section as unknown as { transformSection: (element: Element) => Record<string, unknown> }).transformSection);
174
176
  }
175
177
 
176
178
  // Register section with specific classes
177
- if (!registry.hasPattern('section.blog-section')) {
178
- registry.registerPattern('section.blog-section', (Section as unknown as { transformBlogSection: (element: Element) => unknown }).transformBlogSection);
179
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('section.blog-section')) {
180
+ typedRegistry.registerPattern?.('section.blog-section', (Section as unknown as { transformBlogSection: (element: Element) => Record<string, unknown> }).transformBlogSection);
179
181
  }
180
182
  };
181
183
 
182
184
  // Transform generic section elements to Section component
183
- (Section as unknown as { transformSection: (element: Element) => unknown }).transformSection = (element: Element): unknown => {
185
+ (Section as unknown as { transformSection: (element: Element) => Record<string, unknown> }).transformSection = (element: Element): Record<string, unknown> => {
184
186
  const padding = element.getAttribute('data-padding') || 'medium';
185
187
  const background = element.getAttribute('data-background');
186
188
  const contentMaxWidth = element.getAttribute('data-max-width') || 'lg';
@@ -198,7 +200,7 @@ interface PatternRegistry {
198
200
  };
199
201
 
200
202
  // Transform blog section elements to Section component with specific styling
201
- (Section as unknown as { transformBlogSection: (element: Element) => unknown }).transformBlogSection = (element: Element): unknown => {
203
+ (Section as unknown as { transformBlogSection: (element: Element) => Record<string, unknown> }).transformBlogSection = (element: Element): Record<string, unknown> => {
202
204
  const padding = element.getAttribute('data-padding') || 'large';
203
205
  const background = element.getAttribute('data-background') || 'var(--theme-surface)';
204
206
 
@@ -25,8 +25,14 @@ import type { SchemaProps } from '@qwickapps/schema/src/types/ModelProps';
25
25
  /**
26
26
  * Props interface for Text component
27
27
  * Uses SchemaProps<typeof TextSchema> for clean typing
28
+ * Explicitly includes sx and style for type resolution
28
29
  */
29
- export type TextProps = ViewProps & SchemaProps<typeof TextSchema>;
30
+ export type TextProps = ViewProps & SchemaProps<typeof TextSchema> & {
31
+ /** MUI sx prop for advanced styling (explicit override for type resolution) */
32
+ sx?: import('@mui/material/styles').SxProps<import('@mui/material/styles').Theme>;
33
+ /** Inline CSS styles (explicit override for type resolution) */
34
+ style?: React.CSSProperties;
35
+ };
30
36
 
31
37
  /**
32
38
  * TextView - Pure view component that renders the typography
@@ -117,42 +123,44 @@ export const Text: SerializableComponent<TextProps> = createSerializableView<Tex
117
123
  // Type for pattern registry with basic methods
118
124
  interface PatternRegistry {
119
125
  hasPattern(pattern: string): boolean;
120
- registerPattern(pattern: string, handler: (element: Element) => unknown): void;
126
+ registerPattern(pattern: string, handler: (element: Element) => Record<string, unknown>): void;
121
127
  }
122
128
 
123
129
  // Type for Text component with pattern handlers
124
130
  interface TextComponentWithPatterns {
125
131
  registerPatternHandlers: (registry: PatternRegistry) => void;
126
- transformParagraph: (element: Element) => unknown;
127
- transformHeading: (element: Element, tagName: string) => unknown;
128
- transformSpan: (element: Element) => unknown;
132
+ transformParagraph: (element: Element) => Record<string, unknown>;
133
+ transformHeading: (element: Element, tagName: string) => Record<string, unknown>;
134
+ transformSpan: (element: Element) => Record<string, unknown>;
129
135
  }
130
136
 
131
137
  // Register HTML patterns that Text component can handle
132
138
  (Text as unknown as TextComponentWithPatterns).registerPatternHandlers = (registry: PatternRegistry): void => {
139
+ const typedRegistry = registry as { hasPattern?: (pattern: string) => boolean; registerPattern?: (pattern: string, handler: (element: Element) => Record<string, unknown>) => void };
133
140
  const textComponent = Text as unknown as TextComponentWithPatterns;
134
141
 
135
142
  // Register paragraph elements
136
- if (!registry.hasPattern('p')) {
137
- registry.registerPattern('p', textComponent.transformParagraph);
143
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('p')) {
144
+ typedRegistry.registerPattern?.('p', textComponent.transformParagraph);
138
145
  }
139
146
 
140
147
  // Register heading elements
141
148
  const headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
142
149
  headings.forEach(heading => {
143
- if (!registry.hasPattern(heading)) {
144
- registry.registerPattern(heading, (element: Element) => textComponent.transformHeading(element, heading));
150
+
151
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern(heading)) {
152
+ typedRegistry.registerPattern?.(heading, (element: Element) => textComponent.transformHeading(element, heading));
145
153
  }
146
154
  });
147
155
 
148
156
  // Register span elements
149
- if (!registry.hasPattern('span')) {
150
- registry.registerPattern('span', textComponent.transformSpan);
157
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('span')) {
158
+ typedRegistry.registerPattern?.('span', textComponent.transformSpan);
151
159
  }
152
160
  };
153
161
 
154
162
  // Transform paragraph elements to Text component
155
- (Text as unknown as TextComponentWithPatterns).transformParagraph = (element: Element): unknown => {
163
+ (Text as unknown as TextComponentWithPatterns).transformParagraph = (element: Element): Record<string, unknown> => {
156
164
  return {
157
165
  tagName: 'Text',
158
166
  version: '1.0.0',
@@ -165,7 +173,7 @@ interface TextComponentWithPatterns {
165
173
  };
166
174
 
167
175
  // Transform heading elements to Text component
168
- (Text as unknown as TextComponentWithPatterns).transformHeading = (element: Element, tagName: string): unknown => {
176
+ (Text as unknown as TextComponentWithPatterns).transformHeading = (element: Element, tagName: string): Record<string, unknown> => {
169
177
  const variantMap: { [key: string]: string } = {
170
178
  'h1': 'h1',
171
179
  'h2': 'h2',
@@ -187,7 +195,7 @@ interface TextComponentWithPatterns {
187
195
  };
188
196
 
189
197
  // Transform span elements to Text component
190
- (Text as unknown as TextComponentWithPatterns).transformSpan = (element: Element): unknown => {
198
+ (Text as unknown as TextComponentWithPatterns).transformSpan = (element: Element): Record<string, unknown> => {
191
199
  return {
192
200
  tagName: 'Text',
193
201
  version: '1.0.0',
@@ -311,24 +311,26 @@ export const Button: SerializableComponent<ButtonProps> = createSerializableView
311
311
 
312
312
  // Register HTML patterns that Button component can handle
313
313
  (Button as Record<string, unknown>).registerPatternHandlers = (registry: Record<string, (...args: unknown[]) => unknown>): void => {
314
+ const typedRegistry = registry as { hasPattern?: (pattern: string) => boolean; registerPattern?: (pattern: string, handler: (element: Element) => Record<string, unknown>) => void };
315
+
314
316
  // Register button elements
315
- if (!registry.hasPattern('button')) {
316
- registry.registerPattern('button', transformButton);
317
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('button')) {
318
+ typedRegistry.registerPattern?.('button', transformButton);
317
319
  }
318
320
 
319
321
  // Register input type="button" elements
320
- if (!registry.hasPattern('input[type="button"]')) {
321
- registry.registerPattern('input[type="button"]', transformInputButton);
322
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('input[type="button"]')) {
323
+ typedRegistry.registerPattern?.('input[type="button"]', transformInputButton);
322
324
  }
323
325
 
324
326
  // Register input type="submit" elements
325
- if (!registry.hasPattern('input[type="submit"]')) {
326
- registry.registerPattern('input[type="submit"]', transformSubmitButton);
327
+ if (typedRegistry.hasPattern && !typedRegistry.hasPattern('input[type="submit"]')) {
328
+ typedRegistry.registerPattern?.('input[type="submit"]', transformSubmitButton);
327
329
  }
328
330
  };
329
331
 
330
332
  // Transform button elements to Button component
331
- function transformButton(element: Element): unknown {
333
+ function transformButton(element: Element): Record<string, unknown> {
332
334
  const variant = element.getAttribute('data-variant') ||
333
335
  (element.className.includes('btn-primary') ? 'primary' :
334
336
  element.className.includes('btn-outlined') ? 'outlined' : 'secondary');
@@ -349,7 +351,7 @@ function transformButton(element: Element): unknown {
349
351
  }
350
352
 
351
353
  // Transform input type="button" elements to Button component
352
- function transformInputButton(element: Element): unknown {
354
+ function transformInputButton(element: Element): Record<string, unknown> {
353
355
  const disabled = element.hasAttribute('disabled');
354
356
  const value = element.getAttribute('value') || 'Button';
355
357
 
@@ -364,7 +366,7 @@ function transformInputButton(element: Element): unknown {
364
366
  }
365
367
 
366
368
  // Transform input type="submit" elements to Button component
367
- function transformSubmitButton(element: Element): unknown {
369
+ function transformSubmitButton(element: Element): Record<string, unknown> {
368
370
  const disabled = element.hasAttribute('disabled');
369
371
  const value = element.getAttribute('value') || 'Submit';
370
372
 
@@ -11,10 +11,10 @@
11
11
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
12
12
  */
13
13
 
14
- import {
15
- Palette as PaletteIcon,
16
- Circle as CircleIcon,
17
- } from '@mui/icons-material';
14
+ import Palette from '@mui/icons-material/Palette';
15
+ import Circle from '@mui/icons-material/Circle';
16
+ const PaletteIcon = Palette;
17
+ const CircleIcon = Circle;
18
18
  import {
19
19
  IconButton,
20
20
  Menu,
@@ -210,9 +210,7 @@ function PaletteSwitcher(props: PaletteSwitcherProps) {
210
210
  // Always call hooks unconditionally
211
211
  const bindingResult = useDataBinding<PaletteSwitcherModel>(
212
212
  dataSource || '',
213
- restProps as Partial<PaletteSwitcherModel>,
214
- PaletteSwitcherModel.getSchema(),
215
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
213
+ restProps as Partial<PaletteSwitcherModel>
216
214
  );
217
215
 
218
216
  // If no dataSource, use traditional props
@@ -266,6 +264,6 @@ function PaletteSwitcher(props: PaletteSwitcherProps) {
266
264
  }
267
265
 
268
266
  // Mark as QwickApp component
269
- (PaletteSwitcher as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
267
+ Object.assign(PaletteSwitcher, { [QWICKAPP_COMPONENT]: true });
270
268
 
271
269
  export default PaletteSwitcher;
@@ -21,11 +21,12 @@ import {
21
21
  Tooltip,
22
22
  Typography
23
23
  } from '@mui/material';
24
- import {
25
- DarkMode as DarkModeIcon,
26
- LightMode as LightModeIcon,
27
- SettingsSystemDaydream as SystemIcon
28
- } from '@mui/icons-material';
24
+ import DarkMode from '@mui/icons-material/DarkMode';
25
+ import LightMode from '@mui/icons-material/LightMode';
26
+ import SettingsSystemDaydream from '@mui/icons-material/SettingsSystemDaydream';
27
+ const DarkModeIcon = DarkMode;
28
+ const LightModeIcon = LightMode;
29
+ const SystemIcon = SettingsSystemDaydream;
29
30
  import type { WithDataBinding, SchemaProps } from '@qwickapps/schema';
30
31
  import { useState } from 'react';
31
32
  import { useTheme } from '../../contexts/ThemeContext';
@@ -235,9 +236,7 @@ function ThemeSwitcher(props: ThemeSwitcherProps) {
235
236
  // Always call hooks unconditionally
236
237
  const bindingResult = useDataBinding<ThemeSwitcherModel>(
237
238
  dataSource || '',
238
- restProps as Partial<ThemeSwitcherModel>,
239
- ThemeSwitcherModel.getSchema(),
240
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
239
+ restProps as Partial<ThemeSwitcherModel>
241
240
  );
242
241
 
243
242
  // If no dataSource, use traditional props
@@ -282,6 +281,6 @@ function ThemeSwitcher(props: ThemeSwitcherProps) {
282
281
  }
283
282
 
284
283
  // Mark as QwickApp component
285
- (ThemeSwitcher as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
284
+ Object.assign(ThemeSwitcher, { [QWICKAPP_COMPONENT]: true });
286
285
 
287
286
  export default ThemeSwitcher;
@@ -286,6 +286,6 @@ export const Captcha = React.forwardRef<HTMLDivElement, CaptchaProps>((props, re
286
286
  Captcha.displayName = 'Captcha';
287
287
 
288
288
  // Mark as QwickApp component
289
- (Captcha as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
289
+ Object.assign(Captcha, { [QWICKAPP_COMPONENT]: true });
290
290
 
291
291
  export default Captcha;
@@ -225,7 +225,7 @@ function FormBlockView({
225
225
  }
226
226
 
227
227
  // Main component with data binding support and serialization capability
228
- export class FormBlock extends ModelView<FormBlockProps, FormBlockModel> {
228
+ export class FormBlock extends ModelView<FormBlockProps> {
229
229
  // Component self-declaration for serialization
230
230
  static readonly tagName = 'FormBlock';
231
231
  static readonly version = '1.0.0';
@@ -298,9 +298,7 @@ function FormBlockWithDataBinding(props: FormBlockProps) {
298
298
  // Use data binding
299
299
  const { loading, error, ...formBlockProps } = useDataBinding<FormBlockModel>(
300
300
  dataSource!,
301
- restProps as Partial<FormBlockModel>,
302
- FormBlockModel.getSchema(),
303
- { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
301
+ restProps as Partial<FormBlockModel>
304
302
  );
305
303
 
306
304
  // Show loading state
@@ -346,6 +344,6 @@ function FormBlockWithDataBinding(props: FormBlockProps) {
346
344
  }
347
345
 
348
346
  // Mark as QwickApp component
349
- (FormBlock as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
347
+ Object.assign(FormBlock, { [QWICKAPP_COMPONENT]: true });
350
348
 
351
349
  export default FormBlock;
@@ -111,6 +111,6 @@ export const FormCheckbox = React.forwardRef<HTMLDivElement, FormCheckboxProps>(
111
111
  FormCheckbox.displayName = 'FormCheckbox';
112
112
 
113
113
  // Mark as QwickApp component
114
- (FormCheckbox as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
114
+ Object.assign(FormCheckbox, { [QWICKAPP_COMPONENT]: true });
115
115
 
116
116
  export default FormCheckbox;
@@ -175,6 +175,6 @@ export const FormField = React.forwardRef<HTMLDivElement, FormFieldProps>((props
175
175
  FormField.displayName = 'FormField';
176
176
 
177
177
  // Mark as QwickApp component
178
- (FormField as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
178
+ Object.assign(FormField, { [QWICKAPP_COMPONENT]: true });
179
179
 
180
180
  export default FormField;
@@ -135,6 +135,6 @@ export const FormSelect = React.forwardRef<HTMLDivElement, FormSelectProps>((pro
135
135
  FormSelect.displayName = 'FormSelect';
136
136
 
137
137
  // Mark as QwickApp component
138
- (FormSelect as Record<string, unknown>)[QWICKAPP_COMPONENT] = true;
138
+ Object.assign(FormSelect, { [QWICKAPP_COMPONENT]: true });
139
139
 
140
140
  export default FormSelect;