@qwickapps/react-framework 1.3.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/LICENSE +44 -0
- package/README.md +794 -0
- package/dist/components/AccessibilityChecker.d.ts +12 -0
- package/dist/components/AccessibilityChecker.d.ts.map +1 -0
- package/dist/components/Html.d.ts +48 -0
- package/dist/components/Html.d.ts.map +1 -0
- package/dist/components/Logo.d.ts +79 -0
- package/dist/components/Logo.d.ts.map +1 -0
- package/dist/components/Markdown.d.ts +47 -0
- package/dist/components/Markdown.d.ts.map +1 -0
- package/dist/components/QwickApp.d.ts +56 -0
- package/dist/components/QwickApp.d.ts.map +1 -0
- package/dist/components/QwickAppsLogo.d.ts +25 -0
- package/dist/components/QwickAppsLogo.d.ts.map +1 -0
- package/dist/components/ResponsiveMenu.d.ts +38 -0
- package/dist/components/ResponsiveMenu.d.ts.map +1 -0
- package/dist/components/SafeSpan.d.ts +23 -0
- package/dist/components/SafeSpan.d.ts.map +1 -0
- package/dist/components/Scaffold.d.ts +57 -0
- package/dist/components/Scaffold.d.ts.map +1 -0
- package/dist/components/blocks/Article.d.ts +23 -0
- package/dist/components/blocks/Article.d.ts.map +1 -0
- package/dist/components/blocks/CardListGrid.d.ts +23 -0
- package/dist/components/blocks/CardListGrid.d.ts.map +1 -0
- package/dist/components/blocks/Code.d.ts +21 -0
- package/dist/components/blocks/Code.d.ts.map +1 -0
- package/dist/components/blocks/Content.d.ts +24 -0
- package/dist/components/blocks/Content.d.ts.map +1 -0
- package/dist/components/blocks/CoverImageHeader.d.ts +44 -0
- package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -0
- package/dist/components/blocks/FeatureCard.d.ts +66 -0
- package/dist/components/blocks/FeatureCard.d.ts.map +1 -0
- package/dist/components/blocks/FeatureGrid.d.ts +48 -0
- package/dist/components/blocks/FeatureGrid.d.ts.map +1 -0
- package/dist/components/blocks/Footer.d.ts +56 -0
- package/dist/components/blocks/Footer.d.ts.map +1 -0
- package/dist/components/blocks/HeroBlock.d.ts +33 -0
- package/dist/components/blocks/HeroBlock.d.ts.map +1 -0
- package/dist/components/blocks/PageBannerHeader.d.ts +30 -0
- package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -0
- package/dist/components/blocks/ProductCard.d.ts +57 -0
- package/dist/components/blocks/ProductCard.d.ts.map +1 -0
- package/dist/components/blocks/Section.d.ts +40 -0
- package/dist/components/blocks/Section.d.ts.map +1 -0
- package/dist/components/blocks/index.d.ts +37 -0
- package/dist/components/blocks/index.d.ts.map +1 -0
- package/dist/components/buttons/Button.d.ts +38 -0
- package/dist/components/buttons/Button.d.ts.map +1 -0
- package/dist/components/buttons/PaletteSwitcher.d.ts +24 -0
- package/dist/components/buttons/PaletteSwitcher.d.ts.map +1 -0
- package/dist/components/buttons/ThemeSwitcher.d.ts +24 -0
- package/dist/components/buttons/ThemeSwitcher.d.ts.map +1 -0
- package/dist/components/buttons/index.d.ts +11 -0
- package/dist/components/buttons/index.d.ts.map +1 -0
- package/dist/components/forms/FormBlock.d.ts +45 -0
- package/dist/components/forms/FormBlock.d.ts.map +1 -0
- package/dist/components/forms/index.d.ts +8 -0
- package/dist/components/forms/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +32 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/input/ChoiceInputField.d.ts +30 -0
- package/dist/components/input/ChoiceInputField.d.ts.map +1 -0
- package/dist/components/input/HtmlInputField.d.ts +29 -0
- package/dist/components/input/HtmlInputField.d.ts.map +1 -0
- package/dist/components/input/SelectInputField.d.ts +29 -0
- package/dist/components/input/SelectInputField.d.ts.map +1 -0
- package/dist/components/input/TextField.d.ts +18 -0
- package/dist/components/input/TextField.d.ts.map +1 -0
- package/dist/components/input/TextInputField.d.ts +32 -0
- package/dist/components/input/TextInputField.d.ts.map +1 -0
- package/dist/components/input/index.d.ts +17 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/layout/GridCell.d.ts +16 -0
- package/dist/components/layout/GridCell.d.ts.map +1 -0
- package/dist/components/layout/GridCellWrapper.d.ts +46 -0
- package/dist/components/layout/GridCellWrapper.d.ts.map +1 -0
- package/dist/components/layout/GridLayout.d.ts +38 -0
- package/dist/components/layout/GridLayout.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +12 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/menu/Menu.d.ts +1 -0
- package/dist/components/menu/Menu.d.ts.map +1 -0
- package/dist/components/menu/MenuItem.d.ts +31 -0
- package/dist/components/menu/MenuItem.d.ts.map +1 -0
- package/dist/components/menu/index.d.ts +7 -0
- package/dist/components/menu/index.d.ts.map +1 -0
- package/dist/components/pages/FormPage.d.ts +66 -0
- package/dist/components/pages/FormPage.d.ts.map +1 -0
- package/dist/components/pages/Page.d.ts +124 -0
- package/dist/components/pages/Page.d.ts.map +1 -0
- package/dist/components/pages/index.d.ts +11 -0
- package/dist/components/pages/index.d.ts.map +1 -0
- package/dist/contexts/DataContext.d.ts +139 -0
- package/dist/contexts/DataContext.d.ts.map +1 -0
- package/dist/contexts/DimensionsContext.d.ts +42 -0
- package/dist/contexts/DimensionsContext.d.ts.map +1 -0
- package/dist/contexts/PaletteContext.d.ts +53 -0
- package/dist/contexts/PaletteContext.d.ts.map +1 -0
- package/dist/contexts/QwickAppContext.d.ts +71 -0
- package/dist/contexts/QwickAppContext.d.ts.map +1 -0
- package/dist/contexts/ThemeContext.d.ts +65 -0
- package/dist/contexts/ThemeContext.d.ts.map +1 -0
- package/dist/contexts/index.d.ts +9 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/useBaseProps.d.ts +101 -0
- package/dist/hooks/useBaseProps.d.ts.map +1 -0
- package/dist/hooks/useDataBinding.d.ts +22 -0
- package/dist/hooks/useDataBinding.d.ts.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.css +1 -0
- package/dist/index.esm.js +24143 -0
- package/dist/index.js +24245 -0
- package/dist/palettes/PaletteAutumn.d.ts +10 -0
- package/dist/palettes/PaletteAutumn.d.ts.map +1 -0
- package/dist/palettes/PaletteCosmic.d.ts +10 -0
- package/dist/palettes/PaletteCosmic.d.ts.map +1 -0
- package/dist/palettes/PaletteDefault.d.ts +10 -0
- package/dist/palettes/PaletteDefault.d.ts.map +1 -0
- package/dist/palettes/PaletteOcean.d.ts +10 -0
- package/dist/palettes/PaletteOcean.d.ts.map +1 -0
- package/dist/palettes/PaletteSpring.d.ts +10 -0
- package/dist/palettes/PaletteSpring.d.ts.map +1 -0
- package/dist/palettes/PaletteWinter.d.ts +10 -0
- package/dist/palettes/PaletteWinter.d.ts.map +1 -0
- package/dist/palettes/index.d.ts +13 -0
- package/dist/palettes/index.d.ts.map +1 -0
- package/dist/schemas/ActionSchema.d.ts +21 -0
- package/dist/schemas/ActionSchema.d.ts.map +1 -0
- package/dist/schemas/ArticleSchema.d.ts +13 -0
- package/dist/schemas/ArticleSchema.d.ts.map +1 -0
- package/dist/schemas/Builders.d.ts +7 -0
- package/dist/schemas/Builders.d.ts.map +1 -0
- package/dist/schemas/ButtonSchema.d.ts +19 -0
- package/dist/schemas/ButtonSchema.d.ts.map +1 -0
- package/dist/schemas/CardListGridSchema.d.ts +17 -0
- package/dist/schemas/CardListGridSchema.d.ts.map +1 -0
- package/dist/schemas/ChoiceInputFieldSchema.d.ts +18 -0
- package/dist/schemas/ChoiceInputFieldSchema.d.ts.map +1 -0
- package/dist/schemas/CodeSchema.d.ts +18 -0
- package/dist/schemas/CodeSchema.d.ts.map +1 -0
- package/dist/schemas/ContentSchema.d.ts +20 -0
- package/dist/schemas/ContentSchema.d.ts.map +1 -0
- package/dist/schemas/CoverImageHeaderSchema.d.ts +28 -0
- package/dist/schemas/CoverImageHeaderSchema.d.ts.map +1 -0
- package/dist/schemas/FeatureCardSchema.d.ts +28 -0
- package/dist/schemas/FeatureCardSchema.d.ts.map +1 -0
- package/dist/schemas/FeatureGridSchema.d.ts +17 -0
- package/dist/schemas/FeatureGridSchema.d.ts.map +1 -0
- package/dist/schemas/FeatureItemSchema.d.ts +16 -0
- package/dist/schemas/FeatureItemSchema.d.ts.map +1 -0
- package/dist/schemas/FooterItemSchema.d.ts +15 -0
- package/dist/schemas/FooterItemSchema.d.ts.map +1 -0
- package/dist/schemas/FooterSchema.d.ts +20 -0
- package/dist/schemas/FooterSchema.d.ts.map +1 -0
- package/dist/schemas/FooterSectionSchema.d.ts +15 -0
- package/dist/schemas/FooterSectionSchema.d.ts.map +1 -0
- package/dist/schemas/FormBlockSchema.d.ts +19 -0
- package/dist/schemas/FormBlockSchema.d.ts.map +1 -0
- package/dist/schemas/HeaderActionSchema.d.ts +17 -0
- package/dist/schemas/HeaderActionSchema.d.ts.map +1 -0
- package/dist/schemas/HeroBlockSchema.d.ts +22 -0
- package/dist/schemas/HeroBlockSchema.d.ts.map +1 -0
- package/dist/schemas/HtmlInputFieldSchema.d.ts +18 -0
- package/dist/schemas/HtmlInputFieldSchema.d.ts.map +1 -0
- package/dist/schemas/MetadataItemSchema.d.ts +13 -0
- package/dist/schemas/MetadataItemSchema.d.ts.map +1 -0
- package/dist/schemas/PageBannerHeaderSchema.d.ts +28 -0
- package/dist/schemas/PageBannerHeaderSchema.d.ts.map +1 -0
- package/dist/schemas/PaletteSwitcherSchema.d.ts +16 -0
- package/dist/schemas/PaletteSwitcherSchema.d.ts.map +1 -0
- package/dist/schemas/ProductCardSchema.d.ts +39 -0
- package/dist/schemas/ProductCardSchema.d.ts.map +1 -0
- package/dist/schemas/SafeSpanSchema.d.ts +13 -0
- package/dist/schemas/SafeSpanSchema.d.ts.map +1 -0
- package/dist/schemas/SectionSchema.d.ts +17 -0
- package/dist/schemas/SectionSchema.d.ts.map +1 -0
- package/dist/schemas/SelectInputFieldSchema.d.ts +27 -0
- package/dist/schemas/SelectInputFieldSchema.d.ts.map +1 -0
- package/dist/schemas/TextInputFieldSchema.d.ts +22 -0
- package/dist/schemas/TextInputFieldSchema.d.ts.map +1 -0
- package/dist/schemas/ThemeSwitcherSchema.d.ts +19 -0
- package/dist/schemas/ThemeSwitcherSchema.d.ts.map +1 -0
- package/dist/schemas/index.d.ts +33 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/types.d.ts +7 -0
- package/dist/schemas/types.d.ts.map +1 -0
- package/dist/templates/TemplateResolver.d.ts +52 -0
- package/dist/templates/TemplateResolver.d.ts.map +1 -0
- package/dist/templates/index.d.ts +7 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/tests/ConsoleWarningTest.d.ts +5 -0
- package/dist/tests/ConsoleWarningTest.d.ts.map +1 -0
- package/dist/tests/StorageKeyTest.d.ts +6 -0
- package/dist/tests/StorageKeyTest.d.ts.map +1 -0
- package/dist/tests/ThemeStorageKeyTest.d.ts +6 -0
- package/dist/tests/ThemeStorageKeyTest.d.ts.map +1 -0
- package/dist/types/CacheProvider.d.ts +18 -0
- package/dist/types/CacheProvider.d.ts.map +1 -0
- package/dist/types/ContentProxy.d.ts +47 -0
- package/dist/types/ContentProxy.d.ts.map +1 -0
- package/dist/types/DataBinding.d.ts +7 -0
- package/dist/types/DataBinding.d.ts.map +1 -0
- package/dist/types/DataProvider.d.ts +7 -0
- package/dist/types/DataProvider.d.ts.map +1 -0
- package/dist/types/DataTypes.d.ts +185 -0
- package/dist/types/DataTypes.d.ts.map +1 -0
- package/dist/types/TemplateProvider.d.ts +10 -0
- package/dist/types/TemplateProvider.d.ts.map +1 -0
- package/dist/types/TemplateResolver.d.ts +23 -0
- package/dist/types/TemplateResolver.d.ts.map +1 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/breakpoints.d.ts +35 -0
- package/dist/utils/breakpoints.d.ts.map +1 -0
- package/dist/utils/customPaletteManager.d.ts +8 -0
- package/dist/utils/customPaletteManager.d.ts.map +1 -0
- package/dist/utils/dimensions.d.ts +34 -0
- package/dist/utils/dimensions.d.ts.map +1 -0
- package/dist/utils/htmlTransform.d.ts +44 -0
- package/dist/utils/htmlTransform.d.ts.map +1 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/paletteUtils.d.ts +38 -0
- package/dist/utils/paletteUtils.d.ts.map +1 -0
- package/dist/utils/persistenceUtils.d.ts +31 -0
- package/dist/utils/persistenceUtils.d.ts.map +1 -0
- package/dist/utils/reactUtils.d.ts +24 -0
- package/dist/utils/reactUtils.d.ts.map +1 -0
- package/dist/utils/spacing.d.ts +34 -0
- package/dist/utils/spacing.d.ts.map +1 -0
- package/dist/utils/themePerformanceMonitor.d.ts +32 -0
- package/dist/utils/themePerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/themeUtils.d.ts +27 -0
- package/dist/utils/themeUtils.d.ts.map +1 -0
- package/package.json +141 -0
- package/src/__tests__/components/Logo.test.js +172 -0
- package/src/__tests__/contexts/DataContext.test.js +505 -0
- package/src/__tests__/contexts/PaletteContext.test.js +115 -0
- package/src/__tests__/contexts/ThemeContext.test.js +123 -0
- package/src/__tests__/utils/paletteUtils.test.js +142 -0
- package/src/__tests__/utils/themeUtils.test.js +142 -0
- package/src/components/AccessibilityChecker.tsx +264 -0
- package/src/components/Html.tsx +191 -0
- package/src/components/Logo.css +217 -0
- package/src/components/Logo.tsx +370 -0
- package/src/components/Markdown.tsx +191 -0
- package/src/components/QwickApp.css +257 -0
- package/src/components/QwickApp.tsx +157 -0
- package/src/components/QwickAppsLogo.tsx +77 -0
- package/src/components/ResponsiveMenu.css +416 -0
- package/src/components/ResponsiveMenu.tsx +310 -0
- package/src/components/SafeSpan.tsx +128 -0
- package/src/components/Scaffold.css +541 -0
- package/src/components/Scaffold.tsx +463 -0
- package/src/components/__tests__/Article.test.tsx +419 -0
- package/src/components/__tests__/Button.test.tsx +702 -0
- package/src/components/__tests__/CardListGrid.test.tsx +478 -0
- package/src/components/__tests__/ChoiceInputField.test.tsx +864 -0
- package/src/components/__tests__/Code.test.tsx +595 -0
- package/src/components/__tests__/Content.integration.test.tsx +193 -0
- package/src/components/__tests__/Content.test.tsx +504 -0
- package/src/components/__tests__/CoverImageHeader.test.tsx +456 -0
- package/src/components/__tests__/FeatureCard.integration.test.tsx +384 -0
- package/src/components/__tests__/FeatureGrid.integration.test.tsx +364 -0
- package/src/components/__tests__/FeatureGrid.test.tsx +494 -0
- package/src/components/__tests__/Footer.test.tsx +544 -0
- package/src/components/__tests__/FormBlock.test.tsx +857 -0
- package/src/components/__tests__/HeroBlock.integration.test.tsx +272 -0
- package/src/components/__tests__/HeroBlock.test.tsx +463 -0
- package/src/components/__tests__/Html.test.tsx +174 -0
- package/src/components/__tests__/HtmlInputField.test.tsx +856 -0
- package/src/components/__tests__/Markdown.test.tsx +233 -0
- package/src/components/__tests__/PageBannerHeader.test.tsx +614 -0
- package/src/components/__tests__/PaletteSwitcher.test.tsx +864 -0
- package/src/components/__tests__/ProductCard.test.tsx +377 -0
- package/src/components/__tests__/SafeSpan.integration.test.tsx +123 -0
- package/src/components/__tests__/SafeSpan.simple.test.tsx +65 -0
- package/src/components/__tests__/SafeSpan.test.tsx +388 -0
- package/src/components/__tests__/Section.integration.test.tsx +288 -0
- package/src/components/__tests__/Section.test.tsx +494 -0
- package/src/components/__tests__/SelectInputField.test.tsx +886 -0
- package/src/components/__tests__/TextInputField.test.tsx +749 -0
- package/src/components/__tests__/ThemeSwitcher.test.tsx +777 -0
- package/src/components/blocks/Article.tsx +194 -0
- package/src/components/blocks/CardListGrid.tsx +132 -0
- package/src/components/blocks/Code.tsx +313 -0
- package/src/components/blocks/Content.tsx +265 -0
- package/src/components/blocks/CoverImageHeader.css +17 -0
- package/src/components/blocks/CoverImageHeader.tsx +435 -0
- package/src/components/blocks/FeatureCard.tsx +321 -0
- package/src/components/blocks/FeatureGrid.tsx +147 -0
- package/src/components/blocks/Footer.tsx +343 -0
- package/src/components/blocks/HeroBlock.tsx +280 -0
- package/src/components/blocks/PageBannerHeader.tsx +471 -0
- package/src/components/blocks/ProductCard.tsx +472 -0
- package/src/components/blocks/Section.tsx +209 -0
- package/src/components/blocks/index.ts +37 -0
- package/src/components/buttons/Button.tsx +233 -0
- package/src/components/buttons/PaletteSwitcher.tsx +268 -0
- package/src/components/buttons/ThemeSwitcher.tsx +283 -0
- package/src/components/buttons/index.ts +11 -0
- package/src/components/forms/FormBlock.tsx +291 -0
- package/src/components/forms/index.ts +7 -0
- package/src/components/index.ts +37 -0
- package/src/components/input/ChoiceInputField.tsx +188 -0
- package/src/components/input/HtmlInputField.tsx +326 -0
- package/src/components/input/SelectInputField.tsx +197 -0
- package/src/components/input/TextField.tsx +47 -0
- package/src/components/input/TextInputField.tsx +144 -0
- package/src/components/input/index.ts +17 -0
- package/src/components/layout/GridCell.tsx +46 -0
- package/src/components/layout/GridCellWrapper.tsx +87 -0
- package/src/components/layout/GridLayout.tsx +169 -0
- package/src/components/layout/index.ts +13 -0
- package/src/components/menu/Menu.tsx +0 -0
- package/src/components/menu/MenuItem.tsx +32 -0
- package/src/components/menu/index.ts +6 -0
- package/src/components/pages/FormPage.tsx +108 -0
- package/src/components/pages/Page.css +460 -0
- package/src/components/pages/Page.tsx +345 -0
- package/src/components/pages/index.ts +11 -0
- package/src/contexts/DataContext.tsx +355 -0
- package/src/contexts/DimensionsContext.tsx +154 -0
- package/src/contexts/PaletteContext.tsx +217 -0
- package/src/contexts/QwickAppContext.tsx +95 -0
- package/src/contexts/ThemeContext.tsx +376 -0
- package/src/contexts/index.ts +9 -0
- package/src/hooks/__tests__/useDataBinding.test.tsx.disabled +229 -0
- package/src/hooks/index.ts +11 -0
- package/src/hooks/useBaseProps.ts +267 -0
- package/src/hooks/useDataBinding.ts +77 -0
- package/src/index.ts +23 -0
- package/src/palettes/PaletteAutumn.css +172 -0
- package/src/palettes/PaletteAutumn.ts +16 -0
- package/src/palettes/PaletteCosmic.css +172 -0
- package/src/palettes/PaletteCosmic.ts +16 -0
- package/src/palettes/PaletteDefault.css +178 -0
- package/src/palettes/PaletteDefault.ts +17 -0
- package/src/palettes/PaletteOcean.css +172 -0
- package/src/palettes/PaletteOcean.ts +16 -0
- package/src/palettes/PaletteSpring.css +160 -0
- package/src/palettes/PaletteSpring.ts +16 -0
- package/src/palettes/PaletteWinter.css +172 -0
- package/src/palettes/PaletteWinter.ts +16 -0
- package/src/palettes/index.css +12 -0
- package/src/palettes/index.ts +29 -0
- package/src/schemas/ActionSchema.ts +140 -0
- package/src/schemas/ArticleSchema.ts +35 -0
- package/src/schemas/ButtonSchema.ts +99 -0
- package/src/schemas/CardListGridSchema.ts +102 -0
- package/src/schemas/ChoiceInputFieldSchema.ts +89 -0
- package/src/schemas/CodeSchema.ts +88 -0
- package/src/schemas/ContentSchema.ts +128 -0
- package/src/schemas/CoverImageHeaderSchema.ts +208 -0
- package/src/schemas/FeatureCardSchema.ts +161 -0
- package/src/schemas/FeatureGridSchema.ts +87 -0
- package/src/schemas/FeatureItemSchema.ts +68 -0
- package/src/schemas/FooterItemSchema.ts +57 -0
- package/src/schemas/FooterSchema.ts +116 -0
- package/src/schemas/FooterSectionSchema.ts +50 -0
- package/src/schemas/FormBlockSchema.ts +102 -0
- package/src/schemas/HeaderActionSchema.ts +83 -0
- package/src/schemas/HeroBlockSchema.ts +149 -0
- package/src/schemas/HtmlInputFieldSchema.ts +88 -0
- package/src/schemas/MetadataItemSchema.ts +35 -0
- package/src/schemas/PageBannerHeaderSchema.ts +206 -0
- package/src/schemas/PaletteSwitcherSchema.ts +66 -0
- package/src/schemas/ProductCardSchema.ts +264 -0
- package/src/schemas/SafeSpanSchema.ts +36 -0
- package/src/schemas/SectionSchema.ts +106 -0
- package/src/schemas/SelectInputFieldSchema.ts +137 -0
- package/src/schemas/TextInputFieldSchema.ts +129 -0
- package/src/schemas/ThemeSwitcherSchema.ts +97 -0
- package/src/schemas/__tests__/builders.test.ts +313 -0
- package/src/schemas/index.ts +34 -0
- package/src/setupTests.js +60 -0
- package/src/stories/Article.stories.tsx +549 -0
- package/src/stories/Button.stories.tsx +498 -0
- package/src/stories/CardListGrid.stories.tsx +539 -0
- package/src/stories/ChoiceInputField.stories.tsx +591 -0
- package/src/stories/Code.stories.tsx +711 -0
- package/src/stories/Content.stories.tsx +463 -0
- package/src/stories/CoverImageHeader.stories.tsx +794 -0
- package/src/stories/DataBinding.advanced.stories.tsx +548 -0
- package/src/stories/DataBinding.stories.tsx +452 -0
- package/src/stories/DataProvider.stories.tsx +1361 -0
- package/src/stories/FeatureCard.stories.tsx +642 -0
- package/src/stories/FeatureGrid.stories.tsx +669 -0
- package/src/stories/Footer.stories.tsx +724 -0
- package/src/stories/FormBlock.stories.tsx +834 -0
- package/src/stories/HeroBlock.stories.tsx +442 -0
- package/src/stories/Html.stories.tsx +264 -0
- package/src/stories/HtmlInputField.stories.tsx +558 -0
- package/src/stories/Introduction.stories.tsx +721 -0
- package/src/stories/LayoutBlocks.stories.tsx +382 -0
- package/src/stories/LayoutSystem.stories.tsx +253 -0
- package/src/stories/Logo.stories.tsx +400 -0
- package/src/stories/Markdown.stories.tsx +349 -0
- package/src/stories/Page.stories.tsx +762 -0
- package/src/stories/PageBannerHeader.stories.tsx +949 -0
- package/src/stories/PaletteSwitcher.stories.tsx +156 -0
- package/src/stories/ProductCard.stories.tsx +504 -0
- package/src/stories/QwickApp.stories.tsx +461 -0
- package/src/stories/ResponsiveMenu.stories.tsx +299 -0
- package/src/stories/SafeSpan.stories.tsx +612 -0
- package/src/stories/Section.stories.tsx +613 -0
- package/src/stories/SelectInputField.stories.tsx +605 -0
- package/src/stories/TextInputField.stories.tsx +526 -0
- package/src/stories/ThemeSwitcher.stories.tsx +170 -0
- package/src/stories/form/FormComponents.stories.tsx +588 -0
- package/src/templates/TemplateResolver.ts +156 -0
- package/src/templates/index.ts +6 -0
- package/src/tests/ConsoleWarningTest.tsx +30 -0
- package/src/tests/StorageKeyTest.tsx +110 -0
- package/src/tests/ThemeStorageKeyTest.tsx +114 -0
- package/src/types/CacheProvider.ts +14 -0
- package/src/types/ContentProxy.ts +99 -0
- package/src/types/DataTypes.ts +196 -0
- package/src/types/TemplateProvider.ts +9 -0
- package/src/types/TemplateResolver.ts +26 -0
- package/src/types/index.ts +99 -0
- package/src/utils/__tests__/createDataDrivenComponent.test.tsx.disabled +193 -0
- package/src/utils/__tests__/htmlTransform.test.tsx +255 -0
- package/src/utils/breakpoints.ts +87 -0
- package/src/utils/customPaletteManager.js +214 -0
- package/src/utils/dimensions.ts +147 -0
- package/src/utils/htmlTransform.tsx +323 -0
- package/src/utils/index.ts +16 -0
- package/src/utils/logger.ts +28 -0
- package/src/utils/paletteUtils.ts +78 -0
- package/src/utils/persistenceUtils.ts +107 -0
- package/src/utils/reactUtils.tsx +37 -0
- package/src/utils/spacing.ts +155 -0
- package/src/utils/themePerformanceMonitor.js +113 -0
- package/src/utils/themeUtils.ts +67 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Binding System - Storybook Stories
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the AI-driven data-binding component system that enables
|
|
5
|
+
* components to be configured through CMS data rather than hardcoded props.
|
|
6
|
+
*
|
|
7
|
+
* This is the foundation for AI agents to automatically generate both
|
|
8
|
+
* content and presentation for web applications.
|
|
9
|
+
*
|
|
10
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Card, Typography } from '@mui/material';
|
|
14
|
+
import { JsonDataProvider } from '@qwickapps/schema';
|
|
15
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
16
|
+
import { Code, GridLayout, SafeSpan, Section } from '../components';
|
|
17
|
+
import { DataProvider } from '../contexts';
|
|
18
|
+
|
|
19
|
+
// Sample CMS data for demonstrations - using dotted notation for testing JsonDataProvider conversion
|
|
20
|
+
const sampleCmsData = {
|
|
21
|
+
// Company information
|
|
22
|
+
'company.tagline': {
|
|
23
|
+
html: '<h1>Build Apps <em>Faster</em> with <strong>QwickApps</strong></h1>',
|
|
24
|
+
placeholder: 'Loading company tagline...'
|
|
25
|
+
},
|
|
26
|
+
'company.description': {
|
|
27
|
+
html: '<p>QwickApps React Framework provides a comprehensive set of tools and components to help developers create high-quality applications with <strong>minimal effort</strong> and <em>maximum efficiency</em>.</p>',
|
|
28
|
+
placeholder: 'Loading company description...'
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
// Page content
|
|
32
|
+
'pages.home.hero-subtitle': {
|
|
33
|
+
html: '<p class="subtitle">The complete solution for modern web development</p>',
|
|
34
|
+
placeholder: 'Loading hero subtitle...'
|
|
35
|
+
},
|
|
36
|
+
'pages.about.mission': {
|
|
37
|
+
html: '<p>Our mission is to <strong>empower developers</strong> with tools that make app development accessible, efficient, and enjoyable.</p>',
|
|
38
|
+
placeholder: 'Loading mission statement...'
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
// Feature descriptions
|
|
42
|
+
'features.responsive-design': {
|
|
43
|
+
html: '<p>Built-in responsive design patterns that work seamlessly across all devices and screen sizes.</p>',
|
|
44
|
+
placeholder: 'Loading responsive features...'
|
|
45
|
+
},
|
|
46
|
+
'features.performance': {
|
|
47
|
+
html: '<p>Optimized rendering and caching strategies ensure your applications run fast and efficiently at scale.</p>',
|
|
48
|
+
placeholder: 'Loading performance features...'
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
// Marketing content
|
|
52
|
+
'marketing.cta': {
|
|
53
|
+
html: '<p><strong>Get started today</strong> and experience the future of app development!</p>',
|
|
54
|
+
placeholder: 'Loading call-to-action...'
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// User testimonials
|
|
58
|
+
'testimonials.developer': {
|
|
59
|
+
html: '<blockquote><p>"QwickApps has <em>revolutionized</em> our development workflow. We ship features <strong>3x faster</strong> now."</p><cite>- Sarah Chen, Senior Developer</cite></blockquote>',
|
|
60
|
+
placeholder: 'Loading testimonial...'
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Empty content for fallback testing
|
|
64
|
+
'empty.content': {},
|
|
65
|
+
|
|
66
|
+
// Content with only placeholder
|
|
67
|
+
'placeholder.only': {
|
|
68
|
+
placeholder: 'This content is coming soon...'
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Create data provider
|
|
73
|
+
const dataProvider = new JsonDataProvider({ data: sampleCmsData });
|
|
74
|
+
|
|
75
|
+
const meta: Meta<typeof SafeSpan> = {
|
|
76
|
+
title: 'Framework/Data Binding',
|
|
77
|
+
component: SafeSpan,
|
|
78
|
+
parameters: {
|
|
79
|
+
layout: 'padded',
|
|
80
|
+
docs: {
|
|
81
|
+
description: {
|
|
82
|
+
component: `
|
|
83
|
+
# Data Binding System
|
|
84
|
+
|
|
85
|
+
The QwickApps Data Binding System enables dynamic component configuration through CMS data.
|
|
86
|
+
Instead of hardcoding props, components can resolve their content from data sources with
|
|
87
|
+
automatic validation and type safety.
|
|
88
|
+
|
|
89
|
+
## Key Concepts
|
|
90
|
+
|
|
91
|
+
**Traditional Approach:**
|
|
92
|
+
\`\`\`jsx
|
|
93
|
+
<SafeSpan html="<p>Hardcoded content</p>" placeholder="Hardcoded placeholder" />
|
|
94
|
+
\`\`\`
|
|
95
|
+
|
|
96
|
+
**Data-Driven Approach:**
|
|
97
|
+
\`\`\`jsx
|
|
98
|
+
<SafeSpan dataSource="company.description" />
|
|
99
|
+
\`\`\`
|
|
100
|
+
|
|
101
|
+
## Component Schema
|
|
102
|
+
|
|
103
|
+
Each data-driven component has a schema that defines:
|
|
104
|
+
- Field types (using ContentTypes.FieldType enum)
|
|
105
|
+
- Validation rules
|
|
106
|
+
- Content editor instructions
|
|
107
|
+
- Usage examples
|
|
108
|
+
|
|
109
|
+
## Data Source Syntax
|
|
110
|
+
|
|
111
|
+
Data sources use dot notation to reference nested data:
|
|
112
|
+
- \`company.tagline\` - Company tagline content
|
|
113
|
+
- \`pages.home.hero-block\` - Home page hero block
|
|
114
|
+
- \`features.responsive-design\` - Feature descriptions
|
|
115
|
+
|
|
116
|
+
## Benefits
|
|
117
|
+
|
|
118
|
+
The data binding system provides:
|
|
119
|
+
1. Clear separation between content and presentation
|
|
120
|
+
2. Runtime validation of content data
|
|
121
|
+
3. Flexible fallback mechanisms
|
|
122
|
+
4. Type-safe component configuration
|
|
123
|
+
5. Consistent CMS integration patterns
|
|
124
|
+
`
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
decorators: [
|
|
129
|
+
(Story) => (
|
|
130
|
+
<DataProvider dataSource={{ dataProvider }}>
|
|
131
|
+
<Story />
|
|
132
|
+
</DataProvider>
|
|
133
|
+
)
|
|
134
|
+
]
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export default meta;
|
|
138
|
+
type Story = StoryObj<typeof meta>;
|
|
139
|
+
|
|
140
|
+
// Basic Examples
|
|
141
|
+
export const CompanyTagline: Story = {
|
|
142
|
+
render: () => (
|
|
143
|
+
<Section>
|
|
144
|
+
<Typography variant="h4">Company Tagline</Typography>
|
|
145
|
+
<Typography variant="body1" gutterBottom>
|
|
146
|
+
Company tagline loaded from CMS data with rich HTML formatting.
|
|
147
|
+
</Typography>
|
|
148
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
149
|
+
<SafeSpan dataSource="company.tagline" />
|
|
150
|
+
</Card>
|
|
151
|
+
<Code title="Usage">{`<SafeSpan dataSource="company.tagline" />`}</Code>
|
|
152
|
+
<Code title="CMS Data">{`'company.tagline': [
|
|
153
|
+
{
|
|
154
|
+
html: '<h1>Build Apps <em>Faster</em> with <strong>QwickApps</strong></h1>',
|
|
155
|
+
placeholder: 'Loading company tagline...'
|
|
156
|
+
}
|
|
157
|
+
]`}</Code>
|
|
158
|
+
</Section>
|
|
159
|
+
),
|
|
160
|
+
parameters: {
|
|
161
|
+
docs: {
|
|
162
|
+
description: {
|
|
163
|
+
story: 'Company tagline loaded from CMS data with rich HTML formatting.'
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
export const CompanyDescription: Story = {
|
|
170
|
+
render: () => (
|
|
171
|
+
<Section>
|
|
172
|
+
<Typography variant="h4">Company Description</Typography>
|
|
173
|
+
<Typography variant="body1" gutterBottom>
|
|
174
|
+
Detailed company description with emphasis and strong text formatting.
|
|
175
|
+
</Typography>
|
|
176
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
177
|
+
<SafeSpan dataSource="company.description" />
|
|
178
|
+
</Card>
|
|
179
|
+
<Code title="Usage">{`<SafeSpan dataSource="company.description" />`}</Code>
|
|
180
|
+
<Code title="CMS Data">{`'company.description': [
|
|
181
|
+
{
|
|
182
|
+
html: '<p>QwickApps React Framework provides comprehensive tools with <strong>minimal effort</strong> and <em>maximum efficiency</em>.</p>',
|
|
183
|
+
placeholder: 'Loading company description...'
|
|
184
|
+
}
|
|
185
|
+
]`}</Code>
|
|
186
|
+
</Section>
|
|
187
|
+
),
|
|
188
|
+
parameters: {
|
|
189
|
+
docs: {
|
|
190
|
+
description: {
|
|
191
|
+
story: 'Detailed company description with emphasis and strong text formatting.'
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
export const HeroSubtitle: Story = {
|
|
198
|
+
render: () => (
|
|
199
|
+
<Section>
|
|
200
|
+
<Typography variant="h4">Hero Subtitle</Typography>
|
|
201
|
+
<Typography variant="body1" gutterBottom>
|
|
202
|
+
Page-specific content with custom CSS classes from CMS.
|
|
203
|
+
</Typography>
|
|
204
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
205
|
+
<SafeSpan dataSource="pages.home.hero-subtitle" />
|
|
206
|
+
</Card>
|
|
207
|
+
<Code title="Usage">{`<SafeSpan dataSource="pages.home.hero-subtitle" />`}</Code>
|
|
208
|
+
<Code title="CMS Data">{`'pages.home.hero-subtitle': [
|
|
209
|
+
{
|
|
210
|
+
html: '<p class="subtitle">The complete solution for modern web development</p>',
|
|
211
|
+
placeholder: 'Loading hero subtitle...'
|
|
212
|
+
}
|
|
213
|
+
]`}</Code>
|
|
214
|
+
</Section>
|
|
215
|
+
),
|
|
216
|
+
parameters: {
|
|
217
|
+
docs: {
|
|
218
|
+
description: {
|
|
219
|
+
story: 'Page-specific content with custom CSS classes from CMS.'
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// Comparison Stories
|
|
226
|
+
export const TraditionalVsDataDriven: Story = {
|
|
227
|
+
render: () => (
|
|
228
|
+
<Section>
|
|
229
|
+
<Typography variant="h4">Traditional vs Data-Driven Approach</Typography>
|
|
230
|
+
<Typography variant="body1" gutterBottom>
|
|
231
|
+
Side-by-side comparison showing traditional hardcoded props vs data-driven approach.
|
|
232
|
+
</Typography>
|
|
233
|
+
|
|
234
|
+
<GridLayout columns={2} spacing="large">
|
|
235
|
+
<div>
|
|
236
|
+
<Typography variant="h6">Traditional Approach (Hardcoded Props)</Typography>
|
|
237
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#fff3cd' }}>
|
|
238
|
+
<SafeSpan
|
|
239
|
+
html="<p>This content is <strong>hardcoded</strong> in the component props.</p>"
|
|
240
|
+
placeholder="Hardcoded placeholder"
|
|
241
|
+
/>
|
|
242
|
+
</Card>
|
|
243
|
+
</div>
|
|
244
|
+
|
|
245
|
+
<div>
|
|
246
|
+
<Typography variant="h6">Data-Driven Approach (CMS Data)</Typography>
|
|
247
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#d4edda' }}>
|
|
248
|
+
<SafeSpan dataSource="features.responsive-design" />
|
|
249
|
+
</Card>
|
|
250
|
+
</div>
|
|
251
|
+
</GridLayout>
|
|
252
|
+
|
|
253
|
+
<Code title="Traditional Approach">{`<SafeSpan
|
|
254
|
+
html="<p>This content is <strong>hardcoded</strong>...</p>"
|
|
255
|
+
placeholder="Hardcoded placeholder"
|
|
256
|
+
/>`}</Code>
|
|
257
|
+
|
|
258
|
+
<Code title="Data-Driven Approach">{`<SafeSpan dataSource="features.responsive-design" />`}</Code>
|
|
259
|
+
</Section>
|
|
260
|
+
),
|
|
261
|
+
parameters: {
|
|
262
|
+
docs: {
|
|
263
|
+
description: {
|
|
264
|
+
story: 'Side-by-side comparison showing traditional hardcoded props vs data-driven approach.'
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// Fallback and Error Handling
|
|
271
|
+
export const FallbackBehavior: Story = {
|
|
272
|
+
render: () => (
|
|
273
|
+
<Section>
|
|
274
|
+
<Typography variant="h4">Fallback and Error Handling</Typography>
|
|
275
|
+
<Typography variant="body1" gutterBottom>
|
|
276
|
+
Demonstrates how the system handles missing, empty, or invalid data sources.
|
|
277
|
+
</Typography>
|
|
278
|
+
|
|
279
|
+
<GridLayout spacing="large">
|
|
280
|
+
<div>
|
|
281
|
+
<Typography variant="h6">Empty Content (Uses Fallback Props)</Typography>
|
|
282
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
283
|
+
<SafeSpan
|
|
284
|
+
dataSource="empty.content"
|
|
285
|
+
html="<p>This is <strong>fallback content</strong> when CMS data is empty.</p>"
|
|
286
|
+
placeholder="Fallback placeholder"
|
|
287
|
+
/>
|
|
288
|
+
</Card>
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
<div>
|
|
292
|
+
<Typography variant="h6">Placeholder Only Content</Typography>
|
|
293
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
294
|
+
<SafeSpan dataSource="placeholder.only" />
|
|
295
|
+
</Card>
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
<div>
|
|
299
|
+
<Typography variant="h6">Non-existent Data Source</Typography>
|
|
300
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
301
|
+
<SafeSpan
|
|
302
|
+
dataSource="nonexistent.data"
|
|
303
|
+
placeholder="This placeholder shows when data source doesn't exist"
|
|
304
|
+
/>
|
|
305
|
+
</Card>
|
|
306
|
+
</div>
|
|
307
|
+
</GridLayout>
|
|
308
|
+
|
|
309
|
+
<Code title="Fallback with Props">{`<SafeSpan
|
|
310
|
+
dataSource="empty.content"
|
|
311
|
+
html="<p>This is <strong>fallback content</strong> when CMS data is empty.</p>"
|
|
312
|
+
placeholder="Fallback placeholder"
|
|
313
|
+
/>`}</Code>
|
|
314
|
+
|
|
315
|
+
<Code title="Placeholder Only">{`<SafeSpan dataSource="placeholder.only" />`}</Code>
|
|
316
|
+
|
|
317
|
+
<Code title="Non-existent Data Source">{`<SafeSpan
|
|
318
|
+
dataSource="nonexistent.data"
|
|
319
|
+
placeholder="This placeholder shows when data source doesn't exist"
|
|
320
|
+
/>`}</Code>
|
|
321
|
+
</Section>
|
|
322
|
+
),
|
|
323
|
+
parameters: {
|
|
324
|
+
docs: {
|
|
325
|
+
description: {
|
|
326
|
+
story: 'Demonstrates how the system handles missing, empty, or invalid data sources.'
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// Real-world Use Cases
|
|
333
|
+
export const MarketingContent: Story = {
|
|
334
|
+
render: () => (
|
|
335
|
+
<Section>
|
|
336
|
+
<Typography variant="h4">Marketing Content</Typography>
|
|
337
|
+
<Typography variant="body1" gutterBottom>
|
|
338
|
+
Marketing content including call-to-action and user testimonials.
|
|
339
|
+
</Typography>
|
|
340
|
+
|
|
341
|
+
<GridLayout spacing="large">
|
|
342
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
343
|
+
<SafeSpan dataSource="marketing.cta" />
|
|
344
|
+
</Card>
|
|
345
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
346
|
+
<SafeSpan dataSource="testimonials.developer" />
|
|
347
|
+
</Card>
|
|
348
|
+
</GridLayout>
|
|
349
|
+
|
|
350
|
+
<Code title="Call to Action">{`<SafeSpan dataSource="marketing.cta" />`}</Code>
|
|
351
|
+
<Code title="User Testimonial">{`<SafeSpan dataSource="testimonials.developer" />`}</Code>
|
|
352
|
+
</Section>
|
|
353
|
+
),
|
|
354
|
+
parameters: {
|
|
355
|
+
docs: {
|
|
356
|
+
description: {
|
|
357
|
+
story: 'Marketing content including call-to-action and user testimonials.'
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
export const FeatureDescriptions: Story = {
|
|
364
|
+
render: () => (
|
|
365
|
+
<Section>
|
|
366
|
+
<Typography variant="h4">Feature Descriptions</Typography>
|
|
367
|
+
<Typography variant="body1" gutterBottom>
|
|
368
|
+
Feature descriptions loaded from CMS, perfect for product pages.
|
|
369
|
+
</Typography>
|
|
370
|
+
|
|
371
|
+
<GridLayout spacing="large">
|
|
372
|
+
<div>
|
|
373
|
+
<Typography variant="h6">Responsive Design</Typography>
|
|
374
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
375
|
+
<SafeSpan dataSource="features.responsive-design" />
|
|
376
|
+
</Card>
|
|
377
|
+
</div>
|
|
378
|
+
|
|
379
|
+
<div>
|
|
380
|
+
<Typography variant="h6">Performance Optimization</Typography>
|
|
381
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
382
|
+
<SafeSpan dataSource="features.performance" />
|
|
383
|
+
</Card>
|
|
384
|
+
</div>
|
|
385
|
+
</GridLayout>
|
|
386
|
+
|
|
387
|
+
<Code title="Responsive Design Features">{`<SafeSpan dataSource="features.responsive-design" />`}</Code>
|
|
388
|
+
<Code title="Performance Features">{`<SafeSpan dataSource="features.performance" />`}</Code>
|
|
389
|
+
</Section>
|
|
390
|
+
),
|
|
391
|
+
parameters: {
|
|
392
|
+
docs: {
|
|
393
|
+
description: {
|
|
394
|
+
story: 'Feature descriptions loaded from CMS, perfect for product pages.'
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
// Schema Information
|
|
401
|
+
export const ComponentSchemaInfo: Story = {
|
|
402
|
+
render: () => (
|
|
403
|
+
<Section>
|
|
404
|
+
<Typography variant="h4">Component Schema System</Typography>
|
|
405
|
+
<Typography variant="body1" gutterBottom>
|
|
406
|
+
Component schemas define data structure requirements for data-driven components with validation and type safety.
|
|
407
|
+
</Typography>
|
|
408
|
+
|
|
409
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
410
|
+
<Typography variant="h6" gutterBottom>Schema Benefits:</Typography>
|
|
411
|
+
<ul>
|
|
412
|
+
<li><strong>Field Types:</strong> Defines whether content should be text, textarea, etc.</li>
|
|
413
|
+
<li><strong>Validation:</strong> Ensures content meets component requirements</li>
|
|
414
|
+
<li><strong>Editor Instructions:</strong> Guides content editors with context</li>
|
|
415
|
+
<li><strong>Usage Examples:</strong> Shows proper dataSource syntax</li>
|
|
416
|
+
<li><strong>Type Safety:</strong> Runtime validation of CMS data</li>
|
|
417
|
+
</ul>
|
|
418
|
+
</Card>
|
|
419
|
+
|
|
420
|
+
<Code title="SafeSpan Component Schema" language="json">
|
|
421
|
+
{JSON.stringify(undefined, null, 2)}
|
|
422
|
+
</Code>
|
|
423
|
+
|
|
424
|
+
<Code title="Schema Usage in Component">{`import { toDataSchema, createFieldMapping } from '../utils/toDataSchema';
|
|
425
|
+
|
|
426
|
+
const schema = toDataSchema<SafeSpanProps>({
|
|
427
|
+
componentName: 'SafeSpan',
|
|
428
|
+
description: 'Safely renders HTML content with automatic sanitization',
|
|
429
|
+
usageExamples: [
|
|
430
|
+
'<SafeSpan dataSource="company.description" />',
|
|
431
|
+
'<SafeSpan dataSource="pages.home.tagline" />'
|
|
432
|
+
]
|
|
433
|
+
}, {
|
|
434
|
+
html: createFieldMapping.richText({
|
|
435
|
+
required: false,
|
|
436
|
+
instructions: 'HTML content to display safely'
|
|
437
|
+
}),
|
|
438
|
+
placeholder: createFieldMapping.text({
|
|
439
|
+
required: false,
|
|
440
|
+
instructions: 'Text to show when no content is available'
|
|
441
|
+
})
|
|
442
|
+
});`}</Code>
|
|
443
|
+
</Section>
|
|
444
|
+
),
|
|
445
|
+
parameters: {
|
|
446
|
+
docs: {
|
|
447
|
+
description: {
|
|
448
|
+
story: 'Component schema system that enables type-safe data binding with runtime validation and CMS integration.'
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
};
|