@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
@@ -14,146 +14,146 @@ import { useState } from 'react';
14
14
 
15
15
  // Sample choice input field data for different use cases
16
16
  const sampleCmsData = {
17
- 'choiceInputFields': {
18
- 'poll-question': {
19
- label: 'Poll Options',
20
- options: [
21
- 'Strongly Agree',
22
- 'Agree',
23
- 'Neutral',
24
- 'Disagree',
25
- 'Strongly Disagree'
26
- ],
27
- optionLabelPrefix: 'Choice',
28
- placeholder: 'Enter poll option...',
29
- addButtonText: 'Add Poll Option',
30
- rows: 1
31
- },
32
- 'quiz-answers': {
33
- label: 'Quiz Answer Options',
34
- options: [
35
- '<b>JavaScript</b> - A programming language',
36
- '<i>Python</i> - Another programming language',
37
- '<code>HTML</code> - Markup language',
38
- '<u>CSS</u> - Styling language'
39
- ],
40
- optionLabelPrefix: 'Answer',
41
- placeholder: 'Enter quiz answer with HTML formatting...',
42
- addButtonText: 'Add Answer',
43
- rows: 2
44
- },
45
- 'feature-requests': {
46
- label: 'Feature Request Categories',
47
- options: [
48
- '<b>🚀 Performance</b><br/>Speed and optimization improvements',
49
- '<b>🎨 UI/UX</b><br/>Interface and experience enhancements',
50
- '<b>⚙️ Functionality</b><br/>New features and capabilities',
51
- '<b>🔧 Bug Fixes</b><br/>Issues and error corrections'
52
- ],
53
- optionLabelPrefix: 'Category',
54
- placeholder: 'Describe feature category with HTML...',
55
- addButtonText: 'Add Category',
56
- rows: 3
57
- },
58
- 'product-benefits': {
59
- label: 'Product Benefits',
60
- options: [
61
- ' <b>Lightning Fast</b> - Optimized for speed',
62
- '🔒 <i>Secure by Design</i> - Built with security first',
63
- '📱 <u>Mobile Responsive</u> - Works on all devices'
64
- ],
65
- optionLabelPrefix: 'Benefit',
66
- placeholder: 'Describe product benefit...',
67
- addButtonText: 'Add Benefit',
68
- rows: 2
69
- },
70
- 'survey-responses': {
71
- label: 'Survey Response Options',
72
- options: [
73
- 'Excellent',
74
- 'Very Good',
75
- 'Good',
76
- 'Fair',
77
- 'Poor'
78
- ],
79
- optionLabelPrefix: 'Response',
80
- placeholder: 'Enter response option...',
81
- addButtonText: 'Add Response',
82
- rows: 1
83
- },
84
- 'faq-categories': {
85
- label: 'FAQ Categories',
86
- options: [
87
- '<b>Getting Started</b><br/>Basic setup and onboarding questions',
88
- '<b>Account Management</b><br/>Profile, billing, and subscription questions',
89
- '<b>Technical Support</b><br/>Technical issues and troubleshooting',
90
- '<b>Features & Usage</b><br/>How to use specific features'
91
- ],
92
- optionLabelPrefix: 'Category',
93
- placeholder: 'Define FAQ category with description...',
94
- addButtonText: 'Add FAQ Category',
95
- rows: 3
96
- },
97
- 'menu-items': {
98
- label: 'Navigation Menu Items',
99
- options: [
100
- 'Home',
101
- 'About Us',
102
- 'Services',
103
- 'Contact'
104
- ],
105
- optionLabelPrefix: 'Menu Item',
106
- placeholder: 'Enter menu item name...',
107
- addButtonText: 'Add Menu Item',
108
- rows: 1
109
- },
110
- 'pricing-tiers': {
111
- label: 'Pricing Tier Options',
112
- options: [
113
- '<b>💎 Premium</b> - $99/month<br/><i>All features included</i>',
114
- '<b>⚡ Pro</b> - $49/month<br/><i>Most popular plan</i>',
115
- '<b>🌟 Starter</b> - $19/month<br/><i>Perfect for beginners</i>'
116
- ],
117
- optionLabelPrefix: 'Tier',
118
- placeholder: 'Define pricing tier with details...',
119
- addButtonText: 'Add Pricing Tier',
120
- rows: 3
121
- },
122
- 'team-roles': {
123
- label: 'Team Role Definitions',
124
- options: [
125
- '<b>👑 Project Manager</b><br/>Oversees project execution and team coordination',
126
- '<b>💻 Senior Developer</b><br/>Leads technical development and code reviews'
127
- ],
128
- optionLabelPrefix: 'Role',
129
- placeholder: 'Define team role and responsibilities...',
130
- addButtonText: 'Add Team Role',
131
- rows: 3
132
- },
133
- 'basic-options': {
134
- label: 'Basic Options List',
135
- options: [
136
- 'Option A',
137
- 'Option B'
138
- ],
139
- optionLabelPrefix: 'Option',
140
- placeholder: 'Enter option...',
141
- addButtonText: 'Add Option',
142
- rows: 1
143
- }
144
- }
17
+ 'choiceInputFields': {
18
+ 'poll-question': {
19
+ label: 'Poll Options',
20
+ options: [
21
+ 'Strongly Agree',
22
+ 'Agree',
23
+ 'Neutral',
24
+ 'Disagree',
25
+ 'Strongly Disagree'
26
+ ],
27
+ optionLabelPrefix: 'Choice',
28
+ placeholder: 'Enter poll option...',
29
+ addButtonText: 'Add Poll Option',
30
+ rows: 1
31
+ },
32
+ 'quiz-answers': {
33
+ label: 'Quiz Answer Options',
34
+ options: [
35
+ '<b>JavaScript</b> - A programming language',
36
+ '<i>Python</i> - Another programming language',
37
+ '<code>HTML</code> - Markup language',
38
+ '<u>CSS</u> - Styling language'
39
+ ],
40
+ optionLabelPrefix: 'Answer',
41
+ placeholder: 'Enter quiz answer with HTML formatting...',
42
+ addButtonText: 'Add Answer',
43
+ rows: 2
44
+ },
45
+ 'feature-requests': {
46
+ label: 'Feature Request Categories',
47
+ options: [
48
+ '<b> Performance</b><br/>Speed and optimization improvements',
49
+ '<b> UI/UX</b><br/>Interface and experience enhancements',
50
+ '<b>⚙ Functionality</b><br/>New features and capabilities',
51
+ '<b> Bug Fixes</b><br/>Issues and error corrections'
52
+ ],
53
+ optionLabelPrefix: 'Category',
54
+ placeholder: 'Describe feature category with HTML...',
55
+ addButtonText: 'Add Category',
56
+ rows: 3
57
+ },
58
+ 'product-benefits': {
59
+ label: 'Product Benefits',
60
+ options: [
61
+ ' <b>Lightning Fast</b> - Optimized for speed',
62
+ '🔒 <i>Secure by Design</i> - Built with security first',
63
+ ' <u>Mobile Responsive</u> - Works on all devices'
64
+ ],
65
+ optionLabelPrefix: 'Benefit',
66
+ placeholder: 'Describe product benefit...',
67
+ addButtonText: 'Add Benefit',
68
+ rows: 2
69
+ },
70
+ 'survey-responses': {
71
+ label: 'Survey Response Options',
72
+ options: [
73
+ 'Excellent',
74
+ 'Very Good',
75
+ 'Good',
76
+ 'Fair',
77
+ 'Poor'
78
+ ],
79
+ optionLabelPrefix: 'Response',
80
+ placeholder: 'Enter response option...',
81
+ addButtonText: 'Add Response',
82
+ rows: 1
83
+ },
84
+ 'faq-categories': {
85
+ label: 'FAQ Categories',
86
+ options: [
87
+ '<b>Getting Started</b><br/>Basic setup and onboarding questions',
88
+ '<b>Account Management</b><br/>Profile, billing, and subscription questions',
89
+ '<b>Technical Support</b><br/>Technical issues and troubleshooting',
90
+ '<b>Features & Usage</b><br/>How to use specific features'
91
+ ],
92
+ optionLabelPrefix: 'Category',
93
+ placeholder: 'Define FAQ category with description...',
94
+ addButtonText: 'Add FAQ Category',
95
+ rows: 3
96
+ },
97
+ 'menu-items': {
98
+ label: 'Navigation Menu Items',
99
+ options: [
100
+ 'Home',
101
+ 'About Us',
102
+ 'Services',
103
+ 'Contact'
104
+ ],
105
+ optionLabelPrefix: 'Menu Item',
106
+ placeholder: 'Enter menu item name...',
107
+ addButtonText: 'Add Menu Item',
108
+ rows: 1
109
+ },
110
+ 'pricing-tiers': {
111
+ label: 'Pricing Tier Options',
112
+ options: [
113
+ '<b>💎 Premium</b> - $99/month<br/><i>All features included</i>',
114
+ '<b> Pro</b> - $49/month<br/><i>Most popular plan</i>',
115
+ '<b> Starter</b> - $19/month<br/><i>Perfect for beginners</i>'
116
+ ],
117
+ optionLabelPrefix: 'Tier',
118
+ placeholder: 'Define pricing tier with details...',
119
+ addButtonText: 'Add Pricing Tier',
120
+ rows: 3
121
+ },
122
+ 'team-roles': {
123
+ label: 'Team Role Definitions',
124
+ options: [
125
+ '<b>👑 Project Manager</b><br/>Oversees project execution and team coordination',
126
+ '<b> Senior Developer</b><br/>Leads technical development and code reviews'
127
+ ],
128
+ optionLabelPrefix: 'Role',
129
+ placeholder: 'Define team role and responsibilities...',
130
+ addButtonText: 'Add Team Role',
131
+ rows: 3
132
+ },
133
+ 'basic-options': {
134
+ label: 'Basic Options List',
135
+ options: [
136
+ 'Option A',
137
+ 'Option B'
138
+ ],
139
+ optionLabelPrefix: 'Option',
140
+ placeholder: 'Enter option...',
141
+ addButtonText: 'Add Option',
142
+ rows: 1
143
+ }
144
+ }
145
145
  };
