@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,560 @@
1
+ /**
2
+ * Text Component Stories - Comprehensive typography with data binding support
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { Box, Divider, Typography, Alert, Paper, Grid } from '@mui/material';
8
+ import { JsonDataProvider } from '@qwickapps/schema';
9
+ import type { Meta, StoryObj } from '@storybook/react';
10
+ import { Text } from '../components/blocks';
11
+ import { ComponentTransformer } from '../schemas/transformers/ComponentTransformer';
12
+ import { ModelView } from '../components/base/ModelView';
13
+ import QwickApp from '../components/QwickApp';
14
+ import React from 'react';
15
+
16
+ // Sample text content for different use cases
17
+ const sampleContent = {
18
+ headings: {
19
+ hero: 'Transform Your Ideas Into Reality',
20
+ section: 'Why Choose QwickApps?',
21
+ subsection: 'Built for Modern Development'
22
+ },
23
+ body: {
24
+ introduction: 'QwickApps provides a comprehensive React framework with advanced serialization capabilities, making it easy to build dynamic, data-driven applications.',
25
+ description: 'Our components are designed with accessibility, performance, and developer experience in mind. Each component supports full serialization for "WebView for React" functionality.',
26
+ conclusion: 'Get started today and see how QwickApps can accelerate your development workflow.'
27
+ },
28
+ ui: {
29
+ buttonText: 'Get Started Now',
30
+ linkText: 'Learn More',
31
+ caption: 'Photo by John Doe on Unsplash'
32
+ }
33
+ };
34
+
35
+ // Sample CMS data for data binding examples
36
+ const sampleCmsData = {
37
+ content: {
38
+ heroTitle: {
39
+ content: sampleContent.headings.hero,
40
+ variant: 'h1',
41
+ color: 'primary',
42
+ align: 'center',
43
+ gutterBottom: true,
44
+ fontWeight: 'bold'
45
+ },
46
+ sectionHeading: {
47
+ content: sampleContent.headings.section,
48
+ variant: 'h2',
49
+ color: 'textPrimary',
50
+ align: 'left',
51
+ gutterBottom: true,
52
+ textTransform: 'uppercase',
53
+ letterSpacing: '0.1em'
54
+ },
55
+ bodyText: {
56
+ content: sampleContent.body.introduction,
57
+ variant: 'body1',
58
+ color: 'textSecondary',
59
+ align: 'left',
60
+ paragraph: true,
61
+ lineHeight: '1.6'
62
+ },
63
+ callToAction: {
64
+ content: sampleContent.ui.buttonText,
65
+ variant: 'button',
66
+ color: 'primary',
67
+ align: 'center',
68
+ fontWeight: 'bold',
69
+ textTransform: 'uppercase'
70
+ },
71
+ caption: {
72
+ content: sampleContent.ui.caption,
73
+ variant: 'caption',
74
+ color: 'textSecondary',
75
+ align: 'right',
76
+ fontStyle: 'italic'
77
+ },
78
+ customStyled: {
79
+ content: 'Custom Typography Styling',
80
+ variant: 'h3',
81
+ customColor: '#ff6b35',
82
+ fontSize: '2.5rem',
83
+ fontFamily: '"Roboto Condensed", sans-serif',
84
+ textDecoration: 'underline',
85
+ maxWidth: '600px'
86
+ }
87
+ }
88
+ };
89
+
90
+ const dataProvider = new JsonDataProvider({ data: sampleCmsData });
91
+
92
+ const meta = {
93
+ title: 'Components/Text',
94
+ component: Text,
95
+ parameters: {
96
+ layout: 'padded',
97
+ docs: {
98
+ description: {
99
+ component: `Text is a comprehensive typography component with advanced styling options and full serialization support.
100
+
101
+ **Key Features:**
102
+ - **Typography Variants**: Complete Material-UI variant support (h1-h6, body1/2, subtitle, etc.)
103
+ - **Rich Styling**: Color variants, alignment, font properties, and text formatting
104
+ - **Custom Typography**: Override fontSize, fontFamily, lineHeight, letterSpacing
105
+ - **Text Formatting**: Support for bold, italic, underline, and text transformation
106
+ - **Semantic HTML**: Proper HTML element rendering for accessibility (h1-h6, p, span, etc.)
107
+ - **Responsive Design**: MaxWidth control and responsive text sizing
108
+ - **Data Binding**: Full CMS integration through dataSource prop
109
+ - **Performance**: Optimized rendering with lazy evaluation
110
+ - **Accessibility**: Proper semantic markup and ARIA support
111
+ - **Customization**: Extensive styling options and theme integration
112
+
113
+ **Perfect For:**
114
+ - Headings and titles across all levels
115
+ - Body text and paragraphs
116
+ - UI labels and captions
117
+ - Call-to-action text
118
+ - Rich typography layouts
119
+ - Content management systems
120
+ - Dynamic text rendering
121
+
122
+ **Serialization Support:**
123
+ The Text component extends ModelView and supports full JSON serialization/deserialization for "WebView for React" functionality, making it perfect for dynamic content management and data-driven applications.`
124
+ }
125
+ }
126
+ },
127
+ argTypes: {
128
+ content: {
129
+ control: 'text',
130
+ description: 'The text content to display'
131
+ },
132
+ variant: {
133
+ control: 'select',
134
+ options: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'button', 'caption', 'overline'],
135
+ description: 'Typography variant that determines font size, weight, and line height'
136
+ },
137
+ color: {
138
+ control: 'select',
139
+ options: ['primary', 'secondary', 'textPrimary', 'textSecondary', 'error', 'warning', 'info', 'success', 'inherit'],
140
+ description: 'Color variant for the text'
141
+ },
142
+ align: {
143
+ control: 'select',
144
+ options: ['left', 'center', 'right', 'justify', 'inherit'],
145
+ description: 'Text alignment'
146
+ },
147
+ component: {
148
+ control: 'select',
149
+ options: ['p', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'label', 'legend'],
150
+ description: 'HTML element to render'
151
+ },
152
+ fontWeight: {
153
+ control: 'select',
154
+ options: ['inherit', 'lighter', 'normal', 'bold', 'bolder', '100', '200', '300', '400', '500', '600', '700', '800', '900'],
155
+ description: 'Font weight'
156
+ },
157
+ noWrap: {
158
+ control: 'boolean',
159
+ description: 'Prevent text wrapping'
160
+ },
161
+ paragraph: {
162
+ control: 'boolean',
163
+ description: 'Apply paragraph spacing'
164
+ },
165
+ gutterBottom: {
166
+ control: 'boolean',
167
+ description: 'Add bottom margin'
168
+ }
169
+ }
170
+ } satisfies Meta<typeof Text>;
171
+
172
+ export default meta;
173
+ type Story = StoryObj<typeof meta>;
174
+
175
+ // Basic examples
176
+ export const Default: Story = {
177
+ args: {
178
+ content: 'This is the default text component with body1 variant.',
179
+ variant: 'body1'
180
+ }
181
+ };
182
+
183
+ export const Heading1: Story = {
184
+ args: {
185
+ content: 'Main Page Heading',
186
+ variant: 'h1',
187
+ color: 'primary',
188
+ gutterBottom: true
189
+ }
190
+ };
191
+
192
+ export const Heading2: Story = {
193
+ args: {
194
+ content: 'Section Heading',
195
+ variant: 'h2',
196
+ color: 'textPrimary',
197
+ gutterBottom: true
198
+ }
199
+ };
200
+
201
+ export const BodyText: Story = {
202
+ args: {
203
+ content: 'This is body text that provides detailed information about a topic. It uses the body1 variant which is optimized for readability and comfortable reading.',
204
+ variant: 'body1',
205
+ paragraph: true
206
+ }
207
+ };
208
+
209
+ export const Caption: Story = {
210
+ args: {
211
+ content: 'This is a caption with smaller text',
212
+ variant: 'caption',
213
+ color: 'textSecondary'
214
+ }
215
+ };
216
+
217
+ // Typography variants showcase
218
+ export const TypographyVariants: Story = {
219
+ render: () => (
220
+ <Box sx={{ '& > *': { mb: 2 } }}>
221
+ <Text content="Heading 1 - Main titles" variant="h1" />
222
+ <Text content="Heading 2 - Section titles" variant="h2" />
223
+ <Text content="Heading 3 - Subsection titles" variant="h3" />
224
+ <Text content="Heading 4 - Card titles" variant="h4" />
225
+ <Text content="Heading 5 - Component titles" variant="h5" />
226
+ <Text content="Heading 6 - Small headings" variant="h6" />
227
+ <Text content="Subtitle 1 - Primary subtitles" variant="subtitle1" />
228
+ <Text content="Subtitle 2 - Secondary subtitles" variant="subtitle2" />
229
+ <Text content="Body 1 - Primary body text for comfortable reading" variant="body1" />
230
+ <Text content="Body 2 - Secondary body text, slightly smaller" variant="body2" />
231
+ <Text content="BUTTON TEXT" variant="button" />
232
+ <Text content="Caption text for images and small labels" variant="caption" />
233
+ <Text content="OVERLINE TEXT FOR CATEGORIES" variant="overline" />
234
+ </Box>
235
+ )
236
+ };
237
+
238
+ // Color variants
239
+ export const ColorVariants: Story = {
240
+ render: () => (
241
+ <Box sx={{ '& > *': { mb: 1 } }}>
242
+ <Text content="Primary color text" color="primary" />
243
+ <Text content="Secondary color text" color="secondary" />
244
+ <Text content="Primary text color" color="textPrimary" />
245
+ <Text content="Secondary text color" color="textSecondary" />
246
+ <Text content="Error color text" color="error" />
247
+ <Text content="Warning color text" color="warning" />
248
+ <Text content="Info color text" color="info" />
249
+ <Text content="Success color text" color="success" />
250
+ <Text content="Inherit color text" color="inherit" />
251
+ </Box>
252
+ )
253
+ };
254
+
255
+ // Text alignment
256
+ export const TextAlignment: Story = {
257
+ render: () => (
258
+ <Box sx={{ width: '400px', border: '1px solid #e0e0e0', p: 2, '& > *': { mb: 1 } }}>
259
+ <Text content="Left aligned text (default)" align="left" />
260
+ <Text content="Center aligned text" align="center" />
261
+ <Text content="Right aligned text" align="right" />
262
+ <Text content="Justified text that spans multiple lines to demonstrate how justify alignment works with longer content." align="justify" />
263
+ </Box>
264
+ )
265
+ };
266
+
267
+ // Font weights
268
+ export const FontWeights: Story = {
269
+ render: () => (
270
+ <Box sx={{ '& > *': { mb: 1 } }}>
271
+ <Text content="Light weight (300)" fontWeight="300" />
272
+ <Text content="Normal weight (400)" fontWeight="normal" />
273
+ <Text content="Medium weight (500)" fontWeight="500" />
274
+ <Text content="Bold weight (700)" fontWeight="bold" />
275
+ <Text content="Extra bold weight (800)" fontWeight="800" />
276
+ </Box>
277
+ )
278
+ };
279
+
280
+ // Text decorations and transforms
281
+ export const TextFormatting: Story = {
282
+ render: () => (
283
+ <Box sx={{ '& > *': { mb: 2 } }}>
284
+ <Typography variant="h6">Text Decorations:</Typography>
285
+ <Text content="Normal text" />
286
+ <Text content="Underlined text" textDecoration="underline" />
287
+ <Text content="Overlined text" textDecoration="overline" />
288
+ <Text content="Line-through text" textDecoration="line-through" />
289
+
290
+ <Typography variant="h6" sx={{ mt: 3 }}>Text Transforms:</Typography>
291
+ <Text content="normal text case" textTransform="none" />
292
+ <Text content="capitalized text" textTransform="capitalize" />
293
+ <Text content="uppercase text" textTransform="uppercase" />
294
+ <Text content="LOWERCASE TEXT" textTransform="lowercase" />
295
+ </Box>
296
+ )
297
+ };
298
+
299
+ // Custom styling
300
+ export const CustomStyling: Story = {
301
+ render: () => (
302
+ <Box sx={{ '& > *': { mb: 3 } }}>
303
+ <Text
304
+ content="Custom Font Size"
305
+ variant="h4"
306
+ fontSize="3rem"
307
+ color="primary"
308
+ />
309
+ <Text
310
+ content="Custom Color and Font Family"
311
+ variant="h5"
312
+ customColor="#ff6b35"
313
+ fontFamily='"Roboto Condensed", sans-serif'
314
+ />
315
+ <Text
316
+ content="Custom Line Height and Letter Spacing"
317
+ variant="body1"
318
+ lineHeight="2"
319
+ letterSpacing="0.2em"
320
+ maxWidth="400px"
321
+ />
322
+ </Box>
323
+ )
324
+ };
325
+
326
+ // Semantic HTML elements
327
+ export const SemanticElements: Story = {
328
+ render: () => (
329
+ <Box sx={{ '& > *': { mb: 1 } }}>
330
+ <Text content="Paragraph element" component="p" variant="body1" />
331
+ <Text content="Span element" component="span" variant="body2" />
332
+ <Text content="Div element" component="div" variant="subtitle1" />
333
+ <Text content="H1 semantic element" component="h1" variant="h4" />
334
+ <Text content="H2 semantic element" component="h2" variant="h5" />
335
+ <Text content="Label element" component="label" variant="body1" />
336
+ </Box>
337
+ )
338
+ };
339
+
340
+ // Responsive text
341
+ export const ResponsiveText: Story = {
342
+ render: () => (
343
+ <Box sx={{ '& > *': { mb: 2 } }}>
344
+ <Text
345
+ content="Responsive heading that adapts to screen size"
346
+ variant="h2"
347
+ sx={{
348
+ fontSize: { xs: '1.5rem', sm: '2rem', md: '2.5rem', lg: '3rem' }
349
+ }}
350
+ />
351
+ <Text
352
+ content="This text has a maximum width and will wrap appropriately"
353
+ variant="body1"
354
+ maxWidth="300px"
355
+ paragraph
356
+ />
357
+ </Box>
358
+ )
359
+ };
360
+
361
+ // Data binding example
362
+ export const DataBinding: Story = {
363
+ render: () => (
364
+ <QwickApp dataProvider={dataProvider}>
365
+ <Box sx={{ '& > *': { mb: 3 } }}>
366
+ <Alert severity="info" sx={{ mb: 3 }}>
367
+ <Typography variant="body2">
368
+ These Text components are populated from CMS data using the dataSource prop.
369
+ Content, styling, and formatting are all managed through the data provider.
370
+ </Typography>
371
+ </Alert>
372
+
373
+ <Text
374
+ dataSource="content.heroTitle"
375
+ dataBinding={{
376
+ content: 'content',
377
+ variant: 'variant',
378
+ color: 'color',
379
+ align: 'align',
380
+ gutterBottom: 'gutterBottom',
381
+ fontWeight: 'fontWeight'
382
+ }}
383
+ />
384
+
385
+ <Text
386
+ dataSource="content.sectionHeading"
387
+ dataBinding={{
388
+ content: 'content',
389
+ variant: 'variant',
390
+ color: 'color',
391
+ textTransform: 'textTransform',
392
+ letterSpacing: 'letterSpacing'
393
+ }}
394
+ />
395
+
396
+ <Text
397
+ dataSource="content.bodyText"
398
+ dataBinding={{
399
+ content: 'content',
400
+ variant: 'variant',
401
+ color: 'color',
402
+ paragraph: 'paragraph',
403
+ lineHeight: 'lineHeight'
404
+ }}
405
+ />
406
+
407
+ <Text
408
+ dataSource="content.callToAction"
409
+ dataBinding={{
410
+ content: 'content',
411
+ variant: 'variant',
412
+ color: 'color',
413
+ fontWeight: 'fontWeight',
414
+ textTransform: 'textTransform'
415
+ }}
416
+ />
417
+ </Box>
418
+ </QwickApp>
419
+ )
420
+ };
421
+
422
+ // Serialization example
423
+ export const SerializationExample: Story = {
424
+ render: () => {
425
+ // Create Text component instances
426
+ const originalText = new Text({
427
+ content: 'Serializable Typography Component',
428
+ variant: 'h3',
429
+ color: 'primary',
430
+ align: 'center',
431
+ fontWeight: 'bold',
432
+ gutterBottom: true,
433
+ customColor: '#1976d2',
434
+ fontSize: '2rem'
435
+ });
436
+
437
+ // Serialize to JSON
438
+ const serializedJson = ComponentTransformer.serialize(originalText.render());
439
+
440
+ // Deserialize back to component
441
+ const deserializedComponent = ComponentTransformer.deserialize(serializedJson);
442
+
443
+ return (
444
+ <Paper elevation={2} sx={{ p: 3 }}>
445
+ <Typography variant="h5" gutterBottom>
446
+ Text Component Serialization Demo
447
+ </Typography>
448
+
449
+ <Alert severity="success" sx={{ mb: 3 }}>
450
+ <Typography variant="body2">
451
+ This demonstrates full JSON serialization/deserialization of Text components.
452
+ The component below was serialized to JSON and then reconstructed.
453
+ </Typography>
454
+ </Alert>
455
+
456
+ <Box sx={{ mb: 3 }}>
457
+ <Typography variant="h6" gutterBottom>Original Component:</Typography>
458
+ {originalText.render()}
459
+ </Box>
460
+
461
+ <Box sx={{ mb: 3 }}>
462
+ <Typography variant="h6" gutterBottom>Serialized JSON:</Typography>
463
+ <Paper variant="outlined" sx={{ p: 2, bgcolor: 'grey.50' }}>
464
+ <pre style={{ margin: 0, fontSize: '12px', wordWrap: 'break-word', whiteSpace: 'pre-wrap' }}>
465
+ {JSON.stringify(JSON.parse(serializedJson), null, 2)}
466
+ </pre>
467
+ </Paper>
468
+ </Box>
469
+
470
+ <Box>
471
+ <Typography variant="h6" gutterBottom>Deserialized Component:</Typography>
472
+ {deserializedComponent}
473
+ </Box>
474
+ </Paper>
475
+ );
476
+ }
477
+ };
478
+
479
+ // Advanced layout example
480
+ export const AdvancedLayout: Story = {
481
+ render: () => (
482
+ <Grid container spacing={3}>
483
+ <Grid item xs={12}>
484
+ <Text
485
+ content="Advanced Typography Layout"
486
+ variant="h2"
487
+ align="center"
488
+ color="primary"
489
+ gutterBottom
490
+ />
491
+ </Grid>
492
+
493
+ <Grid item xs={12} md={4}>
494
+ <Paper elevation={1} sx={{ p: 3, height: '100%' }}>
495
+ <Text
496
+ content="Feature One"
497
+ variant="h4"
498
+ color="primary"
499
+ gutterBottom
500
+ />
501
+ <Text
502
+ content="This is a detailed description of the first feature, showcasing how typography can be used effectively in card layouts."
503
+ variant="body1"
504
+ paragraph
505
+ />
506
+ <Text
507
+ content="Learn More"
508
+ variant="button"
509
+ color="primary"
510
+ fontWeight="bold"
511
+ />
512
+ </Paper>
513
+ </Grid>
514
+
515
+ <Grid item xs={12} md={4}>
516
+ <Paper elevation={1} sx={{ p: 3, height: '100%' }}>
517
+ <Text
518
+ content="Feature Two"
519
+ variant="h4"
520
+ color="secondary"
521
+ gutterBottom
522
+ />
523
+ <Text
524
+ content="Another feature description with different styling to show the flexibility of the Text component in various contexts."
525
+ variant="body1"
526
+ paragraph
527
+ />
528
+ <Text
529
+ content="Get Started"
530
+ variant="button"
531
+ color="secondary"
532
+ fontWeight="bold"
533
+ />
534
+ </Paper>
535
+ </Grid>
536
+
537
+ <Grid item xs={12} md={4}>
538
+ <Paper elevation={1} sx={{ p: 3, height: '100%' }}>
539
+ <Text
540
+ content="Feature Three"
541
+ variant="h4"
542
+ color="success"
543
+ gutterBottom
544
+ />
545
+ <Text
546
+ content="The final feature showcase, demonstrating consistent typography patterns across multiple content areas."
547
+ variant="body1"
548
+ paragraph
549
+ />
550
+ <Text
551
+ content="Try Now"
552
+ variant="button"
553
+ color="success"
554
+ fontWeight="bold"
555
+ />
556
+ </Paper>
557
+ </Grid>
558
+ </Grid>
559
+ )
560
+ };