@mj-biz-apps/forms-ng 0.0.0 → 0.2.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 (446) hide show
  1. package/dist/lib/builder/builder-models.d.ts +27 -0
  2. package/dist/lib/builder/builder-models.d.ts.map +1 -0
  3. package/dist/lib/builder/builder-models.js +15 -0
  4. package/dist/lib/builder/builder-models.js.map +1 -0
  5. package/dist/lib/builder/builder-state.service.d.ts +48 -0
  6. package/dist/lib/builder/builder-state.service.d.ts.map +1 -0
  7. package/dist/lib/builder/builder-state.service.js +231 -0
  8. package/dist/lib/builder/builder-state.service.js.map +1 -0
  9. package/dist/lib/builder/builder-styles.d.ts +12 -0
  10. package/dist/lib/builder/builder-styles.d.ts.map +1 -0
  11. package/dist/lib/builder/builder-styles.js +74 -0
  12. package/dist/lib/builder/builder-styles.js.map +1 -0
  13. package/dist/lib/builder/conditional-rule-editor.component.d.ts +53 -0
  14. package/dist/lib/builder/conditional-rule-editor.component.d.ts.map +1 -0
  15. package/dist/lib/builder/conditional-rule-editor.component.js +282 -0
  16. package/dist/lib/builder/conditional-rule-editor.component.js.map +1 -0
  17. package/dist/lib/builder/design-panel.component.d.ts +71 -0
  18. package/dist/lib/builder/design-panel.component.d.ts.map +1 -0
  19. package/dist/lib/builder/design-panel.component.js +530 -0
  20. package/dist/lib/builder/design-panel.component.js.map +1 -0
  21. package/dist/lib/builder/design-panel.styles.d.ts +10 -0
  22. package/dist/lib/builder/design-panel.styles.d.ts.map +1 -0
  23. package/dist/lib/builder/design-panel.styles.js +78 -0
  24. package/dist/lib/builder/design-panel.styles.js.map +1 -0
  25. package/dist/lib/builder/design-state.service.d.ts +51 -0
  26. package/dist/lib/builder/design-state.service.d.ts.map +1 -0
  27. package/dist/lib/builder/design-state.service.js +108 -0
  28. package/dist/lib/builder/design-state.service.js.map +1 -0
  29. package/dist/lib/builder/distribution-links.d.ts +29 -0
  30. package/dist/lib/builder/distribution-links.d.ts.map +1 -0
  31. package/dist/lib/builder/distribution-links.js +53 -0
  32. package/dist/lib/builder/distribution-links.js.map +1 -0
  33. package/dist/lib/builder/distribution-manager.component.d.ts +53 -0
  34. package/dist/lib/builder/distribution-manager.component.d.ts.map +1 -0
  35. package/dist/lib/builder/distribution-manager.component.js +330 -0
  36. package/dist/lib/builder/distribution-manager.component.js.map +1 -0
  37. package/dist/lib/builder/distribution.service.d.ts +62 -0
  38. package/dist/lib/builder/distribution.service.d.ts.map +1 -0
  39. package/dist/lib/builder/distribution.service.js +140 -0
  40. package/dist/lib/builder/distribution.service.js.map +1 -0
  41. package/dist/lib/builder/entity-names.d.ts +20 -0
  42. package/dist/lib/builder/entity-names.d.ts.map +1 -0
  43. package/dist/lib/builder/entity-names.js +20 -0
  44. package/dist/lib/builder/entity-names.js.map +1 -0
  45. package/dist/lib/builder/form-builder.component.d.ts +92 -0
  46. package/dist/lib/builder/form-builder.component.d.ts.map +1 -0
  47. package/dist/lib/builder/form-builder.component.js +627 -0
  48. package/dist/lib/builder/form-builder.component.js.map +1 -0
  49. package/dist/lib/builder/form-builder.styles.d.ts +3 -0
  50. package/dist/lib/builder/form-builder.styles.d.ts.map +1 -0
  51. package/dist/lib/builder/form-builder.styles.js +94 -0
  52. package/dist/lib/builder/form-builder.styles.js.map +1 -0
  53. package/dist/lib/builder/form-preview-modal.component.d.ts +25 -0
  54. package/dist/lib/builder/form-preview-modal.component.d.ts.map +1 -0
  55. package/dist/lib/builder/form-preview-modal.component.js +90 -0
  56. package/dist/lib/builder/form-preview-modal.component.js.map +1 -0
  57. package/dist/lib/builder/index.d.ts +31 -0
  58. package/dist/lib/builder/index.d.ts.map +1 -0
  59. package/dist/lib/builder/index.js +32 -0
  60. package/dist/lib/builder/index.js.map +1 -0
  61. package/dist/lib/builder/json-fields.d.ts +14 -0
  62. package/dist/lib/builder/json-fields.d.ts.map +1 -0
  63. package/dist/lib/builder/json-fields.js +100 -0
  64. package/dist/lib/builder/json-fields.js.map +1 -0
  65. package/dist/lib/builder/publish.service.d.ts +34 -0
  66. package/dist/lib/builder/publish.service.d.ts.map +1 -0
  67. package/dist/lib/builder/publish.service.js +110 -0
  68. package/dist/lib/builder/publish.service.js.map +1 -0
  69. package/dist/lib/builder/qr-code.d.ts +26 -0
  70. package/dist/lib/builder/qr-code.d.ts.map +1 -0
  71. package/dist/lib/builder/qr-code.js +361 -0
  72. package/dist/lib/builder/qr-code.js.map +1 -0
  73. package/dist/lib/builder/question-editor.component.d.ts +41 -0
  74. package/dist/lib/builder/question-editor.component.d.ts.map +1 -0
  75. package/dist/lib/builder/question-editor.component.js +228 -0
  76. package/dist/lib/builder/question-editor.component.js.map +1 -0
  77. package/dist/lib/builder/question-type-catalog.d.ts +29 -0
  78. package/dist/lib/builder/question-type-catalog.d.ts.map +1 -0
  79. package/dist/lib/builder/question-type-catalog.js +43 -0
  80. package/dist/lib/builder/question-type-catalog.js.map +1 -0
  81. package/dist/lib/builder/reorder.d.ts +10 -0
  82. package/dist/lib/builder/reorder.d.ts.map +1 -0
  83. package/dist/lib/builder/reorder.js +18 -0
  84. package/dist/lib/builder/reorder.js.map +1 -0
  85. package/dist/lib/builder/snapshot-builder.d.ts +16 -0
  86. package/dist/lib/builder/snapshot-builder.d.ts.map +1 -0
  87. package/dist/lib/builder/snapshot-builder.js +93 -0
  88. package/dist/lib/builder/snapshot-builder.js.map +1 -0
  89. package/dist/lib/builder/style-tokens.d.ts +54 -0
  90. package/dist/lib/builder/style-tokens.d.ts.map +1 -0
  91. package/dist/lib/builder/style-tokens.js +71 -0
  92. package/dist/lib/builder/style-tokens.js.map +1 -0
  93. package/dist/lib/builder/validation-rule-editor.component.d.ts +27 -0
  94. package/dist/lib/builder/validation-rule-editor.component.d.ts.map +1 -0
  95. package/dist/lib/builder/validation-rule-editor.component.js +179 -0
  96. package/dist/lib/builder/validation-rule-editor.component.js.map +1 -0
  97. package/dist/lib/dashboard/components/distribution-chart.component.d.ts +14 -0
  98. package/dist/lib/dashboard/components/distribution-chart.component.d.ts.map +1 -0
  99. package/dist/lib/dashboard/components/distribution-chart.component.js +85 -0
  100. package/dist/lib/dashboard/components/distribution-chart.component.js.map +1 -0
  101. package/dist/lib/dashboard/components/funnel-chart.component.d.ts +14 -0
  102. package/dist/lib/dashboard/components/funnel-chart.component.d.ts.map +1 -0
  103. package/dist/lib/dashboard/components/funnel-chart.component.js +101 -0
  104. package/dist/lib/dashboard/components/funnel-chart.component.js.map +1 -0
  105. package/dist/lib/dashboard/components/question-breakdown.component.d.ts +16 -0
  106. package/dist/lib/dashboard/components/question-breakdown.component.d.ts.map +1 -0
  107. package/dist/lib/dashboard/components/question-breakdown.component.js +213 -0
  108. package/dist/lib/dashboard/components/question-breakdown.component.js.map +1 -0
  109. package/dist/lib/dashboard/components/response-detail.component.d.ts +11 -0
  110. package/dist/lib/dashboard/components/response-detail.component.d.ts.map +1 -0
  111. package/dist/lib/dashboard/components/response-detail.component.js +113 -0
  112. package/dist/lib/dashboard/components/response-detail.component.js.map +1 -0
  113. package/dist/lib/dashboard/components/response-list.component.d.ts +27 -0
  114. package/dist/lib/dashboard/components/response-list.component.d.ts.map +1 -0
  115. package/dist/lib/dashboard/components/response-list.component.js +196 -0
  116. package/dist/lib/dashboard/components/response-list.component.js.map +1 -0
  117. package/dist/lib/dashboard/components/summary-stats.component.d.ts +12 -0
  118. package/dist/lib/dashboard/components/summary-stats.component.d.ts.map +1 -0
  119. package/dist/lib/dashboard/components/summary-stats.component.js +112 -0
  120. package/dist/lib/dashboard/components/summary-stats.component.js.map +1 -0
  121. package/dist/lib/dashboard/forms-reporting-dashboard.component.d.ts +64 -0
  122. package/dist/lib/dashboard/forms-reporting-dashboard.component.d.ts.map +1 -0
  123. package/dist/lib/dashboard/forms-reporting-dashboard.component.js +397 -0
  124. package/dist/lib/dashboard/forms-reporting-dashboard.component.js.map +1 -0
  125. package/dist/lib/dashboard/index.d.ts +19 -0
  126. package/dist/lib/dashboard/index.d.ts.map +1 -0
  127. package/dist/lib/dashboard/index.js +19 -0
  128. package/dist/lib/dashboard/index.js.map +1 -0
  129. package/dist/lib/dashboard/models/reporting.model.d.ts +125 -0
  130. package/dist/lib/dashboard/models/reporting.model.d.ts.map +1 -0
  131. package/dist/lib/dashboard/models/reporting.model.js +2 -0
  132. package/dist/lib/dashboard/models/reporting.model.js.map +1 -0
  133. package/dist/lib/dashboard/services/forms-reporting-export.service.d.ts +21 -0
  134. package/dist/lib/dashboard/services/forms-reporting-export.service.d.ts.map +1 -0
  135. package/dist/lib/dashboard/services/forms-reporting-export.service.js +83 -0
  136. package/dist/lib/dashboard/services/forms-reporting-export.service.js.map +1 -0
  137. package/dist/lib/dashboard/services/forms-reporting-mock.d.ts +18 -0
  138. package/dist/lib/dashboard/services/forms-reporting-mock.d.ts.map +1 -0
  139. package/dist/lib/dashboard/services/forms-reporting-mock.js +147 -0
  140. package/dist/lib/dashboard/services/forms-reporting-mock.js.map +1 -0
  141. package/dist/lib/dashboard/services/forms-reporting.service.d.ts +45 -0
  142. package/dist/lib/dashboard/services/forms-reporting.service.d.ts.map +1 -0
  143. package/dist/lib/dashboard/services/forms-reporting.service.js +230 -0
  144. package/dist/lib/dashboard/services/forms-reporting.service.js.map +1 -0
  145. package/dist/lib/dashboard/services/reporting-aggregations.d.ts +40 -0
  146. package/dist/lib/dashboard/services/reporting-aggregations.d.ts.map +1 -0
  147. package/dist/lib/dashboard/services/reporting-aggregations.js +379 -0
  148. package/dist/lib/dashboard/services/reporting-aggregations.js.map +1 -0
  149. package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.d.ts +10 -0
  150. package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.d.ts.map +1 -0
  151. package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.js +104 -0
  152. package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.js.map +1 -0
  153. package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.d.ts +10 -0
  154. package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.d.ts.map +1 -0
  155. package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.js +83 -0
  156. package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.js.map +1 -0
  157. package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.d.ts +10 -0
  158. package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.d.ts.map +1 -0
  159. package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.js +96 -0
  160. package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.js.map +1 -0
  161. package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.d.ts +10 -0
  162. package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.d.ts.map +1 -0
  163. package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.js +83 -0
  164. package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.js.map +1 -0
  165. package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.d.ts +10 -0
  166. package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.d.ts.map +1 -0
  167. package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.js +96 -0
  168. package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.js.map +1 -0
  169. package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.d.ts +10 -0
  170. package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.d.ts.map +1 -0
  171. package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.js +172 -0
  172. package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.js.map +1 -0
  173. package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.d.ts +10 -0
  174. package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.d.ts.map +1 -0
  175. package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.js +90 -0
  176. package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.js.map +1 -0
  177. package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.d.ts +10 -0
  178. package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.d.ts.map +1 -0
  179. package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.js +274 -0
  180. package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.js.map +1 -0
  181. package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.d.ts +10 -0
  182. package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.d.ts.map +1 -0
  183. package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.js +91 -0
  184. package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.js.map +1 -0
  185. package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.d.ts +10 -0
  186. package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.d.ts.map +1 -0
  187. package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.js +100 -0
  188. package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.js.map +1 -0
  189. package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.d.ts +10 -0
  190. package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.d.ts.map +1 -0
  191. package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.js +174 -0
  192. package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.js.map +1 -0
  193. package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.d.ts +10 -0
  194. package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.d.ts.map +1 -0
  195. package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.js +118 -0
  196. package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.js.map +1 -0
  197. package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.d.ts +10 -0
  198. package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.d.ts.map +1 -0
  199. package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.js +93 -0
  200. package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.js.map +1 -0
  201. package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.d.ts +10 -0
  202. package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.d.ts.map +1 -0
  203. package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.js +96 -0
  204. package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.js.map +1 -0
  205. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.d.ts +10 -0
  206. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.d.ts.map +1 -0
  207. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.js +132 -0
  208. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.js.map +1 -0
  209. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.d.ts +10 -0
  210. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.d.ts.map +1 -0
  211. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.js +77 -0
  212. package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.js.map +1 -0
  213. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.d.ts +10 -0
  214. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.d.ts.map +1 -0
  215. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.js +108 -0
  216. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.js.map +1 -0
  217. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.d.ts +10 -0
  218. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.d.ts.map +1 -0
  219. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.js +99 -0
  220. package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.js.map +1 -0
  221. package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.d.ts +10 -0
  222. package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.d.ts.map +1 -0
  223. package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.js +100 -0
  224. package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.js.map +1 -0
  225. package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.d.ts +10 -0
  226. package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.d.ts.map +1 -0
  227. package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.js +96 -0
  228. package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.js.map +1 -0
  229. package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.d.ts +10 -0
  230. package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.d.ts.map +1 -0
  231. package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.js +274 -0
  232. package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.js.map +1 -0
  233. package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.d.ts +10 -0
  234. package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.d.ts.map +1 -0
  235. package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.js +67 -0
  236. package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.js.map +1 -0
  237. package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.d.ts +10 -0
  238. package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.d.ts.map +1 -0
  239. package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.js +90 -0
  240. package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.js.map +1 -0
  241. package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.d.ts +10 -0
  242. package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.d.ts.map +1 -0
  243. package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.js +124 -0
  244. package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.js.map +1 -0
  245. package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.d.ts +10 -0
  246. package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.d.ts.map +1 -0
  247. package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.js +86 -0
  248. package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.js.map +1 -0
  249. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.d.ts +10 -0
  250. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.d.ts.map +1 -0
  251. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.js +67 -0
  252. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.js.map +1 -0
  253. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.d.ts +10 -0
  254. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.d.ts.map +1 -0
  255. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.js +86 -0
  256. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.js.map +1 -0
  257. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.d.ts +10 -0
  258. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.d.ts.map +1 -0
  259. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.js +61 -0
  260. package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.js.map +1 -0
  261. package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.d.ts +10 -0
  262. package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.d.ts.map +1 -0
  263. package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.js +63 -0
  264. package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.js.map +1 -0
  265. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.d.ts +10 -0
  266. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.d.ts.map +1 -0
  267. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.js +69 -0
  268. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.js.map +1 -0
  269. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.d.ts +10 -0
  270. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.d.ts.map +1 -0
  271. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.js +63 -0
  272. package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.js.map +1 -0
  273. package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.d.ts +10 -0
  274. package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.d.ts.map +1 -0
  275. package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.js +98 -0
  276. package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.js.map +1 -0
  277. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.d.ts +10 -0
  278. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.d.ts.map +1 -0
  279. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.js +80 -0
  280. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.js.map +1 -0
  281. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.d.ts +10 -0
  282. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.d.ts.map +1 -0
  283. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.js +59 -0
  284. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.js.map +1 -0
  285. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.d.ts +10 -0
  286. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.d.ts.map +1 -0
  287. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.js +84 -0
  288. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.js.map +1 -0
  289. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.d.ts +10 -0
  290. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.d.ts.map +1 -0
  291. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.js +146 -0
  292. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.js.map +1 -0
  293. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.d.ts +10 -0
  294. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.d.ts.map +1 -0
  295. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.js +61 -0
  296. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.js.map +1 -0
  297. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.d.ts +10 -0
  298. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.d.ts.map +1 -0
  299. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.js +59 -0
  300. package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.js.map +1 -0
  301. package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.d.ts +10 -0
  302. package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.d.ts.map +1 -0
  303. package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.js +132 -0
  304. package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.js.map +1 -0
  305. package/dist/lib/generated/class-registrations-manifest.d.ts +6 -0
  306. package/dist/lib/generated/class-registrations-manifest.d.ts.map +1 -0
  307. package/dist/lib/generated/class-registrations-manifest.js +6 -0
  308. package/dist/lib/generated/class-registrations-manifest.js.map +1 -0
  309. package/dist/lib/generated/generated-forms.module.d.ts +61 -0
  310. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
  311. package/dist/lib/generated/generated-forms.module.js +207 -0
  312. package/dist/lib/generated/generated-forms.module.js.map +1 -0
  313. package/dist/lib/home/forms-home-dashboard.component.d.ts +61 -0
  314. package/dist/lib/home/forms-home-dashboard.component.d.ts.map +1 -0
  315. package/dist/lib/home/forms-home-dashboard.component.js +379 -0
  316. package/dist/lib/home/forms-home-dashboard.component.js.map +1 -0
  317. package/dist/lib/home/forms-home.service.d.ts +24 -0
  318. package/dist/lib/home/forms-home.service.d.ts.map +1 -0
  319. package/dist/lib/home/forms-home.service.js +92 -0
  320. package/dist/lib/home/forms-home.service.js.map +1 -0
  321. package/dist/lib/home/home-aggregations.d.ts +23 -0
  322. package/dist/lib/home/home-aggregations.d.ts.map +1 -0
  323. package/dist/lib/home/home-aggregations.js +64 -0
  324. package/dist/lib/home/home-aggregations.js.map +1 -0
  325. package/dist/lib/home/home-models.d.ts +60 -0
  326. package/dist/lib/home/home-models.d.ts.map +1 -0
  327. package/dist/lib/home/home-models.js +34 -0
  328. package/dist/lib/home/home-models.js.map +1 -0
  329. package/dist/lib/home/index.d.ts +13 -0
  330. package/dist/lib/home/index.d.ts.map +1 -0
  331. package/dist/lib/home/index.js +13 -0
  332. package/dist/lib/home/index.js.map +1 -0
  333. package/dist/lib/widget/api/form-upload.service.d.ts +41 -0
  334. package/dist/lib/widget/api/form-upload.service.d.ts.map +1 -0
  335. package/dist/lib/widget/api/form-upload.service.js +124 -0
  336. package/dist/lib/widget/api/form-upload.service.js.map +1 -0
  337. package/dist/lib/widget/api/forms-api.config.d.ts +55 -0
  338. package/dist/lib/widget/api/forms-api.config.d.ts.map +1 -0
  339. package/dist/lib/widget/api/forms-api.config.js +40 -0
  340. package/dist/lib/widget/api/forms-api.config.js.map +1 -0
  341. package/dist/lib/widget/api/forms-api.graphql.service.d.ts +20 -0
  342. package/dist/lib/widget/api/forms-api.graphql.service.d.ts.map +1 -0
  343. package/dist/lib/widget/api/forms-api.graphql.service.js +96 -0
  344. package/dist/lib/widget/api/forms-api.graphql.service.js.map +1 -0
  345. package/dist/lib/widget/api/forms-api.interface.d.ts +45 -0
  346. package/dist/lib/widget/api/forms-api.interface.d.ts.map +1 -0
  347. package/dist/lib/widget/api/forms-api.interface.js +8 -0
  348. package/dist/lib/widget/api/forms-api.interface.js.map +1 -0
  349. package/dist/lib/widget/api/forms-api.mock.service.d.ts +12 -0
  350. package/dist/lib/widget/api/forms-api.mock.service.d.ts.map +1 -0
  351. package/dist/lib/widget/api/forms-api.mock.service.js +41 -0
  352. package/dist/lib/widget/api/forms-api.mock.service.js.map +1 -0
  353. package/dist/lib/widget/api/mock-form.data.d.ts +8 -0
  354. package/dist/lib/widget/api/mock-form.data.d.ts.map +1 -0
  355. package/dist/lib/widget/api/mock-form.data.js +192 -0
  356. package/dist/lib/widget/api/mock-form.data.js.map +1 -0
  357. package/dist/lib/widget/api/submission-mapping.d.ts +60 -0
  358. package/dist/lib/widget/api/submission-mapping.d.ts.map +1 -0
  359. package/dist/lib/widget/api/submission-mapping.js +47 -0
  360. package/dist/lib/widget/api/submission-mapping.js.map +1 -0
  361. package/dist/lib/widget/components/form-one-question.component.d.ts +43 -0
  362. package/dist/lib/widget/components/form-one-question.component.d.ts.map +1 -0
  363. package/dist/lib/widget/components/form-one-question.component.js +194 -0
  364. package/dist/lib/widget/components/form-one-question.component.js.map +1 -0
  365. package/dist/lib/widget/components/form-progress.component.d.ts +9 -0
  366. package/dist/lib/widget/components/form-progress.component.d.ts.map +1 -0
  367. package/dist/lib/widget/components/form-progress.component.js +47 -0
  368. package/dist/lib/widget/components/form-progress.component.js.map +1 -0
  369. package/dist/lib/widget/components/form-scroll.component.d.ts +23 -0
  370. package/dist/lib/widget/components/form-scroll.component.d.ts.map +1 -0
  371. package/dist/lib/widget/components/form-scroll.component.js +132 -0
  372. package/dist/lib/widget/components/form-scroll.component.js.map +1 -0
  373. package/dist/lib/widget/components/questions/form-question.component.d.ts +68 -0
  374. package/dist/lib/widget/components/questions/form-question.component.d.ts.map +1 -0
  375. package/dist/lib/widget/components/questions/form-question.component.js +541 -0
  376. package/dist/lib/widget/components/questions/form-question.component.js.map +1 -0
  377. package/dist/lib/widget/components/questions/input-mode.d.ts +13 -0
  378. package/dist/lib/widget/components/questions/input-mode.d.ts.map +1 -0
  379. package/dist/lib/widget/components/questions/input-mode.js +42 -0
  380. package/dist/lib/widget/components/questions/input-mode.js.map +1 -0
  381. package/dist/lib/widget/components/turnstile-challenge.component.d.ts +52 -0
  382. package/dist/lib/widget/components/turnstile-challenge.component.d.ts.map +1 -0
  383. package/dist/lib/widget/components/turnstile-challenge.component.js +123 -0
  384. package/dist/lib/widget/components/turnstile-challenge.component.js.map +1 -0
  385. package/dist/lib/widget/core/answer-value.d.ts +17 -0
  386. package/dist/lib/widget/core/answer-value.d.ts.map +1 -0
  387. package/dist/lib/widget/core/answer-value.js +41 -0
  388. package/dist/lib/widget/core/answer-value.js.map +1 -0
  389. package/dist/lib/widget/core/autosave-controller.d.ts +65 -0
  390. package/dist/lib/widget/core/autosave-controller.d.ts.map +1 -0
  391. package/dist/lib/widget/core/autosave-controller.js +134 -0
  392. package/dist/lib/widget/core/autosave-controller.js.map +1 -0
  393. package/dist/lib/widget/core/client-id.d.ts +17 -0
  394. package/dist/lib/widget/core/client-id.d.ts.map +1 -0
  395. package/dist/lib/widget/core/client-id.js +52 -0
  396. package/dist/lib/widget/core/client-id.js.map +1 -0
  397. package/dist/lib/widget/core/form-runtime.d.ts +34 -0
  398. package/dist/lib/widget/core/form-runtime.d.ts.map +1 -0
  399. package/dist/lib/widget/core/form-runtime.js +123 -0
  400. package/dist/lib/widget/core/form-runtime.js.map +1 -0
  401. package/dist/lib/widget/core/one-question-stepper.d.ts +20 -0
  402. package/dist/lib/widget/core/one-question-stepper.d.ts.map +1 -0
  403. package/dist/lib/widget/core/one-question-stepper.js +23 -0
  404. package/dist/lib/widget/core/one-question-stepper.js.map +1 -0
  405. package/dist/lib/widget/core/submit-phase.d.ts +31 -0
  406. package/dist/lib/widget/core/submit-phase.d.ts.map +1 -0
  407. package/dist/lib/widget/core/submit-phase.js +21 -0
  408. package/dist/lib/widget/core/submit-phase.js.map +1 -0
  409. package/dist/lib/widget/core/theming.d.ts +17 -0
  410. package/dist/lib/widget/core/theming.d.ts.map +1 -0
  411. package/dist/lib/widget/core/theming.js +36 -0
  412. package/dist/lib/widget/core/theming.js.map +1 -0
  413. package/dist/lib/widget/core/turnstile-gate.d.ts +42 -0
  414. package/dist/lib/widget/core/turnstile-gate.d.ts.map +1 -0
  415. package/dist/lib/widget/core/turnstile-gate.js +61 -0
  416. package/dist/lib/widget/core/turnstile-gate.js.map +1 -0
  417. package/dist/lib/widget/core/turnstile-loader.d.ts +34 -0
  418. package/dist/lib/widget/core/turnstile-loader.d.ts.map +1 -0
  419. package/dist/lib/widget/core/turnstile-loader.js +68 -0
  420. package/dist/lib/widget/core/turnstile-loader.js.map +1 -0
  421. package/dist/lib/widget/core/validation.d.ts +19 -0
  422. package/dist/lib/widget/core/validation.d.ts.map +1 -0
  423. package/dist/lib/widget/core/validation.js +105 -0
  424. package/dist/lib/widget/core/validation.js.map +1 -0
  425. package/dist/lib/widget/index.d.ts +27 -0
  426. package/dist/lib/widget/index.d.ts.map +1 -0
  427. package/dist/lib/widget/index.js +30 -0
  428. package/dist/lib/widget/index.js.map +1 -0
  429. package/dist/lib/widget/mj-form.component.d.ts +114 -0
  430. package/dist/lib/widget/mj-form.component.d.ts.map +1 -0
  431. package/dist/lib/widget/mj-form.component.js +428 -0
  432. package/dist/lib/widget/mj-form.component.js.map +1 -0
  433. package/dist/lib/widget/register-element.d.ts +8 -0
  434. package/dist/lib/widget/register-element.d.ts.map +1 -0
  435. package/dist/lib/widget/register-element.js +98 -0
  436. package/dist/lib/widget/register-element.js.map +1 -0
  437. package/dist/public-api.d.ts +23 -0
  438. package/dist/public-api.d.ts.map +1 -0
  439. package/dist/public-api.js +33 -0
  440. package/dist/public-api.js.map +1 -0
  441. package/dist/widget-entry.d.ts +2 -0
  442. package/dist/widget-entry.d.ts.map +1 -0
  443. package/dist/widget-entry.js +20 -0
  444. package/dist/widget-entry.js.map +1 -0
  445. package/package.json +53 -5
  446. package/README.md +0 -3
