@qwickapps/react-framework 1.3.5 → 1.4.1
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/README.md +1691 -2
- package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
- package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +7 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/Html.d.ts +28 -18
- package/dist/components/Html.d.ts.map +1 -1
- package/dist/components/Logo.d.ts +12 -35
- package/dist/components/Logo.d.ts.map +1 -1
- package/dist/components/Markdown.d.ts +18 -13
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/QwickApp.d.ts +16 -3
- package/dist/components/QwickApp.d.ts.map +1 -1
- package/dist/components/QwickIcon.d.ts +23 -0
- package/dist/components/QwickIcon.d.ts.map +1 -0
- package/dist/components/SafeSpan.d.ts +12 -5
- package/dist/components/SafeSpan.d.ts.map +1 -1
- package/dist/components/Scaffold.d.ts.map +1 -1
- package/dist/components/base/ModelView.d.ts +101 -0
- package/dist/components/base/ModelView.d.ts.map +1 -0
- package/dist/components/base/index.d.ts +11 -0
- package/dist/components/base/index.d.ts.map +1 -0
- package/dist/components/blocks/Article.d.ts +12 -2
- package/dist/components/blocks/Article.d.ts.map +1 -1
- package/dist/components/blocks/Code.d.ts +13 -2
- package/dist/components/blocks/Code.d.ts.map +1 -1
- package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
- package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
- package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
- package/dist/components/blocks/Footer.d.ts.map +1 -1
- package/dist/components/blocks/HeroBlock.d.ts +27 -13
- package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
- package/dist/components/blocks/Image.d.ts +41 -0
- package/dist/components/blocks/Image.d.ts.map +1 -0
- package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
- package/dist/components/blocks/Section.d.ts +16 -2
- package/dist/components/blocks/Section.d.ts.map +1 -1
- package/dist/components/blocks/Text.d.ts +41 -0
- package/dist/components/blocks/Text.d.ts.map +1 -0
- package/dist/components/blocks/index.d.ts +4 -0
- package/dist/components/blocks/index.d.ts.map +1 -1
- package/dist/components/buttons/Button.d.ts +23 -7
- package/dist/components/buttons/Button.d.ts.map +1 -1
- package/dist/components/forms/FormBlock.d.ts +19 -13
- package/dist/components/forms/FormBlock.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/input/ChoiceInputField.d.ts +17 -11
- package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
- package/dist/components/input/HtmlInputField.d.ts +17 -11
- package/dist/components/input/HtmlInputField.d.ts.map +1 -1
- package/dist/components/input/SelectInputField.d.ts +16 -10
- package/dist/components/input/SelectInputField.d.ts.map +1 -1
- package/dist/components/input/SwitchInputField.d.ts +16 -10
- package/dist/components/input/SwitchInputField.d.ts.map +1 -1
- package/dist/components/input/TextField.d.ts.map +1 -1
- package/dist/components/input/TextInputField.d.ts +16 -11
- package/dist/components/input/TextInputField.d.ts.map +1 -1
- package/dist/components/layout/GridCell.d.ts +23 -6
- package/dist/components/layout/GridCell.d.ts.map +1 -1
- package/dist/components/layout/GridLayout.d.ts +24 -23
- package/dist/components/layout/GridLayout.d.ts.map +1 -1
- package/dist/components/pages/FormPage.d.ts.map +1 -1
- package/dist/components/pages/Page.d.ts +49 -87
- package/dist/components/pages/Page.d.ts.map +1 -1
- package/dist/components/pages/index.d.ts +2 -2
- package/dist/components/pages/index.d.ts.map +1 -1
- package/dist/config/AppConfig.d.ts +49 -0
- package/dist/config/AppConfig.d.ts.map +1 -0
- package/dist/config/AppConfigBuilder.d.ts +75 -0
- package/dist/config/AppConfigBuilder.d.ts.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/types.d.ts +130 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.esm.js +451 -0
- package/dist/config.js +455 -0
- package/dist/contexts/PrintModeContext.d.ts +27 -0
- package/dist/contexts/PrintModeContext.d.ts.map +1 -0
- package/dist/contexts/QwickAppContext.d.ts +2 -2
- package/dist/contexts/QwickAppContext.d.ts.map +1 -1
- package/dist/contexts/index.d.ts +2 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/usePrintMode.d.ts +39 -0
- package/dist/hooks/usePrintMode.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +10951 -6238
- package/dist/index.js +11014 -6287
- package/dist/schemas/CodeSchema.d.ts +2 -1
- package/dist/schemas/CodeSchema.d.ts.map +1 -1
- package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
- package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
- package/dist/schemas/ContentSchema.d.ts +2 -1
- package/dist/schemas/ContentSchema.d.ts.map +1 -1
- package/dist/schemas/GridCellSchema.d.ts +25 -0
- package/dist/schemas/GridCellSchema.d.ts.map +1 -0
- package/dist/schemas/GridLayoutSchema.d.ts +23 -0
- package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
- package/dist/schemas/HtmlSchema.d.ts +14 -0
- package/dist/schemas/HtmlSchema.d.ts.map +1 -0
- package/dist/schemas/ImageSchema.d.ts +32 -0
- package/dist/schemas/ImageSchema.d.ts.map +1 -0
- package/dist/schemas/LogoSchema.d.ts +35 -0
- package/dist/schemas/LogoSchema.d.ts.map +1 -0
- package/dist/schemas/MarkdownSchema.d.ts +14 -0
- package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
- package/dist/schemas/PageTemplateSchema.d.ts +31 -0
- package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
- package/dist/schemas/PrintConfigSchema.d.ts +31 -0
- package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
- package/dist/schemas/SectionSchema.d.ts +2 -1
- package/dist/schemas/SectionSchema.d.ts.map +1 -1
- package/dist/schemas/TextSchema.d.ts +37 -0
- package/dist/schemas/TextSchema.d.ts.map +1 -0
- package/dist/schemas/ViewModelSchema.d.ts +23 -0
- package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
- package/dist/schemas/index.d.ts +15 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
- package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
- package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
- package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
- package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
- package/dist/schemas/transformers/registry.d.ts +15 -0
- package/dist/schemas/transformers/registry.d.ts.map +1 -0
- package/dist/schemas/types/Serializable.d.ts +46 -0
- package/dist/schemas/types/Serializable.d.ts.map +1 -0
- package/dist/utils/htmlTransform.d.ts.map +1 -1
- package/dist/utils/reactUtils.d.ts +12 -3
- package/dist/utils/reactUtils.d.ts.map +1 -1
- package/package.json +17 -3
- package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
- package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
- package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
- package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
- package/src/__tests__/components/Logo.test.js +3 -3
- package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
- package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
- package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
- package/src/__tests__/components/base/ModelView.test.tsx +220 -0
- package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
- package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
- package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
- package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
- package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
- package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
- package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
- package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
- package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
- package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
- package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
- package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
- package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
- package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
- package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
- package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
- package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
- package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
- package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
- package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
- package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
- package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
- package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
- package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
- package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
- package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
- package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
- package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
- package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
- package/src/components/ErrorBoundary.tsx +8 -8
- package/src/components/Html.tsx +147 -44
- package/src/components/Logo.tsx +198 -100
- package/src/components/Markdown.tsx +125 -16
- package/src/components/QwickApp.tsx +64 -31
- package/src/components/QwickIcon.tsx +59 -0
- package/src/components/SafeSpan.tsx +65 -10
- package/src/components/Scaffold.tsx +2 -8
- package/src/components/base/ModelView.tsx +199 -0
- package/src/components/base/index.ts +11 -0
- package/src/components/blocks/Article.tsx +57 -18
- package/src/components/blocks/Code.md +529 -0
- package/src/components/blocks/Code.tsx +102 -15
- package/src/components/blocks/CoverImageHeader.tsx +9 -4
- package/src/components/blocks/FeatureCard.tsx +1 -2
- package/src/components/blocks/FeatureGrid.tsx +19 -1
- package/src/components/blocks/Footer.tsx +13 -1
- package/src/components/blocks/HeroBlock.tsx +87 -20
- package/src/components/blocks/Image.tsx +395 -0
- package/src/components/blocks/PageBannerHeader.tsx +14 -12
- package/src/components/blocks/ProductCard.tsx +1 -1
- package/src/components/blocks/Section.tsx +113 -8
- package/src/components/blocks/Text.tsx +285 -0
- package/src/components/blocks/index.ts +4 -0
- package/src/components/buttons/Button.tsx +184 -15
- package/src/components/forms/FormBlock.tsx +70 -17
- package/src/components/index.ts +5 -0
- package/src/components/input/ChoiceInputField.tsx +48 -18
- package/src/components/input/HtmlInputField.tsx +48 -18
- package/src/components/input/SelectInputField.tsx +48 -16
- package/src/components/input/SwitchInputField.tsx +48 -17
- package/src/components/input/TextField.tsx +41 -1
- package/src/components/input/TextInputField.tsx +52 -18
- package/src/components/layout/GridCell.tsx +118 -9
- package/src/components/layout/GridLayout.tsx +125 -24
- package/src/components/pages/FormPage.tsx +0 -1
- package/src/components/pages/Page.css +304 -332
- package/src/components/pages/Page.tsx +307 -255
- package/src/components/pages/index.ts +2 -2
- package/src/config/AppConfig.ts +133 -0
- package/src/config/AppConfigBuilder.ts +421 -0
- package/src/config/__tests__/AppConfig.test.ts +385 -0
- package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
- package/src/config/index.ts +24 -0
- package/src/config/types.ts +170 -0
- package/src/config.ts +25 -0
- package/src/contexts/PrintModeContext.tsx +332 -0
- package/src/contexts/QwickAppContext.tsx +2 -2
- package/src/contexts/index.ts +2 -0
- package/src/hooks/index.ts +5 -1
- package/src/hooks/usePrintMode.ts +73 -0
- package/src/index.ts +3 -0
- package/src/schemas/CodeSchema.ts +3 -3
- package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
- package/src/schemas/ContentSchema.ts +2 -1
- package/src/schemas/GridCellSchema.ts +164 -0
- package/src/schemas/GridLayoutSchema.ts +133 -0
- package/src/schemas/HtmlSchema.ts +47 -0
- package/src/schemas/ImageSchema.ts +235 -0
- package/src/schemas/LogoSchema.ts +241 -0
- package/src/schemas/MarkdownSchema.ts +47 -0
- package/src/schemas/PageTemplateSchema.ts +186 -0
- package/src/schemas/PrintConfigSchema.ts +207 -0
- package/src/schemas/README.md +661 -0
- package/src/schemas/SectionSchema.ts +2 -1
- package/src/schemas/TextSchema.ts +329 -0
- package/src/schemas/ViewModelSchema.ts +115 -0
- package/src/schemas/index.ts +21 -2
- package/src/schemas/transformers/ComponentTransformer.ts +403 -0
- package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
- package/src/schemas/transformers/registry.ts +72 -0
- package/src/schemas/types/Serializable.ts +51 -0
- package/src/stories/AccessibilityProvider.stories.tsx +253 -253
- package/src/stories/Article.stories.tsx +433 -433
- package/src/stories/Button.stories.tsx +1 -1
- package/src/stories/CardListGrid.stories.tsx +451 -451
- package/src/stories/ChoiceInputField.stories.tsx +503 -503
- package/src/stories/Code.stories.tsx +1 -1
- package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
- package/src/stories/Content.stories.tsx +393 -393
- package/src/stories/CoverImageHeader.stories.tsx +701 -701
- package/src/stories/DataBinding.advanced.stories.tsx +432 -432
- package/src/stories/DataProvider.stories.tsx +1192 -1192
- package/src/stories/FeatureCard.stories.tsx +557 -557
- package/src/stories/FeatureGrid.stories.tsx +594 -594
- package/src/stories/Footer.stories.tsx +640 -640
- package/src/stories/FormBlock.stories.tsx +760 -760
- package/src/stories/FormComponents.stories.tsx +349 -541
- package/src/stories/GridCell.stories.tsx +417 -0
- package/src/stories/GridLayout.stories.tsx +353 -0
- package/src/stories/HeroBlock.stories.tsx +862 -373
- package/src/stories/HtmlInputField.stories.tsx +474 -474
- package/src/stories/Image.stories.tsx +819 -0
- package/src/stories/Introduction.stories.tsx +667 -667
- package/src/stories/LayoutBlocks.stories.tsx +324 -324
- package/src/stories/Logo.stories.tsx +165 -6
- package/src/stories/Markdown.stories.tsx +137 -137
- package/src/stories/ModelView.stories.tsx +477 -0
- package/src/stories/Page.stories.tsx +688 -688
- package/src/stories/PageBannerHeader.stories.tsx +864 -864
- package/src/stories/PaletteSwitcher.stories.tsx +119 -119
- package/src/stories/ProductCard.stories.tsx +424 -424
- package/src/stories/QwickApp.stories.tsx +368 -368
- package/src/stories/ResponsiveMenu.stories.tsx +249 -249
- package/src/stories/SafeSpan.stories.tsx +531 -531
- package/src/stories/Section.stories.tsx +90 -2
- package/src/stories/SelectInputField.stories.tsx +524 -524
- package/src/stories/Text.stories.tsx +560 -0
- package/src/stories/TextInputField.stories.tsx +443 -443
- package/src/stories/ThemeSwitcher.stories.tsx +123 -123
- package/src/utils/htmlTransform.tsx +74 -53
- package/src/utils/reactUtils.tsx +57 -6
- package/dist/index.bundled.css +0 -12
- /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
- /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
- /package/src/{utils/__tests__ → __tests__/utils}/optional-logging.test.ts +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Registration - Central registry for serializable components
|
|
3
|
+
*
|
|
4
|
+
* This file registers all components that implement the Serializable interface
|
|
5
|
+
* with the ComponentTransformer system. Components must be registered here
|
|
6
|
+
* to support JSON serialization/deserialization functionality.
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { ComponentTransformer } from './ComponentTransformer';
|
|
12
|
+
import { Code } from '../../components/blocks/Code';
|
|
13
|
+
import { Section } from '../../components/blocks/Section';
|
|
14
|
+
import { Image } from '../../components/blocks/Image';
|
|
15
|
+
import { Text } from '../../components/blocks/Text';
|
|
16
|
+
import { HeroBlock } from '../../components/blocks/HeroBlock';
|
|
17
|
+
import Button from '../../components/buttons/Button';
|
|
18
|
+
import { GridLayout } from '../../components/layout/GridLayout';
|
|
19
|
+
import { GridCell } from '../../components/layout/GridCell';
|
|
20
|
+
import { TextInputField } from '../../components/input/TextInputField';
|
|
21
|
+
import { SelectInputField } from '../../components/input/SelectInputField';
|
|
22
|
+
import { HtmlInputField } from '../../components/input/HtmlInputField';
|
|
23
|
+
import { ChoiceInputField } from '../../components/input/ChoiceInputField';
|
|
24
|
+
import { SwitchInputField } from '../../components/input/SwitchInputField';
|
|
25
|
+
import { FormBlock } from '../../components/forms/FormBlock';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Register all serializable components with the ComponentTransformer
|
|
29
|
+
* This function should be called once during application initialization
|
|
30
|
+
*/
|
|
31
|
+
export function registerSerializableComponents(): void {
|
|
32
|
+
// Register Code component - First production component with serialization support
|
|
33
|
+
ComponentTransformer.registerComponent(Code as any);
|
|
34
|
+
|
|
35
|
+
// Register Section component - Layout container component with child serialization support
|
|
36
|
+
ComponentTransformer.registerComponent(Section as any);
|
|
37
|
+
|
|
38
|
+
// Register Button component - Interactive component with action serialization support
|
|
39
|
+
ComponentTransformer.registerComponent(Button as any);
|
|
40
|
+
|
|
41
|
+
// Register Image component - Display component with comprehensive image handling and serialization support
|
|
42
|
+
ComponentTransformer.registerComponent(Image as any);
|
|
43
|
+
|
|
44
|
+
// Register Text component - Typography component with comprehensive text styling and serialization support
|
|
45
|
+
ComponentTransformer.registerComponent(Text as any);
|
|
46
|
+
|
|
47
|
+
// Register HeroBlock component - Full-width hero section with nested component serialization support
|
|
48
|
+
ComponentTransformer.registerComponent(HeroBlock as any);
|
|
49
|
+
|
|
50
|
+
// Register GridLayout component - Flexible grid layout with nested component serialization support
|
|
51
|
+
ComponentTransformer.registerComponent(GridLayout as any);
|
|
52
|
+
|
|
53
|
+
// Register GridCell component - Grid cell wrapper with nested component serialization support
|
|
54
|
+
ComponentTransformer.registerComponent(GridCell as any);
|
|
55
|
+
|
|
56
|
+
// Register Form Components - Complete form field components with serialization support
|
|
57
|
+
ComponentTransformer.registerComponent(TextInputField as any);
|
|
58
|
+
ComponentTransformer.registerComponent(SelectInputField as any);
|
|
59
|
+
ComponentTransformer.registerComponent(HtmlInputField as any);
|
|
60
|
+
ComponentTransformer.registerComponent(ChoiceInputField as any);
|
|
61
|
+
ComponentTransformer.registerComponent(SwitchInputField as any);
|
|
62
|
+
ComponentTransformer.registerComponent(FormBlock as any);
|
|
63
|
+
|
|
64
|
+
// Future components will be registered here as they implement Serializable
|
|
65
|
+
// etc.
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Auto-registration: Register components immediately when this module is imported
|
|
70
|
+
* This ensures components are available for serialization as soon as the module loads
|
|
71
|
+
*/
|
|
72
|
+
registerSerializableComponents();
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializable Interface - Component Serialization System Foundation
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for components that can be serialized to/from JSON
|
|
5
|
+
* for "WebView for React" functionality.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { ReactElement } from 'react';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Interface for components that support JSON serialization
|
|
14
|
+
* Components implementing this interface can be transformed between
|
|
15
|
+
* React elements and serializable JSON data structures
|
|
16
|
+
*/
|
|
17
|
+
export interface Serializable {
|
|
18
|
+
/**
|
|
19
|
+
* Convert component instance to JSON data
|
|
20
|
+
* @returns Serializable data structure
|
|
21
|
+
*/
|
|
22
|
+
toJson(): any;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Interface for serializable component constructor
|
|
27
|
+
* Defines static methods and properties required for component classes
|
|
28
|
+
* Components implementing this interface must declare their own identity
|
|
29
|
+
*/
|
|
30
|
+
export interface SerializableConstructor {
|
|
31
|
+
/**
|
|
32
|
+
* Component's unique tag name for serialization
|
|
33
|
+
* Must be unique across all registered components
|
|
34
|
+
*/
|
|
35
|
+
readonly tagName: string;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Component's version for serialization format compatibility
|
|
39
|
+
* Should follow semantic versioning (e.g., "1.0.0")
|
|
40
|
+
*/
|
|
41
|
+
readonly version: string;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Convert JSON data to a React element
|
|
45
|
+
* @param jsonData - Serialized component data
|
|
46
|
+
* @returns React element representing the component
|
|
47
|
+
*/
|
|
48
|
+
fromJson(jsonData: any): ReactElement;
|
|
49
|
+
|
|
50
|
+
new (...args: any[]): Serializable;
|
|
51
|
+
}
|
|
@@ -4,220 +4,220 @@ import React from 'react';
|
|
|
4
4
|
|
|
5
5
|
// Demo component that uses accessibility features
|
|
6
6
|
const AccessibilityDemo = () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
const {
|
|
8
|
+
highContrast,
|
|
9
|
+
reducedMotion,
|
|
10
|
+
largeText,
|
|
11
|
+
isKeyboardUser,
|
|
12
|
+
issues,
|
|
13
|
+
setHighContrast,
|
|
14
|
+
setReducedMotion,
|
|
15
|
+
setLargeText,
|
|
16
|
+
announce,
|
|
17
|
+
announcePolite,
|
|
18
|
+
announceAssertive,
|
|
19
|
+
runAudit,
|
|
20
|
+
clearIssues
|
|
21
|
+
} = useAccessibility();
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const [message, setMessage] = React.useState('');
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
25
|
+
return (
|
|
26
|
+
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
|
|
27
|
+
<h2>Accessibility Provider Demo</h2>
|
|
28
|
+
|
|
29
|
+
{/* System Status */}
|
|
30
|
+
<div style={{
|
|
31
|
+
marginBottom: '2rem',
|
|
32
|
+
padding: '1rem',
|
|
33
|
+
background: '#f5f5f5',
|
|
34
|
+
borderRadius: '8px'
|
|
35
|
+
}}>
|
|
36
|
+
<h3>System Status</h3>
|
|
37
|
+
<ul style={{ listStyle: 'none', padding: 0 }}>
|
|
38
|
+
<li> High Contrast: {highContrast ? '✅ Enabled' : '❌ Disabled'}</li>
|
|
39
|
+
<li> Reduced Motion: {reducedMotion ? '✅ Enabled' : '❌ Disabled'}</li>
|
|
40
|
+
<li>🔤 Large Text: {largeText ? '✅ Enabled' : '❌ Disabled'}</li>
|
|
41
|
+
<li>⌨ Keyboard User: {isKeyboardUser ? '✅ Yes' : '❌ No'}</li>
|
|
42
|
+
<li>🚨 Issues Found: {issues.length}</li>
|
|
43
|
+
</ul>
|
|
44
|
+
</div>
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
46
|
+
{/* Controls */}
|
|
47
|
+
<div style={{ marginBottom: '2rem' }}>
|
|
48
|
+
<h3>Accessibility Controls</h3>
|
|
49
|
+
<div style={{ display: 'flex', gap: '1rem', flexWrap: 'wrap' }}>
|
|
50
|
+
<button
|
|
51
|
+
onClick={() => setHighContrast(!highContrast)}
|
|
52
|
+
style={{
|
|
53
|
+
padding: '0.5rem 1rem',
|
|
54
|
+
background: highContrast ? '#000' : '#007cba',
|
|
55
|
+
color: 'white',
|
|
56
|
+
border: 'none',
|
|
57
|
+
borderRadius: '4px'
|
|
58
|
+
}}
|
|
59
|
+
>
|
|
60
|
+
Toggle High Contrast
|
|
61
|
+
</button>
|
|
62
|
+
|
|
63
|
+
<button
|
|
64
|
+
onClick={() => setReducedMotion(!reducedMotion)}
|
|
65
|
+
style={{
|
|
66
|
+
padding: '0.5rem 1rem',
|
|
67
|
+
background: reducedMotion ? '#666' : '#007cba',
|
|
68
|
+
color: 'white',
|
|
69
|
+
border: 'none',
|
|
70
|
+
borderRadius: '4px'
|
|
71
|
+
}}
|
|
72
|
+
>
|
|
73
|
+
Toggle Reduced Motion
|
|
74
|
+
</button>
|
|
75
|
+
|
|
76
|
+
<button
|
|
77
|
+
onClick={() => setLargeText(!largeText)}
|
|
78
|
+
style={{
|
|
79
|
+
padding: '0.5rem 1rem',
|
|
80
|
+
background: largeText ? '#0073aa' : '#007cba',
|
|
81
|
+
color: 'white',
|
|
82
|
+
border: 'none',
|
|
83
|
+
borderRadius: '4px',
|
|
84
|
+
fontSize: largeText ? '1.2em' : '1em'
|
|
85
|
+
}}
|
|
86
|
+
>
|
|
87
|
+
Toggle Large Text
|
|
88
|
+
</button>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
92
|
+
{/* Announcements */}
|
|
93
|
+
<div style={{ marginBottom: '2rem' }}>
|
|
94
|
+
<h3>Screen Reader Announcements</h3>
|
|
95
|
+
<div style={{ marginBottom: '1rem' }}>
|
|
96
|
+
<input
|
|
97
|
+
type="text"
|
|
98
|
+
value={message}
|
|
99
|
+
onChange={(e) => setMessage(e.target.value)}
|
|
100
|
+
placeholder="Type a message to announce..."
|
|
101
|
+
style={{
|
|
102
|
+
padding: '0.5rem',
|
|
103
|
+
marginRight: '0.5rem',
|
|
104
|
+
width: '300px',
|
|
105
|
+
border: '1px solid #ccc',
|
|
106
|
+
borderRadius: '4px'
|
|
107
|
+
}}
|
|
108
|
+
/>
|
|
109
|
+
</div>
|
|
110
|
+
<div style={{ display: 'flex', gap: '0.5rem' }}>
|
|
111
|
+
<button
|
|
112
|
+
onClick={() => announcePolite(message || 'Polite announcement test')}
|
|
113
|
+
style={{
|
|
114
|
+
padding: '0.5rem 1rem',
|
|
115
|
+
background: '#28a745',
|
|
116
|
+
color: 'white',
|
|
117
|
+
border: 'none',
|
|
118
|
+
borderRadius: '4px'
|
|
119
|
+
}}
|
|
120
|
+
>
|
|
121
|
+
Announce Polite
|
|
122
|
+
</button>
|
|
123
|
+
|
|
124
|
+
<button
|
|
125
|
+
onClick={() => announceAssertive(message || 'Assertive announcement test')}
|
|
126
|
+
style={{
|
|
127
|
+
padding: '0.5rem 1rem',
|
|
128
|
+
background: '#dc3545',
|
|
129
|
+
color: 'white',
|
|
130
|
+
border: 'none',
|
|
131
|
+
borderRadius: '4px'
|
|
132
|
+
}}
|
|
133
|
+
>
|
|
134
|
+
Announce Assertive
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
138
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
139
|
+
{/* Audit Controls */}
|
|
140
|
+
<div style={{ marginBottom: '2rem' }}>
|
|
141
|
+
<h3>Accessibility Audit</h3>
|
|
142
|
+
<div style={{ display: 'flex', gap: '0.5rem', marginBottom: '1rem' }}>
|
|
143
|
+
<button
|
|
144
|
+
onClick={runAudit}
|
|
145
|
+
style={{
|
|
146
|
+
padding: '0.5rem 1rem',
|
|
147
|
+
background: '#6f42c1',
|
|
148
|
+
color: 'white',
|
|
149
|
+
border: 'none',
|
|
150
|
+
borderRadius: '4px'
|
|
151
|
+
}}
|
|
152
|
+
>
|
|
153
|
+
Run Audit
|
|
154
|
+
</button>
|
|
155
|
+
|
|
156
|
+
<button
|
|
157
|
+
onClick={clearIssues}
|
|
158
|
+
style={{
|
|
159
|
+
padding: '0.5rem 1rem',
|
|
160
|
+
background: '#6c757d',
|
|
161
|
+
color: 'white',
|
|
162
|
+
border: 'none',
|
|
163
|
+
borderRadius: '4px'
|
|
164
|
+
}}
|
|
165
|
+
>
|
|
166
|
+
Clear Issues
|
|
167
|
+
</button>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
{issues.length > 0 && (
|
|
171
|
+
<div style={{
|
|
172
|
+
padding: '1rem',
|
|
173
|
+
background: '#fff3cd',
|
|
174
|
+
border: '1px solid #ffeaa7',
|
|
175
|
+
borderRadius: '8px'
|
|
176
|
+
}}>
|
|
177
|
+
<h4>Accessibility Issues ({issues.length})</h4>
|
|
178
|
+
<ul>
|
|
179
|
+
{issues.map((issue, index) => (
|
|
180
|
+
<li key={index} style={{ color: issue.level === 'error' ? '#dc3545' : '#856404' }}>
|
|
181
|
+
<strong>{issue.type}</strong>: {issue.message}
|
|
182
|
+
</li>
|
|
183
|
+
))}
|
|
184
|
+
</ul>
|
|
185
|
+
</div>
|
|
186
|
+
)}
|
|
187
|
+
</div>
|
|
188
188
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
189
|
+
{/* Test elements that might have accessibility issues */}
|
|
190
|
+
<div style={{ marginTop: '2rem', padding: '1rem', background: '#e9ecef', borderRadius: '8px' }}>
|
|
191
|
+
<h3>Test Elements for Audit</h3>
|
|
192
|
+
<img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='50'%3E%3Crect width='100' height='50' fill='%23ddd'/%3E%3C/svg%3E" />
|
|
193
|
+
<button>Unlabeled Button</button>
|
|
194
|
+
<input type="text" placeholder="Unlabeled Input" />
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
);
|
|
198
198
|
};
|
|
199
199
|
|
|
200
200
|
const meta: Meta<typeof AccessibilityProvider> = {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
201
|
+
title: 'Framework/AccessibilityProvider',
|
|
202
|
+
component: AccessibilityProvider,
|
|
203
|
+
parameters: {
|
|
204
|
+
layout: 'fullscreen',
|
|
205
|
+
docs: {
|
|
206
|
+
description: {
|
|
207
|
+
component: 'Provides comprehensive accessibility context and utilities including system preference detection, keyboard navigation, ARIA announcements, and accessibility auditing.',
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
tags: ['autodocs'],
|
|
212
|
+
argTypes: {
|
|
213
|
+
enableAudit: {
|
|
214
|
+
description: 'Whether to enable automatic accessibility auditing (defaults to development mode)',
|
|
215
|
+
control: 'boolean',
|
|
216
|
+
},
|
|
217
|
+
children: {
|
|
218
|
+
description: 'Child components that will have access to accessibility context',
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
221
|
};
|
|
222
222
|
|
|
223
223
|
export default meta;
|
|
@@ -225,60 +225,60 @@ type Story = StoryObj<typeof meta>;
|
|
|
225
225
|
|
|
226
226
|
// Default story with full demo
|
|
227
227
|
export const Default: Story = {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
228
|
+
args: {
|
|
229
|
+
children: <AccessibilityDemo />,
|
|
230
|
+
enableAudit: true,
|
|
231
|
+
},
|
|
232
232
|
};
|
|
233
233
|
|
|
234
234
|
// Story showing basic usage without audit
|
|
235
235
|
export const BasicUsage: Story = {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
236
|
+
args: {
|
|
237
|
+
enableAudit: false,
|
|
238
|
+
children: (
|
|
239
|
+
<div style={{ padding: '2rem' }}>
|
|
240
|
+
<h2>Basic AccessibilityProvider Usage</h2>
|
|
241
|
+
<p>This provider automatically detects system preferences and manages keyboard navigation.</p>
|
|
242
|
+
<button>Try tabbing to this button</button>
|
|
243
|
+
<br /><br />
|
|
244
|
+
<input type="text" placeholder="Type here and use Tab key" />
|
|
245
|
+
</div>
|
|
246
|
+
),
|
|
247
|
+
},
|
|
248
|
+
parameters: {
|
|
249
|
+
docs: {
|
|
250
|
+
description: {
|
|
251
|
+
story: 'Basic usage of AccessibilityProvider without auditing enabled.',
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
255
|
};
|
|
256
256
|
|
|
257
257
|
// Story demonstrating keyboard navigation
|
|
258
258
|
export const KeyboardNavigation: Story = {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
259
|
+
args: {
|
|
260
|
+
children: (
|
|
261
|
+
<div style={{ padding: '2rem' }}>
|
|
262
|
+
<h2>Keyboard Navigation Test</h2>
|
|
263
|
+
<p>Press Tab to navigate between elements. When using keyboard, focus indicators will be enhanced.</p>
|
|
264
|
+
<button>Button 1</button>
|
|
265
|
+
<br /><br />
|
|
266
|
+
<input type="text" placeholder="Input field" />
|
|
267
|
+
<br /><br />
|
|
268
|
+
<select>
|
|
269
|
+
<option>Option 1</option>
|
|
270
|
+
<option>Option 2</option>
|
|
271
|
+
</select>
|
|
272
|
+
<br /><br />
|
|
273
|
+
<a href="#" onClick={(e) => e.preventDefault()}>Link element</a>
|
|
274
|
+
</div>
|
|
275
|
+
),
|
|
276
|
+
},
|
|
277
|
+
parameters: {
|
|
278
|
+
docs: {
|
|
279
|
+
description: {
|
|
280
|
+
story: 'Test keyboard navigation to see enhanced focus indicators when using Tab key.',
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
284
|
};
|