@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,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Types for QwickApps React Framework
|
|
3
|
+
*
|
|
4
|
+
* These interfaces define the framework-agnostic content structure that can be
|
|
5
|
+
* automatically created and managed across different CMS systems and used
|
|
6
|
+
* for template resolution and component rendering.
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Base content structure - common properties for all content elements
|
|
14
|
+
*/
|
|
15
|
+
export interface BaseContent {
|
|
16
|
+
/** Unique identifier for this content element */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Display title for this content element */
|
|
19
|
+
title?: string;
|
|
20
|
+
/** Subtitle or description */
|
|
21
|
+
subtitle?: string;
|
|
22
|
+
/** Short text displayed above the title */
|
|
23
|
+
overline?: string;
|
|
24
|
+
/** Icon identifier or URL for this content element */
|
|
25
|
+
icon?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Individual content field definition
|
|
31
|
+
*/
|
|
32
|
+
export interface Field extends BaseContent {
|
|
33
|
+
/** The type of field */
|
|
34
|
+
type: string;
|
|
35
|
+
/** Current value of the field */
|
|
36
|
+
value?: any;
|
|
37
|
+
/** Default value for the field */
|
|
38
|
+
defaultValue?: any;
|
|
39
|
+
/** Whether this field is required */
|
|
40
|
+
required?: boolean;
|
|
41
|
+
/** Placeholder text for input fields */
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
/** Help text or instructions */
|
|
44
|
+
instructions?: string;
|
|
45
|
+
/** Options for select/radio/checkbox fields */
|
|
46
|
+
choices?: Array<{ label: string; value: any }>;
|
|
47
|
+
/** Minimum value (for numbers) or length (for text) */
|
|
48
|
+
min?: number;
|
|
49
|
+
/** Maximum value (for numbers) or length (for text) */
|
|
50
|
+
max?: number;
|
|
51
|
+
/** Regular expression for validation */
|
|
52
|
+
pattern?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* HTTP methods for form submission
|
|
57
|
+
*/
|
|
58
|
+
export enum FormMethod {
|
|
59
|
+
POST = 'POST',
|
|
60
|
+
PUT = 'PUT',
|
|
61
|
+
PATCH = 'PATCH'
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Action types for interactive elements
|
|
66
|
+
*/
|
|
67
|
+
export enum ActionType {
|
|
68
|
+
NAVIGATE = 'navigate',
|
|
69
|
+
SUBMIT = 'submit',
|
|
70
|
+
RESET = 'reset',
|
|
71
|
+
CANCEL = 'cancel'
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Action definition for interactive elements
|
|
76
|
+
*/
|
|
77
|
+
export interface Action extends BaseContent {
|
|
78
|
+
/** The type of action */
|
|
79
|
+
type: ActionType;
|
|
80
|
+
/** Target URL for navigation actions */
|
|
81
|
+
target?: string;
|
|
82
|
+
/** JavaScript handler function name */
|
|
83
|
+
handler?: string;
|
|
84
|
+
/** Whether the action is disabled */
|
|
85
|
+
disabled?: boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Field group - container for fields and nested field groups
|
|
90
|
+
*/
|
|
91
|
+
export interface FieldGroup extends BaseContent {
|
|
92
|
+
/** Child fields in this group */
|
|
93
|
+
fields?: Field[];
|
|
94
|
+
/** Nested field groups */
|
|
95
|
+
fieldGroups?: FieldGroup[];
|
|
96
|
+
/** Actions available for this field group */
|
|
97
|
+
actions?: Action[];
|
|
98
|
+
/** Whether this field group is repeatable */
|
|
99
|
+
repeatable?: boolean;
|
|
100
|
+
/** Minimum number of repetitions */
|
|
101
|
+
minRows?: number;
|
|
102
|
+
/** Maximum number of repetitions */
|
|
103
|
+
maxRows?: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Form-specific field with validation
|
|
108
|
+
*/
|
|
109
|
+
export interface FormField extends Field {
|
|
110
|
+
/** Validation rules for forms */
|
|
111
|
+
validation?: {
|
|
112
|
+
required?: boolean;
|
|
113
|
+
minLength?: number;
|
|
114
|
+
maxLength?: number;
|
|
115
|
+
pattern?: RegExp;
|
|
116
|
+
custom?: (value: any) => boolean | string;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Form-specific action
|
|
122
|
+
*/
|
|
123
|
+
export interface FormAction extends Action {
|
|
124
|
+
type: ActionType;
|
|
125
|
+
/** Form validation behavior */
|
|
126
|
+
validateOnAction?: boolean;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Form field group
|
|
131
|
+
*/
|
|
132
|
+
export interface FormFieldGroup extends FieldGroup {
|
|
133
|
+
fields?: FormField[];
|
|
134
|
+
actions?: FormAction[];
|
|
135
|
+
/** Form submission endpoint */
|
|
136
|
+
submitUrl?: string;
|
|
137
|
+
/** Form method */
|
|
138
|
+
method?: FormMethod;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Content represents any structured data that can be persisted and managed
|
|
143
|
+
* through the CMS. All content is essentially a field group with a unique type name.
|
|
144
|
+
*
|
|
145
|
+
* Content types are string-based for maximum flexibility - can be anything
|
|
146
|
+
* as long as it's unique (e.g., 'contact', 'product', 'blog-post', 'testimonial').
|
|
147
|
+
*/
|
|
148
|
+
export interface Data extends FieldGroup {
|
|
149
|
+
/** The type of content - flexible string identifier */
|
|
150
|
+
type: string;
|
|
151
|
+
/** Whether this content should be auto-created if missing */
|
|
152
|
+
autoCreate?: boolean;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Generic link interface for database persistence
|
|
157
|
+
* This is a simple data structure, not a Content type
|
|
158
|
+
*/
|
|
159
|
+
export interface Link {
|
|
160
|
+
/** Unique identifier */
|
|
161
|
+
id: string;
|
|
162
|
+
/** Display label */
|
|
163
|
+
label: string;
|
|
164
|
+
/** URL */
|
|
165
|
+
url: string;
|
|
166
|
+
/** Icon identifier or URL */
|
|
167
|
+
icon?: string;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Social media link extending base Link
|
|
172
|
+
* This is a simple data structure, not a Content type
|
|
173
|
+
*/
|
|
174
|
+
export interface SocialLink extends Link {
|
|
175
|
+
/** Social media platform */
|
|
176
|
+
platform: string;
|
|
177
|
+
/** Social media handle or username */
|
|
178
|
+
handle?: string;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Footer section containing multiple links
|
|
183
|
+
* This is a simple data structure, not a Content type
|
|
184
|
+
*/
|
|
185
|
+
export interface FooterSection {
|
|
186
|
+
/** Unique section identifier */
|
|
187
|
+
id: string;
|
|
188
|
+
/** Section title */
|
|
189
|
+
title: string;
|
|
190
|
+
/** Links in this section */
|
|
191
|
+
items: Link[];
|
|
192
|
+
/** Display order */
|
|
193
|
+
order?: number;
|
|
194
|
+
/** Whether section is visible */
|
|
195
|
+
visible?: boolean;
|
|
196
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure template resolution provider interface
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export interface TemplateProvider {
|
|
7
|
+
/** Resolve template with given context using mustache syntax */
|
|
8
|
+
resolve(template: string, context: any): string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ICacheProvider, IDataProvider } from "@qwickapps/schema";
|
|
2
|
+
import { TemplateProvider } from "./TemplateProvider";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for Data Provider orchestrator
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface TemplateResolverConfig {
|
|
9
|
+
/** Data provider for fetching raw data */
|
|
10
|
+
dataProvider: IDataProvider;
|
|
11
|
+
/** Template resolver (optional, defaults to MustacheTemplateResolver) */
|
|
12
|
+
templateResolver?: TemplateProvider;
|
|
13
|
+
/** Cache provider (optional, defaults to MemoryCacheProvider, false = no cache) */
|
|
14
|
+
cacheProvider?: ICacheProvider<any[]> | boolean;
|
|
15
|
+
/** Enable debug logging */
|
|
16
|
+
enableLogging?: boolean;
|
|
17
|
+
}/**
|
|
18
|
+
* Content resolver interface
|
|
19
|
+
* This is now an orchestrator that combines data, template, and cache providers
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export interface ITemplateResolver extends IDataProvider {
|
|
23
|
+
/** Resolve template string with mustache syntax */
|
|
24
|
+
resolveTemplate(template: string): Promise<string>;
|
|
25
|
+
}
|
|
26
|
+
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Type Definitions for QwickApps React Framework
|
|
3
|
+
*
|
|
4
|
+
* This file consolidates all common types used throughout the framework
|
|
5
|
+
* to ensure consistency and eliminate duplication.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Standard t-shirt sizing system used across the framework
|
|
12
|
+
*/
|
|
13
|
+
export type TShirtSize = 'tiny' | 'small' | 'medium' | 'large' | 'x-large' | 'huge';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* MUI breakpoint values for responsive design
|
|
17
|
+
*/
|
|
18
|
+
export type MUIBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Extended MUI breakpoint names for better readability
|
|
22
|
+
*/
|
|
23
|
+
export type ExtendedBreakpoint = 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Combined breakpoint type supporting all naming conventions
|
|
27
|
+
*/
|
|
28
|
+
export type BreakpointValue = MUIBreakpoint | ExtendedBreakpoint | false;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Height presets commonly used in layout components
|
|
32
|
+
*/
|
|
33
|
+
export type HeightPreset = TShirtSize | 'viewport' | 'auto';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Note: SpacingValue is defined in utils/spacing.ts to avoid circular dependencies
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Dimension values supporting CSS units and t-shirt sizes
|
|
41
|
+
*/
|
|
42
|
+
export type DimensionValue = TShirtSize | MUIBreakpoint | number | 'auto' | 'grow' | string | undefined;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Background variant types for themed components
|
|
46
|
+
*/
|
|
47
|
+
export type BackgroundVariant = 'default' | 'primary' | 'secondary' | 'surface' | 'paper';
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Text alignment options
|
|
51
|
+
*/
|
|
52
|
+
export type TextAlignment = 'left' | 'center' | 'right' | 'justify';
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Common spacing presets for layout components
|
|
56
|
+
*/
|
|
57
|
+
export type SpacingPreset = 'none' | 'compact' | 'comfortable' | 'spacious';
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Component size variants (different from dimension sizes)
|
|
61
|
+
*/
|
|
62
|
+
export type ComponentSize = 'small' | 'medium' | 'large';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Elevation levels for Material-UI components
|
|
66
|
+
*/
|
|
67
|
+
export type ElevationLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12 | 16 | 24;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Common variant styles for components
|
|
71
|
+
*/
|
|
72
|
+
export type ComponentVariant = 'default' | 'elevated' | 'outlined' | 'filled' | 'text';
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Animation durations
|
|
76
|
+
*/
|
|
77
|
+
export type AnimationDuration = 'fast' | 'medium' | 'slow' | number;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Grid span values for layout systems
|
|
81
|
+
*/
|
|
82
|
+
export type GridSpan = number | 'auto' | 'grow';
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Color intensity levels
|
|
86
|
+
*/
|
|
87
|
+
export type ColorIntensity = 'light' | 'main' | 'dark';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Common loading states
|
|
91
|
+
*/
|
|
92
|
+
export type LoadingState = 'idle' | 'loading' | 'success' | 'error';
|
|
93
|
+
|
|
94
|
+
// Export all content-related types
|
|
95
|
+
export * from './CacheProvider';
|
|
96
|
+
export * from './ContentProxy';
|
|
97
|
+
export * from './DataTypes';
|
|
98
|
+
export * from './TemplateProvider';
|
|
99
|
+
export * from './TemplateResolver';
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for createDataDrivenComponent factory
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { render, waitFor } from '@testing-library/react';
|
|
9
|
+
import { createDataDrivenComponent } from '../createDataDrivenComponent';
|
|
10
|
+
import { DataProvider } from '../../contexts/DataContext';
|
|
11
|
+
import { JsonDataProvider } from '../../providers/JsonDataProvider';
|
|
12
|
+
|
|
13
|
+
// Simple test component
|
|
14
|
+
interface TestProps {
|
|
15
|
+
html?: string;
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
testProp?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const BaseTestComponent: React.FC<TestProps> = ({ html, placeholder, testProp, ...otherProps }) => (
|
|
21
|
+
<div data-testid="base-component" {...otherProps}>
|
|
22
|
+
<div data-testid="html">{html}</div>
|
|
23
|
+
<div data-testid="placeholder">{placeholder}</div>
|
|
24
|
+
<div data-testid="test-prop">{testProp}</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
describe('createDataDrivenComponent', () => {
|
|
29
|
+
const testData = {
|
|
30
|
+
'company.description': [
|
|
31
|
+
{
|
|
32
|
+
html: '<p>QwickApps React Framework</p>',
|
|
33
|
+
placeholder: 'Loading...',
|
|
34
|
+
testProp: 'data-driven-value'
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const dataProvider = new JsonDataProvider(testData);
|
|
40
|
+
|
|
41
|
+
it('should create a component that works without dataSource', () => {
|
|
42
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
43
|
+
|
|
44
|
+
const { getByTestId } = render(
|
|
45
|
+
<DataDrivenTest html="<p>Direct prop</p>" placeholder="Direct placeholder" testProp="direct-value" />
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expect(getByTestId('html')).toHaveTextContent('Direct prop');
|
|
49
|
+
expect(getByTestId('placeholder')).toHaveTextContent('Direct placeholder');
|
|
50
|
+
expect(getByTestId('test-prop')).toHaveTextContent('direct-value');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should resolve props from dataSource when provided', async () => {
|
|
54
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
55
|
+
|
|
56
|
+
const { getByTestId } = render(
|
|
57
|
+
<DataProvider dataSource={dataProvider}>
|
|
58
|
+
<DataDrivenTest dataSource="company.description" />
|
|
59
|
+
</DataProvider>
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
await waitFor(() => {
|
|
63
|
+
expect(getByTestId('html')).toHaveTextContent('QwickApps React Framework');
|
|
64
|
+
expect(getByTestId('placeholder')).toHaveTextContent('Loading...');
|
|
65
|
+
expect(getByTestId('test-prop')).toHaveTextContent('data-driven-value');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should merge dataSource props with direct props', async () => {
|
|
70
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
71
|
+
|
|
72
|
+
const { getByTestId } = render(
|
|
73
|
+
<DataProvider dataSource={dataProvider}>
|
|
74
|
+
<DataDrivenTest
|
|
75
|
+
dataSource="company.description"
|
|
76
|
+
testProp="override-value" // This should be overridden by dataSource
|
|
77
|
+
placeholder="direct-placeholder" // This should be overridden by dataSource
|
|
78
|
+
/>
|
|
79
|
+
</DataProvider>
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
await waitFor(() => {
|
|
83
|
+
expect(getByTestId('html')).toHaveTextContent('QwickApps React Framework');
|
|
84
|
+
// dataSource should override direct props
|
|
85
|
+
expect(getByTestId('placeholder')).toHaveTextContent('Loading...');
|
|
86
|
+
expect(getByTestId('test-prop')).toHaveTextContent('data-driven-value');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should add data attributes to the component', async () => {
|
|
91
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
92
|
+
|
|
93
|
+
const { getByTestId } = render(
|
|
94
|
+
<DataProvider dataSource={dataProvider}>
|
|
95
|
+
<DataDrivenTest dataSource="company.description" />
|
|
96
|
+
</DataProvider>
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
await waitFor(() => {
|
|
100
|
+
const component = getByTestId('base-component');
|
|
101
|
+
expect(component).toHaveAttribute('data-component', 'SafeSpan');
|
|
102
|
+
expect(component).toHaveAttribute('data-data-source', 'company.description');
|
|
103
|
+
expect(component).toHaveAttribute('data-cached', 'false');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should show loading state when data is loading', () => {
|
|
108
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
109
|
+
|
|
110
|
+
const { getByText } = render(
|
|
111
|
+
<DataProvider dataSource={dataProvider}>
|
|
112
|
+
<DataDrivenTest dataSource="nonexistent.data" />
|
|
113
|
+
</DataProvider>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
// Should show loading initially
|
|
117
|
+
expect(getByText('Loading SafeSpan...')).toBeInTheDocument();
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('should handle fallback options', async () => {
|
|
121
|
+
const DataDrivenTest = createDataDrivenComponent(
|
|
122
|
+
BaseTestComponent,
|
|
123
|
+
undefined,
|
|
124
|
+
{
|
|
125
|
+
fallback: {
|
|
126
|
+
html: '<p>Fallback content</p>',
|
|
127
|
+
placeholder: 'Fallback placeholder'
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const { getByTestId } = render(
|
|
133
|
+
<DataProvider dataSource={dataProvider}>
|
|
134
|
+
<DataDrivenTest dataSource="nonexistent.data" />
|
|
135
|
+
</DataProvider>
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
await waitFor(() => {
|
|
139
|
+
expect(getByTestId('html')).toHaveTextContent('Fallback content');
|
|
140
|
+
expect(getByTestId('placeholder')).toHaveTextContent('Fallback placeholder');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should support custom binding options per component instance', async () => {
|
|
145
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
146
|
+
|
|
147
|
+
const customOptions = {
|
|
148
|
+
fallback: {
|
|
149
|
+
html: '<p>Custom fallback</p>',
|
|
150
|
+
placeholder: 'Custom placeholder'
|
|
151
|
+
},
|
|
152
|
+
strict: true
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const { getByTestId } = render(
|
|
156
|
+
<DataProvider dataSource={dataProvider}>
|
|
157
|
+
<DataDrivenTest
|
|
158
|
+
dataSource="nonexistent.data"
|
|
159
|
+
bindingOptions={customOptions}
|
|
160
|
+
/>
|
|
161
|
+
</DataProvider>
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
await waitFor(() => {
|
|
165
|
+
expect(getByTestId('html')).toHaveTextContent('Custom fallback');
|
|
166
|
+
expect(getByTestId('placeholder')).toHaveTextContent('Custom placeholder');
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('should set correct display name', () => {
|
|
171
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
172
|
+
expect(DataDrivenTest.displayName).toBe('DataDriven(BaseTestComponent)');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should attach schema to the component', () => {
|
|
176
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
177
|
+
expect((DataDrivenTest as any).schema).toBe(undefined);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('should forward refs correctly', () => {
|
|
181
|
+
const DataDrivenTest = createDataDrivenComponent(BaseTestComponent, undefined);
|
|
182
|
+
const ref = React.createRef<HTMLDivElement>();
|
|
183
|
+
|
|
184
|
+
render(
|
|
185
|
+
<DataDrivenTest
|
|
186
|
+
ref={ref}
|
|
187
|
+
html="<p>Test content</p>"
|
|
188
|
+
/>
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
expect(ref.current).toBeInstanceOf(HTMLElement);
|
|
192
|
+
});
|
|
193
|
+
});
|