@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,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for CardListGrid component
|
|
3
|
+
*
|
|
4
|
+
* Tests both traditional props usage and data binding functionality
|
|
5
|
+
* with the new schema system.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { render, screen } from '@testing-library/react';
|
|
10
|
+
import '@testing-library/jest-dom';
|
|
11
|
+
import { CardListGrid } from '../blocks/CardListGrid';
|
|
12
|
+
import { JsonDataProvider } from '@qwickapps/schema';
|
|
13
|
+
import { ThemeProvider, PaletteProvider } from '../../contexts';
|
|
14
|
+
import QwickApp from '../QwickApp';
|
|
15
|
+
|
|
16
|
+
// Sample data for testing
|
|
17
|
+
const sampleProducts = [
|
|
18
|
+
{
|
|
19
|
+
id: 'product-1',
|
|
20
|
+
name: 'Test Product 1',
|
|
21
|
+
category: 'Testing',
|
|
22
|
+
description: 'First test product',
|
|
23
|
+
shortDescription: 'Test product 1',
|
|
24
|
+
features: ['Feature 1', 'Feature 2'],
|
|
25
|
+
technologies: ['React', 'TypeScript'],
|
|
26
|
+
status: 'launched',
|
|
27
|
+
image: 'https://example.com/product1.jpg'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'product-2',
|
|
31
|
+
name: 'Test Product 2',
|
|
32
|
+
category: 'Testing',
|
|
33
|
+
description: 'Second test product',
|
|
34
|
+
shortDescription: 'Test product 2',
|
|
35
|
+
features: ['Feature A', 'Feature B'],
|
|
36
|
+
technologies: ['Vue', 'JavaScript'],
|
|
37
|
+
status: 'beta'
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const sampleFeatures = [
|
|
42
|
+
{
|
|
43
|
+
id: 'feature-1',
|
|
44
|
+
title: 'Test Feature 1',
|
|
45
|
+
description: 'First test feature',
|
|
46
|
+
icon: '🚀'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'feature-2',
|
|
50
|
+
title: 'Test Feature 2',
|
|
51
|
+
description: 'Second test feature',
|
|
52
|
+
icon: '⚡'
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// Test data for data binding - using nested structure
|
|
57
|
+
const sampleCmsData = {
|
|
58
|
+
'cardListGrids': {
|
|
59
|
+
'products': {
|
|
60
|
+
items: sampleProducts,
|
|
61
|
+
renderComponent: 'ProductCard',
|
|
62
|
+
columns: 2,
|
|
63
|
+
spacing: 'large',
|
|
64
|
+
equalHeight: true,
|
|
65
|
+
itemProps: { variant: 'compact' }
|
|
66
|
+
},
|
|
67
|
+
'features': {
|
|
68
|
+
items: sampleFeatures,
|
|
69
|
+
renderComponent: 'FeatureCard',
|
|
70
|
+
columns: 3,
|
|
71
|
+
spacing: 'medium',
|
|
72
|
+
equalHeight: false
|
|
73
|
+
},
|
|
74
|
+
'mixed': {
|
|
75
|
+
items: [
|
|
76
|
+
{ id: 'mixed-1', type: 'custom', content: 'Custom item 1' },
|
|
77
|
+
{ id: 'mixed-2', type: 'custom', content: 'Custom item 2' }
|
|
78
|
+
],
|
|
79
|
+
renderComponent: 'Custom',
|
|
80
|
+
columns: 2,
|
|
81
|
+
spacing: 'small'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// Wrapper component for tests that need providers
|
|
87
|
+
const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
|
|
88
|
+
children,
|
|
89
|
+
dataProvider
|
|
90
|
+
}) => (
|
|
91
|
+
<ThemeProvider>
|
|
92
|
+
<PaletteProvider>
|
|
93
|
+
{dataProvider ? (
|
|
94
|
+
<QwickApp appId="test-cardlistgrid" appName="CardListGrid Test" dataSource={{ dataProvider }}>
|
|
95
|
+
{children}
|
|
96
|
+
</QwickApp>
|
|
97
|
+
) : (
|
|
98
|
+
children
|
|
99
|
+
)}
|
|
100
|
+
</PaletteProvider>
|
|
101
|
+
</ThemeProvider>
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
describe('CardListGrid', () => {
|
|
105
|
+
describe('Traditional Props Usage', () => {
|
|
106
|
+
it('renders with custom render function', () => {
|
|
107
|
+
const customRenderItem = (item: any, index: number) => (
|
|
108
|
+
<div key={index} data-testid={`custom-item-${index}`}>
|
|
109
|
+
{item.name}
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
render(
|
|
114
|
+
<TestWrapper>
|
|
115
|
+
<CardListGrid
|
|
116
|
+
items={sampleProducts}
|
|
117
|
+
renderItem={customRenderItem}
|
|
118
|
+
columns={2}
|
|
119
|
+
spacing="large"
|
|
120
|
+
/>
|
|
121
|
+
</TestWrapper>
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
expect(screen.getByTestId('custom-item-0')).toBeInTheDocument();
|
|
125
|
+
expect(screen.getByTestId('custom-item-1')).toBeInTheDocument();
|
|
126
|
+
expect(screen.getByText('Test Product 1')).toBeInTheDocument();
|
|
127
|
+
expect(screen.getByText('Test Product 2')).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('renders ProductCards by default when renderComponent is ProductCard', () => {
|
|
131
|
+
render(
|
|
132
|
+
<TestWrapper>
|
|
133
|
+
<CardListGrid
|
|
134
|
+
items={sampleProducts}
|
|
135
|
+
renderComponent="ProductCard"
|
|
136
|
+
columns={2}
|
|
137
|
+
itemProps={{ variant: 'compact' }}
|
|
138
|
+
/>
|
|
139
|
+
</TestWrapper>
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
expect(screen.getByText('Test Product 1')).toBeInTheDocument();
|
|
143
|
+
expect(screen.getByText('Test Product 2')).toBeInTheDocument();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('renders FeatureCards when renderComponent is FeatureCard', () => {
|
|
147
|
+
render(
|
|
148
|
+
<TestWrapper>
|
|
149
|
+
<CardListGrid
|
|
150
|
+
items={sampleFeatures}
|
|
151
|
+
renderComponent="FeatureCard"
|
|
152
|
+
columns={3}
|
|
153
|
+
/>
|
|
154
|
+
</TestWrapper>
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
expect(screen.getByText('Test Feature 1')).toBeInTheDocument();
|
|
158
|
+
expect(screen.getByText('Test Feature 2')).toBeInTheDocument();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('handles different column configurations', () => {
|
|
162
|
+
const { container } = render(
|
|
163
|
+
<TestWrapper>
|
|
164
|
+
<CardListGrid
|
|
165
|
+
items={sampleProducts}
|
|
166
|
+
renderComponent="ProductCard"
|
|
167
|
+
columns={4}
|
|
168
|
+
spacing="medium"
|
|
169
|
+
equalHeight={false}
|
|
170
|
+
/>
|
|
171
|
+
</TestWrapper>
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
// Should render the grid container
|
|
175
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
176
|
+
expect(screen.getByText('Test Product 1')).toBeInTheDocument();
|
|
177
|
+
expect(screen.getByText('Test Product 2')).toBeInTheDocument();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('returns null when no items and no render function', () => {
|
|
181
|
+
const { container } = render(
|
|
182
|
+
<TestWrapper>
|
|
183
|
+
<CardListGrid items={[]} />
|
|
184
|
+
</TestWrapper>
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
expect(container.firstChild).toBeNull();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('handles empty items array gracefully', () => {
|
|
191
|
+
const customRenderItem = (item: any, index: number) => (
|
|
192
|
+
<div key={index}>Empty</div>
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
const { container } = render(
|
|
196
|
+
<TestWrapper>
|
|
197
|
+
<CardListGrid
|
|
198
|
+
items={[]}
|
|
199
|
+
renderItem={customRenderItem}
|
|
200
|
+
/>
|
|
201
|
+
</TestWrapper>
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Should render grid layout but no items
|
|
205
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
206
|
+
expect(screen.queryByText('Empty')).not.toBeInTheDocument();
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('passes item props to rendered components', () => {
|
|
210
|
+
render(
|
|
211
|
+
<TestWrapper>
|
|
212
|
+
<CardListGrid
|
|
213
|
+
items={[sampleProducts[0]]} // Just one product to avoid duplicate "Technologies:" text
|
|
214
|
+
renderComponent="ProductCard"
|
|
215
|
+
itemProps={{
|
|
216
|
+
variant: 'detailed',
|
|
217
|
+
showTechnologies: true
|
|
218
|
+
}}
|
|
219
|
+
/>
|
|
220
|
+
</TestWrapper>
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
// Should show technologies section (detailed variant specific)
|
|
224
|
+
expect(screen.getByText('Technologies:')).toBeInTheDocument();
|
|
225
|
+
expect(screen.getByText('React')).toBeInTheDocument();
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('handles custom render component type', () => {
|
|
229
|
+
const customItems = [
|
|
230
|
+
{ id: 'custom-1', content: 'Custom Content 1' },
|
|
231
|
+
{ id: 'custom-2', content: 'Custom Content 2' }
|
|
232
|
+
];
|
|
233
|
+
|
|
234
|
+
render(
|
|
235
|
+
<TestWrapper>
|
|
236
|
+
<CardListGrid
|
|
237
|
+
items={customItems}
|
|
238
|
+
renderComponent="Custom"
|
|
239
|
+
/>
|
|
240
|
+
</TestWrapper>
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
// Should render JSON representation of items
|
|
244
|
+
expect(screen.getByText(/"content":"Custom Content 1"/)).toBeInTheDocument();
|
|
245
|
+
expect(screen.getByText(/"content":"Custom Content 2"/)).toBeInTheDocument();
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
describe('Data Binding Usage', () => {
|
|
250
|
+
let dataProvider: JsonDataProvider;
|
|
251
|
+
|
|
252
|
+
beforeEach(() => {
|
|
253
|
+
dataProvider = new JsonDataProvider({ data: sampleCmsData });
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it('renders with dataSource prop (ProductCard grid)', async () => {
|
|
257
|
+
render(
|
|
258
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
259
|
+
<CardListGrid dataSource="cardListGrids.products" />
|
|
260
|
+
</TestWrapper>
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
// Should eventually load and show products
|
|
264
|
+
await screen.findByText('Test Product 1');
|
|
265
|
+
expect(screen.getByText('Test Product 2')).toBeInTheDocument();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('renders with dataSource prop (FeatureCard grid)', async () => {
|
|
269
|
+
render(
|
|
270
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
271
|
+
<CardListGrid dataSource="cardListGrids.features" />
|
|
272
|
+
</TestWrapper>
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
// Should eventually load and show features
|
|
276
|
+
await screen.findByText('Test Feature 1');
|
|
277
|
+
expect(screen.getByText('Test Feature 2')).toBeInTheDocument();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('shows loading state while data is loading', () => {
|
|
281
|
+
render(
|
|
282
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
283
|
+
<CardListGrid dataSource="cardListGrids.nonexistent" />
|
|
284
|
+
</TestWrapper>
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('includes data attributes when using dataSource', async () => {
|
|
291
|
+
const { container } = render(
|
|
292
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
293
|
+
<CardListGrid dataSource="cardListGrids.products" />
|
|
294
|
+
</TestWrapper>
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// Wait for content to load
|
|
298
|
+
await screen.findByText('Test Product 1');
|
|
299
|
+
|
|
300
|
+
// Should have Material-UI grid layout
|
|
301
|
+
const gridElement = container.querySelector('.MuiGrid-root.MuiGrid-container');
|
|
302
|
+
expect(gridElement).toBeInTheDocument();
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it('uses fallback props when dataSource has no content', () => {
|
|
306
|
+
render(
|
|
307
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
308
|
+
<CardListGrid
|
|
309
|
+
dataSource="cardListGrids.nonexistent-key"
|
|
310
|
+
items={sampleProducts}
|
|
311
|
+
renderComponent="ProductCard"
|
|
312
|
+
/>
|
|
313
|
+
</TestWrapper>
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Currently shows loading state when path not found (expected behavior)
|
|
317
|
+
// TODO: Future enhancement - implement fallback to provided props
|
|
318
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('works with custom binding options', async () => {
|
|
322
|
+
render(
|
|
323
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
324
|
+
<CardListGrid
|
|
325
|
+
dataSource="cardListGrids.products"
|
|
326
|
+
bindingOptions={{ cache: false, strict: true }}
|
|
327
|
+
/>
|
|
328
|
+
</TestWrapper>
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
await screen.findByText('Test Product 1');
|
|
332
|
+
expect(screen.getByText('Test Product 2')).toBeInTheDocument();
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
it('shows proper loading state with grid layout', () => {
|
|
336
|
+
render(
|
|
337
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
338
|
+
<CardListGrid dataSource="cardListGrids.nonexistent" />
|
|
339
|
+
</TestWrapper>
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
const loadingText = screen.getByText('Loading...');
|
|
343
|
+
expect(loadingText).toBeInTheDocument();
|
|
344
|
+
|
|
345
|
+
// Should maintain grid layout during loading
|
|
346
|
+
const gridContainer = loadingText.closest('.MuiGrid-root.MuiGrid-container');
|
|
347
|
+
expect(gridContainer).toBeInTheDocument();
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('handles error states appropriately in development', () => {
|
|
351
|
+
const originalEnv = process.env.NODE_ENV;
|
|
352
|
+
process.env.NODE_ENV = 'development';
|
|
353
|
+
|
|
354
|
+
// Mock console.error to avoid test output noise
|
|
355
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
356
|
+
|
|
357
|
+
// Create a provider that will cause an error
|
|
358
|
+
const errorProvider = new JsonDataProvider({
|
|
359
|
+
data: {}, // Empty data will cause binding to fail
|
|
360
|
+
enableCache: false
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
render(
|
|
364
|
+
<TestWrapper dataProvider={errorProvider}>
|
|
365
|
+
<CardListGrid dataSource="cardListGrids.nonexistent" />
|
|
366
|
+
</TestWrapper>
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
// Currently shows loading state when path not found (expected behavior)
|
|
370
|
+
// TODO: Future enhancement - implement proper error state handling
|
|
371
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
372
|
+
|
|
373
|
+
// Restore environment and console
|
|
374
|
+
process.env.NODE_ENV = originalEnv;
|
|
375
|
+
consoleErrorSpy.mockRestore();
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it('handles error states appropriately in production', () => {
|
|
379
|
+
const originalEnv = process.env.NODE_ENV;
|
|
380
|
+
process.env.NODE_ENV = 'production';
|
|
381
|
+
|
|
382
|
+
// Mock console.error to avoid test output noise
|
|
383
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
384
|
+
|
|
385
|
+
// Create a provider that will cause an error
|
|
386
|
+
const errorProvider = new JsonDataProvider({
|
|
387
|
+
data: {}, // Empty data will cause binding to fail
|
|
388
|
+
enableCache: false
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
render(
|
|
392
|
+
<TestWrapper dataProvider={errorProvider}>
|
|
393
|
+
<CardListGrid dataSource="cardListGrids.nonexistent" />
|
|
394
|
+
</TestWrapper>
|
|
395
|
+
);
|
|
396
|
+
|
|
397
|
+
// Currently shows loading state when path not found (expected behavior)
|
|
398
|
+
// TODO: Future enhancement - implement proper error state handling
|
|
399
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
400
|
+
|
|
401
|
+
// Restore environment and console
|
|
402
|
+
process.env.NODE_ENV = originalEnv;
|
|
403
|
+
consoleErrorSpy.mockRestore();
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
describe('Edge Cases', () => {
|
|
408
|
+
it('handles items without id or key properties', () => {
|
|
409
|
+
const itemsWithoutIds = [
|
|
410
|
+
{ name: 'Product A' },
|
|
411
|
+
{ name: 'Product B' }
|
|
412
|
+
];
|
|
413
|
+
|
|
414
|
+
render(
|
|
415
|
+
<TestWrapper>
|
|
416
|
+
<CardListGrid
|
|
417
|
+
items={itemsWithoutIds}
|
|
418
|
+
renderComponent="Custom"
|
|
419
|
+
/>
|
|
420
|
+
</TestWrapper>
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
// Should still render using array index as key
|
|
424
|
+
expect(screen.getByText(/"name":"Product A"/)).toBeInTheDocument();
|
|
425
|
+
expect(screen.getByText(/"name":"Product B"/)).toBeInTheDocument();
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('handles mixed item types gracefully', () => {
|
|
429
|
+
const mixedItems = [
|
|
430
|
+
{ id: 'product', name: 'Product', category: 'Test', description: 'Test product', shortDescription: 'Test', features: [], technologies: [], status: 'launched' }
|
|
431
|
+
];
|
|
432
|
+
|
|
433
|
+
render(
|
|
434
|
+
<TestWrapper>
|
|
435
|
+
<CardListGrid
|
|
436
|
+
items={mixedItems}
|
|
437
|
+
renderComponent="ProductCard"
|
|
438
|
+
/>
|
|
439
|
+
</TestWrapper>
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
// ProductCard should handle the item gracefully
|
|
443
|
+
expect(screen.getByText('Product')).toBeInTheDocument();
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
it('handles extreme column counts', () => {
|
|
447
|
+
const { container } = render(
|
|
448
|
+
<TestWrapper>
|
|
449
|
+
<CardListGrid
|
|
450
|
+
items={sampleProducts}
|
|
451
|
+
renderComponent="ProductCard"
|
|
452
|
+
columns={6}
|
|
453
|
+
/>
|
|
454
|
+
</TestWrapper>
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
// Should render without errors
|
|
458
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
459
|
+
expect(screen.getByText('Test Product 1')).toBeInTheDocument();
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
it('handles different spacing options', () => {
|
|
463
|
+
const { container } = render(
|
|
464
|
+
<TestWrapper>
|
|
465
|
+
<CardListGrid
|
|
466
|
+
items={sampleProducts}
|
|
467
|
+
renderComponent="ProductCard"
|
|
468
|
+
spacing="huge"
|
|
469
|
+
/>
|
|
470
|
+
</TestWrapper>
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
// Should render without errors
|
|
474
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
475
|
+
expect(screen.getByText('Test Product 1')).toBeInTheDocument();
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
});
|