@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,283 @@
1
+ /**
2
+ * ThemeSwitcher - Theme selection control component
3
+ *
4
+ * Provides consistent theme switching with:
5
+ * - Light/dark/system theme options
6
+ * - Accessible menu interface
7
+ * - Current theme indication
8
+ * - Configurable appearance
9
+ * - Responsive design
10
+ *
11
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
12
+ */
13
+
14
+ import {
15
+ IconButton,
16
+ ListItemIcon,
17
+ ListItemText,
18
+ Menu,
19
+ MenuItem,
20
+ Paper,
21
+ Tooltip,
22
+ Typography
23
+ } from '@mui/material';
24
+ import {
25
+ DarkMode as DarkModeIcon,
26
+ LightMode as LightModeIcon,
27
+ SettingsSystemDaydream as SystemIcon
28
+ } from '@mui/icons-material';
29
+ import type { WithDataBinding, ModelProps } from '@qwickapps/schema';
30
+ import { useState } from 'react';
31
+ import { useTheme } from '../../contexts/ThemeContext';
32
+ import { QWICKAPP_COMPONENT, useBaseProps } from '../../hooks';
33
+ import { useDataBinding } from '../../hooks';
34
+ import ThemeSwitcherModel from '../../schemas/ThemeSwitcherSchema';
35
+ import type { ThemeMode } from '../../utils/themeUtils';
36
+
37
+ type ThemeSwitcherViewProps = ModelProps<ThemeSwitcherModel>;
38
+
39
+ export interface ThemeSwitcherProps extends ThemeSwitcherViewProps, WithDataBinding {}
40
+
41
+ // View component - handles the actual rendering
42
+ function ThemeSwitcherView({
43
+ disabled = false,
44
+ size = 'medium',
45
+ tooltipText,
46
+ showTooltip = true,
47
+ menuPosition = 'bottom',
48
+ showLightTheme = true,
49
+ showDarkTheme = true,
50
+ showSystemTheme = true,
51
+ ...restProps
52
+ }: ThemeSwitcherViewProps) {
53
+ const { styleProps, htmlProps } = useBaseProps(restProps);
54
+ const { currentTheme, actualThemeMode, setPreferredTheme } = useTheme();
55
+ const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
56
+ const open = Boolean(anchorEl);
57
+
58
+ const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
59
+ if (disabled) return;
60
+ setAnchorEl(event.currentTarget);
61
+ };
62
+
63
+ const handleClose = () => {
64
+ setAnchorEl(null);
65
+ };
66
+
67
+ const handleThemeSelect = (newTheme: ThemeMode) => {
68
+ if (disabled) return;
69
+ setPreferredTheme(newTheme);
70
+ handleClose();
71
+ };
72
+
73
+ const getCurrentIcon = (): React.ReactNode => {
74
+ switch (actualThemeMode) {
75
+ case 'dark':
76
+ return <DarkModeIcon />;
77
+ case 'light':
78
+ return <LightModeIcon />;
79
+ default:
80
+ return <LightModeIcon />;
81
+ }
82
+ };
83
+
84
+ const getTooltipText = (): string => {
85
+ if (tooltipText) return tooltipText;
86
+
87
+ if (disabled) return 'Theme switcher disabled';
88
+
89
+ const modeText = currentTheme === 'system'
90
+ ? `System (${actualThemeMode})`
91
+ : currentTheme.charAt(0).toUpperCase() + currentTheme.slice(1);
92
+ return `Current theme: ${modeText}`;
93
+ };
94
+
95
+ const getMenuAnchorOrigin = () => {
96
+ switch (menuPosition) {
97
+ case 'top':
98
+ return { vertical: 'top' as const, horizontal: 'right' as const };
99
+ case 'left':
100
+ return { vertical: 'bottom' as const, horizontal: 'left' as const };
101
+ case 'right':
102
+ return { vertical: 'bottom' as const, horizontal: 'right' as const };
103
+ default: // bottom
104
+ return { vertical: 'bottom' as const, horizontal: 'right' as const };
105
+ }
106
+ };
107
+
108
+ const getMenuTransformOrigin = () => {
109
+ switch (menuPosition) {
110
+ case 'top':
111
+ return { vertical: 'bottom' as const, horizontal: 'right' as const };
112
+ case 'left':
113
+ return { vertical: 'top' as const, horizontal: 'right' as const };
114
+ case 'right':
115
+ return { vertical: 'top' as const, horizontal: 'left' as const };
116
+ default: // bottom
117
+ return { vertical: 'top' as const, horizontal: 'right' as const };
118
+ }
119
+ };
120
+
121
+ // If no theme options are enabled, show error in development
122
+ if (!showLightTheme && !showDarkTheme && !showSystemTheme) {
123
+ if (process.env.NODE_ENV !== 'production') {
124
+ return (
125
+ <Paper
126
+ variant="outlined"
127
+ sx={{
128
+ p: 2,
129
+ textAlign: 'center',
130
+ borderColor: 'error.main'
131
+ }}
132
+ >
133
+ <Typography variant="body2" color="error">
134
+ Error: No theme options enabled
135
+ </Typography>
136
+ </Paper>
137
+ );
138
+ }
139
+ return null;
140
+ }
141
+
142
+ const themeSwitcher = (
143
+ <>
144
+ <IconButton
145
+ {...htmlProps}
146
+ onClick={handleClick}
147
+ disabled={disabled}
148
+ size={size}
149
+ aria-label="theme switcher"
150
+ aria-controls={open ? 'theme-menu' : undefined}
151
+ aria-haspopup="true"
152
+ aria-expanded={open ? 'true' : undefined}
153
+ sx={{
154
+ color: 'var(--theme-on-surface, inherit)',
155
+ '&:hover': {
156
+ backgroundColor: 'var(--menu-hover, rgba(0, 0, 0, 0.04))',
157
+ },
158
+ '&:disabled': {
159
+ color: 'var(--theme-disabled, rgba(0, 0, 0, 0.26))',
160
+ },
161
+ ...styleProps.sx
162
+ }}
163
+ className={styleProps.className}
164
+ >
165
+ {getCurrentIcon()}
166
+ </IconButton>
167
+
168
+ <Menu
169
+ id="theme-menu"
170
+ anchorEl={anchorEl}
171
+ open={open}
172
+ onClose={handleClose}
173
+ slotProps={{
174
+ paper: {
175
+ 'aria-labelledby': 'theme-button',
176
+ },
177
+ }}
178
+ anchorOrigin={getMenuAnchorOrigin()}
179
+ transformOrigin={getMenuTransformOrigin()}
180
+ >
181
+ {showLightTheme && (
182
+ <MenuItem
183
+ onClick={() => handleThemeSelect('light')}
184
+ selected={currentTheme === 'light'}
185
+ >
186
+ <ListItemIcon>
187
+ <LightModeIcon fontSize="small" />
188
+ </ListItemIcon>
189
+ <ListItemText>Light</ListItemText>
190
+ </MenuItem>
191
+ )}
192
+
193
+ {showDarkTheme && (
194
+ <MenuItem
195
+ onClick={() => handleThemeSelect('dark')}
196
+ selected={currentTheme === 'dark'}
197
+ >
198
+ <ListItemIcon>
199
+ <DarkModeIcon fontSize="small" />
200
+ </ListItemIcon>
201
+ <ListItemText>Dark</ListItemText>
202
+ </MenuItem>
203
+ )}
204
+
205
+ {showSystemTheme && (
206
+ <MenuItem
207
+ onClick={() => handleThemeSelect('system')}
208
+ selected={currentTheme === 'system'}
209
+ >
210
+ <ListItemIcon>
211
+ <SystemIcon fontSize="small" />
212
+ </ListItemIcon>
213
+ <ListItemText>System</ListItemText>
214
+ </MenuItem>
215
+ )}
216
+ </Menu>
217
+ </>
218
+ );
219
+
220
+ return showTooltip ? (
221
+ <Tooltip title={getTooltipText()}>
222
+ {themeSwitcher}
223
+ </Tooltip>
224
+ ) : themeSwitcher;
225
+ }
226
+
227
+ /**
228
+ * ThemeSwitcher component with data binding support
229
+ * Supports both traditional props and dataSource-driven rendering
230
+ */
231
+ function ThemeSwitcher(props: ThemeSwitcherProps) {
232
+ const { dataSource, bindingOptions, ...restProps } = props;
233
+
234
+ // If no dataSource, use traditional props
235
+ if (!dataSource) {
236
+ return <ThemeSwitcherView {...restProps} />;
237
+ }
238
+
239
+ // Use data binding
240
+ const { dataSource: _source, loading, error, cached, ...themeSwitcherProps } = useDataBinding<ThemeSwitcherModel>(
241
+ dataSource,
242
+ restProps as Partial<ThemeSwitcherModel>,
243
+ ThemeSwitcherModel.getSchema(),
244
+ { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
245
+ );
246
+
247
+ // Show loading state
248
+ if (loading) {
249
+ return (
250
+ <IconButton disabled size="medium">
251
+ <LightModeIcon />
252
+ </IconButton>
253
+ );
254
+ }
255
+
256
+ if (error) {
257
+ console.error('Error loading theme switcher:', error);
258
+ if (process.env.NODE_ENV !== 'production') {
259
+ return (
260
+ <Paper
261
+ variant="outlined"
262
+ sx={{
263
+ p: 2,
264
+ textAlign: 'center',
265
+ borderColor: 'error.main'
266
+ }}
267
+ >
268
+ <Typography variant="body2" color="error">
269
+ Error loading theme switcher: {error.message}
270
+ </Typography>
271
+ </Paper>
272
+ );
273
+ }
274
+ return null;
275
+ }
276
+
277
+ return <ThemeSwitcherView {...themeSwitcherProps} />;
278
+ }
279
+
280
+ // Mark as QwickApp component
281
+ (ThemeSwitcher as any)[QWICKAPP_COMPONENT] = true;
282
+
283
+ export default ThemeSwitcher;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Button components for QwickApps React Framework
3
+ *
4
+ * Enhanced button components with QwickApps base props support
5
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
6
+ */
7
+ export { Button } from './Button';
8
+ export { default as ThemeSwitcher } from './ThemeSwitcher';
9
+ export { default as PaletteSwitcher } from './PaletteSwitcher';
10
+
11
+ export type { ButtonProps } from './Button';
@@ -0,0 +1,291 @@
1
+ /**
2
+ * FormBlock - Reusable form layout component
3
+ *
4
+ * Provides consistent layout for forms with:
5
+ * - Optional header section (logo, title, subtitle)
6
+ * - Form content area
7
+ * - Status message area (info, success, warning, error)
8
+ * - Optional footer section
9
+ * - Data binding support for dynamic content
10
+ * - Grid integration with useBaseProps
11
+ *
12
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
13
+ */
14
+
15
+ import {
16
+ Alert,
17
+ Box,
18
+ Card,
19
+ CardContent,
20
+ Container,
21
+ Paper,
22
+ Typography,
23
+ useTheme,
24
+ } from '@mui/material';
25
+ import type { ModelProps, WithDataBinding } from '@qwickapps/schema';
26
+ import React from 'react';
27
+ import { useQwickApp } from '../../contexts/QwickAppContext';
28
+ import { QWICKAPP_COMPONENT, useBaseProps, useDataBinding } from '../../hooks';
29
+ import FormBlockModel from '../../schemas/FormBlockSchema';
30
+ import CoverImageHeader from '../blocks/CoverImageHeader';
31
+ import Logo from '../Logo';
32
+
33
+ type FormBlockViewProps = ModelProps<FormBlockModel> & {
34
+ /**
35
+ * Custom header content - when provided, overrides the default header
36
+ * For full customization control
37
+ */
38
+ header?: React.ReactNode;
39
+
40
+ /**
41
+ * Cover image URL or React element for the default header (ignored if custom header is provided)
42
+ * If not provided, will use Logo component with app name
43
+ */
44
+ coverImage?: string | React.ReactNode;
45
+
46
+ /**
47
+ * Form content
48
+ */
49
+ form?: React.ReactNode;
50
+
51
+ /**
52
+ * Footer content (links, additional text, etc.)
53
+ */
54
+ footer?: React.ReactNode;
55
+ };
56
+
57
+ export interface FormBlockProps extends FormBlockViewProps, WithDataBinding { }
58
+
59
+ /**
60
+ * Default header component that uses CoverImageHeader and Logo
61
+ */
62
+ const DefaultHeader: React.FC<{
63
+ title?: string;
64
+ subtitle?: string;
65
+ coverImage?: string | React.ReactNode;
66
+ }> = ({
67
+ title,
68
+ subtitle,
69
+ coverImage
70
+ }) => {
71
+ const { appName } = useQwickApp();
72
+
73
+ // Create image element - either coverImage (URL or React element) or Logo component
74
+ const image = coverImage ? (
75
+ coverImage
76
+ ) : (
77
+ <Logo
78
+ name={appName || 'Qwick Apps'}
79
+ size="medium"
80
+ variant="default"
81
+ />
82
+ );
83
+
84
+ return (
85
+ <CoverImageHeader
86
+ image={image}
87
+ imageSize="medium"
88
+ imageShape="square"
89
+ title={title || 'Welcome'}
90
+ subtitle={subtitle}
91
+ variant="default"
92
+ />
93
+ );
94
+ };
95
+
96
+ // View component - handles the actual rendering
97
+ function FormBlockView({
98
+ header,
99
+ title,
100
+ description,
101
+ coverImage,
102
+ form,
103
+ footer,
104
+ status,
105
+ message,
106
+ maxWidth = 'sm',
107
+ background = '--theme-surface',
108
+ backgroundImage,
109
+ ...restProps
110
+ }: FormBlockViewProps) {
111
+ const { styleProps, htmlProps } = useBaseProps(restProps);
112
+ const theme = useTheme();
113
+
114
+ // Return empty state if no form content
115
+ if (!form) {
116
+ return (
117
+ <Paper
118
+ {...htmlProps}
119
+ {...styleProps}
120
+ variant="outlined"
121
+ sx={{
122
+ p: 3,
123
+ textAlign: 'center',
124
+ opacity: 0.6,
125
+ ...styleProps.sx
126
+ }}
127
+ >
128
+ <Typography variant="body2" color="text.secondary">
129
+ No form content provided
130
+ </Typography>
131
+ </Paper>
132
+ );
133
+ }
134
+
135
+ const getBackgroundStyle = () => {
136
+ switch (background) {
137
+ case 'gradient':
138
+ return {
139
+ background: `linear-gradient(135deg, ${theme.palette.primary.main} 0%, ${theme.palette.secondary.main} 100%)`,
140
+ };
141
+ case 'image':
142
+ return backgroundImage ? {
143
+ backgroundImage: `linear-gradient(${theme.palette.action.hover}, ${theme.palette.action.hover}), url(${backgroundImage})`,
144
+ backgroundSize: 'cover',
145
+ backgroundPosition: 'center',
146
+ backgroundRepeat: 'no-repeat',
147
+ } : {};
148
+ default:
149
+ return {
150
+ backgroundColor: theme.palette.background.default,
151
+ };
152
+ }
153
+ };
154
+
155
+ return (
156
+ <Box
157
+ {...htmlProps}
158
+ {...styleProps}
159
+ className={`${styleProps.className || ''}`}
160
+ sx={{
161
+ minHeight: '100vh',
162
+ display: 'flex',
163
+ alignItems: 'center',
164
+ justifyContent: 'center',
165
+ py: 3,
166
+ ...getBackgroundStyle(),
167
+ ...styleProps.sx,
168
+ }}
169
+ >
170
+ <Container maxWidth={maxWidth}>
171
+ <Card
172
+ elevation={background === 'default' ? 1 : 8}
173
+ sx={{
174
+ borderRadius: 3,
175
+ overflow: 'hidden', // Changed from 'visible' to 'hidden' to clip the corners
176
+ backgroundColor: background === 'default'
177
+ ? theme.palette.background.paper
178
+ : theme.palette.mode === 'dark'
179
+ ? 'rgba(18, 18, 18, 0.95)' // Dark mode background with transparency
180
+ : 'rgba(255, 255, 255, 0.95)', // Light mode background with transparency
181
+ backdropFilter: background !== 'default' ? 'blur(10px)' : 'none',
182
+ }}
183
+ >
184
+ {/* Header Section - Outside CardContent for edge-to-edge */}
185
+ {header || (title || description) ? (
186
+ header || (
187
+ <DefaultHeader
188
+ title={title}
189
+ subtitle={description}
190
+ coverImage={coverImage}
191
+ />
192
+ )
193
+ ) : null}
194
+
195
+ <CardContent sx={{ p: { xs: 3, sm: 4, md: 5 } }}>
196
+
197
+ {/* Status Message */}
198
+ {status && message && (
199
+ <Alert
200
+ severity={status}
201
+ sx={{ mb: 3 }}
202
+ variant="outlined"
203
+ >
204
+ {message}
205
+ </Alert>
206
+ )}
207
+
208
+ {/* Form Section */}
209
+ <Box sx={{ mb: footer ? 3 : 0 }}>
210
+ {form}
211
+ </Box>
212
+
213
+ {/* Footer Section */}
214
+ {footer && (
215
+ <Box sx={{ textAlign: 'center' }}>
216
+ {footer}
217
+ </Box>
218
+ )}
219
+ </CardContent>
220
+ </Card>
221
+ </Container>
222
+ </Box>
223
+ );
224
+ }
225
+
226
+ /**
227
+ * FormBlock component with data binding support
228
+ * Supports both traditional props and dataSource-driven rendering
229
+ */
230
+ function FormBlock(props: FormBlockProps) {
231
+ const { dataSource, bindingOptions, ...restProps } = props;
232
+
233
+ // If no dataSource, use traditional props
234
+ if (!dataSource) {
235
+ return <FormBlockView {...restProps} />;
236
+ }
237
+
238
+ // Use data binding
239
+ const { dataSource: _source, loading, error, cached, ...formBlockProps } = useDataBinding<FormBlockModel>(
240
+ dataSource,
241
+ restProps as Partial<FormBlockModel>,
242
+ FormBlockModel.getSchema(),
243
+ { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
244
+ );
245
+
246
+ // Show loading state
247
+ if (loading) {
248
+ return (
249
+ <Paper
250
+ variant="outlined"
251
+ sx={{
252
+ p: 3,
253
+ textAlign: 'center'
254
+ }}
255
+ >
256
+ <Typography variant="body2">Loading Form...</Typography>
257
+ <Typography variant="caption" color="text.secondary">
258
+ Loading form content from data source...
259
+ </Typography>
260
+ </Paper>
261
+ );
262
+ }
263
+
264
+ if (error) {
265
+ console.error('Error loading form block:', error);
266
+ if (process.env.NODE_ENV !== 'production') {
267
+ return (
268
+ <Paper
269
+ variant="outlined"
270
+ sx={{
271
+ p: 3,
272
+ textAlign: 'center',
273
+ borderColor: 'error.main'
274
+ }}
275
+ >
276
+ <Typography variant="body2" color="error">
277
+ Error loading form: {error.message}
278
+ </Typography>
279
+ </Paper>
280
+ );
281
+ }
282
+ return null;
283
+ }
284
+
285
+ return <FormBlockView {...formBlockProps} />;
286
+ }
287
+
288
+ // Mark as QwickApp component
289
+ (FormBlock as any)[QWICKAPP_COMPONENT] = true;
290
+
291
+ export default FormBlock;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Enhanced form components with QwickApps base props support
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+ export { default as FormBlock } from './FormBlock';
7
+ export type { FormBlockProps } from './FormBlock';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * All component props and exports available in QwickApps React Framework.
3
+ *
4
+ * Includes:
5
+ * - Buttons
6
+ * - Form inputs
7
+ * - Layout components
8
+ * - Blocks (Hero, Content, FeatureGrid, Section, etc.)
9
+ * - Pages and scaffolding
10
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
11
+ */
12
+ export * from './blocks';
13
+ export * from './buttons';
14
+ export * from './forms';
15
+ export * from './input';
16
+ export * from './layout';
17
+ export * from './pages';
18
+ export * from './Scaffold';
19
+ export * from './ResponsiveMenu';
20
+ export * from './QwickApp';
21
+ export * from './AccessibilityChecker';
22
+ // DataDrivenSafeSpan functionality is now integrated into SafeSpan
23
+
24
+ export { default as Logo } from './Logo';
25
+ export type { LogoProps } from './Logo';
26
+
27
+ export { default as QwickAppsLogo } from './QwickAppsLogo';
28
+ export type { QwickAppsLogoProps } from './QwickAppsLogo';
29
+
30
+ export { default as SafeSpan } from './SafeSpan';
31
+ export type { SafeSpanProps } from './SafeSpan';
32
+
33
+ export { default as Html } from './Html';
34
+ export type { HtmlProps } from './Html';
35
+
36
+ export { default as Markdown } from './Markdown';
37
+ export type { MarkdownProps } from './Markdown';