@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,47 @@
1
+ /**
2
+ * TextField - Enhanced text input component with base props support
3
+ *
4
+ * A QwickApps-enhanced version of Material-UI TextField with:
5
+ * - Standardized dimension and spacing props
6
+ * - Grid behavior support for ColumnLayout
7
+ * - Consistent theming and styling
8
+ *
9
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
10
+ */
11
+
12
+ import React from 'react';
13
+ import { TextField as MuiTextField, TextFieldProps as MuiTextFieldProps } from '@mui/material';
14
+ import { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
15
+
16
+ export interface TextFieldProps extends WithBaseProps<Omit<MuiTextFieldProps, 'sx' | 'className' | 'style'>> {
17
+ // Additional QwickApps-specific props can be added here
18
+ }
19
+
20
+ export const TextField = React.forwardRef<HTMLDivElement, TextFieldProps>((props, ref) => {
21
+ const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
22
+
23
+ // Mark as QwickApp component
24
+ (TextField as any)[QWICKAPP_COMPONENT] = true;
25
+
26
+ return (
27
+ <MuiTextField
28
+ ref={ref}
29
+ {...restProps}
30
+ {...htmlProps}
31
+ {...styleProps}
32
+ // Store grid props as data attributes for ColumnLayout to pick up
33
+ {...(gridProps && {
34
+ 'data-grid-span': gridProps.span,
35
+ 'data-grid-xs': gridProps.xs,
36
+ 'data-grid-sm': gridProps.sm,
37
+ 'data-grid-md': gridProps.md,
38
+ 'data-grid-lg': gridProps.lg,
39
+ 'data-grid-xl': gridProps.xl,
40
+ })}
41
+ />
42
+ );
43
+ });
44
+
45
+ TextField.displayName = 'TextField';
46
+
47
+ export default TextField;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * TextInputField - Reusable text input component with consistent styling
3
+ *
4
+ * Provides a standardized text field with:
5
+ * - Consistent Material-UI styling
6
+ * - Data binding support
7
+ * - Focus handling
8
+ * - Validation and error states
9
+ * - Support for multiline/textarea mode
10
+ *
11
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
12
+ */
13
+
14
+ import React from 'react';
15
+ import { TextField, TextFieldProps, Paper, Typography } from '@mui/material';
16
+ import type { WithDataBinding, ModelProps } from '@qwickapps/schema';
17
+ import { QWICKAPP_COMPONENT, useBaseProps } from '../../hooks';
18
+ import { useDataBinding } from '../../hooks';
19
+ import TextInputFieldModel from '../../schemas/TextInputFieldSchema';
20
+
21
+ type TextInputFieldViewProps = ModelProps<TextInputFieldModel> & {
22
+ /** Change handler */
23
+ onChange?: (value: string) => void;
24
+ /** Focus handler */
25
+ onFocus?: () => void;
26
+ /** Additional TextField props */
27
+ textFieldProps?: Omit<TextFieldProps, 'label' | 'value' | 'onChange' | 'onFocus' | 'required' | 'disabled' | 'error' | 'helperText' | 'placeholder' | 'type' | 'multiline' | 'rows' | 'maxRows'>;
28
+ };
29
+
30
+ export interface TextInputFieldProps extends TextInputFieldViewProps, WithDataBinding {}
31
+
32
+ // View component - handles the actual rendering
33
+ function TextInputFieldView({
34
+ label,
35
+ value = '',
36
+ onChange,
37
+ onFocus,
38
+ required = false,
39
+ disabled = false,
40
+ error,
41
+ helperText,
42
+ placeholder,
43
+ type = 'text',
44
+ multiline = false,
45
+ rows,
46
+ maxRows,
47
+ textFieldProps,
48
+ ...restProps
49
+ }: TextInputFieldViewProps) {
50
+ const { styleProps, htmlProps, restProps: otherProps } = useBaseProps(restProps);
51
+
52
+ const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
53
+ onChange?.(event.target.value);
54
+ };
55
+
56
+ return (
57
+ <TextField
58
+ {...htmlProps}
59
+ {...styleProps}
60
+ fullWidth
61
+ label={label}
62
+ value={value}
63
+ onChange={handleChange}
64
+ onFocus={onFocus}
65
+ required={required}
66
+ disabled={disabled}
67
+ error={!!error}
68
+ helperText={error || helperText}
69
+ placeholder={placeholder}
70
+ type={type}
71
+ multiline={multiline}
72
+ rows={rows}
73
+ maxRows={maxRows}
74
+ {...textFieldProps}
75
+ />
76
+ );
77
+ }
78
+
79
+ /**
80
+ * TextInputField component with data binding support
81
+ * Supports both traditional props and dataSource-driven rendering
82
+ */
83
+ function TextInputField(props: TextInputFieldProps) {
84
+ const { dataSource, bindingOptions, ...restProps } = props;
85
+
86
+ // If no dataSource, use traditional props
87
+ if (!dataSource) {
88
+ return <TextInputFieldView {...restProps} />;
89
+ }
90
+
91
+ // Use data binding
92
+ const { dataSource: _source, loading, error, cached, ...textInputFieldProps } = useDataBinding<TextInputFieldModel>(
93
+ dataSource,
94
+ restProps as Partial<TextInputFieldModel>,
95
+ TextInputFieldModel.getSchema(),
96
+ { cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
97
+ );
98
+
99
+ // Show loading state
100
+ if (loading) {
101
+ return (
102
+ <Paper
103
+ variant="outlined"
104
+ sx={{
105
+ p: 3,
106
+ textAlign: 'center'
107
+ }}
108
+ >
109
+ <Typography variant="body2">Loading TextInputField...</Typography>
110
+ <Typography variant="caption" color="text.secondary">
111
+ Loading text input field from data source...
112
+ </Typography>
113
+ </Paper>
114
+ );
115
+ }
116
+
117
+ if (error) {
118
+ console.error('Error loading text input field:', error);
119
+ if (process.env.NODE_ENV !== 'production') {
120
+ return (
121
+ <Paper
122
+ variant="outlined"
123
+ sx={{
124
+ p: 3,
125
+ textAlign: 'center',
126
+ borderColor: 'error.main'
127
+ }}
128
+ >
129
+ <Typography variant="body2" color="error">
130
+ Error loading text input field: {error.message}
131
+ </Typography>
132
+ </Paper>
133
+ );
134
+ }
135
+ return null;
136
+ }
137
+
138
+ return <TextInputFieldView {...textInputFieldProps} />;
139
+ }
140
+
141
+ // Mark as QwickApp component
142
+ (TextInputField as any)[QWICKAPP_COMPONENT] = true;
143
+
144
+ export default TextInputField;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Input components export
3
+ *
4
+ * Enhanced input components with QwickApps base props support
5
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
6
+ */
7
+ export { default as ChoiceInputField } from './ChoiceInputField';
8
+ export { default as HtmlInputField } from './HtmlInputField';
9
+ export { default as SelectInputField } from './SelectInputField';
10
+ export { default as TextField } from './TextField';
11
+ export { default as TextInputField } from './TextInputField';
12
+
13
+ export type { ChoiceInputFieldProps } from './ChoiceInputField';
14
+ export type { HtmlInputFieldProps } from './HtmlInputField';
15
+ export type { SelectInputFieldProps, SelectOption } from './SelectInputField';
16
+ export type { TextFieldProps } from './TextField';
17
+ export type { TextInputFieldProps } from './TextInputField';
@@ -0,0 +1,46 @@
1
+ /**
2
+ * GridCell - Simple cell wrapper for GridLayout
3
+ *
4
+ * A lightweight wrapper that applies grid props to any content
5
+ * Uses the base props pattern for consistency
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import React from 'react';
11
+ import { Box } from '@mui/material';
12
+ import { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
13
+
14
+ export interface GridCellProps extends WithBaseProps {
15
+ children: React.ReactNode;
16
+ }
17
+
18
+ export const GridCell: React.FC<GridCellProps> = (props) => {
19
+ const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
20
+
21
+ // Mark as QwickApp component
22
+ (GridCell as any)[QWICKAPP_COMPONENT] = true;
23
+
24
+ return (
25
+ <Box
26
+ {...htmlProps}
27
+ {...styleProps}
28
+ {...restProps}
29
+ // Store grid props as data attributes for GridLayout to pick up
30
+ {...(gridProps && {
31
+ 'data-grid-span': gridProps.span,
32
+ 'data-grid-xs': gridProps.xs,
33
+ 'data-grid-sm': gridProps.sm,
34
+ 'data-grid-md': gridProps.md,
35
+ 'data-grid-lg': gridProps.lg,
36
+ 'data-grid-xl': gridProps.xl,
37
+ })}
38
+ >
39
+ {(restProps as any).children}
40
+ </Box>
41
+ );
42
+ };
43
+
44
+ GridCell.displayName = 'GridCell';
45
+
46
+ export default GridCell;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * GridCellWrapper - Responsive grid cell wrapper for layout consistency
3
+ *
4
+ * This component provides a flexible wrapper for content within a Material-UI Grid,
5
+ * supporting responsive sizing, full-width option, and easy integration with form fields or layout elements.
6
+ *
7
+ * Features:
8
+ * - Responsive grid sizing via breakpoint props (xs, sm, md, lg, xl)
9
+ * - Optional fullWidth prop to force cell to span all columns
10
+ * - Passes additional GridProps for customization
11
+ * - Designed for use in forms and layouts needing consistent grid behavior
12
+ *
13
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
14
+ */
15
+
16
+ import React from 'react';
17
+ import { Grid, GridProps } from '@mui/material';
18
+
19
+ /**
20
+ * Props for GridCellWrapper
21
+ * @property children - Content to render inside the grid cell
22
+ * @property xs, sm, md, lg, xl - Grid breakpoint sizes (number or 'auto')
23
+ * @property fullWidth - If true, cell spans all columns (xs=12)
24
+ * @property ...gridProps - Additional GridProps except 'item' and 'children'
25
+ */
26
+ export interface GridCellWrapperProps extends Omit<GridProps, 'children'> {
27
+ /** Content to render inside the grid cell */
28
+ children: React.ReactNode;
29
+ /** Grid breakpoint size for extra-small screens */
30
+ xs?: number | 'auto';
31
+ /** Grid breakpoint size for small screens */
32
+ sm?: number | 'auto';
33
+ /** Grid breakpoint size for medium screens */
34
+ md?: number | 'auto';
35
+ /** Grid breakpoint size for large screens */
36
+ lg?: number | 'auto';
37
+ /** Grid breakpoint size for extra-large screens */
38
+ xl?: number | 'auto';
39
+ /** If true, cell spans all columns (xs=12) */
40
+ fullWidth?: boolean;
41
+ }
42
+
43
+ /**
44
+ * GridCellWrapper component
45
+ * Wraps content in a Material-UI Grid cell with responsive sizing and full-width option.
46
+ */
47
+ const GridCellWrapper: React.FC<GridCellWrapperProps> = ({
48
+ children,
49
+ xs = 12,
50
+ sm,
51
+ md,
52
+ lg,
53
+ xl,
54
+ fullWidth = false,
55
+ ...gridProps
56
+ }) => {
57
+ // If fullWidth is true, force size=12; otherwise build responsive size object for MUI v6
58
+ const responsiveSizing = fullWidth
59
+ ? { size: 12 }
60
+ : (() => {
61
+ const sizeConfig: any = {};
62
+ if (xs !== undefined) sizeConfig.xs = xs;
63
+ if (sm !== undefined) sizeConfig.sm = sm;
64
+ if (md !== undefined) sizeConfig.md = md;
65
+ if (lg !== undefined) sizeConfig.lg = lg;
66
+ if (xl !== undefined) sizeConfig.xl = xl;
67
+
68
+ // If only one value provided, use it as a simple size value
69
+ const definedBreakpoints = Object.keys(sizeConfig);
70
+ if (definedBreakpoints.length === 1 && xs !== undefined && sm === undefined && md === undefined && lg === undefined && xl === undefined) {
71
+ return { size: xs };
72
+ }
73
+
74
+ return { size: sizeConfig };
75
+ })();
76
+
77
+ return (
78
+ <Grid
79
+ {...responsiveSizing}
80
+ {...gridProps}
81
+ >
82
+ {children}
83
+ </Grid>
84
+ );
85
+ };
86
+
87
+ export default GridCellWrapper;
@@ -0,0 +1,169 @@
1
+ /**
2
+ * GridLayout - Flexible grid layout component
3
+ *
4
+ * Works with any component that has grid props (span, xs, sm, md, lg, xl)
5
+ * Automatically wraps components in Grid when grid props are detected
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import React from 'react';
11
+ import { Grid, SxProps, Theme } from '@mui/material';
12
+ import { SpacingValue, resolveSpacing } from '../../utils/spacing';
13
+ import { DimensionValue, resolveDimension } from '../../utils/dimensions';
14
+ import { QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
15
+
16
+ export interface GridLayoutProps {
17
+ /** Layout children - any components with grid props work */
18
+ children: React.ReactNode;
19
+ /** Number of equal-width columns (auto-distribution) */
20
+ columns?: 1 | 2 | 3 | 4 | 5 | 6;
21
+ /** Spacing between columns */
22
+ spacing?: SpacingValue;
23
+ /** Equal height columns */
24
+ equalHeight?: boolean;
25
+ /** Layout dimensions */
26
+ height?: DimensionValue;
27
+ width?: DimensionValue;
28
+ minHeight?: DimensionValue;
29
+ minWidth?: DimensionValue;
30
+ maxHeight?: DimensionValue;
31
+ maxWidth?: DimensionValue;
32
+ /** Additional CSS class */
33
+ className?: string;
34
+ /** Custom styles */
35
+ sx?: SxProps<Theme>;
36
+ /** Inline styles */
37
+ style?: React.CSSProperties;
38
+ }
39
+
40
+ export const GridLayout: React.FC<GridLayoutProps> = ({
41
+ children,
42
+ columns,
43
+ spacing = 'small',
44
+ equalHeight = false,
45
+ height,
46
+ width,
47
+ minHeight,
48
+ minWidth,
49
+ maxHeight,
50
+ maxWidth,
51
+ className,
52
+ sx,
53
+ style,
54
+ }) => {
55
+ const resolvedSpacing = resolveSpacing(spacing, 'gap');
56
+
57
+ // Process children to handle grid props
58
+ const processChildren = () => {
59
+ const childArray = React.Children.toArray(children);
60
+
61
+ return childArray.map((child, index) => {
62
+ if (!React.isValidElement(child)) {
63
+ return child;
64
+ }
65
+
66
+ // Extract grid props from data attributes or props
67
+ let gridProps: any = {};
68
+
69
+ // Check if it's a QwickApp component
70
+ const isQwickApp = (child.type as any)?.[QWICKAPP_COMPONENT];
71
+
72
+ // Extract grid props from both data attributes (QwickApp) and direct props (regular)
73
+ const props = child.props as any;
74
+ const span = props['data-grid-span'] || props.span;
75
+ const xs = props['data-grid-xs'] || props.xs;
76
+ const sm = props['data-grid-sm'] || props.sm;
77
+ const md = props['data-grid-md'] || props.md;
78
+ const lg = props['data-grid-lg'] || props.lg;
79
+ const xl = props['data-grid-xl'] || props.xl;
80
+
81
+ if (span || xs || sm || md || lg || xl) {
82
+ // Use span if available, otherwise use breakpoint values
83
+ if (span) {
84
+ gridProps = {
85
+ size: span,
86
+ };
87
+ } else {
88
+ // Build responsive size object for MUI v6
89
+ const sizeConfig: any = {};
90
+ if (xs) sizeConfig.xs = xs;
91
+ if (sm) sizeConfig.sm = sm;
92
+ if (md) sizeConfig.md = md;
93
+ if (lg) sizeConfig.lg = lg;
94
+ if (xl) sizeConfig.xl = xl;
95
+
96
+ gridProps = {
97
+ size: sizeConfig,
98
+ };
99
+ }
100
+ }
101
+
102
+ // If columns prop is set and no grid props, auto-distribute responsively
103
+ if (columns && Object.keys(gridProps).length === 0) {
104
+ // Make responsive: single column on mobile, fewer columns on tablet, full columns on desktop
105
+ gridProps = {
106
+ size: {
107
+ xs: 12, // Single column on mobile
108
+ sm: columns >= 3 ? 6 : 12 / Math.min(columns, 2), // 2 columns max on small screens
109
+ md: 12 / Math.min(columns, 3), // 3 columns max on medium screens
110
+ lg: 12 / columns, // Full columns on large screens
111
+ },
112
+ };
113
+ }
114
+
115
+ // If has grid props, wrap in Grid
116
+ if (Object.keys(gridProps).length > 0) {
117
+ // Clean grid data attributes from child to avoid duplication
118
+ const cleanedProps = { ...child.props };
119
+ delete cleanedProps['data-grid-span'];
120
+ delete cleanedProps['data-grid-xs'];
121
+ delete cleanedProps['data-grid-sm'];
122
+ delete cleanedProps['data-grid-md'];
123
+ delete cleanedProps['data-grid-lg'];
124
+ delete cleanedProps['data-grid-xl'];
125
+
126
+ return (
127
+ <Grid key={child.key || index} {...gridProps}>
128
+ {React.cloneElement(child, cleanedProps)}
129
+ </Grid>
130
+ );
131
+ }
132
+
133
+ return child;
134
+ });
135
+ };
136
+
137
+ return (
138
+ <Grid
139
+ container
140
+ spacing={resolvedSpacing}
141
+ className={className}
142
+ sx={{
143
+ width: '100%', // Ensure full width by default in MUI v6
144
+ height: resolveDimension(height, 'height'),
145
+ minHeight: resolveDimension(minHeight, 'minHeight'),
146
+ minWidth: resolveDimension(minWidth, 'minWidth'),
147
+ maxHeight: resolveDimension(maxHeight, 'maxHeight'),
148
+ maxWidth: resolveDimension(maxWidth, 'maxWidth'),
149
+ ...(width && { width: resolveDimension(width, 'width') }), // Override only if explicitly set
150
+ ...(equalHeight && {
151
+ alignItems: 'stretch',
152
+ '& > .MuiGrid-item': {
153
+ display: 'flex',
154
+ '& > *': {
155
+ width: '100%',
156
+ height: '100%',
157
+ },
158
+ },
159
+ }),
160
+ ...sx,
161
+ }}
162
+ style={style}
163
+ >
164
+ {processChildren()}
165
+ </Grid>
166
+ );
167
+ };
168
+
169
+ export default GridLayout;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Layout components export
3
+ *
4
+ * Layout components using the new base props pattern
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+
9
+ export { GridLayout } from './GridLayout';
10
+ export type { GridLayoutProps } from './GridLayout';
11
+
12
+ export { GridCell } from './GridCell';
13
+ export type { GridCellProps } from './GridCell';
File without changes
@@ -0,0 +1,32 @@
1
+ /**
2
+ * MenuItem - Standardized menu item type for navigation components
3
+ *
4
+ * Used by Scaffold, navigation rails, drawers, and other menu systems.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+
9
+ import React from 'react';
10
+
11
+ export interface MenuItem {
12
+ /** Unique identifier for the menu item */
13
+ id: string;
14
+ /** Display label for the menu item */
15
+ label: string;
16
+ /** Icon component or JSX element to display */
17
+ icon?: React.ReactNode;
18
+ /** Click handler for the menu item */
19
+ onClick?: () => void;
20
+ /** External link URL (if this is a link) */
21
+ href?: string;
22
+ /** Route path for automatic navigation (React Router) */
23
+ route?: string;
24
+ /** Whether this item is currently active/selected */
25
+ active?: boolean;
26
+ /** Whether this item is disabled */
27
+ disabled?: boolean;
28
+ /** Badge text or number to display */
29
+ badge?: string | number;
30
+ /** Priority for ordering (lower numbers = higher priority) */
31
+ priority?: number;
32
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Menu components export
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+ export { type MenuItem } from './MenuItem';
@@ -0,0 +1,108 @@
1
+ /**
2
+ * FormPage - Reusable page layout for forms with consistent header, status, and footer
3
+ *
4
+ * Provides a standardized full-page layout for forms with:
5
+ * - CoverImageHeader as the default header with smart branding defaults
6
+ * - Status message handling (info, success, warning, error)
7
+ * - Consistent form container and footer
8
+ * - Background variants (default, gradient, image)
9
+ * - Responsive design for all screen sizes
10
+ *
11
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
12
+ */
13
+
14
+ import React from 'react';
15
+ import FormBlock from '../forms/FormBlock';
16
+
17
+ export interface FormPageProps {
18
+ /**
19
+ * Page title (required)
20
+ */
21
+ title: string;
22
+
23
+ /**
24
+ * Page subtitle/description
25
+ */
26
+ description?: string;
27
+
28
+ /**
29
+ * Cover image URL or React element for the header
30
+ * If not provided, will use Logo component with app name
31
+ */
32
+ coverImage?: string | React.ReactNode;
33
+
34
+ /**
35
+ * Form content (required)
36
+ */
37
+ form: React.ReactNode;
38
+
39
+ /**
40
+ * Footer content
41
+ */
42
+ footer?: React.ReactNode;
43
+
44
+ /**
45
+ * Status message type
46
+ */
47
+ status?: 'info' | 'success' | 'warning' | 'error';
48
+
49
+ /**
50
+ * Status message content
51
+ */
52
+ message?: string;
53
+
54
+ /**
55
+ * Maximum width of the form container
56
+ */
57
+ maxWidth?: 'xs' | 'sm' | 'md';
58
+
59
+ /**
60
+ * Background style variant
61
+ */
62
+ background?: 'default' | 'gradient' | 'image';
63
+
64
+ /**
65
+ * Background image URL (when background='image')
66
+ */
67
+ backgroundImage?: string;
68
+
69
+ /**
70
+ * Custom styling
71
+ */
72
+ sx?: object;
73
+ }
74
+
75
+ /**
76
+ * FormPage component for consistent form page layouts
77
+ */
78
+ export const FormPage: React.FC<FormPageProps> = ({
79
+ title,
80
+ description,
81
+ coverImage,
82
+ form,
83
+ footer,
84
+ status,
85
+ message,
86
+ maxWidth = 'sm',
87
+ background = 'default',
88
+ backgroundImage,
89
+ sx = {},
90
+ }) => {
91
+ return (
92
+ <FormBlock
93
+ title={title}
94
+ description={description}
95
+ coverImage={coverImage}
96
+ form={form}
97
+ footer={footer}
98
+ status={status}
99
+ message={message}
100
+ maxWidth={maxWidth}
101
+ background={background}
102
+ backgroundImage={backgroundImage}
103
+ sx={sx}
104
+ />
105
+ );
106
+ };
107
+
108
+ export default FormPage;