@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,834 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FormBlock Component Stories - Form layout component with data binding support
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Box, Link, Typography } from '@mui/material';
|
|
8
|
+
import { JsonDataProvider } from '@qwickapps/schema';
|
|
9
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
10
|
+
import { Button, Code, FormBlock, QwickApp, QwickAppsLogo, SelectInputField, TextInputField } from '../components';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// Sample form block data for different use cases
|
|
14
|
+
const sampleCmsData = {
|
|
15
|
+
'formBlocks': {
|
|
16
|
+
'login-form': {
|
|
17
|
+
title: 'Welcome Back',
|
|
18
|
+
description: 'Sign in to your account to continue',
|
|
19
|
+
maxWidth: 'sm',
|
|
20
|
+
background: 'default',
|
|
21
|
+
form: null, // Will be provided via children in stories
|
|
22
|
+
footer: null // Will be provided via children in stories
|
|
23
|
+
},
|
|
24
|
+
'registration-form': {
|
|
25
|
+
title: 'Create Your Account',
|
|
26
|
+
description: 'Join thousands of developers building with QwickApps React Framework',
|
|
27
|
+
maxWidth: 'md',
|
|
28
|
+
background: 'gradient',
|
|
29
|
+
form: null,
|
|
30
|
+
footer: null
|
|
31
|
+
},
|
|
32
|
+
'contact-form': {
|
|
33
|
+
title: 'Get In Touch',
|
|
34
|
+
description: 'We\'d love to hear from you. Send us a message and we\'ll respond as soon as possible.',
|
|
35
|
+
maxWidth: 'md',
|
|
36
|
+
background: 'default',
|
|
37
|
+
form: null,
|
|
38
|
+
footer: null
|
|
39
|
+
},
|
|
40
|
+
'survey-form': {
|
|
41
|
+
title: 'Customer Feedback Survey',
|
|
42
|
+
description: 'Help us improve by sharing your thoughts and experiences',
|
|
43
|
+
maxWidth: 'lg',
|
|
44
|
+
background: 'gradient',
|
|
45
|
+
form: null,
|
|
46
|
+
footer: null
|
|
47
|
+
},
|
|
48
|
+
'subscription-form': {
|
|
49
|
+
title: 'Choose Your Plan',
|
|
50
|
+
description: 'Select the perfect plan for your needs and get started today',
|
|
51
|
+
maxWidth: 'md',
|
|
52
|
+
background: 'image',
|
|
53
|
+
backgroundImage: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80',
|
|
54
|
+
form: null,
|
|
55
|
+
footer: null
|
|
56
|
+
},
|
|
57
|
+
'newsletter-form': {
|
|
58
|
+
title: 'Stay Updated',
|
|
59
|
+
description: 'Subscribe to our newsletter for the latest updates and insights',
|
|
60
|
+
maxWidth: 'sm',
|
|
61
|
+
background: 'default',
|
|
62
|
+
form: null,
|
|
63
|
+
footer: null
|
|
64
|
+
},
|
|
65
|
+
'profile-form': {
|
|
66
|
+
title: 'Edit Profile',
|
|
67
|
+
description: 'Update your personal information and preferences',
|
|
68
|
+
maxWidth: 'md',
|
|
69
|
+
background: 'default',
|
|
70
|
+
form: null,
|
|
71
|
+
footer: null
|
|
72
|
+
},
|
|
73
|
+
'feedback-form': {
|
|
74
|
+
title: 'Share Your Feedback',
|
|
75
|
+
description: 'Your input helps us build better products and experiences',
|
|
76
|
+
maxWidth: 'lg',
|
|
77
|
+
background: 'gradient',
|
|
78
|
+
form: null,
|
|
79
|
+
status: 'info',
|
|
80
|
+
message: 'Your feedback is important to us and will be reviewed by our team.'
|
|
81
|
+
},
|
|
82
|
+
'error-form': {
|
|
83
|
+
title: 'Form Submission',
|
|
84
|
+
description: 'There was an issue processing your request',
|
|
85
|
+
maxWidth: 'sm',
|
|
86
|
+
background: 'default',
|
|
87
|
+
form: null,
|
|
88
|
+
status: 'error',
|
|
89
|
+
message: 'Please check your information and try again.'
|
|
90
|
+
},
|
|
91
|
+
'success-form': {
|
|
92
|
+
title: 'Thank You!',
|
|
93
|
+
description: 'Your submission has been received successfully',
|
|
94
|
+
maxWidth: 'sm',
|
|
95
|
+
background: 'default',
|
|
96
|
+
form: null,
|
|
97
|
+
status: 'success',
|
|
98
|
+
message: 'We will get back to you within 24 hours.'
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const dataProvider = new JsonDataProvider({ data: sampleCmsData });
|
|
104
|
+
|
|
105
|
+
const meta = {
|
|
106
|
+
title: 'Forms/FormBlock',
|
|
107
|
+
component: FormBlock,
|
|
108
|
+
parameters: {
|
|
109
|
+
layout: 'fullscreen',
|
|
110
|
+
docs: {
|
|
111
|
+
description: {
|
|
112
|
+
component: `FormBlock is a comprehensive form layout component that provides consistent styling and structure for form interfaces with data binding support.
|
|
113
|
+
|
|
114
|
+
**Key Features:**
|
|
115
|
+
- **Flexible Layouts**: Support for different container widths (xs, sm, md, lg)
|
|
116
|
+
- **Background Variants**: Default, gradient, and image background options
|
|
117
|
+
- **Header Integration**: Built-in header with logo, title, and description
|
|
118
|
+
- **Status Messages**: Alert-style status messages (info, success, warning, error)
|
|
119
|
+
- **Footer Support**: Customizable footer content for links and additional text
|
|
120
|
+
- **Data Binding**: Full CMS integration through dataSource prop
|
|
121
|
+
- **Theme Integration**: Responsive design with theme-aware styling
|
|
122
|
+
- **Accessibility**: Complete ARIA support and proper form structure
|
|
123
|
+
|
|
124
|
+
**Perfect For:**
|
|
125
|
+
- User authentication forms (login, registration, password reset)
|
|
126
|
+
- Contact and inquiry forms
|
|
127
|
+
- Survey and feedback collection
|
|
128
|
+
- Profile and settings management
|
|
129
|
+
- Subscription and payment forms
|
|
130
|
+
- Any form requiring professional layout and presentation`,
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
tags: ['autodocs'],
|
|
135
|
+
} satisfies Meta<typeof FormBlock>;
|
|
136
|
+
|
|
137
|
+
export default meta;
|
|
138
|
+
type Story = StoryObj<typeof FormBlock>;
|
|
139
|
+
|
|
140
|
+
// Traditional Usage Examples
|
|
141
|
+
export const LoginForm: Story = {
|
|
142
|
+
render: () => (
|
|
143
|
+
<QwickApp appId="form-login" appName='Login Form'>
|
|
144
|
+
<FormBlock
|
|
145
|
+
title="Welcome Back"
|
|
146
|
+
description="Sign in to your account to continue"
|
|
147
|
+
maxWidth="sm"
|
|
148
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
149
|
+
form={
|
|
150
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
151
|
+
<TextInputField
|
|
152
|
+
label="Email Address"
|
|
153
|
+
type="email"
|
|
154
|
+
placeholder="your.email@example.com"
|
|
155
|
+
required={true}
|
|
156
|
+
onChange={(value) => console.log('Email:', value)}
|
|
157
|
+
/>
|
|
158
|
+
<TextInputField
|
|
159
|
+
label="Password"
|
|
160
|
+
type="password"
|
|
161
|
+
placeholder="Enter your password"
|
|
162
|
+
required={true}
|
|
163
|
+
onChange={(value) => console.log('Password:', '***')}
|
|
164
|
+
/>
|
|
165
|
+
<Button
|
|
166
|
+
label="Sign In"
|
|
167
|
+
variant="primary"
|
|
168
|
+
fullWidth={true}
|
|
169
|
+
onClick={() => console.log('Login submitted')}
|
|
170
|
+
/>
|
|
171
|
+
</Box>
|
|
172
|
+
}
|
|
173
|
+
footer={
|
|
174
|
+
<Typography variant="body2" color="text.secondary">
|
|
175
|
+
Don't have an account? <Link href="#" color="primary">Sign up here</Link>
|
|
176
|
+
</Typography>
|
|
177
|
+
}
|
|
178
|
+
/>
|
|
179
|
+
</QwickApp>
|
|
180
|
+
),
|
|
181
|
+
parameters: {
|
|
182
|
+
docs: {
|
|
183
|
+
description: {
|
|
184
|
+
story: 'Basic login form with email and password fields in a clean layout.',
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
export const RegistrationForm: Story = {
|
|
191
|
+
render: () => (
|
|
192
|
+
<QwickApp appId="form-registration" appName='Registration Form'>
|
|
193
|
+
<FormBlock
|
|
194
|
+
title="Create Your Account"
|
|
195
|
+
description="Join thousands of developers building with QwickApps React Framework"
|
|
196
|
+
maxWidth="md"
|
|
197
|
+
background="gradient"
|
|
198
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
199
|
+
form={
|
|
200
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
201
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
|
|
202
|
+
<TextInputField
|
|
203
|
+
label="First Name"
|
|
204
|
+
placeholder="John"
|
|
205
|
+
required={true}
|
|
206
|
+
onChange={(value) => console.log('First Name:', value)}
|
|
207
|
+
/>
|
|
208
|
+
<TextInputField
|
|
209
|
+
label="Last Name"
|
|
210
|
+
placeholder="Doe"
|
|
211
|
+
required={true}
|
|
212
|
+
onChange={(value) => console.log('Last Name:', value)}
|
|
213
|
+
/>
|
|
214
|
+
</Box>
|
|
215
|
+
<TextInputField
|
|
216
|
+
label="Email Address"
|
|
217
|
+
type="email"
|
|
218
|
+
placeholder="john.doe@example.com"
|
|
219
|
+
required={true}
|
|
220
|
+
helperText="We'll never share your email address"
|
|
221
|
+
onChange={(value) => console.log('Email:', value)}
|
|
222
|
+
/>
|
|
223
|
+
<TextInputField
|
|
224
|
+
label="Password"
|
|
225
|
+
type="password"
|
|
226
|
+
placeholder="Create a strong password"
|
|
227
|
+
required={true}
|
|
228
|
+
helperText="Minimum 8 characters with mixed case and numbers"
|
|
229
|
+
onChange={(value) => console.log('Password:', '***')}
|
|
230
|
+
/>
|
|
231
|
+
<SelectInputField
|
|
232
|
+
label="Country"
|
|
233
|
+
placeholder="Select your country"
|
|
234
|
+
required={true}
|
|
235
|
+
options={[
|
|
236
|
+
{ label: 'United States', value: 'us' },
|
|
237
|
+
{ label: 'Canada', value: 'ca' },
|
|
238
|
+
{ label: 'United Kingdom', value: 'uk' },
|
|
239
|
+
{ label: 'Germany', value: 'de' },
|
|
240
|
+
{ label: 'Australia', value: 'au' }
|
|
241
|
+
]}
|
|
242
|
+
onChange={(value) => console.log('Country:', value)}
|
|
243
|
+
/>
|
|
244
|
+
<Button
|
|
245
|
+
label="Create Account"
|
|
246
|
+
variant="primary"
|
|
247
|
+
fullWidth={true}
|
|
248
|
+
buttonSize="large"
|
|
249
|
+
onClick={() => console.log('Registration submitted')}
|
|
250
|
+
/>
|
|
251
|
+
</Box>
|
|
252
|
+
}
|
|
253
|
+
footer={
|
|
254
|
+
<Typography variant="body2" color="text.secondary">
|
|
255
|
+
Already have an account? <Link href="#" color="primary">Sign in here</Link>
|
|
256
|
+
</Typography>
|
|
257
|
+
}
|
|
258
|
+
/>
|
|
259
|
+
</QwickApp>
|
|
260
|
+
),
|
|
261
|
+
parameters: {
|
|
262
|
+
docs: {
|
|
263
|
+
description: {
|
|
264
|
+
story: 'Registration form with gradient background and comprehensive user information fields.',
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
export const ContactForm: Story = {
|
|
271
|
+
render: () => (
|
|
272
|
+
<QwickApp appId="form-contact" appName='Contact Form'>
|
|
273
|
+
<FormBlock
|
|
274
|
+
title="Get In Touch"
|
|
275
|
+
description="We'd love to hear from you. Send us a message and we'll respond as soon as possible."
|
|
276
|
+
maxWidth="md"
|
|
277
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
278
|
+
form={
|
|
279
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
280
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
|
|
281
|
+
<TextInputField
|
|
282
|
+
label="Full Name"
|
|
283
|
+
placeholder="Your full name"
|
|
284
|
+
required={true}
|
|
285
|
+
onChange={(value) => console.log('Name:', value)}
|
|
286
|
+
/>
|
|
287
|
+
<TextInputField
|
|
288
|
+
label="Email Address"
|
|
289
|
+
type="email"
|
|
290
|
+
placeholder="your.email@example.com"
|
|
291
|
+
required={true}
|
|
292
|
+
onChange={(value) => console.log('Email:', value)}
|
|
293
|
+
/>
|
|
294
|
+
</Box>
|
|
295
|
+
<TextInputField
|
|
296
|
+
label="Subject"
|
|
297
|
+
placeholder="What is this regarding?"
|
|
298
|
+
required={true}
|
|
299
|
+
onChange={(value) => console.log('Subject:', value)}
|
|
300
|
+
/>
|
|
301
|
+
<TextInputField
|
|
302
|
+
label="Message"
|
|
303
|
+
placeholder="Tell us more about your inquiry..."
|
|
304
|
+
multiline={true}
|
|
305
|
+
rows={5}
|
|
306
|
+
required={true}
|
|
307
|
+
onChange={(value) => console.log('Message:', value)}
|
|
308
|
+
/>
|
|
309
|
+
<Button
|
|
310
|
+
label="Send Message"
|
|
311
|
+
variant="primary"
|
|
312
|
+
fullWidth={true}
|
|
313
|
+
onClick={() => console.log('Contact form submitted')}
|
|
314
|
+
/>
|
|
315
|
+
</Box>
|
|
316
|
+
}
|
|
317
|
+
footer={
|
|
318
|
+
<Typography variant="body2" color="text.secondary" sx={{ textAlign: 'center' }}>
|
|
319
|
+
Need immediate assistance? Call us at <Link href="tel:+1-555-0123" color="primary">+1-555-0123</Link>
|
|
320
|
+
</Typography>
|
|
321
|
+
}
|
|
322
|
+
/>
|
|
323
|
+
</QwickApp>
|
|
324
|
+
),
|
|
325
|
+
parameters: {
|
|
326
|
+
docs: {
|
|
327
|
+
description: {
|
|
328
|
+
story: 'Contact form with comprehensive fields and professional layout.',
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
export const WithStatusMessages: Story = {
|
|
335
|
+
render: () => (
|
|
336
|
+
<QwickApp appId="form-status" appName='QwickApps'>
|
|
337
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
|
|
338
|
+
|
|
339
|
+
{/* Info Status */}
|
|
340
|
+
<FormBlock
|
|
341
|
+
title="Newsletter Signup"
|
|
342
|
+
description="Stay updated with our latest news"
|
|
343
|
+
maxWidth="sm"
|
|
344
|
+
status="info"
|
|
345
|
+
message="Your subscription helps us create better content for you."
|
|
346
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
347
|
+
form={
|
|
348
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
349
|
+
<TextInputField
|
|
350
|
+
label="Email Address"
|
|
351
|
+
type="email"
|
|
352
|
+
placeholder="your.email@example.com"
|
|
353
|
+
required={true}
|
|
354
|
+
onChange={(value) => console.log('Email:', value)}
|
|
355
|
+
/>
|
|
356
|
+
<Button
|
|
357
|
+
label="Subscribe"
|
|
358
|
+
variant="primary"
|
|
359
|
+
fullWidth={true}
|
|
360
|
+
onClick={() => console.log('Newsletter signup')}
|
|
361
|
+
/>
|
|
362
|
+
</Box>
|
|
363
|
+
}
|
|
364
|
+
/>
|
|
365
|
+
|
|
366
|
+
{/* Success Status */}
|
|
367
|
+
<FormBlock
|
|
368
|
+
title="Thank You!"
|
|
369
|
+
description="Your submission has been received"
|
|
370
|
+
maxWidth="sm"
|
|
371
|
+
status="success"
|
|
372
|
+
message="We will get back to you within 24 hours."
|
|
373
|
+
form={
|
|
374
|
+
<Button
|
|
375
|
+
label="Go Back to Homepage"
|
|
376
|
+
variant="outlined"
|
|
377
|
+
fullWidth={true}
|
|
378
|
+
onClick={() => console.log('Back to home')}
|
|
379
|
+
/>
|
|
380
|
+
}
|
|
381
|
+
/>
|
|
382
|
+
|
|
383
|
+
{/* Error Status */}
|
|
384
|
+
<FormBlock
|
|
385
|
+
title="Form Error"
|
|
386
|
+
description="There was an issue processing your request"
|
|
387
|
+
maxWidth="sm"
|
|
388
|
+
status="error"
|
|
389
|
+
message="Please check your information and try again."
|
|
390
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
391
|
+
form={
|
|
392
|
+
<Box sx={{ display: 'flex', gap: 2 }}>
|
|
393
|
+
<Button
|
|
394
|
+
label="Try Again"
|
|
395
|
+
variant="primary"
|
|
396
|
+
fullWidth={true}
|
|
397
|
+
onClick={() => console.log('Retry')}
|
|
398
|
+
/>
|
|
399
|
+
<Button
|
|
400
|
+
label="Contact Support"
|
|
401
|
+
variant="outlined"
|
|
402
|
+
fullWidth={true}
|
|
403
|
+
onClick={() => console.log('Contact support')}
|
|
404
|
+
/>
|
|
405
|
+
</Box>
|
|
406
|
+
}
|
|
407
|
+
/>
|
|
408
|
+
|
|
409
|
+
</Box>
|
|
410
|
+
</QwickApp>
|
|
411
|
+
),
|
|
412
|
+
parameters: {
|
|
413
|
+
docs: {
|
|
414
|
+
description: {
|
|
415
|
+
story: 'Form blocks with different status message types: info, success, and error.',
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
export const BackgroundVariants: Story = {
|
|
422
|
+
render: () => (
|
|
423
|
+
<QwickApp appId="form-backgrounds" appName='Form Background Variants'>
|
|
424
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
425
|
+
|
|
426
|
+
{/* Default Background */}
|
|
427
|
+
<FormBlock
|
|
428
|
+
title="Default Background"
|
|
429
|
+
description="Clean and simple form layout"
|
|
430
|
+
maxWidth="sm"
|
|
431
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
432
|
+
form={
|
|
433
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
434
|
+
<TextInputField
|
|
435
|
+
label="Name"
|
|
436
|
+
placeholder="Your name"
|
|
437
|
+
onChange={(value) => console.log('Name:', value)}
|
|
438
|
+
/>
|
|
439
|
+
<Button label="Submit" variant="primary" fullWidth={true} />
|
|
440
|
+
</Box>
|
|
441
|
+
}
|
|
442
|
+
/>
|
|
443
|
+
|
|
444
|
+
{/* Gradient Background */}
|
|
445
|
+
<FormBlock
|
|
446
|
+
title="Gradient Background"
|
|
447
|
+
description="Eye-catching gradient styling"
|
|
448
|
+
maxWidth="sm"
|
|
449
|
+
background="gradient"
|
|
450
|
+
form={
|
|
451
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
452
|
+
<TextInputField
|
|
453
|
+
label="Name"
|
|
454
|
+
placeholder="Your name"
|
|
455
|
+
onChange={(value) => console.log('Name:', value)}
|
|
456
|
+
/>
|
|
457
|
+
<Button label="Submit" variant="primary" fullWidth={true} />
|
|
458
|
+
</Box>
|
|
459
|
+
}
|
|
460
|
+
/>
|
|
461
|
+
|
|
462
|
+
</Box>
|
|
463
|
+
</QwickApp>
|
|
464
|
+
),
|
|
465
|
+
parameters: {
|
|
466
|
+
docs: {
|
|
467
|
+
description: {
|
|
468
|
+
story: 'FormBlock with different background variants: default and gradient.',
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
// Data Binding Examples
|
|
475
|
+
export const DataBindingBasic: Story = {
|
|
476
|
+
render: () => (
|
|
477
|
+
<QwickApp appId="form-data-binding" appName='FormBlock Data Binding' dataSource={{ dataProvider }}>
|
|
478
|
+
<Box>
|
|
479
|
+
|
|
480
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
481
|
+
<Typography variant="h5" gutterBottom>📊 Data-Driven Form Layout</Typography>
|
|
482
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
483
|
+
FormBlock components can be driven by CMS data, loading layout configuration from your data source while providing custom form content.
|
|
484
|
+
</Typography>
|
|
485
|
+
|
|
486
|
+
<Code title="Usage" language="tsx">{`<FormBlock dataSource="formBlocks.login-form">
|
|
487
|
+
<TextInputField label="Email" type="email" />
|
|
488
|
+
<TextInputField label="Password" type="password" />
|
|
489
|
+
<Button label="Sign In" variant="primary" />
|
|
490
|
+
</FormBlock>`}</Code>
|
|
491
|
+
|
|
492
|
+
<Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.formBlocks['login-form'], null, 2)}</Code>
|
|
493
|
+
</Box>
|
|
494
|
+
|
|
495
|
+
<FormBlock
|
|
496
|
+
dataSource="formBlocks.login-form"
|
|
497
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
498
|
+
form={
|
|
499
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
500
|
+
<TextInputField
|
|
501
|
+
label="Email Address"
|
|
502
|
+
type="email"
|
|
503
|
+
placeholder="your.email@example.com"
|
|
504
|
+
required={true}
|
|
505
|
+
onChange={(value) => console.log('Email:', value)}
|
|
506
|
+
/>
|
|
507
|
+
<TextInputField
|
|
508
|
+
label="Password"
|
|
509
|
+
type="password"
|
|
510
|
+
placeholder="Enter your password"
|
|
511
|
+
required={true}
|
|
512
|
+
onChange={(value) => console.log('Password:', '***')}
|
|
513
|
+
/>
|
|
514
|
+
<Button
|
|
515
|
+
label="Sign In"
|
|
516
|
+
variant="primary"
|
|
517
|
+
fullWidth={true}
|
|
518
|
+
onClick={() => console.log('Login submitted')}
|
|
519
|
+
/>
|
|
520
|
+
</Box>
|
|
521
|
+
}
|
|
522
|
+
footer={
|
|
523
|
+
<Typography variant="body2" color="text.secondary">
|
|
524
|
+
Don't have an account? <Link href="#" color="primary">Sign up here</Link>
|
|
525
|
+
</Typography>
|
|
526
|
+
}
|
|
527
|
+
/>
|
|
528
|
+
|
|
529
|
+
</Box>
|
|
530
|
+
</QwickApp>
|
|
531
|
+
),
|
|
532
|
+
parameters: {
|
|
533
|
+
docs: {
|
|
534
|
+
description: {
|
|
535
|
+
story: 'FormBlock with data binding - layout configuration resolved from CMS data while form content is provided as children.',
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
},
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
export const DataBindingAdvanced: Story = {
|
|
542
|
+
render: () => (
|
|
543
|
+
<QwickApp appId="form-data-advanced" appName='Advanced FormBlock Data Binding' dataSource={{ dataProvider }}>
|
|
544
|
+
<Box>
|
|
545
|
+
|
|
546
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
547
|
+
<Typography variant="h5" gutterBottom>🎯 Multiple Form Types</Typography>
|
|
548
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
549
|
+
Different FormBlock instances can load different layout configurations from separate data sources.
|
|
550
|
+
</Typography>
|
|
551
|
+
</Box>
|
|
552
|
+
|
|
553
|
+
{/* Authentication Forms */}
|
|
554
|
+
<Box sx={{ mb: 6 }}>
|
|
555
|
+
<Typography variant="h4" gutterBottom sx={{ mb: 4 }}>Authentication Forms</Typography>
|
|
556
|
+
|
|
557
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
558
|
+
<FormBlock
|
|
559
|
+
dataSource="formBlocks.login-form"
|
|
560
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
561
|
+
form={
|
|
562
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
563
|
+
<TextInputField
|
|
564
|
+
label="Email"
|
|
565
|
+
type="email"
|
|
566
|
+
placeholder="your.email@example.com"
|
|
567
|
+
required={true}
|
|
568
|
+
/>
|
|
569
|
+
<TextInputField
|
|
570
|
+
label="Password"
|
|
571
|
+
type="password"
|
|
572
|
+
placeholder="Enter password"
|
|
573
|
+
required={true}
|
|
574
|
+
/>
|
|
575
|
+
<Button label="Sign In" variant="primary" fullWidth={true} />
|
|
576
|
+
</Box>
|
|
577
|
+
}
|
|
578
|
+
/>
|
|
579
|
+
|
|
580
|
+
<FormBlock
|
|
581
|
+
dataSource="formBlocks.registration-form"
|
|
582
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
583
|
+
form={
|
|
584
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
585
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
|
|
586
|
+
<TextInputField label="First Name" placeholder="John" required={true} />
|
|
587
|
+
<TextInputField label="Last Name" placeholder="Doe" required={true} />
|
|
588
|
+
</Box>
|
|
589
|
+
<TextInputField label="Email" type="email" placeholder="john@example.com" required={true} />
|
|
590
|
+
<TextInputField label="Password" type="password" placeholder="Create password" required={true} />
|
|
591
|
+
<Button label="Create Account" variant="primary" fullWidth={true} buttonSize="large" />
|
|
592
|
+
</Box>
|
|
593
|
+
}
|
|
594
|
+
/>
|
|
595
|
+
</Box>
|
|
596
|
+
</Box>
|
|
597
|
+
|
|
598
|
+
{/* Communication Forms */}
|
|
599
|
+
<Box sx={{ mb: 6 }}>
|
|
600
|
+
<Typography variant="h4" gutterBottom sx={{ mb: 4 }}>Communication Forms</Typography>
|
|
601
|
+
|
|
602
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
603
|
+
<FormBlock
|
|
604
|
+
dataSource="formBlocks.contact-form"
|
|
605
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
606
|
+
form={
|
|
607
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
608
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
|
|
609
|
+
<TextInputField label="Name" placeholder="Your name" required={true} />
|
|
610
|
+
<TextInputField label="Email" type="email" placeholder="your.email@example.com" required={true} />
|
|
611
|
+
</Box>
|
|
612
|
+
<TextInputField label="Subject" placeholder="What's this about?" required={true} />
|
|
613
|
+
<TextInputField label="Message" multiline={true} rows={4} placeholder="Your message..." required={true} />
|
|
614
|
+
<Button label="Send Message" variant="primary" fullWidth={true} />
|
|
615
|
+
</Box>
|
|
616
|
+
}
|
|
617
|
+
/>
|
|
618
|
+
|
|
619
|
+
<FormBlock
|
|
620
|
+
dataSource="formBlocks.newsletter-form"
|
|
621
|
+
form={
|
|
622
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
623
|
+
<TextInputField label="Email" type="email" placeholder="your.email@example.com" required={true} />
|
|
624
|
+
<Button label="Subscribe" variant="primary" fullWidth={true} />
|
|
625
|
+
</Box>
|
|
626
|
+
}
|
|
627
|
+
/>
|
|
628
|
+
</Box>
|
|
629
|
+
</Box>
|
|
630
|
+
|
|
631
|
+
</Box>
|
|
632
|
+
</QwickApp>
|
|
633
|
+
),
|
|
634
|
+
parameters: {
|
|
635
|
+
docs: {
|
|
636
|
+
description: {
|
|
637
|
+
story: 'Advanced data binding with multiple form types showcasing different layouts and background configurations.',
|
|
638
|
+
},
|
|
639
|
+
},
|
|
640
|
+
},
|
|
641
|
+
};
|
|
642
|
+
|
|
643
|
+
export const DataBindingWithFallback: Story = {
|
|
644
|
+
render: () => (
|
|
645
|
+
<QwickApp appId="form-fallback" appName='FormBlock Data Binding with Fallback' dataSource={{ dataProvider }}>
|
|
646
|
+
<Box>
|
|
647
|
+
|
|
648
|
+
<Box sx={{ p: 4, backgroundColor: 'background.paper', mb: 4 }}>
|
|
649
|
+
<Typography variant="h5" gutterBottom>🛡️ Fallback Support</Typography>
|
|
650
|
+
<Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
|
|
651
|
+
FormBlock components gracefully handle missing data sources with fallback configurations.
|
|
652
|
+
</Typography>
|
|
653
|
+
|
|
654
|
+
<Code title="Fallback Usage" language="tsx">{`<FormBlock
|
|
655
|
+
dataSource="nonexistent.form"
|
|
656
|
+
title="Fallback Form"
|
|
657
|
+
description="This uses fallback configuration"
|
|
658
|
+
maxWidth="sm"
|
|
659
|
+
>
|
|
660
|
+
<TextInputField label="Name" />
|
|
661
|
+
<Button label="Submit" />
|
|
662
|
+
</FormBlock>`}</Code>
|
|
663
|
+
</Box>
|
|
664
|
+
|
|
665
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 6 }}>
|
|
666
|
+
<Box>
|
|
667
|
+
<Typography variant="h6" gutterBottom>Missing Data Source (Fallback)</Typography>
|
|
668
|
+
<FormBlock
|
|
669
|
+
dataSource="nonexistent.form"
|
|
670
|
+
title="Fallback Form"
|
|
671
|
+
description="This uses fallback configuration"
|
|
672
|
+
maxWidth="sm"
|
|
673
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
674
|
+
form={
|
|
675
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
676
|
+
<TextInputField label="Name" placeholder="Your name" />
|
|
677
|
+
<Button label="Submit" variant="primary" fullWidth={true} />
|
|
678
|
+
</Box>
|
|
679
|
+
}
|
|
680
|
+
/>
|
|
681
|
+
</Box>
|
|
682
|
+
<Box>
|
|
683
|
+
<Typography variant="h6" gutterBottom>Valid Data Source</Typography>
|
|
684
|
+
<FormBlock
|
|
685
|
+
dataSource="formBlocks.login-form"
|
|
686
|
+
form={
|
|
687
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
688
|
+
<TextInputField label="Email" type="email" placeholder="your.email@example.com" />
|
|
689
|
+
<TextInputField label="Password" type="password" placeholder="Enter password" />
|
|
690
|
+
<Button label="Sign In" variant="primary" fullWidth={true} />
|
|
691
|
+
</Box>
|
|
692
|
+
}
|
|
693
|
+
/>
|
|
694
|
+
</Box>
|
|
695
|
+
</Box>
|
|
696
|
+
|
|
697
|
+
</Box>
|
|
698
|
+
</QwickApp>
|
|
699
|
+
),
|
|
700
|
+
parameters: {
|
|
701
|
+
docs: {
|
|
702
|
+
description: {
|
|
703
|
+
story: 'FormBlock with fallback configuration when dataSource is missing or unavailable.',
|
|
704
|
+
},
|
|
705
|
+
},
|
|
706
|
+
},
|
|
707
|
+
};
|
|
708
|
+
|
|
709
|
+
export const RealWorldExample: Story = {
|
|
710
|
+
render: () => (
|
|
711
|
+
<QwickApp appId="form-real-world" appName='Real World FormBlock Example' dataSource={{ dataProvider }}>
|
|
712
|
+
<Box>
|
|
713
|
+
|
|
714
|
+
{/* Status Messages Showcase */}
|
|
715
|
+
<Box sx={{ mb: 6 }}>
|
|
716
|
+
<Typography variant="h2" gutterBottom sx={{ textAlign: 'center', mb: 6 }}>Form Status Messages</Typography>
|
|
717
|
+
|
|
718
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
719
|
+
<FormBlock
|
|
720
|
+
dataSource="formBlocks.feedback-form"
|
|
721
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
722
|
+
form={
|
|
723
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
724
|
+
<TextInputField label="Feedback" multiline={true} rows={4} placeholder="Share your thoughts..." />
|
|
725
|
+
<Button label="Submit Feedback" variant="primary" fullWidth={true} />
|
|
726
|
+
</Box>
|
|
727
|
+
}
|
|
728
|
+
/>
|
|
729
|
+
|
|
730
|
+
<FormBlock
|
|
731
|
+
dataSource="formBlocks.success-form"
|
|
732
|
+
form={
|
|
733
|
+
<Button label="Continue" variant="primary" fullWidth={true} />
|
|
734
|
+
}
|
|
735
|
+
/>
|
|
736
|
+
|
|
737
|
+
<FormBlock
|
|
738
|
+
dataSource="formBlocks.error-form"
|
|
739
|
+
form={
|
|
740
|
+
<Box sx={{ display: 'flex', gap: 2 }}>
|
|
741
|
+
<Button label="Try Again" variant="primary" fullWidth={true} />
|
|
742
|
+
<Button label="Get Help" variant="outlined" fullWidth={true} />
|
|
743
|
+
</Box>
|
|
744
|
+
}
|
|
745
|
+
/>
|
|
746
|
+
</Box>
|
|
747
|
+
</Box>
|
|
748
|
+
|
|
749
|
+
{/* Business Forms */}
|
|
750
|
+
<Box sx={{ mb: 6 }}>
|
|
751
|
+
<Typography variant="h2" gutterBottom sx={{ textAlign: 'center', mb: 6 }}>Business Applications</Typography>
|
|
752
|
+
|
|
753
|
+
<FormBlock
|
|
754
|
+
dataSource="formBlocks.subscription-form"
|
|
755
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
756
|
+
form={
|
|
757
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
|
|
758
|
+
<SelectInputField
|
|
759
|
+
label="Subscription Plan"
|
|
760
|
+
placeholder="Choose your plan"
|
|
761
|
+
required={true}
|
|
762
|
+
options={[
|
|
763
|
+
{ label: 'Starter - $9/month', value: 'starter' },
|
|
764
|
+
{ label: 'Professional - $29/month', value: 'professional' },
|
|
765
|
+
{ label: 'Enterprise - $99/month', value: 'enterprise' }
|
|
766
|
+
]}
|
|
767
|
+
/>
|
|
768
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
|
|
769
|
+
<TextInputField label="Full Name" placeholder="John Doe" required={true} />
|
|
770
|
+
<TextInputField label="Email" type="email" placeholder="john@company.com" required={true} />
|
|
771
|
+
</Box>
|
|
772
|
+
<TextInputField label="Company Name" placeholder="Your Company Inc." />
|
|
773
|
+
<Button label="Start Subscription" variant="primary" fullWidth={true} buttonSize="large" />
|
|
774
|
+
</Box>
|
|
775
|
+
}
|
|
776
|
+
footer={
|
|
777
|
+
<Typography variant="body2" color="text.secondary" sx={{ textAlign: 'center' }}>
|
|
778
|
+
Cancel anytime. No hidden fees. <Link href="#" color="primary">View pricing details</Link>
|
|
779
|
+
</Typography>
|
|
780
|
+
}
|
|
781
|
+
/>
|
|
782
|
+
</Box>
|
|
783
|
+
|
|
784
|
+
{/* User Profile Management */}
|
|
785
|
+
<Box>
|
|
786
|
+
<Typography variant="h2" gutterBottom sx={{ textAlign: 'center', mb: 6 }}>User Management</Typography>
|
|
787
|
+
|
|
788
|
+
<FormBlock
|
|
789
|
+
dataSource="formBlocks.profile-form"
|
|
790
|
+
coverImage={<QwickAppsLogo size="medium" />}
|
|
791
|
+
form={
|
|
792
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
|
|
793
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 3 }}>
|
|
794
|
+
<TextInputField label="First Name" placeholder="John" value="John" />
|
|
795
|
+
<TextInputField label="Last Name" placeholder="Doe" value="Doe" />
|
|
796
|
+
</Box>
|
|
797
|
+
<TextInputField label="Email Address" type="email" placeholder="john.doe@example.com" value="john.doe@example.com" />
|
|
798
|
+
<TextInputField label="Phone Number" type="tel" placeholder="+1 (555) 123-4567" />
|
|
799
|
+
<SelectInputField
|
|
800
|
+
label="Country"
|
|
801
|
+
value="us"
|
|
802
|
+
options={[
|
|
803
|
+
{ label: 'United States', value: 'us' },
|
|
804
|
+
{ label: 'Canada', value: 'ca' },
|
|
805
|
+
{ label: 'United Kingdom', value: 'uk' }
|
|
806
|
+
]}
|
|
807
|
+
/>
|
|
808
|
+
<TextInputField
|
|
809
|
+
label="Bio"
|
|
810
|
+
multiline={true}
|
|
811
|
+
rows={3}
|
|
812
|
+
placeholder="Tell us about yourself..."
|
|
813
|
+
value="Senior developer with expertise in React and TypeScript."
|
|
814
|
+
/>
|
|
815
|
+
<Box sx={{ display: 'flex', gap: 2 }}>
|
|
816
|
+
<Button label="Update Profile" variant="primary" fullWidth={true} />
|
|
817
|
+
<Button label="Cancel" variant="outlined" fullWidth={true} />
|
|
818
|
+
</Box>
|
|
819
|
+
</Box>
|
|
820
|
+
}
|
|
821
|
+
/>
|
|
822
|
+
</Box>
|
|
823
|
+
|
|
824
|
+
</Box>
|
|
825
|
+
</QwickApp>
|
|
826
|
+
),
|
|
827
|
+
parameters: {
|
|
828
|
+
docs: {
|
|
829
|
+
description: {
|
|
830
|
+
story: 'Real-world example showing FormBlock in various contexts: status messages, business subscriptions, and user management.',
|
|
831
|
+
},
|
|
832
|
+
},
|
|
833
|
+
},
|
|
834
|
+
};
|