@qwickapps/react-framework 1.3.5 → 1.4.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 (320) hide show
  1. package/README.md +1681 -2
  2. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
  3. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
  4. package/dist/components/ErrorBoundary.d.ts +7 -0
  5. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  6. package/dist/components/Html.d.ts +28 -18
  7. package/dist/components/Html.d.ts.map +1 -1
  8. package/dist/components/Logo.d.ts +12 -35
  9. package/dist/components/Logo.d.ts.map +1 -1
  10. package/dist/components/Markdown.d.ts +18 -13
  11. package/dist/components/Markdown.d.ts.map +1 -1
  12. package/dist/components/QwickApp.d.ts +16 -3
  13. package/dist/components/QwickApp.d.ts.map +1 -1
  14. package/dist/components/QwickIcon.d.ts +23 -0
  15. package/dist/components/QwickIcon.d.ts.map +1 -0
  16. package/dist/components/SafeSpan.d.ts +12 -5
  17. package/dist/components/SafeSpan.d.ts.map +1 -1
  18. package/dist/components/Scaffold.d.ts.map +1 -1
  19. package/dist/components/base/ModelView.d.ts +101 -0
  20. package/dist/components/base/ModelView.d.ts.map +1 -0
  21. package/dist/components/base/index.d.ts +11 -0
  22. package/dist/components/base/index.d.ts.map +1 -0
  23. package/dist/components/blocks/Article.d.ts +12 -2
  24. package/dist/components/blocks/Article.d.ts.map +1 -1
  25. package/dist/components/blocks/Code.d.ts +13 -2
  26. package/dist/components/blocks/Code.d.ts.map +1 -1
  27. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
  28. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  29. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  30. package/dist/components/blocks/Footer.d.ts.map +1 -1
  31. package/dist/components/blocks/HeroBlock.d.ts +27 -13
  32. package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
  33. package/dist/components/blocks/Image.d.ts +41 -0
  34. package/dist/components/blocks/Image.d.ts.map +1 -0
  35. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  36. package/dist/components/blocks/Section.d.ts +16 -2
  37. package/dist/components/blocks/Section.d.ts.map +1 -1
  38. package/dist/components/blocks/Text.d.ts +41 -0
  39. package/dist/components/blocks/Text.d.ts.map +1 -0
  40. package/dist/components/blocks/index.d.ts +4 -0
  41. package/dist/components/blocks/index.d.ts.map +1 -1
  42. package/dist/components/buttons/Button.d.ts +23 -7
  43. package/dist/components/buttons/Button.d.ts.map +1 -1
  44. package/dist/components/forms/FormBlock.d.ts +19 -13
  45. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  46. package/dist/components/index.d.ts +4 -0
  47. package/dist/components/index.d.ts.map +1 -1
  48. package/dist/components/input/ChoiceInputField.d.ts +17 -11
  49. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  50. package/dist/components/input/HtmlInputField.d.ts +17 -11
  51. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  52. package/dist/components/input/SelectInputField.d.ts +16 -10
  53. package/dist/components/input/SelectInputField.d.ts.map +1 -1
  54. package/dist/components/input/SwitchInputField.d.ts +16 -10
  55. package/dist/components/input/SwitchInputField.d.ts.map +1 -1
  56. package/dist/components/input/TextField.d.ts.map +1 -1
  57. package/dist/components/input/TextInputField.d.ts +16 -11
  58. package/dist/components/input/TextInputField.d.ts.map +1 -1
  59. package/dist/components/layout/GridCell.d.ts +23 -6
  60. package/dist/components/layout/GridCell.d.ts.map +1 -1
  61. package/dist/components/layout/GridLayout.d.ts +24 -23
  62. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  63. package/dist/components/pages/FormPage.d.ts.map +1 -1
  64. package/dist/components/pages/Page.d.ts +49 -87
  65. package/dist/components/pages/Page.d.ts.map +1 -1
  66. package/dist/components/pages/index.d.ts +2 -2
  67. package/dist/components/pages/index.d.ts.map +1 -1
  68. package/dist/config/AppConfig.d.ts +49 -0
  69. package/dist/config/AppConfig.d.ts.map +1 -0
  70. package/dist/config/AppConfigBuilder.d.ts +75 -0
  71. package/dist/config/AppConfigBuilder.d.ts.map +1 -0
  72. package/dist/config/index.d.ts +13 -0
  73. package/dist/config/index.d.ts.map +1 -0
  74. package/dist/config/types.d.ts +130 -0
  75. package/dist/config/types.d.ts.map +1 -0
  76. package/dist/config.d.ts +15 -0
  77. package/dist/config.d.ts.map +1 -0
  78. package/dist/config.esm.js +451 -0
  79. package/dist/config.js +455 -0
  80. package/dist/contexts/PrintModeContext.d.ts +27 -0
  81. package/dist/contexts/PrintModeContext.d.ts.map +1 -0
  82. package/dist/contexts/QwickAppContext.d.ts +2 -2
  83. package/dist/contexts/QwickAppContext.d.ts.map +1 -1
  84. package/dist/contexts/index.d.ts +2 -0
  85. package/dist/contexts/index.d.ts.map +1 -1
  86. package/dist/hooks/index.d.ts +2 -0
  87. package/dist/hooks/index.d.ts.map +1 -1
  88. package/dist/hooks/usePrintMode.d.ts +39 -0
  89. package/dist/hooks/usePrintMode.d.ts.map +1 -0
  90. package/dist/index.css +1 -1
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.esm.css +1 -1
  94. package/dist/index.esm.js +10951 -6238
  95. package/dist/index.js +11014 -6287
  96. package/dist/schemas/CodeSchema.d.ts +2 -1
  97. package/dist/schemas/CodeSchema.d.ts.map +1 -1
  98. package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
  99. package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
  100. package/dist/schemas/ContentSchema.d.ts +2 -1
  101. package/dist/schemas/ContentSchema.d.ts.map +1 -1
  102. package/dist/schemas/GridCellSchema.d.ts +25 -0
  103. package/dist/schemas/GridCellSchema.d.ts.map +1 -0
  104. package/dist/schemas/GridLayoutSchema.d.ts +23 -0
  105. package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
  106. package/dist/schemas/HtmlSchema.d.ts +14 -0
  107. package/dist/schemas/HtmlSchema.d.ts.map +1 -0
  108. package/dist/schemas/ImageSchema.d.ts +32 -0
  109. package/dist/schemas/ImageSchema.d.ts.map +1 -0
  110. package/dist/schemas/LogoSchema.d.ts +35 -0
  111. package/dist/schemas/LogoSchema.d.ts.map +1 -0
  112. package/dist/schemas/MarkdownSchema.d.ts +14 -0
  113. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  114. package/dist/schemas/PageTemplateSchema.d.ts +31 -0
  115. package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
  116. package/dist/schemas/PrintConfigSchema.d.ts +31 -0
  117. package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
  118. package/dist/schemas/SectionSchema.d.ts +2 -1
  119. package/dist/schemas/SectionSchema.d.ts.map +1 -1
  120. package/dist/schemas/TextSchema.d.ts +37 -0
  121. package/dist/schemas/TextSchema.d.ts.map +1 -0
  122. package/dist/schemas/ViewModelSchema.d.ts +23 -0
  123. package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
  124. package/dist/schemas/index.d.ts +15 -1
  125. package/dist/schemas/index.d.ts.map +1 -1
  126. package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
  127. package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
  128. package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
  129. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
  130. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
  131. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
  132. package/dist/schemas/transformers/registry.d.ts +15 -0
  133. package/dist/schemas/transformers/registry.d.ts.map +1 -0
  134. package/dist/schemas/types/Serializable.d.ts +46 -0
  135. package/dist/schemas/types/Serializable.d.ts.map +1 -0
  136. package/dist/utils/htmlTransform.d.ts.map +1 -1
  137. package/dist/utils/reactUtils.d.ts +12 -3
  138. package/dist/utils/reactUtils.d.ts.map +1 -1
  139. package/package.json +17 -3
  140. package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
  141. package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
  142. package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
  143. package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
  144. package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
  145. package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
  146. package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
  147. package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
  148. package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
  149. package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
  150. package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
  151. package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
  152. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
  153. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
  154. package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
  155. package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
  156. package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
  157. package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
  158. package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
  159. package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
  160. package/src/__tests__/components/Logo.test.js +3 -3
  161. package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
  162. package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
  163. package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
  164. package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
  165. package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
  166. package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
  167. package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
  168. package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
  169. package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
  170. package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
  171. package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
  172. package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
  173. package/src/__tests__/components/base/ModelView.test.tsx +220 -0
  174. package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
  175. package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
  176. package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
  177. package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
  178. package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
  179. package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
  180. package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
  181. package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
  182. package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
  183. package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
  184. package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
  185. package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
  186. package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
  187. package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
  188. package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
  189. package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
  190. package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
  191. package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
  192. package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
  193. package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
  194. package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
  195. package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
  196. package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
  197. package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
  198. package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
  199. package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
  200. package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
  201. package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
  202. package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
  203. package/src/components/ErrorBoundary.tsx +8 -8
  204. package/src/components/Html.tsx +147 -44
  205. package/src/components/Logo.tsx +198 -100
  206. package/src/components/Markdown.tsx +125 -16
  207. package/src/components/QwickApp.tsx +64 -31
  208. package/src/components/QwickIcon.tsx +59 -0
  209. package/src/components/SafeSpan.tsx +65 -10
  210. package/src/components/Scaffold.tsx +2 -8
  211. package/src/components/base/ModelView.tsx +199 -0
  212. package/src/components/base/index.ts +11 -0
  213. package/src/components/blocks/Article.tsx +57 -18
  214. package/src/components/blocks/Code.md +529 -0
  215. package/src/components/blocks/Code.tsx +102 -15
  216. package/src/components/blocks/CoverImageHeader.tsx +9 -4
  217. package/src/components/blocks/FeatureCard.tsx +1 -2
  218. package/src/components/blocks/FeatureGrid.tsx +19 -1
  219. package/src/components/blocks/Footer.tsx +13 -1
  220. package/src/components/blocks/HeroBlock.tsx +87 -20
  221. package/src/components/blocks/Image.tsx +395 -0
  222. package/src/components/blocks/PageBannerHeader.tsx +14 -12
  223. package/src/components/blocks/ProductCard.tsx +1 -1
  224. package/src/components/blocks/Section.tsx +113 -8
  225. package/src/components/blocks/Text.tsx +285 -0
  226. package/src/components/blocks/index.ts +4 -0
  227. package/src/components/buttons/Button.tsx +184 -15
  228. package/src/components/forms/FormBlock.tsx +70 -17
  229. package/src/components/index.ts +5 -0
  230. package/src/components/input/ChoiceInputField.tsx +48 -18
  231. package/src/components/input/HtmlInputField.tsx +48 -18
  232. package/src/components/input/SelectInputField.tsx +48 -16
  233. package/src/components/input/SwitchInputField.tsx +48 -17
  234. package/src/components/input/TextField.tsx +41 -1
  235. package/src/components/input/TextInputField.tsx +52 -18
  236. package/src/components/layout/GridCell.tsx +118 -9
  237. package/src/components/layout/GridLayout.tsx +125 -24
  238. package/src/components/pages/FormPage.tsx +0 -1
  239. package/src/components/pages/Page.css +304 -332
  240. package/src/components/pages/Page.tsx +307 -255
  241. package/src/components/pages/index.ts +2 -2
  242. package/src/config/AppConfig.ts +133 -0
  243. package/src/config/AppConfigBuilder.ts +421 -0
  244. package/src/config/__tests__/AppConfig.test.ts +385 -0
  245. package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
  246. package/src/config/index.ts +24 -0
  247. package/src/config/types.ts +170 -0
  248. package/src/config.ts +25 -0
  249. package/src/contexts/PrintModeContext.tsx +332 -0
  250. package/src/contexts/QwickAppContext.tsx +2 -2
  251. package/src/contexts/index.ts +2 -0
  252. package/src/hooks/index.ts +5 -1
  253. package/src/hooks/usePrintMode.ts +73 -0
  254. package/src/index.ts +3 -0
  255. package/src/schemas/CodeSchema.ts +3 -3
  256. package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
  257. package/src/schemas/ContentSchema.ts +2 -1
  258. package/src/schemas/GridCellSchema.ts +164 -0
  259. package/src/schemas/GridLayoutSchema.ts +133 -0
  260. package/src/schemas/HtmlSchema.ts +47 -0
  261. package/src/schemas/ImageSchema.ts +235 -0
  262. package/src/schemas/LogoSchema.ts +241 -0
  263. package/src/schemas/MarkdownSchema.ts +47 -0
  264. package/src/schemas/PageTemplateSchema.ts +186 -0
  265. package/src/schemas/PrintConfigSchema.ts +207 -0
  266. package/src/schemas/README.md +661 -0
  267. package/src/schemas/SectionSchema.ts +2 -1
  268. package/src/schemas/TextSchema.ts +329 -0
  269. package/src/schemas/ViewModelSchema.ts +115 -0
  270. package/src/schemas/index.ts +21 -2
  271. package/src/schemas/transformers/ComponentTransformer.ts +403 -0
  272. package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
  273. package/src/schemas/transformers/registry.ts +72 -0
  274. package/src/schemas/types/Serializable.ts +51 -0
  275. package/src/stories/AccessibilityProvider.stories.tsx +253 -253
  276. package/src/stories/Article.stories.tsx +433 -433
  277. package/src/stories/Button.stories.tsx +1 -1
  278. package/src/stories/CardListGrid.stories.tsx +451 -451
  279. package/src/stories/ChoiceInputField.stories.tsx +503 -503
  280. package/src/stories/Code.stories.tsx +1 -1
  281. package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
  282. package/src/stories/Content.stories.tsx +393 -393
  283. package/src/stories/CoverImageHeader.stories.tsx +701 -701
  284. package/src/stories/DataBinding.advanced.stories.tsx +432 -432
  285. package/src/stories/DataProvider.stories.tsx +1192 -1192
  286. package/src/stories/FeatureCard.stories.tsx +557 -557
  287. package/src/stories/FeatureGrid.stories.tsx +594 -594
  288. package/src/stories/Footer.stories.tsx +640 -640
  289. package/src/stories/FormBlock.stories.tsx +760 -760
  290. package/src/stories/FormComponents.stories.tsx +349 -541
  291. package/src/stories/GridCell.stories.tsx +417 -0
  292. package/src/stories/GridLayout.stories.tsx +353 -0
  293. package/src/stories/HeroBlock.stories.tsx +862 -373
  294. package/src/stories/HtmlInputField.stories.tsx +474 -474
  295. package/src/stories/Image.stories.tsx +819 -0
  296. package/src/stories/Introduction.stories.tsx +667 -667
  297. package/src/stories/LayoutBlocks.stories.tsx +324 -324
  298. package/src/stories/Logo.stories.tsx +165 -6
  299. package/src/stories/Markdown.stories.tsx +137 -137
  300. package/src/stories/ModelView.stories.tsx +477 -0
  301. package/src/stories/Page.stories.tsx +688 -688
  302. package/src/stories/PageBannerHeader.stories.tsx +864 -864
  303. package/src/stories/PaletteSwitcher.stories.tsx +119 -119
  304. package/src/stories/ProductCard.stories.tsx +424 -424
  305. package/src/stories/QwickApp.stories.tsx +368 -368
  306. package/src/stories/ResponsiveMenu.stories.tsx +249 -249
  307. package/src/stories/SafeSpan.stories.tsx +531 -531
  308. package/src/stories/Section.stories.tsx +90 -2
  309. package/src/stories/SelectInputField.stories.tsx +524 -524
  310. package/src/stories/Text.stories.tsx +560 -0
  311. package/src/stories/TextInputField.stories.tsx +443 -443
  312. package/src/stories/ThemeSwitcher.stories.tsx +123 -123
  313. package/src/utils/htmlTransform.tsx +74 -53
  314. package/src/utils/reactUtils.tsx +57 -6
  315. package/dist/index.bundled.css +0 -12
  316. /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
  317. /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
  318. /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
  319. /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
  320. /package/src/{utils/__tests__ → __tests__/utils}/optional-logging.test.ts +0 -0
