@qwickapps/react-framework 1.3.5 → 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 (320) hide show
  1. package/README.md +1681 -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/CoverImageHeader.d.ts.map +1 -1
  28. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  29. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  30. package/dist/components/blocks/Footer.d.ts.map +1 -1
  31. package/dist/components/blocks/HeroBlock.d.ts +27 -13
  32. package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
  33. package/dist/components/blocks/Image.d.ts +41 -0
  34. package/dist/components/blocks/Image.d.ts.map +1 -0
  35. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  36. package/dist/components/blocks/Section.d.ts +16 -2
  37. package/dist/components/blocks/Section.d.ts.map +1 -1
  38. package/dist/components/blocks/Text.d.ts +41 -0
  39. package/dist/components/blocks/Text.d.ts.map +1 -0
  40. package/dist/components/blocks/index.d.ts +4 -0
  41. package/dist/components/blocks/index.d.ts.map +1 -1
  42. package/dist/components/buttons/Button.d.ts +23 -7
  43. package/dist/components/buttons/Button.d.ts.map +1 -1
  44. package/dist/components/forms/FormBlock.d.ts +19 -13
  45. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  46. package/dist/components/index.d.ts +4 -0
  47. package/dist/components/index.d.ts.map +1 -1
  48. package/dist/components/input/ChoiceInputField.d.ts +17 -11
  49. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  50. package/dist/components/input/HtmlInputField.d.ts +17 -11
  51. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  52. package/dist/components/input/SelectInputField.d.ts +16 -10
  53. package/dist/components/input/SelectInputField.d.ts.map +1 -1
  54. package/dist/components/input/SwitchInputField.d.ts +16 -10
  55. package/dist/components/input/SwitchInputField.d.ts.map +1 -1
  56. package/dist/components/input/TextField.d.ts.map +1 -1
  57. package/dist/components/input/TextInputField.d.ts +16 -11
  58. package/dist/components/input/TextInputField.d.ts.map +1 -1
  59. package/dist/components/layout/GridCell.d.ts +23 -6
  60. package/dist/components/layout/GridCell.d.ts.map +1 -1
  61. package/dist/components/layout/GridLayout.d.ts +24 -23
  62. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  63. package/dist/components/pages/FormPage.d.ts.map +1 -1
  64. package/dist/components/pages/Page.d.ts +49 -87
  65. package/dist/components/pages/Page.d.ts.map +1 -1
  66. package/dist/components/pages/index.d.ts +2 -2
  67. package/dist/components/pages/index.d.ts.map +1 -1
  68. package/dist/config/AppConfig.d.ts +49 -0
  69. package/dist/config/AppConfig.d.ts.map +1 -0
  70. package/dist/config/AppConfigBuilder.d.ts +75 -0
  71. package/dist/config/AppConfigBuilder.d.ts.map +1 -0
  72. package/dist/config/index.d.ts +13 -0
  73. package/dist/config/index.d.ts.map +1 -0
  74. package/dist/config/types.d.ts +130 -0
  75. package/dist/config/types.d.ts.map +1 -0
  76. package/dist/config.d.ts +15 -0
  77. package/dist/config.d.ts.map +1 -0
  78. package/dist/config.esm.js +451 -0
  79. package/dist/config.js +455 -0
  80. package/dist/contexts/PrintModeContext.d.ts +27 -0
  81. package/dist/contexts/PrintModeContext.d.ts.map +1 -0
  82. package/dist/contexts/QwickAppContext.d.ts +2 -2
  83. package/dist/contexts/QwickAppContext.d.ts.map +1 -1
  84. package/dist/contexts/index.d.ts +2 -0
  85. package/dist/contexts/index.d.ts.map +1 -1
  86. package/dist/hooks/index.d.ts +2 -0
  87. package/dist/hooks/index.d.ts.map +1 -1
  88. package/dist/hooks/usePrintMode.d.ts +39 -0
  89. package/dist/hooks/usePrintMode.d.ts.map +1 -0
  90. package/dist/index.css +1 -1
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.esm.css +1 -1
  94. package/dist/index.esm.js +10951 -6238
  95. package/dist/index.js +11014 -6287
  96. package/dist/schemas/CodeSchema.d.ts +2 -1
  97. package/dist/schemas/CodeSchema.d.ts.map +1 -1
  98. package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
  99. package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
  100. package/dist/schemas/ContentSchema.d.ts +2 -1
  101. package/dist/schemas/ContentSchema.d.ts.map +1 -1
  102. package/dist/schemas/GridCellSchema.d.ts +25 -0
  103. package/dist/schemas/GridCellSchema.d.ts.map +1 -0
  104. package/dist/schemas/GridLayoutSchema.d.ts +23 -0
  105. package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
  106. package/dist/schemas/HtmlSchema.d.ts +14 -0
  107. package/dist/schemas/HtmlSchema.d.ts.map +1 -0
  108. package/dist/schemas/ImageSchema.d.ts +32 -0
  109. package/dist/schemas/ImageSchema.d.ts.map +1 -0
  110. package/dist/schemas/LogoSchema.d.ts +35 -0
  111. package/dist/schemas/LogoSchema.d.ts.map +1 -0
  112. package/dist/schemas/MarkdownSchema.d.ts +14 -0
  113. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  114. package/dist/schemas/PageTemplateSchema.d.ts +31 -0
  115. package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
  116. package/dist/schemas/PrintConfigSchema.d.ts +31 -0
  117. package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
  118. package/dist/schemas/SectionSchema.d.ts +2 -1
  119. package/dist/schemas/SectionSchema.d.ts.map +1 -1
  120. package/dist/schemas/TextSchema.d.ts +37 -0
  121. package/dist/schemas/TextSchema.d.ts.map +1 -0
  122. package/dist/schemas/ViewModelSchema.d.ts +23 -0
  123. package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
  124. package/dist/schemas/index.d.ts +15 -1
  125. package/dist/schemas/index.d.ts.map +1 -1
  126. package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
  127. package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
  128. package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
  129. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
  130. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
  131. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
  132. package/dist/schemas/transformers/registry.d.ts +15 -0
  133. package/dist/schemas/transformers/registry.d.ts.map +1 -0
  134. package/dist/schemas/types/Serializable.d.ts +46 -0
  135. package/dist/schemas/types/Serializable.d.ts.map +1 -0
  136. package/dist/utils/htmlTransform.d.ts.map +1 -1
  137. package/dist/utils/reactUtils.d.ts +12 -3
  138. package/dist/utils/reactUtils.d.ts.map +1 -1
  139. package/package.json +17 -3
  140. package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
  141. package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
  142. package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
  143. package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
  144. package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
  145. package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
  146. package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
  147. package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
  148. package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
  149. package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
  150. package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
  151. package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
  152. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
  153. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
  154. package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
  155. package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
  156. package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
  157. package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
  158. package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
  159. package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
  160. package/src/__tests__/components/Logo.test.js +3 -3
  161. package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
  162. package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
  163. package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
  164. package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
  165. package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
  166. package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
  167. package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
  168. package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
  169. package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
  170. package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
  171. package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
  172. package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
  173. package/src/__tests__/components/base/ModelView.test.tsx +220 -0
  174. package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
  175. package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
  176. package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
  177. package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
  178. package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
  179. package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
  180. package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
  181. package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
  182. package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
  183. package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
  184. package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
  185. package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
  186. package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
  187. package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
  188. package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
  189. package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
  190. package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
  191. package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
  192. package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
  193. package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
  194. package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
  195. package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
  196. package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
  197. package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
  198. package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
  199. package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
  200. package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
  201. package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
  202. package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
  203. package/src/components/ErrorBoundary.tsx +8 -8
  204. package/src/components/Html.tsx +147 -44
  205. package/src/components/Logo.tsx +198 -100
  206. package/src/components/Markdown.tsx +125 -16
  207. package/src/components/QwickApp.tsx +64 -31
  208. package/src/components/QwickIcon.tsx +59 -0
  209. package/src/components/SafeSpan.tsx +65 -10
  210. package/src/components/Scaffold.tsx +2 -8
  211. package/src/components/base/ModelView.tsx +199 -0
  212. package/src/components/base/index.ts +11 -0
  213. package/src/components/blocks/Article.tsx +57 -18
  214. package/src/components/blocks/Code.md +529 -0
  215. package/src/components/blocks/Code.tsx +102 -15
  216. package/src/components/blocks/CoverImageHeader.tsx +9 -4
  217. package/src/components/blocks/FeatureCard.tsx +1 -2
  218. package/src/components/blocks/FeatureGrid.tsx +19 -1
  219. package/src/components/blocks/Footer.tsx +13 -1
  220. package/src/components/blocks/HeroBlock.tsx +87 -20
  221. package/src/components/blocks/Image.tsx +395 -0
  222. package/src/components/blocks/PageBannerHeader.tsx +14 -12
  223. package/src/components/blocks/ProductCard.tsx +1 -1
  224. package/src/components/blocks/Section.tsx +113 -8
  225. package/src/components/blocks/Text.tsx +285 -0
  226. package/src/components/blocks/index.ts +4 -0
  227. package/src/components/buttons/Button.tsx +184 -15
  228. package/src/components/forms/FormBlock.tsx +70 -17
  229. package/src/components/index.ts +5 -0
  230. package/src/components/input/ChoiceInputField.tsx +48 -18
  231. package/src/components/input/HtmlInputField.tsx +48 -18
  232. package/src/components/input/SelectInputField.tsx +48 -16
  233. package/src/components/input/SwitchInputField.tsx +48 -17
  234. package/src/components/input/TextField.tsx +41 -1
  235. package/src/components/input/TextInputField.tsx +52 -18
  236. package/src/components/layout/GridCell.tsx +118 -9
  237. package/src/components/layout/GridLayout.tsx +125 -24
  238. package/src/components/pages/FormPage.tsx +0 -1
  239. package/src/components/pages/Page.css +304 -332
  240. package/src/components/pages/Page.tsx +307 -255
  241. package/src/components/pages/index.ts +2 -2
  242. package/src/config/AppConfig.ts +133 -0
  243. package/src/config/AppConfigBuilder.ts +421 -0
  244. package/src/config/__tests__/AppConfig.test.ts +385 -0
  245. package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
  246. package/src/config/index.ts +24 -0
  247. package/src/config/types.ts +170 -0
  248. package/src/config.ts +25 -0
  249. package/src/contexts/PrintModeContext.tsx +332 -0
  250. package/src/contexts/QwickAppContext.tsx +2 -2
  251. package/src/contexts/index.ts +2 -0
  252. package/src/hooks/index.ts +5 -1
  253. package/src/hooks/usePrintMode.ts +73 -0
  254. package/src/index.ts +3 -0
  255. package/src/schemas/CodeSchema.ts +3 -3
  256. package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
  257. package/src/schemas/ContentSchema.ts +2 -1
  258. package/src/schemas/GridCellSchema.ts +164 -0
  259. package/src/schemas/GridLayoutSchema.ts +133 -0
  260. package/src/schemas/HtmlSchema.ts +47 -0
  261. package/src/schemas/ImageSchema.ts +235 -0
  262. package/src/schemas/LogoSchema.ts +241 -0
  263. package/src/schemas/MarkdownSchema.ts +47 -0
  264. package/src/schemas/PageTemplateSchema.ts +186 -0
  265. package/src/schemas/PrintConfigSchema.ts +207 -0
  266. package/src/schemas/README.md +661 -0
  267. package/src/schemas/SectionSchema.ts +2 -1
  268. package/src/schemas/TextSchema.ts +329 -0
  269. package/src/schemas/ViewModelSchema.ts +115 -0
  270. package/src/schemas/index.ts +21 -2
  271. package/src/schemas/transformers/ComponentTransformer.ts +403 -0
  272. package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
  273. package/src/schemas/transformers/registry.ts +72 -0
  274. package/src/schemas/types/Serializable.ts +51 -0
  275. package/src/stories/AccessibilityProvider.stories.tsx +253 -253
  276. package/src/stories/Article.stories.tsx +433 -433
  277. package/src/stories/Button.stories.tsx +1 -1
  278. package/src/stories/CardListGrid.stories.tsx +451 -451
  279. package/src/stories/ChoiceInputField.stories.tsx +503 -503
  280. package/src/stories/Code.stories.tsx +1 -1
  281. package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
  282. package/src/stories/Content.stories.tsx +393 -393
  283. package/src/stories/CoverImageHeader.stories.tsx +701 -701
  284. package/src/stories/DataBinding.advanced.stories.tsx +432 -432
  285. package/src/stories/DataProvider.stories.tsx +1192 -1192
  286. package/src/stories/FeatureCard.stories.tsx +557 -557
  287. package/src/stories/FeatureGrid.stories.tsx +594 -594
  288. package/src/stories/Footer.stories.tsx +640 -640
  289. package/src/stories/FormBlock.stories.tsx +760 -760
  290. package/src/stories/FormComponents.stories.tsx +349 -541
  291. package/src/stories/GridCell.stories.tsx +417 -0
  292. package/src/stories/GridLayout.stories.tsx +353 -0
  293. package/src/stories/HeroBlock.stories.tsx +862 -373
  294. package/src/stories/HtmlInputField.stories.tsx +474 -474
  295. package/src/stories/Image.stories.tsx +819 -0
  296. package/src/stories/Introduction.stories.tsx +667 -667
  297. package/src/stories/LayoutBlocks.stories.tsx +324 -324
  298. package/src/stories/Logo.stories.tsx +165 -6
  299. package/src/stories/Markdown.stories.tsx +137 -137
  300. package/src/stories/ModelView.stories.tsx +477 -0
  301. package/src/stories/Page.stories.tsx +688 -688
  302. package/src/stories/PageBannerHeader.stories.tsx +864 -864
  303. package/src/stories/PaletteSwitcher.stories.tsx +119 -119
  304. package/src/stories/ProductCard.stories.tsx +424 -424
  305. package/src/stories/QwickApp.stories.tsx +368 -368
  306. package/src/stories/ResponsiveMenu.stories.tsx +249 -249
  307. package/src/stories/SafeSpan.stories.tsx +531 -531
  308. package/src/stories/Section.stories.tsx +90 -2
  309. package/src/stories/SelectInputField.stories.tsx +524 -524
  310. package/src/stories/Text.stories.tsx +560 -0
  311. package/src/stories/TextInputField.stories.tsx +443 -443
  312. package/src/stories/ThemeSwitcher.stories.tsx +123 -123
  313. package/src/utils/htmlTransform.tsx +74 -53
  314. package/src/utils/reactUtils.tsx +57 -6
  315. package/dist/index.bundled.css +0 -12
  316. /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
  317. /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
  318. /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
  319. /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
  320. /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
+ };