146
146
 
147
147
  const dataProvider = new JsonDataProvider({ data: sampleCmsData });
148
148
 
149
149
  const meta = {
150
- title: 'Forms/ChoiceInputField',
151
- component: ChoiceInputField,
152
- parameters: {
153
- layout: 'padded',
154
- docs: {
155
- description: {
156
- component: `ChoiceInputField is a dynamic options management component with HTML formatting capabilities and data binding support for creating interactive choice lists.
150
+ title: 'Forms/ChoiceInputField',
151
+ component: ChoiceInputField,
152
+ parameters: {
153
+ layout: 'padded',
154
+ docs: {
155
+ description: {
156
+ component: `ChoiceInputField is a dynamic options management component with HTML formatting capabilities and data binding support for creating interactive choice lists.
157
157
 
158
158
  **Key Features:**
159
159
  - **Dynamic Options**: Add, edit, and manage multiple option inputs
@@ -172,10 +172,10 @@ const meta = {
172
172
  - FAQ category management
173
173
  - Menu and navigation item creation
174
174
  - Any dynamic list of formatted options`,
175
- },
176
- },
177
- },
178
- tags: ['autodocs'],
175
+ },
176
+ },
177
+ },
178
+ tags: ['autodocs'],
179
179
  } satisfies Meta<typeof ChoiceInputField>;
180
180
 
181
181
  export default meta;
@@ -183,409 +183,409 @@ type Story = StoryObj<typeof ChoiceInputField>;
183
183
 
184
184
  // Interactive example component
185
185
  function InteractiveChoiceExample({
186
- initialOptions = ['Option 1', 'Option 2'],
187
- label = 'Interactive Options',
188
- optionLabelPrefix = 'Option'
186
+ initialOptions = ['Option 1', 'Option 2'],
187
+ label = 'Interactive Options',
188
+ optionLabelPrefix = 'Option'
189
189
  }: {
190
- initialOptions?: string[];
191
- label?: string;
192
- optionLabelPrefix?: string;
190
+ initialOptions?: string[];
191
+ label?: string;
192
+ optionLabelPrefix?: string;
193
193
  }) {
194
- const [options, setOptions] = useState<string[]>(initialOptions);
195
-
196
- const handleOptionChange = (optionIndex: number, value: string) => {
197
- const newOptions = [...options];
198
- newOptions[optionIndex] = value;
199
- setOptions(newOptions);
200
- console.log('Option changed:', { optionIndex, value, allOptions: newOptions });
201
- };
202
-
203
- const handleAddOption = () => {
204
- setOptions([...options, '']);
205
- console.log('Added new option, total:', options.length + 1);
206
- };
207
-
208
- return (
209
- <ChoiceInputField
210
- label={label}
211
- options={options}
212
- optionLabelPrefix={optionLabelPrefix}
213
- onOptionChange={handleOptionChange}
214
- onAddOption={handleAddOption}
215
- placeholder="Enter option text. HTML formatting supported."
216
- />
217
- );
194
+ const [options, setOptions] = useState<string[]>(initialOptions);
195
+
196
+ const handleOptionChange = (optionIndex: number, value: string) => {
197
+ const newOptions = [...options];
198
+ newOptions[optionIndex] = value;
199
+ setOptions(newOptions);
200
+ console.log('Option changed:', { optionIndex, value, allOptions: newOptions });
201
+ };
202
+
203
+ const handleAddOption = () => {
204
+ setOptions([...options, '']);
205
+ console.log('Added new option, total:', options.length + 1);
206
+ };
207
+
208
+ return (
209
+ <ChoiceInputField
210
+ label={label}
211
+ options={options}
212
+ optionLabelPrefix={optionLabelPrefix}
213
+ onOptionChange={handleOptionChange}
214
+ onAddOption={handleAddOption}
215
+ placeholder="Enter option text. HTML formatting supported."
216
+ />
217
+ );
218
218
  }
219
219
 
220
220
  // Traditional Usage Examples
221
221
  export const BasicChoices: Story = {
222
- render: () => (
223
- <QwickApp appId="choice-input-basic" appName='Basic Choice Input'>
224
- <InteractiveChoiceExample
225
- initialOptions={['First Option', 'Second Option']}
226
- label="Basic Options List"
227
- />
228
- </QwickApp>
229
- ),
230
- parameters: {
231
- docs: {
232
- description: {
233
- story: 'Basic choice input field with editable options and add functionality.',
234
- },
235
- },
236
- },
222
+ render: () => (
223
+ <QwickApp appId="choice-input-basic" appName='Basic Choice Input'>
224
+ <InteractiveChoiceExample
225
+ initialOptions={['First Option', 'Second Option']}
226
+ label="Basic Options List"
227
+ />
228
+ </QwickApp>
229
+ ),
230
+ parameters: {
231
+ docs: {
232
+ description: {
233
+ story: 'Basic choice input field with editable options and add functionality.',
234
+ },
235
+ },
236
+ },
237
237
  };
238
238
 
239
239
  export const PollOptions: Story = {
240
- render: () => (
241
- <QwickApp appId="choice-input-poll" appName='Poll Options'>
242
- <InteractiveChoiceExample
243
- initialOptions={[
244
- 'Strongly Agree',
245
- 'Agree',
246
- 'Neutral',
247
- 'Disagree',
248
- 'Strongly Disagree'
249
- ]}
250
- label="Poll Question Options"
251
- optionLabelPrefix="Choice"
252
- />
253
- </QwickApp>
254
- ),
255
- parameters: {
256
- docs: {
257
- description: {
258
- story: 'Choice input configured for poll question options with standard survey responses.',
259
- },
260
- },
261
- },
240
+ render: () => (
241
+ <QwickApp appId="choice-input-poll" appName='Poll Options'>
242
+ <InteractiveChoiceExample
243
+ initialOptions={[
244
+ 'Strongly Agree',
245
+ 'Agree',
246
+ 'Neutral',
247
+ 'Disagree',
248
+ 'Strongly Disagree'
249
+ ]}
250
+ label="Poll Question Options"
251
+ optionLabelPrefix="Choice"
252
+ />
253
+ </QwickApp>
254
+ ),
255
+ parameters: {
256
+ docs: {
257
+ description: {
258
+ story: 'Choice input configured for poll question options with standard survey responses.',
259
+ },
260
+ },
261
+ },
262
262
  };
263
263
 
264
264
  export const HtmlFormattedOptions: Story = {
265
- render: () => (
266
- <QwickApp appId="choice-input-html" appName='HTML Formatted Options'>
267
- <InteractiveChoiceExample
268
- initialOptions={[
269
- '<b>JavaScript</b> - A programming language',
270
- '<i>Python</i> - Another programming language',
271
- '<code>HTML</code> - Markup language'
272
- ]}
273
- label="Quiz Answer Options"
274
- optionLabelPrefix="Answer"
275
- />
276
- </QwickApp>
277
- ),
278
- parameters: {
279
- docs: {
280
- description: {
281
- story: 'Choice input with HTML-formatted options for rich content like quiz answers.',
282
- },
283
- },
284
- },
265
+ render: () => (
266
+ <QwickApp appId="choice-input-html" appName='HTML Formatted Options'>
267
+ <InteractiveChoiceExample
268
+ initialOptions={[
269
+ '<b>JavaScript</b> - A programming language',
270
+ '<i>Python</i> - Another programming language',
271
+ '<code>HTML</code> - Markup language'
272
+ ]}
273
+ label="Quiz Answer Options"
274
+ optionLabelPrefix="Answer"
275
+ />
276
+ </QwickApp>
277
+ ),
278
+ parameters: {
279
+ docs: {
280
+ description: {
281
+ story: 'Choice input with HTML-formatted options for rich content like quiz answers.',
282
+ },
283
+ },
284
+ },
285
285
  };
286
286
 
287
287
  export const ProductFeatures: Story = {
288
- render: () => (
289
- <QwickApp appId="choice-input-features" appName='Product Features'>
290
- <InteractiveChoiceExample
291
- initialOptions={[
292
- ' <b>Lightning Fast</b> - Optimized for speed',
293
- '🔒 <i>Secure by Design</i> - Built with security first',
294
- '📱 <u>Mobile Responsive</u> - Works on all devices'
295
- ]}
296
- label="Product Benefits"
297
- optionLabelPrefix="Benefit"
298
- />
299
- </QwickApp>
300
- ),
301
- parameters: {
302
- docs: {
303
- description: {
304
- story: 'Choice input for managing product features and benefits with icons and formatting.',
305
- },
306
- },
307
- },
288
+ render: () => (
289
+ <QwickApp appId="choice-input-features" appName='Product Features'>
290
+ <InteractiveChoiceExample
291
+ initialOptions={[
292
+ ' <b>Lightning Fast</b> - Optimized for speed',
293
+ '🔒 <i>Secure by Design</i> - Built with security first',
294
+ ' <u>Mobile Responsive</u> - Works on all devices'
295
+ ]}
296
+ label="Product Benefits"
297
+ optionLabelPrefix="Benefit"
298
+ />
299
+ </QwickApp>
300
+ ),
301
+ parameters: {
302
+ docs: {
303
+ description: {
304
+ story: 'Choice input for managing product features and benefits with icons and formatting.',
305
+ },
306
+ },
307
+ },
308
308
  };
309
309
 
310
310
  export const StaticDisplay: Story = {
311
- render: () => (
312
- <QwickApp appId="choice-input-static" appName='Static Choice Display'>
313
- <ChoiceInputField
314
- label="Read-only Options"
315
- options={[
316
- 'Option 1 (read-only)',
317
- 'Option 2 (read-only)',
318
- 'Option 3 (read-only)'
319
- ]}
320
- optionLabelPrefix="Item"
321
- disabled={true}
322
- // No onAddOption or onOptionChange = static display
323
- />
324
- </QwickApp>
325
- ),
326
- parameters: {
327
- docs: {
328
- description: {
329
- story: 'Static choice input display without edit functionality for read-only scenarios.',
330
- },
331
- },
332
- },
311
+ render: () => (
312
+ <QwickApp appId="choice-input-static" appName='Static Choice Display'>
313
+ <ChoiceInputField
314
+ label="Read-only Options"
315
+ options={[
316
+ 'Option 1 (read-only)',
317
+ 'Option 2 (read-only)',
318
+ 'Option 3 (read-only)'
319
+ ]}
320
+ optionLabelPrefix="Item"
321
+ disabled={true}
322
+ // No onAddOption or onOptionChange = static display
323
+ />
324
+ </QwickApp>
325
+ ),
326
+ parameters: {
327
+ docs: {
328
+ description: {
329
+ story: 'Static choice input display without edit functionality for read-only scenarios.',
330
+ },
331
+ },
332
+ },
333
333
  };
334
334
 
335
335
  // Data Binding Examples
336
336
  export const DataBindingBasic: Story = {
337
- render: () => (
338
- <QwickApp appId="choice-input-data-binding" appName='ChoiceInputField Data Binding' dataSource={{ dataProvider }}>
339
- <Box>
340
-
341
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
342
- <Typography variant="h5" gutterBottom>📊 Data-Driven Choice Options</Typography>
343
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
344
- ChoiceInputField components can be completely driven by CMS data, loading options and configuration from your data source.
345
- </Typography>
346
-
347
- <Code title="Usage" language="tsx">{`<ChoiceInputField dataSource="choiceInputFields.poll-question" />`}</Code>
348
-
349
- <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.choiceInputFields['poll-question'], null, 2)}</Code>
350
- </Box>
337
+ render: () => (
338
+ <QwickApp appId="choice-input-data-binding" appName='ChoiceInputField Data Binding' dataSource={{ dataProvider }}>
339
+ <Box>
340
+
341
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
342
+ <Typography variant="h5" gutterBottom> Data-Driven Choice Options</Typography>
343
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
344
+ ChoiceInputField components can be completely driven by CMS data, loading options and configuration from your data source.
345
+ </Typography>
346
+
347
+ <Code title="Usage" language="tsx">{`<ChoiceInputField dataSource="choiceInputFields.poll-question" />`}</Code>
348
+
349
+ <Code title="Data Structure" language="json">{JSON.stringify(sampleCmsData.choiceInputFields['poll-question'], null, 2)}</Code>
350
+ </Box>
351
351
 
352
- <ChoiceInputField dataSource="choiceInputFields.poll-question" />
353
-
354
- </Box>
355
- </QwickApp>
356
- ),
357
- parameters: {
358
- docs: {
359
- description: {
360
- story: 'ChoiceInputField with data binding - options and configuration resolved from CMS data through dataSource.',
361
- },
362
- },
363
- },
352
+ <ChoiceInputField dataSource="choiceInputFields.poll-question" />
353
+
354
+ </Box>
355
+ </QwickApp>
356
+ ),
357
+ parameters: {
358
+ docs: {
359
+ description: {
360
+ story: 'ChoiceInputField with data binding - options and configuration resolved from CMS data through dataSource.',
361
+ },
362
+ },
363
+ },
364
364
  };
365
365
 
366
366
  export const DataBindingAdvanced: Story = {
367
- render: () => (
368
- <QwickApp appId="choice-input-data-advanced" appName='Advanced ChoiceInputField Data Binding' dataSource={{ dataProvider }}>
369
- <Box>
370
-
371
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
372
- <Typography variant="h5" gutterBottom>🎯 Multiple Choice Types</Typography>
373
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
374
- Different ChoiceInputField instances can load different option sets and configurations from separate data sources.
375
- </Typography>
376
- </Box>
367
+ render: () => (
368
+ <QwickApp appId="choice-input-data-advanced" appName='Advanced ChoiceInputField Data Binding' dataSource={{ dataProvider }}>
369
+ <Box>
370
+
371
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
372
+ <Typography variant="h5" gutterBottom> Multiple Choice Types</Typography>
373
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
374
+ Different ChoiceInputField instances can load different option sets and configurations from separate data sources.
375
+ </Typography>
376
+ </Box>
377
377
 
378
- {/* Survey & Polls */}
379
- <Box sx={{ mb: 4 }}>
380
- <Typography variant="h4" gutterBottom>Surveys & Polls</Typography>
381
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
382
- <ChoiceInputField dataSource="choiceInputFields.poll-question" />
383
- <ChoiceInputField dataSource="choiceInputFields.survey-responses" />
384
- </Box>
385
- </Box>
378
+ {/* Survey & Polls */}
379
+ <Box sx={{ mb: 4 }}>
380
+ <Typography variant="h4" gutterBottom>Surveys & Polls</Typography>
381
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
382
+ <ChoiceInputField dataSource="choiceInputFields.poll-question" />
383
+ <ChoiceInputField dataSource="choiceInputFields.survey-responses" />
384
+ </Box>
385
+ </Box>
386
386
 
387
- {/* Content Management */}
388
- <Box sx={{ mb: 4 }}>
389
- <Typography variant="h4" gutterBottom>Content & Learning</Typography>
390
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
391
- <ChoiceInputField dataSource="choiceInputFields.quiz-answers" />
392
- <ChoiceInputField dataSource="choiceInputFields.faq-categories" />
393
- </Box>
394
- </Box>
387
+ {/* Content Management */}
388
+ <Box sx={{ mb: 4 }}>
389
+ <Typography variant="h4" gutterBottom>Content & Learning</Typography>
390
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
391
+ <ChoiceInputField dataSource="choiceInputFields.quiz-answers" />
392
+ <ChoiceInputField dataSource="choiceInputFields.faq-categories" />
393
+ </Box>
394
+ </Box>
395
395
 
396
- {/* Business Configuration */}
397
- <Box sx={{ mb: 4 }}>
398
- <Typography variant="h4" gutterBottom>Business & Product</Typography>
399
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
400
- <ChoiceInputField dataSource="choiceInputFields.feature-requests" />
401
- <ChoiceInputField dataSource="choiceInputFields.pricing-tiers" />
402
- </Box>
403
- </Box>
404
-
405
- </Box>
406
- </QwickApp>
407
- ),
408
- parameters: {
409
- docs: {
410
- description: {
411
- story: 'Advanced data binding with multiple choice types showcasing different configurations and use cases.',
412
- },
413
- },
414
- },
396
+ {/* Business Configuration */}
397
+ <Box sx={{ mb: 4 }}>
398
+ <Typography variant="h4" gutterBottom>Business & Product</Typography>
399
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
400
+ <ChoiceInputField dataSource="choiceInputFields.feature-requests" />
401
+ <ChoiceInputField dataSource="choiceInputFields.pricing-tiers" />
402
+ </Box>
403
+ </Box>
404
+
405
+ </Box>
406
+ </QwickApp>
407
+ ),
408
+ parameters: {
409
+ docs: {
410
+ description: {
411
+ story: 'Advanced data binding with multiple choice types showcasing different configurations and use cases.',
412
+ },
413
+ },
414
+ },
415
415
  };
416
416
 
417
417
  export const DataBindingWithFallback: Story = {
418
- render: () => (
419
- <QwickApp appId="choice-input-fallback" appName='ChoiceInputField Data Binding with Fallback' dataSource={{ dataProvider }}>
420
- <Box>
421
-
422
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
423
- <Typography variant="h5" gutterBottom>🛡️ Fallback Support</Typography>
424
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
425
- ChoiceInputField components gracefully handle missing data sources with fallback configurations.
426
- </Typography>
427
-
428
- <Code title="Fallback Usage" language="tsx">{`<ChoiceInputField
429
- dataSource="nonexistent.field"
430
- label="Fallback Options"
431
- options={['Fallback 1', 'Fallback 2']}
432
- optionLabelPrefix="Option"
418
+ render: () => (
419
+ <QwickApp appId="choice-input-fallback" appName='ChoiceInputField Data Binding with Fallback' dataSource={{ dataProvider }}>
420
+ <Box>
421
+
422
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
423
+ <Typography variant="h5" gutterBottom> Fallback Support</Typography>
424
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
425
+ ChoiceInputField components gracefully handle missing data sources with fallback configurations.
426
+ </Typography>
427
+
428
+ <Code title="Fallback Usage" language="tsx">{`<ChoiceInputField
429
+ dataSource="nonexistent.field"
430
+ label="Fallback Options"
431
+ options={['Fallback 1', 'Fallback 2']}
432
+ optionLabelPrefix="Option"
433
433
  />`}</Code>
434
- </Box>
434
+ </Box>
435
435
 
436
- <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 4 }}>
437
- <Box>
438
- <Typography variant="h6" gutterBottom>Missing Data Source (Fallback)</Typography>
439
- <ChoiceInputField
440
- dataSource="nonexistent.field"
441
- label="Fallback Options"
442
- options={['Fallback Option 1', 'Fallback Option 2']}
443
- optionLabelPrefix="Option"
444
- />
445
- </Box>
446
- <Box>
447
- <Typography variant="h6" gutterBottom>Valid Data Source</Typography>
448
- <ChoiceInputField dataSource="choiceInputFields.poll-question" />
449
- </Box>
450
- </Box>
451
-
452
- </Box>
453
- </QwickApp>
454
- ),
455
- parameters: {
456
- docs: {
457
- description: {
458
- story: 'ChoiceInputField with fallback options when dataSource is missing or unavailable.',
459
- },
460
- },
461
- },
436
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 4 }}>
437
+ <Box>
438
+ <Typography variant="h6" gutterBottom>Missing Data Source (Fallback)</Typography>
439
+ <ChoiceInputField
440
+ dataSource="nonexistent.field"
441
+ label="Fallback Options"
442
+ options={['Fallback Option 1', 'Fallback Option 2']}
443
+ optionLabelPrefix="Option"
444
+ />
445
+ </Box>
446
+ <Box>
447
+ <Typography variant="h6" gutterBottom>Valid Data Source</Typography>
448
+ <ChoiceInputField dataSource="choiceInputFields.poll-question" />
449
+ </Box>
450
+ </Box>
451
+
452
+ </Box>
453
+ </QwickApp>
454
+ ),
455
+ parameters: {
456
+ docs: {
457
+ description: {
458
+ story: 'ChoiceInputField with fallback options when dataSource is missing or unavailable.',
459
+ },
460
+ },
461
+ },
462
462
  };
