@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.
- package/README.md +1681 -2
- package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
- package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +7 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/Html.d.ts +28 -18
- package/dist/components/Html.d.ts.map +1 -1
- package/dist/components/Logo.d.ts +12 -35
- package/dist/components/Logo.d.ts.map +1 -1
- package/dist/components/Markdown.d.ts +18 -13
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/QwickApp.d.ts +16 -3
- package/dist/components/QwickApp.d.ts.map +1 -1
- package/dist/components/QwickIcon.d.ts +23 -0
- package/dist/components/QwickIcon.d.ts.map +1 -0
- package/dist/components/SafeSpan.d.ts +12 -5
- package/dist/components/SafeSpan.d.ts.map +1 -1
- package/dist/components/Scaffold.d.ts.map +1 -1
- package/dist/components/base/ModelView.d.ts +101 -0
- package/dist/components/base/ModelView.d.ts.map +1 -0
- package/dist/components/base/index.d.ts +11 -0
- package/dist/components/base/index.d.ts.map +1 -0
- package/dist/components/blocks/Article.d.ts +12 -2
- package/dist/components/blocks/Article.d.ts.map +1 -1
- package/dist/components/blocks/Code.d.ts +13 -2
- package/dist/components/blocks/Code.d.ts.map +1 -1
- package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
- package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
- package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
- package/dist/components/blocks/Footer.d.ts.map +1 -1
- package/dist/components/blocks/HeroBlock.d.ts +27 -13
- package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
- package/dist/components/blocks/Image.d.ts +41 -0
- package/dist/components/blocks/Image.d.ts.map +1 -0
- package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
- package/dist/components/blocks/Section.d.ts +16 -2
- package/dist/components/blocks/Section.d.ts.map +1 -1
- package/dist/components/blocks/Text.d.ts +41 -0
- package/dist/components/blocks/Text.d.ts.map +1 -0
- package/dist/components/blocks/index.d.ts +4 -0
- package/dist/components/blocks/index.d.ts.map +1 -1
- package/dist/components/buttons/Button.d.ts +23 -7
- package/dist/components/buttons/Button.d.ts.map +1 -1
- package/dist/components/forms/FormBlock.d.ts +19 -13
- package/dist/components/forms/FormBlock.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/input/ChoiceInputField.d.ts +17 -11
- package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
- package/dist/components/input/HtmlInputField.d.ts +17 -11
- package/dist/components/input/HtmlInputField.d.ts.map +1 -1
- package/dist/components/input/SelectInputField.d.ts +16 -10
- package/dist/components/input/SelectInputField.d.ts.map +1 -1
- package/dist/components/input/SwitchInputField.d.ts +16 -10
- package/dist/components/input/SwitchInputField.d.ts.map +1 -1
- package/dist/components/input/TextField.d.ts.map +1 -1
- package/dist/components/input/TextInputField.d.ts +16 -11
- package/dist/components/input/TextInputField.d.ts.map +1 -1
- package/dist/components/layout/GridCell.d.ts +23 -6
- package/dist/components/layout/GridCell.d.ts.map +1 -1
- package/dist/components/layout/GridLayout.d.ts +24 -23
- package/dist/components/layout/GridLayout.d.ts.map +1 -1
- package/dist/components/pages/FormPage.d.ts.map +1 -1
- package/dist/components/pages/Page.d.ts +49 -87
- package/dist/components/pages/Page.d.ts.map +1 -1
- package/dist/components/pages/index.d.ts +2 -2
- package/dist/components/pages/index.d.ts.map +1 -1
- package/dist/config/AppConfig.d.ts +49 -0
- package/dist/config/AppConfig.d.ts.map +1 -0
- package/dist/config/AppConfigBuilder.d.ts +75 -0
- package/dist/config/AppConfigBuilder.d.ts.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/types.d.ts +130 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.esm.js +451 -0
- package/dist/config.js +455 -0
- package/dist/contexts/PrintModeContext.d.ts +27 -0
- package/dist/contexts/PrintModeContext.d.ts.map +1 -0
- package/dist/contexts/QwickAppContext.d.ts +2 -2
- package/dist/contexts/QwickAppContext.d.ts.map +1 -1
- package/dist/contexts/index.d.ts +2 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/usePrintMode.d.ts +39 -0
- package/dist/hooks/usePrintMode.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +10951 -6238
- package/dist/index.js +11014 -6287
- package/dist/schemas/CodeSchema.d.ts +2 -1
- package/dist/schemas/CodeSchema.d.ts.map +1 -1
- package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
- package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
- package/dist/schemas/ContentSchema.d.ts +2 -1
- package/dist/schemas/ContentSchema.d.ts.map +1 -1
- package/dist/schemas/GridCellSchema.d.ts +25 -0
- package/dist/schemas/GridCellSchema.d.ts.map +1 -0
- package/dist/schemas/GridLayoutSchema.d.ts +23 -0
- package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
- package/dist/schemas/HtmlSchema.d.ts +14 -0
- package/dist/schemas/HtmlSchema.d.ts.map +1 -0
- package/dist/schemas/ImageSchema.d.ts +32 -0
- package/dist/schemas/ImageSchema.d.ts.map +1 -0
- package/dist/schemas/LogoSchema.d.ts +35 -0
- package/dist/schemas/LogoSchema.d.ts.map +1 -0
- package/dist/schemas/MarkdownSchema.d.ts +14 -0
- package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
- package/dist/schemas/PageTemplateSchema.d.ts +31 -0
- package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
- package/dist/schemas/PrintConfigSchema.d.ts +31 -0
- package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
- package/dist/schemas/SectionSchema.d.ts +2 -1
- package/dist/schemas/SectionSchema.d.ts.map +1 -1
- package/dist/schemas/TextSchema.d.ts +37 -0
- package/dist/schemas/TextSchema.d.ts.map +1 -0
- package/dist/schemas/ViewModelSchema.d.ts +23 -0
- package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
- package/dist/schemas/index.d.ts +15 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
- package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
- package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
- package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
- package/dist/schemas/transformers/registry.d.ts +15 -0
- package/dist/schemas/transformers/registry.d.ts.map +1 -0
- package/dist/schemas/types/Serializable.d.ts +46 -0
- package/dist/schemas/types/Serializable.d.ts.map +1 -0
- package/dist/utils/htmlTransform.d.ts.map +1 -1
- package/dist/utils/reactUtils.d.ts +12 -3
- package/dist/utils/reactUtils.d.ts.map +1 -1
- package/package.json +17 -3
- package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
- package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
- package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
- package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
- package/src/__tests__/components/Logo.test.js +3 -3
- package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
- package/src/__tests__/components/base/ModelView.test.tsx +220 -0
- package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
- package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
- package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
- package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
- package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
- package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
- package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
- package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
- package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
- package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
- package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
- package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
- package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
- package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
- package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
- package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
- package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
- package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
- package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
- package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
- package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
- package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
- package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
- package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
- package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
- package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
- package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
- package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
- package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
- package/src/components/ErrorBoundary.tsx +8 -8
- package/src/components/Html.tsx +147 -44
- package/src/components/Logo.tsx +198 -100
- package/src/components/Markdown.tsx +125 -16
- package/src/components/QwickApp.tsx +64 -31
- package/src/components/QwickIcon.tsx +59 -0
- package/src/components/SafeSpan.tsx +65 -10
- package/src/components/Scaffold.tsx +2 -8
- package/src/components/base/ModelView.tsx +199 -0
- package/src/components/base/index.ts +11 -0
- package/src/components/blocks/Article.tsx +57 -18
- package/src/components/blocks/Code.md +529 -0
- package/src/components/blocks/Code.tsx +102 -15
- package/src/components/blocks/CoverImageHeader.tsx +9 -4
- package/src/components/blocks/FeatureCard.tsx +1 -2
- package/src/components/blocks/FeatureGrid.tsx +19 -1
- package/src/components/blocks/Footer.tsx +13 -1
- package/src/components/blocks/HeroBlock.tsx +87 -20
- package/src/components/blocks/Image.tsx +395 -0
- package/src/components/blocks/PageBannerHeader.tsx +14 -12
- package/src/components/blocks/ProductCard.tsx +1 -1
- package/src/components/blocks/Section.tsx +113 -8
- package/src/components/blocks/Text.tsx +285 -0
- package/src/components/blocks/index.ts +4 -0
- package/src/components/buttons/Button.tsx +184 -15
- package/src/components/forms/FormBlock.tsx +70 -17
- package/src/components/index.ts +5 -0
- package/src/components/input/ChoiceInputField.tsx +48 -18
- package/src/components/input/HtmlInputField.tsx +48 -18
- package/src/components/input/SelectInputField.tsx +48 -16
- package/src/components/input/SwitchInputField.tsx +48 -17
- package/src/components/input/TextField.tsx +41 -1
- package/src/components/input/TextInputField.tsx +52 -18
- package/src/components/layout/GridCell.tsx +118 -9
- package/src/components/layout/GridLayout.tsx +125 -24
- package/src/components/pages/FormPage.tsx +0 -1
- package/src/components/pages/Page.css +304 -332
- package/src/components/pages/Page.tsx +307 -255
- package/src/components/pages/index.ts +2 -2
- package/src/config/AppConfig.ts +133 -0
- package/src/config/AppConfigBuilder.ts +421 -0
- package/src/config/__tests__/AppConfig.test.ts +385 -0
- package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
- package/src/config/index.ts +24 -0
- package/src/config/types.ts +170 -0
- package/src/config.ts +25 -0
- package/src/contexts/PrintModeContext.tsx +332 -0
- package/src/contexts/QwickAppContext.tsx +2 -2
- package/src/contexts/index.ts +2 -0
- package/src/hooks/index.ts +5 -1
- package/src/hooks/usePrintMode.ts +73 -0
- package/src/index.ts +3 -0
- package/src/schemas/CodeSchema.ts +3 -3
- package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
- package/src/schemas/ContentSchema.ts +2 -1
- package/src/schemas/GridCellSchema.ts +164 -0
- package/src/schemas/GridLayoutSchema.ts +133 -0
- package/src/schemas/HtmlSchema.ts +47 -0
- package/src/schemas/ImageSchema.ts +235 -0
- package/src/schemas/LogoSchema.ts +241 -0
- package/src/schemas/MarkdownSchema.ts +47 -0
- package/src/schemas/PageTemplateSchema.ts +186 -0
- package/src/schemas/PrintConfigSchema.ts +207 -0
- package/src/schemas/README.md +661 -0
- package/src/schemas/SectionSchema.ts +2 -1
- package/src/schemas/TextSchema.ts +329 -0
- package/src/schemas/ViewModelSchema.ts +115 -0
- package/src/schemas/index.ts +21 -2
- package/src/schemas/transformers/ComponentTransformer.ts +403 -0
- package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
- package/src/schemas/transformers/registry.ts +72 -0
- package/src/schemas/types/Serializable.ts +51 -0
- package/src/stories/AccessibilityProvider.stories.tsx +253 -253
- package/src/stories/Article.stories.tsx +433 -433
- package/src/stories/Button.stories.tsx +1 -1
- package/src/stories/CardListGrid.stories.tsx +451 -451
- package/src/stories/ChoiceInputField.stories.tsx +503 -503
- package/src/stories/Code.stories.tsx +1 -1
- package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
- package/src/stories/Content.stories.tsx +393 -393
- package/src/stories/CoverImageHeader.stories.tsx +701 -701
- package/src/stories/DataBinding.advanced.stories.tsx +432 -432
- package/src/stories/DataProvider.stories.tsx +1192 -1192
- package/src/stories/FeatureCard.stories.tsx +557 -557
- package/src/stories/FeatureGrid.stories.tsx +594 -594
- package/src/stories/Footer.stories.tsx +640 -640
- package/src/stories/FormBlock.stories.tsx +760 -760
- package/src/stories/FormComponents.stories.tsx +349 -541
- package/src/stories/GridCell.stories.tsx +417 -0
- package/src/stories/GridLayout.stories.tsx +353 -0
- package/src/stories/HeroBlock.stories.tsx +862 -373
- package/src/stories/HtmlInputField.stories.tsx +474 -474
- package/src/stories/Image.stories.tsx +819 -0
- package/src/stories/Introduction.stories.tsx +667 -667
- package/src/stories/LayoutBlocks.stories.tsx +324 -324
- package/src/stories/Logo.stories.tsx +165 -6
- package/src/stories/Markdown.stories.tsx +137 -137
- package/src/stories/ModelView.stories.tsx +477 -0
- package/src/stories/Page.stories.tsx +688 -688
- package/src/stories/PageBannerHeader.stories.tsx +864 -864
- package/src/stories/PaletteSwitcher.stories.tsx +119 -119
- package/src/stories/ProductCard.stories.tsx +424 -424
- package/src/stories/QwickApp.stories.tsx +368 -368
- package/src/stories/ResponsiveMenu.stories.tsx +249 -249
- package/src/stories/SafeSpan.stories.tsx +531 -531
- package/src/stories/Section.stories.tsx +90 -2
- package/src/stories/SelectInputField.stories.tsx +524 -524
- package/src/stories/Text.stories.tsx +560 -0
- package/src/stories/TextInputField.stories.tsx +443 -443
- package/src/stories/ThemeSwitcher.stories.tsx +123 -123
- package/src/utils/htmlTransform.tsx +74 -53
- package/src/utils/reactUtils.tsx +57 -6
- package/dist/index.bundled.css +0 -12
- /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
- /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
- /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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
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
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
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
|
};
|