@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,949 @@
1
+ /**
2
+ * PageBannerHeader Component Stories
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import {
8
+ Block as BlockIcon,
9
+ Bookmark as BookmarkIcon,
10
+ Edit as EditIcon,
11
+ Favorite as FavoriteIcon,
12
+ PersonAdd as FollowIcon,
13
+ Message as MessageIcon,
14
+ Report as ReportIcon,
15
+ Share as ShareIcon
16
+ } from '@mui/icons-material';
17
+ import { Box, Typography } from '@mui/material';
18
+ import { JsonDataProvider } from '@qwickapps/schema';
19
+ import type { Meta, StoryObj } from '@storybook/react';
20
+ import { Code } from '../components/blocks';
21
+ import PageBannerHeader from '../components/blocks/PageBannerHeader';
22
+ import QwickApp from '../components/QwickApp';
23
+
24
+ const meta: Meta<typeof PageBannerHeader> = {
25
+ title: 'Blocks/PageBannerHeader',
26
+ component: PageBannerHeader,
27
+ parameters: {
28
+ layout: 'fullscreen',
29
+ docs: {
30
+ description: {
31
+ component: `The PageBannerHeader component provides a Facebook-style banner layout with cover image and profile overlay.
32
+
33
+ **Key Features:**
34
+ - **Cover Image**: Large banner background image with gradient overlay
35
+ - **Profile Overlay**: Profile image positioned over the banner (bottom-left, center, etc.)
36
+ - **Rich Information**: Overline, title, subtitle, metadata (followers, posts, etc.), and tags
37
+ - **Contextual Actions**: Priority-based actions with responsive overflow handling
38
+ - **Responsive Design**: Automatically adapts for mobile and desktop viewing
39
+ - **Material UI**: Built with MUI components for consistent styling and theming
40
+
41
+ **Perfect for:**
42
+ - User profile pages and team member showcases
43
+ - Company and organization pages
44
+ - Project portfolios and case studies
45
+ - Social media style layouts
46
+ - Personal brand pages and portfolios
47
+ - Community group headers`,
48
+ },
49
+ },
50
+ },
51
+ tags: ['autodocs'],
52
+ argTypes: {
53
+ coverImage: {
54
+ description: 'Cover/banner image URL',
55
+ control: { type: 'text' },
56
+ },
57
+ coverImageAlt: {
58
+ description: 'Cover image alt text',
59
+ control: { type: 'text' },
60
+ },
61
+ profileImage: {
62
+ description: 'Profile/avatar image URL or component',
63
+ control: { type: 'text' },
64
+ },
65
+ profileImageAlt: {
66
+ description: 'Profile image alt text',
67
+ control: { type: 'text' },
68
+ },
69
+ profileImageSize: {
70
+ description: 'Profile image size',
71
+ control: { type: 'select' },
72
+ options: ['small', 'medium', 'large'],
73
+ },
74
+ overline: {
75
+ description: 'Optional overline text',
76
+ control: { type: 'text' },
77
+ },
78
+ title: {
79
+ description: 'Main title',
80
+ control: { type: 'text' },
81
+ },
82
+ subtitle: {
83
+ description: 'Subtitle text',
84
+ control: { type: 'text' },
85
+ },
86
+ metadata: {
87
+ description: 'Array of metadata items (followers, posts, etc.)',
88
+ control: { type: 'object' },
89
+ },
90
+ tags: {
91
+ description: 'Array of tag strings or JSX elements',
92
+ control: { type: 'object' },
93
+ },
94
+ actions: {
95
+ description: 'Action buttons',
96
+ control: false,
97
+ },
98
+ maxVisibleActions: {
99
+ description: 'Maximum visible actions before overflow',
100
+ control: { type: 'number', min: 1, max: 5 },
101
+ },
102
+ height: {
103
+ description: 'Banner height in pixels',
104
+ control: { type: 'number', min: 120, max: 300 },
105
+ },
106
+ profilePosition: {
107
+ description: 'Profile position relative to banner',
108
+ control: { type: 'select' },
109
+ options: ['bottom-left', 'bottom-center', 'overlay-center'],
110
+ },
111
+ },
112
+ } satisfies Meta<typeof PageBannerHeader>;
113
+
114
+ export default meta;
115
+ type Story = StoryObj<typeof meta>;
116
+
117
+ // Sample CMS data for data binding stories
118
+ const sampleCmsData = {
119
+ 'pageBannerHeaders': {
120
+ 'teamMember': {
121
+ coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
122
+ coverImageAlt: 'Mountain landscape cover image',
123
+ profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
124
+ profileImageAlt: 'John Doe profile photo',
125
+ profileImageSize: 'large',
126
+ overline: 'TEAM LEAD',
127
+ title: 'John Doe',
128
+ subtitle: 'Senior Full Stack Developer & Team Leader',
129
+ metadata: [
130
+ { label: 'projects', value: '25+' },
131
+ { label: 'experience', value: '8 years' },
132
+ { label: 'team size', value: 12 }
133
+ ],
134
+ tags: ['React', 'Node.js', 'TypeScript', 'Team Leadership', 'Architecture'],
135
+ maxVisibleActions: 2,
136
+ height: 220,
137
+ profilePosition: 'bottom-left'
138
+ },
139
+ 'company': {
140
+ coverImage: 'https://images.unsplash.com/photo-1497366216548-37526070297c?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
141
+ coverImageAlt: 'QwickApps office space',
142
+ profileImageSize: 'medium',
143
+ overline: 'TECHNOLOGY COMPANY',
144
+ title: 'QwickApps React Framework',
145
+ subtitle: 'Revolutionizing React development with intelligent components',
146
+ metadata: [
147
+ { label: 'developers', value: '50+' },
148
+ { label: 'components', value: '200+' },
149
+ { label: 'downloads', value: '1M+' }
150
+ ],
151
+ tags: ['React', 'TypeScript', 'Open Source', 'Developer Tools'],
152
+ height: 200,
153
+ profilePosition: 'bottom-center'
154
+ },
155
+ 'project': {
156
+ coverImage: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
157
+ coverImageAlt: 'Analytics dashboard screenshot',
158
+ profileImage: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
159
+ profileImageAlt: 'Project logo',
160
+ profileImageSize: 'medium',
161
+ overline: 'FEATURED PROJECT',
162
+ title: 'Real-time Analytics Platform',
163
+ subtitle: 'Advanced data visualization and business intelligence dashboard',
164
+ metadata: [
165
+ { label: 'users', value: '10K+' },
166
+ { label: 'data points', value: '1B+' },
167
+ { label: 'uptime', value: '99.9%' }
168
+ ],
169
+ tags: ['React', 'D3.js', 'PostgreSQL', 'Real-time', 'Data Viz'],
170
+ height: 180,
171
+ profilePosition: 'overlay-center'
172
+ },
173
+ 'accessibilityDemo': {
174
+ coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
175
+ coverImageAlt: 'Scenic mountain landscape with accessible pathways',
176
+ profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
177
+ profileImageAlt: 'Profile photo of accessibility advocate Sarah Johnson',
178
+ profileImageSize: 'large',
179
+ overline: 'ACCESSIBILITY ADVOCATE',
180
+ title: 'Sarah Johnson',
181
+ subtitle: 'UX Designer specializing in accessible web experiences',
182
+ metadata: [
183
+ { label: 'audits completed', value: '150+' },
184
+ { label: 'WCAG certifications', value: 3 },
185
+ { label: 'speaking engagements', value: 25 }
186
+ ],
187
+ tags: ['WCAG 2.1', 'Screen Readers', 'Inclusive Design', 'ARIA', 'Color Contrast'],
188
+ maxVisibleActions: 2,
189
+ height: 200,
190
+ profilePosition: 'bottom-left'
191
+ }
192
+ }
193
+ };
194
+
195
+ const dataProvider = new JsonDataProvider({ data: sampleCmsData });
196
+
197
+ // Sample actions for demos
198
+ const profileActions = [
199
+ {
200
+ id: 'message',
201
+ label: 'Message',
202
+ icon: <MessageIcon />,
203
+ onClick: () => alert('Message sent'),
204
+ priority: 1,
205
+ },
206
+ {
207
+ id: 'follow',
208
+ label: 'Follow',
209
+ icon: <FollowIcon />,
210
+ onClick: () => alert('Now following'),
211
+ priority: 2,
212
+ },
213
+ {
214
+ id: 'share',
215
+ label: 'Share',
216
+ icon: <ShareIcon />,
217
+ onClick: () => alert('Profile shared'),
218
+ priority: 3,
219
+ },
220
+ {
221
+ id: 'favorite',
222
+ label: 'Favorite',
223
+ icon: <FavoriteIcon />,
224
+ onClick: () => alert('Added to favorites'),
225
+ priority: 4,
226
+ },
227
+ {
228
+ id: 'bookmark',
229
+ label: 'Bookmark',
230
+ icon: <BookmarkIcon />,
231
+ onClick: () => alert('Bookmarked'),
232
+ priority: 5,
233
+ },
234
+ {
235
+ id: 'report',
236
+ label: 'Report',
237
+ icon: <ReportIcon />,
238
+ onClick: () => alert('Reported'),
239
+ destructive: true,
240
+ priority: 6,
241
+ },
242
+ {
243
+ id: 'block',
244
+ label: 'Block',
245
+ icon: <BlockIcon />,
246
+ onClick: () => alert('Blocked'),
247
+ destructive: true,
248
+ priority: 7,
249
+ },
250
+ ];
251
+
252
+ export const UserProfile: Story = {
253
+ args: {
254
+ coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
255
+ coverImageAlt: 'Scenic mountain landscape',
256
+ profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
257
+ profileImageAlt: 'Profile photo of John Doe',
258
+ title: 'John Doe',
259
+ subtitle: 'Senior Product Manager at TechCorp',
260
+ overline: 'TEAM MEMBER',
261
+ metadata: [
262
+ { label: 'followers', value: '2.5K' },
263
+ { label: 'following', value: 456 },
264
+ { label: 'posts', value: 127 },
265
+ ],
266
+ tags: ['Product Manager', 'Team Lead', 'Remote Work', 'Tech Enthusiast'],
267
+ actions: profileActions.slice(0, 5),
268
+ maxVisibleActions: 3,
269
+ height: 200,
270
+ profileImageSize: 'large',
271
+ profilePosition: 'bottom-left',
272
+ },
273
+ render: (args) => (
274
+ <QwickApp appId="banner-user-profile" appName='User Profile'>
275
+ <PageBannerHeader {...args} />
276
+ <div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
277
+ <h3>About</h3>
278
+ <p>
279
+ Passionate product manager with over 5 years of experience in building user-centered products.
280
+ Led cross-functional teams to deliver innovative solutions that drive business growth and enhance user experience.
281
+ </p>
282
+
283
+ <h3>Experience</h3>
284
+ <div style={{ display: 'grid', gap: '1rem', marginTop: '1rem' }}>
285
+ <div style={{ padding: '1rem', border: '1px solid var(--theme-outline)', borderRadius: '8px' }}>
286
+ <strong>Senior Product Manager</strong> - TechCorp (2022 - Present)
287
+ </div>
288
+ <div style={{ padding: '1rem', border: '1px solid var(--theme-outline)', borderRadius: '8px' }}>
289
+ <strong>Product Manager</strong> - StartupXYZ (2020 - 2022)
290
+ </div>
291
+ </div>
292
+ </div>
293
+ </QwickApp>
294
+ ),
295
+ parameters: {
296
+ docs: {
297
+ description: {
298
+ story: 'Complete user profile with cover image, profile photo, metadata, tags, and social actions. Perfect for team directories and social platforms.',
299
+ },
300
+ },
301
+ },
302
+ };
303
+
304
+ export const CompanyPage: Story = {
305
+ args: {
306
+ coverImage: 'https://images.unsplash.com/photo-1497366216548-37526070297c?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
307
+ coverImageAlt: 'Modern office space',
308
+ profileImage: (
309
+ <div style={{
310
+ width: '100%',
311
+ height: '100%',
312
+ backgroundColor: '#1976d2',
313
+ borderRadius: '16px',
314
+ display: 'flex',
315
+ alignItems: 'center',
316
+ justifyContent: 'center',
317
+ fontSize: '2rem',
318
+ fontWeight: 'bold',
319
+ color: 'white',
320
+ }}>
321
+ TC
322
+ </div>
323
+ ),
324
+ title: 'TechCorp Solutions',
325
+ subtitle: 'Building the future of enterprise software',
326
+ overline: 'TECHNOLOGY COMPANY',
327
+ metadata: [
328
+ { label: 'employees', value: '500+' },
329
+ { label: 'founded', value: 2018 },
330
+ { label: 'locations', value: 12 },
331
+ ],
332
+ tags: ['Enterprise Software', 'AI/ML', 'Cloud Solutions', 'B2B'],
333
+ actions: [
334
+ {
335
+ id: 'contact',
336
+ label: 'Contact Us',
337
+ icon: <MessageIcon />,
338
+ onClick: () => alert('Contact form opened'),
339
+ priority: 1,
340
+ },
341
+ {
342
+ id: 'careers',
343
+ label: 'View Jobs',
344
+ icon: <EditIcon />,
345
+ onClick: () => alert('Careers page opened'),
346
+ priority: 2,
347
+ },
348
+ {
349
+ id: 'share',
350
+ label: 'Share',
351
+ icon: <ShareIcon />,
352
+ onClick: () => alert('Company page shared'),
353
+ priority: 3,
354
+ },
355
+ ],
356
+ height: 180,
357
+ profileImageSize: 'medium',
358
+ profilePosition: 'bottom-left',
359
+ },
360
+ render: (args) => (
361
+ <QwickApp appId="banner-company" appName='Company Profile'>
362
+ <PageBannerHeader {...args} />
363
+ <div style={{ padding: '2rem', maxWidth: '1000px', margin: '0 auto' }}>
364
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem', marginTop: '2rem' }}>
365
+ <div>
366
+ <h3>About Us</h3>
367
+ <p>
368
+ TechCorp Solutions is a leading provider of enterprise software solutions,
369
+ specializing in AI-driven platforms that help businesses streamline operations
370
+ and drive digital transformation.
371
+ </p>
372
+ </div>
373
+
374
+ <div>
375
+ <h3>Our Services</h3>
376
+ <ul>
377
+ <li>Enterprise Software Development</li>
378
+ <li>AI & Machine Learning Solutions</li>
379
+ <li>Cloud Infrastructure & Migration</li>
380
+ <li>Digital Transformation Consulting</li>
381
+ </ul>
382
+ </div>
383
+
384
+ <div>
385
+ <h3>Contact Information</h3>
386
+ <div style={{ display: 'grid', gap: '0.5rem' }}>
387
+ <div>📧 hello@techcorp.com</div>
388
+ <div>📞 +1 (555) 123-4567</div>
389
+ <div>🏢 123 Innovation Drive, Tech City, TC 12345</div>
390
+ </div>
391
+ </div>
392
+ </div>
393
+ </div>
394
+ </QwickApp>
395
+ ),
396
+ parameters: {
397
+ docs: {
398
+ description: {
399
+ story: 'Company page layout with custom logo component, business metadata, and corporate actions. Ideal for business profiles.',
400
+ },
401
+ },
402
+ },
403
+ };
404
+
405
+ export const ProjectShowcase: Story = {
406
+ args: {
407
+ coverImage: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
408
+ coverImageAlt: 'Data visualization dashboard',
409
+ profileImage: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?ixlib=rb-4.0.3&auto=format&fit=crop&w=200&q=80',
410
+ profileImageAlt: 'Project screenshot',
411
+ title: 'Analytics Dashboard 2.0',
412
+ subtitle: 'Real-time business intelligence and data visualization platform',
413
+ overline: 'FEATURED PROJECT',
414
+ metadata: [
415
+ { label: 'stars', value: '1.2K' },
416
+ { label: 'forks', value: 234 },
417
+ { label: 'contributors', value: 18 },
418
+ ],
419
+ tags: ['React', 'TypeScript', 'D3.js', 'Node.js', 'PostgreSQL'],
420
+ actions: [
421
+ {
422
+ id: 'demo',
423
+ label: 'Live Demo',
424
+ onClick: () => alert('Opening demo...'),
425
+ priority: 1,
426
+ },
427
+ {
428
+ id: 'github',
429
+ label: 'GitHub',
430
+ icon: <ShareIcon />,
431
+ onClick: () => alert('Opening GitHub...'),
432
+ priority: 2,
433
+ },
434
+ {
435
+ id: 'star',
436
+ label: 'Star',
437
+ icon: <FavoriteIcon />,
438
+ onClick: () => alert('Starred!'),
439
+ priority: 3,
440
+ },
441
+ ],
442
+ height: 160,
443
+ profileImageSize: 'medium',
444
+ profilePosition: 'bottom-left',
445
+ },
446
+ render: (args) => (
447
+ <QwickApp appId="banner-project" appName='Project Showcase'>
448
+ <PageBannerHeader {...args} />
449
+ <div style={{ padding: '2rem', maxWidth: '900px', margin: '0 auto' }}>
450
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '2rem' }}>
451
+ <div>
452
+ <h3>🎯 Project Overview</h3>
453
+ <p>
454
+ A comprehensive business intelligence platform that transforms complex data
455
+ into actionable insights through interactive visualizations and real-time analytics.
456
+ </p>
457
+ </div>
458
+
459
+ <div>
460
+ <h3>✨ Key Features</h3>
461
+ <ul>
462
+ <li>Real-time data processing</li>
463
+ <li>Interactive dashboards</li>
464
+ <li>Custom visualization builder</li>
465
+ <li>Advanced filtering & querying</li>
466
+ <li>Export & sharing capabilities</li>
467
+ </ul>
468
+ </div>
469
+
470
+ <div>
471
+ <h3>🛠️ Technology Stack</h3>
472
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem', marginTop: '1rem' }}>
473
+ {['React', 'TypeScript', 'D3.js', 'Node.js', 'PostgreSQL', 'Docker'].map(tech => (
474
+ <span key={tech} style={{
475
+ padding: '0.25rem 0.75rem',
476
+ backgroundColor: 'var(--theme-primary)',
477
+ color: 'var(--theme-on-primary)',
478
+ borderRadius: '12px',
479
+ fontSize: '0.75rem',
480
+ fontWeight: '500'
481
+ }}>
482
+ {tech}
483
+ </span>
484
+ ))}
485
+ </div>
486
+ </div>
487
+ </div>
488
+ </div>
489
+ </QwickApp>
490
+ ),
491
+ parameters: {
492
+ docs: {
493
+ description: {
494
+ story: 'Project showcase with technical metadata, technology tags, and project-specific actions. Perfect for portfolios and open source projects.',
495
+ },
496
+ },
497
+ },
498
+ };
499
+
500
+ export const ProfilePositions: Story = {
501
+ render: () => (
502
+ <QwickApp appId="banner-positions" appName='Profile Positions'>
503
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
504
+ <PageBannerHeader
505
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
506
+ profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
507
+ title="Bottom Left Position"
508
+ subtitle="Profile positioned at bottom-left of banner"
509
+ profilePosition="bottom-left"
510
+ profileImageSize="medium"
511
+ height={140}
512
+ />
513
+
514
+ <PageBannerHeader
515
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
516
+ profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
517
+ title="Bottom Center Position"
518
+ subtitle="Profile positioned at bottom-center of banner"
519
+ profilePosition="bottom-center"
520
+ profileImageSize="medium"
521
+ height={140}
522
+ />
523
+
524
+ <PageBannerHeader
525
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
526
+ profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
527
+ title="Overlay Center Position"
528
+ subtitle="Profile positioned at center of banner overlay"
529
+ profilePosition="overlay-center"
530
+ profileImageSize="medium"
531
+ height={140}
532
+ />
533
+ </div>
534
+ </QwickApp>
535
+ ),
536
+ parameters: {
537
+ docs: {
538
+ description: {
539
+ story: 'Comparison of different profile image positions: bottom-left (default), bottom-center, and overlay-center.',
540
+ },
541
+ },
542
+ },
543
+ };
544
+
545
+ export const ProfileSizes: Story = {
546
+ render: () => (
547
+ <QwickApp appId="banner-sizes" appName='Profile Sizes'>
548
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
549
+ <PageBannerHeader
550
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
551
+ profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
552
+ title="Small Profile Image"
553
+ subtitle="64px on mobile, 80px on desktop"
554
+ profileImageSize="small"
555
+ height={120}
556
+ />
557
+
558
+ <PageBannerHeader
559
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
560
+ profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
561
+ title="Medium Profile Image"
562
+ subtitle="80px on mobile, 100px on desktop (default)"
563
+ profileImageSize="medium"
564
+ height={140}
565
+ />
566
+
567
+ <PageBannerHeader
568
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
569
+ profileImage="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80"
570
+ title="Large Profile Image"
571
+ subtitle="100px on mobile, 120px on desktop"
572
+ profileImageSize="large"
573
+ height={160}
574
+ />
575
+ </div>
576
+ </QwickApp>
577
+ ),
578
+ parameters: {
579
+ docs: {
580
+ description: {
581
+ story: 'Comparison of different profile image sizes with responsive breakpoints. Sizes automatically adjust for mobile viewing.',
582
+ },
583
+ },
584
+ },
585
+ };
586
+
587
+ export const ActionOverflow: Story = {
588
+ args: {
589
+ coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
590
+ profileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-4.0.3&auto=format&fit=crop&w=150&q=80',
591
+ title: 'Action Overflow Demo',
592
+ subtitle: 'Demonstrates responsive action handling with overflow menu',
593
+ actions: profileActions,
594
+ maxVisibleActions: 2,
595
+ height: 160,
596
+ profileImageSize: 'medium',
597
+ },
598
+ render: (args) => (
599
+ <QwickApp appId="banner-overflow" appName='Action Overflow'>
600
+ <PageBannerHeader {...args} />
601
+ <div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
602
+ <h3>Action Overflow Behavior</h3>
603
+ <p>
604
+ This demo shows how the PageBannerHeader handles multiple actions. With <code>maxVisibleActions</code> set to 2,
605
+ only the first 2 priority actions are shown as buttons, while the remaining actions are accessible through
606
+ the overflow menu (⋮ button).
607
+ </p>
608
+
609
+ <div style={{
610
+ marginTop: '2rem',
611
+ padding: '1rem',
612
+ backgroundColor: 'var(--theme-surface)',
613
+ borderRadius: '8px',
614
+ border: '1px solid var(--theme-outline)'
615
+ }}>
616
+ <h4>💡 Responsive Design:</h4>
617
+ <ul style={{ margin: '1rem 0' }}>
618
+ <li>On mobile, action button text may be hidden to save space</li>
619
+ <li>Actions are sorted by priority (lower numbers = higher priority)</li>
620
+ <li>Destructive actions are styled with warning colors</li>
621
+ <li>Overflow menu provides access to all additional actions</li>
622
+ </ul>
623
+ </div>
624
+ </div>
625
+ </QwickApp>
626
+ ),
627
+ parameters: {
628
+ docs: {
629
+ description: {
630
+ story: 'Demonstrates action overflow functionality with priority-based sorting and responsive behavior.',
631
+ },
632
+ },
633
+ },
634
+ };
635
+
636
+ export const MinimalLayout: Story = {
637
+ args: {
638
+ coverImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
639
+ title: 'Minimal Banner',
640
+ subtitle: 'Clean layout without profile image or actions',
641
+ height: 120,
642
+ },
643
+ render: (args) => (
644
+ <QwickApp appId="banner-minimal" appName='Minimal Banner'>
645
+ <PageBannerHeader {...args} />
646
+ <div style={{ padding: '2rem', maxWidth: '600px', margin: '0 auto', textAlign: 'center' }}>
647
+ <p>
648
+ Sometimes less is more. This minimal banner focuses attention on the content
649
+ while providing a beautiful backdrop with the cover image.
650
+ </p>
651
+ </div>
652
+ </QwickApp>
653
+ ),
654
+ parameters: {
655
+ docs: {
656
+ description: {
657
+ story: 'Minimal banner with just cover image, title, and subtitle. Perfect for simple headers and landing pages.',
658
+ },
659
+ },
660
+ },
661
+ };
662
+
663
+ // Data Binding Examples
664
+ export const DataBindingTeamMember: Story = {
665
+ render: () => (
666
+ <QwickApp
667
+ appId="banner-data-team"
668
+ appName='Team Member Data Binding'
669
+ dataSource={{ dataProvider }}
670
+ >
671
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
672
+
673
+ <Box>
674
+ <Typography variant="h5" gutterBottom>📊 Data-Driven Team Member Banner</Typography>
675
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
676
+ PageBannerHeader components can be driven entirely by CMS data using the dataSource prop.
677
+ </Typography>
678
+
679
+ <Code title="Usage" language="tsx">{`<PageBannerHeader dataSource="pageBannerHeaders.teamMember" />`}</Code>
680
+
681
+ <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.pageBannerHeaders.teamMember, null, 2)}</Code>
682
+ </Box>
683
+
684
+ <PageBannerHeader dataSource="pageBannerHeaders.teamMember" />
685
+
686
+ <div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
687
+ <h3>Team Member Profile</h3>
688
+ <p>
689
+ This team member banner is completely driven by CMS data, including the cover image,
690
+ profile photo, metadata, tags, and actions. Perfect for team directories and professional profiles.
691
+ </p>
692
+ </div>
693
+
694
+ </div>
695
+ </QwickApp>
696
+ ),
697
+ parameters: {
698
+ docs: {
699
+ description: {
700
+ story: 'Team member banner with complete data binding - all content loaded from CMS data source.',
701
+ },
702
+ },
703
+ },
704
+ };
705
+
706
+ export const DataBindingCompany: Story = {
707
+ render: () => (
708
+ <QwickApp
709
+ appId="banner-data-company"
710
+ appName='Company Data Binding'
711
+ dataSource={{ dataProvider }}
712
+ >
713
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
714
+
715
+ <Box>
716
+ <Typography variant="h5" gutterBottom>🏢 Data-Driven Company Banner</Typography>
717
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
718
+ Company banners can pull all their content from CMS, making them perfect for dynamic business pages.
719
+ </Typography>
720
+ </Box>
721
+
722
+ <PageBannerHeader dataSource="pageBannerHeaders.company" />
723
+
724
+ <div style={{ padding: '2rem', maxWidth: '900px', margin: '0 auto' }}>
725
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem' }}>
726
+ <div>
727
+ <h3>Dynamic Content</h3>
728
+ <p>
729
+ All banner content including metrics, tags, and actions are dynamically loaded
730
+ from the CMS, allowing for real-time updates without code changes.
731
+ </p>
732
+ </div>
733
+
734
+ <div>
735
+ <h3>Flexible Layout</h3>
736
+ <p>
737
+ The banner automatically adapts to the available data, showing or hiding
738
+ elements based on what's provided in the data source.
739
+ </p>
740
+ </div>
741
+ </div>
742
+ </div>
743
+
744
+ </div>
745
+ </QwickApp>
746
+ ),
747
+ parameters: {
748
+ docs: {
749
+ description: {
750
+ story: 'Company banner with data binding showing business metrics, technology tags, and corporate actions.',
751
+ },
752
+ },
753
+ },
754
+ };
755
+
756
+ export const DataBindingProject: Story = {
757
+ render: () => (
758
+ <QwickApp
759
+ appId="banner-data-project"
760
+ appName='Project Data Binding'
761
+ dataSource={{ dataProvider }}
762
+ >
763
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
764
+
765
+ <Box>
766
+ <Typography variant="h5" gutterBottom>🚀 Data-Driven Project Banner</Typography>
767
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
768
+ Project showcases benefit from data binding by automatically displaying current metrics and status.
769
+ </Typography>
770
+ </Box>
771
+
772
+ <PageBannerHeader dataSource="pageBannerHeaders.project" />
773
+
774
+ <div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
775
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '2rem' }}>
776
+ <div>
777
+ <h3>🎯 Real-time Metrics</h3>
778
+ <p>
779
+ Project banners can display live statistics like user counts, data processing volumes,
780
+ and system uptime directly from your APIs.
781
+ </p>
782
+ </div>
783
+
784
+ <div>
785
+ <h3>⚡ Technology Stack</h3>
786
+ <p>
787
+ Technology tags are automatically generated from project metadata, keeping
788
+ documentation in sync with actual implementation.
789
+ </p>
790
+ </div>
791
+
792
+ <div>
793
+ <h3>🔗 Dynamic Actions</h3>
794
+ <p>
795
+ Action buttons can be configured per project, with URLs and availability
796
+ controlled through the CMS for maximum flexibility.
797
+ </p>
798
+ </div>
799
+ </div>
800
+ </div>
801
+
802
+ </div>
803
+ </QwickApp>
804
+ ),
805
+ parameters: {
806
+ docs: {
807
+ description: {
808
+ story: 'Project showcase banner with data binding displaying real-time metrics, technology stack, and dynamic actions.',
809
+ },
810
+ },
811
+ },
812
+ };
813
+
814
+ export const DataBindingWithFallback: Story = {
815
+ render: () => (
816
+ <QwickApp
817
+ appId="banner-data-fallback"
818
+ appName='Data Binding with Fallback'
819
+ dataSource={{ dataProvider }}
820
+ >
821
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
822
+
823
+ <Box>
824
+ <Typography variant="h5" gutterBottom>🛡️ Fallback Support</Typography>
825
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
826
+ PageBannerHeader gracefully handles missing data sources with fallback props.
827
+ </Typography>
828
+
829
+ <Code title="Fallback Usage" language="tsx">{`<PageBannerHeader
830
+ dataSource="nonexistent.data"
831
+ title="Fallback Title"
832
+ subtitle="Shows when data source is missing"
833
+ coverImage="/fallback-cover.jpg"
834
+ />`}</Code>
835
+ </Box>
836
+
837
+ <PageBannerHeader
838
+ dataSource="nonexistent.data"
839
+ title="Fallback Banner"
840
+ subtitle="This content appears when the dataSource doesn't exist"
841
+ coverImage="https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80"
842
+ height={160}
843
+ />
844
+
845
+ <div style={{ padding: '2rem', maxWidth: '700px', margin: '0 auto' }}>
846
+ <h3>Graceful Degradation</h3>
847
+ <p>
848
+ When a data source is unavailable or empty, the component falls back to traditional props,
849
+ ensuring your application remains functional even when CMS data is missing.
850
+ </p>
851
+ </div>
852
+
853
+ </div>
854
+ </QwickApp>
855
+ ),
856
+ parameters: {
857
+ docs: {
858
+ description: {
859
+ story: 'Banner with fallback props when dataSource is missing or unavailable, ensuring graceful degradation.',
860
+ },
861
+ },
862
+ },
863
+ };
864
+
865
+ export const AccessibilityDemo: Story = {
866
+ render: () => (
867
+ <QwickApp
868
+ appId="banner-accessibility"
869
+ appName='Accessibility Features Demo'
870
+ dataSource={{ dataProvider }}
871
+ >
872
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
873
+
874
+ <Box>
875
+ <Typography variant="h5" gutterBottom>♿ Accessibility Features</Typography>
876
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
877
+ PageBannerHeader components include comprehensive accessibility features following WCAG 2.1 guidelines.
878
+ </Typography>
879
+
880
+ <Code title="Accessibility Features" language="tsx">{`<PageBannerHeader
881
+ dataSource="pageBannerHeaders.accessibilityDemo"
882
+ // Automatic accessibility features:
883
+ // - Semantic HTML (header element)
884
+ // - Proper heading hierarchy (h1 for title)
885
+ // - Alt text for all images
886
+ // - ARIA labels for interactive elements
887
+ // - Keyboard navigation support
888
+ // - Screen reader friendly
889
+ />`}</Code>
890
+ </Box>
891
+
892
+ <PageBannerHeader dataSource="pageBannerHeaders.accessibilityDemo" />
893
+
894
+ <div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
895
+ <h3>🎯 Built-in Accessibility</h3>
896
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '2rem', marginTop: '1rem' }}>
897
+ <div>
898
+ <h4>Semantic HTML</h4>
899
+ <ul>
900
+ <li>Uses proper <code>&lt;header&gt;</code> element</li>
901
+ <li>Heading hierarchy with <code>&lt;h1&gt;</code></li>
902
+ <li>Descriptive alt text for images</li>
903
+ <li>ARIA labels for action buttons</li>
904
+ </ul>
905
+ </div>
906
+
907
+ <div>
908
+ <h4>Keyboard Navigation</h4>
909
+ <ul>
910
+ <li>All interactive elements focusable</li>
911
+ <li>Logical tab order maintained</li>
912
+ <li>Action buttons keyboard accessible</li>
913
+ <li>Menu items properly navigable</li>
914
+ </ul>
915
+ </div>
916
+
917
+ <div>
918
+ <h4>Screen Reader Support</h4>
919
+ <ul>
920
+ <li>Comprehensive image alt text</li>
921
+ <li>Descriptive action labels</li>
922
+ <li>Proper heading structure</li>
923
+ <li>Context-aware descriptions</li>
924
+ </ul>
925
+ </div>
926
+
927
+ <div>
928
+ <h4>Visual Design</h4>
929
+ <ul>
930
+ <li>High contrast text overlays</li>
931
+ <li>Readable typography scaling</li>
932
+ <li>Focus indicators on all controls</li>
933
+ <li>Responsive design for all devices</li>
934
+ </ul>
935
+ </div>
936
+ </div>
937
+ </div>
938
+
939
+ </div>
940
+ </QwickApp>
941
+ ),
942
+ parameters: {
943
+ docs: {
944
+ description: {
945
+ story: 'Comprehensive accessibility demo showing WCAG 2.1 compliance, semantic HTML, keyboard navigation, and screen reader support.',
946
+ },
947
+ },
948
+ },
949
+ };