@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,419 @@
1
+ /**
2
+ * Unit tests for Article 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 { Article } from '../blocks/Article';
12
+ import { DataProvider } from '../../contexts/DataContext';
13
+ import { JsonDataProvider } from '@qwickapps/schema';
14
+ import { ThemeProvider, PaletteProvider } from '../../contexts';
15
+
16
+ // Sample HTML content for testing
17
+ const sampleSimpleHtml = `
18
+ <p>This is a simple paragraph.</p>
19
+ <h2>Simple Heading</h2>
20
+ <ul>
21
+ <li>First item</li>
22
+ <li>Second item</li>
23
+ </ul>
24
+ `;
25
+
26
+ const sampleCodeHtml = `
27
+ <h1>Code Examples</h1>
28
+ <p>Here's some JavaScript:</p>
29
+ <pre><code class="language-javascript">function greet(name) {
30
+ return \`Hello, \${name}!\`;
31
+ }</code></pre>
32
+ <p>And a simple inline code: <code>console.log('test')</code></p>
33
+ `;
34
+
35
+ const sampleComplexHtml = `
36
+ <header class="blog-header">
37
+ <h1>Blog Title (Should be removed)</h1>
38
+ </header>
39
+ <section class="blog-section" data-padding="large">
40
+ <h2>Section Title</h2>
41
+ <p>Section content with <strong>bold text</strong>.</p>
42
+ <pre><code class="language-python">def hello():
43
+ print("Hello World")</code></pre>
44
+ </section>
45
+ <p>Regular paragraph after section.</p>
46
+ `;
47
+
48
+ const sampleBlogHtml = `
49
+ <h1>Article Title</h1>
50
+ <p>This is the introduction paragraph.</p>
51
+ <h2>Main Section</h2>
52
+ <p>Content with <a href="https://example.com">link</a>.</p>
53
+ <section class="blog-section">
54
+ <h2>Special Section</h2>
55
+ <p>This will be transformed to use Section component.</p>
56
+ </section>
57
+ `;
58
+
59
+ // Test data for data binding
60
+ const sampleCmsData = {
61
+ 'articles.simple': [{
62
+ html: sampleSimpleHtml,
63
+ skipHeader: false
64
+ }],
65
+ 'articles.with-code': [{
66
+ html: sampleCodeHtml,
67
+ skipHeader: false
68
+ }],
69
+ 'articles.complex': [{
70
+ html: sampleComplexHtml,
71
+ skipHeader: true
72
+ }],
73
+ 'articles.blog-post': [{
74
+ html: sampleBlogHtml,
75
+ skipHeader: true
76
+ }],
77
+ 'articles.empty': [{
78
+ html: '',
79
+ skipHeader: false
80
+ }]
81
+ };
82
+
83
+ // Wrapper component for tests that need providers
84
+ const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
85
+ children,
86
+ dataProvider
87
+ }) => (
88
+ <ThemeProvider>
89
+ <PaletteProvider>
90
+ {dataProvider ? (
91
+ <DataProvider dataSource={dataProvider}>
92
+ {children}
93
+ </DataProvider>
94
+ ) : (
95
+ children
96
+ )}
97
+ </PaletteProvider>
98
+ </ThemeProvider>
99
+ );
100
+
101
+ describe.skip('Article', () => {
102
+ describe('Traditional Props Usage', () => {
103
+ it('renders simple HTML content', () => {
104
+ render(
105
+ <TestWrapper>
106
+ <Article html={sampleSimpleHtml} />
107
+ </TestWrapper>
108
+ );
109
+
110
+ expect(screen.getByText('This is a simple paragraph.')).toBeInTheDocument();
111
+ expect(screen.getByText('Simple Heading')).toBeInTheDocument();
112
+ expect(screen.getByText('First item')).toBeInTheDocument();
113
+ expect(screen.getByText('Second item')).toBeInTheDocument();
114
+ });
115
+
116
+ it('transforms code blocks to Code components', () => {
117
+ render(
118
+ <TestWrapper>
119
+ <Article html={sampleCodeHtml} />
120
+ </TestWrapper>
121
+ );
122
+
123
+ expect(screen.getByText('Code Examples')).toBeInTheDocument();
124
+ expect(screen.getByText('Here\'s some JavaScript:')).toBeInTheDocument();
125
+
126
+ // The code should be transformed to Code component
127
+ expect(screen.getByText(/function greet\(name\)/)).toBeInTheDocument();
128
+ expect(screen.getByText(/return `Hello, \${name}!`;/)).toBeInTheDocument();
129
+ });
130
+
131
+ it('transforms blog sections to Section components', () => {
132
+ render(
133
+ <TestWrapper>
134
+ <Article html={sampleComplexHtml} />
135
+ </TestWrapper>
136
+ );
137
+
138
+ expect(screen.getByText('Section Title')).toBeInTheDocument();
139
+ expect(screen.getByText(/Section content with/)).toBeInTheDocument();
140
+ expect(screen.getByText(/def hello/)).toBeInTheDocument();
141
+ expect(screen.getByText('Regular paragraph after section.')).toBeInTheDocument();
142
+ });
143
+
144
+ it('skips header elements when skipHeader is true', () => {
145
+ render(
146
+ <TestWrapper>
147
+ <Article html={sampleComplexHtml} skipHeader={true} />
148
+ </TestWrapper>
149
+ );
150
+
151
+ // Blog header should be removed
152
+ expect(screen.queryByText('Blog Title (Should be removed)')).not.toBeInTheDocument();
153
+
154
+ // Section content should still be there
155
+ expect(screen.getByText('Section Title')).toBeInTheDocument();
156
+ });
157
+
158
+ it('preserves header elements when skipHeader is false', () => {
159
+ render(
160
+ <TestWrapper>
161
+ <Article html={sampleBlogHtml} skipHeader={false} />
162
+ </TestWrapper>
163
+ );
164
+
165
+ expect(screen.getByText('Article Title')).toBeInTheDocument();
166
+ expect(screen.getByText('This is the introduction paragraph.')).toBeInTheDocument();
167
+ });
168
+
169
+ it('removes first h1 when skipHeader is true', () => {
170
+ render(
171
+ <TestWrapper>
172
+ <Article html={sampleBlogHtml} skipHeader={true} />
173
+ </TestWrapper>
174
+ );
175
+
176
+ // First H1 should be removed
177
+ expect(screen.queryByText('Article Title')).not.toBeInTheDocument();
178
+
179
+ // Other content should remain
180
+ expect(screen.getByText('This is the introduction paragraph.')).toBeInTheDocument();
181
+ expect(screen.getByText('Main Section')).toBeInTheDocument();
182
+ });
183
+
184
+ it('shows empty state when no HTML content', () => {
185
+ render(
186
+ <TestWrapper>
187
+ <Article html="" />
188
+ </TestWrapper>
189
+ );
190
+
191
+ expect(screen.getByText('No Content Available')).toBeInTheDocument();
192
+ expect(screen.getByText('No HTML content provided for this article')).toBeInTheDocument();
193
+ });
194
+
195
+ it('handles missing html prop gracefully', () => {
196
+ render(
197
+ <TestWrapper>
198
+ <Article />
199
+ </TestWrapper>
200
+ );
201
+
202
+ expect(screen.getByText('No Content Available')).toBeInTheDocument();
203
+ });
204
+
205
+ it('preserves HTML attributes and structure', () => {
206
+ const htmlWithAttributes = '<div id="test-content" class="custom-class"><p data-attr="value">Content</p></div>';
207
+
208
+ const { container } = render(
209
+ <TestWrapper>
210
+ <Article html={htmlWithAttributes} />
211
+ </TestWrapper>
212
+ );
213
+
214
+ // Should preserve the div with its attributes
215
+ expect(container.querySelector('#test-content')).toBeInTheDocument();
216
+ expect(container.querySelector('.custom-class')).toBeInTheDocument();
217
+ expect(screen.getByText('Content')).toBeInTheDocument();
218
+
219
+ // Note: data attributes might be transformed by React/SafeSpan
220
+ // Let's just check that the content is rendered properly
221
+ });
222
+ });
223
+
224
+ describe.skip('Data Binding Usage', () => {
225
+ let dataProvider: JsonDataProvider;
226
+
227
+ beforeEach(() => {
228
+ dataProvider = new JsonDataProvider({ data: sampleCmsData });
229
+ });
230
+
231
+ it('renders with dataSource prop (simple content)', async () => {
232
+ render(
233
+ <TestWrapper dataProvider={dataProvider}>
234
+ <Article dataSource="articles.simple" />
235
+ </TestWrapper>
236
+ );
237
+
238
+ await screen.findByText('This is a simple paragraph.');
239
+ expect(screen.getByText('Simple Heading')).toBeInTheDocument();
240
+ });
241
+
242
+ it('renders with dataSource prop (code content)', async () => {
243
+ render(
244
+ <TestWrapper dataProvider={dataProvider}>
245
+ <Article dataSource="articles.with-code" />
246
+ </TestWrapper>
247
+ );
248
+
249
+ await screen.findByText('Code Examples');
250
+ expect(screen.getByText(/function greet\(name\)/)).toBeInTheDocument();
251
+ });
252
+
253
+ it('shows loading state while data is loading', () => {
254
+ render(
255
+ <TestWrapper dataProvider={dataProvider}>
256
+ <Article dataSource="articles.nonexistent" />
257
+ </TestWrapper>
258
+ );
259
+
260
+ expect(screen.getByText('Loading Article...')).toBeInTheDocument();
261
+ expect(screen.getByText('Loading')).toBeInTheDocument();
262
+ });
263
+
264
+ it('uses fallback props when dataSource has no content', async () => {
265
+ render(
266
+ <TestWrapper dataProvider={dataProvider}>
267
+ <Article
268
+ dataSource="articles.nonexistent-key"
269
+ html={sampleSimpleHtml}
270
+ />
271
+ </TestWrapper>
272
+ );
273
+
274
+ // Should eventually show the fallback content
275
+ await screen.findByText('This is a simple paragraph.');
276
+ });
277
+
278
+ it('handles skipHeader from data binding', async () => {
279
+ render(
280
+ <TestWrapper dataProvider={dataProvider}>
281
+ <Article dataSource="articles.complex" />
282
+ </TestWrapper>
283
+ );
284
+
285
+ // Should load with skipHeader: true from data
286
+ await screen.findByText('Section Title');
287
+
288
+ // Header should be removed due to skipHeader: true
289
+ expect(screen.queryByText('Blog Title (Should be removed)')).not.toBeInTheDocument();
290
+ });
291
+
292
+ it('works with custom binding options', async () => {
293
+ render(
294
+ <TestWrapper dataProvider={dataProvider}>
295
+ <Article
296
+ dataSource="articles.simple"
297
+ bindingOptions={{ cache: false, strict: true }}
298
+ />
299
+ </TestWrapper>
300
+ );
301
+
302
+ await screen.findByText('This is a simple paragraph.');
303
+ });
304
+ });
305
+
306
+ describe('Edge Cases', () => {
307
+ it('handles malformed HTML gracefully', () => {
308
+ const malformedHtml = '<p>Unclosed paragraph <div><span>Nested content</div>';
309
+
310
+ render(
311
+ <TestWrapper>
312
+ <Article html={malformedHtml} />
313
+ </TestWrapper>
314
+ );
315
+
316
+ // Should render without crashing
317
+ expect(screen.getByText(/Unclosed paragraph/)).toBeInTheDocument();
318
+ });
319
+
320
+ it('handles HTML with only whitespace', () => {
321
+ render(
322
+ <TestWrapper>
323
+ <Article html=" \n \t " />
324
+ </TestWrapper>
325
+ );
326
+
327
+ // Article should render but might be empty due to whitespace handling
328
+ // Let's just verify it doesn't crash
329
+ expect(screen.getByRole('article')).toBeInTheDocument();
330
+ });
331
+
332
+ it('handles nested code blocks correctly', () => {
333
+ const nestedCodeHtml = `
334
+ <div>
335
+ <p>Here's a code example:</p>
336
+ <pre><code class="language-html">&lt;div&gt;&lt;code&gt;nested&lt;/code&gt;&lt;/div&gt;</code></pre>
337
+ </div>
338
+ `;
339
+
340
+ render(
341
+ <TestWrapper>
342
+ <Article html={nestedCodeHtml} />
343
+ </TestWrapper>
344
+ );
345
+
346
+ expect(screen.getByText('Here\'s a code example:')).toBeInTheDocument();
347
+ // The nested code should be preserved in the Code component
348
+ expect(screen.getByText(/<div><code>nested<\/code><\/div>/)).toBeInTheDocument();
349
+ });
350
+
351
+ it('handles multiple blog sections', () => {
352
+ const multipleSectionsHtml = `
353
+ <section class="blog-section">
354
+ <h2>First Section</h2>
355
+ <p>First content</p>
356
+ </section>
357
+ <section class="blog-section">
358
+ <h2>Second Section</h2>
359
+ <p>Second content</p>
360
+ </section>
361
+ `;
362
+
363
+ render(
364
+ <TestWrapper>
365
+ <Article html={multipleSectionsHtml} />
366
+ </TestWrapper>
367
+ );
368
+
369
+ expect(screen.getByText('First Section')).toBeInTheDocument();
370
+ expect(screen.getByText('First content')).toBeInTheDocument();
371
+ expect(screen.getByText('Second Section')).toBeInTheDocument();
372
+ expect(screen.getByText('Second content')).toBeInTheDocument();
373
+ });
374
+
375
+ it('handles inline code within paragraphs correctly', () => {
376
+ const inlineCodeHtml = '<p>Use <code>console.log()</code> for debugging and <code>alert()</code> for notifications.</p>';
377
+
378
+ render(
379
+ <TestWrapper>
380
+ <Article html={inlineCodeHtml} />
381
+ </TestWrapper>
382
+ );
383
+
384
+ // Inline code should not be transformed to Code component
385
+ expect(screen.getByText(/Use.*for debugging and.*for notifications/)).toBeInTheDocument();
386
+ });
387
+
388
+ it('preserves complex HTML structure', () => {
389
+ const complexStructure = `
390
+ <div class="container">
391
+ <article>
392
+ <h1>Title</h1>
393
+ <div class="meta">
394
+ <span class="author">Author</span>
395
+ <time datetime="2023-01-01">2023-01-01</time>
396
+ </div>
397
+ <div class="content">
398
+ <p>Content paragraph</p>
399
+ </div>
400
+ </article>
401
+ </div>
402
+ `;
403
+
404
+ const { container } = render(
405
+ <TestWrapper>
406
+ <Article html={complexStructure} />
407
+ </TestWrapper>
408
+ );
409
+
410
+ expect(screen.getByText('Title')).toBeInTheDocument();
411
+ expect(screen.getByText('Author')).toBeInTheDocument();
412
+ expect(screen.getByText('Content paragraph')).toBeInTheDocument();
413
+ expect(screen.getByText('2023-01-01')).toBeInTheDocument();
414
+
415
+ // Basic structure should be preserved
416
+ expect(container.querySelector('.container')).toBeInTheDocument();
417
+ });
418
+ });
419
+ });