463
463
 
464
464
  export const RealWorldExample: Story = {
465
- render: () => (
466
- <QwickApp appId="choice-input-real-world" appName='Real World ChoiceInputField Example' dataSource={{ dataProvider }}>
467
- <Box>
468
-
469
- {/* Survey Platform */}
470
- <Box sx={{ mb: 6, p: 4, backgroundColor: 'background.paper', borderRadius: 2 }}>
471
- <Typography variant="h3" gutterBottom>Survey & Polling Platform</Typography>
472
- <Typography variant="body1" sx={{ mb: 4, opacity: 0.8 }}>
473
- Create comprehensive surveys and polls with customizable response options
474
- </Typography>
475
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 900 }}>
476
- <ChoiceInputField dataSource="choiceInputFields.poll-question" />
477
- <ChoiceInputField dataSource="choiceInputFields.survey-responses" />
478
- </Box>
479
- </Box>
480
-
481
- {/* E-Learning System */}
482
- <Box sx={{ mb: 6, p: 4, backgroundColor: 'primary.main', color: 'primary.contrastText', borderRadius: 2 }}>
483
- <Typography variant="h3" gutterBottom>E-Learning & Assessment</Typography>
484
- <Typography variant="body1" sx={{ mb: 4, opacity: 0.9 }}>
485
- Build interactive quizzes and organize educational content effectively
486
- </Typography>
487
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 900 }}>
488
- <ChoiceInputField dataSource="choiceInputFields.quiz-answers" />
489
- <ChoiceInputField dataSource="choiceInputFields.faq-categories" />
490
- </Box>
491
- </Box>
492
-
493
- {/* Business Management */}
494
- <Box sx={{ mb: 6, p: 4, backgroundColor: 'background.paper', borderRadius: 2 }}>
495
- <Typography variant="h3" gutterBottom>Business Configuration</Typography>
496
- <Typography variant="body1" sx={{ mb: 4, opacity: 0.8 }}>
497
- Manage business features, pricing, and team structures dynamically
498
- </Typography>
499
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 900 }}>
500
- <ChoiceInputField dataSource="choiceInputFields.feature-requests" />
501
- <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4 }}>
502
- <ChoiceInputField dataSource="choiceInputFields.pricing-tiers" />
503
- <ChoiceInputField dataSource="choiceInputFields.team-roles" />
504
- </Box>
505
- </Box>
506
- </Box>
507
-
508
- {/* Website Management */}
509
- <Box sx={{ p: 4, backgroundColor: 'secondary.main', color: 'secondary.contrastText', borderRadius: 2 }}>
510
- <Typography variant="h3" gutterBottom>Website & Content Management</Typography>
511
- <Typography variant="body1" sx={{ mb: 4, opacity: 0.9 }}>
512
- Manage website navigation, product features, and content categories
513
- </Typography>
514
- <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4, maxWidth: 1000 }}>
515
- <ChoiceInputField dataSource="choiceInputFields.menu-items" />
516
- <ChoiceInputField dataSource="choiceInputFields.product-benefits" />
517
- </Box>
518
- </Box>
519
-
520
- </Box>
521
- </QwickApp>
522
- ),
523
- parameters: {
524
- docs: {
525
- description: {
526
- story: 'Real-world example showing ChoiceInputField in various contexts: surveys, e-learning, business management, and website administration.',
527
- },
528
- },
529
- },
465
+ render: () => (
466
+ <QwickApp appId="choice-input-real-world" appName='Real World ChoiceInputField Example' dataSource={{ dataProvider }}>
467
+ <Box>
468
+
469
+ {/* Survey Platform */}
470
+ <Box sx={{ mb: 6, p: 4, backgroundColor: 'background.paper', borderRadius: 2 }}>
471
+ <Typography variant="h3" gutterBottom>Survey & Polling Platform</Typography>
472
+ <Typography variant="body1" sx={{ mb: 4, opacity: 0.8 }}>
473
+ Create comprehensive surveys and polls with customizable response options
474
+ </Typography>
475
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 900 }}>
476
+ <ChoiceInputField dataSource="choiceInputFields.poll-question" />
477
+ <ChoiceInputField dataSource="choiceInputFields.survey-responses" />
478
+ </Box>
479
+ </Box>
480
+
481
+ {/* E-Learning System */}
482
+ <Box sx={{ mb: 6, p: 4, backgroundColor: 'primary.main', color: 'primary.contrastText', borderRadius: 2 }}>
483
+ <Typography variant="h3" gutterBottom>E-Learning & Assessment</Typography>
484
+ <Typography variant="body1" sx={{ mb: 4, opacity: 0.9 }}>
485
+ Build interactive quizzes and organize educational content effectively
486
+ </Typography>
487
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 900 }}>
488
+ <ChoiceInputField dataSource="choiceInputFields.quiz-answers" />
489
+ <ChoiceInputField dataSource="choiceInputFields.faq-categories" />
490
+ </Box>
491
+ </Box>
492
+
493
+ {/* Business Management */}
494
+ <Box sx={{ mb: 6, p: 4, backgroundColor: 'background.paper', borderRadius: 2 }}>
495
+ <Typography variant="h3" gutterBottom>Business Configuration</Typography>
496
+ <Typography variant="body1" sx={{ mb: 4, opacity: 0.8 }}>
497
+ Manage business features, pricing, and team structures dynamically
498
+ </Typography>
499
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 900 }}>
500
+ <ChoiceInputField dataSource="choiceInputFields.feature-requests" />
501
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4 }}>
502
+ <ChoiceInputField dataSource="choiceInputFields.pricing-tiers" />
503
+ <ChoiceInputField dataSource="choiceInputFields.team-roles" />
504
+ </Box>
505
+ </Box>
506
+ </Box>
507
+
508
+ {/* Website Management */}
509
+ <Box sx={{ p: 4, backgroundColor: 'secondary.main', color: 'secondary.contrastText', borderRadius: 2 }}>
510
+ <Typography variant="h3" gutterBottom>Website & Content Management</Typography>
511
+ <Typography variant="body1" sx={{ mb: 4, opacity: 0.9 }}>
512
+ Manage website navigation, product features, and content categories
513
+ </Typography>
514
+ <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: 4, maxWidth: 1000 }}>
515
+ <ChoiceInputField dataSource="choiceInputFields.menu-items" />
516
+ <ChoiceInputField dataSource="choiceInputFields.product-benefits" />
517
+ </Box>
518
+ </Box>
519
+
520
+ </Box>
521
+ </QwickApp>
522
+ ),
523
+ parameters: {
524
+ docs: {
525
+ description: {
526
+ story: 'Real-world example showing ChoiceInputField in various contexts: surveys, e-learning, business management, and website administration.',
527
+ },
528
+ },
529
+ },
530
530
  };
