@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,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dimensions Context - Responsive design tokens for typography, spacing, and sizing
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent design tokens that adapt to screen size and user preferences.
|
|
5
|
+
* Works alongside MUI theme system for comprehensive responsive design.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React, { createContext, useContext, useEffect, useState } from 'react';
|
|
11
|
+
|
|
12
|
+
export interface DimensionTokens {
|
|
13
|
+
// Border radius
|
|
14
|
+
borderRadius: {
|
|
15
|
+
small: number;
|
|
16
|
+
medium: number;
|
|
17
|
+
large: number;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Typography scale (multipliers for MUI typography)
|
|
21
|
+
typography: {
|
|
22
|
+
scaleMultiplier: number;
|
|
23
|
+
lineHeightMultiplier: number;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Spacing scale (multipliers for MUI spacing)
|
|
27
|
+
spacing: {
|
|
28
|
+
scaleMultiplier: number;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Component sizing
|
|
32
|
+
component: {
|
|
33
|
+
buttonHeight: number;
|
|
34
|
+
inputHeight: number;
|
|
35
|
+
iconSize: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface DimensionsContextValue {
|
|
40
|
+
tokens: DimensionTokens;
|
|
41
|
+
screenSize: 'mobile' | 'tablet' | 'desktop';
|
|
42
|
+
isCompact: boolean;
|
|
43
|
+
setCompactMode: (compact: boolean) => void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const DimensionsContext = createContext<DimensionsContextValue | undefined>(undefined);
|
|
47
|
+
|
|
48
|
+
// Default dimension tokens
|
|
49
|
+
const getDefaultTokens = (screenSize: 'mobile' | 'tablet' | 'desktop', isCompact: boolean): DimensionTokens => {
|
|
50
|
+
const compactMultiplier = isCompact ? 0.9 : 1.0;
|
|
51
|
+
|
|
52
|
+
let baseTokens: DimensionTokens;
|
|
53
|
+
|
|
54
|
+
switch (screenSize) {
|
|
55
|
+
case 'mobile':
|
|
56
|
+
baseTokens = {
|
|
57
|
+
borderRadius: { small: 6, medium: 10, large: 14 },
|
|
58
|
+
typography: { scaleMultiplier: 0.9, lineHeightMultiplier: 1.0 },
|
|
59
|
+
spacing: { scaleMultiplier: 0.8 },
|
|
60
|
+
component: { buttonHeight: 44, inputHeight: 44, iconSize: 20 },
|
|
61
|
+
};
|
|
62
|
+
break;
|
|
63
|
+
case 'tablet':
|
|
64
|
+
baseTokens = {
|
|
65
|
+
borderRadius: { small: 8, medium: 12, large: 16 },
|
|
66
|
+
typography: { scaleMultiplier: 0.95, lineHeightMultiplier: 1.0 },
|
|
67
|
+
spacing: { scaleMultiplier: 0.9 },
|
|
68
|
+
component: { buttonHeight: 40, inputHeight: 40, iconSize: 22 },
|
|
69
|
+
};
|
|
70
|
+
break;
|
|
71
|
+
case 'desktop':
|
|
72
|
+
default:
|
|
73
|
+
baseTokens = {
|
|
74
|
+
borderRadius: { small: 8, medium: 12, large: 16 },
|
|
75
|
+
typography: { scaleMultiplier: 1.0, lineHeightMultiplier: 1.0 },
|
|
76
|
+
spacing: { scaleMultiplier: 1.0 },
|
|
77
|
+
component: { buttonHeight: 36, inputHeight: 36, iconSize: 24 },
|
|
78
|
+
};
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Apply compact mode multiplier
|
|
83
|
+
return {
|
|
84
|
+
...baseTokens,
|
|
85
|
+
typography: {
|
|
86
|
+
scaleMultiplier: baseTokens.typography.scaleMultiplier * compactMultiplier,
|
|
87
|
+
lineHeightMultiplier: baseTokens.typography.lineHeightMultiplier * compactMultiplier,
|
|
88
|
+
},
|
|
89
|
+
spacing: {
|
|
90
|
+
scaleMultiplier: baseTokens.spacing.scaleMultiplier * compactMultiplier,
|
|
91
|
+
},
|
|
92
|
+
component: {
|
|
93
|
+
buttonHeight: Math.round(baseTokens.component.buttonHeight * compactMultiplier),
|
|
94
|
+
inputHeight: Math.round(baseTokens.component.inputHeight * compactMultiplier),
|
|
95
|
+
iconSize: Math.round(baseTokens.component.iconSize * compactMultiplier),
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export interface DimensionsProviderProps {
|
|
101
|
+
children: React.ReactNode;
|
|
102
|
+
defaultCompactMode?: boolean;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const DimensionsProvider: React.FC<DimensionsProviderProps> = ({
|
|
106
|
+
children,
|
|
107
|
+
defaultCompactMode = false,
|
|
108
|
+
}) => {
|
|
109
|
+
const [screenSize, setScreenSize] = useState<'mobile' | 'tablet' | 'desktop'>('desktop');
|
|
110
|
+
const [isCompact, setIsCompact] = useState(defaultCompactMode);
|
|
111
|
+
|
|
112
|
+
// Detect screen size
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
const updateScreenSize = () => {
|
|
115
|
+
const width = window.innerWidth;
|
|
116
|
+
if (width < 768) {
|
|
117
|
+
setScreenSize('mobile');
|
|
118
|
+
} else if (width < 1024) {
|
|
119
|
+
setScreenSize('tablet');
|
|
120
|
+
} else {
|
|
121
|
+
setScreenSize('desktop');
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
updateScreenSize();
|
|
126
|
+
window.addEventListener('resize', updateScreenSize);
|
|
127
|
+
return () => window.removeEventListener('resize', updateScreenSize);
|
|
128
|
+
}, []);
|
|
129
|
+
|
|
130
|
+
const tokens = getDefaultTokens(screenSize, isCompact);
|
|
131
|
+
|
|
132
|
+
const contextValue: DimensionsContextValue = {
|
|
133
|
+
tokens,
|
|
134
|
+
screenSize,
|
|
135
|
+
isCompact,
|
|
136
|
+
setCompactMode: setIsCompact,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<DimensionsContext.Provider value={contextValue}>
|
|
141
|
+
{children}
|
|
142
|
+
</DimensionsContext.Provider>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export const useDimensions = (): DimensionsContextValue => {
|
|
147
|
+
const context = useContext(DimensionsContext);
|
|
148
|
+
if (context === undefined) {
|
|
149
|
+
throw new Error('useDimensions must be used within a DimensionsProvider');
|
|
150
|
+
}
|
|
151
|
+
return context;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export default DimensionsProvider;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palette Context - Manages color palette state and switching
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';
|
|
8
|
+
import { AllPalettes } from '../palettes';
|
|
9
|
+
import {
|
|
10
|
+
loadUserPalettePreference,
|
|
11
|
+
saveUserPalettePreference,
|
|
12
|
+
clearUserPalettePreference
|
|
13
|
+
} from '../utils/persistenceUtils';
|
|
14
|
+
|
|
15
|
+
// Type definitions
|
|
16
|
+
export interface PaletteConfig {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
primaryColor: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PaletteContextValue {
|
|
24
|
+
/** The palette currently being applied to the UI (resolved from preferred/default) */
|
|
25
|
+
currentPalette: string;
|
|
26
|
+
/** The user's preferred palette setting, or null if not set */
|
|
27
|
+
preferredPalette: string | null;
|
|
28
|
+
/** List of all available palettes */
|
|
29
|
+
availablePalettes: PaletteConfig[];
|
|
30
|
+
/** Whether preferences are persisted to localStorage */
|
|
31
|
+
isPersistent: boolean;
|
|
32
|
+
|
|
33
|
+
// Palette preference management
|
|
34
|
+
/** Set user's preferred palette (saves to localStorage if persistent) */
|
|
35
|
+
setPreferredPalette: (paletteId: string) => void;
|
|
36
|
+
/** Clear user's preferred palette (removes from localStorage) */
|
|
37
|
+
clearPreferredPalette: () => void;
|
|
38
|
+
/** Get user's preferred palette */
|
|
39
|
+
getPreferredPalette: () => string | null;
|
|
40
|
+
|
|
41
|
+
// Current palette management (for admin/preview overrides)
|
|
42
|
+
/** Get currently applied palette */
|
|
43
|
+
getCurrentPalette: () => string;
|
|
44
|
+
/** Temporarily override current palette (does not affect user preference) */
|
|
45
|
+
setCurrentPalette: (paletteId: string) => void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface PaletteProviderProps {
|
|
49
|
+
children: ReactNode;
|
|
50
|
+
/**
|
|
51
|
+
* App identifier for generating unique storage key, or persistence strategy.
|
|
52
|
+
* - string: Use as app identifier to generate key 'appId.palette'
|
|
53
|
+
* - true (default): Use default key 'qwickapps-react-framework-palette'
|
|
54
|
+
* - false: Disable persistence (session-only)
|
|
55
|
+
* @example 'com.mycompany.myapp' | true | false
|
|
56
|
+
*/
|
|
57
|
+
appId?: string | true | false;
|
|
58
|
+
/**
|
|
59
|
+
* Default palette for the application when no user preference exists. The default is 'default'.
|
|
60
|
+
* This can be overridden by user settings.
|
|
61
|
+
* @example 'ocean' | 'autumn' | 'spring' | 'winter' | 'default'
|
|
62
|
+
*/
|
|
63
|
+
defaultPalette?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Create context with proper typing
|
|
67
|
+
const PaletteContext = createContext<PaletteContextValue | null>(null);
|
|
68
|
+
|
|
69
|
+
export const usePalette = (): PaletteContextValue => {
|
|
70
|
+
const context = useContext(PaletteContext);
|
|
71
|
+
if (!context) {
|
|
72
|
+
throw new Error('usePalette must be used within a PaletteProvider');
|
|
73
|
+
}
|
|
74
|
+
return context;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Use imported palette configurations
|
|
78
|
+
const AVAILABLE_PALETTES: PaletteConfig[] = AllPalettes;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Resolve the default palette ID based on user preference or fallback
|
|
82
|
+
* @param paletteId - The desired palette ID
|
|
83
|
+
* @param warn - Whether to issue a warning for invalid palette IDs
|
|
84
|
+
* @returns The resolved palette ID
|
|
85
|
+
*/
|
|
86
|
+
const resolveDefaultPalette = (paletteId: string | undefined, warn = true): string => {
|
|
87
|
+
if (paletteId && AVAILABLE_PALETTES.some(p => p.id === paletteId)) {
|
|
88
|
+
return paletteId;
|
|
89
|
+
}
|
|
90
|
+
if (warn) {
|
|
91
|
+
console.warn(`[PaletteProvider] Invalid defaultPalette '${paletteId}'. Using 'default'.`);
|
|
92
|
+
}
|
|
93
|
+
return 'default';
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const PaletteProvider: React.FC<PaletteProviderProps> = ({
|
|
97
|
+
children,
|
|
98
|
+
appId,
|
|
99
|
+
defaultPalette = 'default'
|
|
100
|
+
}) => {
|
|
101
|
+
// Determine storage key based on appId
|
|
102
|
+
const actualStorageKey = React.useMemo(() => {
|
|
103
|
+
if (appId === false) {
|
|
104
|
+
return null; // No persistence
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (typeof appId === 'string') {
|
|
108
|
+
return `${appId}.palette`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// appId is true or undefined - use default key with warning
|
|
112
|
+
const defaultKey = 'qwickapps-react-framework-palette';
|
|
113
|
+
console.warn(
|
|
114
|
+
`[PaletteProvider] Using default storage key '${defaultKey}'. ` +
|
|
115
|
+
`Consider providing an appId for production apps to avoid conflicts. ` +
|
|
116
|
+
`Example: <PaletteProvider appId="com.mycompany.myapp">`
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
return defaultKey;
|
|
120
|
+
}, [appId]);
|
|
121
|
+
|
|
122
|
+
// Available palette IDs for validation
|
|
123
|
+
const availablePaletteIds = AVAILABLE_PALETTES.map(p => p.id);
|
|
124
|
+
|
|
125
|
+
// User's preferred palette (what they explicitly chose)
|
|
126
|
+
const [preferredPalette, setPreferredPaletteState] = useState<string | null>(() => {
|
|
127
|
+
return loadUserPalettePreference(actualStorageKey, availablePaletteIds);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Current palette being applied (resolved from preferred/default)
|
|
131
|
+
const [currentPalette, setCurrentPaletteState] = useState<string>(() => {
|
|
132
|
+
const userPreference = loadUserPalettePreference(actualStorageKey, availablePaletteIds);
|
|
133
|
+
return userPreference || resolveDefaultPalette(defaultPalette);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Apply palette to document root immediately and on changes
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (typeof document !== 'undefined') {
|
|
139
|
+
document.documentElement.setAttribute('data-palette', currentPalette);
|
|
140
|
+
|
|
141
|
+
// Dispatch custom event to notify theme system (with small delay to ensure CSS is applied)
|
|
142
|
+
setTimeout(() => {
|
|
143
|
+
const event = new CustomEvent('palette-changed', {
|
|
144
|
+
detail: { palette: currentPalette }
|
|
145
|
+
});
|
|
146
|
+
window.dispatchEvent(event);
|
|
147
|
+
}, 50);
|
|
148
|
+
}
|
|
149
|
+
}, [currentPalette]);
|
|
150
|
+
|
|
151
|
+
// Note: We no longer automatically save to localStorage on every change
|
|
152
|
+
// localStorage is only updated via setPreferredPalette() method
|
|
153
|
+
|
|
154
|
+
// Palette preference management methods
|
|
155
|
+
const setPreferredPalette = (paletteId: string): void => {
|
|
156
|
+
const targetPalette = AVAILABLE_PALETTES.find(p => p.id === paletteId);
|
|
157
|
+
if (targetPalette) {
|
|
158
|
+
setPreferredPaletteState(paletteId);
|
|
159
|
+
setCurrentPaletteState(paletteId);
|
|
160
|
+
saveUserPalettePreference(actualStorageKey, paletteId);
|
|
161
|
+
} else {
|
|
162
|
+
console.warn(`Palette "${paletteId}" not found. Available palettes:`, AVAILABLE_PALETTES.map(p => p.id));
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const clearPreferredPalette = (): void => {
|
|
167
|
+
setPreferredPaletteState(null);
|
|
168
|
+
clearUserPalettePreference(actualStorageKey);
|
|
169
|
+
|
|
170
|
+
// Reset to default palette
|
|
171
|
+
const fallbackPalette = resolveDefaultPalette(defaultPalette, false);
|
|
172
|
+
setCurrentPaletteState(fallbackPalette);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const getPreferredPalette = (): string | null => {
|
|
176
|
+
return preferredPalette;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// Current palette management methods (for admin/preview overrides)
|
|
180
|
+
const getCurrentPalette = (): string => {
|
|
181
|
+
return currentPalette;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const setCurrentPalette = (paletteId: string): void => {
|
|
185
|
+
const targetPalette = AVAILABLE_PALETTES.find(p => p.id === paletteId);
|
|
186
|
+
if (targetPalette) {
|
|
187
|
+
setCurrentPaletteState(paletteId);
|
|
188
|
+
// Note: This does NOT update preferredPalette or localStorage
|
|
189
|
+
} else {
|
|
190
|
+
console.warn(`Palette "${paletteId}" not found. Available palettes:`, AVAILABLE_PALETTES.map(p => p.id));
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const value: PaletteContextValue = {
|
|
195
|
+
currentPalette,
|
|
196
|
+
preferredPalette,
|
|
197
|
+
availablePalettes: AVAILABLE_PALETTES,
|
|
198
|
+
isPersistent: actualStorageKey !== null,
|
|
199
|
+
|
|
200
|
+
// Palette preference management
|
|
201
|
+
setPreferredPalette,
|
|
202
|
+
clearPreferredPalette,
|
|
203
|
+
getPreferredPalette,
|
|
204
|
+
|
|
205
|
+
// Current palette management
|
|
206
|
+
getCurrentPalette,
|
|
207
|
+
setCurrentPalette,
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
return (
|
|
211
|
+
<PaletteContext.Provider value={value}>
|
|
212
|
+
{children}
|
|
213
|
+
</PaletteContext.Provider>
|
|
214
|
+
);
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
export default PaletteProvider;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QwickApp Context - Application-level context for QwickApp configuration
|
|
3
|
+
*
|
|
4
|
+
* Provides app-level state and configuration that can be accessed by components
|
|
5
|
+
* within the QwickApp provider hierarchy.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import type { MenuItem } from '../components/menu';
|
|
12
|
+
import type { ScaffoldProps } from '../components/Scaffold';
|
|
13
|
+
|
|
14
|
+
export interface QwickAppProps {
|
|
15
|
+
/** Application name displayed in header/title */
|
|
16
|
+
appName: string;
|
|
17
|
+
/** Custom logo component - overrides the default logo */
|
|
18
|
+
logo?: React.ReactNode;
|
|
19
|
+
/** App identifier used for storage keys */
|
|
20
|
+
appId?: string | true | false;
|
|
21
|
+
/** Application version string */
|
|
22
|
+
appVersion?: string;
|
|
23
|
+
/** Theme mode preference (light/dark/auto) */
|
|
24
|
+
defaultTheme?: 'light' | 'dark' | 'system';
|
|
25
|
+
/** Default palette to use */
|
|
26
|
+
defaultPalette?: string;
|
|
27
|
+
/** Enable scaffolding with navigation system (default: false) */
|
|
28
|
+
enableScaffolding?: boolean;
|
|
29
|
+
/** Primary navigation items for scaffolding */
|
|
30
|
+
navigationItems?: MenuItem[];
|
|
31
|
+
/** App bar configuration for scaffolding */
|
|
32
|
+
appBar?: ScaffoldProps['appBar'];
|
|
33
|
+
/** Whether to show app bar when scaffolding is enabled (default: true) */
|
|
34
|
+
showAppBar?: boolean;
|
|
35
|
+
/** Custom app bar height when scaffolding is enabled */
|
|
36
|
+
appBarHeight?: number;
|
|
37
|
+
/** Whether to show theme switcher in app bar (default: false) */
|
|
38
|
+
showThemeSwitcher?: boolean;
|
|
39
|
+
/** Whether to show palette switcher in app bar (default: false) */
|
|
40
|
+
showPaletteSwitcher?: boolean;
|
|
41
|
+
/** Callback when logo is clicked */
|
|
42
|
+
onLogoClick?: () => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface QwickAppContextValue {
|
|
46
|
+
/** Application name */
|
|
47
|
+
appName: string;
|
|
48
|
+
/** Custom logo component */
|
|
49
|
+
logo?: React.ReactNode;
|
|
50
|
+
/** App identifier used for storage keys */
|
|
51
|
+
appId?: string | true | false;
|
|
52
|
+
/** Whether scaffolding is enabled */
|
|
53
|
+
enableScaffolding: boolean;
|
|
54
|
+
/** Navigation items for scaffolding */
|
|
55
|
+
navigationItems: MenuItem[];
|
|
56
|
+
/** App bar configuration */
|
|
57
|
+
appBar?: ScaffoldProps['appBar'];
|
|
58
|
+
/** Whether to show app bar */
|
|
59
|
+
showAppBar: boolean;
|
|
60
|
+
/** App bar height */
|
|
61
|
+
appBarHeight: number;
|
|
62
|
+
/** Whether to show theme switcher in app bar */
|
|
63
|
+
showThemeSwitcher: boolean;
|
|
64
|
+
/** Whether to show palette switcher in app bar */
|
|
65
|
+
showPaletteSwitcher: boolean;
|
|
66
|
+
/** Callback when logo is clicked */
|
|
67
|
+
onLogoClick?: () => void;
|
|
68
|
+
/** Update app configuration (excludes appName and appId for security) */
|
|
69
|
+
updateConfig: (updates: Partial<Pick<QwickAppProps, 'logo' | 'enableScaffolding' | 'navigationItems' | 'appBar' | 'showAppBar' | 'appBarHeight' | 'showThemeSwitcher' | 'showPaletteSwitcher'>>) => void;
|
|
70
|
+
// Navigation removed - now handled by AuthProvider when routing needed
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const QwickAppContext = React.createContext<QwickAppContextValue>({
|
|
74
|
+
appName: 'QwickApps',
|
|
75
|
+
logo: undefined,
|
|
76
|
+
appId: true,
|
|
77
|
+
enableScaffolding: false,
|
|
78
|
+
navigationItems: [],
|
|
79
|
+
appBar: undefined,
|
|
80
|
+
showAppBar: true,
|
|
81
|
+
appBarHeight: 64,
|
|
82
|
+
showThemeSwitcher: false,
|
|
83
|
+
showPaletteSwitcher: false,
|
|
84
|
+
updateConfig: () => {},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
export { QwickAppContext };
|
|
88
|
+
|
|
89
|
+
export const useQwickApp = (): QwickAppContextValue => {
|
|
90
|
+
const context = React.useContext(QwickAppContext);
|
|
91
|
+
if (!context) {
|
|
92
|
+
throw new Error('useQwickApp must be used within a QwickApp provider');
|
|
93
|
+
}
|
|
94
|
+
return context;
|
|
95
|
+
};
|