@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,456 @@
1
+ /**
2
+ * Unit tests for CoverImageHeader component
3
+ *
4
+ * Tests both traditional props usage and data binding functionality
5
+ * with the new schema system following the established Article pattern.
6
+ */
7
+
8
+ import React from 'react';
9
+ import { render, screen, fireEvent } from '@testing-library/react';
10
+ import '@testing-library/jest-dom';
11
+ import CoverImageHeader from '../blocks/CoverImageHeader';
12
+ import { JsonDataProvider } from '@qwickapps/schema';
13
+ import { QwickApp } from '../QwickApp';
14
+
15
+ // Test data for data binding (following nested structure pattern)
16
+ const sampleCmsData = {
17
+ 'coverImageHeaders': {
18
+ 'teamLead': {
19
+ image: '/images/john-avatar.jpg',
20
+ imageAlt: 'John Doe avatar',
21
+ imageSize: 'large',
22
+ imageShape: 'circle',
23
+ overline: 'TEAM LEAD',
24
+ title: 'John Doe',
25
+ subtitle: 'Senior Product Manager',
26
+ tags: ['Product', 'Leadership', 'Strategy'],
27
+ maxVisibleActions: 2,
28
+ variant: 'default'
29
+ },
30
+ 'companyProfile': {
31
+ overline: 'COMPANY',
32
+ title: 'TechCorp Solutions',
33
+ subtitle: 'Building the future of enterprise software',
34
+ variant: 'prominent',
35
+ background: '#1976d2'
36
+ },
37
+ 'projectShowcase': {
38
+ image: '/images/project-icon.png',
39
+ imageAlt: 'Project icon',
40
+ imageSize: 'medium',
41
+ imageShape: 'rounded',
42
+ title: 'Analytics Dashboard',
43
+ subtitle: 'Real-time data visualization platform',
44
+ tags: ['React', 'TypeScript', 'D3.js'],
45
+ variant: 'compact'
46
+ },
47
+ 'empty': {}
48
+ }
49
+ };
50
+
51
+ // Mock HeaderAction type
52
+ const mockActions = [
53
+ {
54
+ id: 'edit',
55
+ label: 'Edit',
56
+ priority: 1,
57
+ onClick: jest.fn(),
58
+ disabled: false,
59
+ destructive: false
60
+ },
61
+ {
62
+ id: 'share',
63
+ label: 'Share',
64
+ priority: 2,
65
+ onClick: jest.fn(),
66
+ disabled: false,
67
+ destructive: false
68
+ },
69
+ {
70
+ id: 'delete',
71
+ label: 'Delete',
72
+ priority: 3,
73
+ onClick: jest.fn(),
74
+ disabled: false,
75
+ destructive: true
76
+ }
77
+ ];
78
+
79
+ // Wrapper component for tests that need providers
80
+ const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
81
+ children,
82
+ dataProvider
83
+ }) => {
84
+ if (dataProvider) {
85
+ return (
86
+ <QwickApp appId="test-app" appName="Test App" dataSource={{ dataProvider }}>
87
+ {children}
88
+ </QwickApp>
89
+ );
90
+ }
91
+ return (
92
+ <QwickApp appId="test-app" appName="Test App">
93
+ {children}
94
+ </QwickApp>
95
+ );
96
+ };
97
+
98
+ describe('CoverImageHeader', () => {
99
+ describe('Traditional Props Usage', () => {
100
+ it('renders basic header with title only', () => {
101
+ render(
102
+ <TestWrapper>
103
+ <CoverImageHeader title="Basic Header" />
104
+ </TestWrapper>
105
+ );
106
+
107
+ expect(screen.getByText('Basic Header')).toBeInTheDocument();
108
+ expect(screen.getByRole('banner')).toBeInTheDocument();
109
+ });
110
+
111
+ it('renders full header with all props', () => {
112
+ render(
113
+ <TestWrapper>
114
+ <CoverImageHeader
115
+ image="/test-image.jpg"
116
+ imageAlt="Test image"
117
+ imageSize="large"
118
+ imageShape="circle"
119
+ overline="TEST OVERLINE"
120
+ title="Full Header"
121
+ subtitle="Complete header with all features"
122
+ tags={['React', 'TypeScript']}
123
+ actions={mockActions}
124
+ maxVisibleActions={2}
125
+ variant="prominent"
126
+ background="#1976d2"
127
+ />
128
+ </TestWrapper>
129
+ );
130
+
131
+ expect(screen.getByText('TEST OVERLINE')).toBeInTheDocument();
132
+ expect(screen.getByText('Full Header')).toBeInTheDocument();
133
+ expect(screen.getByText('Complete header with all features')).toBeInTheDocument();
134
+ expect(screen.getByText('React')).toBeInTheDocument();
135
+ expect(screen.getByText('TypeScript')).toBeInTheDocument();
136
+ expect(screen.getByText('Edit')).toBeInTheDocument();
137
+ expect(screen.getByText('Share')).toBeInTheDocument();
138
+ });
139
+
140
+ it('handles action button clicks', () => {
141
+ const handleClick = jest.fn();
142
+ const actionWithClick = [{
143
+ id: 'test',
144
+ label: 'Click Me',
145
+ priority: 1,
146
+ onClick: handleClick,
147
+ disabled: false,
148
+ destructive: false
149
+ }];
150
+
151
+ render(
152
+ <TestWrapper>
153
+ <CoverImageHeader
154
+ title="Action Test"
155
+ actions={actionWithClick}
156
+ />
157
+ </TestWrapper>
158
+ );
159
+
160
+ const button = screen.getByText('Click Me');
161
+ fireEvent.click(button);
162
+
163
+ expect(handleClick).toHaveBeenCalledTimes(1);
164
+ });
165
+
166
+ it('handles overflow actions with menu', () => {
167
+ const manyActions = Array.from({ length: 5 }, (_, i) => ({
168
+ id: `action-${i}`,
169
+ label: `Action ${i + 1}`,
170
+ priority: i + 1,
171
+ onClick: jest.fn(),
172
+ disabled: false,
173
+ destructive: false
174
+ }));
175
+
176
+ render(
177
+ <TestWrapper>
178
+ <CoverImageHeader
179
+ title="Overflow Test"
180
+ actions={manyActions}
181
+ maxVisibleActions={2}
182
+ />
183
+ </TestWrapper>
184
+ );
185
+
186
+ // First 2 actions should be visible
187
+ expect(screen.getByText('Action 1')).toBeInTheDocument();
188
+ expect(screen.getByText('Action 2')).toBeInTheDocument();
189
+
190
+ // Overflow menu button should be present
191
+ const menuButton = screen.getByLabelText('More actions');
192
+ expect(menuButton).toBeInTheDocument();
193
+
194
+ // Click to open menu
195
+ fireEvent.click(menuButton);
196
+
197
+ // Remaining actions should be in the menu
198
+ expect(screen.getByText('Action 3')).toBeInTheDocument();
199
+ expect(screen.getByText('Action 4')).toBeInTheDocument();
200
+ expect(screen.getByText('Action 5')).toBeInTheDocument();
201
+ });
202
+ });
203
+
204
+ describe('Data Binding Usage', () => {
205
+ let dataProvider: JsonDataProvider;
206
+
207
+ beforeEach(() => {
208
+ dataProvider = new JsonDataProvider({ data: sampleCmsData });
209
+ });
210
+
211
+ it('renders with dataSource prop (team lead)', async () => {
212
+ render(
213
+ <TestWrapper dataProvider={dataProvider}>
214
+ <CoverImageHeader dataSource="coverImageHeaders.teamLead" />
215
+ </TestWrapper>
216
+ );
217
+
218
+ await screen.findByText('John Doe');
219
+ expect(screen.getByText('TEAM LEAD')).toBeInTheDocument();
220
+ expect(screen.getByText('Senior Product Manager')).toBeInTheDocument();
221
+ expect(screen.getByText('Product')).toBeInTheDocument();
222
+ });
223
+
224
+ it('renders with dataSource prop (company)', async () => {
225
+ render(
226
+ <TestWrapper dataProvider={dataProvider}>
227
+ <CoverImageHeader dataSource="coverImageHeaders.companyProfile" />
228
+ </TestWrapper>
229
+ );
230
+
231
+ await screen.findByText('TechCorp Solutions');
232
+ expect(screen.getByText('COMPANY')).toBeInTheDocument();
233
+ expect(screen.getByText('Building the future of enterprise software')).toBeInTheDocument();
234
+ });
235
+
236
+ it('shows loading state while data is loading', () => {
237
+ render(
238
+ <TestWrapper dataProvider={dataProvider}>
239
+ <CoverImageHeader dataSource="coverImageHeaders.nonexistent" />
240
+ </TestWrapper>
241
+ );
242
+
243
+ expect(screen.getByText('Loading Cover Image Header...')).toBeInTheDocument();
244
+ expect(screen.getByText('Loading header content from data source...')).toBeInTheDocument();
245
+ });
246
+
247
+ it('uses fallback props when dataSource has no content', async () => {
248
+ render(
249
+ <TestWrapper dataProvider={dataProvider}>
250
+ <CoverImageHeader
251
+ dataSource="coverImageHeaders.empty"
252
+ title="Fallback Title"
253
+ subtitle="Fallback subtitle"
254
+ />
255
+ </TestWrapper>
256
+ );
257
+
258
+ await screen.findByText('Fallback Title');
259
+ expect(screen.getByText('Fallback subtitle')).toBeInTheDocument();
260
+ });
261
+
262
+ it('handles project header from data', async () => {
263
+ render(
264
+ <TestWrapper dataProvider={dataProvider}>
265
+ <CoverImageHeader dataSource="coverImageHeaders.projectShowcase" />
266
+ </TestWrapper>
267
+ );
268
+
269
+ await screen.findByText('Analytics Dashboard');
270
+ expect(screen.getByText('Real-time data visualization platform')).toBeInTheDocument();
271
+ expect(screen.getByText('React')).toBeInTheDocument();
272
+ });
273
+
274
+ it('works with custom binding options', async () => {
275
+ render(
276
+ <TestWrapper dataProvider={dataProvider}>
277
+ <CoverImageHeader
278
+ dataSource="coverImageHeaders.teamLead"
279
+ bindingOptions={{ cache: false, strict: true }}
280
+ />
281
+ </TestWrapper>
282
+ );
283
+
284
+ await screen.findByText('John Doe');
285
+ });
286
+
287
+ it('handles empty data from CMS', async () => {
288
+ render(
289
+ <TestWrapper dataProvider={dataProvider}>
290
+ <CoverImageHeader
291
+ dataSource="coverImageHeaders.empty"
292
+ title="Fallback for Empty Data"
293
+ />
294
+ </TestWrapper>
295
+ );
296
+
297
+ await screen.findByText('Fallback for Empty Data');
298
+ });
299
+ });
300
+
301
+ describe('Image Loading and Accessibility', () => {
302
+ it('sets proper alt text for images', () => {
303
+ render(
304
+ <TestWrapper>
305
+ <CoverImageHeader
306
+ title="Alt Text Test"
307
+ image="/test-image.jpg"
308
+ imageAlt="Test image description"
309
+ />
310
+ </TestWrapper>
311
+ );
312
+
313
+ const image = screen.getByAltText('Test image description');
314
+ expect(image).toBeInTheDocument();
315
+ });
316
+
317
+ it('handles missing alt text gracefully', () => {
318
+ render(
319
+ <TestWrapper>
320
+ <CoverImageHeader
321
+ title="Missing Alt Test"
322
+ image="/test-image.jpg"
323
+ />
324
+ </TestWrapper>
325
+ );
326
+
327
+ // Should still render image with empty alt text
328
+ const image = screen.getByAltText('');
329
+ expect(image).toBeInTheDocument();
330
+ });
331
+
332
+ it('maintains proper semantic structure', () => {
333
+ render(
334
+ <TestWrapper>
335
+ <CoverImageHeader
336
+ title="Semantic Test"
337
+ subtitle="Testing semantic HTML structure"
338
+ />
339
+ </TestWrapper>
340
+ );
341
+
342
+ // Should render as header element
343
+ const header = screen.getByRole('banner');
344
+ expect(header).toBeInTheDocument();
345
+
346
+ // Title should be in h1 element
347
+ const heading = screen.getByRole('heading', { level: 1 });
348
+ expect(heading).toHaveTextContent('Semantic Test');
349
+ });
350
+
351
+ it('maintains accessibility with keyboard navigation', () => {
352
+ const handleClick = jest.fn();
353
+ const actionWithClick = [{
354
+ id: 'keyboard-test',
355
+ label: 'Keyboard Action',
356
+ priority: 1,
357
+ onClick: handleClick,
358
+ disabled: false,
359
+ destructive: false
360
+ }];
361
+
362
+ render(
363
+ <TestWrapper>
364
+ <CoverImageHeader
365
+ title="Keyboard Navigation Test"
366
+ actions={actionWithClick}
367
+ />
368
+ </TestWrapper>
369
+ );
370
+
371
+ const button = screen.getByText('Keyboard Action');
372
+ expect(button).toBeInTheDocument();
373
+
374
+ // Button should be focusable
375
+ button.focus();
376
+ expect(button).toHaveFocus();
377
+ });
378
+
379
+ it('provides proper ARIA labels for interactive elements', () => {
380
+ const manyActions = Array.from({ length: 3 }, (_, i) => ({
381
+ id: `action-${i}`,
382
+ label: `Action ${i + 1}`,
383
+ priority: i + 1,
384
+ onClick: jest.fn(),
385
+ disabled: false,
386
+ destructive: false
387
+ }));
388
+
389
+ render(
390
+ <TestWrapper>
391
+ <CoverImageHeader
392
+ title="ARIA Test"
393
+ actions={manyActions}
394
+ maxVisibleActions={1}
395
+ />
396
+ </TestWrapper>
397
+ );
398
+
399
+ // Overflow menu button should have proper aria-label
400
+ const menuButton = screen.getByLabelText('More actions');
401
+ expect(menuButton).toBeInTheDocument();
402
+ });
403
+ });
404
+
405
+ describe('Edge Cases', () => {
406
+ it('handles empty tags array', () => {
407
+ render(
408
+ <TestWrapper>
409
+ <CoverImageHeader
410
+ title="Empty Tags"
411
+ tags={[]}
412
+ />
413
+ </TestWrapper>
414
+ );
415
+
416
+ expect(screen.getByText('Empty Tags')).toBeInTheDocument();
417
+ });
418
+
419
+ it('handles empty actions array', () => {
420
+ render(
421
+ <TestWrapper>
422
+ <CoverImageHeader
423
+ title="Empty Actions"
424
+ actions={[]}
425
+ />
426
+ </TestWrapper>
427
+ );
428
+
429
+ expect(screen.getByText('Empty Actions')).toBeInTheDocument();
430
+ });
431
+
432
+ it('handles custom CSS classes and styles', () => {
433
+ const { container } = render(
434
+ <TestWrapper>
435
+ <CoverImageHeader
436
+ title="Custom Styled"
437
+ className="custom-header"
438
+ sx={{ border: '1px solid red' }}
439
+ />
440
+ </TestWrapper>
441
+ );
442
+
443
+ expect(screen.getByText('Custom Styled')).toBeInTheDocument();
444
+ });
445
+
446
+ it('renders without optional props', () => {
447
+ render(
448
+ <TestWrapper>
449
+ <CoverImageHeader title="Minimal Props" />
450
+ </TestWrapper>
451
+ );
452
+
453
+ expect(screen.getByText('Minimal Props')).toBeInTheDocument();
454
+ });
455
+ });
456
+ });