@@ -15,108 +15,108 @@ import QwickApp from '../components/QwickApp';
15
15
 
16
16
  // Sample product data
17
17
  const sampleProducts: Product[] = [
18
- {
19
- id: 'qwickapps-react-framework',
20
- name: 'QwickApps React Framework',
21
- category: 'Frontend Framework',
22
- description: 'A comprehensive React framework for building modern web applications with AI-driven component generation, data binding, and enterprise-grade features.',
23
- shortDescription: 'React framework for modern web apps',
24
- features: [
25
- 'AI-driven component generation',
26
- 'Automatic data binding',
27
- 'Enterprise authentication',
28
- 'Real-time collaboration',
29
- 'Advanced theming system',
30
- 'Comprehensive testing suite'
31
- ],
32
- technologies: ['React', 'TypeScript', 'Material-UI', 'Node.js'],
33
- status: 'launched',
34
- image: 'https://via.placeholder.com/400x200/1976d2/ffffff?text=QwickApps+Framework',
35
- url: 'https://qwickapps.com/framework'
36
- },
37
- {
38
- id: 'qwickapps-cms',
39
- name: 'QwickApps CMS',
40
- category: 'Content Management',
41
- description: 'Headless CMS built for developers with powerful API, visual editing, and seamless integration with modern frameworks.',
42
- shortDescription: 'Developer-friendly headless CMS',
43
- features: [
44
- 'RESTful and GraphQL APIs',
45
- 'Visual content editing',
46
- 'Multi-tenant architecture',
47
- 'Advanced caching',
48
- 'Role-based permissions'
49
- ],
50
- technologies: ['Node.js', 'PostgreSQL', 'Redis', 'GraphQL'],
51
- status: 'beta',
52
- image: 'https://via.placeholder.com/400x200/388e3c/ffffff?text=QwickApps+CMS'
53
- },
54
- {
55
- id: 'qwickapps-ai',
56
- name: 'QwickApps AI Assistant',
57
- category: 'AI/ML Platform',
58
- description: 'Intelligent development assistant that helps generate components, optimize code, and automate development workflows.',
59
- shortDescription: 'AI-powered development assistant',
60
- features: [
61
- 'Code generation',
62
- 'Performance optimization',
63
- 'Security analysis',
64
- 'Documentation generation',
65
- 'Test automation'
66
- ],
67
- technologies: ['Python', 'TensorFlow', 'OpenAI API', 'Docker'],
68
- status: 'coming-soon',
69
- image: 'https://via.placeholder.com/400x200/7b1fa2/ffffff?text=QwickApps+AI'
70
- }
18
+ {
19
+ id: 'qwickapps-react-framework',
20
+ name: 'QwickApps React Framework',
21
+ category: 'Frontend Framework',
22
+ description: 'A comprehensive React framework for building modern web applications with AI-driven component generation, data binding, and enterprise-grade features.',
23
+ shortDescription: 'React framework for modern web apps',
24
+ features: [
25
+ 'AI-driven component generation',
26
+ 'Automatic data binding',
27
+ 'Enterprise authentication',
28
+ 'Real-time collaboration',
29
+ 'Advanced theming system',
30
+ 'Comprehensive testing suite'
31
+ ],
32
+ technologies: ['React', 'TypeScript', 'Material-UI', 'Node.js'],
33
+ status: 'launched',
34
+ image: 'https://via.placeholder.com/400x200/1976d2/ffffff?text=QwickApps+Framework',
35
+ url: 'https://qwickapps.com/framework'
36
+ },
37
+ {
38
+ id: 'qwickapps-cms',
39
+ name: 'QwickApps CMS',
40
+ category: 'Content Management',
41
+ description: 'Headless CMS built for developers with powerful API, visual editing, and seamless integration with modern frameworks.',
42
+ shortDescription: 'Developer-friendly headless CMS',
43
+ features: [
44
+ 'RESTful and GraphQL APIs',
45
+ 'Visual content editing',
46
+ 'Multi-tenant architecture',
47
+ 'Advanced caching',
48
+ 'Role-based permissions'
49
+ ],
50
+ technologies: ['Node.js', 'PostgreSQL', 'Redis', 'GraphQL'],
51
+ status: 'beta',
52
+ image: 'https://via.placeholder.com/400x200/388e3c/ffffff?text=QwickApps+CMS'
53
+ },
54
+ {
55
+ id: 'qwickapps-ai',
56
+ name: 'QwickApps AI Assistant',
57
+ category: 'AI/ML Platform',
58
+ description: 'Intelligent development assistant that helps generate components, optimize code, and automate development workflows.',
59
+ shortDescription: 'AI-powered development assistant',
60
+ features: [
61
+ 'Code generation',
62
+ 'Performance optimization',
63
+ 'Security analysis',
64
+ 'Documentation generation',
65
+ 'Test automation'
66
+ ],
67
+ technologies: ['Python', 'TensorFlow', 'OpenAI API', 'Docker'],
68
+ status: 'coming-soon',
69
+ image: 'https://via.placeholder.com/400x200/7b1fa2/ffffff?text=QwickApps+AI'
70
+ }
71
71
  ];
