@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
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelView Base Component Stories - Standardized serialization architecture
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Box, Typography, Alert, Paper, Divider } from '@mui/material';
|
|
8
|
+
import { JsonDataProvider } from '@qwickapps/schema';
|
|
9
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
10
|
+
import { Code } from '../components/blocks';
|
|
11
|
+
import Section from '../components/blocks/Section';
|
|
12
|
+
import { Button } from '../components/buttons/Button';
|
|
13
|
+
import { ComponentTransformer } from '../schemas/transformers/ComponentTransformer';
|
|
14
|
+
import { ModelView } from '../components/base/ModelView';
|
|
15
|
+
import QwickApp from '../components/QwickApp';
|
|
16
|
+
import React from 'react';
|
|
17
|
+
|
|
18
|
+
// Sample data for ModelView demonstrations
|
|
19
|
+
const sampleData = {
|
|
20
|
+
'modelview': {
|
|
21
|
+
'code-example': {
|
|
22
|
+
language: 'typescript',
|
|
23
|
+
title: 'modelview-example.ts',
|
|
24
|
+
showLineNumbers: true,
|
|
25
|
+
showCopy: true,
|
|
26
|
+
children: `// ModelView base class provides standardized serialization
|
|
27
|
+
class Code extends ModelView<CodeProps, CodeModel> {
|
|
28
|
+
static readonly tagName = 'Code';
|
|
29
|
+
static readonly version = '1.0.0';
|
|
30
|
+
|
|
31
|
+
protected getComponentSpecificProps(): any {
|
|
32
|
+
return {
|
|
33
|
+
language: this.props.language,
|
|
34
|
+
showCopy: this.props.showCopy,
|
|
35
|
+
showLineNumbers: this.props.showLineNumbers,
|
|
36
|
+
title: this.props.title
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}`
|
|
40
|
+
},
|
|
41
|
+
'section-example': {
|
|
42
|
+
background: '#f0f8ff',
|
|
43
|
+
padding: 'medium',
|
|
44
|
+
contentMaxWidth: 'lg',
|
|
45
|
+
component: 'section'
|
|
46
|
+
},
|
|
47
|
+
'button-example': {
|
|
48
|
+
label: 'ModelView Button',
|
|
49
|
+
variant: 'primary',
|
|
50
|
+
action: { type: 'navigate', url: '/modelview' }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const dataProvider = new JsonDataProvider({ data: sampleData });
|
|
56
|
+
|
|
57
|
+
const meta = {
|
|
58
|
+
title: 'Architecture/ModelView',
|
|
59
|
+
component: ModelView,
|
|
60
|
+
parameters: {
|
|
61
|
+
layout: 'padded',
|
|
62
|
+
docs: {
|
|
63
|
+
description: {
|
|
64
|
+
component: `ModelView is the abstract base class for all serializable QwickApps components, providing standardized serialization patterns and eliminating code duplication.
|
|
65
|
+
|
|
66
|
+
**Core Architecture Principles:**
|
|
67
|
+
- **Single Source of Truth**: All components inherit common serialization behavior
|
|
68
|
+
- **Standardized API**: Consistent toJson/fromJson patterns across all components
|
|
69
|
+
- **Data Binding Integration**: Automatic CMS integration with loading states and error handling
|
|
70
|
+
- **Type Safety**: Strong typing for component props, models, and serialization data
|
|
71
|
+
- **"WebView for React"**: Enables complete UI serialization and reconstruction
|
|
72
|
+
|
|
73
|
+
**Key Features:**
|
|
74
|
+
- **Common Base Props**: Automatic handling of children, dataSource, bindingOptions, className, id
|
|
75
|
+
- **Component-Specific Extensions**: Hook for components to add their specific serialization properties
|
|
76
|
+
- **Nested Component Support**: Specialized handling for components with nested children (like Section)
|
|
77
|
+
- **Action Pattern Support**: Serializable behavior patterns for interactive components (like Button)
|
|
78
|
+
- **Render Pattern Standardization**: Common render logic for data-bound vs traditional prop usage
|
|
79
|
+
|
|
80
|
+
**Benefits:**
|
|
81
|
+
- **Code Deduplication**: Common patterns implemented once and inherited by all components
|
|
82
|
+
- **Consistency**: All components serialize/deserialize with identical patterns
|
|
83
|
+
- **Maintainability**: Changes to base behavior automatically apply to all components
|
|
84
|
+
- **Testing**: Unified test patterns for serialization across the entire component library`,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
tags: ['autodocs'],
|
|
89
|
+
} satisfies Meta<typeof ModelView>;
|
|
90
|
+
|
|
91
|
+
export default meta;
|
|
92
|
+
type Story = StoryObj<typeof meta>;
|
|
93
|
+
|
|
94
|
+
export const ArchitectureOverview: Story = {
|
|
95
|
+
render: () => (
|
|
96
|
+
<QwickApp appId="modelview-architecture" appName='ModelView Architecture Overview'>
|
|
97
|
+
<Box>
|
|
98
|
+
|
|
99
|
+
<Box sx={{ mb: 6, textAlign: 'center' }}>
|
|
100
|
+
<Typography variant="h2" gutterBottom>ModelView Architecture Pattern</Typography>
|
|
101
|
+
<Typography variant="h5" sx={{ mb: 4, opacity: 0.7 }}>
|
|
102
|
+
The foundation for standardized component serialization in QwickApps React Framework
|
|
103
|
+
</Typography>
|
|
104
|
+
|
|
105
|
+
<Alert severity="info" sx={{ mb: 4, textAlign: 'left' }}>
|
|
106
|
+
ModelView is an abstract base class that eliminates code duplication across QwickApps components
|
|
107
|
+
by providing common serialization, data binding, and rendering patterns. Every serializable
|
|
108
|
+
component (Code, Section, Button) extends ModelView to inherit standardized behavior.
|
|
109
|
+
</Alert>
|
|
110
|
+
</Box>
|
|
111
|
+
|
|
112
|
+
{/* Core Architecture */}
|
|
113
|
+
<Box sx={{ mb: 8 }}>
|
|
114
|
+
<Typography variant="h3" gutterBottom>Core Architecture</Typography>
|
|
115
|
+
<Code language="typescript" title="ModelView.ts" showLineNumbers={true}>
|
|
116
|
+
{`// Abstract base class for all serializable components
|
|
117
|
+
export abstract class ModelView<TProps, TModel>
|
|
118
|
+
extends React.Component<TProps & WithDataBinding>
|
|
119
|
+
implements Serializable {
|
|
120
|
+
|
|
121
|
+
// Component metadata (overridden by subclasses)
|
|
122
|
+
static readonly tagName: string;
|
|
123
|
+
static readonly version: string;
|
|
124
|
+
|
|
125
|
+
// Common serialization implementation
|
|
126
|
+
toJson(): any {
|
|
127
|
+
return {
|
|
128
|
+
...this.getBaseSerializableProps(),
|
|
129
|
+
...this.getComponentSpecificProps()
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Base props all components serialize
|
|
134
|
+
protected getBaseSerializableProps(): any {
|
|
135
|
+
return {
|
|
136
|
+
children: this.serializeChildren(this.props.children),
|
|
137
|
+
dataSource: this.props.dataSource,
|
|
138
|
+
bindingOptions: this.props.bindingOptions,
|
|
139
|
+
className: this.props.className,
|
|
140
|
+
id: this.props.id
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Hook for component-specific props (implemented by subclasses)
|
|
145
|
+
protected abstract getComponentSpecificProps(): any;
|
|
146
|
+
|
|
147
|
+
// Common render pattern
|
|
148
|
+
render() {
|
|
149
|
+
return this.props.dataSource
|
|
150
|
+
? this.renderWithDataBinding()
|
|
151
|
+
: this.renderView();
|
|
152
|
+
}
|
|
153
|
+
}`}
|
|
154
|
+
</Code>
|
|
155
|
+
</Box>
|
|
156
|
+
|
|
157
|
+
{/* Implementation Pattern */}
|
|
158
|
+
<Box sx={{ mb: 8 }}>
|
|
159
|
+
<Typography variant="h3" gutterBottom>Component Implementation Pattern</Typography>
|
|
160
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
161
|
+
Every QwickApps component follows this standardized pattern when extending ModelView
|
|
162
|
+
</Typography>
|
|
163
|
+
<Code language="typescript" title="ComponentImplementation.ts" showLineNumbers={true}>
|
|
164
|
+
{`// Example: Code component implementation
|
|
165
|
+
export class Code extends ModelView<CodeProps, CodeModel> {
|
|
166
|
+
// Required: Component identification
|
|
167
|
+
static readonly tagName = 'Code';
|
|
168
|
+
static readonly version = '1.0.0';
|
|
169
|
+
|
|
170
|
+
// Required: Deserialization factory method
|
|
171
|
+
static fromJson(jsonData: any): ReactElement {
|
|
172
|
+
return <Code {...jsonData} />;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Required: Component-specific serialization properties
|
|
176
|
+
protected getComponentSpecificProps(): any {
|
|
177
|
+
return {
|
|
178
|
+
language: this.props.language,
|
|
179
|
+
showCopy: this.props.showCopy,
|
|
180
|
+
showLineNumbers: this.props.showLineNumbers,
|
|
181
|
+
title: this.props.title,
|
|
182
|
+
wrapLines: this.props.wrapLines,
|
|
183
|
+
codeBackground: this.props.codeBackground
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Required: Traditional props rendering
|
|
188
|
+
protected renderView(): React.ReactElement {
|
|
189
|
+
const { dataSource, bindingOptions, ...restProps } = this.props;
|
|
190
|
+
return <CodeView {...restProps} />;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Required: Data-bound rendering
|
|
194
|
+
protected renderWithDataBinding(): React.ReactElement {
|
|
195
|
+
return <CodeWithDataBinding {...this.props} />;
|
|
196
|
+
}
|
|
197
|
+
}`}
|
|
198
|
+
</Code>
|
|
199
|
+
</Box>
|
|
200
|
+
|
|
201
|
+
{/* Benefits Grid */}
|
|
202
|
+
<Box sx={{ p: 4, backgroundColor: 'primary.light', color: 'primary.contrastText', borderRadius: 2 }}>
|
|
203
|
+
<Typography variant="h3" gutterBottom>ModelView Benefits</Typography>
|
|
204
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr', lg: '1fr 1fr 1fr' }, gap: 4, mt: 4 }}>
|
|
205
|
+
<Box>
|
|
206
|
+
<Typography variant="h6" gutterBottom>Code Deduplication</Typography>
|
|
207
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
208
|
+
Common serialization logic implemented once, inherited by all components. No repetitive boilerplate.
|
|
209
|
+
</Typography>
|
|
210
|
+
</Box>
|
|
211
|
+
<Box>
|
|
212
|
+
<Typography variant="h6" gutterBottom>Consistency</Typography>
|
|
213
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
214
|
+
All components serialize/deserialize with identical patterns. Predictable behavior across the framework.
|
|
215
|
+
</Typography>
|
|
216
|
+
</Box>
|
|
217
|
+
<Box>
|
|
218
|
+
<Typography variant="h6" gutterBottom>Maintainability</Typography>
|
|
219
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
220
|
+
Changes to base behavior automatically apply to all components. Single point of maintenance.
|
|
221
|
+
</Typography>
|
|
222
|
+
</Box>
|
|
223
|
+
<Box>
|
|
224
|
+
<Typography variant="h6" gutterBottom>Data Binding</Typography>
|
|
225
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
226
|
+
Automatic CMS integration with loading states, error handling, and fallback support built-in.
|
|
227
|
+
</Typography>
|
|
228
|
+
</Box>
|
|
229
|
+
<Box>
|
|
230
|
+
<Typography variant="h6" gutterBottom>Type Safety</Typography>
|
|
231
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
232
|
+
Strong typing for component props, models, and serialization data structures throughout.
|
|
233
|
+
</Typography>
|
|
234
|
+
</Box>
|
|
235
|
+
<Box>
|
|
236
|
+
<Typography variant="h6" gutterBottom>WebView Ready</Typography>
|
|
237
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
238
|
+
Complete "WebView for React" functionality - UI can be dynamically generated from data.
|
|
239
|
+
</Typography>
|
|
240
|
+
</Box>
|
|
241
|
+
</Box>
|
|
242
|
+
</Box>
|
|
243
|
+
|
|
244
|
+
</Box>
|
|
245
|
+
</QwickApp>
|
|
246
|
+
),
|
|
247
|
+
parameters: {
|
|
248
|
+
docs: {
|
|
249
|
+
description: {
|
|
250
|
+
story: 'Comprehensive overview of the ModelView architecture pattern and its benefits.',
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
export const SerializationWorkflow: Story = {
|
|
257
|
+
render: () => {
|
|
258
|
+
// Create a complex component structure
|
|
259
|
+
const complexStructure = (
|
|
260
|
+
<Section background="#f5f5f5" padding="large" contentMaxWidth="lg">
|
|
261
|
+
<Typography variant="h4" gutterBottom>
|
|
262
|
+
Complex Component Structure
|
|
263
|
+
</Typography>
|
|
264
|
+
<Typography variant="body1" sx={{ mb: 3 }}>
|
|
265
|
+
This demonstrates how ModelView handles nested component serialization across different component types.
|
|
266
|
+
</Typography>
|
|
267
|
+
|
|
268
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3, mb: 4 }}>
|
|
269
|
+
<Box>
|
|
270
|
+
<Typography variant="h6" gutterBottom>Code Example</Typography>
|
|
271
|
+
<Code language="typescript" title="nested-example.ts">
|
|
272
|
+
{`// Nested components within Section
|
|
273
|
+
const structure = (
|
|
274
|
+
<Section>
|
|
275
|
+
<Code language="typescript">
|
|
276
|
+
console.log("Nested code");
|
|
277
|
+
</Code>
|
|
278
|
+
<Button action={{ type: 'navigate', url: '/example' }}>
|
|
279
|
+
Click Me
|
|
280
|
+
</Button>
|
|
281
|
+
</Section>
|
|
282
|
+
);`}
|
|
283
|
+
</Code>
|
|
284
|
+
</Box>
|
|
285
|
+
<Box>
|
|
286
|
+
<Typography variant="h6" gutterBottom>Interactive Button</Typography>
|
|
287
|
+
<Button
|
|
288
|
+
label="Navigate Example"
|
|
289
|
+
variant="primary"
|
|
290
|
+
action={{ type: 'navigate', url: '/workflow' }}
|
|
291
|
+
/>
|
|
292
|
+
</Box>
|
|
293
|
+
</Box>
|
|
294
|
+
</Section>
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// Serialize the entire structure
|
|
298
|
+
const serializedData = ComponentTransformer.serialize(complexStructure);
|
|
299
|
+
const deserializedComponent = ComponentTransformer.deserialize(serializedData);
|
|
300
|
+
const parsedData = JSON.parse(serializedData);
|
|
301
|
+
|
|
302
|
+
return (
|
|
303
|
+
<QwickApp appId="modelview-serialization-workflow" appName='ModelView Serialization Workflow'>
|
|
304
|
+
<Box>
|
|
305
|
+
|
|
306
|
+
<Box sx={{ mb: 6, textAlign: 'center' }}>
|
|
307
|
+
<Typography variant="h3" gutterBottom>Complete Serialization Workflow</Typography>
|
|
308
|
+
<Typography variant="h6" sx={{ mb: 4, opacity: 0.7 }}>
|
|
309
|
+
Demonstrating full component tree serialization and reconstruction
|
|
310
|
+
</Typography>
|
|
311
|
+
</Box>
|
|
312
|
+
|
|
313
|
+
{/* Original Structure */}
|
|
314
|
+
<Box sx={{ mb: 6 }}>
|
|
315
|
+
<Typography variant="h4" gutterBottom>Original Component Structure</Typography>
|
|
316
|
+
{complexStructure}
|
|
317
|
+
</Box>
|
|
318
|
+
|
|
319
|
+
{/* Serialized JSON Preview */}
|
|
320
|
+
<Box sx={{ mb: 6 }}>
|
|
321
|
+
<Typography variant="h4" gutterBottom>Serialized JSON Structure</Typography>
|
|
322
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
323
|
+
Complete component tree serialized to JSON with ModelView metadata preserved
|
|
324
|
+
</Typography>
|
|
325
|
+
<Paper sx={{ p: 2, backgroundColor: 'grey.100', maxHeight: 500, overflow: 'auto' }}>
|
|
326
|
+
<Code language="json" showLineNumbers={true} title="serialized-structure.json">
|
|
327
|
+
{JSON.stringify(parsedData, null, 2)}
|
|
328
|
+
</Code>
|
|
329
|
+
</Paper>
|
|
330
|
+
</Box>
|
|
331
|
+
|
|
332
|
+
{/* Deserialized Structure */}
|
|
333
|
+
<Box>
|
|
334
|
+
<Typography variant="h4" gutterBottom>Deserialized Component Structure</Typography>
|
|
335
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
336
|
+
Complete component tree reconstructed from JSON with full functionality preserved
|
|
337
|
+
</Typography>
|
|
338
|
+
{deserializedComponent as React.ReactElement}
|
|
339
|
+
</Box>
|
|
340
|
+
|
|
341
|
+
</Box>
|
|
342
|
+
</QwickApp>
|
|
343
|
+
);
|
|
344
|
+
},
|
|
345
|
+
parameters: {
|
|
346
|
+
docs: {
|
|
347
|
+
description: {
|
|
348
|
+
story: 'Complete serialization workflow showing complex component tree serialization and reconstruction.',
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
export const DataBindingIntegration: Story = {
|
|
355
|
+
render: () => (
|
|
356
|
+
<QwickApp appId="modelview-databinding" appName='ModelView Data Binding Integration' dataSource={{ dataProvider }}>
|
|
357
|
+
<Box>
|
|
358
|
+
|
|
359
|
+
<Box sx={{ mb: 6, textAlign: 'center' }}>
|
|
360
|
+
<Typography variant="h3" gutterBottom>Data Binding Integration</Typography>
|
|
361
|
+
<Typography variant="h6" sx={{ mb: 4, opacity: 0.7 }}>
|
|
362
|
+
ModelView provides standardized data binding support across all components
|
|
363
|
+
</Typography>
|
|
364
|
+
|
|
365
|
+
<Alert severity="info" sx={{ mb: 4, textAlign: 'left' }}>
|
|
366
|
+
ModelView includes built-in data binding support that automatically handles CMS integration,
|
|
367
|
+
loading states, error handling, and fallback props. All components extending ModelView
|
|
368
|
+
inherit this functionality without additional implementation.
|
|
369
|
+
</Alert>
|
|
370
|
+
</Box>
|
|
371
|
+
|
|
372
|
+
{/* Data Binding Examples */}
|
|
373
|
+
<Box sx={{ mb: 8 }}>
|
|
374
|
+
<Typography variant="h4" gutterBottom>Data Binding Examples</Typography>
|
|
375
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: '1fr', gap: 4 }}>
|
|
376
|
+
|
|
377
|
+
{/* Code Component */}
|
|
378
|
+
<Box>
|
|
379
|
+
<Typography variant="h5" gutterBottom>Code Component (Data-Bound)</Typography>
|
|
380
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', lg: '1fr 1fr' }, gap: 3 }}>
|
|
381
|
+
<Box>
|
|
382
|
+
<Typography variant="h6" gutterBottom>CMS Data Structure</Typography>
|
|
383
|
+
<Code language="json" showCopy={false}>
|
|
384
|
+
{JSON.stringify(sampleData.modelview['code-example'], null, 2)}
|
|
385
|
+
</Code>
|
|
386
|
+
</Box>
|
|
387
|
+
<Box>
|
|
388
|
+
<Typography variant="h6" gutterBottom>Rendered Component</Typography>
|
|
389
|
+
<Code dataSource="modelview.code-example" />
|
|
390
|
+
</Box>
|
|
391
|
+
</Box>
|
|
392
|
+
</Box>
|
|
393
|
+
|
|
394
|
+
{/* Section Component */}
|
|
395
|
+
<Box>
|
|
396
|
+
<Typography variant="h5" gutterBottom>Section Component (Data-Bound)</Typography>
|
|
397
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', lg: '1fr 1fr' }, gap: 3 }}>
|
|
398
|
+
<Box>
|
|
399
|
+
<Typography variant="h6" gutterBottom>CMS Data Structure</Typography>
|
|
400
|
+
<Code language="json" showCopy={false}>
|
|
401
|
+
{JSON.stringify(sampleData.modelview['section-example'], null, 2)}
|
|
402
|
+
</Code>
|
|
403
|
+
</Box>
|
|
404
|
+
<Box>
|
|
405
|
+
<Typography variant="h6" gutterBottom>Rendered Component</Typography>
|
|
406
|
+
<Section dataSource="modelview.section-example">
|
|
407
|
+
<Typography variant="h6">Data-Bound Section Content</Typography>
|
|
408
|
+
<Typography variant="body2">
|
|
409
|
+
This section loads its styling from CMS data while preserving nested content.
|
|
410
|
+
</Typography>
|
|
411
|
+
</Section>
|
|
412
|
+
</Box>
|
|
413
|
+
</Box>
|
|
414
|
+
</Box>
|
|
415
|
+
|
|
416
|
+
{/* Button Component */}
|
|
417
|
+
<Box>
|
|
418
|
+
<Typography variant="h5" gutterBottom>Button Component (Data-Bound)</Typography>
|
|
419
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', lg: '1fr 1fr' }, gap: 3 }}>
|
|
420
|
+
<Box>
|
|
421
|
+
<Typography variant="h6" gutterBottom>CMS Data Structure</Typography>
|
|
422
|
+
<Code language="json" showCopy={false}>
|
|
423
|
+
{JSON.stringify(sampleData.modelview['button-example'], null, 2)}
|
|
424
|
+
</Code>
|
|
425
|
+
</Box>
|
|
426
|
+
<Box>
|
|
427
|
+
<Typography variant="h6" gutterBottom>Rendered Component</Typography>
|
|
428
|
+
<Button dataSource="modelview.button-example" />
|
|
429
|
+
</Box>
|
|
430
|
+
</Box>
|
|
431
|
+
</Box>
|
|
432
|
+
|
|
433
|
+
</Box>
|
|
434
|
+
</Box>
|
|
435
|
+
|
|
436
|
+
{/* Data Binding Benefits */}
|
|
437
|
+
<Box sx={{ p: 4, backgroundColor: 'success.light', color: 'success.contrastText', borderRadius: 2 }}>
|
|
438
|
+
<Typography variant="h4" gutterBottom>Data Binding Benefits</Typography>
|
|
439
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3, mt: 3 }}>
|
|
440
|
+
<Box>
|
|
441
|
+
<Typography variant="h6" gutterBottom>Automatic Integration</Typography>
|
|
442
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
443
|
+
All ModelView components automatically support data binding without additional implementation.
|
|
444
|
+
</Typography>
|
|
445
|
+
</Box>
|
|
446
|
+
<Box>
|
|
447
|
+
<Typography variant="h6" gutterBottom>Error Handling</Typography>
|
|
448
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
449
|
+
Built-in loading states, error handling, and graceful fallbacks for missing data sources.
|
|
450
|
+
</Typography>
|
|
451
|
+
</Box>
|
|
452
|
+
<Box>
|
|
453
|
+
<Typography variant="h6" gutterBottom>Serialization Preserved</Typography>
|
|
454
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
455
|
+
Data binding configuration is preserved during serialization and deserialization.
|
|
456
|
+
</Typography>
|
|
457
|
+
</Box>
|
|
458
|
+
<Box>
|
|
459
|
+
<Typography variant="h6" gutterBottom>Consistent API</Typography>
|
|
460
|
+
<Typography variant="body2" sx={{ opacity: 0.9 }}>
|
|
461
|
+
Identical data binding patterns across all components for predictable behavior.
|
|
462
|
+
</Typography>
|
|
463
|
+
</Box>
|
|
464
|
+
</Box>
|
|
465
|
+
</Box>
|
|
466
|
+
|
|
467
|
+
</Box>
|
|
468
|
+
</QwickApp>
|
|
469
|
+
),
|
|
470
|
+
parameters: {
|
|
471
|
+
docs: {
|
|
472
|
+
description: {
|
|
473
|
+
story: 'Demonstrates ModelView data binding integration across different component types.',
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
};
|