@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,494 @@
1
+ /**
2
+ * Unit tests for Section 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 Section from '../blocks/Section';
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
+ 'sections.hero': [{
19
+ background: '#1976d2',
20
+ color: '#ffffff',
21
+ padding: 'large',
22
+ contentMaxWidth: 'lg',
23
+ component: 'section',
24
+ children: '<h1>Hero Section</h1><p>Welcome to our site</p>'
25
+ }],
26
+ 'sections.feature': [{
27
+ background: '#f5f5f5',
28
+ color: '#333333',
29
+ padding: 'medium',
30
+ contentMaxWidth: 'xl',
31
+ component: 'article',
32
+ children: '<h2>Features</h2><ul><li>Feature 1</li><li>Feature 2</li></ul>'
33
+ }],
34
+ 'sections.minimal': [{
35
+ padding: 'none',
36
+ contentMaxWidth: 'sm',
37
+ children: '<div>Minimal content</div>'
38
+ }],
39
+ 'sections.gradient': [{
40
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
41
+ color: '#ffffff',
42
+ padding: 'extra-large',
43
+ contentMaxWidth: false,
44
+ component: 'main',
45
+ children: '<h1>Gradient Background</h1>'
46
+ }],
47
+ 'sections.empty': [{
48
+ background: '#ffffff',
49
+ padding: 'medium'
50
+ }]
51
+ };
52
+
53
+ // Wrapper component for tests that need providers
54
+ const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
55
+ children,
56
+ dataProvider
57
+ }) => (
58
+ <ThemeProvider>
59
+ <PaletteProvider>
60
+ {dataProvider ? (
61
+ <DataProvider dataSource={dataProvider}>
62
+ {children}
63
+ </DataProvider>
64
+ ) : (
65
+ children
66
+ )}
67
+ </PaletteProvider>
68
+ </ThemeProvider>
69
+ );
70
+
71
+ describe('Section', () => {
72
+ describe.skip('Traditional Props Usage', () => {
73
+ it('renders basic section with default props', () => {
74
+ const { container } = render(
75
+ <TestWrapper>
76
+ <Section>
77
+ <div>Test content</div>
78
+ </Section>
79
+ </TestWrapper>
80
+ );
81
+
82
+ expect(screen.getByText('Test content')).toBeInTheDocument();
83
+ const sectionElement = container.querySelector('section');
84
+ expect(sectionElement).toBeInTheDocument();
85
+ });
86
+
87
+ it('applies custom background and color', () => {
88
+ const { container } = render(
89
+ <TestWrapper>
90
+ <Section background="#ff0000" color="#ffffff">
91
+ <div>Colored section</div>
92
+ </Section>
93
+ </TestWrapper>
94
+ );
95
+
96
+ const sectionElement = container.querySelector('section');
97
+ expect(sectionElement).toBeInTheDocument();
98
+ expect(screen.getByText('Colored section')).toBeInTheDocument();
99
+ // Note: CSS-in-JS styles may not be directly testable via toHaveStyle
100
+ });
101
+
102
+ it('uses different padding sizes', () => {
103
+ const { container } = render(
104
+ <TestWrapper>
105
+ <Section padding="large">
106
+ <div>Large padding</div>
107
+ </Section>
108
+ </TestWrapper>
109
+ );
110
+
111
+ const sectionElement = container.querySelector('section');
112
+ expect(sectionElement).toBeInTheDocument();
113
+ expect(screen.getByText('Large padding')).toBeInTheDocument();
114
+ });
115
+
116
+ it('supports different HTML components', () => {
117
+ const { container } = render(
118
+ <TestWrapper>
119
+ <Section component="article">
120
+ <div>Article content</div>
121
+ </Section>
122
+ </TestWrapper>
123
+ );
124
+
125
+ const articleElement = container.querySelector('article');
126
+ expect(articleElement).toBeInTheDocument();
127
+ expect(screen.getByText('Article content')).toBeInTheDocument();
128
+ });
129
+
130
+ it('handles different content max widths', () => {
131
+ const { container } = render(
132
+ <TestWrapper>
133
+ <Section contentMaxWidth="sm">
134
+ <div>Small width content</div>
135
+ </Section>
136
+ </TestWrapper>
137
+ );
138
+
139
+ expect(screen.getByText('Small width content')).toBeInTheDocument();
140
+ // Container should be present with appropriate max width
141
+ expect(container.querySelector('.MuiContainer-root')).toBeInTheDocument();
142
+ });
143
+
144
+ it('handles full width content', () => {
145
+ const { container } = render(
146
+ <TestWrapper>
147
+ <Section contentMaxWidth={false}>
148
+ <div>Full width content</div>
149
+ </Section>
150
+ </TestWrapper>
151
+ );
152
+
153
+ expect(screen.getByText('Full width content')).toBeInTheDocument();
154
+ const containerElement = container.querySelector('.MuiContainer-root');
155
+ expect(containerElement).toBeInTheDocument();
156
+ });
157
+
158
+ it('displays empty state when no children provided', () => {
159
+ render(
160
+ <TestWrapper>
161
+ <Section />
162
+ </TestWrapper>
163
+ );
164
+
165
+ expect(screen.getByText('No content provided for this section')).toBeInTheDocument();
166
+ });
167
+
168
+ it('supports no padding option', () => {
169
+ const { container } = render(
170
+ <TestWrapper>
171
+ <Section padding="none">
172
+ <div>No padding content</div>
173
+ </Section>
174
+ </TestWrapper>
175
+ );
176
+
177
+ expect(screen.getByText('No padding content')).toBeInTheDocument();
178
+ const sectionElement = container.querySelector('section');
179
+ expect(sectionElement).toBeInTheDocument();
180
+ });
181
+
182
+ it('supports all padding variants', () => {
183
+ const paddingVariants = ['none', 'tiny', 'small', 'medium', 'large', 'extra-large'] as const;
184
+
185
+ paddingVariants.forEach(padding => {
186
+ const { container, unmount } = render(
187
+ <TestWrapper>
188
+ <Section padding={padding}>
189
+ <div>{padding} padding</div>
190
+ </Section>
191
+ </TestWrapper>
192
+ );
193
+
194
+ expect(screen.getByText(`${padding} padding`)).toBeInTheDocument();
195
+ const sectionElement = container.querySelector('section');
196
+ expect(sectionElement).toBeInTheDocument();
197
+
198
+ unmount();
199
+ });
200
+ });
201
+
202
+ it('handles gradient backgrounds', () => {
203
+ const { container } = render(
204
+ <TestWrapper>
205
+ <Section background="linear-gradient(135deg, #667eea 0%, #764ba2 100%)">
206
+ <div>Gradient section</div>
207
+ </Section>
208
+ </TestWrapper>
209
+ );
210
+
211
+ const sectionElement = container.querySelector('section');
212
+ expect(sectionElement).toBeInTheDocument();
213
+ expect(screen.getByText('Gradient section')).toBeInTheDocument();
214
+ });
215
+
216
+ it('supports theme variable backgrounds', () => {
217
+ const { container } = render(
218
+ <TestWrapper>
219
+ <Section background="var(--theme-primary)" color="var(--theme-on-primary)">
220
+ <div>Theme colors</div>
221
+ </Section>
222
+ </TestWrapper>
223
+ );
224
+
225
+ const sectionElement = container.querySelector('section');
226
+ expect(sectionElement).toBeInTheDocument();
227
+ expect(screen.getByText('Theme colors')).toBeInTheDocument();
228
+ });
229
+ });
230
+
231
+ describe.skip('Data Binding Usage', () => {
232
+ let dataProvider: JsonDataProvider;
233
+
234
+ beforeEach(() => {
235
+ dataProvider = new JsonDataProvider({ data: sampleCmsData });
236
+ });
237
+
238
+ it('renders with dataSource prop (hero section)', async () => {
239
+ render(
240
+ <TestWrapper dataProvider={dataProvider}>
241
+ <Section dataSource="sections.hero">
242
+ <div>Additional content</div>
243
+ </Section>
244
+ </TestWrapper>
245
+ );
246
+
247
+ await screen.findByText('Additional content');
248
+ const sectionElement = document.querySelector('section');
249
+ expect(sectionElement).toHaveStyle({
250
+ backgroundColor: '#1976d2',
251
+ color: '#ffffff'
252
+ });
253
+ });
254
+
255
+ it('renders with dataSource prop (feature section)', async () => {
256
+ render(
257
+ <TestWrapper dataProvider={dataProvider}>
258
+ <Section dataSource="sections.feature">
259
+ <div>Feature content</div>
260
+ </Section>
261
+ </TestWrapper>
262
+ );
263
+
264
+ await screen.findByText('Feature content');
265
+ const articleElement = document.querySelector('article');
266
+ expect(articleElement).toBeInTheDocument();
267
+ expect(articleElement).toHaveStyle({
268
+ backgroundColor: '#f5f5f5',
269
+ color: '#333333'
270
+ });
271
+ });
272
+
273
+ it('shows loading state while data is loading', () => {
274
+ render(
275
+ <TestWrapper dataProvider={dataProvider}>
276
+ <Section dataSource="sections.nonexistent" />
277
+ </TestWrapper>
278
+ );
279
+
280
+ expect(screen.getByText('Loading Section...')).toBeInTheDocument();
281
+ });
282
+
283
+ it('uses fallback props when dataSource has no content', async () => {
284
+ render(
285
+ <TestWrapper dataProvider={dataProvider}>
286
+ <Section
287
+ dataSource="nonexistent.section"
288
+ background="#f0f0f0"
289
+ padding="small"
290
+ >
291
+ <div>Fallback content</div>
292
+ </Section>
293
+ </TestWrapper>
294
+ );
295
+
296
+ await screen.findByText('Fallback content');
297
+ const sectionElement = document.querySelector('section');
298
+ expect(sectionElement).toHaveStyle({
299
+ backgroundColor: '#f0f0f0'
300
+ });
301
+ });
302
+
303
+ it('handles minimal sections', async () => {
304
+ render(
305
+ <TestWrapper dataProvider={dataProvider}>
306
+ <Section dataSource="sections.minimal">
307
+ <div>Minimal section</div>
308
+ </Section>
309
+ </TestWrapper>
310
+ );
311
+
312
+ await screen.findByText('Minimal section');
313
+ // Should use small max width from data
314
+ });
315
+
316
+ it('handles gradient backgrounds from data', async () => {
317
+ render(
318
+ <TestWrapper dataProvider={dataProvider}>
319
+ <Section dataSource="sections.gradient">
320
+ <div>Gradient from data</div>
321
+ </Section>
322
+ </TestWrapper>
323
+ );
324
+
325
+ await screen.findByText('Gradient from data');
326
+ const mainElement = document.querySelector('main');
327
+ expect(mainElement).toBeInTheDocument();
328
+ expect(mainElement).toHaveStyle({
329
+ backgroundColor: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
330
+ color: '#ffffff'
331
+ });
332
+ });
333
+
334
+ it('works with custom binding options', async () => {
335
+ render(
336
+ <TestWrapper dataProvider={dataProvider}>
337
+ <Section
338
+ dataSource="sections.hero"
339
+ bindingOptions={{ cache: false, strict: true }}
340
+ >
341
+ <div>Custom binding</div>
342
+ </Section>
343
+ </TestWrapper>
344
+ );
345
+
346
+ await screen.findByText('Custom binding');
347
+ });
348
+
349
+ it('handles empty data from CMS', async () => {
350
+ render(
351
+ <TestWrapper dataProvider={dataProvider}>
352
+ <Section dataSource="sections.empty">
353
+ <div>Has children but empty CMS data</div>
354
+ </Section>
355
+ </TestWrapper>
356
+ );
357
+
358
+ await screen.findByText('Has children but empty CMS data');
359
+ });
360
+ });
361
+
362
+ describe.skip('Edge Cases', () => {
363
+ it('handles complex nested content', () => {
364
+ render(
365
+ <TestWrapper>
366
+ <Section background="#ffffff">
367
+ <div>
368
+ <h2>Nested Header</h2>
369
+ <p>Nested paragraph with <strong>bold text</strong></p>
370
+ <ul>
371
+ <li>List item 1</li>
372
+ <li>List item 2</li>
373
+ </ul>
374
+ </div>
375
+ </Section>
376
+ </TestWrapper>
377
+ );
378
+
379
+ expect(screen.getByText('Nested Header')).toBeInTheDocument();
380
+ expect(screen.getByText('bold text')).toBeInTheDocument();
381
+ expect(screen.getByText('List item 1')).toBeInTheDocument();
382
+ });
383
+
384
+ it('handles multiple sections', () => {
385
+ render(
386
+ <TestWrapper>
387
+ <div>
388
+ <Section background="#ff0000">
389
+ <div>Red section</div>
390
+ </Section>
391
+ <Section background="#00ff00">
392
+ <div>Green section</div>
393
+ </Section>
394
+ </div>
395
+ </TestWrapper>
396
+ );
397
+
398
+ expect(screen.getByText('Red section')).toBeInTheDocument();
399
+ expect(screen.getByText('Green section')).toBeInTheDocument();
400
+ });
401
+
402
+ it('preserves React component children', () => {
403
+ const CustomComponent = () => <div>Custom React Component</div>;
404
+
405
+ render(
406
+ <TestWrapper>
407
+ <Section>
408
+ <CustomComponent />
409
+ <div>Regular div</div>
410
+ </Section>
411
+ </TestWrapper>
412
+ );
413
+
414
+ expect(screen.getByText('Custom React Component')).toBeInTheDocument();
415
+ expect(screen.getByText('Regular div')).toBeInTheDocument();
416
+ });
417
+
418
+ it('handles undefined and null children gracefully', () => {
419
+ render(
420
+ <TestWrapper>
421
+ <Section>
422
+ {null}
423
+ {undefined}
424
+ <div>Valid content</div>
425
+ </Section>
426
+ </TestWrapper>
427
+ );
428
+
429
+ expect(screen.getByText('Valid content')).toBeInTheDocument();
430
+ });
431
+
432
+ it('supports custom CSS classes and styles', () => {
433
+ const { container } = render(
434
+ <TestWrapper>
435
+ <Section
436
+ className="custom-section"
437
+ sx={{ border: '1px solid red' }}
438
+ >
439
+ <div>Custom styled section</div>
440
+ </Section>
441
+ </TestWrapper>
442
+ );
443
+
444
+ const sectionElement = container.querySelector('section');
445
+ expect(sectionElement).toHaveClass('custom-section');
446
+ expect(screen.getByText('Custom styled section')).toBeInTheDocument();
447
+ });
448
+
449
+ it('handles very long content', () => {
450
+ const longContent = 'Lorem ipsum '.repeat(100);
451
+
452
+ render(
453
+ <TestWrapper>
454
+ <Section>
455
+ <p>{longContent}</p>
456
+ </Section>
457
+ </TestWrapper>
458
+ );
459
+
460
+ expect(screen.getByText(/Lorem ipsum/, { exact: false })).toBeInTheDocument();
461
+ });
462
+
463
+ it('works with all content max width variants', () => {
464
+ const widthVariants = ['xs', 'sm', 'md', 'lg', 'xl', false] as const;
465
+
466
+ widthVariants.forEach(width => {
467
+ const { container, unmount } = render(
468
+ <TestWrapper>
469
+ <Section contentMaxWidth={width}>
470
+ <div>{width || 'full'} width</div>
471
+ </Section>
472
+ </TestWrapper>
473
+ );
474
+
475
+ expect(screen.getByText(`${width || 'full'} width`)).toBeInTheDocument();
476
+ expect(container.querySelector('.MuiContainer-root')).toBeInTheDocument();
477
+
478
+ unmount();
479
+ });
480
+ });
481
+
482
+ it('handles special characters in content', () => {
483
+ render(
484
+ <TestWrapper>
485
+ <Section>
486
+ <div>Special chars: &lt;&gt;&amp;&quot;&apos;</div>
487
+ </Section>
488
+ </TestWrapper>
489
+ );
490
+
491
+ expect(screen.getByText(/Special chars:/, { exact: false })).toBeInTheDocument();
492
+ });
493
+ });
494
+ });