531
531
 
532
532
  export const InteractiveDemo: Story = {
533
- render: () => (
534
- <QwickApp appId="choice-input-interactive" appName='Interactive ChoiceInputField Demo'>
535
- <Box>
536
-
537
- <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
538
- <Typography variant="h5" gutterBottom>🎮 Interactive Demo</Typography>
539
- <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
540
- Try editing the options below. You can modify existing options or add new ones using the "Add Option" button.
541
- </Typography>
542
-
543
- <Alert severity="info" sx={{ mb: 3 }}>
544
- <Typography variant="body2">
545
- Each option supports HTML formatting. Try using <code>&lt;b&gt;</code>, <code>&lt;i&gt;</code>, <code>&lt;u&gt;</code>, or <code>&lt;code&gt;</code> tags!
546
- </Typography>
547
- </Alert>
548
- </Box>
533
+ render: () => (
534
+ <QwickApp appId="choice-input-interactive" appName='Interactive ChoiceInputField Demo'>
535
+ <Box>
536
+
537
+ <Box sx={{ p: 4, backgroundColor: 'background.paper' }}>
538
+ <Typography variant="h5" gutterBottom>🎮 Interactive Demo</Typography>
539
+ <Typography variant="body1" sx={{ mb: 3, opacity: 0.8 }}>
540
+ Try editing the options below. You can modify existing options or add new ones using the "Add Option" button.
541
+ </Typography>
542
+
543
+ <Alert severity="info" sx={{ mb: 3 }}>
544
+ <Typography variant="body2">
545
+ Each option supports HTML formatting. Try using <code>&lt;b&gt;</code>, <code>&lt;i&gt;</code>, <code>&lt;u&gt;</code>, or <code>&lt;code&gt;</code> tags!
546
+ </Typography>
547
+ </Alert>
548
+ </Box>
549
549
 
550
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
551
- <InteractiveChoiceExample
552
- initialOptions={[
553
- '<b>Excellent</b> - Outstanding quality',
554
- '<i>Very Good</i> - Above expectations',
555
- 'Good - Meets expectations'
556
- ]}
557
- label="Customer Satisfaction Survey"
558
- optionLabelPrefix="Rating"
559
- />
560
-
561
- <InteractiveChoiceExample
562
- initialOptions={[
563
- '🎯 <b>Marketing</b>',
564
- '💻 <b>Development</b>',
565
- '🎨 <b>Design</b>'
566
- ]}
567
- label="Department Selection"
568
- optionLabelPrefix="Department"
569
- />
570
-
571
- <InteractiveChoiceExample
572
- initialOptions={[
573
- '<code>React</code> - UI Library',
574
- '<code>TypeScript</code> - Type Safety'
575
- ]}
576
- label="Technology Stack"
577
- optionLabelPrefix="Technology"
578
- />
579
- </Box>
580
-
581
- </Box>
582
- </QwickApp>
583
- ),
584
- parameters: {
585
- docs: {
586
- description: {
587
- story: 'Interactive demonstration of ChoiceInputField functionality with real-time editing and HTML formatting.',
588
- },
589
- },
590
- },
550
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 4, maxWidth: 800 }}>
551
+ <InteractiveChoiceExample
552
+ initialOptions={[
553
+ '<b>Excellent</b> - Outstanding quality',
554
+ '<i>Very Good</i> - Above expectations',
555
+ 'Good - Meets expectations'
556
+ ]}
557
+ label="Customer Satisfaction Survey"
558
+ optionLabelPrefix="Rating"
559
+ />
560
+
561
+ <InteractiveChoiceExample
562
+ initialOptions={[
563
+ ' <b>Marketing</b>',
564
+ ' <b>Development</b>',
565
+ ' <b>Design</b>'
566
+ ]}
567
+ label="Department Selection"
568
+ optionLabelPrefix="Department"
569
+ />
570
+
571
+ <InteractiveChoiceExample
572
+ initialOptions={[
573
+ '<code>React</code> - UI Library',
574
+ '<code>TypeScript</code> - Type Safety'
575
+ ]}
576
+ label="Technology Stack"
577
+ optionLabelPrefix="Technology"
578
+ />
579
+ </Box>
580
+
581
+ </Box>
582
+ </QwickApp>
583
+ ),
584
+ parameters: {
585
+ docs: {
586
+ description: {
587
+ story: 'Interactive demonstration of ChoiceInputField functionality with real-time editing and HTML formatting.',
588
+ },
589
+ },
590
+ },
591
591
  };