72
72
 
73
73
  // Sample CMS data for data binding stories
74
74
  const sampleCmsData = {
75
- 'products': {
76
- 'framework': {
77
- product: sampleProducts[0],
78
- variant: 'detailed',
79
- showImage: true,
80
- showTechnologies: true
81
- },
82
- 'cms-beta': {
83
- product: sampleProducts[1],
84
- variant: 'compact',
85
- showImage: true,
86
- showTechnologies: false,
87
- maxFeaturesCompact: 3
88
- },
89
- 'ai-coming': {
90
- product: sampleProducts[2],
91
- variant: 'detailed',
92
- showImage: true,
93
- showTechnologies: true
94
- },
95
- 'showcase': sampleProducts.map(product => ({
96
- product,
97
- variant: 'compact',
98
- showImage: true,
99
- maxFeaturesCompact: 2
100
- })),
101
- 'detailed-showcase': sampleProducts.map(product => ({
102
- product,
103
- variant: 'detailed',
104
- showImage: true,
105
- showTechnologies: true
106
- }))
107
- }
75
+ 'products': {
76
+ 'framework': {
77
+ product: sampleProducts[0],
78
+ variant: 'detailed',
79
+ showImage: true,
80
+ showTechnologies: true
81
+ },
82
+ 'cms-beta': {
83
+ product: sampleProducts[1],
84
+ variant: 'compact',
85
+ showImage: true,
86
+ showTechnologies: false,
87
+ maxFeaturesCompact: 3
88
+ },
89
+ 'ai-coming': {
90
+ product: sampleProducts[2],
91
+ variant: 'detailed',
92
+ showImage: true,
93
+ showTechnologies: true
94
+ },
95
+ 'showcase': sampleProducts.map(product => ({
96
+ product,
97
+ variant: 'compact',
98
+ showImage: true,
99
+ maxFeaturesCompact: 2
100
+ })),
101
+ 'detailed-showcase': sampleProducts.map(product => ({
102
+ product,
103
+ variant: 'detailed',
104
+ showImage: true,
105
+ showTechnologies: true
106
+ }))
107
+ }
108
108
  };
