@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,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for Article 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 { Article } from '../blocks/Article';
|
|
12
|
+
import { DataProvider } from '../../contexts/DataContext';
|
|
13
|
+
import { JsonDataProvider } from '@qwickapps/schema';
|
|
14
|
+
import { ThemeProvider, PaletteProvider } from '../../contexts';
|
|
15
|
+
|
|
16
|
+
// Sample HTML content for testing
|
|
17
|
+
const sampleSimpleHtml = `
|
|
18
|
+
<p>This is a simple paragraph.</p>
|
|
19
|
+
<h2>Simple Heading</h2>
|
|
20
|
+
<ul>
|
|
21
|
+
<li>First item</li>
|
|
22
|
+
<li>Second item</li>
|
|
23
|
+
</ul>
|
|
24
|
+
`;
|
|
25
|
+
|
|
26
|
+
const sampleCodeHtml = `
|
|
27
|
+
<h1>Code Examples</h1>
|
|
28
|
+
<p>Here's some JavaScript:</p>
|
|
29
|
+
<pre><code class="language-javascript">function greet(name) {
|
|
30
|
+
return \`Hello, \${name}!\`;
|
|
31
|
+
}</code></pre>
|
|
32
|
+
<p>And a simple inline code: <code>console.log('test')</code></p>
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
const sampleComplexHtml = `
|
|
36
|
+
<header class="blog-header">
|
|
37
|
+
<h1>Blog Title (Should be removed)</h1>
|
|
38
|
+
</header>
|
|
39
|
+
<section class="blog-section" data-padding="large">
|
|
40
|
+
<h2>Section Title</h2>
|
|
41
|
+
<p>Section content with <strong>bold text</strong>.</p>
|
|
42
|
+
<pre><code class="language-python">def hello():
|
|
43
|
+
print("Hello World")</code></pre>
|
|
44
|
+
</section>
|
|
45
|
+
<p>Regular paragraph after section.</p>
|
|
46
|
+
`;
|
|
47
|
+
|
|
48
|
+
const sampleBlogHtml = `
|
|
49
|
+
<h1>Article Title</h1>
|
|
50
|
+
<p>This is the introduction paragraph.</p>
|
|
51
|
+
<h2>Main Section</h2>
|
|
52
|
+
<p>Content with <a href="https://example.com">link</a>.</p>
|
|
53
|
+
<section class="blog-section">
|
|
54
|
+
<h2>Special Section</h2>
|
|
55
|
+
<p>This will be transformed to use Section component.</p>
|
|
56
|
+
</section>
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
// Test data for data binding
|
|
60
|
+
const sampleCmsData = {
|
|
61
|
+
'articles.simple': [{
|
|
62
|
+
html: sampleSimpleHtml,
|
|
63
|
+
skipHeader: false
|
|
64
|
+
}],
|
|
65
|
+
'articles.with-code': [{
|
|
66
|
+
html: sampleCodeHtml,
|
|
67
|
+
skipHeader: false
|
|
68
|
+
}],
|
|
69
|
+
'articles.complex': [{
|
|
70
|
+
html: sampleComplexHtml,
|
|
71
|
+
skipHeader: true
|
|
72
|
+
}],
|
|
73
|
+
'articles.blog-post': [{
|
|
74
|
+
html: sampleBlogHtml,
|
|
75
|
+
skipHeader: true
|
|
76
|
+
}],
|
|
77
|
+
'articles.empty': [{
|
|
78
|
+
html: '',
|
|
79
|
+
skipHeader: false
|
|
80
|
+
}]
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// Wrapper component for tests that need providers
|
|
84
|
+
const TestWrapper: React.FC<{ children: React.ReactNode; dataProvider?: any }> = ({
|
|
85
|
+
children,
|
|
86
|
+
dataProvider
|
|
87
|
+
}) => (
|
|
88
|
+
<ThemeProvider>
|
|
89
|
+
<PaletteProvider>
|
|
90
|
+
{dataProvider ? (
|
|
91
|
+
<DataProvider dataSource={dataProvider}>
|
|
92
|
+
{children}
|
|
93
|
+
</DataProvider>
|
|
94
|
+
) : (
|
|
95
|
+
children
|
|
96
|
+
)}
|
|
97
|
+
</PaletteProvider>
|
|
98
|
+
</ThemeProvider>
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
describe.skip('Article', () => {
|
|
102
|
+
describe('Traditional Props Usage', () => {
|
|
103
|
+
it('renders simple HTML content', () => {
|
|
104
|
+
render(
|
|
105
|
+
<TestWrapper>
|
|
106
|
+
<Article html={sampleSimpleHtml} />
|
|
107
|
+
</TestWrapper>
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
expect(screen.getByText('This is a simple paragraph.')).toBeInTheDocument();
|
|
111
|
+
expect(screen.getByText('Simple Heading')).toBeInTheDocument();
|
|
112
|
+
expect(screen.getByText('First item')).toBeInTheDocument();
|
|
113
|
+
expect(screen.getByText('Second item')).toBeInTheDocument();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('transforms code blocks to Code components', () => {
|
|
117
|
+
render(
|
|
118
|
+
<TestWrapper>
|
|
119
|
+
<Article html={sampleCodeHtml} />
|
|
120
|
+
</TestWrapper>
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
expect(screen.getByText('Code Examples')).toBeInTheDocument();
|
|
124
|
+
expect(screen.getByText('Here\'s some JavaScript:')).toBeInTheDocument();
|
|
125
|
+
|
|
126
|
+
// The code should be transformed to Code component
|
|
127
|
+
expect(screen.getByText(/function greet\(name\)/)).toBeInTheDocument();
|
|
128
|
+
expect(screen.getByText(/return `Hello, \${name}!`;/)).toBeInTheDocument();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('transforms blog sections to Section components', () => {
|
|
132
|
+
render(
|
|
133
|
+
<TestWrapper>
|
|
134
|
+
<Article html={sampleComplexHtml} />
|
|
135
|
+
</TestWrapper>
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
expect(screen.getByText('Section Title')).toBeInTheDocument();
|
|
139
|
+
expect(screen.getByText(/Section content with/)).toBeInTheDocument();
|
|
140
|
+
expect(screen.getByText(/def hello/)).toBeInTheDocument();
|
|
141
|
+
expect(screen.getByText('Regular paragraph after section.')).toBeInTheDocument();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('skips header elements when skipHeader is true', () => {
|
|
145
|
+
render(
|
|
146
|
+
<TestWrapper>
|
|
147
|
+
<Article html={sampleComplexHtml} skipHeader={true} />
|
|
148
|
+
</TestWrapper>
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
// Blog header should be removed
|
|
152
|
+
expect(screen.queryByText('Blog Title (Should be removed)')).not.toBeInTheDocument();
|
|
153
|
+
|
|
154
|
+
// Section content should still be there
|
|
155
|
+
expect(screen.getByText('Section Title')).toBeInTheDocument();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('preserves header elements when skipHeader is false', () => {
|
|
159
|
+
render(
|
|
160
|
+
<TestWrapper>
|
|
161
|
+
<Article html={sampleBlogHtml} skipHeader={false} />
|
|
162
|
+
</TestWrapper>
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
expect(screen.getByText('Article Title')).toBeInTheDocument();
|
|
166
|
+
expect(screen.getByText('This is the introduction paragraph.')).toBeInTheDocument();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('removes first h1 when skipHeader is true', () => {
|
|
170
|
+
render(
|
|
171
|
+
<TestWrapper>
|
|
172
|
+
<Article html={sampleBlogHtml} skipHeader={true} />
|
|
173
|
+
</TestWrapper>
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
// First H1 should be removed
|
|
177
|
+
expect(screen.queryByText('Article Title')).not.toBeInTheDocument();
|
|
178
|
+
|
|
179
|
+
// Other content should remain
|
|
180
|
+
expect(screen.getByText('This is the introduction paragraph.')).toBeInTheDocument();
|
|
181
|
+
expect(screen.getByText('Main Section')).toBeInTheDocument();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('shows empty state when no HTML content', () => {
|
|
185
|
+
render(
|
|
186
|
+
<TestWrapper>
|
|
187
|
+
<Article html="" />
|
|
188
|
+
</TestWrapper>
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
expect(screen.getByText('No Content Available')).toBeInTheDocument();
|
|
192
|
+
expect(screen.getByText('No HTML content provided for this article')).toBeInTheDocument();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('handles missing html prop gracefully', () => {
|
|
196
|
+
render(
|
|
197
|
+
<TestWrapper>
|
|
198
|
+
<Article />
|
|
199
|
+
</TestWrapper>
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
expect(screen.getByText('No Content Available')).toBeInTheDocument();
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('preserves HTML attributes and structure', () => {
|
|
206
|
+
const htmlWithAttributes = '<div id="test-content" class="custom-class"><p data-attr="value">Content</p></div>';
|
|
207
|
+
|
|
208
|
+
const { container } = render(
|
|
209
|
+
<TestWrapper>
|
|
210
|
+
<Article html={htmlWithAttributes} />
|
|
211
|
+
</TestWrapper>
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
// Should preserve the div with its attributes
|
|
215
|
+
expect(container.querySelector('#test-content')).toBeInTheDocument();
|
|
216
|
+
expect(container.querySelector('.custom-class')).toBeInTheDocument();
|
|
217
|
+
expect(screen.getByText('Content')).toBeInTheDocument();
|
|
218
|
+
|
|
219
|
+
// Note: data attributes might be transformed by React/SafeSpan
|
|
220
|
+
// Let's just check that the content is rendered properly
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe.skip('Data Binding Usage', () => {
|
|
225
|
+
let dataProvider: JsonDataProvider;
|
|
226
|
+
|
|
227
|
+
beforeEach(() => {
|
|
228
|
+
dataProvider = new JsonDataProvider({ data: sampleCmsData });
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('renders with dataSource prop (simple content)', async () => {
|
|
232
|
+
render(
|
|
233
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
234
|
+
<Article dataSource="articles.simple" />
|
|
235
|
+
</TestWrapper>
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
await screen.findByText('This is a simple paragraph.');
|
|
239
|
+
expect(screen.getByText('Simple Heading')).toBeInTheDocument();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('renders with dataSource prop (code content)', async () => {
|
|
243
|
+
render(
|
|
244
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
245
|
+
<Article dataSource="articles.with-code" />
|
|
246
|
+
</TestWrapper>
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
await screen.findByText('Code Examples');
|
|
250
|
+
expect(screen.getByText(/function greet\(name\)/)).toBeInTheDocument();
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it('shows loading state while data is loading', () => {
|
|
254
|
+
render(
|
|
255
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
256
|
+
<Article dataSource="articles.nonexistent" />
|
|
257
|
+
</TestWrapper>
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
expect(screen.getByText('Loading Article...')).toBeInTheDocument();
|
|
261
|
+
expect(screen.getByText('Loading')).toBeInTheDocument();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('uses fallback props when dataSource has no content', async () => {
|
|
265
|
+
render(
|
|
266
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
267
|
+
<Article
|
|
268
|
+
dataSource="articles.nonexistent-key"
|
|
269
|
+
html={sampleSimpleHtml}
|
|
270
|
+
/>
|
|
271
|
+
</TestWrapper>
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
// Should eventually show the fallback content
|
|
275
|
+
await screen.findByText('This is a simple paragraph.');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('handles skipHeader from data binding', async () => {
|
|
279
|
+
render(
|
|
280
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
281
|
+
<Article dataSource="articles.complex" />
|
|
282
|
+
</TestWrapper>
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
// Should load with skipHeader: true from data
|
|
286
|
+
await screen.findByText('Section Title');
|
|
287
|
+
|
|
288
|
+
// Header should be removed due to skipHeader: true
|
|
289
|
+
expect(screen.queryByText('Blog Title (Should be removed)')).not.toBeInTheDocument();
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('works with custom binding options', async () => {
|
|
293
|
+
render(
|
|
294
|
+
<TestWrapper dataProvider={dataProvider}>
|
|
295
|
+
<Article
|
|
296
|
+
dataSource="articles.simple"
|
|
297
|
+
bindingOptions={{ cache: false, strict: true }}
|
|
298
|
+
/>
|
|
299
|
+
</TestWrapper>
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
await screen.findByText('This is a simple paragraph.');
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
describe('Edge Cases', () => {
|
|
307
|
+
it('handles malformed HTML gracefully', () => {
|
|
308
|
+
const malformedHtml = '<p>Unclosed paragraph <div><span>Nested content</div>';
|
|
309
|
+
|
|
310
|
+
render(
|
|
311
|
+
<TestWrapper>
|
|
312
|
+
<Article html={malformedHtml} />
|
|
313
|
+
</TestWrapper>
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Should render without crashing
|
|
317
|
+
expect(screen.getByText(/Unclosed paragraph/)).toBeInTheDocument();
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('handles HTML with only whitespace', () => {
|
|
321
|
+
render(
|
|
322
|
+
<TestWrapper>
|
|
323
|
+
<Article html=" \n \t " />
|
|
324
|
+
</TestWrapper>
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
// Article should render but might be empty due to whitespace handling
|
|
328
|
+
// Let's just verify it doesn't crash
|
|
329
|
+
expect(screen.getByRole('article')).toBeInTheDocument();
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it('handles nested code blocks correctly', () => {
|
|
333
|
+
const nestedCodeHtml = `
|
|
334
|
+
<div>
|
|
335
|
+
<p>Here's a code example:</p>
|
|
336
|
+
<pre><code class="language-html"><div><code>nested</code></div></code></pre>
|
|
337
|
+
</div>
|
|
338
|
+
`;
|
|
339
|
+
|
|
340
|
+
render(
|
|
341
|
+
<TestWrapper>
|
|
342
|
+
<Article html={nestedCodeHtml} />
|
|
343
|
+
</TestWrapper>
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
expect(screen.getByText('Here\'s a code example:')).toBeInTheDocument();
|
|
347
|
+
// The nested code should be preserved in the Code component
|
|
348
|
+
expect(screen.getByText(/<div><code>nested<\/code><\/div>/)).toBeInTheDocument();
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it('handles multiple blog sections', () => {
|
|
352
|
+
const multipleSectionsHtml = `
|
|
353
|
+
<section class="blog-section">
|
|
354
|
+
<h2>First Section</h2>
|
|
355
|
+
<p>First content</p>
|
|
356
|
+
</section>
|
|
357
|
+
<section class="blog-section">
|
|
358
|
+
<h2>Second Section</h2>
|
|
359
|
+
<p>Second content</p>
|
|
360
|
+
</section>
|
|
361
|
+
`;
|
|
362
|
+
|
|
363
|
+
render(
|
|
364
|
+
<TestWrapper>
|
|
365
|
+
<Article html={multipleSectionsHtml} />
|
|
366
|
+
</TestWrapper>
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
expect(screen.getByText('First Section')).toBeInTheDocument();
|
|
370
|
+
expect(screen.getByText('First content')).toBeInTheDocument();
|
|
371
|
+
expect(screen.getByText('Second Section')).toBeInTheDocument();
|
|
372
|
+
expect(screen.getByText('Second content')).toBeInTheDocument();
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it('handles inline code within paragraphs correctly', () => {
|
|
376
|
+
const inlineCodeHtml = '<p>Use <code>console.log()</code> for debugging and <code>alert()</code> for notifications.</p>';
|
|
377
|
+
|
|
378
|
+
render(
|
|
379
|
+
<TestWrapper>
|
|
380
|
+
<Article html={inlineCodeHtml} />
|
|
381
|
+
</TestWrapper>
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
// Inline code should not be transformed to Code component
|
|
385
|
+
expect(screen.getByText(/Use.*for debugging and.*for notifications/)).toBeInTheDocument();
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
it('preserves complex HTML structure', () => {
|
|
389
|
+
const complexStructure = `
|
|
390
|
+
<div class="container">
|
|
391
|
+
<article>
|
|
392
|
+
<h1>Title</h1>
|
|
393
|
+
<div class="meta">
|
|
394
|
+
<span class="author">Author</span>
|
|
395
|
+
<time datetime="2023-01-01">2023-01-01</time>
|
|
396
|
+
</div>
|
|
397
|
+
<div class="content">
|
|
398
|
+
<p>Content paragraph</p>
|
|
399
|
+
</div>
|
|
400
|
+
</article>
|
|
401
|
+
</div>
|
|
402
|
+
`;
|
|
403
|
+
|
|
404
|
+
const { container } = render(
|
|
405
|
+
<TestWrapper>
|
|
406
|
+
<Article html={complexStructure} />
|
|
407
|
+
</TestWrapper>
|
|
408
|
+
);
|
|
409
|
+
|
|
410
|
+
expect(screen.getByText('Title')).toBeInTheDocument();
|
|
411
|
+
expect(screen.getByText('Author')).toBeInTheDocument();
|
|
412
|
+
expect(screen.getByText('Content paragraph')).toBeInTheDocument();
|
|
413
|
+
expect(screen.getByText('2023-01-01')).toBeInTheDocument();
|
|
414
|
+
|
|
415
|
+
// Basic structure should be preserved
|
|
416
|
+
expect(container.querySelector('.container')).toBeInTheDocument();
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|