@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,724 @@
1
+ /**
2
+ * Footer Component Stories
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { JsonDataProvider } from '@qwickapps/schema';
8
+ import type { Meta, StoryObj } from '@storybook/react';
9
+ import Footer from '../components/blocks/Footer';
10
+ import Logo from '../components/Logo';
11
+ import QwickApp from '../components/QwickApp';
12
+
13
+ const meta: Meta<typeof Footer> = {
14
+ title: 'Blocks/Footer',
15
+ component: Footer,
16
+ parameters: {
17
+ layout: 'fullscreen',
18
+ docs: {
19
+ description: {
20
+ component: `The Footer component provides a flexible and responsive footer layout with multiple sections, legal information, and branding options.
21
+
22
+ **Key Features:**
23
+ - **Flexible Sections**: Organize links and content into logical groups with titles
24
+ - **Responsive Layout**: Automatically adapts between vertical/horizontal orientations based on screen size
25
+ - **Legal Information**: Built-in support for copyright notices and legal text
26
+ - **Multiple Variants**: Default, contained, and outlined styling options
27
+ - **Logo/Branding**: Optional logo or custom branding element
28
+ - **Link Management**: Support for internal and external links with proper accessibility
29
+
30
+ **Perfect for:**
31
+ - Website and application footers
32
+ - Page-level footers with contextual information
33
+ - Legal compliance and policy links
34
+ - Company information and contact details
35
+ - Site navigation and resource links
36
+ - Brand reinforcement and social links`,
37
+ },
38
+ },
39
+ },
40
+ tags: ['autodocs'],
41
+ argTypes: {
42
+ sections: {
43
+ description: 'Footer sections with titles and links',
44
+ control: { type: 'object' },
45
+ },
46
+ logo: {
47
+ description: 'Optional logo or branding element',
48
+ control: false,
49
+ },
50
+ copyright: {
51
+ description: 'Copyright text',
52
+ control: { type: 'text' },
53
+ },
54
+ legalText: {
55
+ description: 'Additional legal or info text',
56
+ control: { type: 'text' },
57
+ },
58
+ orientation: {
59
+ description: 'Layout orientation',
60
+ control: { type: 'select' },
61
+ options: ['vertical', 'horizontal'],
62
+ },
63
+ variant: {
64
+ description: 'Background variant',
65
+ control: { type: 'select' },
66
+ options: ['default', 'contained', 'outlined'],
67
+ },
68
+ showDivider: {
69
+ description: 'Whether to show divider above footer',
70
+ control: { type: 'boolean' },
71
+ },
72
+ },
73
+ } satisfies Meta<typeof Footer>;
74
+
75
+ export default meta;
76
+ type Story = StoryObj<typeof meta>;
77
+
78
+ // Sample footer sections for demos
79
+ const sampleSections = [
80
+ {
81
+ id: 'product',
82
+ title: 'Product',
83
+ items: [
84
+ { id: 'features', label: 'Features', href: '#features' },
85
+ { id: 'pricing', label: 'Pricing', href: '#pricing' },
86
+ { id: 'documentation', label: 'Documentation', href: '#docs' },
87
+ { id: 'api', label: 'API Reference', href: '#api' },
88
+ { id: 'changelog', label: 'Changelog', href: '#changelog' },
89
+ ],
90
+ },
91
+ {
92
+ id: 'company',
93
+ title: 'Company',
94
+ items: [
95
+ { id: 'about', label: 'About Us', href: '#about' },
96
+ { id: 'careers', label: 'Careers', href: '#careers' },
97
+ { id: 'blog', label: 'Blog', href: '#blog' },
98
+ { id: 'press', label: 'Press Kit', href: '#press' },
99
+ { id: 'contact', label: 'Contact', href: '#contact' },
100
+ ],
101
+ },
102
+ {
103
+ id: 'resources',
104
+ title: 'Resources',
105
+ items: [
106
+ { id: 'help', label: 'Help Center', href: '#help' },
107
+ { id: 'community', label: 'Community', href: '#community' },
108
+ { id: 'tutorials', label: 'Tutorials', href: '#tutorials' },
109
+ { id: 'webinars', label: 'Webinars', href: '#webinars' },
110
+ ],
111
+ },
112
+ {
113
+ id: 'legal',
114
+ title: 'Legal',
115
+ items: [
116
+ { id: 'privacy', label: 'Privacy Policy', href: '#privacy' },
117
+ { id: 'terms', label: 'Terms of Service', href: '#terms' },
118
+ { id: 'cookies', label: 'Cookie Policy', href: '#cookies' },
119
+ { id: 'gdpr', label: 'GDPR Compliance', href: '#gdpr' },
120
+ ],
121
+ },
122
+ ];
123
+
124
+ const socialSections = [
125
+ {
126
+ id: 'social',
127
+ title: 'Follow Us',
128
+ items: [
129
+ { id: 'twitter', label: 'Twitter', href: 'https://twitter.com/qwickapps', external: true },
130
+ { id: 'linkedin', label: 'LinkedIn', href: 'https://linkedin.com/company/qwickapps', external: true },
131
+ { id: 'github', label: 'GitHub', href: 'https://github.com/qwickapps', external: true },
132
+ { id: 'youtube', label: 'YouTube', href: 'https://youtube.com/@qwickapps', external: true },
133
+ ],
134
+ },
135
+ ];
136
+
137
+ // Sample CMS data for data binding stories
138
+ const sampleCmsData = {
139
+ 'footers': {
140
+ 'main': {
141
+ sections: [
142
+ {
143
+ id: 'products',
144
+ title: 'Products',
145
+ items: [
146
+ { id: 'framework', label: 'QwickApps React Framework', href: '/framework' },
147
+ { id: 'builder', label: 'QwickApp Builder', href: '/builder' },
148
+ { id: 'cms', label: 'QwickCMS', href: '/cms' },
149
+ { id: 'templates', label: 'Templates', href: '/templates' }
150
+ ]
151
+ },
152
+ {
153
+ id: 'developers',
154
+ title: 'Developers',
155
+ items: [
156
+ { id: 'docs', label: 'Documentation', href: '/docs' },
157
+ { id: 'api', label: 'API Reference', href: '/api' },
158
+ { id: 'guides', label: 'Guides', href: '/guides' },
159
+ { id: 'community', label: 'Community', href: '/community' }
160
+ ]
161
+ },
162
+ {
163
+ id: 'company',
164
+ title: 'Company',
165
+ items: [
166
+ { id: 'about', label: 'About Us', href: '/about' },
167
+ { id: 'careers', label: 'Careers', href: '/careers' },
168
+ { id: 'contact', label: 'Contact', href: '/contact' },
169
+ { id: 'blog', label: 'Blog', href: '/blog' }
170
+ ]
171
+ },
172
+ {
173
+ id: 'social',
174
+ title: 'Connect',
175
+ items: [
176
+ { id: 'twitter', label: 'Twitter', href: 'https://twitter.com/qwickapps', external: true },
177
+ { id: 'linkedin', label: 'LinkedIn', href: 'https://linkedin.com/company/qwickapps', external: true },
178
+ { id: 'github', label: 'GitHub', href: 'https://github.com/qwickapps', external: true }
179
+ ]
180
+ }
181
+ ],
182
+ logo: '<strong style="font-size: 1.5rem; color: #1976d2;">QwickApps</strong>',
183
+ copyright: '© 2025 QwickApps. All rights reserved.',
184
+ legalText: 'Privacy Policy | Terms of Service | Cookie Policy',
185
+ orientation: 'vertical',
186
+ variant: 'default',
187
+ showDivider: true
188
+ },
189
+ 'startup': {
190
+ sections: [
191
+ {
192
+ id: 'links',
193
+ items: [
194
+ { id: 'home', label: 'Home', href: '/' },
195
+ { id: 'about', label: 'About', href: '/about' },
196
+ { id: 'services', label: 'Services', href: '/services' },
197
+ { id: 'contact', label: 'Contact', href: '/contact' }
198
+ ]
199
+ }
200
+ ],
201
+ copyright: '© 2025 Startup Inc.',
202
+ orientation: 'horizontal',
203
+ variant: 'contained',
204
+ showDivider: false
205
+ },
206
+ 'ecommerce': {
207
+ sections: [
208
+ {
209
+ id: 'shop',
210
+ title: 'Shop',
211
+ items: [
212
+ { id: 'products', label: 'All Products', href: '/products' },
213
+ { id: 'sale', label: 'Sale', href: '/sale' },
214
+ { id: 'new', label: 'New Arrivals', href: '/new' }
215
+ ]
216
+ },
217
+ {
218
+ id: 'support',
219
+ title: 'Customer Support',
220
+ items: [
221
+ { id: 'help', label: 'Help Center', href: '/help' },
222
+ { id: 'returns', label: 'Returns', href: '/returns' },
223
+ { id: 'shipping', label: 'Shipping Info', href: '/shipping' }
224
+ ]
225
+ }
226
+ ],
227
+ copyright: '© 2025 E-Store. All rights reserved.',
228
+ legalText: 'Privacy | Terms | Returns Policy',
229
+ orientation: 'vertical',
230
+ variant: 'outlined',
231
+ showDivider: true
232
+ },
233
+ 'minimal': {
234
+ copyright: '© 2025 Minimal Site',
235
+ variant: 'default',
236
+ showDivider: false
237
+ }
238
+ }
239
+ };
240
+
241
+ const dataProvider = new JsonDataProvider({ data: sampleCmsData });
242
+
243
+ export const BasicFooter: Story = {
244
+ args: {
245
+ sections: sampleSections.slice(0, 2),
246
+ copyright: '© 2025 QwickApps. All rights reserved.',
247
+ orientation: 'horizontal',
248
+ variant: 'default',
249
+ showDivider: true,
250
+ },
251
+ render: (args) => (
252
+ <QwickApp appId="footer-basic" appName='Footer Basic'>
253
+ <div style={{ minHeight: '50vh', padding: '2rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
254
+ <div style={{ textAlign: 'center', maxWidth: '600px' }}>
255
+ <h2>Page Content</h2>
256
+ <p>This is the main page content. Scroll down to see the footer.</p>
257
+ <p>The footer will appear below this content with organized sections and copyright information.</p>
258
+ </div>
259
+ </div>
260
+ <Footer {...args} />
261
+ </QwickApp>
262
+ ),
263
+ parameters: {
264
+ docs: {
265
+ description: {
266
+ story: 'Basic footer with two sections and copyright information. Clean and minimal design.',
267
+ },
268
+ },
269
+ },
270
+ };
271
+
272
+ export const ComprehensiveFooter: Story = {
273
+ args: {
274
+ logo: <Logo name="Qwick Apps" size="small" />,
275
+ sections: sampleSections,
276
+ copyright: '© 2025 QwickApps Inc. All rights reserved.',
277
+ legalText: 'Privacy Policy • Terms of Service • Cookie Settings',
278
+ orientation: 'horizontal',
279
+ variant: 'contained',
280
+ showDivider: true,
281
+ },
282
+ render: (args) => (
283
+ <QwickApp appId="footer-comprehensive" appName='Footer Comprehensive'>
284
+ <div style={{ minHeight: '60vh', padding: '2rem' }}>
285
+ <div style={{ maxWidth: '800px', margin: '0 auto' }}>
286
+ <h1>QwickApps Platform</h1>
287
+ <p>
288
+ Build amazing React applications with our comprehensive component library and development tools.
289
+ Our platform provides everything you need to create modern, accessible, and performant web applications.
290
+ </p>
291
+
292
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: '2rem', margin: '3rem 0' }}>
293
+ <div style={{ padding: '2rem', backgroundColor: 'var(--theme-surface)', borderRadius: '8px', border: '1px solid var(--theme-outline)' }}>
294
+ <h3>🚀 Components</h3>
295
+ <p>Over 50+ production-ready components with TypeScript support.</p>
296
+ </div>
297
+ <div style={{ padding: '2rem', backgroundColor: 'var(--theme-surface)', borderRadius: '8px', border: '1px solid var(--theme-outline)' }}>
298
+ <h3>🎨 Theming</h3>
299
+ <p>Flexible theming system with dark mode and custom palettes.</p>
300
+ </div>
301
+ <div style={{ padding: '2rem', backgroundColor: 'var(--theme-surface)', borderRadius: '8px', border: '1px solid var(--theme-outline)' }}>
302
+ <h3>📱 Responsive</h3>
303
+ <p>Mobile-first design with comprehensive responsive breakpoints.</p>
304
+ </div>
305
+ </div>
306
+ </div>
307
+ </div>
308
+ <Footer {...args} />
309
+ </QwickApp>
310
+ ),
311
+ parameters: {
312
+ docs: {
313
+ description: {
314
+ story: 'Comprehensive footer with logo, multiple sections, and legal information. Perfect for business websites and applications.',
315
+ },
316
+ },
317
+ },
318
+ };
319
+
320
+ export const VerticalLayout: Story = {
321
+ args: {
322
+ logo: (
323
+ <div style={{
324
+ fontWeight: 'bold',
325
+ fontSize: '1.5rem',
326
+ background: 'linear-gradient(45deg, #2196F3, #21CBF3)',
327
+ WebkitBackgroundClip: 'text',
328
+ WebkitTextFillColor: 'transparent',
329
+ backgroundClip: 'text'
330
+ }}>
331
+ BRAND
332
+ </div>
333
+ ),
334
+ sections: sampleSections.slice(0, 3),
335
+ copyright: '© 2025 Brand Corp.',
336
+ legalText: 'Privacy • Terms • Cookies',
337
+ orientation: 'vertical',
338
+ variant: 'outlined',
339
+ showDivider: true,
340
+ },
341
+ render: (args) => (
342
+ <QwickApp appId="footer-vertical" appName='Footer Vertical'>
343
+ <div style={{ minHeight: '50vh', padding: '2rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
344
+ <div style={{ textAlign: 'center', maxWidth: '600px' }}>
345
+ <h2>Vertical Footer Layout</h2>
346
+ <p>This demonstrates the vertical orientation where sections are stacked on top of each other.</p>
347
+ </div>
348
+ </div>
349
+ <Footer {...args} />
350
+ </QwickApp>
351
+ ),
352
+ parameters: {
353
+ docs: {
354
+ description: {
355
+ story: 'Vertical footer layout with sections stacked on top of each other. Automatically switches to horizontal on larger screens for better usability.',
356
+ },
357
+ },
358
+ },
359
+ };
360
+
361
+ export const SocialMediaFooter: Story = {
362
+ args: {
363
+ logo: (
364
+ <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
365
+ <div style={{
366
+ width: '32px',
367
+ height: '32px',
368
+ background: 'linear-gradient(45deg, #FF6B6B, #4ECDC4)',
369
+ borderRadius: '8px',
370
+ display: 'flex',
371
+ alignItems: 'center',
372
+ justifyContent: 'center',
373
+ fontSize: '1.2rem',
374
+ }}>
375
+ 🌟
376
+ </div>
377
+ <span style={{ fontWeight: 'bold', fontSize: '1.2rem' }}>SocialApp</span>
378
+ </div>
379
+ ),
380
+ sections: [
381
+ ...sampleSections.slice(0, 2),
382
+ ...socialSections,
383
+ ],
384
+ copyright: '© 2025 SocialApp. Made with ❤️ in San Francisco.',
385
+ legalText: 'Privacy Policy • Community Guidelines • Terms of Use',
386
+ orientation: 'horizontal',
387
+ variant: 'contained',
388
+ showDivider: false,
389
+ },
390
+ render: (args) => (
391
+ <QwickApp appId="footer-social" appName='Footer Social'>
392
+ <div style={{
393
+ minHeight: '60vh',
394
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
395
+ padding: '3rem 2rem',
396
+ display: 'flex',
397
+ alignItems: 'center',
398
+ justifyContent: 'center',
399
+ color: 'white'
400
+ }}>
401
+ <div style={{ textAlign: 'center', maxWidth: '700px' }}>
402
+ <h1 style={{ fontSize: '3rem', marginBottom: '1rem' }}>Connect & Share</h1>
403
+ <p style={{ fontSize: '1.2rem', opacity: 0.9 }}>
404
+ Join millions of users sharing their stories, connecting with friends, and discovering amazing content every day.
405
+ </p>
406
+ <button style={{
407
+ marginTop: '2rem',
408
+ padding: '1rem 2rem',
409
+ fontSize: '1.1rem',
410
+ backgroundColor: 'white',
411
+ color: '#667eea',
412
+ border: 'none',
413
+ borderRadius: '8px',
414
+ fontWeight: 'bold',
415
+ cursor: 'pointer'
416
+ }}>
417
+ Get Started Today
418
+ </button>
419
+ </div>
420
+ </div>
421
+ <Footer {...args} />
422
+ </QwickApp>
423
+ ),
424
+ parameters: {
425
+ docs: {
426
+ description: {
427
+ story: 'Social media style footer with custom logo, social links, and community-focused content.',
428
+ },
429
+ },
430
+ },
431
+ };
432
+
433
+ export const MinimalFooter: Story = {
434
+ args: {
435
+ copyright: '© 2025 Minimal Co.',
436
+ legalText: 'Privacy • Terms',
437
+ orientation: 'horizontal',
438
+ variant: 'default',
439
+ showDivider: false,
440
+ },
441
+ render: (args) => (
442
+ <QwickApp appId="footer-minimal" appName='Footer Minimal'>
443
+ <div style={{ minHeight: '70vh', padding: '3rem 2rem' }}>
444
+ <div style={{ maxWidth: '600px', margin: '0 auto', textAlign: 'center' }}>
445
+ <h1>Less is More</h1>
446
+ <p style={{ fontSize: '1.1rem', lineHeight: 1.6, margin: '2rem 0' }}>
447
+ Sometimes the most elegant solution is the simplest one. This minimal footer
448
+ contains only the essential legal information without any additional sections or navigation.
449
+ </p>
450
+ <p>
451
+ Perfect for landing pages, portfolios, or applications where you want to keep
452
+ the focus on your main content while still providing necessary legal compliance.
453
+ </p>
454
+ </div>
455
+ </div>
456
+ <Footer {...args} />
457
+ </QwickApp>
458
+ ),
459
+ parameters: {
460
+ docs: {
461
+ description: {
462
+ story: 'Minimal footer with only copyright and legal text. Perfect for simple pages and focused designs.',
463
+ },
464
+ },
465
+ },
466
+ };
467
+
468
+ export const VariantComparison: Story = {
469
+ render: () => (
470
+ <QwickApp appId="footer-variants" appName='Footer Variants'>
471
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
472
+ {/* Default Variant */}
473
+ <div style={{ minHeight: '30vh', padding: '2rem', backgroundColor: '#f5f5f5' }}>
474
+ <div style={{ textAlign: 'center', maxWidth: '600px', margin: '0 auto' }}>
475
+ <h2>Default Variant</h2>
476
+ <p>Transparent background, blends with page content.</p>
477
+ </div>
478
+ </div>
479
+ <Footer
480
+ sections={sampleSections.slice(0, 2)}
481
+ copyright="© 2025 Default Footer"
482
+ variant="default"
483
+ />
484
+
485
+ {/* Contained Variant */}
486
+ <div style={{ minHeight: '30vh', padding: '2rem', backgroundColor: '#e3f2fd' }}>
487
+ <div style={{ textAlign: 'center', maxWidth: '600px', margin: '0 auto' }}>
488
+ <h2>Contained Variant</h2>
489
+ <p>Solid background color for clear separation from content.</p>
490
+ </div>
491
+ </div>
492
+ <Footer
493
+ sections={sampleSections.slice(0, 2)}
494
+ copyright="© 2025 Contained Footer"
495
+ variant="contained"
496
+ />
497
+
498
+ {/* Outlined Variant */}
499
+ <div style={{ minHeight: '30vh', padding: '2rem', backgroundColor: '#fff3e0' }}>
500
+ <div style={{ textAlign: 'center', maxWidth: '600px', margin: '0 auto' }}>
501
+ <h2>Outlined Variant</h2>
502
+ <p>Border outline for subtle definition without heavy background.</p>
503
+ </div>
504
+ </div>
505
+ <Footer
506
+ sections={sampleSections.slice(0, 2)}
507
+ copyright="© 2025 Outlined Footer"
508
+ variant="outlined"
509
+ />
510
+ </div>
511
+ </QwickApp>
512
+ ),
513
+ parameters: {
514
+ docs: {
515
+ description: {
516
+ story: 'Comparison of footer variants: default (transparent), contained (solid background), and outlined (border).',
517
+ },
518
+ },
519
+ },
520
+ };
521
+
522
+ export const DeveloperFooter: Story = {
523
+ args: {
524
+ logo: (
525
+ <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
526
+ <span style={{ fontSize: '1.5rem' }}>👩‍💻</span>
527
+ <span style={{ fontWeight: 'bold', fontSize: '1.2rem' }}>DevPortfolio</span>
528
+ </div>
529
+ ),
530
+ sections: [
531
+ {
532
+ id: 'projects',
533
+ title: 'Projects',
534
+ items: [
535
+ { id: 'web-apps', label: 'Web Applications', href: '#web-apps' },
536
+ { id: 'mobile-apps', label: 'Mobile Apps', href: '#mobile-apps' },
537
+ { id: 'open-source', label: 'Open Source', href: '#open-source' },
538
+ { id: 'experiments', label: 'Experiments', href: '#experiments' },
539
+ ],
540
+ },
541
+ {
542
+ id: 'skills',
543
+ title: 'Skills',
544
+ items: [
545
+ { id: 'frontend', label: 'Frontend Development', onClick: () => alert('Frontend skills') },
546
+ { id: 'backend', label: 'Backend Development', onClick: () => alert('Backend skills') },
547
+ { id: 'devops', label: 'DevOps & Cloud', onClick: () => alert('DevOps skills') },
548
+ { id: 'design', label: 'UI/UX Design', onClick: () => alert('Design skills') },
549
+ ],
550
+ },
551
+ {
552
+ id: 'connect',
553
+ title: 'Connect',
554
+ items: [
555
+ { id: 'email', label: 'Email', href: 'mailto:hello@devportfolio.com' },
556
+ { id: 'linkedin', label: 'LinkedIn', href: 'https://linkedin.com/in/developer', external: true },
557
+ { id: 'github', label: 'GitHub', href: 'https://github.com/developer', external: true },
558
+ { id: 'resume', label: 'Download Resume', href: '/resume.pdf', external: true },
559
+ ],
560
+ },
561
+ ],
562
+ copyright: '© 2025 Jane Developer. Built with React and TypeScript.',
563
+ legalText: 'Available for hire • Open to opportunities',
564
+ orientation: 'horizontal',
565
+ variant: 'default',
566
+ showDivider: true,
567
+ },
568
+ render: (args) => (
569
+ <QwickApp appId="footer-developer" appName='Footer Developer'>
570
+ <div style={{ padding: '2rem' }}>
571
+ <div style={{ maxWidth: '800px', margin: '0 auto' }}>
572
+ <h1>Jane Developer</h1>
573
+ <p style={{ fontSize: '1.2rem', color: 'var(--theme-on-background)', opacity: 0.8 }}>
574
+ Full-Stack Developer & UI/UX Designer
575
+ </p>
576
+
577
+ <div style={{ margin: '3rem 0' }}>
578
+ <h2>Featured Projects</h2>
579
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem', marginTop: '2rem' }}>
580
+ <div style={{ padding: '2rem', border: '1px solid var(--theme-outline)', borderRadius: '12px' }}>
581
+ <h3>🌟 Task Management App</h3>
582
+ <p>React, TypeScript, Node.js, PostgreSQL</p>
583
+ <div style={{ display: 'flex', gap: '1rem', marginTop: '1rem' }}>
584
+ <button style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'white', border: 'none', borderRadius: '4px' }}>
585
+ View Project
586
+ </button>
587
+ <button style={{ padding: '0.5rem 1rem', border: '1px solid var(--theme-outline)', backgroundColor: 'transparent', borderRadius: '4px' }}>
588
+ GitHub
589
+ </button>
590
+ </div>
591
+ </div>
592
+
593
+ <div style={{ padding: '2rem', border: '1px solid var(--theme-outline)', borderRadius: '12px' }}>
594
+ <h3>🎨 Design System</h3>
595
+ <p>React, Storybook, Figma, Design Tokens</p>
596
+ <div style={{ display: 'flex', gap: '1rem', marginTop: '1rem' }}>
597
+ <button style={{ padding: '0.5rem 1rem', backgroundColor: 'var(--theme-primary)', color: 'white', border: 'none', borderRadius: '4px' }}>
598
+ View Project
599
+ </button>
600
+ <button style={{ padding: '0.5rem 1rem', border: '1px solid var(--theme-outline)', backgroundColor: 'transparent', borderRadius: '4px' }}>
601
+ GitHub
602
+ </button>
603
+ </div>
604
+ </div>
605
+ </div>
606
+ </div>
607
+ </div>
608
+ </div>
609
+ <Footer {...args} />
610
+ </QwickApp>
611
+ ),
612
+ parameters: {
613
+ docs: {
614
+ description: {
615
+ story: 'Developer portfolio footer with projects, skills, and professional contact information. Perfect for personal websites and portfolios.',
616
+ },
617
+ },
618
+ },
619
+ };
620
+
621
+ // Data Binding Stories
622
+ export const DataBindingMain: Story = {
623
+ args: {
624
+ dataSource: 'footers.main',
625
+ },
626
+ render: (args) => (
627
+ <QwickApp appId="footer-data-main" appName='Footer Data Binding Main' dataSource={{ dataProvider }}>
628
+ <div style={{ minHeight: '50vh', padding: '2rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
629
+ <div style={{ textAlign: 'center', maxWidth: '600px' }}>
630
+ <h1>Company Website</h1>
631
+ <p style={{ fontSize: '1.2rem', color: 'var(--theme-on-background)', opacity: 0.8, marginBottom: '3rem' }}>
632
+ Complete footer loaded from CMS with multiple sections, logo, copyright, and legal information.
633
+ </p>
634
+ </div>
635
+ </div>
636
+ <Footer {...args} />
637
+ </QwickApp>
638
+ ),
639
+ parameters: {
640
+ docs: {
641
+ description: {
642
+ story: 'Footer content loaded from CMS data source. Shows comprehensive footer with multiple navigation sections, social links, and legal information.',
643
+ },
644
+ },
645
+ },
646
+ };
647
+
648
+ export const DataBindingStartup: Story = {
649
+ args: {
650
+ dataSource: 'footers.startup',
651
+ },
652
+ render: (args) => (
653
+ <QwickApp appId="footer-data-startup" appName='Footer Data Binding Startup' dataSource={{ dataProvider }}>
654
+ <div style={{ minHeight: '50vh', padding: '2rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
655
+ <div style={{ textAlign: 'center', maxWidth: '600px' }}>
656
+ <h1>Startup Landing</h1>
657
+ <p style={{ fontSize: '1.2rem', color: 'var(--theme-on-background)', opacity: 0.8, marginBottom: '3rem' }}>
658
+ Simple horizontal footer layout perfect for startup landing pages.
659
+ </p>
660
+ </div>
661
+ </div>
662
+ <Footer {...args} />
663
+ </QwickApp>
664
+ ),
665
+ parameters: {
666
+ docs: {
667
+ description: {
668
+ story: 'Startup-style footer loaded from CMS. Features horizontal layout with contained variant and minimal links.',
669
+ },
670
+ },
671
+ },
672
+ };
673
+
674
+ export const DataBindingEcommerce: Story = {
675
+ args: {
676
+ dataSource: 'footers.ecommerce',
677
+ },
678
+ render: (args) => (
679
+ <QwickApp appId="footer-data-ecommerce" appName='Footer Data Binding Ecommerce' dataSource={{ dataProvider }}>
680
+ <div style={{ minHeight: '50vh', padding: '2rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
681
+ <div style={{ textAlign: 'center', maxWidth: '600px' }}>
682
+ <h1>E-Commerce Store</h1>
683
+ <p style={{ fontSize: '1.2rem', color: 'var(--theme-on-background)', opacity: 0.8, marginBottom: '3rem' }}>
684
+ E-commerce footer with shopping categories and customer support sections.
685
+ </p>
686
+ </div>
687
+ </div>
688
+ <Footer {...args} />
689
+ </QwickApp>
690
+ ),
691
+ parameters: {
692
+ docs: {
693
+ description: {
694
+ story: 'E-commerce footer loaded from CMS. Features outlined variant with shopping and support sections.',
695
+ },
696
+ },
697
+ },
698
+ };
699
+
700
+ export const DataBindingMinimal: Story = {
701
+ args: {
702
+ dataSource: 'footers.minimal',
703
+ },
704
+ render: (args) => (
705
+ <QwickApp appId="footer-data-minimal" appName='Footer Data Binding Minimal' dataSource={{ dataProvider }}>
706
+ <div style={{ minHeight: '50vh', padding: '2rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
707
+ <div style={{ textAlign: 'center', maxWidth: '600px' }}>
708
+ <h1>Minimal Site</h1>
709
+ <p style={{ fontSize: '1.2rem', color: 'var(--theme-on-background)', opacity: 0.8, marginBottom: '3rem' }}>
710
+ Ultra-minimal footer with just copyright information.
711
+ </p>
712
+ </div>
713
+ </div>
714
+ <Footer {...args} />
715
+ </QwickApp>
716
+ ),
717
+ parameters: {
718
+ docs: {
719
+ description: {
720
+ story: 'Minimal footer loaded from CMS. Shows the simplest possible footer with just copyright text.',
721
+ },
722
+ },
723
+ },
724
+ };