@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,669 @@
1
+ /**
2
+ * FeatureGrid Component Stories - Feature showcase grids with data binding support
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { Box, Typography } from '@mui/material';
8
+ import { JsonDataProvider } from '@qwickapps/schema';
9
+ import type { Meta, StoryObj } from '@storybook/react';
10
+ import QwickApp from '../components/QwickApp';
11
+ import { Code } from '../components/blocks';
12
+ import FeatureGrid from '../components/blocks/FeatureGrid';
13
+ import { DataProvider } from '../contexts/DataContext';
14
+
15
+ // Sample CMS data for data binding stories
16
+ const sampleCmsData = {
17
+ 'pages.home.features': {
18
+ features: [
19
+ {
20
+ id: 'fast',
21
+ title: 'โšก Lightning Fast',
22
+ description: 'Optimized performance for instant loading and smooth user experiences',
23
+ icon: 'โšก'
24
+ },
25
+ {
26
+ id: 'beautiful',
27
+ title: '๐ŸŽจ Beautiful UI',
28
+ description: 'Professional components and layouts that work perfectly out of the box',
29
+ icon: '๐ŸŽจ'
30
+ },
31
+ {
32
+ id: 'mobile',
33
+ title: '๐Ÿ“ฑ Mobile First',
34
+ description: 'Responsive design principles built into every component and layout',
35
+ icon: '๐Ÿ“ฑ'
36
+ }
37
+ ],
38
+ columns: 3,
39
+ gap: 'medium',
40
+ equalHeight: true
41
+ },
42
+ 'product.key-features': {
43
+ features: JSON.stringify([
44
+ {
45
+ id: 'integration',
46
+ title: 'Easy Integration',
47
+ description: 'Simple setup and configuration with minimal boilerplate code required',
48
+ icon: '๐Ÿ”Œ'
49
+ },
50
+ {
51
+ id: 'typescript',
52
+ title: 'Type Safe',
53
+ description: 'Full TypeScript support with comprehensive type definitions and IntelliSense',
54
+ icon: '๐Ÿ›ก๏ธ'
55
+ },
56
+ {
57
+ id: 'extensible',
58
+ title: 'Highly Extensible',
59
+ description: 'Modular architecture allows for easy customization and feature extension',
60
+ icon: '๐Ÿงฉ'
61
+ },
62
+ {
63
+ id: 'documented',
64
+ title: 'Well Documented',
65
+ description: 'Comprehensive documentation with live examples and best practice guides',
66
+ icon: '๐Ÿ“š'
67
+ }
68
+ ]),
69
+ columns: 2,
70
+ gap: 'large',
71
+ equalHeight: false
72
+ },
73
+ 'marketing.benefits-grid': {
74
+ features: [
75
+ {
76
+ id: 'save-time',
77
+ title: 'Save Development Time',
78
+ description: 'Pre-built components reduce development time by up to 70%',
79
+ icon: 'โฐ'
80
+ },
81
+ {
82
+ id: 'reduce-costs',
83
+ title: 'Reduce Costs',
84
+ description: 'Less development time means lower project costs and faster ROI',
85
+ icon: '๐Ÿ’ฐ'
86
+ },
87
+ {
88
+ id: 'scale-easily',
89
+ title: 'Scale with Confidence',
90
+ description: 'Built-in best practices ensure your application scales smoothly',
91
+ icon: '๐Ÿ“ˆ'
92
+ },
93
+ {
94
+ id: 'team-productivity',
95
+ title: 'Boost Team Productivity',
96
+ description: 'Consistent patterns and components improve team collaboration',
97
+ icon: '๐Ÿ‘ฅ'
98
+ },
99
+ {
100
+ id: 'user-experience',
101
+ title: 'Enhanced User Experience',
102
+ description: 'Professional design system ensures consistent and delightful UX',
103
+ icon: 'โœจ'
104
+ },
105
+ {
106
+ id: 'future-proof',
107
+ title: 'Future Proof Architecture',
108
+ description: 'Regular updates and modern architecture keep your app current',
109
+ icon: '๐Ÿš€'
110
+ }
111
+ ],
112
+ columns: 3,
113
+ gap: 'medium',
114
+ equalHeight: true
115
+ },
116
+ 'company.tech-stack': {
117
+ features: [
118
+ {
119
+ id: 'react',
120
+ title: 'React 18',
121
+ description: 'Built on the latest React with Concurrent Features',
122
+ icon: 'โš›๏ธ'
123
+ },
124
+ {
125
+ id: 'typescript',
126
+ title: 'TypeScript',
127
+ description: 'Type-safe development with excellent IDE support',
128
+ icon: '๐Ÿ“˜'
129
+ },
130
+ {
131
+ id: 'mui',
132
+ title: 'Material-UI',
133
+ description: 'Professional component library with customizable theming',
134
+ icon: '๐ŸŽจ'
135
+ },
136
+ {
137
+ id: 'storybook',
138
+ title: 'Storybook',
139
+ description: 'Interactive component documentation and testing',
140
+ icon: '๐Ÿ“–'
141
+ },
142
+ {
143
+ id: 'testing',
144
+ title: 'Testing Suite',
145
+ description: 'Comprehensive testing with Jest and React Testing Library',
146
+ icon: '๐Ÿงช'
147
+ }
148
+ ],
149
+ columns: 4,
150
+ gap: 'small',
151
+ equalHeight: true
152
+ }
153
+ };
154
+
155
+ const dataProvider = new JsonDataProvider({ data: sampleCmsData });
156
+
157
+ const meta = {
158
+ title: 'Blocks/FeatureGrid',
159
+ component: FeatureGrid,
160
+ parameters: {
161
+ layout: 'fullscreen',
162
+ docs: {
163
+ description: {
164
+ component: `FeatureGrid is a powerful responsive grid component for showcasing multiple features with support for both traditional props and data binding through dataSource.
165
+
166
+ **Key Features:**
167
+ - **Responsive Grid Layout**: Customizable column count with automatic responsive behavior
168
+ - **Feature Cards**: Rich feature display with icons, titles, descriptions, and actions
169
+ - **Flexible Spacing**: Three gap options for optimal visual hierarchy
170
+ - **Equal Height Control**: Option for consistent grid appearance or natural content flow
171
+ - **Data Binding**: Full CMS integration with JSON array support
172
+ - **Array Processing**: Smart parsing of JSON strings and nested feature objects
173
+
174
+ **Perfect For:**
175
+ - Product feature showcases and benefit highlights
176
+ - Service offerings and capability demonstrations
177
+ - Technology stack presentations
178
+ - Marketing benefit grids and value propositions
179
+ - Feature comparison and highlight sections`,
180
+ },
181
+ },
182
+ },
183
+ tags: ['autodocs'],
184
+ } satisfies Meta<typeof FeatureGrid>;
185
+
186
+ export default meta;
187
+ type Story = StoryObj<typeof meta>;
188
+
189
+ // Sample features for traditional examples
190
+ const sampleFeatures = [
191
+ {
192
+ id: 'traditional-1',
193
+ title: '๐Ÿš€ Fast Performance',
194
+ description: 'Optimized for speed and efficiency with minimal bundle size',
195
+ icon: '๐Ÿš€'
196
+ },
197
+ {
198
+ id: 'traditional-2',
199
+ title: '๐ŸŽฏ Developer Friendly',
200
+ description: 'Intuitive APIs and comprehensive TypeScript support',
201
+ icon: '๐ŸŽฏ'
202
+ },
203
+ {
204
+ id: 'traditional-3',
205
+ title: '๐Ÿ”ง Highly Customizable',
206
+ description: 'Flexible theming and component customization options',
207
+ icon: '๐Ÿ”ง'
208
+ }
209
+ ];
210
+
211
+ // Traditional Usage Examples
212
+ export const BasicFeatureGrid: Story = {
213
+ render: () => (
214
+ <QwickApp appId="featuregrid-basic" appName='Basic FeatureGrid'>
215
+ <FeatureGrid
216
+ features={sampleFeatures}
217
+ columns={3}
218
+ gap="medium"
219
+ equalHeight={true}
220
+ />
221
+ </QwickApp>
222
+ ),
223
+ parameters: {
224
+ docs: {
225
+ description: {
226
+ story: 'Basic FeatureGrid with traditional props - features array, columns, gap, and equal height.',
227
+ },
228
+ },
229
+ },
230
+ };
231
+
232
+ export const ColumnVariants: Story = {
233
+ render: () => (
234
+ <QwickApp appId="featuregrid-columns" appName='FeatureGrid Column Variants'>
235
+ <Box sx={{ '& > *:not(:last-child)': { mb: 4 } }}>
236
+
237
+ <Box>
238
+ <Typography variant="h6" gutterBottom>Single Column Layout</Typography>
239
+ <FeatureGrid
240
+ features={sampleFeatures.slice(0, 1)}
241
+ columns={1}
242
+ gap="medium"
243
+ equalHeight={true}
244
+ />
245
+ </Box>
246
+
247
+ <Box>
248
+ <Typography variant="h6" gutterBottom>Two Column Layout</Typography>
249
+ <FeatureGrid
250
+ features={sampleFeatures.slice(0, 2)}
251
+ columns={2}
252
+ gap="medium"
253
+ equalHeight={true}
254
+ />
255
+ </Box>
256
+
257
+ <Box>
258
+ <Typography variant="h6" gutterBottom>Three Column Layout (Default)</Typography>
259
+ <FeatureGrid
260
+ features={sampleFeatures}
261
+ columns={3}
262
+ gap="medium"
263
+ equalHeight={true}
264
+ />
265
+ </Box>
266
+
267
+ <Box>
268
+ <Typography variant="h6" gutterBottom>Four Column Layout</Typography>
269
+ <FeatureGrid
270
+ features={[...sampleFeatures, {
271
+ id: 'additional-feature',
272
+ title: '๐Ÿ“Š Analytics',
273
+ description: 'Built-in analytics and performance monitoring',
274
+ icon: '๐Ÿ“Š'
275
+ }]}
276
+ columns={4}
277
+ gap="medium"
278
+ equalHeight={true}
279
+ />
280
+ </Box>
281
+
282
+ </Box>
283
+ </QwickApp>
284
+ ),
285
+ parameters: {
286
+ docs: {
287
+ description: {
288
+ story: 'Different column configurations: 1, 2, 3 (default), and 4 columns.',
289
+ },
290
+ },
291
+ },
292
+ };
293
+
294
+ export const GapVariants: Story = {
295
+ render: () => (
296
+ <QwickApp appId="featuregrid-gaps" appName='FeatureGrid Gap Variants'>
297
+ <Box sx={{ '& > *:not(:last-child)': { mb: 4 } }}>
298
+
299
+ <Box>
300
+ <Typography variant="h6" gutterBottom>Small Gap</Typography>
301
+ <FeatureGrid
302
+ features={sampleFeatures}
303
+ columns={3}
304
+ gap="small"
305
+ equalHeight={true}
306
+ />
307
+ </Box>
308
+
309
+ <Box>
310
+ <Typography variant="h6" gutterBottom>Medium Gap (Default)</Typography>
311
+ <FeatureGrid
312
+ features={sampleFeatures}
313
+ columns={3}
314
+ gap="medium"
315
+ equalHeight={true}
316
+ />
317
+ </Box>
318
+
319
+ <Box>
320
+ <Typography variant="h6" gutterBottom>Large Gap</Typography>
321
+ <FeatureGrid
322
+ features={sampleFeatures}
323
+ columns={3}
324
+ gap="large"
325
+ equalHeight={true}
326
+ />
327
+ </Box>
328
+
329
+ </Box>
330
+ </QwickApp>
331
+ ),
332
+ parameters: {
333
+ docs: {
334
+ description: {
335
+ story: 'Gap spacing options: small (compact), medium (standard), large (spacious).',
336
+ },
337
+ },
338
+ },
339
+ };
340
+
341
+ export const EqualHeightComparison: Story = {
342
+ render: () => (
343
+ <QwickApp appId="featuregrid-height" appName='FeatureGrid Equal Height'>
344
+ <Box sx={{ '& > *:not(:last-child)': { mb: 4 } }}>
345
+
346
+ <Box>
347
+ <Typography variant="h6" gutterBottom>Equal Height: True (Default)</Typography>
348
+ <Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
349
+ All cards have the same height regardless of content length
350
+ </Typography>
351
+ <FeatureGrid
352
+ features={[
353
+ {
354
+ id: 'short',
355
+ title: 'Short Feature',
356
+ description: 'Brief description.',
357
+ icon: '๐Ÿ“'
358
+ },
359
+ {
360
+ id: 'medium',
361
+ title: 'Medium Length Feature',
362
+ description: 'This feature has a moderately long description that spans multiple lines.',
363
+ icon: '๐Ÿ“„'
364
+ },
365
+ {
366
+ id: 'long',
367
+ title: 'Very Long Feature Description',
368
+ description: 'This feature has an extensively long description that demonstrates how the equal height feature works by ensuring all cards maintain the same height regardless of content length, creating a consistent and professional grid appearance.',
369
+ icon: '๐Ÿ“œ'
370
+ }
371
+ ]}
372
+ columns={3}
373
+ gap="medium"
374
+ equalHeight={true}
375
+ />
376
+ </Box>
377
+
378
+ <Box>
379
+ <Typography variant="h6" gutterBottom>Equal Height: False</Typography>
380
+ <Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
381
+ Cards adjust to their natural content height
382
+ </Typography>
383
+ <FeatureGrid
384
+ features={[
385
+ {
386
+ id: 'short-2',
387
+ title: 'Short Feature',
388
+ description: 'Brief description.',
389
+ icon: '๐Ÿ“'
390
+ },
391
+ {
392
+ id: 'medium-2',
393
+ title: 'Medium Length Feature',
394
+ description: 'This feature has a moderately long description that spans multiple lines.',
395
+ icon: '๐Ÿ“„'
396
+ },
397
+ {
398
+ id: 'long-2',
399
+ title: 'Very Long Feature Description',
400
+ description: 'This feature has an extensively long description that demonstrates how the equal height feature works by ensuring all cards maintain the same height regardless of content length, creating a consistent and professional grid appearance.',
401
+ icon: '๐Ÿ“œ'
402
+ }
403
+ ]}
404
+ columns={3}
405
+ gap="medium"
406
+ equalHeight={false}
407
+ />
408
+ </Box>
409
+
410
+ </Box>
411
+ </QwickApp>
412
+ ),
413
+ parameters: {
414
+ docs: {
415
+ description: {
416
+ story: 'Comparison between equal height (consistent appearance) and natural height (content-driven).',
417
+ },
418
+ },
419
+ },
420
+ };
421
+
422
+ // Data Binding Examples
423
+ export const DataBindingBasic: Story = {
424
+ render: () => (
425
+ <QwickApp appId="featuregrid-data-binding" appName='FeatureGrid Data Binding' dataSource={{ dataProvider }}>
426
+ <Box>
427
+
428
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
429
+ <Typography variant="h5" gutterBottom>๐Ÿ“Š Data-Driven FeatureGrid</Typography>
430
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
431
+ FeatureGrid components can be driven entirely by CMS data using the dataSource prop.
432
+ </Typography>
433
+
434
+ <Code title="Usage" language="tsx">{`<FeatureGrid dataSource="pages.home.features" />`}</Code>
435
+
436
+ <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData['pages.home.features'], null, 2)}</Code>
437
+ </Box>
438
+
439
+ <FeatureGrid dataSource="pages.home.features" />
440
+
441
+ </Box>
442
+ </QwickApp>
443
+ ),
444
+ parameters: {
445
+ docs: {
446
+ description: {
447
+ story: 'FeatureGrid with data binding - all props resolved from CMS data through dataSource.',
448
+ },
449
+ },
450
+ },
451
+ };
452
+
453
+ export const DataBindingAdvanced: Story = {
454
+ render: () => (
455
+ <QwickApp appId="featuregrid-data-advanced" appName='Advanced FeatureGrid Data Binding' dataSource={{ dataProvider }}>
456
+ <Box>
457
+
458
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
459
+ <Typography variant="h5" gutterBottom>๐ŸŽฏ Multiple Data Sources</Typography>
460
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
461
+ Different FeatureGrid components can pull from different data sources with varying configurations.
462
+ </Typography>
463
+ </Box>
464
+
465
+ {/* Product Features */}
466
+ <Box sx={{ mb: 4 }}>
467
+ <Typography variant="h4" gutterBottom sx={{ p: 2, backgroundColor: 'primary.main', color: 'primary.contrastText', borderRadius: 1 }}>
468
+ Product Features
469
+ </Typography>
470
+ <FeatureGrid dataSource="product.key-features" />
471
+ </Box>
472
+
473
+ {/* Marketing Benefits */}
474
+ <Box sx={{ mb: 4 }}>
475
+ <Typography variant="h4" gutterBottom sx={{ p: 2, backgroundColor: 'secondary.main', color: 'secondary.contrastText', borderRadius: 1 }}>
476
+ Why Choose QwickApps?
477
+ </Typography>
478
+ <FeatureGrid dataSource="marketing.benefits-grid" />
479
+ </Box>
480
+
481
+ {/* Tech Stack */}
482
+ <Box>
483
+ <Typography variant="h4" gutterBottom sx={{ p: 2, backgroundColor: 'success.main', color: 'success.contrastText', borderRadius: 1 }}>
484
+ Technology Stack
485
+ </Typography>
486
+ <FeatureGrid dataSource="company.tech-stack" />
487
+ </Box>
488
+
489
+ </Box>
490
+ </QwickApp>
491
+ ),
492
+ parameters: {
493
+ docs: {
494
+ description: {
495
+ story: 'Advanced data binding with multiple data sources showcasing different feature grid configurations.',
496
+ },
497
+ },
498
+ },
499
+ };
500
+
501
+ export const DataBindingWithFallback: Story = {
502
+ render: () => (
503
+ <QwickApp appId="featuregrid-fallback" appName='FeatureGrid Data Binding with Fallback' dataSource={{ dataProvider }}>
504
+ <Box>
505
+
506
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
507
+ <Typography variant="h5" gutterBottom>๐Ÿ›ก๏ธ Fallback Support</Typography>
508
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
509
+ FeatureGrid components gracefully handle missing data sources with fallback props.
510
+ </Typography>
511
+
512
+ <Code title="Fallback Usage" language="tsx">{`<FeatureGrid
513
+ dataSource="nonexistent.features"
514
+ features={fallbackFeatures}
515
+ columns={2}
516
+ gap="large"
517
+ />`}</Code>
518
+ </Box>
519
+
520
+ <FeatureGrid
521
+ dataSource="nonexistent.features"
522
+ features={[
523
+ {
524
+ id: 'fallback-1',
525
+ title: '๐Ÿ›ก๏ธ Reliable Fallbacks',
526
+ description: 'Components gracefully handle missing data with fallback content',
527
+ icon: '๐Ÿ›ก๏ธ'
528
+ },
529
+ {
530
+ id: 'fallback-2',
531
+ title: '๐Ÿ”„ Error Recovery',
532
+ description: 'Robust error handling ensures your application never breaks',
533
+ icon: '๐Ÿ”„'
534
+ }
535
+ ]}
536
+ columns={2}
537
+ gap="large"
538
+ equalHeight={true}
539
+ />
540
+
541
+ </Box>
542
+ </QwickApp>
543
+ ),
544
+ parameters: {
545
+ docs: {
546
+ description: {
547
+ story: 'FeatureGrid with fallback props when dataSource is missing or unavailable.',
548
+ },
549
+ },
550
+ },
551
+ };
552
+
553
+ export const JsonStringParsing: Story = {
554
+ render: () => (
555
+ <QwickApp appId="featuregrid-json" appName='FeatureGrid JSON String Parsing' dataSource={{ dataProvider }}>
556
+ <Box>
557
+
558
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
559
+ <Typography variant="h5" gutterBottom>๐Ÿ”ง JSON String Processing</Typography>
560
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
561
+ FeatureGrid automatically parses JSON strings for features data, perfect for CMS integration.
562
+ </Typography>
563
+
564
+ <Code title="JSON String Data" language="json">{`{
565
+ "features": ${JSON.stringify([
566
+ { id: 'example', title: 'Example Feature', description: 'Parsed from JSON string' }
567
+ ], null, 2)}
568
+ }`}</Code>
569
+ </Box>
570
+
571
+ <FeatureGrid dataSource="product.key-features" />
572
+
573
+ </Box>
574
+ </QwickApp>
575
+ ),
576
+ parameters: {
577
+ docs: {
578
+ description: {
579
+ story: 'FeatureGrid with automatic JSON string parsing for CMS-friendly data formats.',
580
+ },
581
+ },
582
+ },
583
+ };
584
+
585
+ export const RealWorldExample: Story = {
586
+ render: () => (
587
+ <QwickApp appId="featuregrid-real-world" appName='Real World FeatureGrid Example' dataSource={{ dataProvider }}>
588
+ <Box>
589
+
590
+ {/* Main Features - Data Driven */}
591
+ <Box sx={{ mb: 6, p: 4, backgroundColor: 'primary.main', color: 'primary.contrastText', borderRadius: 2 }}>
592
+ <Typography variant="h2" gutterBottom sx={{ textAlign: 'center', fontWeight: 'bold', mb: 1 }}>
593
+ Why Developers Love QwickApps
594
+ </Typography>
595
+ <Typography variant="h6" sx={{ textAlign: 'center', opacity: 0.9, mb: 4, maxWidth: '600px', mx: 'auto' }}>
596
+ Discover the features that make QwickApps the preferred choice for modern React development
597
+ </Typography>
598
+ <FeatureGrid dataSource="pages.home.features" />
599
+ </Box>
600
+
601
+ {/* Benefits Grid - Data Driven */}
602
+ <Box sx={{ mb: 6 }}>
603
+ <Typography variant="h3" gutterBottom sx={{ textAlign: 'center', mb: 4 }}>
604
+ Business Benefits
605
+ </Typography>
606
+ <FeatureGrid dataSource="marketing.benefits-grid" />
607
+ </Box>
608
+
609
+ {/* Technical Features - Traditional Props */}
610
+ <Box sx={{ p: 4, backgroundColor: 'background.paper', borderRadius: 2 }}>
611
+ <Typography variant="h3" gutterBottom sx={{ textAlign: 'center', mb: 4 }}>
612
+ Technical Excellence
613
+ </Typography>
614
+ <FeatureGrid
615
+ features={[
616
+ {
617
+ id: 'performance',
618
+ title: '๐ŸŽ๏ธ Optimized Performance',
619
+ description: 'Tree shaking, code splitting, and optimized bundle sizes for lightning-fast applications',
620
+ icon: '๐ŸŽ๏ธ'
621
+ },
622
+ {
623
+ id: 'accessibility',
624
+ title: 'โ™ฟ Accessibility First',
625
+ description: 'WCAG 2.1 compliant components with screen reader support and keyboard navigation',
626
+ icon: 'โ™ฟ'
627
+ },
628
+ {
629
+ id: 'testing',
630
+ title: '๐Ÿงช Testing Ready',
631
+ description: 'Pre-configured testing setup with comprehensive test utilities and examples',
632
+ icon: '๐Ÿงช'
633
+ },
634
+ {
635
+ id: 'documentation',
636
+ title: '๐Ÿ“– Living Documentation',
637
+ description: 'Interactive Storybook documentation with live examples and API references',
638
+ icon: '๐Ÿ“–'
639
+ },
640
+ {
641
+ id: 'theming',
642
+ title: '๐ŸŽจ Advanced Theming',
643
+ description: 'Powerful theming system with design tokens and consistent visual language',
644
+ icon: '๐ŸŽจ'
645
+ },
646
+ {
647
+ id: 'community',
648
+ title: '๐Ÿ‘ฅ Active Community',
649
+ description: 'Growing community of developers with active support and regular contributions',
650
+ icon: '๐Ÿ‘ฅ'
651
+ }
652
+ ]}
653
+ columns={3}
654
+ gap="large"
655
+ equalHeight={true}
656
+ />
657
+ </Box>
658
+
659
+ </Box>
660
+ </QwickApp>
661
+ ),
662
+ parameters: {
663
+ docs: {
664
+ description: {
665
+ story: 'Real-world example combining data-driven FeatureGrids with traditional usage for comprehensive feature showcases.',
666
+ },
667
+ },
668
+ },
669
+ };