@qwickapps/react-framework 1.3.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 (441) hide show
  1. package/LICENSE +44 -0
  2. package/README.md +794 -0
  3. package/dist/components/AccessibilityChecker.d.ts +12 -0
  4. package/dist/components/AccessibilityChecker.d.ts.map +1 -0
  5. package/dist/components/Html.d.ts +48 -0
  6. package/dist/components/Html.d.ts.map +1 -0
  7. package/dist/components/Logo.d.ts +79 -0
  8. package/dist/components/Logo.d.ts.map +1 -0
  9. package/dist/components/Markdown.d.ts +47 -0
  10. package/dist/components/Markdown.d.ts.map +1 -0
  11. package/dist/components/QwickApp.d.ts +56 -0
  12. package/dist/components/QwickApp.d.ts.map +1 -0
  13. package/dist/components/QwickAppsLogo.d.ts +25 -0
  14. package/dist/components/QwickAppsLogo.d.ts.map +1 -0
  15. package/dist/components/ResponsiveMenu.d.ts +38 -0
  16. package/dist/components/ResponsiveMenu.d.ts.map +1 -0
  17. package/dist/components/SafeSpan.d.ts +23 -0
  18. package/dist/components/SafeSpan.d.ts.map +1 -0
  19. package/dist/components/Scaffold.d.ts +57 -0
  20. package/dist/components/Scaffold.d.ts.map +1 -0
  21. package/dist/components/blocks/Article.d.ts +23 -0
  22. package/dist/components/blocks/Article.d.ts.map +1 -0
  23. package/dist/components/blocks/CardListGrid.d.ts +23 -0
  24. package/dist/components/blocks/CardListGrid.d.ts.map +1 -0
  25. package/dist/components/blocks/Code.d.ts +21 -0
  26. package/dist/components/blocks/Code.d.ts.map +1 -0
  27. package/dist/components/blocks/Content.d.ts +24 -0
  28. package/dist/components/blocks/Content.d.ts.map +1 -0
  29. package/dist/components/blocks/CoverImageHeader.d.ts +44 -0
  30. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -0
  31. package/dist/components/blocks/FeatureCard.d.ts +66 -0
  32. package/dist/components/blocks/FeatureCard.d.ts.map +1 -0
  33. package/dist/components/blocks/FeatureGrid.d.ts +48 -0
  34. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -0
  35. package/dist/components/blocks/Footer.d.ts +56 -0
  36. package/dist/components/blocks/Footer.d.ts.map +1 -0
  37. package/dist/components/blocks/HeroBlock.d.ts +33 -0
  38. package/dist/components/blocks/HeroBlock.d.ts.map +1 -0
  39. package/dist/components/blocks/PageBannerHeader.d.ts +30 -0
  40. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -0
  41. package/dist/components/blocks/ProductCard.d.ts +57 -0
  42. package/dist/components/blocks/ProductCard.d.ts.map +1 -0
  43. package/dist/components/blocks/Section.d.ts +40 -0
  44. package/dist/components/blocks/Section.d.ts.map +1 -0
  45. package/dist/components/blocks/index.d.ts +37 -0
  46. package/dist/components/blocks/index.d.ts.map +1 -0
  47. package/dist/components/buttons/Button.d.ts +38 -0
  48. package/dist/components/buttons/Button.d.ts.map +1 -0
  49. package/dist/components/buttons/PaletteSwitcher.d.ts +24 -0
  50. package/dist/components/buttons/PaletteSwitcher.d.ts.map +1 -0
  51. package/dist/components/buttons/ThemeSwitcher.d.ts +24 -0
  52. package/dist/components/buttons/ThemeSwitcher.d.ts.map +1 -0
  53. package/dist/components/buttons/index.d.ts +11 -0
  54. package/dist/components/buttons/index.d.ts.map +1 -0
  55. package/dist/components/forms/FormBlock.d.ts +45 -0
  56. package/dist/components/forms/FormBlock.d.ts.map +1 -0
  57. package/dist/components/forms/index.d.ts +8 -0
  58. package/dist/components/forms/index.d.ts.map +1 -0
  59. package/dist/components/index.d.ts +32 -0
  60. package/dist/components/index.d.ts.map +1 -0
  61. package/dist/components/input/ChoiceInputField.d.ts +30 -0
  62. package/dist/components/input/ChoiceInputField.d.ts.map +1 -0
  63. package/dist/components/input/HtmlInputField.d.ts +29 -0
  64. package/dist/components/input/HtmlInputField.d.ts.map +1 -0
  65. package/dist/components/input/SelectInputField.d.ts +29 -0
  66. package/dist/components/input/SelectInputField.d.ts.map +1 -0
  67. package/dist/components/input/TextField.d.ts +18 -0
  68. package/dist/components/input/TextField.d.ts.map +1 -0
  69. package/dist/components/input/TextInputField.d.ts +32 -0
  70. package/dist/components/input/TextInputField.d.ts.map +1 -0
  71. package/dist/components/input/index.d.ts +17 -0
  72. package/dist/components/input/index.d.ts.map +1 -0
  73. package/dist/components/layout/GridCell.d.ts +16 -0
  74. package/dist/components/layout/GridCell.d.ts.map +1 -0
  75. package/dist/components/layout/GridCellWrapper.d.ts +46 -0
  76. package/dist/components/layout/GridCellWrapper.d.ts.map +1 -0
  77. package/dist/components/layout/GridLayout.d.ts +38 -0
  78. package/dist/components/layout/GridLayout.d.ts.map +1 -0
  79. package/dist/components/layout/index.d.ts +12 -0
  80. package/dist/components/layout/index.d.ts.map +1 -0
  81. package/dist/components/menu/Menu.d.ts +1 -0
  82. package/dist/components/menu/Menu.d.ts.map +1 -0
  83. package/dist/components/menu/MenuItem.d.ts +31 -0
  84. package/dist/components/menu/MenuItem.d.ts.map +1 -0
  85. package/dist/components/menu/index.d.ts +7 -0
  86. package/dist/components/menu/index.d.ts.map +1 -0
  87. package/dist/components/pages/FormPage.d.ts +66 -0
  88. package/dist/components/pages/FormPage.d.ts.map +1 -0
  89. package/dist/components/pages/Page.d.ts +124 -0
  90. package/dist/components/pages/Page.d.ts.map +1 -0
  91. package/dist/components/pages/index.d.ts +11 -0
  92. package/dist/components/pages/index.d.ts.map +1 -0
  93. package/dist/contexts/DataContext.d.ts +139 -0
  94. package/dist/contexts/DataContext.d.ts.map +1 -0
  95. package/dist/contexts/DimensionsContext.d.ts +42 -0
  96. package/dist/contexts/DimensionsContext.d.ts.map +1 -0
  97. package/dist/contexts/PaletteContext.d.ts +53 -0
  98. package/dist/contexts/PaletteContext.d.ts.map +1 -0
  99. package/dist/contexts/QwickAppContext.d.ts +71 -0
  100. package/dist/contexts/QwickAppContext.d.ts.map +1 -0
  101. package/dist/contexts/ThemeContext.d.ts +65 -0
  102. package/dist/contexts/ThemeContext.d.ts.map +1 -0
  103. package/dist/contexts/index.d.ts +9 -0
  104. package/dist/contexts/index.d.ts.map +1 -0
  105. package/dist/hooks/index.d.ts +10 -0
  106. package/dist/hooks/index.d.ts.map +1 -0
  107. package/dist/hooks/useBaseProps.d.ts +101 -0
  108. package/dist/hooks/useBaseProps.d.ts.map +1 -0
  109. package/dist/hooks/useDataBinding.d.ts +22 -0
  110. package/dist/hooks/useDataBinding.d.ts.map +1 -0
  111. package/dist/index.css +1 -0
  112. package/dist/index.d.ts +8 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.esm.css +1 -0
  115. package/dist/index.esm.js +24143 -0
  116. package/dist/index.js +24245 -0
  117. package/dist/palettes/PaletteAutumn.d.ts +10 -0
  118. package/dist/palettes/PaletteAutumn.d.ts.map +1 -0
  119. package/dist/palettes/PaletteCosmic.d.ts +10 -0
  120. package/dist/palettes/PaletteCosmic.d.ts.map +1 -0
  121. package/dist/palettes/PaletteDefault.d.ts +10 -0
  122. package/dist/palettes/PaletteDefault.d.ts.map +1 -0
  123. package/dist/palettes/PaletteOcean.d.ts +10 -0
  124. package/dist/palettes/PaletteOcean.d.ts.map +1 -0
  125. package/dist/palettes/PaletteSpring.d.ts +10 -0
  126. package/dist/palettes/PaletteSpring.d.ts.map +1 -0
  127. package/dist/palettes/PaletteWinter.d.ts +10 -0
  128. package/dist/palettes/PaletteWinter.d.ts.map +1 -0
  129. package/dist/palettes/index.d.ts +13 -0
  130. package/dist/palettes/index.d.ts.map +1 -0
  131. package/dist/schemas/ActionSchema.d.ts +21 -0
  132. package/dist/schemas/ActionSchema.d.ts.map +1 -0
  133. package/dist/schemas/ArticleSchema.d.ts +13 -0
  134. package/dist/schemas/ArticleSchema.d.ts.map +1 -0
  135. package/dist/schemas/Builders.d.ts +7 -0
  136. package/dist/schemas/Builders.d.ts.map +1 -0
  137. package/dist/schemas/ButtonSchema.d.ts +19 -0
  138. package/dist/schemas/ButtonSchema.d.ts.map +1 -0
  139. package/dist/schemas/CardListGridSchema.d.ts +17 -0
  140. package/dist/schemas/CardListGridSchema.d.ts.map +1 -0
  141. package/dist/schemas/ChoiceInputFieldSchema.d.ts +18 -0
  142. package/dist/schemas/ChoiceInputFieldSchema.d.ts.map +1 -0
  143. package/dist/schemas/CodeSchema.d.ts +18 -0
  144. package/dist/schemas/CodeSchema.d.ts.map +1 -0
  145. package/dist/schemas/ContentSchema.d.ts +20 -0
  146. package/dist/schemas/ContentSchema.d.ts.map +1 -0
  147. package/dist/schemas/CoverImageHeaderSchema.d.ts +28 -0
  148. package/dist/schemas/CoverImageHeaderSchema.d.ts.map +1 -0
  149. package/dist/schemas/FeatureCardSchema.d.ts +28 -0
  150. package/dist/schemas/FeatureCardSchema.d.ts.map +1 -0
  151. package/dist/schemas/FeatureGridSchema.d.ts +17 -0
  152. package/dist/schemas/FeatureGridSchema.d.ts.map +1 -0
  153. package/dist/schemas/FeatureItemSchema.d.ts +16 -0
  154. package/dist/schemas/FeatureItemSchema.d.ts.map +1 -0
  155. package/dist/schemas/FooterItemSchema.d.ts +15 -0
  156. package/dist/schemas/FooterItemSchema.d.ts.map +1 -0
  157. package/dist/schemas/FooterSchema.d.ts +20 -0
  158. package/dist/schemas/FooterSchema.d.ts.map +1 -0
  159. package/dist/schemas/FooterSectionSchema.d.ts +15 -0
  160. package/dist/schemas/FooterSectionSchema.d.ts.map +1 -0
  161. package/dist/schemas/FormBlockSchema.d.ts +19 -0
  162. package/dist/schemas/FormBlockSchema.d.ts.map +1 -0
  163. package/dist/schemas/HeaderActionSchema.d.ts +17 -0
  164. package/dist/schemas/HeaderActionSchema.d.ts.map +1 -0
  165. package/dist/schemas/HeroBlockSchema.d.ts +22 -0
  166. package/dist/schemas/HeroBlockSchema.d.ts.map +1 -0
  167. package/dist/schemas/HtmlInputFieldSchema.d.ts +18 -0
  168. package/dist/schemas/HtmlInputFieldSchema.d.ts.map +1 -0
  169. package/dist/schemas/MetadataItemSchema.d.ts +13 -0
  170. package/dist/schemas/MetadataItemSchema.d.ts.map +1 -0
  171. package/dist/schemas/PageBannerHeaderSchema.d.ts +28 -0
  172. package/dist/schemas/PageBannerHeaderSchema.d.ts.map +1 -0
  173. package/dist/schemas/PaletteSwitcherSchema.d.ts +16 -0
  174. package/dist/schemas/PaletteSwitcherSchema.d.ts.map +1 -0
  175. package/dist/schemas/ProductCardSchema.d.ts +39 -0
  176. package/dist/schemas/ProductCardSchema.d.ts.map +1 -0
  177. package/dist/schemas/SafeSpanSchema.d.ts +13 -0
  178. package/dist/schemas/SafeSpanSchema.d.ts.map +1 -0
  179. package/dist/schemas/SectionSchema.d.ts +17 -0
  180. package/dist/schemas/SectionSchema.d.ts.map +1 -0
  181. package/dist/schemas/SelectInputFieldSchema.d.ts +27 -0
  182. package/dist/schemas/SelectInputFieldSchema.d.ts.map +1 -0
  183. package/dist/schemas/TextInputFieldSchema.d.ts +22 -0
  184. package/dist/schemas/TextInputFieldSchema.d.ts.map +1 -0
  185. package/dist/schemas/ThemeSwitcherSchema.d.ts +19 -0
  186. package/dist/schemas/ThemeSwitcherSchema.d.ts.map +1 -0
  187. package/dist/schemas/index.d.ts +33 -0
  188. package/dist/schemas/index.d.ts.map +1 -0
  189. package/dist/schemas/types.d.ts +7 -0
  190. package/dist/schemas/types.d.ts.map +1 -0
  191. package/dist/templates/TemplateResolver.d.ts +52 -0
  192. package/dist/templates/TemplateResolver.d.ts.map +1 -0
  193. package/dist/templates/index.d.ts +7 -0
  194. package/dist/templates/index.d.ts.map +1 -0
  195. package/dist/tests/ConsoleWarningTest.d.ts +5 -0
  196. package/dist/tests/ConsoleWarningTest.d.ts.map +1 -0
  197. package/dist/tests/StorageKeyTest.d.ts +6 -0
  198. package/dist/tests/StorageKeyTest.d.ts.map +1 -0
  199. package/dist/tests/ThemeStorageKeyTest.d.ts +6 -0
  200. package/dist/tests/ThemeStorageKeyTest.d.ts.map +1 -0
  201. package/dist/types/CacheProvider.d.ts +18 -0
  202. package/dist/types/CacheProvider.d.ts.map +1 -0
  203. package/dist/types/ContentProxy.d.ts +47 -0
  204. package/dist/types/ContentProxy.d.ts.map +1 -0
  205. package/dist/types/DataBinding.d.ts +7 -0
  206. package/dist/types/DataBinding.d.ts.map +1 -0
  207. package/dist/types/DataProvider.d.ts +7 -0
  208. package/dist/types/DataProvider.d.ts.map +1 -0
  209. package/dist/types/DataTypes.d.ts +185 -0
  210. package/dist/types/DataTypes.d.ts.map +1 -0
  211. package/dist/types/TemplateProvider.d.ts +10 -0
  212. package/dist/types/TemplateProvider.d.ts.map +1 -0
  213. package/dist/types/TemplateResolver.d.ts +23 -0
  214. package/dist/types/TemplateResolver.d.ts.map +1 -0
  215. package/dist/types/index.d.ts +81 -0
  216. package/dist/types/index.d.ts.map +1 -0
  217. package/dist/utils/breakpoints.d.ts +35 -0
  218. package/dist/utils/breakpoints.d.ts.map +1 -0
  219. package/dist/utils/customPaletteManager.d.ts +8 -0
  220. package/dist/utils/customPaletteManager.d.ts.map +1 -0
  221. package/dist/utils/dimensions.d.ts +34 -0
  222. package/dist/utils/dimensions.d.ts.map +1 -0
  223. package/dist/utils/htmlTransform.d.ts +44 -0
  224. package/dist/utils/htmlTransform.d.ts.map +1 -0
  225. package/dist/utils/index.d.ts +15 -0
  226. package/dist/utils/index.d.ts.map +1 -0
  227. package/dist/utils/logger.d.ts +14 -0
  228. package/dist/utils/logger.d.ts.map +1 -0
  229. package/dist/utils/paletteUtils.d.ts +38 -0
  230. package/dist/utils/paletteUtils.d.ts.map +1 -0
  231. package/dist/utils/persistenceUtils.d.ts +31 -0
  232. package/dist/utils/persistenceUtils.d.ts.map +1 -0
  233. package/dist/utils/reactUtils.d.ts +24 -0
  234. package/dist/utils/reactUtils.d.ts.map +1 -0
  235. package/dist/utils/spacing.d.ts +34 -0
  236. package/dist/utils/spacing.d.ts.map +1 -0
  237. package/dist/utils/themePerformanceMonitor.d.ts +32 -0
  238. package/dist/utils/themePerformanceMonitor.d.ts.map +1 -0
  239. package/dist/utils/themeUtils.d.ts +27 -0
  240. package/dist/utils/themeUtils.d.ts.map +1 -0
  241. package/package.json +141 -0
  242. package/src/__tests__/components/Logo.test.js +172 -0
  243. package/src/__tests__/contexts/DataContext.test.js +505 -0
  244. package/src/__tests__/contexts/PaletteContext.test.js +115 -0
  245. package/src/__tests__/contexts/ThemeContext.test.js +123 -0
  246. package/src/__tests__/utils/paletteUtils.test.js +142 -0
  247. package/src/__tests__/utils/themeUtils.test.js +142 -0
  248. package/src/components/AccessibilityChecker.tsx +264 -0
  249. package/src/components/Html.tsx +191 -0
  250. package/src/components/Logo.css +217 -0
  251. package/src/components/Logo.tsx +370 -0
  252. package/src/components/Markdown.tsx +191 -0
  253. package/src/components/QwickApp.css +257 -0
  254. package/src/components/QwickApp.tsx +157 -0
  255. package/src/components/QwickAppsLogo.tsx +77 -0
  256. package/src/components/ResponsiveMenu.css +416 -0
  257. package/src/components/ResponsiveMenu.tsx +310 -0
  258. package/src/components/SafeSpan.tsx +128 -0
  259. package/src/components/Scaffold.css +541 -0
  260. package/src/components/Scaffold.tsx +463 -0
  261. package/src/components/__tests__/Article.test.tsx +419 -0
  262. package/src/components/__tests__/Button.test.tsx +702 -0
  263. package/src/components/__tests__/CardListGrid.test.tsx +478 -0
  264. package/src/components/__tests__/ChoiceInputField.test.tsx +864 -0
  265. package/src/components/__tests__/Code.test.tsx +595 -0
  266. package/src/components/__tests__/Content.integration.test.tsx +193 -0
  267. package/src/components/__tests__/Content.test.tsx +504 -0
  268. package/src/components/__tests__/CoverImageHeader.test.tsx +456 -0
  269. package/src/components/__tests__/FeatureCard.integration.test.tsx +384 -0
  270. package/src/components/__tests__/FeatureGrid.integration.test.tsx +364 -0
  271. package/src/components/__tests__/FeatureGrid.test.tsx +494 -0
  272. package/src/components/__tests__/Footer.test.tsx +544 -0
  273. package/src/components/__tests__/FormBlock.test.tsx +857 -0
  274. package/src/components/__tests__/HeroBlock.integration.test.tsx +272 -0
  275. package/src/components/__tests__/HeroBlock.test.tsx +463 -0
  276. package/src/components/__tests__/Html.test.tsx +174 -0
  277. package/src/components/__tests__/HtmlInputField.test.tsx +856 -0
  278. package/src/components/__tests__/Markdown.test.tsx +233 -0
  279. package/src/components/__tests__/PageBannerHeader.test.tsx +614 -0
  280. package/src/components/__tests__/PaletteSwitcher.test.tsx +864 -0
  281. package/src/components/__tests__/ProductCard.test.tsx +377 -0
  282. package/src/components/__tests__/SafeSpan.integration.test.tsx +123 -0
  283. package/src/components/__tests__/SafeSpan.simple.test.tsx +65 -0
  284. package/src/components/__tests__/SafeSpan.test.tsx +388 -0
  285. package/src/components/__tests__/Section.integration.test.tsx +288 -0
  286. package/src/components/__tests__/Section.test.tsx +494 -0
  287. package/src/components/__tests__/SelectInputField.test.tsx +886 -0
  288. package/src/components/__tests__/TextInputField.test.tsx +749 -0
  289. package/src/components/__tests__/ThemeSwitcher.test.tsx +777 -0
  290. package/src/components/blocks/Article.tsx +194 -0
  291. package/src/components/blocks/CardListGrid.tsx +132 -0
  292. package/src/components/blocks/Code.tsx +313 -0
  293. package/src/components/blocks/Content.tsx +265 -0
  294. package/src/components/blocks/CoverImageHeader.css +17 -0
  295. package/src/components/blocks/CoverImageHeader.tsx +435 -0
  296. package/src/components/blocks/FeatureCard.tsx +321 -0
  297. package/src/components/blocks/FeatureGrid.tsx +147 -0
  298. package/src/components/blocks/Footer.tsx +343 -0
  299. package/src/components/blocks/HeroBlock.tsx +280 -0
  300. package/src/components/blocks/PageBannerHeader.tsx +471 -0
  301. package/src/components/blocks/ProductCard.tsx +472 -0
  302. package/src/components/blocks/Section.tsx +209 -0
  303. package/src/components/blocks/index.ts +37 -0
  304. package/src/components/buttons/Button.tsx +233 -0
  305. package/src/components/buttons/PaletteSwitcher.tsx +268 -0
  306. package/src/components/buttons/ThemeSwitcher.tsx +283 -0
  307. package/src/components/buttons/index.ts +11 -0
  308. package/src/components/forms/FormBlock.tsx +291 -0
  309. package/src/components/forms/index.ts +7 -0
  310. package/src/components/index.ts +37 -0
  311. package/src/components/input/ChoiceInputField.tsx +188 -0
  312. package/src/components/input/HtmlInputField.tsx +326 -0
  313. package/src/components/input/SelectInputField.tsx +197 -0
  314. package/src/components/input/TextField.tsx +47 -0
  315. package/src/components/input/TextInputField.tsx +144 -0
  316. package/src/components/input/index.ts +17 -0
  317. package/src/components/layout/GridCell.tsx +46 -0
  318. package/src/components/layout/GridCellWrapper.tsx +87 -0
  319. package/src/components/layout/GridLayout.tsx +169 -0
  320. package/src/components/layout/index.ts +13 -0
  321. package/src/components/menu/Menu.tsx +0 -0
  322. package/src/components/menu/MenuItem.tsx +32 -0
  323. package/src/components/menu/index.ts +6 -0
  324. package/src/components/pages/FormPage.tsx +108 -0
  325. package/src/components/pages/Page.css +460 -0
  326. package/src/components/pages/Page.tsx +345 -0
  327. package/src/components/pages/index.ts +11 -0
  328. package/src/contexts/DataContext.tsx +355 -0
  329. package/src/contexts/DimensionsContext.tsx +154 -0
  330. package/src/contexts/PaletteContext.tsx +217 -0
  331. package/src/contexts/QwickAppContext.tsx +95 -0
  332. package/src/contexts/ThemeContext.tsx +376 -0
  333. package/src/contexts/index.ts +9 -0
  334. package/src/hooks/__tests__/useDataBinding.test.tsx.disabled +229 -0
  335. package/src/hooks/index.ts +11 -0
  336. package/src/hooks/useBaseProps.ts +267 -0
  337. package/src/hooks/useDataBinding.ts +77 -0
  338. package/src/index.ts +23 -0
  339. package/src/palettes/PaletteAutumn.css +172 -0
  340. package/src/palettes/PaletteAutumn.ts +16 -0
  341. package/src/palettes/PaletteCosmic.css +172 -0
  342. package/src/palettes/PaletteCosmic.ts +16 -0
  343. package/src/palettes/PaletteDefault.css +178 -0
  344. package/src/palettes/PaletteDefault.ts +17 -0
  345. package/src/palettes/PaletteOcean.css +172 -0
  346. package/src/palettes/PaletteOcean.ts +16 -0
  347. package/src/palettes/PaletteSpring.css +160 -0
  348. package/src/palettes/PaletteSpring.ts +16 -0
  349. package/src/palettes/PaletteWinter.css +172 -0
  350. package/src/palettes/PaletteWinter.ts +16 -0
  351. package/src/palettes/index.css +12 -0
  352. package/src/palettes/index.ts +29 -0
  353. package/src/schemas/ActionSchema.ts +140 -0
  354. package/src/schemas/ArticleSchema.ts +35 -0
  355. package/src/schemas/ButtonSchema.ts +99 -0
  356. package/src/schemas/CardListGridSchema.ts +102 -0
  357. package/src/schemas/ChoiceInputFieldSchema.ts +89 -0
  358. package/src/schemas/CodeSchema.ts +88 -0
  359. package/src/schemas/ContentSchema.ts +128 -0
  360. package/src/schemas/CoverImageHeaderSchema.ts +208 -0
  361. package/src/schemas/FeatureCardSchema.ts +161 -0
  362. package/src/schemas/FeatureGridSchema.ts +87 -0
  363. package/src/schemas/FeatureItemSchema.ts +68 -0
  364. package/src/schemas/FooterItemSchema.ts +57 -0
  365. package/src/schemas/FooterSchema.ts +116 -0
  366. package/src/schemas/FooterSectionSchema.ts +50 -0
  367. package/src/schemas/FormBlockSchema.ts +102 -0
  368. package/src/schemas/HeaderActionSchema.ts +83 -0
  369. package/src/schemas/HeroBlockSchema.ts +149 -0
  370. package/src/schemas/HtmlInputFieldSchema.ts +88 -0
  371. package/src/schemas/MetadataItemSchema.ts +35 -0
  372. package/src/schemas/PageBannerHeaderSchema.ts +206 -0
  373. package/src/schemas/PaletteSwitcherSchema.ts +66 -0
  374. package/src/schemas/ProductCardSchema.ts +264 -0
  375. package/src/schemas/SafeSpanSchema.ts +36 -0
  376. package/src/schemas/SectionSchema.ts +106 -0
  377. package/src/schemas/SelectInputFieldSchema.ts +137 -0
  378. package/src/schemas/TextInputFieldSchema.ts +129 -0
  379. package/src/schemas/ThemeSwitcherSchema.ts +97 -0
  380. package/src/schemas/__tests__/builders.test.ts +313 -0
  381. package/src/schemas/index.ts +34 -0
  382. package/src/setupTests.js +60 -0
  383. package/src/stories/Article.stories.tsx +549 -0
  384. package/src/stories/Button.stories.tsx +498 -0
  385. package/src/stories/CardListGrid.stories.tsx +539 -0
  386. package/src/stories/ChoiceInputField.stories.tsx +591 -0
  387. package/src/stories/Code.stories.tsx +711 -0
  388. package/src/stories/Content.stories.tsx +463 -0
  389. package/src/stories/CoverImageHeader.stories.tsx +794 -0
  390. package/src/stories/DataBinding.advanced.stories.tsx +548 -0
  391. package/src/stories/DataBinding.stories.tsx +452 -0
  392. package/src/stories/DataProvider.stories.tsx +1361 -0
  393. package/src/stories/FeatureCard.stories.tsx +642 -0
  394. package/src/stories/FeatureGrid.stories.tsx +669 -0
  395. package/src/stories/Footer.stories.tsx +724 -0
  396. package/src/stories/FormBlock.stories.tsx +834 -0
  397. package/src/stories/HeroBlock.stories.tsx +442 -0
  398. package/src/stories/Html.stories.tsx +264 -0
  399. package/src/stories/HtmlInputField.stories.tsx +558 -0
  400. package/src/stories/Introduction.stories.tsx +721 -0
  401. package/src/stories/LayoutBlocks.stories.tsx +382 -0
  402. package/src/stories/LayoutSystem.stories.tsx +253 -0
  403. package/src/stories/Logo.stories.tsx +400 -0
  404. package/src/stories/Markdown.stories.tsx +349 -0
  405. package/src/stories/Page.stories.tsx +762 -0
  406. package/src/stories/PageBannerHeader.stories.tsx +949 -0
  407. package/src/stories/PaletteSwitcher.stories.tsx +156 -0
  408. package/src/stories/ProductCard.stories.tsx +504 -0
  409. package/src/stories/QwickApp.stories.tsx +461 -0
  410. package/src/stories/ResponsiveMenu.stories.tsx +299 -0
  411. package/src/stories/SafeSpan.stories.tsx +612 -0
  412. package/src/stories/Section.stories.tsx +613 -0
  413. package/src/stories/SelectInputField.stories.tsx +605 -0
  414. package/src/stories/TextInputField.stories.tsx +526 -0
  415. package/src/stories/ThemeSwitcher.stories.tsx +170 -0
  416. package/src/stories/form/FormComponents.stories.tsx +588 -0
  417. package/src/templates/TemplateResolver.ts +156 -0
  418. package/src/templates/index.ts +6 -0
  419. package/src/tests/ConsoleWarningTest.tsx +30 -0
  420. package/src/tests/StorageKeyTest.tsx +110 -0
  421. package/src/tests/ThemeStorageKeyTest.tsx +114 -0
  422. package/src/types/CacheProvider.ts +14 -0
  423. package/src/types/ContentProxy.ts +99 -0
  424. package/src/types/DataTypes.ts +196 -0
  425. package/src/types/TemplateProvider.ts +9 -0
  426. package/src/types/TemplateResolver.ts +26 -0
  427. package/src/types/index.ts +99 -0
  428. package/src/utils/__tests__/createDataDrivenComponent.test.tsx.disabled +193 -0
  429. package/src/utils/__tests__/htmlTransform.test.tsx +255 -0
  430. package/src/utils/breakpoints.ts +87 -0
  431. package/src/utils/customPaletteManager.js +214 -0
  432. package/src/utils/dimensions.ts +147 -0
  433. package/src/utils/htmlTransform.tsx +323 -0
  434. package/src/utils/index.ts +16 -0
  435. package/src/utils/logger.ts +28 -0
  436. package/src/utils/paletteUtils.ts +78 -0
  437. package/src/utils/persistenceUtils.ts +107 -0
  438. package/src/utils/reactUtils.tsx +37 -0
  439. package/src/utils/spacing.ts +155 -0
  440. package/src/utils/themePerformanceMonitor.js +113 -0
  441. package/src/utils/themeUtils.ts +67 -0
