@qwickapps/react-framework 1.3.4 → 1.4.0

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 (325) hide show
  1. package/README.md +1688 -2
  2. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
  3. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
  4. package/dist/components/ErrorBoundary.d.ts +7 -0
  5. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  6. package/dist/components/Html.d.ts +28 -18
  7. package/dist/components/Html.d.ts.map +1 -1
  8. package/dist/components/Logo.d.ts +12 -35
  9. package/dist/components/Logo.d.ts.map +1 -1
  10. package/dist/components/Markdown.d.ts +18 -13
  11. package/dist/components/Markdown.d.ts.map +1 -1
  12. package/dist/components/QwickApp.d.ts +16 -3
  13. package/dist/components/QwickApp.d.ts.map +1 -1
  14. package/dist/components/QwickIcon.d.ts +23 -0
  15. package/dist/components/QwickIcon.d.ts.map +1 -0
  16. package/dist/components/SafeSpan.d.ts +12 -5
  17. package/dist/components/SafeSpan.d.ts.map +1 -1
  18. package/dist/components/Scaffold.d.ts.map +1 -1
  19. package/dist/components/base/ModelView.d.ts +101 -0
  20. package/dist/components/base/ModelView.d.ts.map +1 -0
  21. package/dist/components/base/index.d.ts +11 -0
  22. package/dist/components/base/index.d.ts.map +1 -0
  23. package/dist/components/blocks/Article.d.ts +12 -2
  24. package/dist/components/blocks/Article.d.ts.map +1 -1
  25. package/dist/components/blocks/Code.d.ts +13 -2
  26. package/dist/components/blocks/Code.d.ts.map +1 -1
  27. package/dist/components/blocks/Content.d.ts.map +1 -1
  28. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
  29. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  30. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  31. package/dist/components/blocks/Footer.d.ts.map +1 -1
  32. package/dist/components/blocks/HeroBlock.d.ts +27 -13
  33. package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
  34. package/dist/components/blocks/Image.d.ts +41 -0
  35. package/dist/components/blocks/Image.d.ts.map +1 -0
  36. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  37. package/dist/components/blocks/ProductCard.d.ts.map +1 -1
  38. package/dist/components/blocks/Section.d.ts +16 -2
  39. package/dist/components/blocks/Section.d.ts.map +1 -1
  40. package/dist/components/blocks/Text.d.ts +41 -0
  41. package/dist/components/blocks/Text.d.ts.map +1 -0
  42. package/dist/components/blocks/index.d.ts +4 -0
  43. package/dist/components/blocks/index.d.ts.map +1 -1
  44. package/dist/components/buttons/Button.d.ts +23 -7
  45. package/dist/components/buttons/Button.d.ts.map +1 -1
  46. package/dist/components/forms/FormBlock.d.ts +19 -13
  47. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  48. package/dist/components/index.d.ts +4 -0
  49. package/dist/components/index.d.ts.map +1 -1
  50. package/dist/components/input/ChoiceInputField.d.ts +17 -11
  51. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  52. package/dist/components/input/HtmlInputField.d.ts +17 -11
  53. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  54. package/dist/components/input/SelectInputField.d.ts +16 -10
  55. package/dist/components/input/SelectInputField.d.ts.map +1 -1
  56. package/dist/components/input/SwitchInputField.d.ts +16 -10
  57. package/dist/components/input/SwitchInputField.d.ts.map +1 -1
  58. package/dist/components/input/TextField.d.ts.map +1 -1
  59. package/dist/components/input/TextInputField.d.ts +16 -11
  60. package/dist/components/input/TextInputField.d.ts.map +1 -1
  61. package/dist/components/layout/GridCell.d.ts +23 -6
  62. package/dist/components/layout/GridCell.d.ts.map +1 -1
  63. package/dist/components/layout/GridLayout.d.ts +24 -23
  64. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  65. package/dist/components/pages/FormPage.d.ts.map +1 -1
  66. package/dist/components/pages/Page.d.ts +49 -87
  67. package/dist/components/pages/Page.d.ts.map +1 -1
  68. package/dist/components/pages/index.d.ts +2 -2
  69. package/dist/components/pages/index.d.ts.map +1 -1
  70. package/dist/config/AppConfig.d.ts +49 -0
  71. package/dist/config/AppConfig.d.ts.map +1 -0
  72. package/dist/config/AppConfigBuilder.d.ts +75 -0
  73. package/dist/config/AppConfigBuilder.d.ts.map +1 -0
  74. package/dist/config/index.d.ts +13 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/types.d.ts +130 -0
  77. package/dist/config/types.d.ts.map +1 -0
  78. package/dist/config.d.ts +15 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.esm.js +451 -0
  81. package/dist/config.js +455 -0
  82. package/dist/contexts/PrintModeContext.d.ts +27 -0
  83. package/dist/contexts/PrintModeContext.d.ts.map +1 -0
  84. package/dist/contexts/QwickAppContext.d.ts +2 -2
  85. package/dist/contexts/QwickAppContext.d.ts.map +1 -1
  86. package/dist/contexts/ThemeContext.d.ts.map +1 -1
  87. package/dist/contexts/index.d.ts +2 -0
  88. package/dist/contexts/index.d.ts.map +1 -1
  89. package/dist/hooks/index.d.ts +2 -0
  90. package/dist/hooks/index.d.ts.map +1 -1
  91. package/dist/hooks/usePrintMode.d.ts +39 -0
  92. package/dist/hooks/usePrintMode.d.ts.map +1 -0
  93. package/dist/index.css +1 -1
  94. package/dist/index.d.ts +1 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.esm.css +1 -1
  97. package/dist/index.esm.js +20722 -16021
  98. package/dist/index.js +20725 -16010
  99. package/dist/schemas/CodeSchema.d.ts +2 -1
  100. package/dist/schemas/CodeSchema.d.ts.map +1 -1
  101. package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
  102. package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
  103. package/dist/schemas/ContentSchema.d.ts +2 -1
  104. package/dist/schemas/ContentSchema.d.ts.map +1 -1
  105. package/dist/schemas/GridCellSchema.d.ts +25 -0
  106. package/dist/schemas/GridCellSchema.d.ts.map +1 -0
  107. package/dist/schemas/GridLayoutSchema.d.ts +23 -0
  108. package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
  109. package/dist/schemas/HtmlSchema.d.ts +14 -0
  110. package/dist/schemas/HtmlSchema.d.ts.map +1 -0
  111. package/dist/schemas/ImageSchema.d.ts +32 -0
  112. package/dist/schemas/ImageSchema.d.ts.map +1 -0
  113. package/dist/schemas/LogoSchema.d.ts +35 -0
  114. package/dist/schemas/LogoSchema.d.ts.map +1 -0
  115. package/dist/schemas/MarkdownSchema.d.ts +14 -0
  116. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  117. package/dist/schemas/PageTemplateSchema.d.ts +31 -0
  118. package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
  119. package/dist/schemas/PrintConfigSchema.d.ts +31 -0
  120. package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
  121. package/dist/schemas/SectionSchema.d.ts +2 -1
  122. package/dist/schemas/SectionSchema.d.ts.map +1 -1
  123. package/dist/schemas/TextSchema.d.ts +37 -0
  124. package/dist/schemas/TextSchema.d.ts.map +1 -0
  125. package/dist/schemas/ViewModelSchema.d.ts +23 -0
  126. package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
  127. package/dist/schemas/index.d.ts +15 -1
  128. package/dist/schemas/index.d.ts.map +1 -1
  129. package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
  130. package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
  131. package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
  132. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
  133. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
  134. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
  135. package/dist/schemas/transformers/registry.d.ts +15 -0
  136. package/dist/schemas/transformers/registry.d.ts.map +1 -0
  137. package/dist/schemas/types/Serializable.d.ts +46 -0
  138. package/dist/schemas/types/Serializable.d.ts.map +1 -0
  139. package/dist/utils/htmlTransform.d.ts.map +1 -1
  140. package/dist/utils/reactUtils.d.ts +12 -3
  141. package/dist/utils/reactUtils.d.ts.map +1 -1
  142. package/package.json +17 -3
  143. package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
  144. package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
  145. package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
  146. package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
  147. package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
  148. package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
  149. package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
  150. package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
  151. package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
  152. package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
  153. package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
  154. package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
  155. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
  156. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
  157. package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
  158. package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
  159. package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
  160. package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
  161. package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
  162. package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
  163. package/src/__tests__/components/Logo.test.js +3 -3
  164. package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
  165. package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
  166. package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
  167. package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
  168. package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
  169. package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
  170. package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
  171. package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
  172. package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
  173. package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
  174. package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
  175. package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
  176. package/src/__tests__/components/base/ModelView.test.tsx +220 -0
  177. package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
  178. package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
  179. package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
  180. package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
  181. package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
  182. package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
  183. package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
  184. package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
  185. package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
  186. package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
  187. package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
  188. package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
  189. package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
  190. package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
  191. package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
  192. package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
  193. package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
  194. package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
  195. package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
  196. package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
  197. package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
  198. package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
  199. package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
  200. package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
  201. package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
  202. package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
  203. package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
  204. package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
  205. package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
  206. package/src/components/ErrorBoundary.tsx +8 -8
  207. package/src/components/Html.tsx +147 -44
  208. package/src/components/Logo.tsx +198 -100
  209. package/src/components/Markdown.tsx +125 -16
  210. package/src/components/QwickApp.tsx +64 -31
  211. package/src/components/QwickIcon.tsx +59 -0
  212. package/src/components/SafeSpan.tsx +65 -10
  213. package/src/components/Scaffold.tsx +2 -8
  214. package/src/components/base/ModelView.tsx +199 -0
  215. package/src/components/base/index.ts +11 -0
  216. package/src/components/blocks/Article.tsx +57 -18
  217. package/src/components/blocks/Code.md +529 -0
  218. package/src/components/blocks/Code.tsx +102 -15
  219. package/src/components/blocks/Content.tsx +25 -77
  220. package/src/components/blocks/CoverImageHeader.tsx +9 -4
  221. package/src/components/blocks/FeatureCard.tsx +1 -2
  222. package/src/components/blocks/FeatureGrid.tsx +19 -1
  223. package/src/components/blocks/Footer.tsx +13 -1
  224. package/src/components/blocks/HeroBlock.tsx +87 -20
  225. package/src/components/blocks/Image.tsx +395 -0
  226. package/src/components/blocks/PageBannerHeader.tsx +14 -12
  227. package/src/components/blocks/ProductCard.tsx +51 -52
  228. package/src/components/blocks/Section.tsx +113 -8
  229. package/src/components/blocks/Text.tsx +285 -0
  230. package/src/components/blocks/index.ts +4 -0
  231. package/src/components/buttons/Button.tsx +184 -15
  232. package/src/components/forms/FormBlock.tsx +70 -17
  233. package/src/components/index.ts +5 -0
  234. package/src/components/input/ChoiceInputField.tsx +48 -18
  235. package/src/components/input/HtmlInputField.tsx +48 -18
  236. package/src/components/input/SelectInputField.tsx +48 -16
  237. package/src/components/input/SwitchInputField.tsx +48 -17
  238. package/src/components/input/TextField.tsx +41 -1
  239. package/src/components/input/TextInputField.tsx +52 -18
  240. package/src/components/layout/GridCell.tsx +118 -9
  241. package/src/components/layout/GridLayout.tsx +125 -24
  242. package/src/components/pages/FormPage.tsx +0 -1
  243. package/src/components/pages/Page.css +304 -332
  244. package/src/components/pages/Page.tsx +307 -255
  245. package/src/components/pages/index.ts +2 -2
  246. package/src/config/AppConfig.ts +133 -0
  247. package/src/config/AppConfigBuilder.ts +421 -0
  248. package/src/config/__tests__/AppConfig.test.ts +385 -0
  249. package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
  250. package/src/config/index.ts +24 -0
  251. package/src/config/types.ts +170 -0
  252. package/src/config.ts +25 -0
  253. package/src/contexts/PrintModeContext.tsx +332 -0
  254. package/src/contexts/QwickAppContext.tsx +2 -2
  255. package/src/contexts/ThemeContext.tsx +1 -2
  256. package/src/contexts/index.ts +2 -0
  257. package/src/hooks/index.ts +5 -1
  258. package/src/hooks/usePrintMode.ts +73 -0
  259. package/src/index.ts +3 -0
  260. package/src/schemas/CodeSchema.ts +3 -3
  261. package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
  262. package/src/schemas/ContentSchema.ts +2 -1
  263. package/src/schemas/GridCellSchema.ts +164 -0
  264. package/src/schemas/GridLayoutSchema.ts +133 -0
  265. package/src/schemas/HtmlSchema.ts +47 -0
  266. package/src/schemas/ImageSchema.ts +235 -0
  267. package/src/schemas/LogoSchema.ts +241 -0
  268. package/src/schemas/MarkdownSchema.ts +47 -0
  269. package/src/schemas/PageTemplateSchema.ts +186 -0
  270. package/src/schemas/PrintConfigSchema.ts +207 -0
  271. package/src/schemas/README.md +661 -0
  272. package/src/schemas/SectionSchema.ts +2 -1
  273. package/src/schemas/TextSchema.ts +329 -0
  274. package/src/schemas/ViewModelSchema.ts +115 -0
  275. package/src/schemas/index.ts +21 -2
  276. package/src/schemas/transformers/ComponentTransformer.ts +403 -0
  277. package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
  278. package/src/schemas/transformers/registry.ts +72 -0
  279. package/src/schemas/types/Serializable.ts +51 -0
  280. package/src/stories/AccessibilityProvider.stories.tsx +253 -253
  281. package/src/stories/Article.stories.tsx +433 -433
  282. package/src/stories/Button.stories.tsx +1 -1
  283. package/src/stories/CardListGrid.stories.tsx +451 -451
  284. package/src/stories/ChoiceInputField.stories.tsx +503 -503
  285. package/src/stories/Code.stories.tsx +1 -1
  286. package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
  287. package/src/stories/Content.stories.tsx +393 -393
  288. package/src/stories/CoverImageHeader.stories.tsx +701 -701
  289. package/src/stories/DataBinding.advanced.stories.tsx +432 -432
  290. package/src/stories/DataProvider.stories.tsx +1192 -1192
  291. package/src/stories/FeatureCard.stories.tsx +557 -557
  292. package/src/stories/FeatureGrid.stories.tsx +594 -594
  293. package/src/stories/Footer.stories.tsx +640 -640
  294. package/src/stories/FormBlock.stories.tsx +760 -760
  295. package/src/stories/FormComponents.stories.tsx +349 -541
  296. package/src/stories/GridCell.stories.tsx +417 -0
  297. package/src/stories/GridLayout.stories.tsx +353 -0
  298. package/src/stories/HeroBlock.stories.tsx +862 -373
  299. package/src/stories/HtmlInputField.stories.tsx +474 -474
  300. package/src/stories/Image.stories.tsx +819 -0
  301. package/src/stories/Introduction.stories.tsx +667 -667
  302. package/src/stories/LayoutBlocks.stories.tsx +324 -324
  303. package/src/stories/Logo.stories.tsx +165 -6
  304. package/src/stories/Markdown.stories.tsx +137 -137
  305. package/src/stories/ModelView.stories.tsx +477 -0
  306. package/src/stories/Page.stories.tsx +688 -688
  307. package/src/stories/PageBannerHeader.stories.tsx +864 -864
  308. package/src/stories/PaletteSwitcher.stories.tsx +119 -119
  309. package/src/stories/ProductCard.stories.tsx +424 -424
  310. package/src/stories/QwickApp.stories.tsx +368 -368
  311. package/src/stories/ResponsiveMenu.stories.tsx +249 -249
  312. package/src/stories/SafeSpan.stories.tsx +531 -531
  313. package/src/stories/Section.stories.tsx +90 -2
  314. package/src/stories/SelectInputField.stories.tsx +524 -524
  315. package/src/stories/Text.stories.tsx +560 -0
  316. package/src/stories/TextInputField.stories.tsx +443 -443
  317. package/src/stories/ThemeSwitcher.stories.tsx +123 -123
  318. package/src/utils/htmlTransform.tsx +74 -53
  319. package/src/utils/reactUtils.tsx +57 -6
  320. package/dist/index.bundled.css +0 -12
  321. /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
  322. /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
  323. /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
  324. /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
  325. /package/src/{utils/__tests__ → __tests__/utils}/optional-logging.test.ts +0 -0
