@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,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Data Binding Examples - Storybook Stories
|
|
3
|
+
*
|
|
4
|
+
* Advanced examples showing complex data binding scenarios,
|
|
5
|
+
* error handling, performance optimization, and AI integration patterns.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Card, Typography } from '@mui/material';
|
|
11
|
+
import { CachedDataProvider, JsonDataProvider } from '@qwickapps/schema';
|
|
12
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
13
|
+
import React, { useState } from 'react';
|
|
14
|
+
import { Button, Code, GridLayout, SafeSpan, Section } from '../components';
|
|
15
|
+
import { DataProvider } from '../contexts';
|
|
16
|
+
import { useDataBinding } from '../hooks';
|
|
17
|
+
import ThemeSwitcher from '../components/buttons/ThemeSwitcher';
|
|
18
|
+
import PaletteSwitcher from '../components/buttons/PaletteSwitcher';
|
|
19
|
+
|
|
20
|
+
// Advanced CMS data with complex scenarios - using dotted notation for testing JsonDataProvider conversion
|
|
21
|
+
const advancedCmsData = {
|
|
22
|
+
// Multi-language content
|
|
23
|
+
'content.en.welcome': {
|
|
24
|
+
html: '<h2>Welcome to QwickApps</h2><p>The future of app development is here.</p>',
|
|
25
|
+
placeholder: 'Loading welcome message...'
|
|
26
|
+
},
|
|
27
|
+
'content.es.welcome': {
|
|
28
|
+
html: '<h2>Bienvenidos a QwickApps</h2><p>El futuro del desarrollo de aplicaciones está aquí.</p>',
|
|
29
|
+
placeholder: 'Cargando mensaje de bienvenida...'
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
// Dynamic content with variables
|
|
33
|
+
'user.greeting': {
|
|
34
|
+
html: '<p>Hello <strong>{{userName}}</strong>, welcome back!</p>',
|
|
35
|
+
placeholder: 'Loading personalized greeting...'
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
// Time-sensitive content
|
|
39
|
+
'announcements.current': {
|
|
40
|
+
html: '<div class="announcement"><p><strong>🎉 New Feature Alert:</strong> Dynamic data binding with schema validation is now available!</p></div>',
|
|
41
|
+
placeholder: 'Loading current announcements...'
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
// A/B testing variants
|
|
45
|
+
'cta.variant-a': {
|
|
46
|
+
html: '<p class="cta-primary"><strong>Start Building Today!</strong> - Try our free plan.</p>',
|
|
47
|
+
placeholder: 'Loading call-to-action...'
|
|
48
|
+
},
|
|
49
|
+
'cta.variant-b': {
|
|
50
|
+
html: '<p class="cta-secondary"><strong>Join 10,000+ Developers</strong> - Get started now.</p>',
|
|
51
|
+
placeholder: 'Loading call-to-action...'
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// Rich media content
|
|
55
|
+
'blog.featured-post': {
|
|
56
|
+
html: `
|
|
57
|
+
<article>
|
|
58
|
+
<h3>Building Scalable Apps with QwickApps React Framework</h3>
|
|
59
|
+
<p class="meta">Published on January 15, 2025 • 8 min read</p>
|
|
60
|
+
<p>Learn how our <strong>data-binding system</strong> enables dynamic, scalable applications with type-safe CMS integration and validation...</p>
|
|
61
|
+
<a href="/blog/scalable-apps" class="read-more">Continue reading →</a>
|
|
62
|
+
</article>
|
|
63
|
+
`,
|
|
64
|
+
placeholder: 'Loading featured blog post...'
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
// Malicious content for sanitization testing
|
|
68
|
+
'security.malicious': {
|
|
69
|
+
html: '<script>alert("XSS attempt")</script><p>This content includes <strong>malicious scripts</strong> that should be automatically sanitized.</p><img src="x" onerror="alert(\'XSS\')" />',
|
|
70
|
+
placeholder: 'Loading content...'
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
// Performance testing - Large content
|
|
74
|
+
'performance.large-content': {
|
|
75
|
+
html: '<div>' + 'Very long content paragraph. '.repeat(100) + '</div>',
|
|
76
|
+
placeholder: 'Loading large content...'
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// Create cached data provider for performance
|
|
81
|
+
const jsonProvider = new JsonDataProvider({ data: advancedCmsData });
|
|
82
|
+
const cachedDataProvider = new CachedDataProvider(jsonProvider, { maxSize: 100, defaultTTL: 60000 });
|
|
83
|
+
|
|
84
|
+
const meta: Meta<typeof SafeSpan> = {
|
|
85
|
+
title: 'Framework/Advanced Data Binding',
|
|
86
|
+
component: SafeSpan,
|
|
87
|
+
parameters: {
|
|
88
|
+
layout: 'padded',
|
|
89
|
+
docs: {
|
|
90
|
+
description: {
|
|
91
|
+
component: `
|
|
92
|
+
# Advanced Data Binding Examples
|
|
93
|
+
|
|
94
|
+
This section demonstrates advanced use cases for the data binding system including:
|
|
95
|
+
|
|
96
|
+
- Multi-language content management
|
|
97
|
+
- Dynamic content with template variables
|
|
98
|
+
- A/B testing support
|
|
99
|
+
- Security and sanitization
|
|
100
|
+
- Performance optimization with caching
|
|
101
|
+
- Error handling and fallbacks
|
|
102
|
+
- Custom validation and schema enforcement
|
|
103
|
+
|
|
104
|
+
## Performance Features
|
|
105
|
+
|
|
106
|
+
The system includes built-in caching to minimize CMS API calls:
|
|
107
|
+
- Memory cache with configurable TTL
|
|
108
|
+
- Cache hit ratio monitoring
|
|
109
|
+
- Automatic cache invalidation
|
|
110
|
+
- Fallback support when cache fails
|
|
111
|
+
|
|
112
|
+
## Security Features
|
|
113
|
+
|
|
114
|
+
All HTML content is automatically sanitized:
|
|
115
|
+
- Script tags are removed
|
|
116
|
+
- Dangerous attributes are filtered
|
|
117
|
+
- Only safe HTML elements are allowed
|
|
118
|
+
- XSS protection is built-in
|
|
119
|
+
`
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
decorators: [
|
|
124
|
+
(Story) => (
|
|
125
|
+
<DataProvider dataSource={{ dataProvider: cachedDataProvider }}>
|
|
126
|
+
<Story />
|
|
127
|
+
</DataProvider>
|
|
128
|
+
)
|
|
129
|
+
]
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export default meta;
|
|
133
|
+
type Story = StoryObj<typeof meta>;
|
|
134
|
+
|
|
135
|
+
// Multi-language Support
|
|
136
|
+
export const MultiLanguageContent: Story = {
|
|
137
|
+
render: () => {
|
|
138
|
+
const [language, setLanguage] = useState<'en' | 'es'>('en');
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<Section>
|
|
142
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1rem' }}>
|
|
143
|
+
<Typography variant='h4'>Multilanguage Support</Typography>
|
|
144
|
+
<div style={{ display: 'flex', gap: '8px' }}>
|
|
145
|
+
<ThemeSwitcher />
|
|
146
|
+
<PaletteSwitcher />
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
<Typography variant='body1' gutterBottom>
|
|
150
|
+
Switch between English and Spanish content dynamically using the data binding system.
|
|
151
|
+
</Typography>
|
|
152
|
+
<br/>
|
|
153
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem' }}>
|
|
154
|
+
<GridLayout>
|
|
155
|
+
<Button variant={language === 'en' ? 'contained' : 'outlined'} onClick={() => setLanguage('en')}>English</Button>
|
|
156
|
+
<Button variant={language === 'es' ? 'contained' : 'outlined'} onClick={() => setLanguage('es')}>Español</Button>
|
|
157
|
+
<SafeSpan span={12} dataSource={`content.${language}.welcome`} />
|
|
158
|
+
</GridLayout>
|
|
159
|
+
</Card>
|
|
160
|
+
<Code title='Source Code'>{`<GridLayout>
|
|
161
|
+
<Button variant={language === 'en' ? 'contained' : 'outlined'} onClick={() => setLanguage('en')}>English</Button>
|
|
162
|
+
<Button variant={language === 'es' ? 'contained' : 'outlined'} onClick={() => setLanguage('es')}>Español</Button>
|
|
163
|
+
<SafeSpan span={12} dataSource={\`content.\${language}.welcome\`} />
|
|
164
|
+
</GridLayout>`}
|
|
165
|
+
</Code>
|
|
166
|
+
<Code title='Multi-language Content'>{`'content.en.welcome': [
|
|
167
|
+
{
|
|
168
|
+
html: '<h2>Welcome to QwickApps</h2><p>The future of app development is here.</p>'
|
|
169
|
+
}
|
|
170
|
+
],
|
|
171
|
+
'content.es.welcome': [
|
|
172
|
+
{
|
|
173
|
+
html: '<h2>Bienvenidos a QwickApps</h2><p>El futuro del desarrollo de aplicaciones está aquí.</p>'
|
|
174
|
+
}
|
|
175
|
+
]`}</Code>
|
|
176
|
+
</Section>
|
|
177
|
+
);
|
|
178
|
+
},
|
|
179
|
+
parameters: {
|
|
180
|
+
docs: {
|
|
181
|
+
description: {
|
|
182
|
+
story: 'Demonstrates multi-language content switching using dynamic dataSource paths.'
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// A/B Testing
|
|
189
|
+
export const ABTestingVariants: Story = {
|
|
190
|
+
render: () => {
|
|
191
|
+
const [variant, setVariant] = useState<'a' | 'b'>('a');
|
|
192
|
+
|
|
193
|
+
return (
|
|
194
|
+
<Section>
|
|
195
|
+
<Typography variant="h4">A/B Testing Variants</Typography>
|
|
196
|
+
<Typography variant="body1" gutterBottom>
|
|
197
|
+
A/B testing implementation using dynamic dataSource selection for conversion optimization.
|
|
198
|
+
</Typography>
|
|
199
|
+
|
|
200
|
+
<GridLayout>
|
|
201
|
+
<Typography variant="h6">Select A/B Test Variant:</Typography>
|
|
202
|
+
<GridLayout columns={2} spacing="medium">
|
|
203
|
+
<Button variant={variant === 'a' ? 'contained' : 'outlined'} onClick={() => setVariant('a')}>
|
|
204
|
+
Variant A (Start Building)
|
|
205
|
+
</Button>
|
|
206
|
+
<Button variant={variant === 'b' ? 'contained' : 'outlined'} onClick={() => setVariant('b')}>
|
|
207
|
+
Variant B (Join Community)
|
|
208
|
+
</Button>
|
|
209
|
+
</GridLayout>
|
|
210
|
+
|
|
211
|
+
<Card variant="outlined" style={{ padding: '1.5rem', backgroundColor: '#e3f2fd' }}>
|
|
212
|
+
<SafeSpan dataSource={`cta.variant-${variant}`} />
|
|
213
|
+
</Card>
|
|
214
|
+
</GridLayout>
|
|
215
|
+
|
|
216
|
+
<Code title="A/B Testing Implementation">{`const [variant, setVariant] = useState<'a' | 'b'>('a');
|
|
217
|
+
|
|
218
|
+
return (
|
|
219
|
+
<SafeSpan dataSource={\`cta.variant-\${variant}\`} />
|
|
220
|
+
);`}</Code>
|
|
221
|
+
|
|
222
|
+
<Code title="A/B Test Data Structure">{`'cta.variant-a': [
|
|
223
|
+
{
|
|
224
|
+
html: '<p class="cta-primary"><strong>Start Building Today!</strong> - Try our free plan.</p>'
|
|
225
|
+
}
|
|
226
|
+
],
|
|
227
|
+
'cta.variant-b': [
|
|
228
|
+
{
|
|
229
|
+
html: '<p class="cta-secondary"><strong>Join 10,000+ Developers</strong> - Get started now.</p>'
|
|
230
|
+
}
|
|
231
|
+
]`}</Code>
|
|
232
|
+
</Section>
|
|
233
|
+
);
|
|
234
|
+
},
|
|
235
|
+
parameters: {
|
|
236
|
+
docs: {
|
|
237
|
+
description: {
|
|
238
|
+
story: 'A/B testing implementation using dynamic dataSource selection for conversion optimization.'
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// Rich Media Content
|
|
245
|
+
export const RichMediaContent: Story = {
|
|
246
|
+
render: () => (
|
|
247
|
+
<Section>
|
|
248
|
+
<Typography variant="h4">Rich Media Content</Typography>
|
|
249
|
+
<Typography variant="body1" gutterBottom>
|
|
250
|
+
Complex HTML content with multiple elements, perfect for blog posts and articles.
|
|
251
|
+
</Typography>
|
|
252
|
+
|
|
253
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
254
|
+
<SafeSpan dataSource="blog.featured-post" />
|
|
255
|
+
</Card>
|
|
256
|
+
|
|
257
|
+
<Code title="Usage">{`<SafeSpan dataSource="blog.featured-post" />`}</Code>
|
|
258
|
+
|
|
259
|
+
<Code title="Rich Media Data Structure">{`'blog.featured-post': [
|
|
260
|
+
{
|
|
261
|
+
html: \`
|
|
262
|
+
<article>
|
|
263
|
+
<h3>Building Scalable Apps with QwickApps React Framework</h3>
|
|
264
|
+
<p class="meta">Published on January 15, 2025 • 8 min read</p>
|
|
265
|
+
<p>Learn how our <strong>data-binding system</strong> enables dynamic applications...</p>
|
|
266
|
+
<a href="/blog/scalable-apps" class="read-more">Continue reading →</a>
|
|
267
|
+
</article>
|
|
268
|
+
\`,
|
|
269
|
+
placeholder: 'Loading featured blog post...'
|
|
270
|
+
}
|
|
271
|
+
]`}</Code>
|
|
272
|
+
</Section>
|
|
273
|
+
),
|
|
274
|
+
parameters: {
|
|
275
|
+
docs: {
|
|
276
|
+
description: {
|
|
277
|
+
story: 'Complex HTML content with multiple elements, perfect for blog posts and articles.'
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
// Security Testing
|
|
284
|
+
export const SecurityAndSanitization: Story = {
|
|
285
|
+
render: () => (
|
|
286
|
+
<Section>
|
|
287
|
+
<Typography variant="h4">Security and Sanitization</Typography>
|
|
288
|
+
<Typography variant="body1" gutterBottom>
|
|
289
|
+
Demonstrates automatic HTML sanitization to prevent XSS attacks and malicious content.
|
|
290
|
+
</Typography>
|
|
291
|
+
|
|
292
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#fff3cd' }}>
|
|
293
|
+
<Typography variant="body2">
|
|
294
|
+
<strong>🛡️ Security Test:</strong> The content below contains malicious scripts that are automatically sanitized.
|
|
295
|
+
</Typography>
|
|
296
|
+
</Card>
|
|
297
|
+
|
|
298
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
299
|
+
<SafeSpan dataSource="security.malicious" />
|
|
300
|
+
</Card>
|
|
301
|
+
|
|
302
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem', backgroundColor: '#d4edda' }}>
|
|
303
|
+
<Typography variant="h6" gutterBottom>What was filtered:</Typography>
|
|
304
|
+
<ul>
|
|
305
|
+
<li><script> tags removed</li>
|
|
306
|
+
<li>onerror attributes removed</li>
|
|
307
|
+
<li>Only safe HTML elements preserved</li>
|
|
308
|
+
</ul>
|
|
309
|
+
</Card>
|
|
310
|
+
|
|
311
|
+
<Code title="Malicious Content (Auto-Sanitized)">{`<SafeSpan dataSource="security.malicious" />`}</Code>
|
|
312
|
+
|
|
313
|
+
<Code title="Malicious Data Source">{`'security.malicious': [
|
|
314
|
+
{
|
|
315
|
+
html: '<script>alert("XSS attempt")</script><p>Safe content with <strong>formatting</strong></p><img src="x" onerror="alert(\\'XSS\\')" />',
|
|
316
|
+
placeholder: 'Loading content...'
|
|
317
|
+
}
|
|
318
|
+
]`}</Code>
|
|
319
|
+
</Section>
|
|
320
|
+
),
|
|
321
|
+
parameters: {
|
|
322
|
+
docs: {
|
|
323
|
+
description: {
|
|
324
|
+
story: 'Demonstrates automatic HTML sanitization to prevent XSS attacks and malicious content.'
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
// Performance Testing
|
|
331
|
+
export const PerformanceOptimization: Story = {
|
|
332
|
+
render: () => (
|
|
333
|
+
<Section>
|
|
334
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1rem' }}>
|
|
335
|
+
<Typography variant="h4">Performance Optimization</Typography>
|
|
336
|
+
<div style={{ display: 'flex', gap: '8px' }}>
|
|
337
|
+
<ThemeSwitcher />
|
|
338
|
+
<PaletteSwitcher />
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
<Typography variant="body1" gutterBottom>
|
|
342
|
+
Performance optimization with caching for large content blocks.
|
|
343
|
+
</Typography>
|
|
344
|
+
|
|
345
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem' }}>
|
|
346
|
+
<Typography variant="body2" color="text.primary">
|
|
347
|
+
<strong>⚡ Performance Test:</strong> Large content with caching enabled for optimal performance.
|
|
348
|
+
</Typography>
|
|
349
|
+
</Card>
|
|
350
|
+
|
|
351
|
+
<Card variant="outlined" style={{ maxHeight: '200px', overflow: 'auto', padding: '1rem', marginBottom: '1rem' }}>
|
|
352
|
+
<SafeSpan dataSource="performance.large-content" />
|
|
353
|
+
</Card>
|
|
354
|
+
|
|
355
|
+
<Card variant="outlined" style={{ padding: '1rem', marginBottom: '1rem' }}>
|
|
356
|
+
<Typography variant="h6" gutterBottom>Performance Features:</Typography>
|
|
357
|
+
<ul>
|
|
358
|
+
<li>Memory caching with 5-minute TTL</li>
|
|
359
|
+
<li>Automatic content chunking for large data</li>
|
|
360
|
+
<li>Efficient re-rendering on data changes</li>
|
|
361
|
+
</ul>
|
|
362
|
+
</Card>
|
|
363
|
+
|
|
364
|
+
<Code title="Cached Performance">{`<DataProvider dataSource={{ dataProvider: cachedDataProvider }}>
|
|
365
|
+
<SafeSpan dataSource="performance.large-content" />
|
|
366
|
+
</DataProvider>`}</Code>
|
|
367
|
+
|
|
368
|
+
<Code title="Cache Configuration">{`const jsonProvider = new JsonDataProvider({ data: advancedCmsData });
|
|
369
|
+
const cacheProvider = new MemoryCacheProvider<any[]>({
|
|
370
|
+
maxSize: 100,
|
|
371
|
+
defaultTtl: 60000
|
|
372
|
+
});
|
|
373
|
+
const cachedDataProvider = new CachedDataProvider(jsonProvider, cacheProvider);`}</Code>
|
|
374
|
+
</Section>
|
|
375
|
+
),
|
|
376
|
+
parameters: {
|
|
377
|
+
docs: {
|
|
378
|
+
description: {
|
|
379
|
+
story: 'Performance optimization with caching for large content blocks.'
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
// Custom Hook Usage
|
|
386
|
+
export const CustomHookExample: Story = {
|
|
387
|
+
render: () => {
|
|
388
|
+
const CustomComponent: React.FC<{ dataSource: string }> = ({ dataSource }) => {
|
|
389
|
+
const { loading, error } = useDataBinding(
|
|
390
|
+
dataSource,
|
|
391
|
+
{
|
|
392
|
+
html: '<p>Fallback HTML content</p>',
|
|
393
|
+
placeholder: 'Fallback placeholder'
|
|
394
|
+
},
|
|
395
|
+
undefined,
|
|
396
|
+
{ strict: true, cache: true }
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
if (loading) {
|
|
400
|
+
return (
|
|
401
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8f9fa' }}>
|
|
402
|
+
<Typography variant="body2">Loading content...</Typography>
|
|
403
|
+
</Card>
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (error) {
|
|
408
|
+
return (
|
|
409
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8d7da' }}>
|
|
410
|
+
<Typography variant="body2" color="error">
|
|
411
|
+
<strong>Error:</strong> {error.message}
|
|
412
|
+
</Typography>
|
|
413
|
+
</Card>
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
return (
|
|
418
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#d4edda' }}>
|
|
419
|
+
<SafeSpan dataSource={dataSource} />
|
|
420
|
+
<Typography variant="caption" color="textSecondary" style={{ marginTop: '0.5rem', display: 'block' }}>
|
|
421
|
+
Loaded via custom useDataBinding hook
|
|
422
|
+
</Typography>
|
|
423
|
+
</Card>
|
|
424
|
+
);
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
return (
|
|
428
|
+
<Section>
|
|
429
|
+
<Typography variant="h4">Custom Hook Implementation</Typography>
|
|
430
|
+
<Typography variant="body1" gutterBottom>
|
|
431
|
+
Custom implementation using the useDataBinding hook directly with advanced options like validation and caching.
|
|
432
|
+
</Typography>
|
|
433
|
+
|
|
434
|
+
<CustomComponent dataSource="announcements.current" />
|
|
435
|
+
|
|
436
|
+
<Code title="Custom Hook Usage">{`const CustomComponent: React.FC<{ dataSource: string }> = ({ dataSource }) => {
|
|
437
|
+
const { loading, error } = useDataBinding(
|
|
438
|
+
dataSource,
|
|
439
|
+
{
|
|
440
|
+
html: '<p>Fallback HTML content</p>',
|
|
441
|
+
placeholder: 'Fallback placeholder'
|
|
442
|
+
},
|
|
443
|
+
undefined,
|
|
444
|
+
{ strict: true, cache: true }
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
if (loading) return <LoadingComponent />;
|
|
448
|
+
if (error) return <ErrorComponent error={error} />;
|
|
449
|
+
|
|
450
|
+
return <SafeSpan dataSource={dataSource} />;
|
|
451
|
+
};`}</Code>
|
|
452
|
+
|
|
453
|
+
<Code title="Hook Options">{`const options = {
|
|
454
|
+
strict: true, // Enable strict schema validation
|
|
455
|
+
cache: true, // Enable caching for performance
|
|
456
|
+
fallback: { // Custom fallback data
|
|
457
|
+
html: '<p>Custom fallback content</p>',
|
|
458
|
+
placeholder: 'Custom placeholder'
|
|
459
|
+
}
|
|
460
|
+
};`}</Code>
|
|
461
|
+
</Section>
|
|
462
|
+
);
|
|
463
|
+
},
|
|
464
|
+
parameters: {
|
|
465
|
+
docs: {
|
|
466
|
+
description: {
|
|
467
|
+
story: 'Custom implementation using the useDataBinding hook directly with advanced options like validation and caching.'
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
// Error Handling
|
|
474
|
+
export const ErrorHandlingScenarios: Story = {
|
|
475
|
+
render: () => (
|
|
476
|
+
<Section>
|
|
477
|
+
<Typography variant="h4">Error Handling Scenarios</Typography>
|
|
478
|
+
<Typography variant="body1" gutterBottom>
|
|
479
|
+
Various error handling scenarios showing how the system gracefully degrades when data is missing or invalid.
|
|
480
|
+
</Typography>
|
|
481
|
+
|
|
482
|
+
<GridLayout spacing="large">
|
|
483
|
+
<div>
|
|
484
|
+
<Typography variant="h6">Non-existent Data Source</Typography>
|
|
485
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#fff3cd' }}>
|
|
486
|
+
<SafeSpan
|
|
487
|
+
dataSource="does.not.exist"
|
|
488
|
+
placeholder="Fallback when data source doesn't exist"
|
|
489
|
+
/>
|
|
490
|
+
</Card>
|
|
491
|
+
</div>
|
|
492
|
+
|
|
493
|
+
<div>
|
|
494
|
+
<Typography variant="h6">Empty Data Source</Typography>
|
|
495
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#f8d7da' }}>
|
|
496
|
+
<SafeSpan
|
|
497
|
+
dataSource="empty.data"
|
|
498
|
+
html="<p>Fallback HTML when data is empty</p>"
|
|
499
|
+
/>
|
|
500
|
+
</Card>
|
|
501
|
+
</div>
|
|
502
|
+
|
|
503
|
+
<div>
|
|
504
|
+
<Typography variant="h6">Graceful Degradation</Typography>
|
|
505
|
+
<Card variant="outlined" style={{ padding: '1rem', backgroundColor: '#d4edda' }}>
|
|
506
|
+
<SafeSpan
|
|
507
|
+
dataSource="malformed.data"
|
|
508
|
+
bindingOptions={{
|
|
509
|
+
fallback: {
|
|
510
|
+
html: '<p>Graceful fallback for <strong>malformed data</strong></p>',
|
|
511
|
+
placeholder: 'Fallback placeholder'
|
|
512
|
+
}
|
|
513
|
+
}}
|
|
514
|
+
/>
|
|
515
|
+
</Card>
|
|
516
|
+
</div>
|
|
517
|
+
</GridLayout>
|
|
518
|
+
|
|
519
|
+
<Code title="Non-existent Data Source">{`<SafeSpan
|
|
520
|
+
dataSource="does.not.exist"
|
|
521
|
+
placeholder="Fallback when data source doesn't exist"
|
|
522
|
+
/>`}</Code>
|
|
523
|
+
|
|
524
|
+
<Code title="Custom Fallback Options">{`<SafeSpan
|
|
525
|
+
dataSource="malformed.data"
|
|
526
|
+
bindingOptions={{
|
|
527
|
+
fallback: {
|
|
528
|
+
html: '<p>Graceful fallback for <strong>malformed data</strong></p>',
|
|
529
|
+
placeholder: 'Fallback placeholder'
|
|
530
|
+
}
|
|
531
|
+
}}
|
|
532
|
+
/>`}</Code>
|
|
533
|
+
|
|
534
|
+
<Code title="Error Handling Strategy">{`// System handles errors gracefully:
|
|
535
|
+
// 1. Uses fallback props when data source fails
|
|
536
|
+
// 2. Shows placeholder text when content is empty
|
|
537
|
+
// 3. Applies custom fallback options when specified
|
|
538
|
+
// 4. Never breaks the UI - always renders something useful`}</Code>
|
|
539
|
+
</Section>
|
|
540
|
+
),
|
|
541
|
+
parameters: {
|
|
542
|
+
docs: {
|
|
543
|
+
description: {
|
|
544
|
+
story: 'Various error handling scenarios showing how the system gracefully degrades when data is missing or invalid.'
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
};
|