@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,548 @@
1
+ /**
2
+ * Advanced Data Binding Examples - Storybook Stories
3
+ *
4
+ * Advanced examples showing complex data binding scenarios,
5
+ * error handling, performance optimization, and AI integration patterns.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import { Card, Typography } from '@mui/material';
11
+ import { CachedDataProvider, JsonDataProvider } from '@qwickapps/schema';
12
+ import type { Meta, StoryObj } from '@storybook/react';
13
+ import React, { useState } from 'react';
14
+ import { Button, Code, GridLayout, SafeSpan, Section } from '../components';
15
+ import { DataProvider } from '../contexts';
16
+ import { useDataBinding } from '../hooks';
17
+ import ThemeSwitcher from '../components/buttons/ThemeSwitcher';
18
+ import PaletteSwitcher from '../components/buttons/PaletteSwitcher';
19
+
20
+ // Advanced CMS data with complex scenarios - using dotted notation for testing JsonDataProvider conversion
21
+ const advancedCmsData = {
22
+ // Multi-language content
23
+ 'content.en.welcome': {
24
+ html: '<h2>Welcome to QwickApps</h2><p>The future of app development is here.</p>',
25
+ placeholder: 'Loading welcome message...'
26
+ },
27
+ 'content.es.welcome': {
28
+ html: '<h2>Bienvenidos a QwickApps</h2><p>El futuro del desarrollo de aplicaciones está aquí.</p>',
29
+ placeholder: 'Cargando mensaje de bienvenida...'
30
+ },
31
+
32
+ // Dynamic content with variables
33
+ 'user.greeting': {
34
+ html: '<p>Hello <strong>{{userName}}</strong>, welcome back!</p>',
35
+ placeholder: 'Loading personalized greeting...'
36
+ },
37
+
38
+ // Time-sensitive content
39
+ 'announcements.current': {
40
+ html: '<div class="announcement"><p><strong>🎉 New Feature Alert:</strong> Dynamic data binding with schema validation is now available!</p></div>',
41
+ placeholder: 'Loading current announcements...'
42
+ },
43
+
44
+ // A/B testing variants
45
+ 'cta.variant-a': {
46
+ html: '<p class="cta-primary"><strong>Start Building Today!</strong> - Try our free plan.</p>',
47
+ placeholder: 'Loading call-to-action...'
48
+ },
49
+ 'cta.variant-b': {
50
+ html: '<p class="cta-secondary"><strong>Join 10,000+ Developers</strong> - Get started now.</p>',
51
+ placeholder: 'Loading call-to-action...'
52
+ },
53
+
54
+ // Rich media content
55
+ 'blog.featured-post': {
56
+ html: `
57
+ <article>
58
+ <h3>Building Scalable Apps with QwickApps React Framework</h3>
59
+ <p class="meta">Published on January 15, 2025 • 8 min read</p>
60
+ <p>Learn how our <strong>data-binding system</strong> enables dynamic, scalable applications with type-safe CMS integration and validation...</p>
61
+ <a href="/blog/scalable-apps" class="read-more">Continue reading →</a>
62
+ </article>
63
+ `,
64
+ placeholder: 'Loading featured blog post...'
65
+ },
66
+
67
+ // Malicious content for sanitization testing
68
+ 'security.malicious': {
69
+ html: '<script>alert("XSS attempt")</script><p>This content includes <strong>malicious scripts</strong> that should be automatically sanitized.</p><img src="x" onerror="alert(\'XSS\')" />',
70
+ placeholder: 'Loading content...'
71
+ },
72
+
73
+ // Performance testing - Large content
74
+ 'performance.large-content': {
75
+ html: '<div>' + 'Very long content paragraph. '.repeat(100) + '</div>',
76
+ placeholder: 'Loading large content...'
77
+ }
78
+ };
79
+
80
+ // Create cached data provider for performance
81
+ const jsonProvider = new JsonDataProvider({ data: advancedCmsData });
82
+ const cachedDataProvider = new CachedDataProvider(jsonProvider, { maxSize: 100, defaultTTL: 60000 });
83
+
84
+ const meta: Meta<typeof SafeSpan> = {
85
+ title: 'Framework/Advanced Data Binding',
86
+ component: SafeSpan,
87
+ parameters: {
88
+ layout: 'padded',
89
+ docs: {
90
+ description: {
91
+ component: `
92
+ # Advanced Data Binding Examples
93
+
94
+ This section demonstrates advanced use cases for the data binding system including:
95
+
96
+ - Multi-language content management
97
+ - Dynamic content with template variables
98
+ - A/B testing support
99
+ - Security and sanitization
100
+ - Performance optimization with caching
101
+ - Error handling and fallbacks
102
+ - Custom validation and schema enforcement
103
+
104
+ ## Performance Features
105
+
106
+ The system includes built-in caching to minimize CMS API calls:
107
+ - Memory cache with configurable TTL
108
+ - Cache hit ratio monitoring
109
+ - Automatic cache invalidation
110
+ - Fallback support when cache fails
111
+
112
+ ## Security Features
113
+
114
+ All HTML content is automatically sanitized:
115
+ - Script tags are removed
116
+ - Dangerous attributes are filtered
117
+ - Only safe HTML elements are allowed
118
+ - XSS protection is built-in
119
+ `
120
+ }
121
+ }
122
+ },
123
+ decorators: [
124
+ (Story) => (
125
+ <DataProvider dataSource={{ dataProvider: cachedDataProvider }}>
126
+ <Story />
127
+ </DataProvider>
128
+ )
129
+ ]
130
+ };
131
+
132
+ export default meta;
133
+ type Story = StoryObj<typeof meta>;
134
+
135
+ // Multi-language Support
136
+ export const MultiLanguageContent: Story = {
137
+ render: () => {
138
+ const [language, setLanguage] = useState<'en' | 'es'>('en');
139
+
140
+ return (
141
+ <Section>
142
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1rem' }}>
143
+ <Typography variant='h4'>Multilanguage Support</Typography>
144
+ <div style={{ display: 'flex', gap: '8px' }}>
145
+ <ThemeSwitcher />
146
+ <PaletteSwitcher />
147
+ </div>
148
+ </div>
149
+ <Typography variant='body1' gutterBottom>
150
+ Switch between English and Spanish content dynamically using the data binding system.
151
+ </Typography>
152
+ <br/>
153
+ <Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem' }}>
154
+ <GridLayout>
155
+ <Button variant={language === 'en' ? 'contained' : 'outlined'} onClick={() => setLanguage('en')}>English</Button>
156
+ <Button variant={language === 'es' ? 'contained' : 'outlined'} onClick={() => setLanguage('es')}>Español</Button>
157
+ <SafeSpan span={12} dataSource={`content.${language}.welcome`} />
158
+ </GridLayout>
159
+ </Card>
160
+ <Code title='Source Code'>{`<GridLayout>
161
+ <Button variant={language === 'en' ? 'contained' : 'outlined'} onClick={() => setLanguage('en')}>English</Button>
162
+ <Button variant={language === 'es' ? 'contained' : 'outlined'} onClick={() => setLanguage('es')}>Español</Button>
163
+ <SafeSpan span={12} dataSource={\`content.\${language}.welcome\`} />
164
+ </GridLayout>`}
165
+ </Code>
166
+ <Code title='Multi-language Content'>{`'content.en.welcome': [
167
+ {
168
+ html: '<h2>Welcome to QwickApps</h2><p>The future of app development is here.</p>'
169
+ }
170
+ ],
171
+ 'content.es.welcome': [
172
+ {
173
+ html: '<h2>Bienvenidos a QwickApps</h2><p>El futuro del desarrollo de aplicaciones está aquí.</p>'
174
+ }
175
+ ]`}</Code>
176
+ </Section>
177
+ );
178
+ },
179
+ parameters: {
180
+ docs: {
181
+ description: {
182
+ story: 'Demonstrates multi-language content switching using dynamic dataSource paths.'
183
+ }
184
+ }
185
+ }
186
+ };
187
+
188
+ // A/B Testing
189
+ export const ABTestingVariants: Story = {
190
+ render: () => {
191
+ const [variant, setVariant] = useState<'a' | 'b'>('a');
192
+
193
+ return (
194
+ <Section>
195
+ <Typography variant="h4">A/B Testing Variants</Typography>
196
+ <Typography variant="body1" gutterBottom>
197
+ A/B testing implementation using dynamic dataSource selection for conversion optimization.
198
+ </Typography>
199
+
200
+ <GridLayout>
201
+ <Typography variant="h6">Select A/B Test Variant:</Typography>
202
+ <GridLayout columns={2} spacing="medium">
203
+ <Button variant={variant === 'a' ? 'contained' : 'outlined'} onClick={() => setVariant('a')}>
204
+ Variant A (Start Building)
205
+ </Button>
206
+ <Button variant={variant === 'b' ? 'contained' : 'outlined'} onClick={() => setVariant('b')}>
207
+ Variant B (Join Community)
208
+ </Button>
209
+ </GridLayout>
210
+
211
+ <Card variant="outlined" style={{ padding: '1.5rem', backgroundColor: '#e3f2fd' }}>
212
+ <SafeSpan dataSource={`cta.variant-${variant}`} />
213
+ </Card>
214
+ </GridLayout>
215
+
216
+ <Code title="A/B Testing Implementation">{`const [variant, setVariant] = useState<'a' | 'b'>('a');
217
+
218
+ return (
219
+ <SafeSpan dataSource={\`cta.variant-\${variant}\`} />
220
+ );`}</Code>
221
+
222
+ <Code title="A/B Test Data Structure">{`'cta.variant-a': [
223
+ {
224
+ html: '<p class="cta-primary"><strong>Start Building Today!</strong> - Try our free plan.</p>'
225
+ }
226
+ ],
227
+ 'cta.variant-b': [
228
+ {
229
+ html: '<p class="cta-secondary"><strong>Join 10,000+ Developers</strong> - Get started now.</p>'
230
+ }
231
+ ]`}</Code>
232
+ </Section>
233
+ );
234
+ },
235
+ parameters: {
236
+ docs: {
237
+ description: {
238
+ story: 'A/B testing implementation using dynamic dataSource selection for conversion optimization.'
239
+ }
240
+ }
241
+ }
242
+ };
243
+
244
+ // Rich Media Content
245
+ export const RichMediaContent: Story = {
246
+ render: () => (
247
+ <Section>
248
+ <Typography variant="h4">Rich Media Content</Typography>
249
+ <Typography variant="body1" gutterBottom>
250
+ Complex HTML content with multiple elements, perfect for blog posts and articles.
251
+ </Typography>
252
+
253
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
254
+ <SafeSpan dataSource="blog.featured-post" />
255
+ </Card>
256
+
257
+ <Code title="Usage">{`<SafeSpan dataSource="blog.featured-post" />`}</Code>
258
+
259
+ <Code title="Rich Media Data Structure">{`'blog.featured-post': [
260
+ {
261
+ html: \`
262
+ <article>
263
+ <h3>Building Scalable Apps with QwickApps React Framework</h3>
264
+ <p class="meta">Published on January 15, 2025 • 8 min read</p>
265
+ <p>Learn how our <strong>data-binding system</strong> enables dynamic applications...</p>
266
+ <a href="/blog/scalable-apps" class="read-more">Continue reading →</a>
267
+ </article>
268
+ \`,
269
+ placeholder: 'Loading featured blog post...'
270
+ }
271
+ ]`}</Code>
272
+ </Section>
273
+ ),
274
+ parameters: {
275
+ docs: {
276
+ description: {
277
+ story: 'Complex HTML content with multiple elements, perfect for blog posts and articles.'
278
+ }
279
+ }
280
+ }
281
+ };
282
+
283
+ // Security Testing
284
+ export const SecurityAndSanitization: Story = {
285
+ render: () => (
286
+ <Section>
287
+ <Typography variant="h4">Security and Sanitization</Typography>
288
+ <Typography variant="body1" gutterBottom>
289
+ Demonstrates automatic HTML sanitization to prevent XSS attacks and malicious content.
290
+ </Typography>
291
+
292
+ <Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#fff3cd' }}>
293
+ <Typography variant="body2">
294
+ <strong>🛡️ Security Test:</strong> The content below contains malicious scripts that are automatically sanitized.
295
+ </Typography>
296
+ </Card>
297
+
298
+ <Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
299
+ <SafeSpan dataSource="security.malicious" />
300
+ </Card>
301
+
302
+ <Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#d4edda' }}>
303
+ <Typography variant="h6" gutterBottom>What was filtered:</Typography>
304
+ <ul>
305
+ <li>&lt;script&gt; tags removed</li>
306
+ <li>onerror attributes removed</li>
307
+ <li>Only safe HTML elements preserved</li>
308
+ </ul>
309
+ </Card>
310
+
311
+ <Code title="Malicious Content (Auto-Sanitized)">{`<SafeSpan dataSource="security.malicious" />`}</Code>
312
+
313
+ <Code title="Malicious Data Source">{`'security.malicious': [
314
+ {
315
+ html: '<script>alert("XSS attempt")</script><p>Safe content with <strong>formatting</strong></p><img src="x" onerror="alert(\\'XSS\\')" />',
316
+ placeholder: 'Loading content...'
317
+ }
318
+ ]`}</Code>
319
+ </Section>
320
+ ),
321
+ parameters: {
322
+ docs: {
323
+ description: {
324
+ story: 'Demonstrates automatic HTML sanitization to prevent XSS attacks and malicious content.'
325
+ }
326
+ }
327
+ }
328
+ };
329
+
330
+ // Performance Testing
331
+ export const PerformanceOptimization: Story = {
332
+ render: () => (
333
+ <Section>
334
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1rem' }}>
335
+ <Typography variant="h4">Performance Optimization</Typography>
336
+ <div style={{ display: 'flex', gap: '8px' }}>
337
+ <ThemeSwitcher />
338
+ <PaletteSwitcher />
339
+ </div>
340
+ </div>
341
+ <Typography variant="body1" gutterBottom>
342
+ Performance optimization with caching for large content blocks.
343
+ </Typography>
344
+
345
+ <Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem' }}>
346
+ <Typography variant="body2" color="text.primary">
347
+ <strong>⚡ Performance Test:</strong> Large content with caching enabled for optimal performance.
348
+ </Typography>
349
+ </Card>
350
+
351
+ <Card variant="outlined" style={{ maxHeight: '200px', overflow: 'auto', padding: '1rem', marginBottom: '1rem' }}>
352
+ <SafeSpan dataSource="performance.large-content" />
353
+ </Card>
354
+
355
+ <Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem' }}>
356
+ <Typography variant="h6" gutterBottom>Performance Features:</Typography>
357
+ <ul>
358
+ <li>Memory caching with 5-minute TTL</li>
359
+ <li>Automatic content chunking for large data</li>
360
+ <li>Efficient re-rendering on data changes</li>
361
+ </ul>
362
+ </Card>
363
+
364
+ <Code title="Cached Performance">{`<DataProvider dataSource={{ dataProvider: cachedDataProvider }}>
365
+ <SafeSpan dataSource="performance.large-content" />
366
+ </DataProvider>`}</Code>
367
+
368
+ <Code title="Cache Configuration">{`const jsonProvider = new JsonDataProvider({ data: advancedCmsData });
369
+ const cacheProvider = new MemoryCacheProvider<any[]>({
370
+ maxSize: 100,
371
+ defaultTtl: 60000
372
+ });
373
+ const cachedDataProvider = new CachedDataProvider(jsonProvider, cacheProvider);`}</Code>
374
+ </Section>
375
+ ),
376
+ parameters: {
377
+ docs: {
378
+ description: {
379
+ story: 'Performance optimization with caching for large content blocks.'
380
+ }
381
+ }
382
+ }
383
+ };
384
+
385
+ // Custom Hook Usage
386
+ export const CustomHookExample: Story = {
387
+ render: () => {
388
+ const CustomComponent: React.FC<{ dataSource: string }> = ({ dataSource }) => {
389
+ const { loading, error } = useDataBinding(
390
+ dataSource,
391
+ {
392
+ html: '<p>Fallback HTML content</p>',
393
+ placeholder: 'Fallback placeholder'
394
+ },
395
+ undefined,
396
+ { strict: true, cache: true }
397
+ );
398
+
399
+ if (loading) {
400
+ return (
401
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
402
+ <Typography variant="body2">Loading content...</Typography>
403
+ </Card>
404
+ );
405
+ }
406
+
407
+ if (error) {
408
+ return (
409
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8d7da' }}>
410
+ <Typography variant="body2" color="error">
411
+ <strong>Error:</strong> {error.message}
412
+ </Typography>
413
+ </Card>
414
+ );
415
+ }
416
+
417
+ return (
418
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#d4edda' }}>
419
+ <SafeSpan dataSource={dataSource} />
420
+ <Typography variant="caption" color="textSecondary" style={{ marginTop: '0.5rem', display: 'block' }}>
421
+ Loaded via custom useDataBinding hook
422
+ </Typography>
423
+ </Card>
424
+ );
425
+ };
426
+
427
+ return (
428
+ <Section>
429
+ <Typography variant="h4">Custom Hook Implementation</Typography>
430
+ <Typography variant="body1" gutterBottom>
431
+ Custom implementation using the useDataBinding hook directly with advanced options like validation and caching.
432
+ </Typography>
433
+
434
+ <CustomComponent dataSource="announcements.current" />
435
+
436
+ <Code title="Custom Hook Usage">{`const CustomComponent: React.FC<{ dataSource: string }> = ({ dataSource }) => {
437
+ const { loading, error } = useDataBinding(
438
+ dataSource,
439
+ {
440
+ html: '<p>Fallback HTML content</p>',
441
+ placeholder: 'Fallback placeholder'
442
+ },
443
+ undefined,
444
+ { strict: true, cache: true }
445
+ );
446
+
447
+ if (loading) return <LoadingComponent />;
448
+ if (error) return <ErrorComponent error={error} />;
449
+
450
+ return <SafeSpan dataSource={dataSource} />;
451
+ };`}</Code>
452
+
453
+ <Code title="Hook Options">{`const options = {
454
+ strict: true, // Enable strict schema validation
455
+ cache: true, // Enable caching for performance
456
+ fallback: { // Custom fallback data
457
+ html: '<p>Custom fallback content</p>',
458
+ placeholder: 'Custom placeholder'
459
+ }
460
+ };`}</Code>
461
+ </Section>
462
+ );
463
+ },
464
+ parameters: {
465
+ docs: {
466
+ description: {
467
+ story: 'Custom implementation using the useDataBinding hook directly with advanced options like validation and caching.'
468
+ }
469
+ }
470
+ }
471
+ };
472
+
473
+ // Error Handling
474
+ export const ErrorHandlingScenarios: Story = {
475
+ render: () => (
476
+ <Section>
477
+ <Typography variant="h4">Error Handling Scenarios</Typography>
478
+ <Typography variant="body1" gutterBottom>
479
+ Various error handling scenarios showing how the system gracefully degrades when data is missing or invalid.
480
+ </Typography>
481
+
482
+ <GridLayout spacing="large">
483
+ <div>
484
+ <Typography variant="h6">Non-existent Data Source</Typography>
485
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#fff3cd' }}>
486
+ <SafeSpan
487
+ dataSource="does.not.exist"
488
+ placeholder="Fallback when data source doesn't exist"
489
+ />
490
+ </Card>
491
+ </div>
492
+
493
+ <div>
494
+ <Typography variant="h6">Empty Data Source</Typography>
495
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8d7da' }}>
496
+ <SafeSpan
497
+ dataSource="empty.data"
498
+ html="<p>Fallback HTML when data is empty</p>"
499
+ />
500
+ </Card>
501
+ </div>
502
+
503
+ <div>
504
+ <Typography variant="h6">Graceful Degradation</Typography>
505
+ <Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#d4edda' }}>
506
+ <SafeSpan
507
+ dataSource="malformed.data"
508
+ bindingOptions={{
509
+ fallback: {
510
+ html: '<p>Graceful fallback for <strong>malformed data</strong></p>',
511
+ placeholder: 'Fallback placeholder'
512
+ }
513
+ }}
514
+ />
515
+ </Card>
516
+ </div>
517
+ </GridLayout>
518
+
519
+ <Code title="Non-existent Data Source">{`<SafeSpan
520
+ dataSource="does.not.exist"
521
+ placeholder="Fallback when data source doesn't exist"
522
+ />`}</Code>
523
+
524
+ <Code title="Custom Fallback Options">{`<SafeSpan
525
+ dataSource="malformed.data"
526
+ bindingOptions={{
527
+ fallback: {
528
+ html: '<p>Graceful fallback for <strong>malformed data</strong></p>',
529
+ placeholder: 'Fallback placeholder'
530
+ }
531
+ }}
532
+ />`}</Code>
533
+
534
+ <Code title="Error Handling Strategy">{`// System handles errors gracefully:
535
+ // 1. Uses fallback props when data source fails
536
+ // 2. Shows placeholder text when content is empty
537
+ // 3. Applies custom fallback options when specified
538
+ // 4. Never breaks the UI - always renders something useful`}</Code>
539
+ </Section>
540
+ ),
541
+ parameters: {
542
+ docs: {
543
+ description: {
544
+ story: 'Various error handling scenarios showing how the system gracefully degrades when data is missing or invalid.'
545
+ }
546
+ }
547
+ }
548
+ };