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