@@ -0,0 +1,834 @@
1
+ /**
2
+ * FormBlock Component Stories - Form layout component with data binding support
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { Box, Link, Typography } from '@mui/material';
8
+ import { JsonDataProvider } from '@qwickapps/schema';
9
+ import type { Meta, StoryObj } from '@storybook/react';
10
+ import { Button, Code, FormBlock, QwickApp, QwickAppsLogo, SelectInputField, TextInputField } from '../components';
11
+
12
+
13
+ // Sample form block data for different use cases
14
+ const sampleCmsData = {
15
+ 'formBlocks': {
16
+ 'login-form': {
17
+ title: 'Welcome Back',
18
+ description: 'Sign in to your account to continue',
19
+ maxWidth: 'sm',
20
+ background: 'default',
21
+ form: null, // Will be provided via children in stories
22
+ footer: null // Will be provided via children in stories
23
+ },
24
+ 'registration-form': {
25
+ title: 'Create Your Account',
26
+ description: 'Join thousands of developers building with QwickApps React Framework',
27
+ maxWidth: 'md',
28
+ background: 'gradient',
29
+ form: null,
30
+ footer: null
31
+ },
32
+ 'contact-form': {
33
+ title: 'Get In Touch',
34
+ description: 'We\'d love to hear from you. Send us a message and we\'ll respond as soon as possible.',
35
+ maxWidth: 'md',
36
+ background: 'default',
37
+ form: null,
38
+ footer: null
39
+ },
40
+ 'survey-form': {
41
+ title: 'Customer Feedback Survey',
42
+ description: 'Help us improve by sharing your thoughts and experiences',
43
+ maxWidth: 'lg',
44
+ background: 'gradient',
45
+ form: null,
46
+ footer: null
47
+ },
48
+ 'subscription-form': {
49
+ title: 'Choose Your Plan',
50
+ description: 'Select the perfect plan for your needs and get started today',
51
+ maxWidth: 'md',
52
+ background: 'image',
53
+ backgroundImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80',
54
+ form: null,
55
+ footer: null
56
+ },
57
+ 'newsletter-form': {
58
+ title: 'Stay Updated',
59
+ description: 'Subscribe to our newsletter for the latest updates and insights',
60
+ maxWidth: 'sm',
61
+ background: 'default',
62
+ form: null,
63
+ footer: null
64
+ },
65
+ 'profile-form': {
66
+ title: 'Edit Profile',
67
+ description: 'Update your personal information and preferences',
68
+ maxWidth: 'md',
69
+ background: 'default',
70
+ form: null,
71
+ footer: null
72
+ },
73
+ 'feedback-form': {
74
+ title: 'Share Your Feedback',
75
+ description: 'Your input helps us build better products and experiences',
76
+ maxWidth: 'lg',
77
+ background: 'gradient',
78
+ form: null,
79
+ status: 'info',
80
+ message: 'Your feedback is important to us and will be reviewed by our team.'
81
+ },
82
+ 'error-form': {
83
+ title: 'Form Submission',
84
+ description: 'There was an issue processing your request',
85
+ maxWidth: 'sm',
86
+ background: 'default',
87
+ form: null,
88
+ status: 'error',
89
+ message: 'Please check your information and try again.'
90
+ },
91
+ 'success-form': {
92
+ title: 'Thank You!',
93
+ description: 'Your submission has been received successfully',
94
+ maxWidth: 'sm',
95
+ background: 'default',
96
+ form: null,
97
+ status: 'success',
98
+ message: 'We will get back to you within 24 hours.'
99
+ }
100
+ }
101
+ };
102
+
103
+ const dataProvider = new JsonDataProvider({ data: sampleCmsData });
104
+
105
+ const meta = {
106
+ title: 'Forms/FormBlock',
107
+ component: FormBlock,
108
+ parameters: {
109
+ layout: 'fullscreen',
110
+ docs: {
111
+ description: {
112
+ component: `FormBlock is a comprehensive form layout component that provides consistent styling and structure for form interfaces with data binding support.
113
+
114
+ **Key Features:**
115
+ - **Flexible Layouts**: Support for different container widths (xs, sm, md, lg)
116
+ - **Background Variants**: Default, gradient, and image background options
117
+ - **Header Integration**: Built-in header with logo, title, and description
118
+ - **Status Messages**: Alert-style status messages (info, success, warning, error)
119
+ - **Footer Support**: Customizable footer content for links and additional text
120
+ - **Data Binding**: Full CMS integration through dataSource prop
121
+ - **Theme Integration**: Responsive design with theme-aware styling
122
+ - **Accessibility**: Complete ARIA support and proper form structure
123
+
124
+ **Perfect For:**
125
+ - User authentication forms (login, registration, password reset)
126
+ - Contact and inquiry forms
127
+ - Survey and feedback collection
128
+ - Profile and settings management
129
+ - Subscription and payment forms
130
+ - Any form requiring professional layout and presentation`,
131
+ },
132
+ },
133
+ },
134
+ tags: ['autodocs'],
135
+ } satisfies Meta<typeof FormBlock>;
136
+
137
+ export default meta;
138
+ type Story = StoryObj<typeof FormBlock>;
139
+
140
+ // Traditional Usage Examples
141
+ export const LoginForm: Story = {
142
+ render: () => (
143
+ <QwickApp appId="form-login" appName='Login Form'>
144
+ <FormBlock
145
+ title="Welcome Back"
146
+ description="Sign in to your account to continue"
147
+ maxWidth="sm"
148
+ coverImage={<QwickAppsLogo size="medium" />}
149
+ form={
150
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
151
+ <TextInputField
152
+ label="Email Address"
153
+ type="email"
154
+ placeholder="your.email@example.com"
155
+ required={true}
156
+ onChange={(value) => console.log('Email:', value)}
157
+ />
158
+ <TextInputField
159
+ label="Password"
160
+ type="password"
161
+ placeholder="Enter your password"
162
+ required={true}
163
+ onChange={(value) => console.log('Password:', '***')}
164
+ />
165
+ <Button
166
+ label="Sign In"
167
+ variant="primary"
168
+ fullWidth={true}
169
+ onClick={() => console.log('Login submitted')}
170
+ />
171
+ </Box>
172
+ }
173
+ footer={
174
+ <Typography variant="body2" color="text.secondary">
175
+ Don't have an account? <Link href="#" color="primary">Sign up here</Link>
176
+ </Typography>
177
+ }
178
+ />
179
+ </QwickApp>
180
+ ),
181
+ parameters: {
182
+ docs: {
183
+ description: {
184
+ story: 'Basic login form with email and password fields in a clean layout.',
185
+ },
186
+ },
187
+ },
188
+ };
189
+
190
+ export const RegistrationForm: Story = {
191
+ render: () => (
192
+ <QwickApp appId="form-registration" appName='Registration Form'>
193
+ <FormBlock
194
+ title="Create Your Account"
195
+ description="Join thousands of developers building with QwickApps React Framework"
196
+ maxWidth="md"
197
+ background="gradient"
198
+ coverImage={<QwickAppsLogo size="medium" />}
199
+ form={
200
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
201
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
202
+ <TextInputField
203
+ label="First Name"
204
+ placeholder="John"
205
+ required={true}
206
+ onChange={(value) => console.log('First Name:', value)}
207
+ />
208
+ <TextInputField
209
+ label="Last Name"
210
+ placeholder="Doe"
211
+ required={true}
212
+ onChange={(value) => console.log('Last Name:', value)}
213
+ />
214
+ </Box>
215
+ <TextInputField
216
+ label="Email Address"
217
+ type="email"
218
+ placeholder="john.doe@example.com"
219
+ required={true}
220
+ helperText="We'll never share your email address"
221
+ onChange={(value) => console.log('Email:', value)}
222
+ />
223
+ <TextInputField
224
+ label="Password"
225
+ type="password"
226
+ placeholder="Create a strong password"
227
+ required={true}
228
+ helperText="Minimum 8 characters with mixed case and numbers"
229
+ onChange={(value) => console.log('Password:', '***')}
230
+ />
231
+ <SelectInputField
232
+ label="Country"
233
+ placeholder="Select your country"
234
+ required={true}
235
+ options={[
236
+ { label: 'United States', value: 'us' },
237
+ { label: 'Canada', value: 'ca' },
238
+ { label: 'United Kingdom', value: 'uk' },
239
+ { label: 'Germany', value: 'de' },
240
+ { label: 'Australia', value: 'au' }
241
+ ]}
242
+ onChange={(value) => console.log('Country:', value)}
243
+ />
244
+ <Button
245
+ label="Create Account"
246
+ variant="primary"
247
+ fullWidth={true}
248
+ buttonSize="large"
249
+ onClick={() => console.log('Registration submitted')}
250
+ />
251
+ </Box>
252
+ }
253
+ footer={
254
+ <Typography variant="body2" color="text.secondary">
255
+ Already have an account? <Link href="#" color="primary">Sign in here</Link>
256
+ </Typography>
257
+ }
258
+ />
259
+ </QwickApp>
260
+ ),
261
+ parameters: {
262
+ docs: {
263
+ description: {
264
+ story: 'Registration form with gradient background and comprehensive user information fields.',
265
+ },
266
+ },
267
+ },
268
+ };
269
+
270
+ export const ContactForm: Story = {
271
+ render: () => (
272
+ <QwickApp appId="form-contact" appName='Contact Form'>
273
+ <FormBlock
274
+ title="Get In Touch"
275
+ description="We'd love to hear from you. Send us a message and we'll respond as soon as possible."
276
+ maxWidth="md"
277
+ coverImage={<QwickAppsLogo size="medium" />}
278
+ form={
279
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
280
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
281
+ <TextInputField
282
+ label="Full Name"
283
+ placeholder="Your full name"
284
+ required={true}
285
+ onChange={(value) => console.log('Name:', value)}
286
+ />
287
+ <TextInputField
288
+ label="Email Address"
289
+ type="email"
290
+ placeholder="your.email@example.com"
291
+ required={true}
292
+ onChange={(value) => console.log('Email:', value)}
293
+ />
294
+ </Box>
295
+ <TextInputField
296
+ label="Subject"
297
+ placeholder="What is this regarding?"
298
+ required={true}
299
+ onChange={(value) => console.log('Subject:', value)}
300
+ />
301
+ <TextInputField
302
+ label="Message"
303
+ placeholder="Tell us more about your inquiry..."
304
+ multiline={true}
305
+ rows={5}
306
+ required={true}
307
+ onChange={(value) => console.log('Message:', value)}
308
+ />
309
+ <Button
310
+ label="Send Message"
311
+ variant="primary"
312
+ fullWidth={true}
313
+ onClick={() => console.log('Contact form submitted')}
314
+ />
315
+ </Box>
316
+ }
317
+ footer={
318
+ <Typography variant="body2" color="text.secondary" sx={{ textAlign: 'center' }}>
319
+ Need immediate assistance? Call us at <Link href="tel:+1-555-0123" color="primary">+1-555-0123</Link>
320
+ </Typography>
321
+ }
322
+ />
323
+ </QwickApp>
324
+ ),
325
+ parameters: {
326
+ docs: {
327
+ description: {
328
+ story: 'Contact form with comprehensive fields and professional layout.',
329
+ },
330
+ },
331
+ },
332
+ };
333
+
334
+ export const WithStatusMessages: Story = {
335
+ render: () => (
336
+ <QwickApp appId="form-status" appName='QwickApps'>
337
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
338
+
339
+ {/* Info Status */}
340
+ <FormBlock
341
+ title="Newsletter Signup"
342
+ description="Stay updated with our latest news"
343
+ maxWidth="sm"
344
+ status="info"
345
+ message="Your subscription helps us create better content for you."
346
+ coverImage={<QwickAppsLogo size="medium" />}
347
+ form={
348
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
349
+ <TextInputField
350
+ label="Email Address"
351
+ type="email"
352
+ placeholder="your.email@example.com"
353
+ required={true}
354
+ onChange={(value) => console.log('Email:', value)}
355
+ />
356
+ <Button
357
+ label="Subscribe"
358
+ variant="primary"
359
+ fullWidth={true}
360
+ onClick={() => console.log('Newsletter signup')}
361
+ />
362
+ </Box>
363
+ }
364
+ />
365
+
366
+ {/* Success Status */}
367
+ <FormBlock
368
+ title="Thank You!"
369
+ description="Your submission has been received"
370
+ maxWidth="sm"
371
+ status="success"
372
+ message="We will get back to you within 24 hours."
373
+ form={
374
+ <Button
375
+ label="Go Back to Homepage"
376
+ variant="outlined"
377
+ fullWidth={true}
378
+ onClick={() => console.log('Back to home')}
379
+ />
380
+ }
381
+ />
382
+
383
+ {/* Error Status */}
384
+ <FormBlock
385
+ title="Form Error"
386
+ description="There was an issue processing your request"
387
+ maxWidth="sm"
388
+ status="error"
389
+ message="Please check your information and try again."
390
+ coverImage={<QwickAppsLogo size="medium" />}
391
+ form={
392
+ <Box sx={{ display: 'flex', gap: 2 }}>
393
+ <Button
394
+ label="Try Again"
395
+ variant="primary"
396
+ fullWidth={true}
397
+ onClick={() => console.log('Retry')}
398
+ />
399
+ <Button
400
+ label="Contact Support"
401
+ variant="outlined"
402
+ fullWidth={true}
403
+ onClick={() => console.log('Contact support')}
404
+ />
405
+ </Box>
406
+ }
407
+ />
408
+
409
+ </Box>
410
+ </QwickApp>
411
+ ),
412
+ parameters: {
413
+ docs: {
414
+ description: {
415
+ story: 'Form blocks with different status message types: info, success, and error.',
416
+ },
417
+ },
418
+ },
419
+ };
420
+
421
+ export const BackgroundVariants: Story = {
422
+ render: () => (
423
+ <QwickApp appId="form-backgrounds" appName='Form Background Variants'>
424
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
425
+
426
+ {/* Default Background */}
427
+ <FormBlock
428
+ title="Default Background"
429
+ description="Clean and simple form layout"
430
+ maxWidth="sm"
431
+ coverImage={<QwickAppsLogo size="medium" />}
432
+ form={
433
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
434
+ <TextInputField
435
+ label="Name"
436
+ placeholder="Your name"
437
+ onChange={(value) => console.log('Name:', value)}
438
+ />
439
+ <Button label="Submit" variant="primary" fullWidth={true} />
440
+ </Box>
441
+ }
442
+ />
443
+
444
+ {/* Gradient Background */}
445
+ <FormBlock
446
+ title="Gradient Background"
447
+ description="Eye-catching gradient styling"
448
+ maxWidth="sm"
449
+ background="gradient"
450
+ form={
451
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
452
+ <TextInputField
453
+ label="Name"
454
+ placeholder="Your name"
455
+ onChange={(value) => console.log('Name:', value)}
456
+ />
457
+ <Button label="Submit" variant="primary" fullWidth={true} />
458
+ </Box>
459
+ }
460
+ />
461
+
462
+ </Box>
463
+ </QwickApp>
464
+ ),
465
+ parameters: {
466
+ docs: {
467
+ description: {
468
+ story: 'FormBlock with different background variants: default and gradient.',
469
+ },
470
+ },
471
+ },
472
+ };
473
+
474
+ // Data Binding Examples
475
+ export const DataBindingBasic: Story = {
476
+ render: () => (
477
+ <QwickApp appId="form-data-binding" appName='FormBlock Data Binding' dataSource={{ dataProvider }}>
478
+ <Box>
479
+
480
+ <Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
481
+ <Typography variant="h5" gutterBottom>📊 Data-Driven Form Layout</Typography>
482
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
483
+ FormBlock components can be driven by CMS data, loading layout configuration from your data source while providing custom form content.
484
+ </Typography>
485
+
486
+ <Code title="Usage" language="tsx">{`<FormBlock dataSource="formBlocks.login-form">
487
+ <TextInputField label="Email" type="email" />
488
+ <TextInputField label="Password" type="password" />
489
+ <Button label="Sign In" variant="primary" />
490
+ </FormBlock>`}</Code>
491
+
492
+ <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.formBlocks['login-form'], null, 2)}</Code>
493
+ </Box>
494
+
495
+ <FormBlock
496
+ dataSource="formBlocks.login-form"
497
+ coverImage={<QwickAppsLogo size="medium" />}
498
+ form={
499
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
500
+ <TextInputField
501
+ label="Email Address"
502
+ type="email"
503
+ placeholder="your.email@example.com"
504
+ required={true}
505
+ onChange={(value) => console.log('Email:', value)}
506
+ />
507
+ <TextInputField
508
+ label="Password"
509
+ type="password"
510
+ placeholder="Enter your password"
511
+ required={true}
512
+ onChange={(value) => console.log('Password:', '***')}
513
+ />
514
+ <Button
515
+ label="Sign In"
516
+ variant="primary"
517
+ fullWidth={true}
518
+ onClick={() => console.log('Login submitted')}
519
+ />
520
+ </Box>
521
+ }
522
+ footer={
523
+ <Typography variant="body2" color="text.secondary">
524
+ Don't have an account? <Link href="#" color="primary">Sign up here</Link>
525
+ </Typography>
526
+ }
527
+ />
528
+
529
+ </Box>
530
+ </QwickApp>
531
+ ),
532
+ parameters: {
533
+ docs: {
534
+ description: {
535
+ story: 'FormBlock with data binding - layout configuration resolved from CMS data while form content is provided as children.',
536
+ },
537
+ },
538
+ },
539
+ };
540
+
541
+ export const DataBindingAdvanced: Story = {
542
+ render: () => (
543
+ <QwickApp appId="form-data-advanced" appName='Advanced FormBlock Data Binding' dataSource={{ dataProvider }}>
544
+ <Box>
545
+
546
+ <Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
547
+ <Typography variant="h5" gutterBottom>🎯 Multiple Form Types</Typography>
548
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
549
+ Different FormBlock instances can load different layout configurations from separate data sources.
550
+ </Typography>
551
+ </Box>
552
+
553
+ {/* Authentication Forms */}
554
+ <Box sx={{ mb: 6 }}>
555
+ <Typography variant="h4" gutterBottom sx={{ mb: 4 }}>Authentication Forms</Typography>
556
+
557
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
558
+ <FormBlock
559
+ dataSource="formBlocks.login-form"
560
+ coverImage={<QwickAppsLogo size="medium" />}
561
+ form={
562
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
563
+ <TextInputField
564
+ label="Email"
565
+ type="email"
566
+ placeholder="your.email@example.com"
567
+ required={true}
568
+ />
569
+ <TextInputField
570
+ label="Password"
571
+ type="password"
572
+ placeholder="Enter password"
573
+ required={true}
574
+ />
575
+ <Button label="Sign In" variant="primary" fullWidth={true} />
576
+ </Box>
577
+ }
578
+ />
579
+
580
+ <FormBlock
581
+ dataSource="formBlocks.registration-form"
582
+ coverImage={<QwickAppsLogo size="medium" />}
583
+ form={
584
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
585
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
586
+ <TextInputField label="First Name" placeholder="John" required={true} />
587
+ <TextInputField label="Last Name" placeholder="Doe" required={true} />
588
+ </Box>
589
+ <TextInputField label="Email" type="email" placeholder="john@example.com" required={true} />
590
+ <TextInputField label="Password" type="password" placeholder="Create password" required={true} />
591
+ <Button label="Create Account" variant="primary" fullWidth={true} buttonSize="large" />
592
+ </Box>
593
+ }
594
+ />
595
+ </Box>
596
+ </Box>
597
+
598
+ {/* Communication Forms */}
599
+ <Box sx={{ mb: 6 }}>
600
+ <Typography variant="h4" gutterBottom sx={{ mb: 4 }}>Communication Forms</Typography>
601
+
602
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
603
+ <FormBlock
604
+ dataSource="formBlocks.contact-form"
605
+ coverImage={<QwickAppsLogo size="medium" />}
606
+ form={
607
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
608
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
609
+ <TextInputField label="Name" placeholder="Your name" required={true} />
610
+ <TextInputField label="Email" type="email" placeholder="your.email@example.com" required={true} />
611
+ </Box>
612
+ <TextInputField label="Subject" placeholder="What's this about?" required={true} />
613
+ <TextInputField label="Message" multiline={true} rows={4} placeholder="Your message..." required={true} />
614
+ <Button label="Send Message" variant="primary" fullWidth={true} />
615
+ </Box>
616
+ }
617
+ />
618
+
619
+ <FormBlock
620
+ dataSource="formBlocks.newsletter-form"
621
+ form={
622
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
623
+ <TextInputField label="Email" type="email" placeholder="your.email@example.com" required={true} />
624
+ <Button label="Subscribe" variant="primary" fullWidth={true} />
625
+ </Box>
626
+ }
627
+ />
628
+ </Box>
629
+ </Box>
630
+
631
+ </Box>
632
+ </QwickApp>
633
+ ),
634
+ parameters: {
635
+ docs: {
636
+ description: {
637
+ story: 'Advanced data binding with multiple form types showcasing different layouts and background configurations.',
638
+ },
639
+ },
640
+ },
641
+ };
642
+
643
+ export const DataBindingWithFallback: Story = {
644
+ render: () => (
645
+ <QwickApp appId="form-fallback" appName='FormBlock Data Binding with Fallback' dataSource={{ dataProvider }}>
646
+ <Box>
647
+
648
+ <Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
649
+ <Typography variant="h5" gutterBottom>🛡️ Fallback Support</Typography>
650
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
651
+ FormBlock components gracefully handle missing data sources with fallback configurations.
652
+ </Typography>
653
+
654
+ <Code title="Fallback Usage" language="tsx">{`<FormBlock
655
+ dataSource="nonexistent.form"
656
+ title="Fallback Form"
657
+ description="This uses fallback configuration"
658
+ maxWidth="sm"
659
+ >
660
+ <TextInputField label="Name" />
661
+ <Button label="Submit" />
662
+ </FormBlock>`}</Code>
663
+ </Box>
664
+
665
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 6 }}>
666
+ <Box>
667
+ <Typography variant="h6" gutterBottom>Missing Data Source (Fallback)</Typography>
668
+ <FormBlock
669
+ dataSource="nonexistent.form"
670
+ title="Fallback Form"
671
+ description="This uses fallback configuration"
672
+ maxWidth="sm"
673
+ coverImage={<QwickAppsLogo size="medium" />}
674
+ form={
675
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
676
+ <TextInputField label="Name" placeholder="Your name" />
677
+ <Button label="Submit" variant="primary" fullWidth={true} />
678
+ </Box>
679
+ }
680
+ />
681
+ </Box>
682
+ <Box>
683
+ <Typography variant="h6" gutterBottom>Valid Data Source</Typography>
684
+ <FormBlock
685
+ dataSource="formBlocks.login-form"
686
+ form={
687
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
688
+ <TextInputField label="Email" type="email" placeholder="your.email@example.com" />
689
+ <TextInputField label="Password" type="password" placeholder="Enter password" />
690
+ <Button label="Sign In" variant="primary" fullWidth={true} />
691
+ </Box>
692
+ }
693
+ />
694
+ </Box>
695
+ </Box>
696
+
697
+ </Box>
698
+ </QwickApp>
699
+ ),
700
+ parameters: {
701
+ docs: {
702
+ description: {
703
+ story: 'FormBlock with fallback configuration when dataSource is missing or unavailable.',
704
+ },
705
+ },
706
+ },
707
+ };
708
+
709
+ export const RealWorldExample: Story = {
710
+ render: () => (
711
+ <QwickApp appId="form-real-world" appName='Real World FormBlock Example' dataSource={{ dataProvider }}>
712
+ <Box>
713
+
714
+ {/* Status Messages Showcase */}
715
+ <Box sx={{ mb: 6 }}>
716
+ <Typography variant="h2" gutterBottom sx={{ textAlign: 'center', mb: 6 }}>Form Status Messages</Typography>
717
+
718
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
719
+ <FormBlock
720
+ dataSource="formBlocks.feedback-form"
721
+ coverImage={<QwickAppsLogo size="medium" />}
722
+ form={
723
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
724
+ <TextInputField label="Feedback" multiline={true} rows={4} placeholder="Share your thoughts..." />
725
+ <Button label="Submit Feedback" variant="primary" fullWidth={true} />
726
+ </Box>
727
+ }
728
+ />
729
+
730
+ <FormBlock
731
+ dataSource="formBlocks.success-form"
732
+ form={
733
+ <Button label="Continue" variant="primary" fullWidth={true} />
734
+ }
735
+ />
736
+
737
+ <FormBlock
738
+ dataSource="formBlocks.error-form"
739
+ form={
740
+ <Box sx={{ display: 'flex', gap: 2 }}>
741
+ <Button label="Try Again" variant="primary" fullWidth={true} />
742
+ <Button label="Get Help" variant="outlined" fullWidth={true} />
743
+ </Box>
744
+ }
745
+ />
746
+ </Box>
747
+ </Box>
748
+
749
+ {/* Business Forms */}
750
+ <Box sx={{ mb: 6 }}>
751
+ <Typography variant="h2" gutterBottom sx={{ textAlign: 'center', mb: 6 }}>Business Applications</Typography>
752
+
753
+ <FormBlock
754
+ dataSource="formBlocks.subscription-form"
755
+ coverImage={<QwickAppsLogo size="medium" />}
756
+ form={
757
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
758
+ <SelectInputField
759
+ label="Subscription Plan"
760
+ placeholder="Choose your plan"
761
+ required={true}
762
+ options={[
763
+ { label: 'Starter - $9/month', value: 'starter' },
764
+ { label: 'Professional - $29/month', value: 'professional' },
765
+ { label: 'Enterprise - $99/month', value: 'enterprise' }
766
+ ]}
767
+ />
768
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
769
+ <TextInputField label="Full Name" placeholder="John Doe" required={true} />
770
+ <TextInputField label="Email" type="email" placeholder="john@company.com" required={true} />
771
+ </Box>
772
+ <TextInputField label="Company Name" placeholder="Your Company Inc." />
773
+ <Button label="Start Subscription" variant="primary" fullWidth={true} buttonSize="large" />
774
+ </Box>
775
+ }
776
+ footer={
777
+ <Typography variant="body2" color="text.secondary" sx={{ textAlign: 'center' }}>
778
+ Cancel anytime. No hidden fees. <Link href="#" color="primary">View pricing details</Link>
779
+ </Typography>
780
+ }
781
+ />
782
+ </Box>
783
+
784
+ {/* User Profile Management */}
785
+ <Box>
786
+ <Typography variant="h2" gutterBottom sx={{ textAlign: 'center', mb: 6 }}>User Management</Typography>
787
+
788
+ <FormBlock
789
+ dataSource="formBlocks.profile-form"
790
+ coverImage={<QwickAppsLogo size="medium" />}
791
+ form={
792
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
793
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
794
+ <TextInputField label="First Name" placeholder="John" value="John" />
795
+ <TextInputField label="Last Name" placeholder="Doe" value="Doe" />
796
+ </Box>
797
+ <TextInputField label="Email Address" type="email" placeholder="john.doe@example.com" value="john.doe@example.com" />
798
+ <TextInputField label="Phone Number" type="tel" placeholder="+1 (555) 123-4567" />
799
+ <SelectInputField
800
+ label="Country"
801
+ value="us"
802
+ options={[
803
+ { label: 'United States', value: 'us' },
804
+ { label: 'Canada', value: 'ca' },
805
+ { label: 'United Kingdom', value: 'uk' }
806
+ ]}
807
+ />
808
+ <TextInputField
809
+ label="Bio"
810
+ multiline={true}
811
+ rows={3}
812
+ placeholder="Tell us about yourself..."
813
+ value="Senior developer with expertise in React and TypeScript."
814
+ />
815
+ <Box sx={{ display: 'flex', gap: 2 }}>
816
+ <Button label="Update Profile" variant="primary" fullWidth={true} />
817
+ <Button label="Cancel" variant="outlined" fullWidth={true} />
818
+ </Box>
819
+ </Box>
820
+ }
821
+ />
822
+ </Box>
823
+
824
+ </Box>
825
+ </QwickApp>
826
+ ),
827
+ parameters: {
828
+ docs: {
829
+ description: {
830
+ story: 'Real-world example showing FormBlock in various contexts: status messages, business subscriptions, and user management.',
831
+ },
832
+ },
833
+ },
834
+ };