@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,353 @@
1
+ /**
2
+ * GridLayout Stories - Flexible grid layout component with serialization support
3
+ */
4
+
5
+ import type { Meta, StoryObj } from '@storybook/react';
6
+ import { GridLayout } from '../components/layout/GridLayout';
7
+ import { GridCell } from '../components/layout/GridCell';
8
+ import { Text } from '../components/blocks/Text';
9
+ import { Button } from '../components/buttons/Button';
10
+ import { Code } from '../components/blocks/Code';
11
+ import { ComponentTransformer } from '../schemas/transformers/ComponentTransformer';
12
+ import React from 'react';
13
+
14
+ // Ensure components are registered for serialization
15
+ ComponentTransformer.registerComponent(GridLayout as any);
16
+ ComponentTransformer.registerComponent(GridCell as any);
17
+ ComponentTransformer.registerComponent(Text as any);
18
+ ComponentTransformer.registerComponent(Button as any);
19
+ ComponentTransformer.registerComponent(Code as any);
20
+
21
+ const meta: Meta<typeof GridLayout> = {
22
+ title: 'Layout/GridLayout',
23
+ component: GridLayout,
24
+ parameters: {
25
+ layout: 'fullscreen',
26
+ docs: {
27
+ description: {
28
+ component: `GridLayout is a flexible grid layout component that supports serialization through the ModelView pattern.
29
+
30
+ **Key Features:**
31
+ - **Responsive Grid**: Supports 1-6 columns with automatic responsive behavior
32
+ - **Flexible Spacing**: T-shirt sizing system (tiny, small, medium, large, huge)
33
+ - **Equal Heights**: Optional equal height columns
34
+ - **Nested Components**: Full support for nested GridCell and other serializable components
35
+ - **Serialization Support**: Complete serialize → deserialize → render workflow
36
+ - **Performance Optimized**: Efficient handling of large grids and complex nested structures
37
+
38
+ **Serialization Capabilities:**
39
+ - Preserves all layout properties (columns, spacing, dimensions, styling)
40
+ - Handles nested component serialization automatically
41
+ - Supports mixed content (serializable components + regular React nodes)
42
+ - Maintains grid behavior through serialization cycles`,
43
+ },
44
+ },
45
+ },
46
+ argTypes: {
47
+ columns: {
48
+ control: { type: 'select', options: [1, 2, 3, 4, 5, 6] },
49
+ description: 'Number of equal-width columns',
50
+ },
51
+ spacing: {
52
+ control: { type: 'select', options: ['tiny', 'small', 'medium', 'large', 'huge'] },
53
+ description: 'Spacing between grid items',
54
+ },
55
+ equalHeight: {
56
+ control: 'boolean',
57
+ description: 'Make all grid items the same height',
58
+ },
59
+ height: {
60
+ control: 'text',
61
+ description: 'Grid container height',
62
+ },
63
+ width: {
64
+ control: 'text',
65
+ description: 'Grid container width',
66
+ },
67
+ className: {
68
+ control: 'text',
69
+ description: 'Additional CSS class names',
70
+ },
71
+ },
72
+ };
73
+
74
+ export default meta;
75
+ type Story = StoryObj<typeof GridLayout>;
76
+
77
+ // Basic grid layout examples
78
+ export const TwoColumns: Story = {
79
+ args: {
80
+ columns: 2,
81
+ spacing: 'medium',
82
+ },
83
+ render: (args) => (
84
+ <GridLayout {...args}>
85
+ <div style={{ padding: '20px', backgroundColor: '#f0f8ff', borderRadius: '8px' }}>
86
+ Column 1 - Simple div content
87
+ </div>
88
+ <div style={{ padding: '20px', backgroundColor: '#fff0f5', borderRadius: '8px' }}>
89
+ Column 2 - More content here
90
+ </div>
91
+ </GridLayout>
92
+ ),
93
+ };
94
+
95
+ export const ThreeColumnsEqual: Story = {
96
+ args: {
97
+ columns: 3,
98
+ spacing: 'large',
99
+ equalHeight: true,
100
+ },
101
+ render: (args) => (
102
+ <GridLayout {...args}>
103
+ <div style={{ padding: '20px', backgroundColor: '#e6ffe6', borderRadius: '8px' }}>
104
+ <h3>Column 1</h3>
105
+ <p>Short content</p>
106
+ </div>
107
+ <div style={{ padding: '20px', backgroundColor: '#ffe6e6', borderRadius: '8px' }}>
108
+ <h3>Column 2</h3>
109
+ <p>This column has more content to demonstrate equal height functionality working properly across all columns.</p>
110
+ </div>
111
+ <div style={{ padding: '20px', backgroundColor: '#e6e6ff', borderRadius: '8px' }}>
112
+ <h3>Column 3</h3>
113
+ <p>Medium content here</p>
114
+ </div>
115
+ </GridLayout>
116
+ ),
117
+ };
118
+
119
+ // GridCell integration examples
120
+ export const WithGridCells: Story = {
121
+ args: {
122
+ spacing: 'large',
123
+ },
124
+ render: (args) => (
125
+ <GridLayout {...args}>
126
+ <GridCell xs={12} sm={8} background="#f8f9fa" padding="large">
127
+ <Text content="Main Content Area" variant="h3" />
128
+ <Text content="This is the primary content area that takes up 8 columns on small screens and full width on mobile." variant="body1" />
129
+ </GridCell>
130
+ <GridCell xs={12} sm={4} background="#e9ecef" padding="large">
131
+ <Text content="Sidebar" variant="h4" />
132
+ <Text content="This sidebar takes up 4 columns on small screens." variant="body2" />
133
+ <Button label="Call to Action" variant="primary" />
134
+ </GridCell>
135
+ </GridLayout>
136
+ ),
137
+ };
138
+
139
+ export const ComplexResponsive: Story = {
140
+ args: {
141
+ spacing: 'medium',
142
+ },
143
+ render: (args) => (
144
+ <GridLayout {...args}>
145
+ <GridCell xs={12} sm={6} md={4} lg={3} padding="medium">
146
+ <div style={{ padding: '16px', backgroundColor: '#fff3cd', borderRadius: '4px', textAlign: 'center' }}>
147
+ <strong>Responsive Card 1</strong>
148
+ <br />
149
+ <small>XS: 12, SM: 6, MD: 4, LG: 3</small>
150
+ </div>
151
+ </GridCell>
152
+ <GridCell xs={12} sm={6} md={4} lg={3} padding="medium">
153
+ <div style={{ padding: '16px', backgroundColor: '#d4edda', borderRadius: '4px', textAlign: 'center' }}>
154
+ <strong>Responsive Card 2</strong>
155
+ <br />
156
+ <small>XS: 12, SM: 6, MD: 4, LG: 3</small>
157
+ </div>
158
+ </GridCell>
159
+ <GridCell xs={12} sm={12} md={4} lg={6} padding="medium">
160
+ <div style={{ padding: '16px', backgroundColor: '#cce5ff', borderRadius: '4px', textAlign: 'center' }}>
161
+ <strong>Wider Card</strong>
162
+ <br />
163
+ <small>XS: 12, SM: 12, MD: 4, LG: 6</small>
164
+ </div>
165
+ </GridCell>
166
+ </GridLayout>
167
+ ),
168
+ };
169
+
170
+ // Serialization examples
171
+ export const SerializationDemo: Story = {
172
+ args: {
173
+ columns: 2,
174
+ spacing: 'large',
175
+ height: '400px',
176
+ },
177
+ render: (args) => {
178
+ const gridComponent = (
179
+ <GridLayout {...args}>
180
+ <GridCell span={8} background="background.paper" padding="large">
181
+ <Text content="Serializable Content" variant="h3" />
182
+ <Text content="This entire grid layout can be serialized to JSON and recreated exactly." variant="body1" />
183
+ <Button label="Interactive Button" variant="outlined" />
184
+ </GridCell>
185
+ <GridCell span={4} background="grey.100" padding="medium">
186
+ <Text content="Code Example" variant="h5" />
187
+ <Code language="typescript" showCopy={true}>
188
+ {`// Serialize the grid
189
+ const serialized = ComponentTransformer
190
+ .serialize(gridComponent);
191
+
192
+ // Deserialize back to React
193
+ const restored = ComponentTransformer
194
+ .deserialize(serialized);`}
195
+ </Code>
196
+ </GridCell>
197
+ </GridLayout>
198
+ );
199
+
200
+ return (
201
+ <div>
202
+ <div style={{ marginBottom: '24px' }}>
203
+ <h3>Original Component:</h3>
204
+ </div>
205
+ {gridComponent}
206
+ <div style={{ marginTop: '24px', marginBottom: '16px' }}>
207
+ <h3>Serialized JSON (first 200 characters):</h3>
208
+ <pre style={{
209
+ backgroundColor: '#f5f5f5',
210
+ padding: '12px',
211
+ borderRadius: '4px',
212
+ fontSize: '12px',
213
+ overflow: 'hidden',
214
+ maxHeight: '120px'
215
+ }}>
216
+ {ComponentTransformer.serialize(gridComponent).substring(0, 200)}...
217
+ </pre>
218
+ </div>
219
+ <div style={{ marginBottom: '16px' }}>
220
+ <h3>Deserialized Component:</h3>
221
+ </div>
222
+ {ComponentTransformer.deserialize(ComponentTransformer.serialize(gridComponent))}
223
+ </div>
224
+ );
225
+ },
226
+ };
227
+
228
+ export const LargeGridPerformance: Story = {
229
+ args: {
230
+ columns: 4,
231
+ spacing: 'small',
232
+ },
233
+ render: (args) => {
234
+ const items = Array.from({ length: 24 }, (_, i) => (
235
+ <GridCell key={i} padding="small">
236
+ <div style={{
237
+ padding: '12px',
238
+ backgroundColor: i % 2 === 0 ? '#f0f8ff' : '#fff5ee',
239
+ borderRadius: '4px',
240
+ textAlign: 'center',
241
+ minHeight: '80px',
242
+ display: 'flex',
243
+ alignItems: 'center',
244
+ justifyContent: 'center'
245
+ }}>
246
+ Item {i + 1}
247
+ </div>
248
+ </GridCell>
249
+ ));
250
+
251
+ const startTime = performance.now();
252
+ const gridComponent = <GridLayout {...args}>{items}</GridLayout>;
253
+ const serialized = ComponentTransformer.serialize(gridComponent);
254
+ const deserialized = ComponentTransformer.deserialize(serialized);
255
+ const endTime = performance.now();
256
+
257
+ return (
258
+ <div>
259
+ <div style={{ marginBottom: '16px', padding: '12px', backgroundColor: '#e7f3ff', borderRadius: '4px' }}>
260
+ <strong>Performance Test:</strong> 24-item grid serialized and deserialized in {(endTime - startTime).toFixed(2)}ms
261
+ <br />
262
+ <small>Serialized size: {serialized.length.toLocaleString()} characters</small>
263
+ </div>
264
+ {deserialized}
265
+ </div>
266
+ );
267
+ },
268
+ };
269
+
270
+ export const MixedContent: Story = {
271
+ args: {
272
+ spacing: 'medium',
273
+ },
274
+ render: (args) => (
275
+ <GridLayout {...args}>
276
+ <GridCell xs={12} md={6} background="info.light" padding="large">
277
+ <Text content="Serializable Components" variant="h4" />
278
+ <Text content="This cell contains components that implement ModelView and can be fully serialized." variant="body1" />
279
+ <div style={{ marginTop: '16px' }}>
280
+ <Button label="Serializable Button" variant="primary" />
281
+ </div>
282
+ </GridCell>
283
+ <div style={{ padding: '24px', backgroundColor: '#fff8dc' }}>
284
+ <h4>Regular React Content</h4>
285
+ <p>This is a regular div that will be serialized as a React node structure, preserving its content but not as a component.</p>
286
+ <ul>
287
+ <li>Bullet point 1</li>
288
+ <li>Bullet point 2</li>
289
+ </ul>
290
+ </div>
291
+ <GridCell xs={12} padding="large">
292
+ <Text content="Full Width Footer" variant="h5" />
293
+ <Code language="json" title="Serialization Result">
294
+ {`{
295
+ "tag": "GridLayout",
296
+ "version": "1.0.0",
297
+ "data": {
298
+ "spacing": "medium",
299
+ "children": "[...]"
300
+ }
301
+ }`}
302
+ </Code>
303
+ </GridCell>
304
+ </GridLayout>
305
+ ),
306
+ };
307
+
308
+ export const DimensionsAndStyling: Story = {
309
+ args: {
310
+ columns: 3,
311
+ spacing: 'huge',
312
+ height: '300px',
313
+ width: '100%',
314
+ maxWidth: '1200px',
315
+ className: 'custom-grid-demo',
316
+ },
317
+ render: (args) => (
318
+ <div style={{ margin: '0 auto' }}>
319
+ <GridLayout {...args}>
320
+ <div style={{
321
+ padding: '20px',
322
+ backgroundColor: '#ffe4e1',
323
+ borderRadius: '8px',
324
+ display: 'flex',
325
+ alignItems: 'center',
326
+ justifyContent: 'center'
327
+ }}>
328
+ <Text content="Styled Grid" variant="h6" />
329
+ </div>
330
+ <div style={{
331
+ padding: '20px',
332
+ backgroundColor: '#e1f5fe',
333
+ borderRadius: '8px',
334
+ display: 'flex',
335
+ alignItems: 'center',
336
+ justifyContent: 'center'
337
+ }}>
338
+ <Text content="Fixed Height" variant="h6" />
339
+ </div>
340
+ <div style={{
341
+ padding: '20px',
342
+ backgroundColor: '#e8f5e8',
343
+ borderRadius: '8px',
344
+ display: 'flex',
345
+ alignItems: 'center',
346
+ justifyContent: 'center'
347
+ }}>
348
+ <Text content="Max Width" variant="h6" />
349
+ </div>
350
+ </GridLayout>
351
+ </div>
352
+ ),
353
+ };