@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,478 @@
1
+ /**
2
+ * Unit tests for CardListGrid 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 { CardListGrid } from '../blocks/CardListGrid';
12
+ import { JsonDataProvider } from '@qwickapps/schema';
13
+ import { ThemeProvider, PaletteProvider } from '../../contexts';
14
+ import QwickApp from '../QwickApp';
15
+
16
+ // Sample data for testing
17
+ const sampleProducts = [
18
+ {
19
+ id: 'product-1',
20
+ name: 'Test Product 1',
21
+ category: 'Testing',
22
+ description: 'First test product',
23
+ shortDescription: 'Test product 1',
24
+ features: ['Feature 1', 'Feature 2'],
25
+ technologies: ['React', 'TypeScript'],
26
+ status: 'launched',
27
+ image: 'https://example.com/product1.jpg'
28
+ },
29
+ {
30
+ id: 'product-2',
31
+ name: 'Test Product 2',
32
+ category: 'Testing',
33
+ description: 'Second test product',
34
+ shortDescription: 'Test product 2',
35
+ features: ['Feature A', 'Feature B'],
36
+ technologies: ['Vue', 'JavaScript'],
37
+ status: 'beta'
38
+ }
39
+ ];
40
+
41
+ const sampleFeatures = [
42
+ {
43
+ id: 'feature-1',
44
+ title: 'Test Feature 1',
45
+ description: 'First test feature',
46
+ icon: '🚀'
47
+ },
48
+ {
49
+ id: 'feature-2',
50
+ title: 'Test Feature 2',
51
+ description: 'Second test feature',
52
+ icon: '⚡'
53
+ }
54
+ ];
55
+
56
+ // Test data for data binding - using nested structure
57
+ const sampleCmsData = {
58
+ 'cardListGrids': {
59
+ 'products': {
60
+ items: sampleProducts,
61
+ renderComponent: 'ProductCard',
62
+ columns: 2,
63
+ spacing: 'large',
64
+ equalHeight: true,
65
+ itemProps: { variant: 'compact' }
66
+ },
67
+ 'features': {
68
+ items: sampleFeatures,
69
+ renderComponent: 'FeatureCard',
70
+ columns: 3,
71
+ spacing: 'medium',
72
+ equalHeight: false
73
+ },
74
+ 'mixed': {
75
+ items: [
76
+ { id: 'mixed-1', type: 'custom', content: 'Custom item 1' },
77
+ { id: 'mixed-2', type: 'custom', content: 'Custom item 2' }
78
+ ],
79
+ renderComponent: 'Custom',
80
+ columns: 2,
81
+ spacing: 'small'
82
+ }
83
+ }
84
+ };
85
+
86
+ // Wrapper component for tests that need providers
87
+ const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
88
+ children,
89
+ dataProvider
90
+ }) => (
91
+ <ThemeProvider>
92
+ <PaletteProvider>
93
+ {dataProvider ? (
94
+ <QwickApp appId="test-cardlistgrid" appName="CardListGrid Test" dataSource={{ dataProvider }}>
95
+ {children}
96
+ </QwickApp>
97
+ ) : (
98
+ children
99
+ )}
100
+ </PaletteProvider>
101
+ </ThemeProvider>
102
+ );
103
+
104
+ describe('CardListGrid', () => {
105
+ describe('Traditional Props Usage', () => {
106
+ it('renders with custom render function', () => {
107
+ const customRenderItem = (item: any, index: number) => (
108
+ <div key={index} data-testid={`custom-item-${index}`}>
109
+ {item.name}
110
+ </div>
111
+ );
112
+
113
+ render(
114
+ <TestWrapper>
115
+ <CardListGrid
116
+ items={sampleProducts}
117
+ renderItem={customRenderItem}
118
+ columns={2}
119
+ spacing="large"
120
+ />
121
+ </TestWrapper>
122
+ );
123
+
124
+ expect(screen.getByTestId('custom-item-0')).toBeInTheDocument();
125
+ expect(screen.getByTestId('custom-item-1')).toBeInTheDocument();
126
+ expect(screen.getByText('Test Product 1')).toBeInTheDocument();
127
+ expect(screen.getByText('Test Product 2')).toBeInTheDocument();
128
+ });
129
+
130
+ it('renders ProductCards by default when renderComponent is ProductCard', () => {
131
+ render(
132
+ <TestWrapper>
133
+ <CardListGrid
134
+ items={sampleProducts}
135
+ renderComponent="ProductCard"
136
+ columns={2}
137
+ itemProps={{ variant: 'compact' }}
138
+ />
139
+ </TestWrapper>
140
+ );
141
+
142
+ expect(screen.getByText('Test Product 1')).toBeInTheDocument();
143
+ expect(screen.getByText('Test Product 2')).toBeInTheDocument();
144
+ });
145
+
146
+ it('renders FeatureCards when renderComponent is FeatureCard', () => {
147
+ render(
148
+ <TestWrapper>
149
+ <CardListGrid
150
+ items={sampleFeatures}
151
+ renderComponent="FeatureCard"
152
+ columns={3}
153
+ />
154
+ </TestWrapper>
155
+ );
156
+
157
+ expect(screen.getByText('Test Feature 1')).toBeInTheDocument();
158
+ expect(screen.getByText('Test Feature 2')).toBeInTheDocument();
159
+ });
160
+
161
+ it('handles different column configurations', () => {
162
+ const { container } = render(
163
+ <TestWrapper>
164
+ <CardListGrid
165
+ items={sampleProducts}
166
+ renderComponent="ProductCard"
167
+ columns={4}
168
+ spacing="medium"
169
+ equalHeight={false}
170
+ />
171
+ </TestWrapper>
172
+ );
173
+
174
+ // Should render the grid container
175
+ expect(container.firstChild).toBeInTheDocument();
176
+ expect(screen.getByText('Test Product 1')).toBeInTheDocument();
177
+ expect(screen.getByText('Test Product 2')).toBeInTheDocument();
178
+ });
179
+
180
+ it('returns null when no items and no render function', () => {
181
+ const { container } = render(
182
+ <TestWrapper>
183
+ <CardListGrid items={[]} />
184
+ </TestWrapper>
185
+ );
186
+
187
+ expect(container.firstChild).toBeNull();
188
+ });
189
+
190
+ it('handles empty items array gracefully', () => {
191
+ const customRenderItem = (item: any, index: number) => (
192
+ <div key={index}>Empty</div>
193
+ );
194
+
195
+ const { container } = render(
196
+ <TestWrapper>
197
+ <CardListGrid
198
+ items={[]}
199
+ renderItem={customRenderItem}
200
+ />
201
+ </TestWrapper>
202
+ );
203
+
204
+ // Should render grid layout but no items
205
+ expect(container.firstChild).toBeInTheDocument();
206
+ expect(screen.queryByText('Empty')).not.toBeInTheDocument();
207
+ });
208
+
209
+ it('passes item props to rendered components', () => {
210
+ render(
211
+ <TestWrapper>
212
+ <CardListGrid
213
+ items={[sampleProducts[0]]} // Just one product to avoid duplicate "Technologies:" text
214
+ renderComponent="ProductCard"
215
+ itemProps={{
216
+ variant: 'detailed',
217
+ showTechnologies: true
218
+ }}
219
+ />
220
+ </TestWrapper>
221
+ );
222
+
223
+ // Should show technologies section (detailed variant specific)
224
+ expect(screen.getByText('Technologies:')).toBeInTheDocument();
225
+ expect(screen.getByText('React')).toBeInTheDocument();
226
+ });
227
+
228
+ it('handles custom render component type', () => {
229
+ const customItems = [
230
+ { id: 'custom-1', content: 'Custom Content 1' },
231
+ { id: 'custom-2', content: 'Custom Content 2' }
232
+ ];
233
+
234
+ render(
235
+ <TestWrapper>
236
+ <CardListGrid
237
+ items={customItems}
238
+ renderComponent="Custom"
239
+ />
240
+ </TestWrapper>
241
+ );
242
+
243
+ // Should render JSON representation of items
244
+ expect(screen.getByText(/"content":"Custom Content 1"/)).toBeInTheDocument();
245
+ expect(screen.getByText(/"content":"Custom Content 2"/)).toBeInTheDocument();
246
+ });
247
+ });
248
+
249
+ describe('Data Binding Usage', () => {
250
+ let dataProvider: JsonDataProvider;
251
+
252
+ beforeEach(() => {
253
+ dataProvider = new JsonDataProvider({ data: sampleCmsData });
254
+ });
255
+
256
+ it('renders with dataSource prop (ProductCard grid)', async () => {
257
+ render(
258
+ <TestWrapper dataProvider={dataProvider}>
259
+ <CardListGrid dataSource="cardListGrids.products" />
260
+ </TestWrapper>
261
+ );
262
+
263
+ // Should eventually load and show products
264
+ await screen.findByText('Test Product 1');
265
+ expect(screen.getByText('Test Product 2')).toBeInTheDocument();
266
+ });
267
+
268
+ it('renders with dataSource prop (FeatureCard grid)', async () => {
269
+ render(
270
+ <TestWrapper dataProvider={dataProvider}>
271
+ <CardListGrid dataSource="cardListGrids.features" />
272
+ </TestWrapper>
273
+ );
274
+
275
+ // Should eventually load and show features
276
+ await screen.findByText('Test Feature 1');
277
+ expect(screen.getByText('Test Feature 2')).toBeInTheDocument();
278
+ });
279
+
280
+ it('shows loading state while data is loading', () => {
281
+ render(
282
+ <TestWrapper dataProvider={dataProvider}>
283
+ <CardListGrid dataSource="cardListGrids.nonexistent" />
284
+ </TestWrapper>
285
+ );
286
+
287
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
288
+ });
289
+
290
+ it('includes data attributes when using dataSource', async () => {
291
+ const { container } = render(
292
+ <TestWrapper dataProvider={dataProvider}>
293
+ <CardListGrid dataSource="cardListGrids.products" />
294
+ </TestWrapper>
295
+ );
296
+
297
+ // Wait for content to load
298
+ await screen.findByText('Test Product 1');
299
+
300
+ // Should have Material-UI grid layout
301
+ const gridElement = container.querySelector('.MuiGrid-root.MuiGrid-container');
302
+ expect(gridElement).toBeInTheDocument();
303
+ });
304
+
305
+ it('uses fallback props when dataSource has no content', () => {
306
+ render(
307
+ <TestWrapper dataProvider={dataProvider}>
308
+ <CardListGrid
309
+ dataSource="cardListGrids.nonexistent-key"
310
+ items={sampleProducts}
311
+ renderComponent="ProductCard"
312
+ />
313
+ </TestWrapper>
314
+ );
315
+
316
+ // Currently shows loading state when path not found (expected behavior)
317
+ // TODO: Future enhancement - implement fallback to provided props
318
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
319
+ });
320
+
321
+ it('works with custom binding options', async () => {
322
+ render(
323
+ <TestWrapper dataProvider={dataProvider}>
324
+ <CardListGrid
325
+ dataSource="cardListGrids.products"
326
+ bindingOptions={{ cache: false, strict: true }}
327
+ />
328
+ </TestWrapper>
329
+ );
330
+
331
+ await screen.findByText('Test Product 1');
332
+ expect(screen.getByText('Test Product 2')).toBeInTheDocument();
333
+ });
334
+
335
+ it('shows proper loading state with grid layout', () => {
336
+ render(
337
+ <TestWrapper dataProvider={dataProvider}>
338
+ <CardListGrid dataSource="cardListGrids.nonexistent" />
339
+ </TestWrapper>
340
+ );
341
+
342
+ const loadingText = screen.getByText('Loading...');
343
+ expect(loadingText).toBeInTheDocument();
344
+
345
+ // Should maintain grid layout during loading
346
+ const gridContainer = loadingText.closest('.MuiGrid-root.MuiGrid-container');
347
+ expect(gridContainer).toBeInTheDocument();
348
+ });
349
+
350
+ it('handles error states appropriately in development', () => {
351
+ const originalEnv = process.env.NODE_ENV;
352
+ process.env.NODE_ENV = 'development';
353
+
354
+ // Mock console.error to avoid test output noise
355
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
356
+
357
+ // Create a provider that will cause an error
358
+ const errorProvider = new JsonDataProvider({
359
+ data: {}, // Empty data will cause binding to fail
360
+ enableCache: false
361
+ });
362
+
363
+ render(
364
+ <TestWrapper dataProvider={errorProvider}>
365
+ <CardListGrid dataSource="cardListGrids.nonexistent" />
366
+ </TestWrapper>
367
+ );
368
+
369
+ // Currently shows loading state when path not found (expected behavior)
370
+ // TODO: Future enhancement - implement proper error state handling
371
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
372
+
373
+ // Restore environment and console
374
+ process.env.NODE_ENV = originalEnv;
375
+ consoleErrorSpy.mockRestore();
376
+ });
377
+
378
+ it('handles error states appropriately in production', () => {
379
+ const originalEnv = process.env.NODE_ENV;
380
+ process.env.NODE_ENV = 'production';
381
+
382
+ // Mock console.error to avoid test output noise
383
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
384
+
385
+ // Create a provider that will cause an error
386
+ const errorProvider = new JsonDataProvider({
387
+ data: {}, // Empty data will cause binding to fail
388
+ enableCache: false
389
+ });
390
+
391
+ render(
392
+ <TestWrapper dataProvider={errorProvider}>
393
+ <CardListGrid dataSource="cardListGrids.nonexistent" />
394
+ </TestWrapper>
395
+ );
396
+
397
+ // Currently shows loading state when path not found (expected behavior)
398
+ // TODO: Future enhancement - implement proper error state handling
399
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
400
+
401
+ // Restore environment and console
402
+ process.env.NODE_ENV = originalEnv;
403
+ consoleErrorSpy.mockRestore();
404
+ });
405
+ });
406
+
407
+ describe('Edge Cases', () => {
408
+ it('handles items without id or key properties', () => {
409
+ const itemsWithoutIds = [
410
+ { name: 'Product A' },
411
+ { name: 'Product B' }
412
+ ];
413
+
414
+ render(
415
+ <TestWrapper>
416
+ <CardListGrid
417
+ items={itemsWithoutIds}
418
+ renderComponent="Custom"
419
+ />
420
+ </TestWrapper>
421
+ );
422
+
423
+ // Should still render using array index as key
424
+ expect(screen.getByText(/"name":"Product A"/)).toBeInTheDocument();
425
+ expect(screen.getByText(/"name":"Product B"/)).toBeInTheDocument();
426
+ });
427
+
428
+ it('handles mixed item types gracefully', () => {
429
+ const mixedItems = [
430
+ { id: 'product', name: 'Product', category: 'Test', description: 'Test product', shortDescription: 'Test', features: [], technologies: [], status: 'launched' }
431
+ ];
432
+
433
+ render(
434
+ <TestWrapper>
435
+ <CardListGrid
436
+ items={mixedItems}
437
+ renderComponent="ProductCard"
438
+ />
439
+ </TestWrapper>
440
+ );
441
+
442
+ // ProductCard should handle the item gracefully
443
+ expect(screen.getByText('Product')).toBeInTheDocument();
444
+ });
445
+
446
+ it('handles extreme column counts', () => {
447
+ const { container } = render(
448
+ <TestWrapper>
449
+ <CardListGrid
450
+ items={sampleProducts}
451
+ renderComponent="ProductCard"
452
+ columns={6}
453
+ />
454
+ </TestWrapper>
455
+ );
456
+
457
+ // Should render without errors
458
+ expect(container.firstChild).toBeInTheDocument();
459
+ expect(screen.getByText('Test Product 1')).toBeInTheDocument();
460
+ });
461
+
462
+ it('handles different spacing options', () => {
463
+ const { container } = render(
464
+ <TestWrapper>
465
+ <CardListGrid
466
+ items={sampleProducts}
467
+ renderComponent="ProductCard"
468
+ spacing="huge"
469
+ />
470
+ </TestWrapper>
471
+ );
472
+
473
+ // Should render without errors
474
+ expect(container.firstChild).toBeInTheDocument();
475
+ expect(screen.getByText('Test Product 1')).toBeInTheDocument();
476
+ });
477
+ });
478
+ });