@qwickapps/react-framework 1.3.4 → 1.4.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.
Files changed (325) hide show
  1. package/README.md +1688 -2
  2. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts +66 -0
  3. package/dist/__tests__/schemas/transformers/MockSerializableComponent.d.ts.map +1 -0
  4. package/dist/components/ErrorBoundary.d.ts +7 -0
  5. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  6. package/dist/components/Html.d.ts +28 -18
  7. package/dist/components/Html.d.ts.map +1 -1
  8. package/dist/components/Logo.d.ts +12 -35
  9. package/dist/components/Logo.d.ts.map +1 -1
  10. package/dist/components/Markdown.d.ts +18 -13
  11. package/dist/components/Markdown.d.ts.map +1 -1
  12. package/dist/components/QwickApp.d.ts +16 -3
  13. package/dist/components/QwickApp.d.ts.map +1 -1
  14. package/dist/components/QwickIcon.d.ts +23 -0
  15. package/dist/components/QwickIcon.d.ts.map +1 -0
  16. package/dist/components/SafeSpan.d.ts +12 -5
  17. package/dist/components/SafeSpan.d.ts.map +1 -1
  18. package/dist/components/Scaffold.d.ts.map +1 -1
  19. package/dist/components/base/ModelView.d.ts +101 -0
  20. package/dist/components/base/ModelView.d.ts.map +1 -0
  21. package/dist/components/base/index.d.ts +11 -0
  22. package/dist/components/base/index.d.ts.map +1 -0
  23. package/dist/components/blocks/Article.d.ts +12 -2
  24. package/dist/components/blocks/Article.d.ts.map +1 -1
  25. package/dist/components/blocks/Code.d.ts +13 -2
  26. package/dist/components/blocks/Code.d.ts.map +1 -1
  27. package/dist/components/blocks/Content.d.ts.map +1 -1
  28. package/dist/components/blocks/CoverImageHeader.d.ts.map +1 -1
  29. package/dist/components/blocks/FeatureCard.d.ts.map +1 -1
  30. package/dist/components/blocks/FeatureGrid.d.ts.map +1 -1
  31. package/dist/components/blocks/Footer.d.ts.map +1 -1
  32. package/dist/components/blocks/HeroBlock.d.ts +27 -13
  33. package/dist/components/blocks/HeroBlock.d.ts.map +1 -1
  34. package/dist/components/blocks/Image.d.ts +41 -0
  35. package/dist/components/blocks/Image.d.ts.map +1 -0
  36. package/dist/components/blocks/PageBannerHeader.d.ts.map +1 -1
  37. package/dist/components/blocks/ProductCard.d.ts.map +1 -1
  38. package/dist/components/blocks/Section.d.ts +16 -2
  39. package/dist/components/blocks/Section.d.ts.map +1 -1
  40. package/dist/components/blocks/Text.d.ts +41 -0
  41. package/dist/components/blocks/Text.d.ts.map +1 -0
  42. package/dist/components/blocks/index.d.ts +4 -0
  43. package/dist/components/blocks/index.d.ts.map +1 -1
  44. package/dist/components/buttons/Button.d.ts +23 -7
  45. package/dist/components/buttons/Button.d.ts.map +1 -1
  46. package/dist/components/forms/FormBlock.d.ts +19 -13
  47. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  48. package/dist/components/index.d.ts +4 -0
  49. package/dist/components/index.d.ts.map +1 -1
  50. package/dist/components/input/ChoiceInputField.d.ts +17 -11
  51. package/dist/components/input/ChoiceInputField.d.ts.map +1 -1
  52. package/dist/components/input/HtmlInputField.d.ts +17 -11
  53. package/dist/components/input/HtmlInputField.d.ts.map +1 -1
  54. package/dist/components/input/SelectInputField.d.ts +16 -10
  55. package/dist/components/input/SelectInputField.d.ts.map +1 -1
  56. package/dist/components/input/SwitchInputField.d.ts +16 -10
  57. package/dist/components/input/SwitchInputField.d.ts.map +1 -1
  58. package/dist/components/input/TextField.d.ts.map +1 -1
  59. package/dist/components/input/TextInputField.d.ts +16 -11
  60. package/dist/components/input/TextInputField.d.ts.map +1 -1
  61. package/dist/components/layout/GridCell.d.ts +23 -6
  62. package/dist/components/layout/GridCell.d.ts.map +1 -1
  63. package/dist/components/layout/GridLayout.d.ts +24 -23
  64. package/dist/components/layout/GridLayout.d.ts.map +1 -1
  65. package/dist/components/pages/FormPage.d.ts.map +1 -1
  66. package/dist/components/pages/Page.d.ts +49 -87
  67. package/dist/components/pages/Page.d.ts.map +1 -1
  68. package/dist/components/pages/index.d.ts +2 -2
  69. package/dist/components/pages/index.d.ts.map +1 -1
  70. package/dist/config/AppConfig.d.ts +49 -0
  71. package/dist/config/AppConfig.d.ts.map +1 -0
  72. package/dist/config/AppConfigBuilder.d.ts +75 -0
  73. package/dist/config/AppConfigBuilder.d.ts.map +1 -0
  74. package/dist/config/index.d.ts +13 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/types.d.ts +130 -0
  77. package/dist/config/types.d.ts.map +1 -0
  78. package/dist/config.d.ts +15 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.esm.js +451 -0
  81. package/dist/config.js +455 -0
  82. package/dist/contexts/PrintModeContext.d.ts +27 -0
  83. package/dist/contexts/PrintModeContext.d.ts.map +1 -0
  84. package/dist/contexts/QwickAppContext.d.ts +2 -2
  85. package/dist/contexts/QwickAppContext.d.ts.map +1 -1
  86. package/dist/contexts/ThemeContext.d.ts.map +1 -1
  87. package/dist/contexts/index.d.ts +2 -0
  88. package/dist/contexts/index.d.ts.map +1 -1
  89. package/dist/hooks/index.d.ts +2 -0
  90. package/dist/hooks/index.d.ts.map +1 -1
  91. package/dist/hooks/usePrintMode.d.ts +39 -0
  92. package/dist/hooks/usePrintMode.d.ts.map +1 -0
  93. package/dist/index.css +1 -1
  94. package/dist/index.d.ts +1 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.esm.css +1 -1
  97. package/dist/index.esm.js +20722 -16021
  98. package/dist/index.js +20725 -16010
  99. package/dist/schemas/CodeSchema.d.ts +2 -1
  100. package/dist/schemas/CodeSchema.d.ts.map +1 -1
  101. package/dist/schemas/CollapsibleLayoutSchema.d.ts +2 -1
  102. package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -1
  103. package/dist/schemas/ContentSchema.d.ts +2 -1
  104. package/dist/schemas/ContentSchema.d.ts.map +1 -1
  105. package/dist/schemas/GridCellSchema.d.ts +25 -0
  106. package/dist/schemas/GridCellSchema.d.ts.map +1 -0
  107. package/dist/schemas/GridLayoutSchema.d.ts +23 -0
  108. package/dist/schemas/GridLayoutSchema.d.ts.map +1 -0
  109. package/dist/schemas/HtmlSchema.d.ts +14 -0
  110. package/dist/schemas/HtmlSchema.d.ts.map +1 -0
  111. package/dist/schemas/ImageSchema.d.ts +32 -0
  112. package/dist/schemas/ImageSchema.d.ts.map +1 -0
  113. package/dist/schemas/LogoSchema.d.ts +35 -0
  114. package/dist/schemas/LogoSchema.d.ts.map +1 -0
  115. package/dist/schemas/MarkdownSchema.d.ts +14 -0
  116. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  117. package/dist/schemas/PageTemplateSchema.d.ts +31 -0
  118. package/dist/schemas/PageTemplateSchema.d.ts.map +1 -0
  119. package/dist/schemas/PrintConfigSchema.d.ts +31 -0
  120. package/dist/schemas/PrintConfigSchema.d.ts.map +1 -0
  121. package/dist/schemas/SectionSchema.d.ts +2 -1
  122. package/dist/schemas/SectionSchema.d.ts.map +1 -1
  123. package/dist/schemas/TextSchema.d.ts +37 -0
  124. package/dist/schemas/TextSchema.d.ts.map +1 -0
  125. package/dist/schemas/ViewModelSchema.d.ts +23 -0
  126. package/dist/schemas/ViewModelSchema.d.ts.map +1 -0
  127. package/dist/schemas/index.d.ts +15 -1
  128. package/dist/schemas/index.d.ts.map +1 -1
  129. package/dist/schemas/transformers/ComponentTransformer.d.ts +116 -0
  130. package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -0
  131. package/dist/schemas/transformers/ReactNodeTransformer.d.ts +53 -0
  132. package/dist/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -0
  133. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts +66 -0
  134. package/dist/schemas/transformers/__tests__/MockSerializableComponent.d.ts.map +1 -0
  135. package/dist/schemas/transformers/registry.d.ts +15 -0
  136. package/dist/schemas/transformers/registry.d.ts.map +1 -0
  137. package/dist/schemas/types/Serializable.d.ts +46 -0
  138. package/dist/schemas/types/Serializable.d.ts.map +1 -0
  139. package/dist/utils/htmlTransform.d.ts.map +1 -1
  140. package/dist/utils/reactUtils.d.ts +12 -3
  141. package/dist/utils/reactUtils.d.ts.map +1 -1
  142. package/package.json +17 -3
  143. package/src/{components/__tests__ → __tests__/components}/AccessibilityProvider.test.tsx +1 -1
  144. package/src/{components/__tests__ → __tests__/components}/Article.test.tsx +1 -1
  145. package/src/{components/__tests__ → __tests__/components}/Breadcrumbs.test.tsx +1 -1
  146. package/src/{components/__tests__ → __tests__/components}/Button.test.tsx +1 -1
  147. package/src/{components/__tests__ → __tests__/components}/CardListGrid.test.tsx +2 -2
  148. package/src/{components/__tests__ → __tests__/components}/ChoiceInputField.test.tsx +1 -1
  149. package/src/{components/__tests__ → __tests__/components}/Code.test.tsx +1 -1
  150. package/src/{components/__tests__ → __tests__/components}/Content.integration.test.tsx +1 -1
  151. package/src/{components/__tests__ → __tests__/components}/Content.test.tsx +1 -1
  152. package/src/{components/__tests__ → __tests__/components}/CoverImageHeader.test.tsx +2 -2
  153. package/src/{components/__tests__ → __tests__/components}/ErrorBoundary.test.tsx +1 -1
  154. package/src/{components/__tests__ → __tests__/components}/FeatureCard.integration.test.tsx +2 -2
  155. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.integration.test.tsx +2 -2
  156. package/src/{components/__tests__ → __tests__/components}/FeatureGrid.test.tsx +2 -2
  157. package/src/{components/__tests__ → __tests__/components}/Footer.test.tsx +4 -4
  158. package/src/{components/__tests__ → __tests__/components}/FormBlock.test.tsx +1 -1
  159. package/src/{components/__tests__ → __tests__/components}/HeroBlock.integration.test.tsx +2 -2
  160. package/src/{components/__tests__ → __tests__/components}/HeroBlock.test.tsx +233 -7
  161. package/src/{components/__tests__ → __tests__/components}/Html.test.tsx +11 -2
  162. package/src/{components/__tests__ → __tests__/components}/HtmlInputField.test.tsx +3 -3
  163. package/src/__tests__/components/Logo.test.js +3 -3
  164. package/src/{components/__tests__ → __tests__/components}/Markdown.test.tsx +1 -1
  165. package/src/{components/__tests__ → __tests__/components}/PageBannerHeader.test.tsx +3 -3
  166. package/src/{components/__tests__ → __tests__/components}/PaletteSwitcher.test.tsx +3 -3
  167. package/src/{components/__tests__ → __tests__/components}/ProductCard.test.tsx +4 -4
  168. package/src/{components/__tests__ → __tests__/components}/SafeSpan.integration.test.tsx +2 -2
  169. package/src/{components/__tests__ → __tests__/components}/SafeSpan.simple.test.tsx +1 -1
  170. package/src/{components/__tests__ → __tests__/components}/SafeSpan.test.tsx +1 -1
  171. package/src/{components/__tests__ → __tests__/components}/Section.integration.test.tsx +1 -1
  172. package/src/{components/__tests__ → __tests__/components}/Section.test.tsx +1 -1
  173. package/src/{components/__tests__ → __tests__/components}/SelectInputField.test.tsx +1 -1
  174. package/src/{components/__tests__ → __tests__/components}/TextInputField.test.tsx +3 -3
  175. package/src/{components/__tests__ → __tests__/components}/ThemeSwitcher.test.tsx +3 -3
  176. package/src/__tests__/components/base/ModelView.test.tsx +220 -0
  177. package/src/__tests__/components/blocks/Code.performance.test.tsx +625 -0
  178. package/src/__tests__/components/blocks/Code.serialization.test.tsx +507 -0
  179. package/src/__tests__/components/blocks/HeroBlock.serialization.test.tsx +414 -0
  180. package/src/__tests__/components/blocks/Image.serialization.test.tsx +257 -0
  181. package/src/__tests__/components/blocks/Section.serialization.test.tsx +553 -0
  182. package/src/__tests__/components/blocks/Text.performance.test.tsx +442 -0
  183. package/src/__tests__/components/blocks/Text.serialization.test.tsx +491 -0
  184. package/src/__tests__/components/buttons/Button.serialization.test.tsx +443 -0
  185. package/src/__tests__/components/input/FormComponents.serialization.test.tsx +482 -0
  186. package/src/__tests__/components/input/SelectInputField.serialization.test.tsx +439 -0
  187. package/src/__tests__/components/input/TextInputField.serialization.test.tsx +359 -0
  188. package/src/{components/layout/CollapsibleLayout/__tests__ → __tests__/components/layout}/CollapsibleLayout.test.tsx +4 -4
  189. package/src/__tests__/components/layout/GridCell.serialization.test.tsx +403 -0
  190. package/src/__tests__/components/layout/GridLayout.serialization.test.tsx +311 -0
  191. package/src/__tests__/hooks/usePrintMode.test.ts +89 -0
  192. package/src/__tests__/schemas/PageTemplateSchema.test.ts +161 -0
  193. package/src/__tests__/schemas/PrintConfigSchema.test.ts +127 -0
  194. package/src/__tests__/schemas/ViewModelSchema.test.ts +80 -0
  195. package/src/__tests__/schemas/transformers/ComponentSerializationPatterns.test.tsx +602 -0
  196. package/src/__tests__/schemas/transformers/ComponentTransformer.htmlPatterns.test.ts +301 -0
  197. package/src/__tests__/schemas/transformers/ComponentTransformer.test.ts +521 -0
  198. package/src/__tests__/schemas/transformers/CrossBrowserCompatibility.test.ts +586 -0
  199. package/src/__tests__/schemas/transformers/MockSerializableComponent.ts +103 -0
  200. package/src/__tests__/schemas/transformers/RealWorldScenarios.test.tsx +1165 -0
  201. package/src/__tests__/schemas/transformers/SerializationErrorHandling.test.ts +602 -0
  202. package/src/__tests__/schemas/transformers/SerializationIntegration.test.tsx +691 -0
  203. package/src/__tests__/schemas/transformers/SerializationPerformance.test.ts +460 -0
  204. package/src/__tests__/schemas/transformers/TestAutomation.test.ts +597 -0
  205. package/src/{utils/__tests__ → __tests__/utils}/nested-dom-fix.test.tsx +1 -1
  206. package/src/components/ErrorBoundary.tsx +8 -8
  207. package/src/components/Html.tsx +147 -44
  208. package/src/components/Logo.tsx +198 -100
  209. package/src/components/Markdown.tsx +125 -16
  210. package/src/components/QwickApp.tsx +64 -31
  211. package/src/components/QwickIcon.tsx +59 -0
  212. package/src/components/SafeSpan.tsx +65 -10
  213. package/src/components/Scaffold.tsx +2 -8
  214. package/src/components/base/ModelView.tsx +199 -0
  215. package/src/components/base/index.ts +11 -0
  216. package/src/components/blocks/Article.tsx +57 -18
  217. package/src/components/blocks/Code.md +529 -0
  218. package/src/components/blocks/Code.tsx +102 -15
  219. package/src/components/blocks/Content.tsx +25 -77
  220. package/src/components/blocks/CoverImageHeader.tsx +9 -4
  221. package/src/components/blocks/FeatureCard.tsx +1 -2
  222. package/src/components/blocks/FeatureGrid.tsx +19 -1
  223. package/src/components/blocks/Footer.tsx +13 -1
  224. package/src/components/blocks/HeroBlock.tsx +87 -20
  225. package/src/components/blocks/Image.tsx +395 -0
  226. package/src/components/blocks/PageBannerHeader.tsx +14 -12
  227. package/src/components/blocks/ProductCard.tsx +51 -52
  228. package/src/components/blocks/Section.tsx +113 -8
  229. package/src/components/blocks/Text.tsx +285 -0
  230. package/src/components/blocks/index.ts +4 -0
  231. package/src/components/buttons/Button.tsx +184 -15
  232. package/src/components/forms/FormBlock.tsx +70 -17
  233. package/src/components/index.ts +5 -0
  234. package/src/components/input/ChoiceInputField.tsx +48 -18
  235. package/src/components/input/HtmlInputField.tsx +48 -18
  236. package/src/components/input/SelectInputField.tsx +48 -16
  237. package/src/components/input/SwitchInputField.tsx +48 -17
  238. package/src/components/input/TextField.tsx +41 -1
  239. package/src/components/input/TextInputField.tsx +52 -18
  240. package/src/components/layout/GridCell.tsx +118 -9
  241. package/src/components/layout/GridLayout.tsx +125 -24
  242. package/src/components/pages/FormPage.tsx +0 -1
  243. package/src/components/pages/Page.css +304 -332
  244. package/src/components/pages/Page.tsx +307 -255
  245. package/src/components/pages/index.ts +2 -2
  246. package/src/config/AppConfig.ts +133 -0
  247. package/src/config/AppConfigBuilder.ts +421 -0
  248. package/src/config/__tests__/AppConfig.test.ts +385 -0
  249. package/src/config/__tests__/AppConfigBuilder.test.ts +432 -0
  250. package/src/config/index.ts +24 -0
  251. package/src/config/types.ts +170 -0
  252. package/src/config.ts +25 -0
  253. package/src/contexts/PrintModeContext.tsx +332 -0
  254. package/src/contexts/QwickAppContext.tsx +2 -2
  255. package/src/contexts/ThemeContext.tsx +1 -2
  256. package/src/contexts/index.ts +2 -0
  257. package/src/hooks/index.ts +5 -1
  258. package/src/hooks/usePrintMode.ts +73 -0
  259. package/src/index.ts +3 -0
  260. package/src/schemas/CodeSchema.ts +3 -3
  261. package/src/schemas/CollapsibleLayoutSchema.ts +2 -1
  262. package/src/schemas/ContentSchema.ts +2 -1
  263. package/src/schemas/GridCellSchema.ts +164 -0
  264. package/src/schemas/GridLayoutSchema.ts +133 -0
  265. package/src/schemas/HtmlSchema.ts +47 -0
  266. package/src/schemas/ImageSchema.ts +235 -0
  267. package/src/schemas/LogoSchema.ts +241 -0
  268. package/src/schemas/MarkdownSchema.ts +47 -0
  269. package/src/schemas/PageTemplateSchema.ts +186 -0
  270. package/src/schemas/PrintConfigSchema.ts +207 -0
  271. package/src/schemas/README.md +661 -0
  272. package/src/schemas/SectionSchema.ts +2 -1
  273. package/src/schemas/TextSchema.ts +329 -0
  274. package/src/schemas/ViewModelSchema.ts +115 -0
  275. package/src/schemas/index.ts +21 -2
  276. package/src/schemas/transformers/ComponentTransformer.ts +403 -0
  277. package/src/schemas/transformers/ReactNodeTransformer.ts +236 -0
  278. package/src/schemas/transformers/registry.ts +72 -0
  279. package/src/schemas/types/Serializable.ts +51 -0
  280. package/src/stories/AccessibilityProvider.stories.tsx +253 -253
  281. package/src/stories/Article.stories.tsx +433 -433
  282. package/src/stories/Button.stories.tsx +1 -1
  283. package/src/stories/CardListGrid.stories.tsx +451 -451
  284. package/src/stories/ChoiceInputField.stories.tsx +503 -503
  285. package/src/stories/Code.stories.tsx +1 -1
  286. package/src/stories/CollapsibleLayout.stories.tsx +1414 -1414
  287. package/src/stories/Content.stories.tsx +393 -393
  288. package/src/stories/CoverImageHeader.stories.tsx +701 -701
  289. package/src/stories/DataBinding.advanced.stories.tsx +432 -432
  290. package/src/stories/DataProvider.stories.tsx +1192 -1192
  291. package/src/stories/FeatureCard.stories.tsx +557 -557
  292. package/src/stories/FeatureGrid.stories.tsx +594 -594
  293. package/src/stories/Footer.stories.tsx +640 -640
  294. package/src/stories/FormBlock.stories.tsx +760 -760
  295. package/src/stories/FormComponents.stories.tsx +349 -541
  296. package/src/stories/GridCell.stories.tsx +417 -0
  297. package/src/stories/GridLayout.stories.tsx +353 -0
  298. package/src/stories/HeroBlock.stories.tsx +862 -373
  299. package/src/stories/HtmlInputField.stories.tsx +474 -474
  300. package/src/stories/Image.stories.tsx +819 -0
  301. package/src/stories/Introduction.stories.tsx +667 -667
  302. package/src/stories/LayoutBlocks.stories.tsx +324 -324
  303. package/src/stories/Logo.stories.tsx +165 -6
  304. package/src/stories/Markdown.stories.tsx +137 -137
  305. package/src/stories/ModelView.stories.tsx +477 -0
  306. package/src/stories/Page.stories.tsx +688 -688
  307. package/src/stories/PageBannerHeader.stories.tsx +864 -864
  308. package/src/stories/PaletteSwitcher.stories.tsx +119 -119
  309. package/src/stories/ProductCard.stories.tsx +424 -424
  310. package/src/stories/QwickApp.stories.tsx +368 -368
  311. package/src/stories/ResponsiveMenu.stories.tsx +249 -249
  312. package/src/stories/SafeSpan.stories.tsx +531 -531
  313. package/src/stories/Section.stories.tsx +90 -2
  314. package/src/stories/SelectInputField.stories.tsx +524 -524
  315. package/src/stories/Text.stories.tsx +560 -0
  316. package/src/stories/TextInputField.stories.tsx +443 -443
  317. package/src/stories/ThemeSwitcher.stories.tsx +123 -123
  318. package/src/utils/htmlTransform.tsx +74 -53
  319. package/src/utils/reactUtils.tsx +57 -6
  320. package/dist/index.bundled.css +0 -12
  321. /package/src/{hooks/__tests__ → __tests__/hooks}/useDataBinding.test.tsx.disabled +0 -0
  322. /package/src/{schemas/__tests__ → __tests__/schemas}/builders.test.ts +0 -0
  323. /package/src/{utils/__tests__ → __tests__/utils}/createDataDrivenComponent.test.tsx.disabled +0 -0
  324. /package/src/{utils/__tests__ → __tests__/utils}/htmlTransform.test.tsx +0 -0
  325. /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
- 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();
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
- const [message, setMessage] = React.useState('');
23
+ const [message, setMessage] = React.useState('');
24
24
 
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>
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
- {/* 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>
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
- {/* 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>
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
- {/* 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>
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
- {/* 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
- );
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
- 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
- },
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
- args: {
229
- children: <AccessibilityDemo />,
230
- enableAudit: true,
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
- 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
- },
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
- 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
- },
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
  };