109
109
 
110
110
  const dataProvider = new JsonDataProvider({ data: sampleCmsData });
111
111
 
112
112
  const meta = {
113
- title: 'Blocks/ProductCard',
114
- component: ProductCard,
115
- parameters: {
116
- layout: 'padded',
117
- docs: {
118
- description: {
119
- component: `ProductCard is a flexible component for showcasing products and services with both traditional props and data binding through dataSource.
113
+ title: 'Blocks/ProductCard',
114
+ component: ProductCard,
115
+ parameters: {
116
+ layout: 'padded',
117
+ docs: {
118
+ description: {
119
+ component: `ProductCard is a flexible component for showcasing products and services with both traditional props and data binding through dataSource.
120
120
 
121
121
  **Key Features:**
122
122
  - **Two Display Variants**: Compact for grids and lists, Detailed for individual showcases
@@ -130,15 +130,15 @@ const meta = {
130
130
 
131
131
  **Perfect For:**
132
132
  - Product showcases and catalogs
133
- - Service offerings and portfolios
133
+ - Service offerings and portfolios
134
134
  - Software tool presentations
135
135
  - Feature comparison grids
136
136
  - Beta product announcements
137
137
  - Coming soon product teasers`,
138
- },
139
- },
140
- },
141
- tags: ['autodocs'],
138
+ },
139
+ },
140
+ },
141
+ tags: ['autodocs'],
142
142
  } satisfies Meta<typeof ProductCard>;
143
143
 
144
144
  export default meta;
@@ -146,359 +146,359 @@ type Story = StoryObj<typeof ProductCard>;
146
146
 
147
147
  // Traditional Usage Examples
148
148
  export const LaunchedProduct: Story = {
149
- render: () => (
150
- <QwickApp appId="productcard-launched" appName='Launched ProductCard'>
151
- <ProductCard
152
- product={sampleProducts[0]}
153
- variant="detailed"
154
- />
155
- </QwickApp>
156
- ),
157
- parameters: {
158
- docs: {
159
- description: {
160
- story: 'ProductCard displaying a launched product with detailed variant showing full description and technology stack.',
161
- },
162
- },
163
- },
149
+ render: () => (
150
+ <QwickApp appId="productcard-launched" appName='Launched ProductCard'>
151
+ <ProductCard
152
+ product={sampleProducts[0]}
153
+ variant="detailed"
154
+ />
155
+ </QwickApp>
156
+ ),
157
+ parameters: {
158
+ docs: {
159
+ description: {
160
+ story: 'ProductCard displaying a launched product with detailed variant showing full description and technology stack.',
161
+ },
162
+ },
163
+ },
164
164
  };
165
165
 
166
166
  export const ProductStatusVariants: Story = {
167
- render: () => (
168
- <QwickApp appId="productcard-statuses" appName='ProductCard Status Variants'>
169
- <GridLayout columns={3} spacing="large" equalHeight>
170
- <ProductCard
171
- product={sampleProducts[0]}
172
- variant="compact"
173
- maxFeaturesCompact={2}
174
- />
175
- <ProductCard
176
- product={sampleProducts[1]}
177
- variant="compact"
178
- maxFeaturesCompact={2}
179
- />
180
- <ProductCard
181
- product={sampleProducts[2]}
182
- variant="compact"
183
- maxFeaturesCompact={2}
184
- />
185
- </GridLayout>
186
- </QwickApp>
187
- ),
188
- parameters: {
189
- docs: {
190
- description: {
191
- story: 'Different product status states: launched (green), beta (orange), and coming-soon (disabled) with appropriate action buttons.',
192
- },
193
- },
194
- },
167
+ render: () => (
168
+ <QwickApp appId="productcard-statuses" appName='ProductCard Status Variants'>
169
+ <GridLayout columns={3} spacing="large" equalHeight>
170
+ <ProductCard
171
+ product={sampleProducts[0]}
172
+ variant="compact"
173
+ maxFeaturesCompact={2}
174
+ />
175
+ <ProductCard
176
+ product={sampleProducts[1]}
177
+ variant="compact"
178
+ maxFeaturesCompact={2}
179
+ />
180
+ <ProductCard
181
+ product={sampleProducts[2]}
182
+ variant="compact"
183
+ maxFeaturesCompact={2}
184
+ />
185
+ </GridLayout>
186
+ </QwickApp>
187
+ ),
188
+ parameters: {
189
+ docs: {
190
+ description: {
191
+ story: 'Different product status states: launched (green), beta (orange), and coming-soon (disabled) with appropriate action buttons.',
192
+ },
193
+ },
194
+ },
195
195
  };
196
196
 
197
197
  export const VariantComparison: Story = {
198
- render: () => (
199
- <QwickApp appId="productcard-variants" appName='ProductCard Variant Comparison'>
200
- <Box sx={{ '& > *:not(:last-child)': { mb: 4 } }}>
201
-
202
- <Box>
203
- <Typography variant="h6" gutterBottom>Compact Variant</Typography>
204
- <Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
205
- Ideal for product grids and lists with limited space
206
- </Typography>
207
- <GridLayout columns={2} spacing="medium">
208
- <ProductCard
209
- product={sampleProducts[0]}
210
- variant="compact"
211
- maxFeaturesCompact={3}
212
- />
213
- <ProductCard
214
- product={sampleProducts[1]}
215
- variant="compact"
216
- maxFeaturesCompact={2}
217
- showTechnologies={false}
218
- />
219
- </GridLayout>
220
- </Box>
221
-
222
- <Box>
223
- <Typography variant="h6" gutterBottom>Detailed Variant</Typography>
224
- <Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
225
- Perfect for individual product showcases with complete information
226
- </Typography>
227
- <ProductCard
228
- product={sampleProducts[0]}
229
- variant="detailed"
230
- showTechnologies={true}
231
- />
232
- </Box>
233
-
234
- </Box>
235
- </QwickApp>
236
- ),
237
- parameters: {
238
- docs: {
239
- description: {
240
- story: 'Side-by-side comparison of compact vs detailed variants showing different use cases and information density.',
241
- },
242
- },
243
- },
198
+ render: () => (
199
+ <QwickApp appId="productcard-variants" appName='ProductCard Variant Comparison'>
200
+ <Box sx={{ '& > *:not(:last-child)': { mb: 4 } }}>
201
+
202
+ <Box>
203
+ <Typography variant="h6" gutterBottom>Compact Variant</Typography>
204
+ <Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
205
+ Ideal for product grids and lists with limited space
206
+ </Typography>
207
+ <GridLayout columns={2} spacing="medium">
208
+ <ProductCard
209
+ product={sampleProducts[0]}
210
+ variant="compact"
211
+ maxFeaturesCompact={3}
212
+ />
213
+ <ProductCard
214
+ product={sampleProducts[1]}
215
+ variant="compact"
216
+ maxFeaturesCompact={2}
217
+ showTechnologies={false}
218
+ />
219
+ </GridLayout>
220
+ </Box>
221
+
222
+ <Box>
223
+ <Typography variant="h6" gutterBottom>Detailed Variant</Typography>
224
+ <Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
225
+ Perfect for individual product showcases with complete information
226
+ </Typography>
227
+ <ProductCard
228
+ product={sampleProducts[0]}
229
+ variant="detailed"
230
+ showTechnologies={true}
231
+ />
232
+ </Box>
233
+
234
+ </Box>
235
+ </QwickApp>
236
+ ),
237
+ parameters: {
238
+ docs: {
239
+ description: {
240
+ story: 'Side-by-side comparison of compact vs detailed variants showing different use cases and information density.',
241
+ },
242
+ },
243
+ },
244
244
  };
245
245
 
246
246
  export const CustomizationOptions: Story = {
247
- render: () => (
248
- <QwickApp appId="productcard-customization" appName='ProductCard Customization'>
249
- <GridLayout columns={2} spacing="large">
250
-
251
- <ProductCard
252
- product={sampleProducts[0]}
253
- variant="detailed"
254
- showImage={false}
255
- showTechnologies={false}
256
- />
257
-
258
- <ProductCard
259
- product={sampleProducts[0]}
260
- variant="detailed"
261
- actions={[
262
- {
263
- id: 'demo',
264
- label: 'View Demo',
265
- variant: 'contained',
266
- color: 'primary',
267
- onClick: () => alert('Demo clicked!')
268
- },
269
- {
270
- id: 'docs',
271
- label: 'Documentation',
272
- variant: 'outlined',
273
- color: 'primary',
274
- onClick: () => alert('Docs clicked!')
275
- }
276
- ]}
277
- />
278
-
279
- </GridLayout>
280
- </QwickApp>
281
- ),
282
- parameters: {
283
- docs: {
284
- description: {
285
- story: 'Customization options: hiding images/technologies and adding custom action buttons.',
286
- },
287
- },
288
- },
247
+ render: () => (
248
+ <QwickApp appId="productcard-customization" appName='ProductCard Customization'>
249
+ <GridLayout columns={2} spacing="large">
250
+
251
+ <ProductCard
252
+ product={sampleProducts[0]}
253
+ variant="detailed"
254
+ showImage={false}
255
+ showTechnologies={false}
256
+ />
257
+
258
+ <ProductCard
259
+ product={sampleProducts[0]}
260
+ variant="detailed"
261
+ actions={[
262
+ {
263
+ id: 'demo',
264
+ label: 'View Demo',
265
+ variant: 'contained',
266
+ color: 'primary',
267
+ onClick: () => alert('Demo clicked!')
268
+ },
269
+ {
270
+ id: 'docs',
271
+ label: 'Documentation',
272
+ variant: 'outlined',
273
+ color: 'primary',
274
+ onClick: () => alert('Docs clicked!')
275
+ }
276
+ ]}
277
+ />
278
+
279
+ </GridLayout>
280
+ </QwickApp>
281
+ ),
282
+ parameters: {
283
+ docs: {
284
+ description: {
285
+ story: 'Customization options: hiding images/technologies and adding custom action buttons.',
286
+ },
287
+ },
288
+ },
289
289
  };
290
290
 
291
291
  // Data Binding Examples
292
292
  export const DataBindingBasic: Story = {
293
- render: () => (
294
- <QwickApp appId="productcard-data-binding" appName='ProductCard Data Binding' dataSource={{ dataProvider }}>
295
- <Box>
296
-
297
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
298
- <Typography variant="h5" gutterBottom>📊 Data-Driven ProductCard</Typography>
299
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
300
- ProductCard components can be driven entirely by CMS data using the dataSource prop.
301
- </Typography>
302
-
303
- <Code title="Usage" language="tsx">{`<ProductCard dataSource="products.framework" />`}</Code>
304
-
305
- <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.products.framework, null, 2)}</Code>
306
- </Box>
307
-
308
- <ProductCard dataSource="products.framework" />
309
-
310
- </Box>
311
- </QwickApp>
312
- ),
313
- parameters: {
314
- docs: {
315
- description: {
316
- story: 'ProductCard with data binding - all props resolved from CMS data through dataSource.',
317
- },
318
- },
319
- },
293
+ render: () => (
294
+ <QwickApp appId="productcard-data-binding" appName='ProductCard Data Binding' dataSource={{ dataProvider }}>
295
+ <Box>
296
+
297
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
298
+ <Typography variant="h5" gutterBottom> Data-Driven ProductCard</Typography>
299
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
300
+ ProductCard components can be driven entirely by CMS data using the dataSource prop.
301
+ </Typography>
302
+
303
+ <Code title="Usage" language="tsx">{`<ProductCard dataSource="products.framework" />`}</Code>
304
+
305
+ <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.products.framework, null, 2)}</Code>
306
+ </Box>
307
+
308
+ <ProductCard dataSource="products.framework" />
309
+
310
+ </Box>
311
+ </QwickApp>
312
+ ),
313
+ parameters: {
314
+ docs: {
315
+ description: {
316
+ story: 'ProductCard with data binding - all props resolved from CMS data through dataSource.',
317
+ },
318
+ },
319
+ },
320
320
  };
321
321
 
322
322
  export const DataBindingAdvanced: Story = {
323
- render: () => (
324
- <QwickApp appId="productcard-data-advanced" appName='Advanced ProductCard Data Binding' dataSource={{ dataProvider }}>
325
- <Box>
326
-
327
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
328
- <Typography variant="h5" gutterBottom>🎯 Multiple Data Sources</Typography>
329
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
330
- Different ProductCard components can pull from different data sources with varying configurations.
331
- </Typography>
332
- </Box>
333
-
334
- <GridLayout columns={3} spacing="large" equalHeight>
335
- <ProductCard dataSource="products.framework" />
336
- <ProductCard dataSource="products.cms-beta" />
337
- <ProductCard dataSource="products.ai-coming" />
338
- </GridLayout>
339
-
340
- </Box>
341
- </QwickApp>
342
- ),
343
- parameters: {
344
- docs: {
345
- description: {
346
- story: 'Advanced data binding with multiple data sources showcasing different product statuses and configurations.',
347
- },
348
- },
349
- },
323
+ render: () => (
324
+ <QwickApp appId="productcard-data-advanced" appName='Advanced ProductCard Data Binding' dataSource={{ dataProvider }}>
325
+ <Box>
326
+
327
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
328
+ <Typography variant="h5" gutterBottom> Multiple Data Sources</Typography>
329
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
330
+ Different ProductCard components can pull from different data sources with varying configurations.
331
+ </Typography>
332
+ </Box>
333
+
334
+ <GridLayout columns={3} spacing="large" equalHeight>
335
+ <ProductCard dataSource="products.framework" />
336
+ <ProductCard dataSource="products.cms-beta" />
337
+ <ProductCard dataSource="products.ai-coming" />
338
+ </GridLayout>
339
+
340
+ </Box>
341
+ </QwickApp>
342
+ ),
343
+ parameters: {
344
+ docs: {
345
+ description: {
346
+ story: 'Advanced data binding with multiple data sources showcasing different product statuses and configurations.',
347
+ },
348
+ },
349
+ },
350
350
  };
351
351
 
352
352
  export const DataBindingWithFallback: Story = {
353
- render: () => (
354
- <QwickApp appId="productcard-fallback" appName='ProductCard Data Binding with Fallback' dataSource={{ dataProvider }}>
355
- <Box>
356
-
357
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
358
- <Typography variant="h5" gutterBottom>🛡️ Fallback Support</Typography>
359
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
360
- ProductCard components gracefully handle missing data sources with fallback props.
361
- </Typography>
362
-
363
- <Code title="Fallback Usage" language="tsx">{`<ProductCard
364
- dataSource="nonexistent.product"
365
- product={fallbackProduct}
366
- variant="compact"
353
+ render: () => (
354
+ <QwickApp appId="productcard-fallback" appName='ProductCard Data Binding with Fallback' dataSource={{ dataProvider }}>
355
+ <Box>
356
+
357
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
358
+ <Typography variant="h5" gutterBottom> Fallback Support</Typography>
359
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
360
+ ProductCard components gracefully handle missing data sources with fallback props.
361
+ </Typography>
362
+
363
+ <Code title="Fallback Usage" language="tsx">{`<ProductCard
364
+ dataSource="nonexistent.product"
365
+ product={fallbackProduct}
366
+ variant="compact"
367
367
  />`}</Code>
368
- </Box>
369
-
370
- <GridLayout columns={2} spacing="large">
371
- <ProductCard
372
- dataSource="nonexistent.product"
373
- product={sampleProducts[0]}
374
- variant="compact"
375
- maxFeaturesCompact={3}
376
- />
377
- <ProductCard dataSource="products.framework" />
378
- </GridLayout>
379
-
380
- </Box>
381
- </QwickApp>
382
- ),
383
- parameters: {
384
- docs: {
385
- description: {
386
- story: 'ProductCard with fallback props when dataSource is missing or unavailable.',
387
- },
388
- },
389
- },
368
+ </Box>
369
+
370
+ <GridLayout columns={2} spacing="large">
371
+ <ProductCard
372
+ dataSource="nonexistent.product"
373
+ product={sampleProducts[0]}
374
+ variant="compact"
375
+ maxFeaturesCompact={3}
376
+ />
377
+ <ProductCard dataSource="products.framework" />
378
+ </GridLayout>
379
+
380
+ </Box>
381
+ </QwickApp>
382
+ ),
383
+ parameters: {
384
+ docs: {
385
+ description: {
386
+ story: 'ProductCard with fallback props when dataSource is missing or unavailable.',
387
+ },
388
+ },
389
+ },
390
390
  };
391
391
 
392
392
  export const ProductShowcaseGrid: Story = {
393
- render: () => (
394
- <QwickApp appId="productcard-showcase" appName='Product Showcase Grid'>
395
- <Box>
396
-
397
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
398
- <Typography variant="h5" gutterBottom>🏪 Product Showcase</Typography>
399
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
400
- Real-world example of ProductCard in a product catalog layout.
401
- </Typography>
402
- </Box>
403
-
404
- <GridLayout columns={3} spacing="large" equalHeight>
405
- {sampleProducts.map((product) => (
406
- <ProductCard
407
- key={product.id}
408
- product={product}
409
- variant="compact"
410
- maxFeaturesCompact={2}
411
- />
412
- ))}
413
- </GridLayout>
414
-
415
- </Box>
416
- </QwickApp>
417
- ),
418
- parameters: {
419
- docs: {
420
- description: {
421
- story: 'Product catalog layout with multiple ProductCards showing different statuses and consistent spacing.',
422
- },
423
- },
424
- },
393
+ render: () => (
394
+ <QwickApp appId="productcard-showcase" appName='Product Showcase Grid'>
395
+ <Box>
396
+
397
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
398
+ <Typography variant="h5" gutterBottom>🏪 Product Showcase</Typography>
399
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
400
+ Real-world example of ProductCard in a product catalog layout.
401
+ </Typography>
402
+ </Box>
403
+
404
+ <GridLayout columns={3} spacing="large" equalHeight>
405
+ {sampleProducts.map((product) => (
406
+ <ProductCard
407
+ key={product.id}
408
+ product={product}
409
+ variant="compact"
410
+ maxFeaturesCompact={2}
411
+ />
412
+ ))}
413
+ </GridLayout>
414
+
415
+ </Box>
416
+ </QwickApp>
417
+ ),
418
+ parameters: {
419
+ docs: {
420
+ description: {
421
+ story: 'Product catalog layout with multiple ProductCards showing different statuses and consistent spacing.',
422
+ },
423
+ },
424
+ },
425
425
  };
426
426
 
427
427
  export const RealWorldExample: Story = {
428
- render: () => (
429
- <QwickApp appId="productcard-real-world" appName='Real World ProductCard Example' dataSource={{ dataProvider }}>
430
- <Box>
431
- {/* Featured Product - Data Driven */}
432
- <Box sx={{ mb: 4 }}>
433
- <Typography variant="h4" gutterBottom>Featured Product</Typography>
434
- <ProductCard dataSource="products.framework" />
435
- </Box>
436
-
437
- {/* Product Grid - Mixed Data Sources */}
438
- <Box sx={{ mb: 4 }}>
439
- <Typography variant="h4" gutterBottom>Our Products</Typography>
440
- <GridLayout columns={3} spacing="large" equalHeight>
441
- <ProductCard dataSource="products.framework" />
442
- <ProductCard dataSource="products.cms-beta" />
443
- <ProductCard dataSource="products.ai-coming" />
444
- </GridLayout>
445
- </Box>
446
-
447
- {/* Coming Soon Section */}
448
- <Box>
449
- <Typography variant="h4" gutterBottom>Coming Soon</Typography>
450
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.7 }}>
451
- Get excited about our upcoming releases
452
- </Typography>
453
- <ProductCard
454
- product={sampleProducts[2]}
455
- variant="detailed"
456
- showTechnologies={true}
457
- />
458
- </Box>
459
- </Box>
460
- </QwickApp>
461
- ),
462
- parameters: {
463
- docs: {
464
- description: {
465
- story: 'Real-world example combining data-driven ProductCards with traditional usage in a complete product showcase page.',
466
- },
467
- },
468
- },
428
+ render: () => (
429
+ <QwickApp appId="productcard-real-world" appName='Real World ProductCard Example' dataSource={{ dataProvider }}>
430
+ <Box>
431
+ {/* Featured Product - Data Driven */}
432
+ <Box sx={{ mb: 4 }}>
433
+ <Typography variant="h4" gutterBottom>Featured Product</Typography>
434
+ <ProductCard dataSource="products.framework" />
435
+ </Box>
436
+
437
+ {/* Product Grid - Mixed Data Sources */}
438
+ <Box sx={{ mb: 4 }}>
439
+ <Typography variant="h4" gutterBottom>Our Products</Typography>
440
+ <GridLayout columns={3} spacing="large" equalHeight>
441
+ <ProductCard dataSource="products.framework" />
442
+ <ProductCard dataSource="products.cms-beta" />
443
+ <ProductCard dataSource="products.ai-coming" />
444
+ </GridLayout>
445
+ </Box>
446
+
447
+ {/* Coming Soon Section */}
448
+ <Box>
449
+ <Typography variant="h4" gutterBottom>Coming Soon</Typography>
450
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.7 }}>
451
+ Get excited about our upcoming releases
452
+ </Typography>
453
+ <ProductCard
454
+ product={sampleProducts[2]}
455
+ variant="detailed"
456
+ showTechnologies={true}
457
+ />
458
+ </Box>
459
+ </Box>
460
+ </QwickApp>
461
+ ),
462
+ parameters: {
463
+ docs: {
464
+ description: {
465
+ story: 'Real-world example combining data-driven ProductCards with traditional usage in a complete product showcase page.',
466
+ },
467
+ },
468
+ },
469
469
  };
