@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
|
@@ -14,89 +14,89 @@ import { DataProvider } from '../contexts/DataContext';
|
|
|
14
14
|
|
|
15
15
|
// Sample CMS data for data binding stories
|
|
16
16
|
const sampleCmsData = {
|
|
17
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
17
|
+
'features': {
|
|
18
|
+
'lightning-fast': {
|
|
19
|
+
feature: {
|
|
20
|
+
id: 'lightning-fast',
|
|
21
|
+
title: ' Lightning Fast Performance',
|
|
22
|
+
description: 'Optimized for speed with sub-millisecond response times and efficient memory usage for smooth user experiences',
|
|
23
|
+
icon: ''
|
|
24
|
+
},
|
|
25
|
+
variant: 'standard',
|
|
26
|
+
elevation: 3
|
|
27
|
+
},
|
|
28
|
+
'benefits-list': {
|
|
29
|
+
features: [
|
|
30
|
+
'Zero configuration setup required',
|
|
31
|
+
'Full TypeScript support included',
|
|
32
|
+
'Hot module reloading for development',
|
|
33
|
+
'Built-in testing framework integration',
|
|
34
|
+
'Production-ready build optimization',
|
|
35
|
+
'Comprehensive documentation and examples'
|
|
36
|
+
],
|
|
37
|
+
variant: 'list',
|
|
38
|
+
title: 'Key Benefits',
|
|
39
|
+
elevation: 1
|
|
40
|
+
},
|
|
41
|
+
'developer-experience': {
|
|
42
|
+
feature: {
|
|
43
|
+
id: 'developer-experience',
|
|
44
|
+
title: ' Exceptional Developer Experience',
|
|
45
|
+
description: 'Intuitive APIs, comprehensive documentation, and powerful tooling make development efficient and enjoyable',
|
|
46
|
+
icon: ''
|
|
47
|
+
},
|
|
48
|
+
actions: [
|
|
49
|
+
{
|
|
50
|
+
id: 'learn-more',
|
|
51
|
+
label: 'Learn More',
|
|
52
|
+
variant: 'contained',
|
|
53
|
+
color: 'primary'
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'try-demo',
|
|
57
|
+
label: 'Try Demo',
|
|
58
|
+
variant: 'outlined',
|
|
59
|
+
color: 'secondary'
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
variant: 'standard',
|
|
63
|
+
elevation: 4
|
|
64
|
+
},
|
|
65
|
+
'enterprise-benefits': {
|
|
66
|
+
features: [
|
|
67
|
+
'Enterprise-grade security and compliance',
|
|
68
|
+
'Scalable architecture for high-traffic applications',
|
|
69
|
+
'Modern React patterns and best practices',
|
|
70
|
+
'Comprehensive testing and quality assurance',
|
|
71
|
+
'24/7 professional support and maintenance'
|
|
72
|
+
],
|
|
73
|
+
variant: 'list',
|
|
74
|
+
title: 'Enterprise Features',
|
|
75
|
+
elevation: 0
|
|
76
|
+
},
|
|
77
|
+
'cutting-edge': {
|
|
78
|
+
feature: {
|
|
79
|
+
id: 'cutting-edge',
|
|
80
|
+
title: ' Cutting-Edge Technology',
|
|
81
|
+
description: 'Built with the latest React features, modern tooling, and industry best practices to ensure your application stays current',
|
|
82
|
+
icon: ''
|
|
83
|
+
},
|
|
84
|
+
variant: 'standard',
|
|
85
|
+
elevation: 6
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
88
|
};
|
|
89
89
|
|
|
90
90
|
const dataProvider = new JsonDataProvider({ data: sampleCmsData });
|
|
91
91
|
|
|
92
92
|
const meta = {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
title: 'Blocks/FeatureCard',
|
|
94
|
+
component: FeatureCard,
|
|
95
|
+
parameters: {
|
|
96
|
+
layout: 'padded',
|
|
97
|
+
docs: {
|
|
98
|
+
description: {
|
|
99
|
+
component: `FeatureCard is a flexible card component supporting both individual feature display and simple feature lists with data binding through dataSource.
|
|
100
100
|
|
|
101
101
|
**Key Features:**
|
|
102
102
|
- **Dual Variants**: Standard cards with rich content or simple list format
|
|
@@ -112,10 +112,10 @@ const meta = {
|
|
|
112
112
|
- Simple feature lists and bullet point summaries
|
|
113
113
|
- Interactive elements with call-to-action buttons
|
|
114
114
|
- Product cards and service offerings`,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
tags: ['autodocs'],
|
|
119
119
|
} satisfies Meta<typeof FeatureCard>;
|
|
120
120
|
|
|
121
121
|
export default meta;
|
|
@@ -123,520 +123,520 @@ type Story = StoryObj<typeof meta>;
|
|
|
123
123
|
|
|
124
124
|
// Sample features for traditional examples
|
|
125
125
|
const sampleFeature = {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
id: 'sample-feature',
|
|
127
|
+
title: ' Advanced Tooling',
|
|
128
|
+
description: 'Professional development tools and utilities that streamline your workflow and boost productivity',
|
|
129
|
+
icon: ''
|
|
130
130
|
};
|
|
131
131
|
|
|
132
132
|
const sampleFeatures = [
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
133
|
+
'Comprehensive component library',
|
|
134
|
+
'Advanced theming capabilities',
|
|
135
|
+
'Built-in accessibility support',
|
|
136
|
+
'Performance optimization tools',
|
|
137
|
+
'Responsive design system'
|
|
138
138
|
];
|
|
139
139
|
|
|
140
140
|
// Traditional Usage Examples
|
|
141
141
|
export const StandardFeatureCard: Story = {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
142
|
+
render: () => (
|
|
143
|
+
<QwickApp appId="featurecard-standard" appName='Standard FeatureCard'>
|
|
144
|
+
<FeatureCard
|
|
145
|
+
feature={sampleFeature}
|
|
146
|
+
variant="standard"
|
|
147
|
+
elevation={2}
|
|
148
|
+
/>
|
|
149
|
+
</QwickApp>
|
|
150
|
+
),
|
|
151
|
+
parameters: {
|
|
152
|
+
docs: {
|
|
153
|
+
description: {
|
|
154
|
+
story: 'Standard FeatureCard with traditional props - feature object, variant, and elevation.',
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
158
|
};
|
|
159
159
|
|
|
160
160
|
export const ListFeatureCard: Story = {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
161
|
+
render: () => (
|
|
162
|
+
<QwickApp appId="featurecard-list" appName='List FeatureCard'>
|
|
163
|
+
<FeatureCard
|
|
164
|
+
features={sampleFeatures}
|
|
165
|
+
variant="list"
|
|
166
|
+
title="Framework Features"
|
|
167
|
+
elevation={1}
|
|
168
|
+
/>
|
|
169
|
+
</QwickApp>
|
|
170
|
+
),
|
|
171
|
+
parameters: {
|
|
172
|
+
docs: {
|
|
173
|
+
description: {
|
|
174
|
+
story: 'List FeatureCard variant showing simple bullet-point features.',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
178
|
};
|
|
179
179
|
|
|
180
180
|
export const ElevationVariants: Story = {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
181
|
+
render: () => (
|
|
182
|
+
<QwickApp appId="featurecard-elevation" appName='FeatureCard Elevation Variants'>
|
|
183
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: 3, mb: 4 }}>
|
|
184
|
+
|
|
185
|
+
<Box>
|
|
186
|
+
<Typography variant="h6" gutterBottom>Elevation 0 (Flat)</Typography>
|
|
187
|
+
<FeatureCard
|
|
188
|
+
feature={{
|
|
189
|
+
id: 'flat-feature',
|
|
190
|
+
title: ' Flat Design',
|
|
191
|
+
description: 'Clean, minimal appearance with no shadow depth',
|
|
192
|
+
icon: ''
|
|
193
|
+
}}
|
|
194
|
+
elevation={0}
|
|
195
|
+
/>
|
|
196
|
+
</Box>
|
|
197
|
+
|
|
198
|
+
<Box>
|
|
199
|
+
<Typography variant="h6" gutterBottom>Elevation 2 (Default)</Typography>
|
|
200
|
+
<FeatureCard
|
|
201
|
+
feature={{
|
|
202
|
+
id: 'default-feature',
|
|
203
|
+
title: ' Standard Card',
|
|
204
|
+
description: 'Balanced elevation for most use cases',
|
|
205
|
+
icon: ''
|
|
206
|
+
}}
|
|
207
|
+
elevation={2}
|
|
208
|
+
/>
|
|
209
|
+
</Box>
|
|
210
|
+
|
|
211
|
+
<Box>
|
|
212
|
+
<Typography variant="h6" gutterBottom>Elevation 4 (Raised)</Typography>
|
|
213
|
+
<FeatureCard
|
|
214
|
+
feature={{
|
|
215
|
+
id: 'raised-feature',
|
|
216
|
+
title: '📈 Emphasized Card',
|
|
217
|
+
description: 'Higher elevation for visual prominence',
|
|
218
|
+
icon: '📈'
|
|
219
|
+
}}
|
|
220
|
+
elevation={4}
|
|
221
|
+
/>
|
|
222
|
+
</Box>
|
|
223
|
+
|
|
224
|
+
<Box>
|
|
225
|
+
<Typography variant="h6" gutterBottom>Elevation 8 (High)</Typography>
|
|
226
|
+
<FeatureCard
|
|
227
|
+
feature={{
|
|
228
|
+
id: 'high-feature',
|
|
229
|
+
title: ' Premium Feature',
|
|
230
|
+
description: 'Maximum elevation for special highlights',
|
|
231
|
+
icon: ''
|
|
232
|
+
}}
|
|
233
|
+
elevation={8}
|
|
234
|
+
/>
|
|
235
|
+
</Box>
|
|
236
|
+
|
|
237
|
+
</Box>
|
|
238
|
+
</QwickApp>
|
|
239
|
+
),
|
|
240
|
+
parameters: {
|
|
241
|
+
docs: {
|
|
242
|
+
description: {
|
|
243
|
+
story: 'Different elevation options showing visual depth and hierarchy.',
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
247
|
};
|
|
248
248
|
|
|
249
249
|
export const VariantComparison: Story = {
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
250
|
+
render: () => (
|
|
251
|
+
<QwickApp appId="featurecard-variants" appName='FeatureCard Variant Comparison'>
|
|
252
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4 }}>
|
|
253
|
+
|
|
254
|
+
<Box>
|
|
255
|
+
<Typography variant="h5" gutterBottom>Standard Variant</Typography>
|
|
256
|
+
<Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
|
|
257
|
+
Rich cards with icons, titles, descriptions, and actions
|
|
258
|
+
</Typography>
|
|
259
|
+
<FeatureCard
|
|
260
|
+
feature={{
|
|
261
|
+
id: 'rich-feature',
|
|
262
|
+
title: ' Rich Feature Display',
|
|
263
|
+
description: 'Comprehensive feature showcase with icon, detailed description, and interactive elements for maximum engagement',
|
|
264
|
+
icon: ''
|
|
265
|
+
}}
|
|
266
|
+
actions={[
|
|
267
|
+
{
|
|
268
|
+
id: 'explore',
|
|
269
|
+
label: 'Explore',
|
|
270
|
+
variant: 'contained',
|
|
271
|
+
color: 'primary',
|
|
272
|
+
onClick: () => console.log('Explore clicked')
|
|
273
|
+
}
|
|
274
|
+
]}
|
|
275
|
+
elevation={3}
|
|
276
|
+
/>
|
|
277
|
+
</Box>
|
|
278
|
+
|
|
279
|
+
<Box>
|
|
280
|
+
<Typography variant="h5" gutterBottom>List Variant</Typography>
|
|
281
|
+
<Typography variant="body2" sx={{ mb: 2, opacity: 0.7 }}>
|
|
282
|
+
Simple bullet-point lists for concise information
|
|
283
|
+
</Typography>
|
|
284
|
+
<FeatureCard
|
|
285
|
+
features={[
|
|
286
|
+
'Clean, minimal design approach',
|
|
287
|
+
'Quick information scanning',
|
|
288
|
+
'Space-efficient layout',
|
|
289
|
+
'Perfect for feature summaries',
|
|
290
|
+
'Easy to digest content'
|
|
291
|
+
]}
|
|
292
|
+
variant="list"
|
|
293
|
+
title="List Benefits"
|
|
294
|
+
elevation={1}
|
|
295
|
+
/>
|
|
296
|
+
</Box>
|
|
297
|
+
|
|
298
|
+
</Box>
|
|
299
|
+
</QwickApp>
|
|
300
|
+
),
|
|
301
|
+
parameters: {
|
|
302
|
+
docs: {
|
|
303
|
+
description: {
|
|
304
|
+
story: 'Side-by-side comparison of standard vs list variants.',
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
308
|
};
|
|
309
309
|
|
|
310
310
|
// Data Binding Examples
|
|
311
311
|
export const DataBindingBasic: Story = {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
312
|
+
render: () => (
|
|
313
|
+
<QwickApp appId="featurecard-data-binding" appName='FeatureCard Data Binding'>
|
|
314
|
+
<DataProvider dataSource={{ dataProvider }}>
|
|
315
|
+
<Box>
|
|
316
|
+
|
|
317
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
318
|
+
<Typography variant="h5" gutterBottom> Data-Driven FeatureCard</Typography>
|
|
319
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
320
|
+
FeatureCard components can be driven entirely by CMS data using the dataSource prop.
|
|
321
|
+
</Typography>
|
|
322
|
+
|
|
323
|
+
<Code title="Usage" language="tsx">{`<FeatureCard dataSource="features.lightning-fast" />`}</Code>
|
|
324
|
+
|
|
325
|
+
<Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.features['lightning-fast'], null, 2)}</Code>
|
|
326
|
+
</Box>
|
|
327
327
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
328
|
+
<FeatureCard dataSource="features.lightning-fast" />
|
|
329
|
+
|
|
330
|
+
</Box>
|
|
331
|
+
</DataProvider>
|
|
332
|
+
</QwickApp>
|
|
333
|
+
),
|
|
334
|
+
parameters: {
|
|
335
|
+
docs: {
|
|
336
|
+
description: {
|
|
337
|
+
story: 'FeatureCard with data binding - all props resolved from CMS data through dataSource.',
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
341
|
};
|
|
342
342
|
|
|
343
343
|
export const DataBindingAdvanced: Story = {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
344
|
+
render: () => (
|
|
345
|
+
<QwickApp appId="featurecard-data-advanced" appName='Advanced FeatureCard Data Binding'>
|
|
346
|
+
<DataProvider dataSource={{ dataProvider }}>
|
|
347
|
+
<Box>
|
|
348
|
+
|
|
349
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
350
|
+
<Typography variant="h5" gutterBottom> Multiple Data Sources</Typography>
|
|
351
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
352
|
+
Different FeatureCard components can pull from different data sources with varying configurations.
|
|
353
|
+
</Typography>
|
|
354
|
+
</Box>
|
|
355
355
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
356
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))', gap: 4 }}>
|
|
357
|
+
|
|
358
|
+
{/* Standard Feature Card */}
|
|
359
|
+
<Box>
|
|
360
|
+
<Typography variant="h6" gutterBottom>Performance Feature</Typography>
|
|
361
|
+
<FeatureCard dataSource="features.lightning-fast" />
|
|
362
|
+
</Box>
|
|
363
|
+
|
|
364
|
+
{/* Innovation Card with Higher Elevation */}
|
|
365
|
+
<Box>
|
|
366
|
+
<Typography variant="h6" gutterBottom>Innovation Highlight</Typography>
|
|
367
|
+
<FeatureCard dataSource="features.cutting-edge" />
|
|
368
|
+
</Box>
|
|
369
|
+
|
|
370
|
+
{/* Feature List */}
|
|
371
|
+
<Box>
|
|
372
|
+
<Typography variant="h6" gutterBottom>Benefits List</Typography>
|
|
373
|
+
<FeatureCard dataSource="features.benefits-list" />
|
|
374
|
+
</Box>
|
|
375
|
+
|
|
376
|
+
</Box>
|
|
377
|
+
|
|
378
|
+
</Box>
|
|
379
|
+
</DataProvider>
|
|
380
|
+
</QwickApp>
|
|
381
|
+
),
|
|
382
|
+
parameters: {
|
|
383
|
+
docs: {
|
|
384
|
+
description: {
|
|
385
|
+
story: 'Advanced data binding with multiple data sources showcasing different card configurations.',
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
389
|
};
|
|
390
390
|
|
|
391
391
|
export const JsonStringParsing: Story = {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
392
|
+
render: () => (
|
|
393
|
+
<QwickApp appId="featurecard-json" appName='FeatureCard JSON String Parsing'>
|
|
394
|
+
<DataProvider dataSource={{ dataProvider }}>
|
|
395
|
+
<Box>
|
|
396
|
+
|
|
397
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
398
|
+
<Typography variant="h5" gutterBottom> JSON String Processing</Typography>
|
|
399
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
400
|
+
FeatureCard automatically parses JSON strings for feature data and actions, perfect for CMS integration.
|
|
401
|
+
</Typography>
|
|
402
|
+
|
|
403
|
+
<Code title="JSON Feature Data" language="json">{`{
|
|
404
|
+
"feature": ${JSON.stringify({ id: 'example', title: 'Example Feature', description: 'Parsed from JSON string' }, null, 2)},
|
|
405
|
+
"actions": ${JSON.stringify([{ id: 'action', label: 'Learn More', variant: 'contained' }], null, 2)}
|
|
406
406
|
}`}</Code>
|
|
407
|
-
|
|
407
|
+
</Box>
|
|
408
408
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
409
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4 }}>
|
|
410
|
+
|
|
411
|
+
<Box>
|
|
412
|
+
<Typography variant="h6" gutterBottom>JSON Feature + Actions</Typography>
|
|
413
|
+
<FeatureCard dataSource="features.developer-experience" />
|
|
414
|
+
</Box>
|
|
415
|
+
|
|
416
|
+
<Box>
|
|
417
|
+
<Typography variant="h6" gutterBottom>JSON Features List</Typography>
|
|
418
|
+
<FeatureCard dataSource="features.enterprise-benefits" />
|
|
419
|
+
</Box>
|
|
420
|
+
|
|
421
|
+
</Box>
|
|
422
|
+
|
|
423
|
+
</Box>
|
|
424
|
+
</DataProvider>
|
|
425
|
+
</QwickApp>
|
|
426
|
+
),
|
|
427
|
+
parameters: {
|
|
428
|
+
docs: {
|
|
429
|
+
description: {
|
|
430
|
+
story: 'FeatureCard with automatic JSON string parsing for CMS-friendly data formats.',
|
|
431
|
+
},
|
|
432
|
+
},
|
|
433
|
+
},
|
|
434
434
|
};
|
|
435
435
|
|
|
436
436
|
export const DataBindingWithFallback: Story = {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
437
|
+
render: () => (
|
|
438
|
+
<QwickApp appId="featurecard-fallback" appName='FeatureCard Data Binding with Fallback'>
|
|
439
|
+
<DataProvider dataSource={{ dataProvider }}>
|
|
440
|
+
<Box>
|
|
441
|
+
|
|
442
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
443
|
+
<Typography variant="h5" gutterBottom> Fallback Support</Typography>
|
|
444
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
445
|
+
FeatureCard components gracefully handle missing data sources with fallback props.
|
|
446
|
+
</Typography>
|
|
447
|
+
|
|
448
|
+
<Code title="Fallback Usage" language="tsx">{`<FeatureCard
|
|
449
|
+
dataSource="nonexistent.feature"
|
|
450
|
+
feature={fallbackFeature}
|
|
451
|
+
variant="standard"
|
|
452
|
+
elevation={3}
|
|
453
453
|
/>`}</Code>
|
|
454
|
-
|
|
454
|
+
</Box>
|
|
455
455
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
456
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4 }}>
|
|
457
|
+
|
|
458
|
+
<Box>
|
|
459
|
+
<Typography variant="h6" gutterBottom>Standard Fallback</Typography>
|
|
460
|
+
<FeatureCard
|
|
461
|
+
dataSource="nonexistent.feature"
|
|
462
|
+
feature={{
|
|
463
|
+
id: 'fallback-standard',
|
|
464
|
+
title: ' Reliable Fallbacks',
|
|
465
|
+
description: 'Components gracefully handle missing data with fallback content to ensure your application never breaks',
|
|
466
|
+
icon: ''
|
|
467
|
+
}}
|
|
468
|
+
variant="standard"
|
|
469
|
+
elevation={3}
|
|
470
|
+
/>
|
|
471
|
+
</Box>
|
|
472
|
+
|
|
473
|
+
<Box>
|
|
474
|
+
<Typography variant="h6" gutterBottom>List Fallback</Typography>
|
|
475
|
+
<FeatureCard
|
|
476
|
+
dataSource="nonexistent.features"
|
|
477
|
+
features={[
|
|
478
|
+
'Graceful error handling',
|
|
479
|
+
'Fallback content support',
|
|
480
|
+
'Robust data binding',
|
|
481
|
+
'Never breaks your layout'
|
|
482
|
+
]}
|
|
483
|
+
variant="list"
|
|
484
|
+
title="Fallback Features"
|
|
485
|
+
elevation={1}
|
|
486
|
+
/>
|
|
487
|
+
</Box>
|
|
488
|
+
|
|
489
|
+
</Box>
|
|
490
|
+
|
|
491
|
+
</Box>
|
|
492
|
+
</DataProvider>
|
|
493
|
+
</QwickApp>
|
|
494
|
+
),
|
|
495
|
+
parameters: {
|
|
496
|
+
docs: {
|
|
497
|
+
description: {
|
|
498
|
+
story: 'FeatureCard with fallback props when dataSource is missing or unavailable.',
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
502
|
};
|
|
503
503
|
|
|
504
504
|
export const InteractiveFeatures: Story = {
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
505
|
+
render: () => (
|
|
506
|
+
<QwickApp appId="featurecard-interactive" appName='Interactive FeatureCard Features'>
|
|
507
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: 4 }}>
|
|
508
|
+
|
|
509
|
+
<FeatureCard
|
|
510
|
+
feature={{
|
|
511
|
+
id: 'clickable-card',
|
|
512
|
+
title: '👆 Clickable Card',
|
|
513
|
+
description: 'Entire card is clickable with hover effects and cursor feedback',
|
|
514
|
+
icon: '👆'
|
|
515
|
+
}}
|
|
516
|
+
onClick={() => alert('Card clicked!')}
|
|
517
|
+
elevation={2}
|
|
518
|
+
/>
|
|
519
|
+
|
|
520
|
+
<FeatureCard
|
|
521
|
+
feature={{
|
|
522
|
+
id: 'action-buttons',
|
|
523
|
+
title: ' Action Buttons',
|
|
524
|
+
description: 'Multiple call-to-action buttons with different variants and colors',
|
|
525
|
+
icon: ''
|
|
526
|
+
}}
|
|
527
|
+
actions={[
|
|
528
|
+
{
|
|
529
|
+
id: 'primary-action',
|
|
530
|
+
label: 'Primary',
|
|
531
|
+
variant: 'contained',
|
|
532
|
+
color: 'primary',
|
|
533
|
+
onClick: () => alert('Primary action!')
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
id: 'secondary-action',
|
|
537
|
+
label: 'Secondary',
|
|
538
|
+
variant: 'outlined',
|
|
539
|
+
color: 'secondary',
|
|
540
|
+
onClick: () => alert('Secondary action!')
|
|
541
|
+
}
|
|
542
|
+
]}
|
|
543
|
+
elevation={3}
|
|
544
|
+
/>
|
|
545
|
+
|
|
546
|
+
<FeatureCard
|
|
547
|
+
feature={{
|
|
548
|
+
id: 'high-elevation',
|
|
549
|
+
title: '📈 High Impact',
|
|
550
|
+
description: 'Higher elevation creates visual prominence and draws attention',
|
|
551
|
+
icon: '📈'
|
|
552
|
+
}}
|
|
553
|
+
elevation={6}
|
|
554
|
+
/>
|
|
555
|
+
|
|
556
|
+
<FeatureCard
|
|
557
|
+
features={[
|
|
558
|
+
'Interactive hover states',
|
|
559
|
+
'Smooth transitions',
|
|
560
|
+
'Accessibility support',
|
|
561
|
+
'Keyboard navigation',
|
|
562
|
+
'Focus indicators'
|
|
563
|
+
]}
|
|
564
|
+
variant="list"
|
|
565
|
+
title="Interactive Features"
|
|
566
|
+
elevation={1}
|
|
567
|
+
/>
|
|
568
|
+
|
|
569
|
+
</Box>
|
|
570
|
+
</QwickApp>
|
|
571
|
+
),
|
|
572
|
+
parameters: {
|
|
573
|
+
docs: {
|
|
574
|
+
description: {
|
|
575
|
+
story: 'Interactive features including click handlers, action buttons, hover effects, and visual emphasis.',
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
},
|
|
579
579
|
};
|
|
580
580
|
|
|
581
581
|
export const RealWorldExample: Story = {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
582
|
+
render: () => (
|
|
583
|
+
<QwickApp appId="featurecard-real-world" appName='Real World FeatureCard Example'>
|
|
584
|
+
<DataProvider dataSource={{ dataProvider }}>
|
|
585
|
+
<Box>
|
|
586
|
+
|
|
587
|
+
{/* Hero Feature Card */}
|
|
588
|
+
<Box sx={{ mb: 6, textAlign: 'center' }}>
|
|
589
|
+
<Typography variant="h3" gutterBottom sx={{ fontWeight: 'bold', mb: 4 }}>
|
|
590
|
+
Why Choose QwickApps React Framework?
|
|
591
|
+
</Typography>
|
|
592
|
+
<Box sx={{ maxWidth: '400px', mx: 'auto' }}>
|
|
593
|
+
<FeatureCard dataSource="features.lightning-fast" />
|
|
594
|
+
</Box>
|
|
595
|
+
</Box>
|
|
596
|
+
|
|
597
|
+
{/* Feature Grid with Mixed Variants */}
|
|
598
|
+
<Box sx={{ mb: 6 }}>
|
|
599
|
+
<Typography variant="h4" gutterBottom sx={{ textAlign: 'center', mb: 4 }}>
|
|
600
|
+
Complete Development Solution
|
|
601
|
+
</Typography>
|
|
602
|
+
|
|
603
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '2fr 1fr' }, gap: 4 }}>
|
|
604
|
+
|
|
605
|
+
{/* Main Feature Highlight */}
|
|
606
|
+
<FeatureCard dataSource="features.developer-experience" />
|
|
607
|
+
|
|
608
|
+
{/* Benefits List */}
|
|
609
|
+
<FeatureCard dataSource="features.benefits-list" />
|
|
610
|
+
|
|
611
|
+
</Box>
|
|
612
|
+
</Box>
|
|
613
|
+
|
|
614
|
+
{/* Bottom Feature Grid */}
|
|
615
|
+
<Box>
|
|
616
|
+
<Typography variant="h4" gutterBottom sx={{ textAlign: 'center', mb: 4 }}>
|
|
617
|
+
Enterprise Ready
|
|
618
|
+
</Typography>
|
|
619
|
+
|
|
620
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4 }}>
|
|
621
|
+
|
|
622
|
+
{/* Innovation Card */}
|
|
623
|
+
<FeatureCard dataSource="features.cutting-edge" />
|
|
624
|
+
|
|
625
|
+
{/* Enterprise Features */}
|
|
626
|
+
<FeatureCard dataSource="features.enterprise-benefits" />
|
|
627
|
+
|
|
628
|
+
</Box>
|
|
629
|
+
</Box>
|
|
630
|
+
|
|
631
|
+
</Box>
|
|
632
|
+
</DataProvider>
|
|
633
|
+
</QwickApp>
|
|
634
|
+
),
|
|
635
|
+
parameters: {
|
|
636
|
+
docs: {
|
|
637
|
+
description: {
|
|
638
|
+
story: 'Real-world example combining data-driven FeatureCards with different variants and configurations for a complete marketing page.',
|
|
639
|
+
},
|
|
640
|
+
},
|
|
641
|
+
},
|
|
642
642
|
};
|