@@ -0,0 +1,477 @@
1
+ /**
2
+ * ModelView Base Component Stories - Standardized serialization architecture
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { Box, Typography, Alert, Paper, Divider } from '@mui/material';
8
+ import { JsonDataProvider } from '@qwickapps/schema';
9
+ import type { Meta, StoryObj } from '@storybook/react';
10
+ import { Code } from '../components/blocks';
11
+ import Section from '../components/blocks/Section';
12
+ import { Button } from '../components/buttons/Button';
13
+ import { ComponentTransformer } from '../schemas/transformers/ComponentTransformer';
14
+ import { ModelView } from '../components/base/ModelView';
15
+ import QwickApp from '../components/QwickApp';
16
+ import React from 'react';
17
+
18
+ // Sample data for ModelView demonstrations
19
+ const sampleData = {
20
+ 'modelview': {
21
+ 'code-example': {
22
+ language: 'typescript',
23
+ title: 'modelview-example.ts',
24
+ showLineNumbers: true,
25
+ showCopy: true,
26
+ children: `// ModelView base class provides standardized serialization
27
+ class Code extends ModelView<CodeProps, CodeModel> {
28
+ static readonly tagName = 'Code';
29
+ static readonly version = '1.0.0';
30
+
31
+ protected getComponentSpecificProps(): any {
32
+ return {
33
+ language: this.props.language,
34
+ showCopy: this.props.showCopy,
35
+ showLineNumbers: this.props.showLineNumbers,
36
+ title: this.props.title
37
+ };
38
+ }
39
+ }`
40
+ },
41
+ 'section-example': {
42
+ background: '#f0f8ff',
43
+ padding: 'medium',
44
+ contentMaxWidth: 'lg',
45
+ component: 'section'
46
+ },
47
+ 'button-example': {
48
+ label: 'ModelView Button',
49
+ variant: 'primary',
50
+ action: { type: 'navigate', url: '/modelview' }
51
+ }
52
+ }
53
+ };
54
+
55
+ const dataProvider = new JsonDataProvider({ data: sampleData });
56
+
57
+ const meta = {
58
+ title: 'Architecture/ModelView',
59
+ component: ModelView,
60
+ parameters: {
61
+ layout: 'padded',
62
+ docs: {
63
+ description: {
64
+ component: `ModelView is the abstract base class for all serializable QwickApps components, providing standardized serialization patterns and eliminating code duplication.
65
+
66
+ **Core Architecture Principles:**
67
+ - **Single Source of Truth**: All components inherit common serialization behavior
68
+ - **Standardized API**: Consistent toJson/fromJson patterns across all components
69
+ - **Data Binding Integration**: Automatic CMS integration with loading states and error handling
70
+ - **Type Safety**: Strong typing for component props, models, and serialization data
71
+ - **"WebView for React"**: Enables complete UI serialization and reconstruction
72
+
73
+ **Key Features:**
74
+ - **Common Base Props**: Automatic handling of children, dataSource, bindingOptions, className, id
75
+ - **Component-Specific Extensions**: Hook for components to add their specific serialization properties
76
+ - **Nested Component Support**: Specialized handling for components with nested children (like Section)
77
+ - **Action Pattern Support**: Serializable behavior patterns for interactive components (like Button)
78
+ - **Render Pattern Standardization**: Common render logic for data-bound vs traditional prop usage
79
+
80
+ **Benefits:**
81
+ - **Code Deduplication**: Common patterns implemented once and inherited by all components
82
+ - **Consistency**: All components serialize/deserialize with identical patterns
83
+ - **Maintainability**: Changes to base behavior automatically apply to all components
84
+ - **Testing**: Unified test patterns for serialization across the entire component library`,
85
+ },
86
+ },
87
+ },
88
+ tags: ['autodocs'],
89
+ } satisfies Meta<typeof ModelView>;
90
+
91
+ export default meta;
92
+ type Story = StoryObj<typeof meta>;
93
+
94
+ export const ArchitectureOverview: Story = {
95
+ render: () => (
96
+ <QwickApp appId="modelview-architecture" appName='ModelView Architecture Overview'>
97
+ <Box>
98
+
99
+ <Box sx={{ mb: 6, textAlign: 'center' }}>
100
+ <Typography variant="h2" gutterBottom>ModelView Architecture Pattern</Typography>
101
+ <Typography variant="h5" sx={{ mb: 4, opacity: 0.7 }}>
102
+ The foundation for standardized component serialization in QwickApps React Framework
103
+ </Typography>
104
+
105
+ <Alert severity="info" sx={{ mb: 4, textAlign: 'left' }}>
106
+ ModelView is an abstract base class that eliminates code duplication across QwickApps components
107
+ by providing common serialization, data binding, and rendering patterns. Every serializable
108
+ component (Code, Section, Button) extends ModelView to inherit standardized behavior.
109
+ </Alert>
110
+ </Box>
111
+
112
+ {/* Core Architecture */}
113
+ <Box sx={{ mb: 8 }}>
114
+ <Typography variant="h3" gutterBottom>Core Architecture</Typography>
115
+ <Code language="typescript" title="ModelView.ts" showLineNumbers={true}>
116
+ {`// Abstract base class for all serializable components
117
+ export abstract class ModelView<TProps, TModel>
118
+ extends React.Component<TProps & WithDataBinding>
119
+ implements Serializable {
120
+
121
+ // Component metadata (overridden by subclasses)
122
+ static readonly tagName: string;
123
+ static readonly version: string;
124
+
125
+ // Common serialization implementation
126
+ toJson(): any {
127
+ return {
128
+ ...this.getBaseSerializableProps(),
129
+ ...this.getComponentSpecificProps()
130
+ };
131
+ }
132
+
133
+ // Base props all components serialize
134
+ protected getBaseSerializableProps(): any {
135
+ return {
136
+ children: this.serializeChildren(this.props.children),
137
+ dataSource: this.props.dataSource,
138
+ bindingOptions: this.props.bindingOptions,
139
+ className: this.props.className,
140
+ id: this.props.id
141
+ };
142
+ }
143
+
144
+ // Hook for component-specific props (implemented by subclasses)
145
+ protected abstract getComponentSpecificProps(): any;
146
+
147
+ // Common render pattern
148
+ render() {
149
+ return this.props.dataSource
150
+ ? this.renderWithDataBinding()
151
+ : this.renderView();
152
+ }
153
+ }`}
154
+ </Code>
155
+ </Box>
156
+
157
+ {/* Implementation Pattern */}
158
+ <Box sx={{ mb: 8 }}>
159
+ <Typography variant="h3" gutterBottom>Component Implementation Pattern</Typography>
160
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
161
+ Every QwickApps component follows this standardized pattern when extending ModelView
162
+ </Typography>
163
+ <Code language="typescript" title="ComponentImplementation.ts" showLineNumbers={true}>
164
+ {`// Example: Code component implementation
165
+ export class Code extends ModelView<CodeProps, CodeModel> {
166
+ // Required: Component identification
167
+ static readonly tagName = 'Code';
168
+ static readonly version = '1.0.0';
169
+
170
+ // Required: Deserialization factory method
171
+ static fromJson(jsonData: any): ReactElement {
172
+ return <Code {...jsonData} />;
173
+ }
174
+
175
+ // Required: Component-specific serialization properties
176
+ protected getComponentSpecificProps(): any {
177
+ return {
178
+ language: this.props.language,
179
+ showCopy: this.props.showCopy,
180
+ showLineNumbers: this.props.showLineNumbers,
181
+ title: this.props.title,
182
+ wrapLines: this.props.wrapLines,
183
+ codeBackground: this.props.codeBackground
184
+ };
185
+ }
186
+
187
+ // Required: Traditional props rendering
188
+ protected renderView(): React.ReactElement {
189
+ const { dataSource, bindingOptions, ...restProps } = this.props;
190
+ return <CodeView {...restProps} />;
191
+ }
192
+
193
+ // Required: Data-bound rendering
194
+ protected renderWithDataBinding(): React.ReactElement {
195
+ return <CodeWithDataBinding {...this.props} />;
196
+ }
197
+ }`}
198
+ </Code>
199
+ </Box>
200
+
201
+ {/* Benefits Grid */}
202
+ <Box sx={{ p: 4, backgroundColor: 'primary.light', color: 'primary.contrastText', borderRadius: 2 }}>
203
+ <Typography variant="h3" gutterBottom>ModelView Benefits</Typography>
204
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr', lg: '1fr 1fr 1fr' }, gap: 4, mt: 4 }}>
205
+ <Box>
206
+ <Typography variant="h6" gutterBottom>Code Deduplication</Typography>
207
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
208
+ Common serialization logic implemented once, inherited by all components. No repetitive boilerplate.
209
+ </Typography>
210
+ </Box>
211
+ <Box>
212
+ <Typography variant="h6" gutterBottom>Consistency</Typography>
213
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
214
+ All components serialize/deserialize with identical patterns. Predictable behavior across the framework.
215
+ </Typography>
216
+ </Box>
217
+ <Box>
218
+ <Typography variant="h6" gutterBottom>Maintainability</Typography>
219
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
220
+ Changes to base behavior automatically apply to all components. Single point of maintenance.
221
+ </Typography>
222
+ </Box>
223
+ <Box>
224
+ <Typography variant="h6" gutterBottom>Data Binding</Typography>
225
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
226
+ Automatic CMS integration with loading states, error handling, and fallback support built-in.
227
+ </Typography>
228
+ </Box>
229
+ <Box>
230
+ <Typography variant="h6" gutterBottom>Type Safety</Typography>
231
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
232
+ Strong typing for component props, models, and serialization data structures throughout.
233
+ </Typography>
234
+ </Box>
235
+ <Box>
236
+ <Typography variant="h6" gutterBottom>WebView Ready</Typography>
237
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
238
+ Complete "WebView for React" functionality - UI can be dynamically generated from data.
239
+ </Typography>
240
+ </Box>
241
+ </Box>
242
+ </Box>
243
+
244
+ </Box>
245
+ </QwickApp>
246
+ ),
247
+ parameters: {
248
+ docs: {
249
+ description: {
250
+ story: 'Comprehensive overview of the ModelView architecture pattern and its benefits.',
251
+ },
252
+ },
253
+ },
254
+ };
255
+
256
+ export const SerializationWorkflow: Story = {
257
+ render: () => {
258
+ // Create a complex component structure
259
+ const complexStructure = (
260
+ <Section background="#f5f5f5" padding="large" contentMaxWidth="lg">
261
+ <Typography variant="h4" gutterBottom>
262
+ Complex Component Structure
263
+ </Typography>
264
+ <Typography variant="body1" sx={{ mb: 3 }}>
265
+ This demonstrates how ModelView handles nested component serialization across different component types.
266
+ </Typography>
267
+
268
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3, mb: 4 }}>
269
+ <Box>
270
+ <Typography variant="h6" gutterBottom>Code Example</Typography>
271
+ <Code language="typescript" title="nested-example.ts">
272
+ {`// Nested components within Section
273
+ const structure = (
274
+ <Section>
275
+ <Code language="typescript">
276
+ console.log("Nested code");
277
+ </Code>
278
+ <Button action={{ type: 'navigate', url: '/example' }}>
279
+ Click Me
280
+ </Button>
281
+ </Section>
282
+ );`}
283
+ </Code>
284
+ </Box>
285
+ <Box>
286
+ <Typography variant="h6" gutterBottom>Interactive Button</Typography>
287
+ <Button
288
+ label="Navigate Example"
289
+ variant="primary"
290
+ action={{ type: 'navigate', url: '/workflow' }}
291
+ />
292
+ </Box>
293
+ </Box>
294
+ </Section>
295
+ );
296
+
297
+ // Serialize the entire structure
298
+ const serializedData = ComponentTransformer.serialize(complexStructure);
299
+ const deserializedComponent = ComponentTransformer.deserialize(serializedData);
300
+ const parsedData = JSON.parse(serializedData);
301
+
302
+ return (
303
+ <QwickApp appId="modelview-serialization-workflow" appName='ModelView Serialization Workflow'>
304
+ <Box>
305
+
306
+ <Box sx={{ mb: 6, textAlign: 'center' }}>
307
+ <Typography variant="h3" gutterBottom>Complete Serialization Workflow</Typography>
308
+ <Typography variant="h6" sx={{ mb: 4, opacity: 0.7 }}>
309
+ Demonstrating full component tree serialization and reconstruction
310
+ </Typography>
311
+ </Box>
312
+
313
+ {/* Original Structure */}
314
+ <Box sx={{ mb: 6 }}>
315
+ <Typography variant="h4" gutterBottom>Original Component Structure</Typography>
316
+ {complexStructure}
317
+ </Box>
318
+
319
+ {/* Serialized JSON Preview */}
320
+ <Box sx={{ mb: 6 }}>
321
+ <Typography variant="h4" gutterBottom>Serialized JSON Structure</Typography>
322
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
323
+ Complete component tree serialized to JSON with ModelView metadata preserved
324
+ </Typography>
325
+ <Paper sx={{ p: 2, backgroundColor: 'grey.100', maxHeight: 500, overflow: 'auto' }}>
326
+ <Code language="json" showLineNumbers={true} title="serialized-structure.json">
327
+ {JSON.stringify(parsedData, null, 2)}
328
+ </Code>
329
+ </Paper>
330
+ </Box>
331
+
332
+ {/* Deserialized Structure */}
333
+ <Box>
334
+ <Typography variant="h4" gutterBottom>Deserialized Component Structure</Typography>
335
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
336
+ Complete component tree reconstructed from JSON with full functionality preserved
337
+ </Typography>
338
+ {deserializedComponent as React.ReactElement}
339
+ </Box>
340
+
341
+ </Box>
342
+ </QwickApp>
343
+ );
344
+ },
345
+ parameters: {
346
+ docs: {
347
+ description: {
348
+ story: 'Complete serialization workflow showing complex component tree serialization and reconstruction.',
349
+ },
350
+ },
351
+ },
352
+ };
353
+
354
+ export const DataBindingIntegration: Story = {
355
+ render: () => (
356
+ <QwickApp appId="modelview-databinding" appName='ModelView Data Binding Integration' dataSource={{ dataProvider }}>
357
+ <Box>
358
+
359
+ <Box sx={{ mb: 6, textAlign: 'center' }}>
360
+ <Typography variant="h3" gutterBottom>Data Binding Integration</Typography>
361
+ <Typography variant="h6" sx={{ mb: 4, opacity: 0.7 }}>
362
+ ModelView provides standardized data binding support across all components
363
+ </Typography>
364
+
365
+ <Alert severity="info" sx={{ mb: 4, textAlign: 'left' }}>
366
+ ModelView includes built-in data binding support that automatically handles CMS integration,
367
+ loading states, error handling, and fallback props. All components extending ModelView
368
+ inherit this functionality without additional implementation.
369
+ </Alert>
370
+ </Box>
371
+
372
+ {/* Data Binding Examples */}
373
+ <Box sx={{ mb: 8 }}>
374
+ <Typography variant="h4" gutterBottom>Data Binding Examples</Typography>
375
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr', gap: 4 }}>
376
+
377
+ {/* Code Component */}
378
+ <Box>
379
+ <Typography variant="h5" gutterBottom>Code Component (Data-Bound)</Typography>
380
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', lg: '1fr 1fr' }, gap: 3 }}>
381
+ <Box>
382
+ <Typography variant="h6" gutterBottom>CMS Data Structure</Typography>
383
+ <Code language="json" showCopy={false}>
384
+ {JSON.stringify(sampleData.modelview['code-example'], null, 2)}
385
+ </Code>
386
+ </Box>
387
+ <Box>
388
+ <Typography variant="h6" gutterBottom>Rendered Component</Typography>
389
+ <Code dataSource="modelview.code-example" />
390
+ </Box>
391
+ </Box>
392
+ </Box>
393
+
394
+ {/* Section Component */}
395
+ <Box>
396
+ <Typography variant="h5" gutterBottom>Section Component (Data-Bound)</Typography>
397
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', lg: '1fr 1fr' }, gap: 3 }}>
398
+ <Box>
399
+ <Typography variant="h6" gutterBottom>CMS Data Structure</Typography>
400
+ <Code language="json" showCopy={false}>
401
+ {JSON.stringify(sampleData.modelview['section-example'], null, 2)}
402
+ </Code>
403
+ </Box>
404
+ <Box>
405
+ <Typography variant="h6" gutterBottom>Rendered Component</Typography>
406
+ <Section dataSource="modelview.section-example">
407
+ <Typography variant="h6">Data-Bound Section Content</Typography>
408
+ <Typography variant="body2">
409
+ This section loads its styling from CMS data while preserving nested content.
410
+ </Typography>
411
+ </Section>
412
+ </Box>
413
+ </Box>
414
+ </Box>
415
+
416
+ {/* Button Component */}
417
+ <Box>
418
+ <Typography variant="h5" gutterBottom>Button Component (Data-Bound)</Typography>
419
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', lg: '1fr 1fr' }, gap: 3 }}>
420
+ <Box>
421
+ <Typography variant="h6" gutterBottom>CMS Data Structure</Typography>
422
+ <Code language="json" showCopy={false}>
423
+ {JSON.stringify(sampleData.modelview['button-example'], null, 2)}
424
+ </Code>
425
+ </Box>
426
+ <Box>
427
+ <Typography variant="h6" gutterBottom>Rendered Component</Typography>
428
+ <Button dataSource="modelview.button-example" />
429
+ </Box>
430
+ </Box>
431
+ </Box>
432
+
433
+ </Box>
434
+ </Box>
435
+
436
+ {/* Data Binding Benefits */}
437
+ <Box sx={{ p: 4, backgroundColor: 'success.light', color: 'success.contrastText', borderRadius: 2 }}>
438
+ <Typography variant="h4" gutterBottom>Data Binding Benefits</Typography>
439
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3, mt: 3 }}>
440
+ <Box>
441
+ <Typography variant="h6" gutterBottom>Automatic Integration</Typography>
442
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
443
+ All ModelView components automatically support data binding without additional implementation.
444
+ </Typography>
445
+ </Box>
446
+ <Box>
447
+ <Typography variant="h6" gutterBottom>Error Handling</Typography>
448
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
449
+ Built-in loading states, error handling, and graceful fallbacks for missing data sources.
450
+ </Typography>
451
+ </Box>
452
+ <Box>
453
+ <Typography variant="h6" gutterBottom>Serialization Preserved</Typography>
454
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
455
+ Data binding configuration is preserved during serialization and deserialization.
456
+ </Typography>
457
+ </Box>
458
+ <Box>
459
+ <Typography variant="h6" gutterBottom>Consistent API</Typography>
460
+ <Typography variant="body2" sx={{ opacity: 0.9 }}>
461
+ Identical data binding patterns across all components for predictable behavior.
462
+ </Typography>
463
+ </Box>
464
+ </Box>
465
+ </Box>
466
+
467
+ </Box>
468
+ </QwickApp>
469
+ ),
470
+ parameters: {
471
+ docs: {
472
+ description: {
473
+ story: 'Demonstrates ModelView data binding integration across different component types.',
474
+ },
475
+ },
476
+ },
477
+ };