@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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TextField - Enhanced text input component with base props support
|
|
3
|
+
*
|
|
4
|
+
* A QwickApps-enhanced version of Material-UI TextField with:
|
|
5
|
+
* - Standardized dimension and spacing props
|
|
6
|
+
* - Grid behavior support for ColumnLayout
|
|
7
|
+
* - Consistent theming and styling
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import React from 'react';
|
|
13
|
+
import { TextField as MuiTextField, TextFieldProps as MuiTextFieldProps } from '@mui/material';
|
|
14
|
+
import { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
|
|
15
|
+
|
|
16
|
+
export interface TextFieldProps extends WithBaseProps<Omit<MuiTextFieldProps, 'sx' | 'className' | 'style'>> {
|
|
17
|
+
// Additional QwickApps-specific props can be added here
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const TextField = React.forwardRef<HTMLDivElement, TextFieldProps>((props, ref) => {
|
|
21
|
+
const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
|
|
22
|
+
|
|
23
|
+
// Mark as QwickApp component
|
|
24
|
+
(TextField as any)[QWICKAPP_COMPONENT] = true;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<MuiTextField
|
|
28
|
+
ref={ref}
|
|
29
|
+
{...restProps}
|
|
30
|
+
{...htmlProps}
|
|
31
|
+
{...styleProps}
|
|
32
|
+
// Store grid props as data attributes for ColumnLayout to pick up
|
|
33
|
+
{...(gridProps && {
|
|
34
|
+
'data-grid-span': gridProps.span,
|
|
35
|
+
'data-grid-xs': gridProps.xs,
|
|
36
|
+
'data-grid-sm': gridProps.sm,
|
|
37
|
+
'data-grid-md': gridProps.md,
|
|
38
|
+
'data-grid-lg': gridProps.lg,
|
|
39
|
+
'data-grid-xl': gridProps.xl,
|
|
40
|
+
})}
|
|
41
|
+
/>
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
TextField.displayName = 'TextField';
|
|
46
|
+
|
|
47
|
+
export default TextField;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TextInputField - Reusable text input component with consistent styling
|
|
3
|
+
*
|
|
4
|
+
* Provides a standardized text field with:
|
|
5
|
+
* - Consistent Material-UI styling
|
|
6
|
+
* - Data binding support
|
|
7
|
+
* - Focus handling
|
|
8
|
+
* - Validation and error states
|
|
9
|
+
* - Support for multiline/textarea mode
|
|
10
|
+
*
|
|
11
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import React from 'react';
|
|
15
|
+
import { TextField, TextFieldProps, Paper, Typography } from '@mui/material';
|
|
16
|
+
import type { WithDataBinding, ModelProps } from '@qwickapps/schema';
|
|
17
|
+
import { QWICKAPP_COMPONENT, useBaseProps } from '../../hooks';
|
|
18
|
+
import { useDataBinding } from '../../hooks';
|
|
19
|
+
import TextInputFieldModel from '../../schemas/TextInputFieldSchema';
|
|
20
|
+
|
|
21
|
+
type TextInputFieldViewProps = ModelProps<TextInputFieldModel> & {
|
|
22
|
+
/** Change handler */
|
|
23
|
+
onChange?: (value: string) => void;
|
|
24
|
+
/** Focus handler */
|
|
25
|
+
onFocus?: () => void;
|
|
26
|
+
/** Additional TextField props */
|
|
27
|
+
textFieldProps?: Omit<TextFieldProps, 'label' | 'value' | 'onChange' | 'onFocus' | 'required' | 'disabled' | 'error' | 'helperText' | 'placeholder' | 'type' | 'multiline' | 'rows' | 'maxRows'>;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export interface TextInputFieldProps extends TextInputFieldViewProps, WithDataBinding {}
|
|
31
|
+
|
|
32
|
+
// View component - handles the actual rendering
|
|
33
|
+
function TextInputFieldView({
|
|
34
|
+
label,
|
|
35
|
+
value = '',
|
|
36
|
+
onChange,
|
|
37
|
+
onFocus,
|
|
38
|
+
required = false,
|
|
39
|
+
disabled = false,
|
|
40
|
+
error,
|
|
41
|
+
helperText,
|
|
42
|
+
placeholder,
|
|
43
|
+
type = 'text',
|
|
44
|
+
multiline = false,
|
|
45
|
+
rows,
|
|
46
|
+
maxRows,
|
|
47
|
+
textFieldProps,
|
|
48
|
+
...restProps
|
|
49
|
+
}: TextInputFieldViewProps) {
|
|
50
|
+
const { styleProps, htmlProps, restProps: otherProps } = useBaseProps(restProps);
|
|
51
|
+
|
|
52
|
+
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
53
|
+
onChange?.(event.target.value);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<TextField
|
|
58
|
+
{...htmlProps}
|
|
59
|
+
{...styleProps}
|
|
60
|
+
fullWidth
|
|
61
|
+
label={label}
|
|
62
|
+
value={value}
|
|
63
|
+
onChange={handleChange}
|
|
64
|
+
onFocus={onFocus}
|
|
65
|
+
required={required}
|
|
66
|
+
disabled={disabled}
|
|
67
|
+
error={!!error}
|
|
68
|
+
helperText={error || helperText}
|
|
69
|
+
placeholder={placeholder}
|
|
70
|
+
type={type}
|
|
71
|
+
multiline={multiline}
|
|
72
|
+
rows={rows}
|
|
73
|
+
maxRows={maxRows}
|
|
74
|
+
{...textFieldProps}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* TextInputField component with data binding support
|
|
81
|
+
* Supports both traditional props and dataSource-driven rendering
|
|
82
|
+
*/
|
|
83
|
+
function TextInputField(props: TextInputFieldProps) {
|
|
84
|
+
const { dataSource, bindingOptions, ...restProps } = props;
|
|
85
|
+
|
|
86
|
+
// If no dataSource, use traditional props
|
|
87
|
+
if (!dataSource) {
|
|
88
|
+
return <TextInputFieldView {...restProps} />;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Use data binding
|
|
92
|
+
const { dataSource: _source, loading, error, cached, ...textInputFieldProps } = useDataBinding<TextInputFieldModel>(
|
|
93
|
+
dataSource,
|
|
94
|
+
restProps as Partial<TextInputFieldModel>,
|
|
95
|
+
TextInputFieldModel.getSchema(),
|
|
96
|
+
{ cache: true, cacheTTL: 300000, strict: false, ...bindingOptions }
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
// Show loading state
|
|
100
|
+
if (loading) {
|
|
101
|
+
return (
|
|
102
|
+
<Paper
|
|
103
|
+
variant="outlined"
|
|
104
|
+
sx={{
|
|
105
|
+
p: 3,
|
|
106
|
+
textAlign: 'center'
|
|
107
|
+
}}
|
|
108
|
+
>
|
|
109
|
+
<Typography variant="body2">Loading TextInputField...</Typography>
|
|
110
|
+
<Typography variant="caption" color="text.secondary">
|
|
111
|
+
Loading text input field from data source...
|
|
112
|
+
</Typography>
|
|
113
|
+
</Paper>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (error) {
|
|
118
|
+
console.error('Error loading text input field:', error);
|
|
119
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
120
|
+
return (
|
|
121
|
+
<Paper
|
|
122
|
+
variant="outlined"
|
|
123
|
+
sx={{
|
|
124
|
+
p: 3,
|
|
125
|
+
textAlign: 'center',
|
|
126
|
+
borderColor: 'error.main'
|
|
127
|
+
}}
|
|
128
|
+
>
|
|
129
|
+
<Typography variant="body2" color="error">
|
|
130
|
+
Error loading text input field: {error.message}
|
|
131
|
+
</Typography>
|
|
132
|
+
</Paper>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return <TextInputFieldView {...textInputFieldProps} />;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Mark as QwickApp component
|
|
142
|
+
(TextInputField as any)[QWICKAPP_COMPONENT] = true;
|
|
143
|
+
|
|
144
|
+
export default TextInputField;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input components export
|
|
3
|
+
*
|
|
4
|
+
* Enhanced input components with QwickApps base props support
|
|
5
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
6
|
+
*/
|
|
7
|
+
export { default as ChoiceInputField } from './ChoiceInputField';
|
|
8
|
+
export { default as HtmlInputField } from './HtmlInputField';
|
|
9
|
+
export { default as SelectInputField } from './SelectInputField';
|
|
10
|
+
export { default as TextField } from './TextField';
|
|
11
|
+
export { default as TextInputField } from './TextInputField';
|
|
12
|
+
|
|
13
|
+
export type { ChoiceInputFieldProps } from './ChoiceInputField';
|
|
14
|
+
export type { HtmlInputFieldProps } from './HtmlInputField';
|
|
15
|
+
export type { SelectInputFieldProps, SelectOption } from './SelectInputField';
|
|
16
|
+
export type { TextFieldProps } from './TextField';
|
|
17
|
+
export type { TextInputFieldProps } from './TextInputField';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GridCell - Simple cell wrapper for GridLayout
|
|
3
|
+
*
|
|
4
|
+
* A lightweight wrapper that applies grid props to any content
|
|
5
|
+
* Uses the base props pattern for consistency
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import { Box } from '@mui/material';
|
|
12
|
+
import { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
|
|
13
|
+
|
|
14
|
+
export interface GridCellProps extends WithBaseProps {
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const GridCell: React.FC<GridCellProps> = (props) => {
|
|
19
|
+
const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
|
|
20
|
+
|
|
21
|
+
// Mark as QwickApp component
|
|
22
|
+
(GridCell as any)[QWICKAPP_COMPONENT] = true;
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Box
|
|
26
|
+
{...htmlProps}
|
|
27
|
+
{...styleProps}
|
|
28
|
+
{...restProps}
|
|
29
|
+
// Store grid props as data attributes for GridLayout to pick up
|
|
30
|
+
{...(gridProps && {
|
|
31
|
+
'data-grid-span': gridProps.span,
|
|
32
|
+
'data-grid-xs': gridProps.xs,
|
|
33
|
+
'data-grid-sm': gridProps.sm,
|
|
34
|
+
'data-grid-md': gridProps.md,
|
|
35
|
+
'data-grid-lg': gridProps.lg,
|
|
36
|
+
'data-grid-xl': gridProps.xl,
|
|
37
|
+
})}
|
|
38
|
+
>
|
|
39
|
+
{(restProps as any).children}
|
|
40
|
+
</Box>
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
GridCell.displayName = 'GridCell';
|
|
45
|
+
|
|
46
|
+
export default GridCell;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GridCellWrapper - Responsive grid cell wrapper for layout consistency
|
|
3
|
+
*
|
|
4
|
+
* This component provides a flexible wrapper for content within a Material-UI Grid,
|
|
5
|
+
* supporting responsive sizing, full-width option, and easy integration with form fields or layout elements.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Responsive grid sizing via breakpoint props (xs, sm, md, lg, xl)
|
|
9
|
+
* - Optional fullWidth prop to force cell to span all columns
|
|
10
|
+
* - Passes additional GridProps for customization
|
|
11
|
+
* - Designed for use in forms and layouts needing consistent grid behavior
|
|
12
|
+
*
|
|
13
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import React from 'react';
|
|
17
|
+
import { Grid, GridProps } from '@mui/material';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Props for GridCellWrapper
|
|
21
|
+
* @property children - Content to render inside the grid cell
|
|
22
|
+
* @property xs, sm, md, lg, xl - Grid breakpoint sizes (number or 'auto')
|
|
23
|
+
* @property fullWidth - If true, cell spans all columns (xs=12)
|
|
24
|
+
* @property ...gridProps - Additional GridProps except 'item' and 'children'
|
|
25
|
+
*/
|
|
26
|
+
export interface GridCellWrapperProps extends Omit<GridProps, 'children'> {
|
|
27
|
+
/** Content to render inside the grid cell */
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
/** Grid breakpoint size for extra-small screens */
|
|
30
|
+
xs?: number | 'auto';
|
|
31
|
+
/** Grid breakpoint size for small screens */
|
|
32
|
+
sm?: number | 'auto';
|
|
33
|
+
/** Grid breakpoint size for medium screens */
|
|
34
|
+
md?: number | 'auto';
|
|
35
|
+
/** Grid breakpoint size for large screens */
|
|
36
|
+
lg?: number | 'auto';
|
|
37
|
+
/** Grid breakpoint size for extra-large screens */
|
|
38
|
+
xl?: number | 'auto';
|
|
39
|
+
/** If true, cell spans all columns (xs=12) */
|
|
40
|
+
fullWidth?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* GridCellWrapper component
|
|
45
|
+
* Wraps content in a Material-UI Grid cell with responsive sizing and full-width option.
|
|
46
|
+
*/
|
|
47
|
+
const GridCellWrapper: React.FC<GridCellWrapperProps> = ({
|
|
48
|
+
children,
|
|
49
|
+
xs = 12,
|
|
50
|
+
sm,
|
|
51
|
+
md,
|
|
52
|
+
lg,
|
|
53
|
+
xl,
|
|
54
|
+
fullWidth = false,
|
|
55
|
+
...gridProps
|
|
56
|
+
}) => {
|
|
57
|
+
// If fullWidth is true, force size=12; otherwise build responsive size object for MUI v6
|
|
58
|
+
const responsiveSizing = fullWidth
|
|
59
|
+
? { size: 12 }
|
|
60
|
+
: (() => {
|
|
61
|
+
const sizeConfig: any = {};
|
|
62
|
+
if (xs !== undefined) sizeConfig.xs = xs;
|
|
63
|
+
if (sm !== undefined) sizeConfig.sm = sm;
|
|
64
|
+
if (md !== undefined) sizeConfig.md = md;
|
|
65
|
+
if (lg !== undefined) sizeConfig.lg = lg;
|
|
66
|
+
if (xl !== undefined) sizeConfig.xl = xl;
|
|
67
|
+
|
|
68
|
+
// If only one value provided, use it as a simple size value
|
|
69
|
+
const definedBreakpoints = Object.keys(sizeConfig);
|
|
70
|
+
if (definedBreakpoints.length === 1 && xs !== undefined && sm === undefined && md === undefined && lg === undefined && xl === undefined) {
|
|
71
|
+
return { size: xs };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return { size: sizeConfig };
|
|
75
|
+
})();
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<Grid
|
|
79
|
+
{...responsiveSizing}
|
|
80
|
+
{...gridProps}
|
|
81
|
+
>
|
|
82
|
+
{children}
|
|
83
|
+
</Grid>
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export default GridCellWrapper;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GridLayout - Flexible grid layout component
|
|
3
|
+
*
|
|
4
|
+
* Works with any component that has grid props (span, xs, sm, md, lg, xl)
|
|
5
|
+
* Automatically wraps components in Grid when grid props are detected
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import { Grid, SxProps, Theme } from '@mui/material';
|
|
12
|
+
import { SpacingValue, resolveSpacing } from '../../utils/spacing';
|
|
13
|
+
import { DimensionValue, resolveDimension } from '../../utils/dimensions';
|
|
14
|
+
import { QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
|
|
15
|
+
|
|
16
|
+
export interface GridLayoutProps {
|
|
17
|
+
/** Layout children - any components with grid props work */
|
|
18
|
+
children: React.ReactNode;
|
|
19
|
+
/** Number of equal-width columns (auto-distribution) */
|
|
20
|
+
columns?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
21
|
+
/** Spacing between columns */
|
|
22
|
+
spacing?: SpacingValue;
|
|
23
|
+
/** Equal height columns */
|
|
24
|
+
equalHeight?: boolean;
|
|
25
|
+
/** Layout dimensions */
|
|
26
|
+
height?: DimensionValue;
|
|
27
|
+
width?: DimensionValue;
|
|
28
|
+
minHeight?: DimensionValue;
|
|
29
|
+
minWidth?: DimensionValue;
|
|
30
|
+
maxHeight?: DimensionValue;
|
|
31
|
+
maxWidth?: DimensionValue;
|
|
32
|
+
/** Additional CSS class */
|
|
33
|
+
className?: string;
|
|
34
|
+
/** Custom styles */
|
|
35
|
+
sx?: SxProps<Theme>;
|
|
36
|
+
/** Inline styles */
|
|
37
|
+
style?: React.CSSProperties;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const GridLayout: React.FC<GridLayoutProps> = ({
|
|
41
|
+
children,
|
|
42
|
+
columns,
|
|
43
|
+
spacing = 'small',
|
|
44
|
+
equalHeight = false,
|
|
45
|
+
height,
|
|
46
|
+
width,
|
|
47
|
+
minHeight,
|
|
48
|
+
minWidth,
|
|
49
|
+
maxHeight,
|
|
50
|
+
maxWidth,
|
|
51
|
+
className,
|
|
52
|
+
sx,
|
|
53
|
+
style,
|
|
54
|
+
}) => {
|
|
55
|
+
const resolvedSpacing = resolveSpacing(spacing, 'gap');
|
|
56
|
+
|
|
57
|
+
// Process children to handle grid props
|
|
58
|
+
const processChildren = () => {
|
|
59
|
+
const childArray = React.Children.toArray(children);
|
|
60
|
+
|
|
61
|
+
return childArray.map((child, index) => {
|
|
62
|
+
if (!React.isValidElement(child)) {
|
|
63
|
+
return child;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Extract grid props from data attributes or props
|
|
67
|
+
let gridProps: any = {};
|
|
68
|
+
|
|
69
|
+
// Check if it's a QwickApp component
|
|
70
|
+
const isQwickApp = (child.type as any)?.[QWICKAPP_COMPONENT];
|
|
71
|
+
|
|
72
|
+
// Extract grid props from both data attributes (QwickApp) and direct props (regular)
|
|
73
|
+
const props = child.props as any;
|
|
74
|
+
const span = props['data-grid-span'] || props.span;
|
|
75
|
+
const xs = props['data-grid-xs'] || props.xs;
|
|
76
|
+
const sm = props['data-grid-sm'] || props.sm;
|
|
77
|
+
const md = props['data-grid-md'] || props.md;
|
|
78
|
+
const lg = props['data-grid-lg'] || props.lg;
|
|
79
|
+
const xl = props['data-grid-xl'] || props.xl;
|
|
80
|
+
|
|
81
|
+
if (span || xs || sm || md || lg || xl) {
|
|
82
|
+
// Use span if available, otherwise use breakpoint values
|
|
83
|
+
if (span) {
|
|
84
|
+
gridProps = {
|
|
85
|
+
size: span,
|
|
86
|
+
};
|
|
87
|
+
} else {
|
|
88
|
+
// Build responsive size object for MUI v6
|
|
89
|
+
const sizeConfig: any = {};
|
|
90
|
+
if (xs) sizeConfig.xs = xs;
|
|
91
|
+
if (sm) sizeConfig.sm = sm;
|
|
92
|
+
if (md) sizeConfig.md = md;
|
|
93
|
+
if (lg) sizeConfig.lg = lg;
|
|
94
|
+
if (xl) sizeConfig.xl = xl;
|
|
95
|
+
|
|
96
|
+
gridProps = {
|
|
97
|
+
size: sizeConfig,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// If columns prop is set and no grid props, auto-distribute responsively
|
|
103
|
+
if (columns && Object.keys(gridProps).length === 0) {
|
|
104
|
+
// Make responsive: single column on mobile, fewer columns on tablet, full columns on desktop
|
|
105
|
+
gridProps = {
|
|
106
|
+
size: {
|
|
107
|
+
xs: 12, // Single column on mobile
|
|
108
|
+
sm: columns >= 3 ? 6 : 12 / Math.min(columns, 2), // 2 columns max on small screens
|
|
109
|
+
md: 12 / Math.min(columns, 3), // 3 columns max on medium screens
|
|
110
|
+
lg: 12 / columns, // Full columns on large screens
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// If has grid props, wrap in Grid
|
|
116
|
+
if (Object.keys(gridProps).length > 0) {
|
|
117
|
+
// Clean grid data attributes from child to avoid duplication
|
|
118
|
+
const cleanedProps = { ...child.props };
|
|
119
|
+
delete cleanedProps['data-grid-span'];
|
|
120
|
+
delete cleanedProps['data-grid-xs'];
|
|
121
|
+
delete cleanedProps['data-grid-sm'];
|
|
122
|
+
delete cleanedProps['data-grid-md'];
|
|
123
|
+
delete cleanedProps['data-grid-lg'];
|
|
124
|
+
delete cleanedProps['data-grid-xl'];
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<Grid key={child.key || index} {...gridProps}>
|
|
128
|
+
{React.cloneElement(child, cleanedProps)}
|
|
129
|
+
</Grid>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return child;
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<Grid
|
|
139
|
+
container
|
|
140
|
+
spacing={resolvedSpacing}
|
|
141
|
+
className={className}
|
|
142
|
+
sx={{
|
|
143
|
+
width: '100%', // Ensure full width by default in MUI v6
|
|
144
|
+
height: resolveDimension(height, 'height'),
|
|
145
|
+
minHeight: resolveDimension(minHeight, 'minHeight'),
|
|
146
|
+
minWidth: resolveDimension(minWidth, 'minWidth'),
|
|
147
|
+
maxHeight: resolveDimension(maxHeight, 'maxHeight'),
|
|
148
|
+
maxWidth: resolveDimension(maxWidth, 'maxWidth'),
|
|
149
|
+
...(width && { width: resolveDimension(width, 'width') }), // Override only if explicitly set
|
|
150
|
+
...(equalHeight && {
|
|
151
|
+
alignItems: 'stretch',
|
|
152
|
+
'& > .MuiGrid-item': {
|
|
153
|
+
display: 'flex',
|
|
154
|
+
'& > *': {
|
|
155
|
+
width: '100%',
|
|
156
|
+
height: '100%',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
}),
|
|
160
|
+
...sx,
|
|
161
|
+
}}
|
|
162
|
+
style={style}
|
|
163
|
+
>
|
|
164
|
+
{processChildren()}
|
|
165
|
+
</Grid>
|
|
166
|
+
);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
export default GridLayout;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout components export
|
|
3
|
+
*
|
|
4
|
+
* Layout components using the new base props pattern
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export { GridLayout } from './GridLayout';
|
|
10
|
+
export type { GridLayoutProps } from './GridLayout';
|
|
11
|
+
|
|
12
|
+
export { GridCell } from './GridCell';
|
|
13
|
+
export type { GridCellProps } from './GridCell';
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MenuItem - Standardized menu item type for navigation components
|
|
3
|
+
*
|
|
4
|
+
* Used by Scaffold, navigation rails, drawers, and other menu systems.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import React from 'react';
|
|
10
|
+
|
|
11
|
+
export interface MenuItem {
|
|
12
|
+
/** Unique identifier for the menu item */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Display label for the menu item */
|
|
15
|
+
label: string;
|
|
16
|
+
/** Icon component or JSX element to display */
|
|
17
|
+
icon?: React.ReactNode;
|
|
18
|
+
/** Click handler for the menu item */
|
|
19
|
+
onClick?: () => void;
|
|
20
|
+
/** External link URL (if this is a link) */
|
|
21
|
+
href?: string;
|
|
22
|
+
/** Route path for automatic navigation (React Router) */
|
|
23
|
+
route?: string;
|
|
24
|
+
/** Whether this item is currently active/selected */
|
|
25
|
+
active?: boolean;
|
|
26
|
+
/** Whether this item is disabled */
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
/** Badge text or number to display */
|
|
29
|
+
badge?: string | number;
|
|
30
|
+
/** Priority for ordering (lower numbers = higher priority) */
|
|
31
|
+
priority?: number;
|
|
32
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FormPage - Reusable page layout for forms with consistent header, status, and footer
|
|
3
|
+
*
|
|
4
|
+
* Provides a standardized full-page layout for forms with:
|
|
5
|
+
* - CoverImageHeader as the default header with smart branding defaults
|
|
6
|
+
* - Status message handling (info, success, warning, error)
|
|
7
|
+
* - Consistent form container and footer
|
|
8
|
+
* - Background variants (default, gradient, image)
|
|
9
|
+
* - Responsive design for all screen sizes
|
|
10
|
+
*
|
|
11
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import React from 'react';
|
|
15
|
+
import FormBlock from '../forms/FormBlock';
|
|
16
|
+
|
|
17
|
+
export interface FormPageProps {
|
|
18
|
+
/**
|
|
19
|
+
* Page title (required)
|
|
20
|
+
*/
|
|
21
|
+
title: string;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Page subtitle/description
|
|
25
|
+
*/
|
|
26
|
+
description?: string;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Cover image URL or React element for the header
|
|
30
|
+
* If not provided, will use Logo component with app name
|
|
31
|
+
*/
|
|
32
|
+
coverImage?: string | React.ReactNode;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Form content (required)
|
|
36
|
+
*/
|
|
37
|
+
form: React.ReactNode;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Footer content
|
|
41
|
+
*/
|
|
42
|
+
footer?: React.ReactNode;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Status message type
|
|
46
|
+
*/
|
|
47
|
+
status?: 'info' | 'success' | 'warning' | 'error';
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Status message content
|
|
51
|
+
*/
|
|
52
|
+
message?: string;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Maximum width of the form container
|
|
56
|
+
*/
|
|
57
|
+
maxWidth?: 'xs' | 'sm' | 'md';
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Background style variant
|
|
61
|
+
*/
|
|
62
|
+
background?: 'default' | 'gradient' | 'image';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Background image URL (when background='image')
|
|
66
|
+
*/
|
|
67
|
+
backgroundImage?: string;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Custom styling
|
|
71
|
+
*/
|
|
72
|
+
sx?: object;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* FormPage component for consistent form page layouts
|
|
77
|
+
*/
|
|
78
|
+
export const FormPage: React.FC<FormPageProps> = ({
|
|
79
|
+
title,
|
|
80
|
+
description,
|
|
81
|
+
coverImage,
|
|
82
|
+
form,
|
|
83
|
+
footer,
|
|
84
|
+
status,
|
|
85
|
+
message,
|
|
86
|
+
maxWidth = 'sm',
|
|
87
|
+
background = 'default',
|
|
88
|
+
backgroundImage,
|
|
89
|
+
sx = {},
|
|
90
|
+
}) => {
|
|
91
|
+
return (
|
|
92
|
+
<FormBlock
|
|
93
|
+
title={title}
|
|
94
|
+
description={description}
|
|
95
|
+
coverImage={coverImage}
|
|
96
|
+
form={form}
|
|
97
|
+
footer={footer}
|
|
98
|
+
status={status}
|
|
99
|
+
message={message}
|
|
100
|
+
maxWidth={maxWidth}
|
|
101
|
+
background={background}
|
|
102
|
+
backgroundImage={backgroundImage}
|
|
103
|
+
sx={sx}
|
|
104
|
+
/>
|
|
105
|
+
);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export default FormPage;
|