@qwickapps/react-framework 1.3.4 → 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 +1688 -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/Content.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/ProductCard.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/ThemeContext.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 +20722 -16021
- package/dist/index.js +20725 -16010
- 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/Content.tsx +25 -77
- 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 +51 -52
- 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/ThemeContext.tsx +1 -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,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GridLayout Stories - Flexible grid layout component with serialization support
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
6
|
+
import { GridLayout } from '../components/layout/GridLayout';
|
|
7
|
+
import { GridCell } from '../components/layout/GridCell';
|
|
8
|
+
import { Text } from '../components/blocks/Text';
|
|
9
|
+
import { Button } from '../components/buttons/Button';
|
|
10
|
+
import { Code } from '../components/blocks/Code';
|
|
11
|
+
import { ComponentTransformer } from '../schemas/transformers/ComponentTransformer';
|
|
12
|
+
import React from 'react';
|
|
13
|
+
|
|
14
|
+
// Ensure components are registered for serialization
|
|
15
|
+
ComponentTransformer.registerComponent(GridLayout as any);
|
|
16
|
+
ComponentTransformer.registerComponent(GridCell as any);
|
|
17
|
+
ComponentTransformer.registerComponent(Text as any);
|
|
18
|
+
ComponentTransformer.registerComponent(Button as any);
|
|
19
|
+
ComponentTransformer.registerComponent(Code as any);
|
|
20
|
+
|
|
21
|
+
const meta: Meta<typeof GridLayout> = {
|
|
22
|
+
title: 'Layout/GridLayout',
|
|
23
|
+
component: GridLayout,
|
|
24
|
+
parameters: {
|
|
25
|
+
layout: 'fullscreen',
|
|
26
|
+
docs: {
|
|
27
|
+
description: {
|
|
28
|
+
component: `GridLayout is a flexible grid layout component that supports serialization through the ModelView pattern.
|
|
29
|
+
|
|
30
|
+
**Key Features:**
|
|
31
|
+
- **Responsive Grid**: Supports 1-6 columns with automatic responsive behavior
|
|
32
|
+
- **Flexible Spacing**: T-shirt sizing system (tiny, small, medium, large, huge)
|
|
33
|
+
- **Equal Heights**: Optional equal height columns
|
|
34
|
+
- **Nested Components**: Full support for nested GridCell and other serializable components
|
|
35
|
+
- **Serialization Support**: Complete serialize → deserialize → render workflow
|
|
36
|
+
- **Performance Optimized**: Efficient handling of large grids and complex nested structures
|
|
37
|
+
|
|
38
|
+
**Serialization Capabilities:**
|
|
39
|
+
- Preserves all layout properties (columns, spacing, dimensions, styling)
|
|
40
|
+
- Handles nested component serialization automatically
|
|
41
|
+
- Supports mixed content (serializable components + regular React nodes)
|
|
42
|
+
- Maintains grid behavior through serialization cycles`,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
argTypes: {
|
|
47
|
+
columns: {
|
|
48
|
+
control: { type: 'select', options: [1, 2, 3, 4, 5, 6] },
|
|
49
|
+
description: 'Number of equal-width columns',
|
|
50
|
+
},
|
|
51
|
+
spacing: {
|
|
52
|
+
control: { type: 'select', options: ['tiny', 'small', 'medium', 'large', 'huge'] },
|
|
53
|
+
description: 'Spacing between grid items',
|
|
54
|
+
},
|
|
55
|
+
equalHeight: {
|
|
56
|
+
control: 'boolean',
|
|
57
|
+
description: 'Make all grid items the same height',
|
|
58
|
+
},
|
|
59
|
+
height: {
|
|
60
|
+
control: 'text',
|
|
61
|
+
description: 'Grid container height',
|
|
62
|
+
},
|
|
63
|
+
width: {
|
|
64
|
+
control: 'text',
|
|
65
|
+
description: 'Grid container width',
|
|
66
|
+
},
|
|
67
|
+
className: {
|
|
68
|
+
control: 'text',
|
|
69
|
+
description: 'Additional CSS class names',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export default meta;
|
|
75
|
+
type Story = StoryObj<typeof GridLayout>;
|
|
76
|
+
|
|
77
|
+
// Basic grid layout examples
|
|
78
|
+
export const TwoColumns: Story = {
|
|
79
|
+
args: {
|
|
80
|
+
columns: 2,
|
|
81
|
+
spacing: 'medium',
|
|
82
|
+
},
|
|
83
|
+
render: (args) => (
|
|
84
|
+
<GridLayout {...args}>
|
|
85
|
+
<div style={{ padding: '20px', backgroundColor: '#f0f8ff', borderRadius: '8px' }}>
|
|
86
|
+
Column 1 - Simple div content
|
|
87
|
+
</div>
|
|
88
|
+
<div style={{ padding: '20px', backgroundColor: '#fff0f5', borderRadius: '8px' }}>
|
|
89
|
+
Column 2 - More content here
|
|
90
|
+
</div>
|
|
91
|
+
</GridLayout>
|
|
92
|
+
),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const ThreeColumnsEqual: Story = {
|
|
96
|
+
args: {
|
|
97
|
+
columns: 3,
|
|
98
|
+
spacing: 'large',
|
|
99
|
+
equalHeight: true,
|
|
100
|
+
},
|
|
101
|
+
render: (args) => (
|
|
102
|
+
<GridLayout {...args}>
|
|
103
|
+
<div style={{ padding: '20px', backgroundColor: '#e6ffe6', borderRadius: '8px' }}>
|
|
104
|
+
<h3>Column 1</h3>
|
|
105
|
+
<p>Short content</p>
|
|
106
|
+
</div>
|
|
107
|
+
<div style={{ padding: '20px', backgroundColor: '#ffe6e6', borderRadius: '8px' }}>
|
|
108
|
+
<h3>Column 2</h3>
|
|
109
|
+
<p>This column has more content to demonstrate equal height functionality working properly across all columns.</p>
|
|
110
|
+
</div>
|
|
111
|
+
<div style={{ padding: '20px', backgroundColor: '#e6e6ff', borderRadius: '8px' }}>
|
|
112
|
+
<h3>Column 3</h3>
|
|
113
|
+
<p>Medium content here</p>
|
|
114
|
+
</div>
|
|
115
|
+
</GridLayout>
|
|
116
|
+
),
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// GridCell integration examples
|
|
120
|
+
export const WithGridCells: Story = {
|
|
121
|
+
args: {
|
|
122
|
+
spacing: 'large',
|
|
123
|
+
},
|
|
124
|
+
render: (args) => (
|
|
125
|
+
<GridLayout {...args}>
|
|
126
|
+
<GridCell xs={12} sm={8} background="#f8f9fa" padding="large">
|
|
127
|
+
<Text content="Main Content Area" variant="h3" />
|
|
128
|
+
<Text content="This is the primary content area that takes up 8 columns on small screens and full width on mobile." variant="body1" />
|
|
129
|
+
</GridCell>
|
|
130
|
+
<GridCell xs={12} sm={4} background="#e9ecef" padding="large">
|
|
131
|
+
<Text content="Sidebar" variant="h4" />
|
|
132
|
+
<Text content="This sidebar takes up 4 columns on small screens." variant="body2" />
|
|
133
|
+
<Button label="Call to Action" variant="primary" />
|
|
134
|
+
</GridCell>
|
|
135
|
+
</GridLayout>
|
|
136
|
+
),
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const ComplexResponsive: Story = {
|
|
140
|
+
args: {
|
|
141
|
+
spacing: 'medium',
|
|
142
|
+
},
|
|
143
|
+
render: (args) => (
|
|
144
|
+
<GridLayout {...args}>
|
|
145
|
+
<GridCell xs={12} sm={6} md={4} lg={3} padding="medium">
|
|
146
|
+
<div style={{ padding: '16px', backgroundColor: '#fff3cd', borderRadius: '4px', textAlign: 'center' }}>
|
|
147
|
+
<strong>Responsive Card 1</strong>
|
|
148
|
+
<br />
|
|
149
|
+
<small>XS: 12, SM: 6, MD: 4, LG: 3</small>
|
|
150
|
+
</div>
|
|
151
|
+
</GridCell>
|
|
152
|
+
<GridCell xs={12} sm={6} md={4} lg={3} padding="medium">
|
|
153
|
+
<div style={{ padding: '16px', backgroundColor: '#d4edda', borderRadius: '4px', textAlign: 'center' }}>
|
|
154
|
+
<strong>Responsive Card 2</strong>
|
|
155
|
+
<br />
|
|
156
|
+
<small>XS: 12, SM: 6, MD: 4, LG: 3</small>
|
|
157
|
+
</div>
|
|
158
|
+
</GridCell>
|
|
159
|
+
<GridCell xs={12} sm={12} md={4} lg={6} padding="medium">
|
|
160
|
+
<div style={{ padding: '16px', backgroundColor: '#cce5ff', borderRadius: '4px', textAlign: 'center' }}>
|
|
161
|
+
<strong>Wider Card</strong>
|
|
162
|
+
<br />
|
|
163
|
+
<small>XS: 12, SM: 12, MD: 4, LG: 6</small>
|
|
164
|
+
</div>
|
|
165
|
+
</GridCell>
|
|
166
|
+
</GridLayout>
|
|
167
|
+
),
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Serialization examples
|
|
171
|
+
export const SerializationDemo: Story = {
|
|
172
|
+
args: {
|
|
173
|
+
columns: 2,
|
|
174
|
+
spacing: 'large',
|
|
175
|
+
height: '400px',
|
|
176
|
+
},
|
|
177
|
+
render: (args) => {
|
|
178
|
+
const gridComponent = (
|
|
179
|
+
<GridLayout {...args}>
|
|
180
|
+
<GridCell span={8} background="background.paper" padding="large">
|
|
181
|
+
<Text content="Serializable Content" variant="h3" />
|
|
182
|
+
<Text content="This entire grid layout can be serialized to JSON and recreated exactly." variant="body1" />
|
|
183
|
+
<Button label="Interactive Button" variant="outlined" />
|
|
184
|
+
</GridCell>
|
|
185
|
+
<GridCell span={4} background="grey.100" padding="medium">
|
|
186
|
+
<Text content="Code Example" variant="h5" />
|
|
187
|
+
<Code language="typescript" showCopy={true}>
|
|
188
|
+
{`// Serialize the grid
|
|
189
|
+
const serialized = ComponentTransformer
|
|
190
|
+
.serialize(gridComponent);
|
|
191
|
+
|
|
192
|
+
// Deserialize back to React
|
|
193
|
+
const restored = ComponentTransformer
|
|
194
|
+
.deserialize(serialized);`}
|
|
195
|
+
</Code>
|
|
196
|
+
</GridCell>
|
|
197
|
+
</GridLayout>
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
return (
|
|
201
|
+
<div>
|
|
202
|
+
<div style={{ marginBottom: '24px' }}>
|
|
203
|
+
<h3>Original Component:</h3>
|
|
204
|
+
</div>
|
|
205
|
+
{gridComponent}
|
|
206
|
+
<div style={{ marginTop: '24px', marginBottom: '16px' }}>
|
|
207
|
+
<h3>Serialized JSON (first 200 characters):</h3>
|
|
208
|
+
<pre style={{
|
|
209
|
+
backgroundColor: '#f5f5f5',
|
|
210
|
+
padding: '12px',
|
|
211
|
+
borderRadius: '4px',
|
|
212
|
+
fontSize: '12px',
|
|
213
|
+
overflow: 'hidden',
|
|
214
|
+
maxHeight: '120px'
|
|
215
|
+
}}>
|
|
216
|
+
{ComponentTransformer.serialize(gridComponent).substring(0, 200)}...
|
|
217
|
+
</pre>
|
|
218
|
+
</div>
|
|
219
|
+
<div style={{ marginBottom: '16px' }}>
|
|
220
|
+
<h3>Deserialized Component:</h3>
|
|
221
|
+
</div>
|
|
222
|
+
{ComponentTransformer.deserialize(ComponentTransformer.serialize(gridComponent))}
|
|
223
|
+
</div>
|
|
224
|
+
);
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
export const LargeGridPerformance: Story = {
|
|
229
|
+
args: {
|
|
230
|
+
columns: 4,
|
|
231
|
+
spacing: 'small',
|
|
232
|
+
},
|
|
233
|
+
render: (args) => {
|
|
234
|
+
const items = Array.from({ length: 24 }, (_, i) => (
|
|
235
|
+
<GridCell key={i} padding="small">
|
|
236
|
+
<div style={{
|
|
237
|
+
padding: '12px',
|
|
238
|
+
backgroundColor: i % 2 === 0 ? '#f0f8ff' : '#fff5ee',
|
|
239
|
+
borderRadius: '4px',
|
|
240
|
+
textAlign: 'center',
|
|
241
|
+
minHeight: '80px',
|
|
242
|
+
display: 'flex',
|
|
243
|
+
alignItems: 'center',
|
|
244
|
+
justifyContent: 'center'
|
|
245
|
+
}}>
|
|
246
|
+
Item {i + 1}
|
|
247
|
+
</div>
|
|
248
|
+
</GridCell>
|
|
249
|
+
));
|
|
250
|
+
|
|
251
|
+
const startTime = performance.now();
|
|
252
|
+
const gridComponent = <GridLayout {...args}>{items}</GridLayout>;
|
|
253
|
+
const serialized = ComponentTransformer.serialize(gridComponent);
|
|
254
|
+
const deserialized = ComponentTransformer.deserialize(serialized);
|
|
255
|
+
const endTime = performance.now();
|
|
256
|
+
|
|
257
|
+
return (
|
|
258
|
+
<div>
|
|
259
|
+
<div style={{ marginBottom: '16px', padding: '12px', backgroundColor: '#e7f3ff', borderRadius: '4px' }}>
|
|
260
|
+
<strong>Performance Test:</strong> 24-item grid serialized and deserialized in {(endTime - startTime).toFixed(2)}ms
|
|
261
|
+
<br />
|
|
262
|
+
<small>Serialized size: {serialized.length.toLocaleString()} characters</small>
|
|
263
|
+
</div>
|
|
264
|
+
{deserialized}
|
|
265
|
+
</div>
|
|
266
|
+
);
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
export const MixedContent: Story = {
|
|
271
|
+
args: {
|
|
272
|
+
spacing: 'medium',
|
|
273
|
+
},
|
|
274
|
+
render: (args) => (
|
|
275
|
+
<GridLayout {...args}>
|
|
276
|
+
<GridCell xs={12} md={6} background="info.light" padding="large">
|
|
277
|
+
<Text content="Serializable Components" variant="h4" />
|
|
278
|
+
<Text content="This cell contains components that implement ModelView and can be fully serialized." variant="body1" />
|
|
279
|
+
<div style={{ marginTop: '16px' }}>
|
|
280
|
+
<Button label="Serializable Button" variant="primary" />
|
|
281
|
+
</div>
|
|
282
|
+
</GridCell>
|
|
283
|
+
<div style={{ padding: '24px', backgroundColor: '#fff8dc' }}>
|
|
284
|
+
<h4>Regular React Content</h4>
|
|
285
|
+
<p>This is a regular div that will be serialized as a React node structure, preserving its content but not as a component.</p>
|
|
286
|
+
<ul>
|
|
287
|
+
<li>Bullet point 1</li>
|
|
288
|
+
<li>Bullet point 2</li>
|
|
289
|
+
</ul>
|
|
290
|
+
</div>
|
|
291
|
+
<GridCell xs={12} padding="large">
|
|
292
|
+
<Text content="Full Width Footer" variant="h5" />
|
|
293
|
+
<Code language="json" title="Serialization Result">
|
|
294
|
+
{`{
|
|
295
|
+
"tag": "GridLayout",
|
|
296
|
+
"version": "1.0.0",
|
|
297
|
+
"data": {
|
|
298
|
+
"spacing": "medium",
|
|
299
|
+
"children": "[...]"
|
|
300
|
+
}
|
|
301
|
+
}`}
|
|
302
|
+
</Code>
|
|
303
|
+
</GridCell>
|
|
304
|
+
</GridLayout>
|
|
305
|
+
),
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
export const DimensionsAndStyling: Story = {
|
|
309
|
+
args: {
|
|
310
|
+
columns: 3,
|
|
311
|
+
spacing: 'huge',
|
|
312
|
+
height: '300px',
|
|
313
|
+
width: '100%',
|
|
314
|
+
maxWidth: '1200px',
|
|
315
|
+
className: 'custom-grid-demo',
|
|
316
|
+
},
|
|
317
|
+
render: (args) => (
|
|
318
|
+
<div style={{ margin: '0 auto' }}>
|
|
319
|
+
<GridLayout {...args}>
|
|
320
|
+
<div style={{
|
|
321
|
+
padding: '20px',
|
|
322
|
+
backgroundColor: '#ffe4e1',
|
|
323
|
+
borderRadius: '8px',
|
|
324
|
+
display: 'flex',
|
|
325
|
+
alignItems: 'center',
|
|
326
|
+
justifyContent: 'center'
|
|
327
|
+
}}>
|
|
328
|
+
<Text content="Styled Grid" variant="h6" />
|
|
329
|
+
</div>
|
|
330
|
+
<div style={{
|
|
331
|
+
padding: '20px',
|
|
332
|
+
backgroundColor: '#e1f5fe',
|
|
333
|
+
borderRadius: '8px',
|
|
334
|
+
display: 'flex',
|
|
335
|
+
alignItems: 'center',
|
|
336
|
+
justifyContent: 'center'
|
|
337
|
+
}}>
|
|
338
|
+
<Text content="Fixed Height" variant="h6" />
|
|
339
|
+
</div>
|
|
340
|
+
<div style={{
|
|
341
|
+
padding: '20px',
|
|
342
|
+
backgroundColor: '#e8f5e8',
|
|
343
|
+
borderRadius: '8px',
|
|
344
|
+
display: 'flex',
|
|
345
|
+
alignItems: 'center',
|
|
346
|
+
justifyContent: 'center'
|
|
347
|
+
}}>
|
|
348
|
+
<Text content="Max Width" variant="h6" />
|
|
349
|
+
</div>
|
|
350
|
+
</GridLayout>
|
|
351
|
+
</div>
|
|
352
|
+
),
|
|
353
|
+
};
|