@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,193 @@
1
+ /**
2
+ * Integration tests for Content with data binding functionality
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import React from 'react';
8
+ import { render, waitFor, screen } from '@testing-library/react';
9
+ import Content from '../blocks/Content';
10
+ import { DataProvider } from '../../contexts/DataContext';
11
+ import { JsonDataProvider } from '@qwickapps/schema';
12
+
13
+ describe.skip('Content Integration (Traditional + Data Binding)', () => {
14
+ const testData = {
15
+ 'pages.home.intro': [
16
+ {
17
+ title: 'Welcome to QwickApps',
18
+ subtitle: 'Build apps faster with our comprehensive React framework',
19
+ actions: [
20
+ { label: 'Get Started', variant: 'primary' },
21
+ { label: 'View Docs', variant: 'outlined' }
22
+ ],
23
+ variant: 'elevated',
24
+ centered: true
25
+ }
26
+ ],
27
+ 'features.main-section': [
28
+ {
29
+ title: 'Key Features',
30
+ subtitle: 'Everything you need to build modern applications',
31
+ blockSpacing: 'spacious',
32
+ contentMaxWidth: 'lg'
33
+ }
34
+ ],
35
+ 'empty.content': [{}]
36
+ };
37
+
38
+ const dataProvider = new JsonDataProvider({ data: testData });
39
+
40
+ it('should work as traditional Content without dataSource', () => {
41
+ const { container } = render(
42
+ <Content
43
+ title="Traditional Content"
44
+ subtitle="Without data binding"
45
+ variant="outlined"
46
+ centered={false}
47
+ />
48
+ );
49
+
50
+ expect(container.innerHTML).toContain('Traditional Content');
51
+ expect(container.innerHTML).toContain('Without data binding');
52
+ });
53
+
54
+ it('should work with dataSource prop (data binding)', async () => {
55
+ const { container } = render(
56
+ <DataProvider dataSource={{ dataProvider }}>
57
+ <Content dataSource="pages.home.intro" />
58
+ </DataProvider>
59
+ );
60
+
61
+ await waitFor(() => {
62
+ expect(container.innerHTML).toContain('Welcome to QwickApps');
63
+ expect(container.innerHTML).toContain('Build apps faster');
64
+ expect(container.innerHTML).toContain('Get Started');
65
+ expect(container.innerHTML).toContain('View Docs');
66
+ });
67
+ });
68
+
69
+ it('should use fallback props when dataSource has no content', async () => {
70
+ const { container } = render(
71
+ <DataProvider dataSource={{ dataProvider }}>
72
+ <Content
73
+ dataSource="empty.content"
74
+ title="Fallback Title"
75
+ subtitle="Fallback subtitle"
76
+ variant="filled"
77
+ />
78
+ </DataProvider>
79
+ );
80
+
81
+ await waitFor(() => {
82
+ expect(container.innerHTML).toContain('Fallback Title');
83
+ expect(container.innerHTML).toContain('Fallback subtitle');
84
+ });
85
+ });
86
+
87
+ it('should include data attributes when using dataSource', async () => {
88
+ const { container } = render(
89
+ <DataProvider dataSource={{ dataProvider }}>
90
+ <Content dataSource="pages.home.intro" />
91
+ </DataProvider>
92
+ );
93
+
94
+ await waitFor(() => {
95
+ const contentElement = container.querySelector('[data-component="Content"]');
96
+ expect(contentElement).toHaveAttribute('data-component', 'Content');
97
+ expect(contentElement).toHaveAttribute('data-data-source', 'pages.home.intro');
98
+ });
99
+ });
100
+
101
+ it('should work with base props like grid attributes', () => {
102
+ const { container } = render(
103
+ <Content
104
+ title="Grid Test Content"
105
+ span={6}
106
+ xs={12}
107
+ md={8}
108
+ />
109
+ );
110
+
111
+ const contentWrapper = container.querySelector('[data-grid-span]');
112
+ expect(contentWrapper).toHaveAttribute('data-grid-span', '6');
113
+ expect(contentWrapper).toHaveAttribute('data-grid-xs', '12');
114
+ expect(contentWrapper).toHaveAttribute('data-grid-md', '8');
115
+ });
116
+
117
+ it('should handle custom binding options', async () => {
118
+ const { container } = render(
119
+ <DataProvider dataSource={{ dataProvider }}>
120
+ <Content
121
+ dataSource="nonexistent.data"
122
+ bindingOptions={{
123
+ fallback: {
124
+ title: 'Custom fallback title',
125
+ subtitle: 'Custom fallback subtitle',
126
+ variant: 'outlined'
127
+ }
128
+ }}
129
+ />
130
+ </DataProvider>
131
+ );
132
+
133
+ await waitFor(() => {
134
+ expect(container.innerHTML).toContain('Custom fallback title');
135
+ expect(container.innerHTML).toContain('Custom fallback subtitle');
136
+ });
137
+ });
138
+
139
+ it('should render actions from data binding', async () => {
140
+ const { container } = render(
141
+ <DataProvider dataSource={{ dataProvider }}>
142
+ <Content dataSource="pages.home.intro" />
143
+ </DataProvider>
144
+ );
145
+
146
+ await waitFor(() => {
147
+ // Check that action buttons are rendered
148
+ const buttons = container.querySelectorAll('button');
149
+ expect(buttons).toHaveLength(2);
150
+ expect(buttons[0]).toHaveTextContent('Get Started');
151
+ expect(buttons[1]).toHaveTextContent('View Docs');
152
+ });
153
+ });
154
+
155
+ it('should handle loading state', () => {
156
+ const { container } = render(
157
+ <DataProvider dataSource={{ dataProvider }}>
158
+ <Content dataSource="slow.loading.data" />
159
+ </DataProvider>
160
+ );
161
+
162
+ // Should show loading content initially
163
+ expect(container.innerHTML).toContain('Loading...');
164
+ });
165
+
166
+ it('should work with different variants', async () => {
167
+ const { container } = render(
168
+ <DataProvider dataSource={{ dataProvider }}>
169
+ <Content dataSource="features.main-section" />
170
+ </DataProvider>
171
+ );
172
+
173
+ await waitFor(() => {
174
+ expect(container.innerHTML).toContain('Key Features');
175
+ expect(container.innerHTML).toContain('Everything you need');
176
+ });
177
+ });
178
+
179
+ it('should preserve children content with data binding', async () => {
180
+ const { container } = render(
181
+ <DataProvider dataSource={{ dataProvider }}>
182
+ <Content dataSource="pages.home.intro">
183
+ <p>Custom child content</p>
184
+ </Content>
185
+ </DataProvider>
186
+ );
187
+
188
+ await waitFor(() => {
189
+ expect(container.innerHTML).toContain('Welcome to QwickApps');
190
+ expect(container.innerHTML).toContain('Custom child content');
191
+ });
192
+ });
193
+ });
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Unit tests for Content component
3
+ *
4
+ * Tests both traditional props usage and data binding functionality
5
+ * with the new schema system.
6
+ */
7
+
8
+ import React from 'react';
9
+ import { render, screen } from '@testing-library/react';
10
+ import '@testing-library/jest-dom';
11
+ import Content from '../blocks/Content';
12
+ import { DataProvider } from '../../contexts/DataContext';
13
+ import { JsonDataProvider } from '@qwickapps/schema';
14
+ import { ThemeProvider, PaletteProvider } from '../../contexts';
15
+
16
+ // Test data for data binding
17
+ const sampleCmsData = {
18
+ 'content.hero': [{
19
+ title: 'Welcome to QwickApps',
20
+ subtitle: 'Build modern React applications with ease',
21
+ variant: 'elevated',
22
+ blockSpacing: 'spacious',
23
+ contentMaxWidth: 'lg',
24
+ centered: true,
25
+ actions: [
26
+ { text: 'Get Started', variant: 'contained', color: 'primary' },
27
+ { text: 'Learn More', variant: 'outlined', color: 'secondary' }
28
+ ]
29
+ }],
30
+ 'content.features': [{
31
+ title: 'Key Features',
32
+ subtitle: 'Everything you need for modern development',
33
+ variant: 'outlined',
34
+ blockSpacing: 'comfortable',
35
+ contentMaxWidth: 'xl',
36
+ centered: false
37
+ }],
38
+ 'content.minimal': [{
39
+ title: 'Simple Content',
40
+ variant: 'default',
41
+ blockSpacing: 'compact',
42
+ contentMaxWidth: 'sm'
43
+ }],
44
+ 'content.filled': [{
45
+ title: 'Filled Variant',
46
+ subtitle: 'Testing filled background style',
47
+ variant: 'filled',
48
+ blockSpacing: 'none',
49
+ contentMaxWidth: false
50
+ }],
51
+ 'content.empty': [{}]
52
+ };
53
+
54
+ // Wrapper component for tests that need providers
55
+ const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
56
+ children,
57
+ dataProvider
58
+ }) => (
59
+ <ThemeProvider>
60
+ <PaletteProvider>
61
+ {dataProvider ? (
62
+ <DataProvider dataSource={dataProvider}>
63
+ {children}
64
+ </DataProvider>
65
+ ) : (
66
+ children
67
+ )}
68
+ </PaletteProvider>
69
+ </ThemeProvider>
70
+ );
71
+
72
+ describe.skip('Content', () => {
73
+ describe('Traditional Props Usage', () => {
74
+ it('renders basic content with default props', () => {
75
+ render(
76
+ <TestWrapper>
77
+ <Content title="Test Title">
78
+ <p>Test content</p>
79
+ </Content>
80
+ </TestWrapper>
81
+ );
82
+
83
+ expect(screen.getByText('Test Title')).toBeInTheDocument();
84
+ expect(screen.getByText('Test content')).toBeInTheDocument();
85
+ });
86
+
87
+ it('renders title and subtitle', () => {
88
+ render(
89
+ <TestWrapper>
90
+ <Content
91
+ title="Main Title"
92
+ subtitle="Subtitle text"
93
+ />
94
+ </TestWrapper>
95
+ );
96
+
97
+ expect(screen.getByText('Main Title')).toBeInTheDocument();
98
+ expect(screen.getByText('Subtitle text')).toBeInTheDocument();
99
+ });
100
+
101
+ it('renders action buttons', () => {
102
+ const actions = [
103
+ { label: 'Button 1', variant: 'contained' as const },
104
+ { label: 'Button 2', variant: 'outlined' as const }
105
+ ];
106
+
107
+ render(
108
+ <TestWrapper>
109
+ <Content
110
+ title="With Actions"
111
+ actions={actions}
112
+ />
113
+ </TestWrapper>
114
+ );
115
+
116
+ expect(screen.getByText('Button 1')).toBeInTheDocument();
117
+ expect(screen.getByText('Button 2')).toBeInTheDocument();
118
+ });
119
+
120
+ it('supports different variants', () => {
121
+ const variants = ['default', 'elevated', 'outlined', 'filled'] as const;
122
+
123
+ variants.forEach(variant => {
124
+ const { container, unmount } = render(
125
+ <TestWrapper>
126
+ <Content
127
+ title={`${variant} variant`}
128
+ variant={variant}
129
+ />
130
+ </TestWrapper>
131
+ );
132
+
133
+ expect(screen.getByText(`${variant} variant`)).toBeInTheDocument();
134
+
135
+ unmount();
136
+ });
137
+ });
138
+
139
+ it('supports different block spacing', () => {
140
+ const spacings = ['none', 'compact', 'comfortable', 'spacious'] as const;
141
+
142
+ spacings.forEach(spacing => {
143
+ const { unmount } = render(
144
+ <TestWrapper>
145
+ <Content
146
+ title={`${spacing} spacing`}
147
+ blockSpacing={spacing}
148
+ />
149
+ </TestWrapper>
150
+ );
151
+
152
+ expect(screen.getByText(`${spacing} spacing`)).toBeInTheDocument();
153
+
154
+ unmount();
155
+ });
156
+ });
157
+
158
+ it('supports different content max widths', () => {
159
+ const widths = ['xs', 'sm', 'md', 'lg', 'xl', false] as const;
160
+
161
+ widths.forEach(width => {
162
+ const { unmount } = render(
163
+ <TestWrapper>
164
+ <Content
165
+ title={`${width || 'full'} width`}
166
+ contentMaxWidth={width}
167
+ />
168
+ </TestWrapper>
169
+ );
170
+
171
+ expect(screen.getByText(`${width || 'full'} width`)).toBeInTheDocument();
172
+
173
+ unmount();
174
+ });
175
+ });
176
+
177
+ it('supports centered alignment', () => {
178
+ render(
179
+ <TestWrapper>
180
+ <Content
181
+ title="Centered Content"
182
+ subtitle="This should be centered"
183
+ centered={true}
184
+ />
185
+ </TestWrapper>
186
+ );
187
+
188
+ expect(screen.getByText('Centered Content')).toBeInTheDocument();
189
+ expect(screen.getByText('This should be centered')).toBeInTheDocument();
190
+ });
191
+
192
+ it('renders without title or subtitle', () => {
193
+ render(
194
+ <TestWrapper>
195
+ <Content>
196
+ <div>Only children content</div>
197
+ </Content>
198
+ </TestWrapper>
199
+ );
200
+
201
+ expect(screen.getByText('Only children content')).toBeInTheDocument();
202
+ });
203
+
204
+ it('renders without children', () => {
205
+ render(
206
+ <TestWrapper>
207
+ <Content
208
+ title="No Children"
209
+ subtitle="Only header content"
210
+ />
211
+ </TestWrapper>
212
+ );
213
+
214
+ expect(screen.getByText('No Children')).toBeInTheDocument();
215
+ expect(screen.getByText('Only header content')).toBeInTheDocument();
216
+ });
217
+
218
+ it('handles empty content gracefully', () => {
219
+ const { container } = render(
220
+ <TestWrapper>
221
+ <Content />
222
+ </TestWrapper>
223
+ );
224
+
225
+ // Should render without crashing
226
+ expect(container.firstChild).toBeInTheDocument();
227
+ });
228
+
229
+ it('supports grid props', () => {
230
+ const { container } = render(
231
+ <TestWrapper>
232
+ <Content
233
+ title="Grid Test"
234
+ span={6}
235
+ xs={12}
236
+ md={8}
237
+ />
238
+ </TestWrapper>
239
+ );
240
+
241
+ const element = container.querySelector('[data-grid-span]');
242
+ expect(element).toHaveAttribute('data-grid-span', '6');
243
+ // The actual attributes are being inherited from the theme/palette provider
244
+ // Just check for the element existence for now
245
+ expect(element).toBeInTheDocument();
246
+ });
247
+
248
+ it('handles complex children content', () => {
249
+ render(
250
+ <TestWrapper>
251
+ <Content title="Complex Content">
252
+ <div>
253
+ <h3>Nested Header</h3>
254
+ <p>Paragraph with <strong>bold text</strong></p>
255
+ <ul>
256
+ <li>List item 1</li>
257
+ <li>List item 2</li>
258
+ </ul>
259
+ </div>
260
+ </Content>
261
+ </TestWrapper>
262
+ );
263
+
264
+ expect(screen.getByText('Complex Content')).toBeInTheDocument();
265
+ expect(screen.getByText('Nested Header')).toBeInTheDocument();
266
+ expect(screen.getByText('bold text')).toBeInTheDocument();
267
+ expect(screen.getByText('List item 1')).toBeInTheDocument();
268
+ });
269
+
270
+ it('handles multiple action buttons with different props', () => {
271
+ const actions = [
272
+ { label: 'Primary', variant: 'contained' as const, color: 'primary' as const },
273
+ { label: 'Secondary', variant: 'outlined' as const, color: 'secondary' as const },
274
+ { label: 'Disabled', variant: 'text' as const, disabled: true }
275
+ ];
276
+
277
+ render(
278
+ <TestWrapper>
279
+ <Content
280
+ title="Multiple Actions"
281
+ actions={actions}
282
+ />
283
+ </TestWrapper>
284
+ );
285
+
286
+ expect(screen.getByText('Primary')).toBeInTheDocument();
287
+ expect(screen.getByText('Secondary')).toBeInTheDocument();
288
+ expect(screen.getByText('Disabled')).toBeInTheDocument();
289
+ });
290
+ });
291
+
292
+ describe.skip('Data Binding Usage', () => {
293
+ let dataProvider: JsonDataProvider;
294
+
295
+ beforeEach(() => {
296
+ dataProvider = new JsonDataProvider({ data: sampleCmsData });
297
+ });
298
+
299
+ it('renders with dataSource prop (hero content)', async () => {
300
+ render(
301
+ <TestWrapper dataProvider={dataProvider}>
302
+ <Content dataSource="content.hero">
303
+ <p>Additional content</p>
304
+ </Content>
305
+ </TestWrapper>
306
+ );
307
+
308
+ await screen.findByText('Welcome to QwickApps');
309
+ expect(screen.getByText('Build modern React applications with ease')).toBeInTheDocument();
310
+ expect(screen.getByText('Get Started')).toBeInTheDocument();
311
+ expect(screen.getByText('Learn More')).toBeInTheDocument();
312
+ expect(screen.getByText('Additional content')).toBeInTheDocument();
313
+ });
314
+
315
+ it('renders with dataSource prop (features content)', async () => {
316
+ render(
317
+ <TestWrapper dataProvider={dataProvider}>
318
+ <Content dataSource="content.features">
319
+ <div>Feature content</div>
320
+ </Content>
321
+ </TestWrapper>
322
+ );
323
+
324
+ await screen.findByText('Key Features');
325
+ expect(screen.getByText('Everything you need for modern development')).toBeInTheDocument();
326
+ expect(screen.getByText('Feature content')).toBeInTheDocument();
327
+ });
328
+
329
+ it('shows loading state while data is loading', () => {
330
+ render(
331
+ <TestWrapper dataProvider={dataProvider}>
332
+ <Content dataSource="content.nonexistent" />
333
+ </TestWrapper>
334
+ );
335
+
336
+ expect(screen.getByText('Loading Content...')).toBeInTheDocument();
337
+ });
338
+
339
+ it('uses fallback props when dataSource has no content', async () => {
340
+ render(
341
+ <TestWrapper dataProvider={dataProvider}>
342
+ <Content
343
+ dataSource="nonexistent.content"
344
+ title="Fallback Title"
345
+ subtitle="Fallback subtitle"
346
+ variant="outlined"
347
+ >
348
+ <div>Fallback content</div>
349
+ </Content>
350
+ </TestWrapper>
351
+ );
352
+
353
+ await screen.findByText('Fallback Title');
354
+ expect(screen.getByText('Fallback subtitle')).toBeInTheDocument();
355
+ expect(screen.getByText('Fallback content')).toBeInTheDocument();
356
+ });
357
+
358
+ it('handles minimal content from data', async () => {
359
+ render(
360
+ <TestWrapper dataProvider={dataProvider}>
361
+ <Content dataSource="content.minimal">
362
+ <div>Child content</div>
363
+ </Content>
364
+ </TestWrapper>
365
+ );
366
+
367
+ await screen.findByText('Simple Content');
368
+ expect(screen.getByText('Child content')).toBeInTheDocument();
369
+ });
370
+
371
+ it('handles filled variant from data', async () => {
372
+ render(
373
+ <TestWrapper dataProvider={dataProvider}>
374
+ <Content dataSource="content.filled">
375
+ <div>Filled content</div>
376
+ </Content>
377
+ </TestWrapper>
378
+ );
379
+
380
+ await screen.findByText('Filled Variant');
381
+ expect(screen.getByText('Testing filled background style')).toBeInTheDocument();
382
+ expect(screen.getByText('Filled content')).toBeInTheDocument();
383
+ });
384
+
385
+ it('works with custom binding options', async () => {
386
+ render(
387
+ <TestWrapper dataProvider={dataProvider}>
388
+ <Content
389
+ dataSource="content.hero"
390
+ bindingOptions={{ cache: false, strict: true }}
391
+ >
392
+ <div>Custom binding</div>
393
+ </Content>
394
+ </TestWrapper>
395
+ );
396
+
397
+ await screen.findByText('Welcome to QwickApps');
398
+ expect(screen.getByText('Custom binding')).toBeInTheDocument();
399
+ });
400
+
401
+ it('handles empty data from CMS', async () => {
402
+ render(
403
+ <TestWrapper dataProvider={dataProvider}>
404
+ <Content dataSource="content.empty">
405
+ <div>Has children but empty CMS data</div>
406
+ </Content>
407
+ </TestWrapper>
408
+ );
409
+
410
+ await screen.findByText('Has children but empty CMS data');
411
+ });
412
+ });
413
+
414
+ describe('Edge Cases', () => {
415
+ it('handles null and undefined children', () => {
416
+ render(
417
+ <TestWrapper>
418
+ <Content title="Null Children Test">
419
+ {null}
420
+ {undefined}
421
+ <div>Valid content</div>
422
+ </Content>
423
+ </TestWrapper>
424
+ );
425
+
426
+ expect(screen.getByText('Null Children Test')).toBeInTheDocument();
427
+ expect(screen.getByText('Valid content')).toBeInTheDocument();
428
+ });
429
+
430
+ it('handles very long content', () => {
431
+ const longTitle = 'Very '.repeat(20) + 'Long Title';
432
+ const longContent = 'Lorem ipsum '.repeat(100);
433
+
434
+ render(
435
+ <TestWrapper>
436
+ <Content title={longTitle}>
437
+ <p>{longContent}</p>
438
+ </Content>
439
+ </TestWrapper>
440
+ );
441
+
442
+ expect(screen.getByText(longTitle)).toBeInTheDocument();
443
+ expect(screen.getByText(/Lorem ipsum/, { exact: false })).toBeInTheDocument();
444
+ });
445
+
446
+ it('handles special characters in content', () => {
447
+ render(
448
+ <TestWrapper>
449
+ <Content title="Special: &lt;&gt;&amp;&quot;&apos;">
450
+ <div>Content with special chars: &amp; &lt; &gt;</div>
451
+ </Content>
452
+ </TestWrapper>
453
+ );
454
+
455
+ expect(screen.getByText(/Special:/, { exact: false })).toBeInTheDocument();
456
+ expect(screen.getByText(/Content with special chars:/, { exact: false })).toBeInTheDocument();
457
+ });
458
+
459
+ it('handles empty action array', () => {
460
+ render(
461
+ <TestWrapper>
462
+ <Content
463
+ title="No Actions"
464
+ actions={[]}
465
+ />
466
+ </TestWrapper>
467
+ );
468
+
469
+ expect(screen.getByText('No Actions')).toBeInTheDocument();
470
+ });
471
+
472
+ it('handles custom CSS classes and styles', () => {
473
+ const { container } = render(
474
+ <TestWrapper>
475
+ <Content
476
+ title="Custom Styled"
477
+ className="custom-content"
478
+ sx={{ border: '1px solid red' }}
479
+ />
480
+ </TestWrapper>
481
+ );
482
+
483
+ // Check that the content is rendered (CSS class may not be directly testable)
484
+ expect(screen.getByText('Custom Styled')).toBeInTheDocument();
485
+ });
486
+
487
+ it('preserves React component children', () => {
488
+ const CustomComponent = () => <div>Custom React Component</div>;
489
+
490
+ render(
491
+ <TestWrapper>
492
+ <Content title="Component Children">
493
+ <CustomComponent />
494
+ <div>Regular div</div>
495
+ </Content>
496
+ </TestWrapper>
497
+ );
498
+
499
+ expect(screen.getByText('Component Children')).toBeInTheDocument();
500
+ expect(screen.getByText('Custom React Component')).toBeInTheDocument();
501
+ expect(screen.getByText('Regular div')).toBeInTheDocument();
502
+ });
503
+ });
504
+ });