@@ -0,0 +1,71 @@
1
+ import { parseStyleTokens, buildStyleTokens } from './json-fields';
2
+ /** Semantic token names the theme editor writes into `CSSVariables`. */
3
+ export const BRAND_TOKENS = {
4
+ /** Primary brand color (buttons, active choice, progress fill). */
5
+ primary: '--mjf-accent',
6
+ /** Darker shade used for hover / pressed / strong states. */
7
+ primaryStrong: '--mjf-accent-strong',
8
+ /** Page background behind the form cards. */
9
+ pageBg: '--mjf-page-bg',
10
+ /** Card / field surface background. */
11
+ cardBg: '--mjf-card-bg',
12
+ /** Body font stack. */
13
+ fontBody: '--mjf-font-body',
14
+ /** Display / heading font stack. */
15
+ fontDisplay: '--mjf-font-display',
16
+ };
17
+ /** The four corner-radius tokens set together so the theme's rounding stays coherent. */
18
+ export const RADIUS_TOKENS = ['--mjf-card-radius', '--mjf-input-radius', '--mjf-choice-radius', '--mjf-btn-radius'];
19
+ /** Curated font choices for the theme editor (label → CSS font-family stack). */
20
+ export const FONT_OPTIONS = [
21
+ { label: 'System', stack: 'system-ui, sans-serif' },
22
+ { label: 'Inter', stack: "'Inter', system-ui, sans-serif" },
23
+ { label: 'Sora', stack: "'Sora', system-ui, sans-serif" },
24
+ { label: 'Nunito', stack: "'Nunito', system-ui, sans-serif" },
25
+ { label: 'Fraunces (serif)', stack: "'Fraunces', Georgia, serif" },
26
+ ];
27
+ /** Serialize a `--token → value` map back to a `CSSVariables` JSON string. */
28
+ export function serializeCssVariables(map) {
29
+ return JSON.stringify(map, null, 2);
30
+ }
31
+ /** Build the runtime {@link FormStyleTokens} the preview + widget apply from a style entity. */
32
+ export function toStyleTokens(style) {
33
+ return buildStyleTokens(style.CSSVariables, style.CustomCSS, style.LogoURL);
34
+ }
35
+ /** Read a brand token's current value from a raw `CSSVariables` JSON (empty if unset). */
36
+ export function readBrandToken(cssVariablesRaw, token) {
37
+ return parseStyleTokens(cssVariablesRaw)[token] ?? '';
38
+ }
39
+ /**
40
+ * Return an updated `CSSVariables` JSON with `token` set to `value` (or removed when
41
+ * `value` is blank), preserving every other token. Pure — mutates nothing.
42
+ */
43
+ export function withBrandToken(cssVariablesRaw, token, value) {
44
+ const map = parseStyleTokens(cssVariablesRaw);
45
+ const trimmed = value.trim();
46
+ if (trimmed) {
47
+ map[token] = trimmed;
48
+ }
49
+ else {
50
+ delete map[token];
51
+ }
52
+ return serializeCssVariables(map);
53
+ }
54
+ /** Read the theme's corner radius (from `--mjf-card-radius`) as a number of px; 0 if unset. */
55
+ export function readRadiusPx(cssVariablesRaw) {
56
+ const raw = parseStyleTokens(cssVariablesRaw)[RADIUS_TOKENS[0]] ?? '';
57
+ const parsed = Number.parseInt(raw, 10);
58
+ return Number.isFinite(parsed) ? parsed : 0;
59
+ }
60
+ /**
61
+ * Return an updated `CSSVariables` JSON with all four {@link RADIUS_TOKENS} set to `px`,
62
+ * preserving every other token. Keeps card/input/choice/button rounding coherent. Pure.
63
+ */
64
+ export function withRadiusPx(cssVariablesRaw, px) {
65
+ const map = parseStyleTokens(cssVariablesRaw);
66
+ for (const token of RADIUS_TOKENS) {
67
+ map[token] = `${px}px`;
68
+ }
69
+ return serializeCssVariables(map);
70
+ }
71
+ //# sourceMappingURL=style-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-tokens.js","sourceRoot":"","sources":["../../../src/lib/builder/style-tokens.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnE,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,mEAAmE;IACnE,OAAO,EAAE,cAAc;IACvB,6DAA6D;IAC7D,aAAa,EAAE,qBAAqB;IACpC,6CAA6C;IAC7C,MAAM,EAAE,eAAe;IACvB,uCAAuC;IACvC,MAAM,EAAE,eAAe;IACvB,uBAAuB;IACvB,QAAQ,EAAE,iBAAiB;IAC3B,oCAAoC;IACpC,WAAW,EAAE,oBAAoB;CACzB,CAAC;AAEX,yFAAyF;AACzF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,CAAU,CAAC;AAE7H,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAoD;IAC3E,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,EAAE;IACnD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE;IAC3D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,+BAA+B,EAAE;IACzD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,iCAAiC,EAAE;IAC7D,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,4BAA4B,EAAE;CACnE,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CAAC,GAA2B;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,aAAa,CAAC,KAAoC;IAChE,OAAO,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,eAA0C,EAAE,KAAa;IACtF,OAAO,gBAAgB,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,eAA0C,EAC1C,KAAa,EACb,KAAa;IAEb,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,YAAY,CAAC,eAA0C;IACrE,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,eAA0C,EAAE,EAAU;IACjF,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import type { FormQuestionType, ValidationRule } from '@mj-biz-apps/forms-entities';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Friendly editor for a {@link ValidationRule} (S2). Shows only the constraints that
6
+ * make sense for the question's type: length + pattern for text-ish types, min/max
7
+ * for numeric types. `required` is intentionally absent — it lives on the question's
8
+ * IsRequired, not in the validation rule. Emits a fresh rule (or `undefined` when
9
+ * empty) on every change.
10
+ */
11
+ export declare class ValidationRuleEditorComponent {
12
+ questionType: FormQuestionType;
13
+ set rule(value: ValidationRule | undefined);
14
+ ruleChange: EventEmitter<ValidationRule | undefined>;
15
+ protected _rule: ValidationRule;
16
+ protected get showLength(): boolean;
17
+ protected get showRange(): boolean;
18
+ protected get showPattern(): boolean;
19
+ protected get hasAnyControl(): boolean;
20
+ protected setNumber(field: 'minLength' | 'maxLength' | 'min' | 'max', raw: string): void;
21
+ protected setPattern(raw: string): void;
22
+ protected setPatternMessage(raw: string): void;
23
+ private emit;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<ValidationRuleEditorComponent, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<ValidationRuleEditorComponent, "mjf-validation-rule-editor", never, { "questionType": { "alias": "questionType"; "required": false; }; "rule": { "alias": "rule"; "required": false; }; }, { "ruleChange": "ruleChange"; }, never, never, true, never>;
26
+ }
27
+ //# sourceMappingURL=validation-rule-editor.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-rule-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/builder/validation-rule-editor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,YAAY,EAAiB,MAAM,eAAe,CAAC;AAGhG,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;;AAUpF;;;;;;GAMG;AACH,qBAQa,6BAA6B;IAC/B,YAAY,EAAE,gBAAgB,CAAe;IAEtD,IACI,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAEzC;IAES,UAAU,2CAAkD;IAEtE,SAAS,CAAC,KAAK,EAAE,cAAc,CAAM;IAErC,SAAS,KAAK,UAAU,IAAI,OAAO,CAElC;IAED,SAAS,KAAK,SAAS,IAAI,OAAO,CAMjC;IAED,SAAS,KAAK,WAAW,IAAI,OAAO,CAMnC;IAED,SAAS,KAAK,aAAa,IAAI,OAAO,CAErC;IAED,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAYxF,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYvC,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAY9C,OAAO,CAAC,IAAI;yCAxED,6BAA6B;2CAA7B,6BAA6B;CA2EzC"}
@@ -0,0 +1,179 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { BUILDER_CONTROL_STYLES } from './builder-styles';
5
+ import * as i0 from "@angular/core";
6
+ function ValidationRuleEditorComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
7
+ i0.ɵɵdomElementStart(0, "p", 7);
8
+ i0.ɵɵtext(1, "No validation options for this question type.");
9
+ i0.ɵɵdomElementEnd();
10
+ } }
11
+ function ValidationRuleEditorComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
12
+ const _r1 = i0.ɵɵgetCurrentView();
13
+ i0.ɵɵdomElementStart(0, "div")(1, "label", 8);
14
+ i0.ɵɵtext(2, "Min length");
15
+ i0.ɵɵdomElementEnd();
16
+ i0.ɵɵdomElementStart(3, "input", 9, 0);
17
+ i0.ɵɵdomListener("change", function ValidationRuleEditorComponent_Conditional_2_Template_input_change_3_listener() { i0.ɵɵrestoreView(_r1); const minLenInput_r2 = i0.ɵɵreference(4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setNumber("minLength", minLenInput_r2.value)); });
18
+ i0.ɵɵdomElementEnd()();
19
+ i0.ɵɵdomElementStart(5, "div")(6, "label", 10);
20
+ i0.ɵɵtext(7, "Max length");
21
+ i0.ɵɵdomElementEnd();
22
+ i0.ɵɵdomElementStart(8, "input", 11, 1);
23
+ i0.ɵɵdomListener("change", function ValidationRuleEditorComponent_Conditional_2_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r1); const maxLenInput_r4 = i0.ɵɵreference(9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setNumber("maxLength", maxLenInput_r4.value)); });
24
+ i0.ɵɵdomElementEnd()();
25
+ } if (rf & 2) {
26
+ const ctx_r2 = i0.ɵɵnextContext();
27
+ i0.ɵɵadvance(3);
28
+ i0.ɵɵdomProperty("value", ctx_r2._rule.minLength ?? "");
29
+ i0.ɵɵadvance(5);
30
+ i0.ɵɵdomProperty("value", ctx_r2._rule.maxLength ?? "");
31
+ } }
32
+ function ValidationRuleEditorComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
33
+ const _r5 = i0.ɵɵgetCurrentView();
34
+ i0.ɵɵdomElementStart(0, "div")(1, "label", 12);
35
+ i0.ɵɵtext(2, "Minimum value");
36
+ i0.ɵɵdomElementEnd();
37
+ i0.ɵɵdomElementStart(3, "input", 13, 2);
38
+ i0.ɵɵdomListener("change", function ValidationRuleEditorComponent_Conditional_3_Template_input_change_3_listener() { i0.ɵɵrestoreView(_r5); const minInput_r6 = i0.ɵɵreference(4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setNumber("min", minInput_r6.value)); });
39
+ i0.ɵɵdomElementEnd()();
40
+ i0.ɵɵdomElementStart(5, "div")(6, "label", 14);
41
+ i0.ɵɵtext(7, "Maximum value");
42
+ i0.ɵɵdomElementEnd();
43
+ i0.ɵɵdomElementStart(8, "input", 15, 3);
44
+ i0.ɵɵdomListener("change", function ValidationRuleEditorComponent_Conditional_3_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r5); const maxInput_r7 = i0.ɵɵreference(9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setNumber("max", maxInput_r7.value)); });
45
+ i0.ɵɵdomElementEnd()();
46
+ } if (rf & 2) {
47
+ const ctx_r2 = i0.ɵɵnextContext();
48
+ i0.ɵɵadvance(3);
49
+ i0.ɵɵdomProperty("value", ctx_r2._rule.min ?? "");
50
+ i0.ɵɵadvance(5);
51
+ i0.ɵɵdomProperty("value", ctx_r2._rule.max ?? "");
52
+ } }
53
+ function ValidationRuleEditorComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
54
+ const _r8 = i0.ɵɵgetCurrentView();
55
+ i0.ɵɵdomElementStart(0, "div", 16)(1, "label", 17);
56
+ i0.ɵɵtext(2, "Pattern (regular expression)");
57
+ i0.ɵɵdomElementEnd();
58
+ i0.ɵɵdomElementStart(3, "input", 18, 4);
59
+ i0.ɵɵdomListener("change", function ValidationRuleEditorComponent_Conditional_4_Template_input_change_3_listener() { i0.ɵɵrestoreView(_r8); const patternInput_r9 = i0.ɵɵreference(4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setPattern(patternInput_r9.value)); });
60
+ i0.ɵɵdomElementEnd()();
61
+ i0.ɵɵdomElementStart(5, "div", 16)(6, "label", 19);
62
+ i0.ɵɵtext(7, "Message shown when the pattern fails");
63
+ i0.ɵɵdomElementEnd();
64
+ i0.ɵɵdomElementStart(8, "input", 20, 5);
65
+ i0.ɵɵdomListener("change", function ValidationRuleEditorComponent_Conditional_4_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r8); const patternMsgInput_r10 = i0.ɵɵreference(9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setPatternMessage(patternMsgInput_r10.value)); });
66
+ i0.ɵɵdomElementEnd()();
67
+ } if (rf & 2) {
68
+ const ctx_r2 = i0.ɵɵnextContext();
69
+ i0.ɵɵadvance(3);
70
+ i0.ɵɵdomProperty("value", ctx_r2._rule.pattern ?? "");
71
+ i0.ɵɵadvance(5);
72
+ i0.ɵɵdomProperty("value", ctx_r2._rule.patternMessage ?? "");
73
+ } }
74
+ const VALIDATION_EDITOR_CSS = /* css */ `
75
+ .vre { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
76
+ .vre-full { grid-column: 1 / -1; }
77
+ .vre-label { display: block; font-size: 0.75rem; font-weight: 600; color: var(--mj-text-secondary); margin-bottom: 3px; }
78
+ .vre-empty { grid-column: 1 / -1; font-size: 0.8125rem; color: var(--mj-text-muted); margin: 0; }
79
+ `;
80
+ /**
81
+ * Friendly editor for a {@link ValidationRule} (S2). Shows only the constraints that
82
+ * make sense for the question's type: length + pattern for text-ish types, min/max
83
+ * for numeric types. `required` is intentionally absent — it lives on the question's
84
+ * IsRequired, not in the validation rule. Emits a fresh rule (or `undefined` when
85
+ * empty) on every change.
86
+ */
87
+ export class ValidationRuleEditorComponent {
88
+ questionType = 'ShortText';
89
+ set rule(value) {
90
+ this._rule = value ? { ...value } : {};
91
+ }
92
+ ruleChange = new EventEmitter();
93
+ _rule = {};
94
+ get showLength() {
95
+ return this.questionType === 'ShortText' || this.questionType === 'LongText';
96
+ }
97
+ get showRange() {
98
+ return (this.questionType === 'Number' ||
99
+ this.questionType === 'Rating' ||
100
+ this.questionType === 'NPS');
101
+ }
102
+ get showPattern() {
103
+ return (this.questionType === 'ShortText' ||
104
+ this.questionType === 'Phone' ||
105
+ this.questionType === 'Email');
106
+ }
107
+ get hasAnyControl() {
108
+ return this.showLength || this.showRange || this.showPattern;
109
+ }
110
+ setNumber(field, raw) {
111
+ const next = { ...this._rule };
112
+ const parsed = raw.trim() === '' ? undefined : Number(raw);
113
+ if (parsed === undefined || Number.isNaN(parsed)) {
114
+ delete next[field];
115
+ }
116
+ else {
117
+ next[field] = parsed;
118
+ }
119
+ this._rule = next;
120
+ this.emit();
121
+ }
122
+ setPattern(raw) {
123
+ const next = { ...this._rule };
124
+ const trimmed = raw.trim();
125
+ if (trimmed === '') {
126
+ delete next.pattern;
127
+ }
128
+ else {
129
+ next.pattern = trimmed;
130
+ }
131
+ this._rule = next;
132
+ this.emit();
133
+ }
134
+ setPatternMessage(raw) {
135
+ const next = { ...this._rule };
136
+ const trimmed = raw.trim();
137
+ if (trimmed === '') {
138
+ delete next.patternMessage;
139
+ }
140
+ else {
141
+ next.patternMessage = trimmed;
142
+ }
143
+ this._rule = next;
144
+ this.emit();
145
+ }
146
+ emit() {
147
+ this.ruleChange.emit(Object.keys(this._rule).length === 0 ? undefined : { ...this._rule });
148
+ }
149
+ static ɵfac = function ValidationRuleEditorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ValidationRuleEditorComponent)(); };
150
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ValidationRuleEditorComponent, selectors: [["mjf-validation-rule-editor"]], inputs: { questionType: "questionType", rule: "rule" }, outputs: { ruleChange: "ruleChange" }, decls: 5, vars: 4, consts: [["minLenInput", ""], ["maxLenInput", ""], ["minInput", ""], ["maxInput", ""], ["patternInput", ""], ["patternMsgInput", ""], [1, "vre"], [1, "vre-empty"], ["for", "vre-minlen", 1, "vre-label"], ["id", "vre-minlen", "type", "number", "min", "0", 1, "mjf-input", 3, "change", "value"], ["for", "vre-maxlen", 1, "vre-label"], ["id", "vre-maxlen", "type", "number", "min", "0", 1, "mjf-input", 3, "change", "value"], ["for", "vre-min", 1, "vre-label"], ["id", "vre-min", "type", "number", 1, "mjf-input", 3, "change", "value"], ["for", "vre-max", 1, "vre-label"], ["id", "vre-max", "type", "number", 1, "mjf-input", 3, "change", "value"], [1, "vre-full"], ["for", "vre-pattern", 1, "vre-label"], ["id", "vre-pattern", "type", "text", "placeholder", "^[A-Z]{2}\\d+$", 1, "mjf-input", 3, "change", "value"], ["for", "vre-patternmsg", 1, "vre-label"], ["id", "vre-patternmsg", "type", "text", "placeholder", "Please enter a valid value", 1, "mjf-input", 3, "change", "value"]], template: function ValidationRuleEditorComponent_Template(rf, ctx) { if (rf & 1) {
151
+ i0.ɵɵdomElementStart(0, "div", 6);
152
+ i0.ɵɵconditionalCreate(1, ValidationRuleEditorComponent_Conditional_1_Template, 2, 0, "p", 7);
153
+ i0.ɵɵconditionalCreate(2, ValidationRuleEditorComponent_Conditional_2_Template, 10, 2);
154
+ i0.ɵɵconditionalCreate(3, ValidationRuleEditorComponent_Conditional_3_Template, 10, 2);
155
+ i0.ɵɵconditionalCreate(4, ValidationRuleEditorComponent_Conditional_4_Template, 10, 2);
156
+ i0.ɵɵdomElementEnd();
157
+ } if (rf & 2) {
158
+ i0.ɵɵadvance();
159
+ i0.ɵɵconditional(!ctx.hasAnyControl ? 1 : -1);
160
+ i0.ɵɵadvance();
161
+ i0.ɵɵconditional(ctx.showLength ? 2 : -1);
162
+ i0.ɵɵadvance();
163
+ i0.ɵɵconditional(ctx.showRange ? 3 : -1);
164
+ i0.ɵɵadvance();
165
+ i0.ɵɵconditional(ctx.showPattern ? 4 : -1);
166
+ } }, dependencies: [CommonModule, FormsModule], styles: ["[_nghost-%COMP%] {\n --mjf-builder-gap: 16px;\n --mjf-builder-radius: var(--mj-radius-md, 8px);\n}\n.mjf-input[_ngcontent-%COMP%] {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n font: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mjf-builder-radius);\n transition: border-color var(--mj-transition-base, 0.15s ease);\n}\n.mjf-input[_ngcontent-%COMP%]:focus {\n outline: 2px solid var(--mjf-focus-ring, var(--mj-brand-primary));\n outline-offset: 1px;\n border-color: var(--mj-brand-primary);\n}\ntextarea.mjf-input[_ngcontent-%COMP%] { min-height: 64px; resize: vertical; }\n.mjf-field[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; margin-bottom: var(--mjf-builder-gap); }\n.mjf-field-label[_ngcontent-%COMP%] { font-size: 0.8125rem; font-weight: 600; color: var(--mj-text-secondary); }\n.mjf-field-hint[_ngcontent-%COMP%] { font-size: 0.75rem; color: var(--mj-text-muted); }\n.mjf-row[_ngcontent-%COMP%] { display: flex; gap: 8px; align-items: center; }\n.mjf-btn[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 8px 14px; font: inherit; font-weight: 600; cursor: pointer;\n border-radius: var(--mjf-btn-radius, var(--mjf-builder-radius));\n border: 1px solid transparent;\n transition: background var(--mj-transition-base, 0.15s ease), border-color var(--mj-transition-base, 0.15s ease);\n}\n.mjf-btn[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--mjf-focus-ring, var(--mj-brand-primary)); outline-offset: 2px; }\n.mjf-btn[_ngcontent-%COMP%]:disabled { opacity: 0.5; cursor: not-allowed; }\n.mjf-btn--primary[_ngcontent-%COMP%] { color: var(--mj-brand-on-primary, var(--mj-text-inverse)); background: var(--mj-brand-primary); }\n.mjf-btn--primary[_ngcontent-%COMP%]:hover:not(:disabled) { background: var(--mj-brand-primary-hover, var(--mj-brand-primary)); }\n.mjf-btn--ghost[_ngcontent-%COMP%] { color: var(--mj-text-secondary); background: transparent; border-color: var(--mj-border-default); }\n.mjf-btn--ghost[_ngcontent-%COMP%]:hover:not(:disabled) { background: var(--mj-bg-surface-hover); }\n.mjf-btn--danger[_ngcontent-%COMP%] { color: var(--mj-status-error, var(--mj-color-error-600)); background: transparent; border-color: var(--mj-border-default); }\n.mjf-btn--danger[_ngcontent-%COMP%]:hover:not(:disabled) { background: var(--mj-bg-surface-hover); }\n.mjf-pill[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 3px 9px; font-size: 0.75rem; font-weight: 600;\n border-radius: var(--mjf-pill-radius, var(--mj-radius-full, 999px));\n color: var(--mj-text-secondary); background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n}\n.mjf-switch[_ngcontent-%COMP%] {\n position: relative; display: inline-block; width: 38px; height: 22px; flex: none; cursor: pointer;\n border-radius: var(--mj-radius-full, 999px); background: var(--mj-border-strong);\n transition: background var(--mj-transition-base, 0.15s ease);\n border: none; padding: 0;\n}\n.mjf-switch[_ngcontent-%COMP%]::after {\n content: ''; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;\n border-radius: 50%; background: var(--mj-bg-surface);\n transition: transform var(--mj-transition-base, 0.15s ease);\n}\n.mjf-switch.is-on[_ngcontent-%COMP%] { background: var(--mj-brand-primary); }\n.mjf-switch.is-on[_ngcontent-%COMP%]::after { transform: translateX(16px); }\n.mjf-switch[_ngcontent-%COMP%]:focus-visible { outline: 2px solid var(--mjf-focus-ring, var(--mj-brand-primary)); outline-offset: 2px; }", ".vre[_ngcontent-%COMP%] { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n.vre-full[_ngcontent-%COMP%] { grid-column: 1 / -1; }\n.vre-label[_ngcontent-%COMP%] { display: block; font-size: 0.75rem; font-weight: 600; color: var(--mj-text-secondary); margin-bottom: 3px; }\n.vre-empty[_ngcontent-%COMP%] { grid-column: 1 / -1; font-size: 0.8125rem; color: var(--mj-text-muted); margin: 0; }"], changeDetection: 0 });
167
+ }
168
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ValidationRuleEditorComponent, [{
169
+ type: Component,
170
+ args: [{ selector: 'mjf-validation-rule-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule], template: "<div class=\"vre\">\n @if (!hasAnyControl) {\n <p class=\"vre-empty\">No validation options for this question type.</p>\n }\n\n @if (showLength) {\n <div>\n <label class=\"vre-label\" for=\"vre-minlen\">Min length</label>\n <input\n #minLenInput\n id=\"vre-minlen\"\n type=\"number\"\n min=\"0\"\n class=\"mjf-input\"\n [value]=\"_rule.minLength ?? ''\"\n (change)=\"setNumber('minLength', minLenInput.value)\"\n />\n </div>\n <div>\n <label class=\"vre-label\" for=\"vre-maxlen\">Max length</label>\n <input\n #maxLenInput\n id=\"vre-maxlen\"\n type=\"number\"\n min=\"0\"\n class=\"mjf-input\"\n [value]=\"_rule.maxLength ?? ''\"\n (change)=\"setNumber('maxLength', maxLenInput.value)\"\n />\n </div>\n }\n\n @if (showRange) {\n <div>\n <label class=\"vre-label\" for=\"vre-min\">Minimum value</label>\n <input\n #minInput\n id=\"vre-min\"\n type=\"number\"\n class=\"mjf-input\"\n [value]=\"_rule.min ?? ''\"\n (change)=\"setNumber('min', minInput.value)\"\n />\n </div>\n <div>\n <label class=\"vre-label\" for=\"vre-max\">Maximum value</label>\n <input\n #maxInput\n id=\"vre-max\"\n type=\"number\"\n class=\"mjf-input\"\n [value]=\"_rule.max ?? ''\"\n (change)=\"setNumber('max', maxInput.value)\"\n />\n </div>\n }\n\n @if (showPattern) {\n <div class=\"vre-full\">\n <label class=\"vre-label\" for=\"vre-pattern\">Pattern (regular expression)</label>\n <input\n #patternInput\n id=\"vre-pattern\"\n type=\"text\"\n class=\"mjf-input\"\n placeholder=\"^[A-Z]{2}\\d+$\"\n [value]=\"_rule.pattern ?? ''\"\n (change)=\"setPattern(patternInput.value)\"\n />\n </div>\n <div class=\"vre-full\">\n <label class=\"vre-label\" for=\"vre-patternmsg\">Message shown when the pattern fails</label>\n <input\n #patternMsgInput\n id=\"vre-patternmsg\"\n type=\"text\"\n class=\"mjf-input\"\n placeholder=\"Please enter a valid value\"\n [value]=\"_rule.patternMessage ?? ''\"\n (change)=\"setPatternMessage(patternMsgInput.value)\"\n />\n </div>\n }\n</div>\n", styles: ["\n:host {\n --mjf-builder-gap: 16px;\n --mjf-builder-radius: var(--mj-radius-md, 8px);\n}\n.mjf-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n font: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mjf-builder-radius);\n transition: border-color var(--mj-transition-base, 0.15s ease);\n}\n.mjf-input:focus {\n outline: 2px solid var(--mjf-focus-ring, var(--mj-brand-primary));\n outline-offset: 1px;\n border-color: var(--mj-brand-primary);\n}\ntextarea.mjf-input { min-height: 64px; resize: vertical; }\n.mjf-field { display: flex; flex-direction: column; gap: 4px; margin-bottom: var(--mjf-builder-gap); }\n.mjf-field-label { font-size: 0.8125rem; font-weight: 600; color: var(--mj-text-secondary); }\n.mjf-field-hint { font-size: 0.75rem; color: var(--mj-text-muted); }\n.mjf-row { display: flex; gap: 8px; align-items: center; }\n.mjf-btn {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 8px 14px; font: inherit; font-weight: 600; cursor: pointer;\n border-radius: var(--mjf-btn-radius, var(--mjf-builder-radius));\n border: 1px solid transparent;\n transition: background var(--mj-transition-base, 0.15s ease), border-color var(--mj-transition-base, 0.15s ease);\n}\n.mjf-btn:focus-visible { outline: 2px solid var(--mjf-focus-ring, var(--mj-brand-primary)); outline-offset: 2px; }\n.mjf-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n.mjf-btn--primary { color: var(--mj-brand-on-primary, var(--mj-text-inverse)); background: var(--mj-brand-primary); }\n.mjf-btn--primary:hover:not(:disabled) { background: var(--mj-brand-primary-hover, var(--mj-brand-primary)); }\n.mjf-btn--ghost { color: var(--mj-text-secondary); background: transparent; border-color: var(--mj-border-default); }\n.mjf-btn--ghost:hover:not(:disabled) { background: var(--mj-bg-surface-hover); }\n.mjf-btn--danger { color: var(--mj-status-error, var(--mj-color-error-600)); background: transparent; border-color: var(--mj-border-default); }\n.mjf-btn--danger:hover:not(:disabled) { background: var(--mj-bg-surface-hover); }\n.mjf-pill {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 3px 9px; font-size: 0.75rem; font-weight: 600;\n border-radius: var(--mjf-pill-radius, var(--mj-radius-full, 999px));\n color: var(--mj-text-secondary); background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n}\n.mjf-switch {\n position: relative; display: inline-block; width: 38px; height: 22px; flex: none; cursor: pointer;\n border-radius: var(--mj-radius-full, 999px); background: var(--mj-border-strong);\n transition: background var(--mj-transition-base, 0.15s ease);\n border: none; padding: 0;\n}\n.mjf-switch::after {\n content: ''; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;\n border-radius: 50%; background: var(--mj-bg-surface);\n transition: transform var(--mj-transition-base, 0.15s ease);\n}\n.mjf-switch.is-on { background: var(--mj-brand-primary); }\n.mjf-switch.is-on::after { transform: translateX(16px); }\n.mjf-switch:focus-visible { outline: 2px solid var(--mjf-focus-ring, var(--mj-brand-primary)); outline-offset: 2px; }\n", "\n.vre { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n.vre-full { grid-column: 1 / -1; }\n.vre-label { display: block; font-size: 0.75rem; font-weight: 600; color: var(--mj-text-secondary); margin-bottom: 3px; }\n.vre-empty { grid-column: 1 / -1; font-size: 0.8125rem; color: var(--mj-text-muted); margin: 0; }\n"] }]
171
+ }], null, { questionType: [{
172
+ type: Input
173
+ }], rule: [{
174
+ type: Input
175
+ }], ruleChange: [{
176
+ type: Output
177
+ }] }); })();
178
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ValidationRuleEditorComponent, { className: "ValidationRuleEditorComponent", filePath: "lib/builder/validation-rule-editor.component.ts", lineNumber: 29 }); })();
179
+ //# sourceMappingURL=validation-rule-editor.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-rule-editor.component.js","sourceRoot":"","sources":["../../../src/lib/builder/validation-rule-editor.component.ts","../../../src/lib/builder/validation-rule-editor.component.html"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DistributionBucket } from '../models/reporting.model';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Horizontal bar chart for a choice/boolean distribution. Pure CSS bars whose
5
+ * fills come from `--mj-*` design tokens (no hardcoded colors → dark-mode safe).
6
+ * Each bar's width is the bucket fraction; counts + percentages are labelled.
7
+ */
8
+ export declare class FormsDistributionChartComponent {
9
+ buckets: DistributionBucket[];
10
+ pct(fraction: number): string;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormsDistributionChartComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormsDistributionChartComponent, "mj-forms-distribution-chart", never, { "buckets": { "alias": "buckets"; "required": false; }; }, {}, never, never, true, never>;
13
+ }
14
+ //# sourceMappingURL=distribution-chart.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution-chart.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/dashboard/components/distribution-chart.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;;AAEpE;;;;GAIG;AACH,qBAgFa,+BAA+B;IACjC,OAAO,EAAE,kBAAkB,EAAE,CAAM;IAErC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;yCAHzB,+BAA+B;2CAA/B,+BAA+B;CAM3C"}
@@ -0,0 +1,85 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const _forTrack0 = ($index, $item) => $item.label;
4
+ function FormsDistributionChartComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵdomElementStart(0, "p", 0);
6
+ i0.ɵɵtext(1, "No answers yet.");
7
+ i0.ɵɵdomElementEnd();
8
+ } }
9
+ function FormsDistributionChartComponent_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
10
+ i0.ɵɵdomElementStart(0, "li", 2)(1, "span", 3);
11
+ i0.ɵɵtext(2);
12
+ i0.ɵɵdomElementEnd();
13
+ i0.ɵɵdomElementStart(3, "span", 4);
14
+ i0.ɵɵdomElement(4, "span", 5);
15
+ i0.ɵɵdomElementEnd();
16
+ i0.ɵɵdomElementStart(5, "span", 6);
17
+ i0.ɵɵtext(6);
18
+ i0.ɵɵdomElementEnd()();
19
+ } if (rf & 2) {
20
+ const b_r1 = ctx.$implicit;
21
+ const ctx_r1 = i0.ɵɵnextContext(2);
22
+ i0.ɵɵadvance();
23
+ i0.ɵɵdomProperty("title", b_r1.label);
24
+ i0.ɵɵadvance();
25
+ i0.ɵɵtextInterpolate(b_r1.label);
26
+ i0.ɵɵadvance(2);
27
+ i0.ɵɵstyleProp("width", b_r1.fraction * 100, "%");
28
+ i0.ɵɵattribute("aria-label", b_r1.label + ": " + b_r1.count + " (" + ctx_r1.pct(b_r1.fraction) + ")");
29
+ i0.ɵɵadvance(2);
30
+ i0.ɵɵtextInterpolate2("", b_r1.count, " (", ctx_r1.pct(b_r1.fraction), ")");
31
+ } }
32
+ function FormsDistributionChartComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵdomElementStart(0, "ul", 1);
34
+ i0.ɵɵrepeaterCreate(1, FormsDistributionChartComponent_Conditional_1_For_2_Template, 7, 7, "li", 2, _forTrack0);
35
+ i0.ɵɵdomElementEnd();
36
+ } if (rf & 2) {
37
+ const ctx_r1 = i0.ɵɵnextContext();
38
+ i0.ɵɵadvance();
39
+ i0.ɵɵrepeater(ctx_r1.buckets);
40
+ } }
41
+ /**
42
+ * Horizontal bar chart for a choice/boolean distribution. Pure CSS bars whose
43
+ * fills come from `--mj-*` design tokens (no hardcoded colors → dark-mode safe).
44
+ * Each bar's width is the bucket fraction; counts + percentages are labelled.
45
+ */
46
+ export class FormsDistributionChartComponent {
47
+ buckets = [];
48
+ pct(fraction) {
49
+ return `${Math.round(fraction * 100)}%`;
50
+ }
51
+ static ɵfac = function FormsDistributionChartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormsDistributionChartComponent)(); };
52
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FormsDistributionChartComponent, selectors: [["mj-forms-distribution-chart"]], inputs: { buckets: "buckets" }, decls: 2, vars: 1, consts: [[1, "empty"], ["role", "list", 1, "bars"], [1, "bar-row"], [1, "bar-label", 3, "title"], [1, "bar-track"], [1, "bar-fill"], [1, "bar-value"]], template: function FormsDistributionChartComponent_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵconditionalCreate(0, FormsDistributionChartComponent_Conditional_0_Template, 2, 0, "p", 0)(1, FormsDistributionChartComponent_Conditional_1_Template, 3, 0, "ul", 1);
54
+ } if (rf & 2) {
55
+ i0.ɵɵconditional(ctx.buckets.length === 0 ? 0 : 1);
56
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n }\n .empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n margin: 0;\n }\n .bars[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-2);\n }\n .bar-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(80px, 30%) 1fr auto;\n align-items: center;\n gap: var(--mj-space-2-5);\n }\n .bar-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .bar-track[_ngcontent-%COMP%] {\n position: relative;\n height: 18px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n overflow: hidden;\n }\n .bar-fill[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0 auto 0 0;\n background: var(--mj-brand-primary);\n border-radius: var(--mj-radius-sm);\n min-width: 2px;\n transition: width 0.3s ease;\n }\n .bar-value[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }"], changeDetection: 0 });
57
+ }
58
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormsDistributionChartComponent, [{
59
+ type: Component,
60
+ args: [{ selector: 'mj-forms-distribution-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
61
+ @if (buckets.length === 0) {
62
+ <p class="empty">No answers yet.</p>
63
+ } @else {
64
+ <ul class="bars" role="list">
65
+ @for (b of buckets; track b.label) {
66
+ <li class="bar-row">
67
+ <span class="bar-label" [title]="b.label">{{ b.label }}</span>
68
+ <span class="bar-track">
69
+ <span
70
+ class="bar-fill"
71
+ [style.width.%]="b.fraction * 100"
72
+ [attr.aria-label]="b.label + ': ' + b.count + ' (' + pct(b.fraction) + ')'">
73
+ </span>
74
+ </span>
75
+ <span class="bar-value">{{ b.count }} ({{ pct(b.fraction) }})</span>
76
+ </li>
77
+ }
78
+ </ul>
79
+ }
80
+ `, styles: ["\n :host {\n display: block;\n }\n .empty {\n color: var(--mj-text-muted);\n font-style: italic;\n margin: 0;\n }\n .bars {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-2);\n }\n .bar-row {\n display: grid;\n grid-template-columns: minmax(80px, 30%) 1fr auto;\n align-items: center;\n gap: var(--mj-space-2-5);\n }\n .bar-label {\n font-size: 13px;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .bar-track {\n position: relative;\n height: 18px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n overflow: hidden;\n }\n .bar-fill {\n position: absolute;\n inset: 0 auto 0 0;\n background: var(--mj-brand-primary);\n border-radius: var(--mj-radius-sm);\n min-width: 2px;\n transition: width 0.3s ease;\n }\n .bar-value {\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n "] }]
81
+ }], null, { buckets: [{
82
+ type: Input
83
+ }] }); })();
84
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormsDistributionChartComponent, { className: "FormsDistributionChartComponent", filePath: "lib/dashboard/components/distribution-chart.component.ts", lineNumber: 89 }); })();
85
+ //# sourceMappingURL=distribution-chart.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution-chart.component.js","sourceRoot":"","sources":["../../../../src/lib/dashboard/components/distribution-chart.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;;;;IAcpE,+BAAiB;IAAA,+BAAe;IAAA,oBAAI;;;IAK9B,AADF,gCAAoB,cACwB;IAAA,YAAa;IAAA,oBAAO;IAC9D,kCAAwB;IACtB,6BAIO;IACT,oBAAO;IACP,kCAAwB;IAAA,YAAqC;IAC/D,AAD+D,oBAAO,EACjE;;;;IATqB,cAAiB;IAAjB,qCAAiB;IAAC,cAAa;IAAb,gCAAa;IAInD,eAAkC;IAAlC,iDAAkC;;IAId,eAAqC;IAArC,2EAAqC;;;IAXnE,gCAA6B;IAC3B,+GAYC;IACH,oBAAK;;;IAbH,cAYC;IAZD,6BAYC;;AA1BT;;;;GAIG;AAiFH,MAAM,OAAO,+BAA+B;IACjC,OAAO,GAAyB,EAAE,CAAC;IAErC,GAAG,CAAC,QAAgB;QACzB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;IAC1C,CAAC;yHALU,+BAA+B;6DAA/B,+BAA+B;YAzEtC,AAFF,+FAA4B,0EAEnB;;YAFT,kDAkBC;;;iFAyDQ,+BAA+B;cAhF3C,SAAS;2BACE,6BAA6B,cAC3B,IAAI,mBACC,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;;GAoBT;;kBAyDA,KAAK;;kFADK,+BAA+B"}
@@ -0,0 +1,14 @@
1
+ import type { FunnelStep } from '../models/reporting.model';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Page completion / drop-off funnel. Each step is a token-filled bar whose width
5
+ * is its retention relative to the first step, with the per-step drop-off called
6
+ * out. All colors are `--mj-*` tokens (dark-mode safe).
7
+ */
8
+ export declare class FormsFunnelChartComponent {
9
+ steps: FunnelStep[];
10
+ pct(fraction: number): string;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormsFunnelChartComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormsFunnelChartComponent, "mj-forms-funnel-chart", never, { "steps": { "alias": "steps"; "required": false; }; }, {}, never, never, true, never>;
13
+ }
14
+ //# sourceMappingURL=funnel-chart.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnel-chart.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/dashboard/components/funnel-chart.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;;AAE5D;;;;GAIG;AACH,qBAsFa,yBAAyB;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAM;IAE3B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;yCAHzB,yBAAyB;2CAAzB,yBAAyB;CAMrC"}
@@ -0,0 +1,101 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const _forTrack0 = ($index, $item) => $item.pageId;
4
+ function FormsFunnelChartComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵdomElementStart(0, "p", 0);
6
+ i0.ɵɵtext(1, "No pages to chart.");
7
+ i0.ɵɵdomElementEnd();
8
+ } }
9
+ function FormsFunnelChartComponent_Conditional_1_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
10
+ i0.ɵɵdomElementStart(0, "span", 8);
11
+ i0.ɵɵdomElement(1, "i", 9);
12
+ i0.ɵɵtext(2);
13
+ i0.ɵɵdomElementEnd();
14
+ } if (rf & 2) {
15
+ const s_r1 = i0.ɵɵnextContext().$implicit;
16
+ const ctx_r1 = i0.ɵɵnextContext(2);
17
+ i0.ɵɵadvance(2);
18
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.pct(s_r1.dropOff), " drop-off ");
19
+ } }
20
+ function FormsFunnelChartComponent_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵdomElementStart(0, "li", 2)(1, "div", 3)(2, "span", 4);
22
+ i0.ɵɵtext(3);
23
+ i0.ɵɵdomElementEnd();
24
+ i0.ɵɵdomElementStart(4, "span", 5);
25
+ i0.ɵɵtext(5);
26
+ i0.ɵɵdomElementEnd()();
27
+ i0.ɵɵdomElementStart(6, "div", 6);
28
+ i0.ɵɵdomElement(7, "div", 7);
29
+ i0.ɵɵdomElementEnd();
30
+ i0.ɵɵconditionalCreate(8, FormsFunnelChartComponent_Conditional_1_For_2_Conditional_8_Template, 3, 1, "span", 8);
31
+ i0.ɵɵdomElementEnd();
32
+ } if (rf & 2) {
33
+ const s_r1 = ctx.$implicit;
34
+ const ɵ$index_8_r3 = ctx.$index;
35
+ const ctx_r1 = i0.ɵɵnextContext(2);
36
+ i0.ɵɵadvance(3);
37
+ i0.ɵɵtextInterpolate2("", ɵ$index_8_r3 + 1, ". ", s_r1.title);
38
+ i0.ɵɵadvance(2);
39
+ i0.ɵɵtextInterpolate2("", s_r1.reached, " reached \u00B7 ", ctx_r1.pct(s_r1.retention), " retained");
40
+ i0.ɵɵadvance(2);
41
+ i0.ɵɵstyleProp("width", s_r1.retention * 100, "%");
42
+ i0.ɵɵadvance();
43
+ i0.ɵɵconditional(ɵ$index_8_r3 > 0 && s_r1.dropOff > 0 ? 8 : -1);
44
+ } }
45
+ function FormsFunnelChartComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵdomElementStart(0, "ol", 1);
47
+ i0.ɵɵrepeaterCreate(1, FormsFunnelChartComponent_Conditional_1_For_2_Template, 9, 7, "li", 2, _forTrack0);
48
+ i0.ɵɵdomElementEnd();
49
+ } if (rf & 2) {
50
+ const ctx_r1 = i0.ɵɵnextContext();
51
+ i0.ɵɵadvance();
52
+ i0.ɵɵrepeater(ctx_r1.steps);
53
+ } }
54
+ /**
55
+ * Page completion / drop-off funnel. Each step is a token-filled bar whose width
56
+ * is its retention relative to the first step, with the per-step drop-off called
57
+ * out. All colors are `--mj-*` tokens (dark-mode safe).
58
+ */
59
+ export class FormsFunnelChartComponent {
60
+ steps = [];
61
+ pct(fraction) {
62
+ return `${Math.round(fraction * 100)}%`;
63
+ }
64
+ static ɵfac = function FormsFunnelChartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormsFunnelChartComponent)(); };
65
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FormsFunnelChartComponent, selectors: [["mj-forms-funnel-chart"]], inputs: { steps: "steps" }, decls: 2, vars: 1, consts: [[1, "empty"], [1, "funnel"], [1, "step"], [1, "step-head"], [1, "step-title"], [1, "step-count"], [1, "step-track"], [1, "step-fill"], [1, "step-drop"], [1, "fa-solid", "fa-arrow-trend-down"]], template: function FormsFunnelChartComponent_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵconditionalCreate(0, FormsFunnelChartComponent_Conditional_0_Template, 2, 0, "p", 0)(1, FormsFunnelChartComponent_Conditional_1_Template, 3, 0, "ol", 1);
67
+ } if (rf & 2) {
68
+ i0.ɵɵconditional(ctx.steps.length === 0 ? 0 : 1);
69
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n }\n .empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n margin: 0;\n }\n .funnel[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-3);\n }\n .step-head[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: var(--mj-space-2);\n margin-bottom: var(--mj-space-1);\n }\n .step-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .step-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n .step-track[_ngcontent-%COMP%] {\n height: 22px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n overflow: hidden;\n }\n .step-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-color-brand-600);\n border-radius: var(--mj-radius-sm);\n min-width: 2px;\n transition: width 0.3s ease;\n }\n .step-drop[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: var(--mj-space-1);\n font-size: 11px;\n color: var(--mj-status-warning);\n }"], changeDetection: 0 });
70
+ }
71
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormsFunnelChartComponent, [{
72
+ type: Component,
73
+ args: [{ selector: 'mj-forms-funnel-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
74
+ @if (steps.length === 0) {
75
+ <p class="empty">No pages to chart.</p>
76
+ } @else {
77
+ <ol class="funnel">
78
+ @for (s of steps; track s.pageId; let idx = $index) {
79
+ <li class="step">
80
+ <div class="step-head">
81
+ <span class="step-title">{{ idx + 1 }}. {{ s.title }}</span>
82
+ <span class="step-count">{{ s.reached }} reached · {{ pct(s.retention) }} retained</span>
83
+ </div>
84
+ <div class="step-track">
85
+ <div class="step-fill" [style.width.%]="s.retention * 100"></div>
86
+ </div>
87
+ @if (idx > 0 && s.dropOff > 0) {
88
+ <span class="step-drop">
89
+ <i class="fa-solid fa-arrow-trend-down"></i> {{ pct(s.dropOff) }} drop-off
90
+ </span>
91
+ }
92
+ </li>
93
+ }
94
+ </ol>
95
+ }
96
+ `, styles: ["\n :host {\n display: block;\n }\n .empty {\n color: var(--mj-text-muted);\n font-style: italic;\n margin: 0;\n }\n .funnel {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-3);\n }\n .step-head {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: var(--mj-space-2);\n margin-bottom: var(--mj-space-1);\n }\n .step-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .step-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n .step-track {\n height: 22px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n overflow: hidden;\n }\n .step-fill {\n height: 100%;\n background: var(--mj-color-brand-600);\n border-radius: var(--mj-radius-sm);\n min-width: 2px;\n transition: width 0.3s ease;\n }\n .step-drop {\n display: inline-block;\n margin-top: var(--mj-space-1);\n font-size: 11px;\n color: var(--mj-status-warning);\n }\n "] }]
97
+ }], null, { steps: [{
98
+ type: Input
99
+ }] }); })();
100
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormsFunnelChartComponent, { className: "FormsFunnelChartComponent", filePath: "lib/dashboard/components/funnel-chart.component.ts", lineNumber: 95 }); })();
101
+ //# sourceMappingURL=funnel-chart.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnel-chart.component.js","sourceRoot":"","sources":["../../../../src/lib/dashboard/components/funnel-chart.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;;;;IAcpE,+BAAiB;IAAA,kCAAkB;IAAA,oBAAI;;;IAa/B,kCAAwB;IACtB,0BAA4C;IAAC,YAC/C;IAAA,oBAAO;;;;IADwC,eAC/C;IAD+C,kEAC/C;;;IATA,AADF,AADF,gCAAiB,aACQ,cACI;IAAA,YAA4B;IAAA,oBAAO;IAC5D,kCAAyB;IAAA,YAAyD;IACpF,AADoF,oBAAO,EACrF;IACN,iCAAwB;IACtB,4BAAiE;IACnE,oBAAM;IACN,gHAAgC;IAKlC,oBAAK;;;;;IAXwB,eAA4B;IAA5B,6DAA4B;IAC5B,eAAyD;IAAzD,oGAAyD;IAG3D,eAAmC;IAAnC,kDAAmC;IAE5D,cAIC;IAJD,+DAIC;;;IAdP,gCAAmB;IACjB,yGAeC;IACH,oBAAK;;;IAhBH,cAeC;IAfD,2BAeC;;AA7BT;;;;GAIG;AAuFH,MAAM,OAAO,yBAAyB;IAC3B,KAAK,GAAiB,EAAE,CAAC;IAE3B,GAAG,CAAC,QAAgB;QACzB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;IAC1C,CAAC;mHALU,yBAAyB;6DAAzB,yBAAyB;YA/EhC,AAFF,yFAA0B,oEAEjB;;YAFT,gDAqBC;;;iFA4DQ,yBAAyB;cAtFrC,SAAS;2BACE,uBAAuB,cACrB,IAAI,mBACC,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;;;;;GAuBT;;kBA4DA,KAAK;;kFADK,yBAAyB"}
@@ -0,0 +1,16 @@
1
+ import type { QuestionBreakdown } from '../models/reporting.model';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Renders one question's breakdown card, switching by kind:
5
+ * - distribution/boolean → bar chart
6
+ * - numeric → aggregates (with NPS score + segments when applicable)
7
+ * - freeText → verbatim list
8
+ */
9
+ export declare class FormsQuestionBreakdownComponent {
10
+ breakdown: QuestionBreakdown;
11
+ get typeLabel(): string;
12
+ fmt(value: number | null): string;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormsQuestionBreakdownComponent, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormsQuestionBreakdownComponent, "mj-forms-question-breakdown", never, { "breakdown": { "alias": "breakdown"; "required": true; }; }, {}, never, never, true, never>;
15
+ }
16
+ //# sourceMappingURL=question-breakdown.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-breakdown.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/dashboard/components/question-breakdown.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;;AAGnE;;;;;GAKG;AACH,qBAqJa,+BAA+B;IACf,SAAS,EAAG,iBAAiB,CAAC;IAEzD,IAAW,SAAS,IAAI,MAAM,CAE7B;IAEM,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;yCAP7B,+BAA+B;2CAA/B,+BAA+B;CAW3C"}