470
470
 
471
471
  export const EmptyAndLoadingStates: Story = {
472
- render: () => (
473
- <QwickApp appId="productcard-states" appName='ProductCard States' dataSource={{ dataProvider }}>
474
- <Box>
475
-
476
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
477
- <Typography variant="h5" gutterBottom>🔄 State Management</Typography>
478
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
479
- ProductCard handles various states including empty data and loading scenarios.
480
- </Typography>
481
- </Box>
482
-
483
- <GridLayout columns={2} spacing="large">
484
- <Box>
485
- <Typography variant="h6" gutterBottom>Empty State</Typography>
486
- <ProductCard />
487
- </Box>
488
- <Box>
489
- <Typography variant="h6" gutterBottom>Valid Product</Typography>
490
- <ProductCard dataSource="products.framework" />
491
- </Box>
492
- </GridLayout>
493
-
494
- </Box>
495
- </QwickApp>
496
- ),
497
- parameters: {
498
- docs: {
499
- description: {
500
- story: 'Demonstrates empty state handling and normal product display states.',
501
- },
502
- },
503
- },
472
+ render: () => (
473
+ <QwickApp appId="productcard-states" appName='ProductCard States' dataSource={{ dataProvider }}>
474
+ <Box>
475
+
476
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
477
+ <Typography variant="h5" gutterBottom> State Management</Typography>
478
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
479
+ ProductCard handles various states including empty data and loading scenarios.
480
+ </Typography>
481
+ </Box>
482
+
483
+ <GridLayout columns={2} spacing="large">
484
+ <Box>
485
+ <Typography variant="h6" gutterBottom>Empty State</Typography>
486
+ <ProductCard />
487
+ </Box>
488
+ <Box>
489
+ <Typography variant="h6" gutterBottom>Valid Product</Typography>
490
+ <ProductCard dataSource="products.framework" />
491
+ </Box>
492
+ </GridLayout>
493
+
494
+ </Box>
495
+ </QwickApp>
496
+ ),
497
+ parameters: {
498
+ docs: {
499
+ description: {
500
+ story: 'Demonstrates empty state handling and normal product display states.',
501
+ },
502
+ },
503
+ },
504
504
  };