@10x-media/form-builder 0.1.0-beta.2 → 0.1.0-beta.21

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 (619) hide show
  1. package/CHANGELOG.md +360 -0
  2. package/README.md +7 -5
  3. package/dist/actions/assertNoBlockCollision.js +18 -0
  4. package/dist/actions/assertNoBlockCollision.js.map +1 -0
  5. package/dist/actions/body/converters.d.ts +20 -0
  6. package/dist/actions/body/converters.js +57 -0
  7. package/dist/actions/body/converters.js.map +1 -0
  8. package/dist/actions/body/escapeHtml.d.ts +6 -0
  9. package/dist/actions/body/escapeHtml.js +14 -0
  10. package/dist/actions/body/escapeHtml.js.map +1 -0
  11. package/dist/actions/body/serializeBody.d.ts +55 -0
  12. package/dist/actions/body/serializeBody.js +78 -0
  13. package/dist/actions/body/serializeBody.js.map +1 -0
  14. package/dist/actions/body/serializeSlate.js +31 -0
  15. package/dist/actions/body/serializeSlate.js.map +1 -0
  16. package/dist/actions/body/textOfBody.d.ts +13 -0
  17. package/dist/actions/body/textOfBody.js +35 -0
  18. package/dist/actions/body/textOfBody.js.map +1 -0
  19. package/dist/actions/body/wildcards.d.ts +10 -0
  20. package/dist/actions/body/wildcards.js +33 -0
  21. package/dist/actions/body/wildcards.js.map +1 -0
  22. package/dist/actions/buildActionBlocks.js +12 -9
  23. package/dist/actions/buildActionBlocks.js.map +1 -1
  24. package/dist/actions/builtin/confirmation.js +47 -43
  25. package/dist/actions/builtin/confirmation.js.map +1 -1
  26. package/dist/actions/builtin/emailAction.d.ts +20 -0
  27. package/dist/actions/builtin/emailAction.js +120 -0
  28. package/dist/actions/builtin/emailAction.js.map +1 -0
  29. package/dist/actions/builtin/emailTeam.js +20 -38
  30. package/dist/actions/builtin/emailTeam.js.map +1 -1
  31. package/dist/actions/builtin/index.d.ts +16 -1
  32. package/dist/actions/builtin/index.js +21 -7
  33. package/dist/actions/builtin/index.js.map +1 -1
  34. package/dist/actions/builtin/signedWebhook.js +6 -2
  35. package/dist/actions/builtin/signedWebhook.js.map +1 -1
  36. package/dist/actions/defineAction.d.ts +17 -5
  37. package/dist/actions/defineAction.js.map +1 -1
  38. package/dist/actions/dispatch.js +51 -6
  39. package/dist/actions/dispatch.js.map +1 -1
  40. package/dist/actions/dispatchContext.js +13 -0
  41. package/dist/actions/dispatchContext.js.map +1 -0
  42. package/dist/actions/emailRecipients.d.ts +12 -0
  43. package/dist/actions/emailRecipients.js +146 -0
  44. package/dist/actions/emailRecipients.js.map +1 -0
  45. package/dist/actions/fromAddresses.d.ts +37 -0
  46. package/dist/actions/fromAddresses.js +131 -0
  47. package/dist/actions/fromAddresses.js.map +1 -0
  48. package/dist/actions/recipientSources.d.ts +34 -0
  49. package/dist/actions/recipientSources.js +11 -0
  50. package/dist/actions/recipientSources.js.map +1 -0
  51. package/dist/actions/registry.d.ts +2 -1
  52. package/dist/actions/registry.js +5 -7
  53. package/dist/actions/registry.js.map +1 -1
  54. package/dist/actions/runActions.js +10 -1
  55. package/dist/actions/runActions.js.map +1 -1
  56. package/dist/actions/task.js +47 -16
  57. package/dist/actions/task.js.map +1 -1
  58. package/dist/aggregation/aggregateResponses.d.ts +9 -0
  59. package/dist/aggregation/aggregateResponses.js +8 -14
  60. package/dist/aggregation/aggregateResponses.js.map +1 -1
  61. package/dist/aggregation/resolveResultsRequest.d.ts +41 -6
  62. package/dist/aggregation/resolveResultsRequest.js +97 -11
  63. package/dist/aggregation/resolveResultsRequest.js.map +1 -1
  64. package/dist/calc/computeCalcFields.d.ts +5 -3
  65. package/dist/calc/computeCalcFields.js +6 -4
  66. package/dist/calc/computeCalcFields.js.map +1 -1
  67. package/dist/calc/evaluate.d.ts +26 -3
  68. package/dist/calc/evaluate.js +34 -13
  69. package/dist/calc/evaluate.js.map +1 -1
  70. package/dist/calc/formatCalc.d.ts +11 -0
  71. package/dist/calc/formatCalc.js +35 -0
  72. package/dist/calc/formatCalc.js.map +1 -0
  73. package/dist/calc/formatCalcValue.d.ts +17 -0
  74. package/dist/calc/formatCalcValue.js +17 -0
  75. package/dist/calc/formatCalcValue.js.map +1 -0
  76. package/dist/calc/normalizeCalc.d.ts +17 -3
  77. package/dist/calc/normalizeCalc.js +42 -33
  78. package/dist/calc/normalizeCalc.js.map +1 -1
  79. package/dist/calc/registry.d.ts +43 -0
  80. package/dist/calc/registry.js +27 -0
  81. package/dist/calc/registry.js.map +1 -0
  82. package/dist/calc/resolveCalcContext.d.ts +36 -0
  83. package/dist/calc/resolveCalcContext.js +87 -0
  84. package/dist/calc/resolveCalcContext.js.map +1 -0
  85. package/dist/calc/types.d.ts +25 -4
  86. package/dist/calc/types.js +23 -0
  87. package/dist/calc/types.js.map +1 -0
  88. package/dist/client/ByteSizeField.d.ts +29 -0
  89. package/dist/client/ByteSizeField.js +58 -0
  90. package/dist/client/ByteSizeField.js.map +1 -0
  91. package/dist/client/CalcExpressionBuilder.d.ts +20 -0
  92. package/dist/client/CalcExpressionBuilder.js +890 -0
  93. package/dist/client/CalcExpressionBuilder.js.map +1 -0
  94. package/dist/client/ClosePollButton.d.ts +15 -0
  95. package/dist/client/ClosePollButton.js +80 -0
  96. package/dist/client/ClosePollButton.js.map +1 -0
  97. package/dist/client/CondensedArray.d.ts +15 -0
  98. package/dist/client/CondensedArray.js +97 -0
  99. package/dist/client/CondensedArray.js.map +1 -0
  100. package/dist/client/ConditionBuilder.js +2 -1
  101. package/dist/client/ConditionBuilder.js.map +1 -1
  102. package/dist/client/ConsentBlockLabel.d.ts +15 -0
  103. package/dist/client/ConsentBlockLabel.js +71 -0
  104. package/dist/client/ConsentBlockLabel.js.map +1 -0
  105. package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
  106. package/dist/client/ConsentSourceRowLabel.js +21 -0
  107. package/dist/client/ConsentSourceRowLabel.js.map +1 -0
  108. package/dist/client/EndpointOptionsSelect.d.ts +55 -0
  109. package/dist/client/EndpointOptionsSelect.js +112 -0
  110. package/dist/client/EndpointOptionsSelect.js.map +1 -0
  111. package/dist/client/FieldBlockLabel.d.ts +18 -0
  112. package/dist/client/FieldBlockLabel.js +34 -0
  113. package/dist/client/FieldBlockLabel.js.map +1 -0
  114. package/dist/client/FieldNameSelect.d.ts +37 -0
  115. package/dist/client/FieldNameSelect.js +72 -0
  116. package/dist/client/FieldNameSelect.js.map +1 -0
  117. package/dist/client/FlowBuilder.d.ts +2 -2
  118. package/dist/client/FlowBuilder.js +137 -88
  119. package/dist/client/FlowBuilder.js.map +1 -1
  120. package/dist/client/FormConditionField.js +1 -4
  121. package/dist/client/FormConditionField.js.map +1 -1
  122. package/dist/client/RecipientsSelect.d.ts +37 -0
  123. package/dist/client/RecipientsSelect.js +197 -0
  124. package/dist/client/RecipientsSelect.js.map +1 -0
  125. package/dist/client/RuleDescription.d.ts +21 -0
  126. package/dist/client/RuleDescription.js +19 -0
  127. package/dist/client/RuleDescription.js.map +1 -0
  128. package/dist/client/admin.css +557 -0
  129. package/dist/client/endpointOptions.d.ts +11 -0
  130. package/dist/client/endpointOptions.js +38 -0
  131. package/dist/client/endpointOptions.js.map +1 -0
  132. package/dist/client/flowAuthoring.js +142 -0
  133. package/dist/client/flowAuthoring.js.map +1 -0
  134. package/dist/client/synthesizeClientField.js +21 -10
  135. package/dist/client/synthesizeClientField.js.map +1 -1
  136. package/dist/client/toStaticLabel.js +13 -0
  137. package/dist/client/toStaticLabel.js.map +1 -0
  138. package/dist/collections/buttonFields.d.ts +34 -0
  139. package/dist/collections/buttonFields.js +35 -0
  140. package/dist/collections/buttonFields.js.map +1 -0
  141. package/dist/collections/cells/FieldCountCell.d.ts +15 -0
  142. package/dist/collections/cells/FieldCountCell.js +18 -0
  143. package/dist/collections/cells/FieldCountCell.js.map +1 -0
  144. package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
  145. package/dist/collections/cells/FlowStepsCell.js +17 -0
  146. package/dist/collections/cells/FlowStepsCell.js.map +1 -0
  147. package/dist/collections/formSubmissions.js +114 -28
  148. package/dist/collections/formSubmissions.js.map +1 -1
  149. package/dist/collections/forms.js +449 -112
  150. package/dist/collections/forms.js.map +1 -1
  151. package/dist/collections/formsEndpoints.js +106 -0
  152. package/dist/collections/formsEndpoints.js.map +1 -0
  153. package/dist/collections/redirectFields.d.ts +29 -0
  154. package/dist/collections/settingsFields.d.ts +31 -0
  155. package/dist/collections/settingsFields.js +45 -0
  156. package/dist/collections/settingsFields.js.map +1 -0
  157. package/dist/conditions/conditionType.js +9 -2
  158. package/dist/conditions/conditionType.js.map +1 -1
  159. package/dist/conditions/evaluate.js +1 -1
  160. package/dist/conditions/evaluate.js.map +1 -1
  161. package/dist/conditions/fieldTypes.d.ts +3 -1
  162. package/dist/conditions/fieldTypes.js +4 -1
  163. package/dist/conditions/fieldTypes.js.map +1 -1
  164. package/dist/conditions/normalizeConditions.js +20 -6
  165. package/dist/conditions/normalizeConditions.js.map +1 -1
  166. package/dist/consent/applyConsentStatements.d.ts +14 -0
  167. package/dist/consent/applyConsentStatements.js +17 -0
  168. package/dist/consent/applyConsentStatements.js.map +1 -0
  169. package/dist/consent/captureConsent.d.ts +39 -11
  170. package/dist/consent/captureConsent.js +63 -13
  171. package/dist/consent/captureConsent.js.map +1 -1
  172. package/dist/consent/consentSourcesField.d.ts +66 -0
  173. package/dist/consent/consentSourcesField.js +98 -0
  174. package/dist/consent/consentSourcesField.js.map +1 -0
  175. package/dist/consent/effectiveStatement.js +16 -0
  176. package/dist/consent/effectiveStatement.js.map +1 -0
  177. package/dist/consent/resolveConsentEntries.d.ts +24 -0
  178. package/dist/consent/resolveConsentEntries.js +40 -0
  179. package/dist/consent/resolveConsentEntries.js.map +1 -0
  180. package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
  181. package/dist/consent/resolveConsentSourcesRequest.js +54 -0
  182. package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
  183. package/dist/consent/resolveConsentStatements.d.ts +45 -0
  184. package/dist/consent/resolveConsentStatements.js +46 -0
  185. package/dist/consent/resolveConsentStatements.js.map +1 -0
  186. package/dist/consent/resolvePublishedVersionRef.d.ts +17 -11
  187. package/dist/consent/resolvePublishedVersionRef.js +13 -10
  188. package/dist/consent/resolvePublishedVersionRef.js.map +1 -1
  189. package/dist/consent/types.d.ts +69 -0
  190. package/dist/context/formContext.d.ts +30 -0
  191. package/dist/context/formContext.js +54 -0
  192. package/dist/context/formContext.js.map +1 -0
  193. package/dist/email/departments.d.ts +59 -0
  194. package/dist/email/departments.js +87 -0
  195. package/dist/email/departments.js.map +1 -0
  196. package/dist/email/departmentsField.d.ts +53 -0
  197. package/dist/email/departmentsField.js +73 -0
  198. package/dist/email/departmentsField.js.map +1 -0
  199. package/dist/exports/client.d.ts +14 -1
  200. package/dist/exports/client.js +14 -1
  201. package/dist/exports/i18n.d.ts +5 -2
  202. package/dist/exports/i18n.js +5 -2
  203. package/dist/exports/react.d.ts +34 -10
  204. package/dist/exports/react.js +24 -4
  205. package/dist/exports/rsc.d.ts +10 -1
  206. package/dist/exports/rsc.js +10 -1
  207. package/dist/exports/types.d.ts +20 -12
  208. package/dist/fields/buildFieldBlocks.js +46 -25
  209. package/dist/fields/buildFieldBlocks.js.map +1 -1
  210. package/dist/fields/builtin/calculation.d.ts +17 -0
  211. package/dist/fields/builtin/calculation.js +193 -18
  212. package/dist/fields/builtin/calculation.js.map +1 -1
  213. package/dist/fields/builtin/checkbox.js +23 -0
  214. package/dist/fields/builtin/checkbox.js.map +1 -1
  215. package/dist/fields/builtin/consent.js +49 -14
  216. package/dist/fields/builtin/consent.js.map +1 -1
  217. package/dist/fields/builtin/country.d.ts +13 -0
  218. package/dist/fields/builtin/country.js +30 -0
  219. package/dist/fields/builtin/country.js.map +1 -0
  220. package/dist/fields/builtin/date.js +31 -0
  221. package/dist/fields/builtin/date.js.map +1 -0
  222. package/dist/fields/builtin/email.js +8 -1
  223. package/dist/fields/builtin/email.js.map +1 -1
  224. package/dist/fields/builtin/file.d.ts +15 -0
  225. package/dist/fields/builtin/file.js +95 -8
  226. package/dist/fields/builtin/file.js.map +1 -1
  227. package/dist/fields/builtin/index.d.ts +30 -0
  228. package/dist/fields/builtin/index.js +37 -10
  229. package/dist/fields/builtin/index.js.map +1 -1
  230. package/dist/fields/builtin/message.js +30 -0
  231. package/dist/fields/builtin/message.js.map +1 -0
  232. package/dist/fields/builtin/repeater.js +8 -3
  233. package/dist/fields/builtin/repeater.js.map +1 -1
  234. package/dist/fields/builtin/select.js +28 -4
  235. package/dist/fields/builtin/select.js.map +1 -1
  236. package/dist/fields/builtin/state.d.ts +13 -0
  237. package/dist/fields/builtin/state.js +30 -0
  238. package/dist/fields/builtin/state.js.map +1 -0
  239. package/dist/fields/builtin/text.js +7 -0
  240. package/dist/fields/builtin/text.js.map +1 -1
  241. package/dist/fields/data/regions.d.ts +21 -0
  242. package/dist/fields/data/regions.js +1238 -0
  243. package/dist/fields/data/regions.js.map +1 -0
  244. package/dist/fields/fieldKey.d.ts +15 -0
  245. package/dist/fields/fieldKey.js +16 -0
  246. package/dist/fields/fieldKey.js.map +1 -0
  247. package/dist/fields/fieldNamesOfType.js +30 -0
  248. package/dist/fields/fieldNamesOfType.js.map +1 -0
  249. package/dist/fields/instanceOptions.js +20 -0
  250. package/dist/fields/instanceOptions.js.map +1 -0
  251. package/dist/fields/localizedIf.d.ts +13 -0
  252. package/dist/fields/localizedIf.js +12 -0
  253. package/dist/fields/localizedIf.js.map +1 -0
  254. package/dist/fields/registry.d.ts +3 -1
  255. package/dist/fields/registry.js +23 -8
  256. package/dist/fields/registry.js.map +1 -1
  257. package/dist/fields/sharedConfig.js +125 -59
  258. package/dist/fields/sharedConfig.js.map +1 -1
  259. package/dist/fields/types.d.ts +78 -9
  260. package/dist/flow/engine.d.ts +6 -4
  261. package/dist/flow/engine.js +11 -6
  262. package/dist/flow/engine.js.map +1 -1
  263. package/dist/flow/normalizeFlow.js +28 -9
  264. package/dist/flow/normalizeFlow.js.map +1 -1
  265. package/dist/flow/stepLabel.js +15 -0
  266. package/dist/flow/stepLabel.js.map +1 -0
  267. package/dist/flow/types.d.ts +12 -3
  268. package/dist/flow/types.js +11 -0
  269. package/dist/flow/types.js.map +1 -0
  270. package/dist/form/pollState.d.ts +23 -0
  271. package/dist/form/pollState.js +17 -0
  272. package/dist/form/pollState.js.map +1 -0
  273. package/dist/form/toFormDocument.d.ts +110 -0
  274. package/dist/form/toFormDocument.js +89 -0
  275. package/dist/form/toFormDocument.js.map +1 -0
  276. package/dist/form/types.d.ts +73 -0
  277. package/dist/index.d.ts +67 -61
  278. package/dist/index.js +120 -25
  279. package/dist/index.js.map +1 -1
  280. package/dist/options.d.ts +281 -0
  281. package/dist/plugin/applyRegistryConfig.d.ts +11 -0
  282. package/dist/plugin/applyRegistryConfig.js +20 -0
  283. package/dist/plugin/applyRegistryConfig.js.map +1 -0
  284. package/dist/plugin/customState.js +26 -0
  285. package/dist/plugin/customState.js.map +1 -0
  286. package/dist/plugin/registerCollections.js +43 -40
  287. package/dist/plugin/registerCollections.js.map +1 -1
  288. package/dist/plugin/uploadsCollection.d.ts +16 -0
  289. package/dist/plugin/uploadsCollection.js +53 -0
  290. package/dist/plugin/uploadsCollection.js.map +1 -0
  291. package/dist/poll/applyPollOptions.js +18 -0
  292. package/dist/poll/applyPollOptions.js.map +1 -0
  293. package/dist/poll/buildPollOptionSourceFields.js +50 -0
  294. package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
  295. package/dist/poll/closeJob.d.ts +53 -0
  296. package/dist/poll/closeJob.js +121 -0
  297. package/dist/poll/closeJob.js.map +1 -0
  298. package/dist/poll/definePollOptionSource.d.ts +44 -0
  299. package/dist/poll/definePollOptionSource.js +6 -0
  300. package/dist/poll/definePollOptionSource.js.map +1 -0
  301. package/dist/poll/definePollType.d.ts +34 -0
  302. package/dist/poll/definePollType.js +6 -0
  303. package/dist/poll/definePollType.js.map +1 -0
  304. package/dist/poll/effectivePollOptions.d.ts +38 -0
  305. package/dist/poll/effectivePollOptions.js +64 -0
  306. package/dist/poll/effectivePollOptions.js.map +1 -0
  307. package/dist/poll/mostVoted.d.ts +21 -0
  308. package/dist/poll/mostVoted.js +32 -0
  309. package/dist/poll/mostVoted.js.map +1 -0
  310. package/dist/poll/outcomeBeforeChange.js +91 -0
  311. package/dist/poll/outcomeBeforeChange.js.map +1 -0
  312. package/dist/poll/outcomeFields.d.ts +38 -0
  313. package/dist/poll/outcomeFields.js +52 -0
  314. package/dist/poll/outcomeFields.js.map +1 -0
  315. package/dist/poll/pollTypeRegistry.d.ts +34 -0
  316. package/dist/poll/pollTypeRegistry.js +69 -0
  317. package/dist/poll/pollTypeRegistry.js.map +1 -0
  318. package/dist/poll/registry.d.ts +17 -0
  319. package/dist/poll/registry.js +12 -0
  320. package/dist/poll/registry.js.map +1 -0
  321. package/dist/poll/resolvePollCloseRequest.js +106 -0
  322. package/dist/poll/resolvePollCloseRequest.js.map +1 -0
  323. package/dist/poll/resolvePollOptions.d.ts +29 -0
  324. package/dist/poll/resolvePollOptions.js +52 -0
  325. package/dist/poll/resolvePollOptions.js.map +1 -0
  326. package/dist/poll/resolvePollOptionsRequest.js +50 -0
  327. package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
  328. package/dist/poll/resolvePollOutcome.d.ts +40 -0
  329. package/dist/poll/resolvePollOutcome.js +90 -0
  330. package/dist/poll/resolvePollOutcome.js.map +1 -0
  331. package/dist/poll/resultsField.js +21 -0
  332. package/dist/poll/resultsField.js.map +1 -0
  333. package/dist/poll/votes/aggregateFromVotes.d.ts +27 -0
  334. package/dist/poll/votes/aggregateFromVotes.js +54 -0
  335. package/dist/poll/votes/aggregateFromVotes.js.map +1 -0
  336. package/dist/poll/votes/answerValues.js +16 -0
  337. package/dist/poll/votes/answerValues.js.map +1 -0
  338. package/dist/poll/votes/bumpPollVote.js +88 -0
  339. package/dist/poll/votes/bumpPollVote.js.map +1 -0
  340. package/dist/poll/votes/recountPollVotes.d.ts +20 -0
  341. package/dist/poll/votes/recountPollVotes.js +63 -0
  342. package/dist/poll/votes/recountPollVotes.js.map +1 -0
  343. package/dist/poll/votes/voteTallyHook.js +76 -0
  344. package/dist/poll/votes/voteTallyHook.js.map +1 -0
  345. package/dist/poll/votes/votesCollection.d.ts +19 -0
  346. package/dist/poll/votes/votesCollection.js +89 -0
  347. package/dist/poll/votes/votesCollection.js.map +1 -0
  348. package/dist/prefill/valuesFromSearchParams.js +5 -9
  349. package/dist/prefill/valuesFromSearchParams.js.map +1 -1
  350. package/dist/presentations/types.d.ts +3 -2
  351. package/dist/react/Form.d.ts +77 -35
  352. package/dist/react/Form.js +368 -222
  353. package/dist/react/Form.js.map +1 -1
  354. package/dist/react/FormContext.d.ts +51 -1
  355. package/dist/react/FormContext.js.map +1 -1
  356. package/dist/react/FormControls.d.ts +55 -0
  357. package/dist/react/FormControls.js +56 -0
  358. package/dist/react/FormControls.js.map +1 -0
  359. package/dist/react/FormFields.d.ts +18 -0
  360. package/dist/react/FormFields.js +114 -0
  361. package/dist/react/FormFields.js.map +1 -0
  362. package/dist/react/FormLayout.d.ts +4 -2
  363. package/dist/react/FormLayout.js +3 -2
  364. package/dist/react/FormLayout.js.map +1 -1
  365. package/dist/react/FormResults.d.ts +8 -3
  366. package/dist/react/FormResults.js +50 -29
  367. package/dist/react/FormResults.js.map +1 -1
  368. package/dist/react/FormSteps.d.ts +17 -0
  369. package/dist/react/FormSteps.js +35 -0
  370. package/dist/react/FormSteps.js.map +1 -0
  371. package/dist/react/Poll.d.ts +40 -6
  372. package/dist/react/Poll.js +137 -33
  373. package/dist/react/Poll.js.map +1 -1
  374. package/dist/react/adapters.d.ts +35 -0
  375. package/dist/react/adapters.js +11 -0
  376. package/dist/react/adapters.js.map +1 -0
  377. package/dist/react/captcha/HcaptchaCaptcha.d.ts +31 -0
  378. package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
  379. package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
  380. package/dist/react/captcha/RecaptchaCaptcha.d.ts +44 -0
  381. package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
  382. package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
  383. package/dist/react/captcha/TurnstileCaptcha.d.ts +31 -0
  384. package/dist/react/captcha/TurnstileCaptcha.js +53 -0
  385. package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
  386. package/dist/react/captcha/types.d.ts +8 -0
  387. package/dist/react/captcha/useCaptchaScript.js +63 -0
  388. package/dist/react/captcha/useCaptchaScript.js.map +1 -0
  389. package/dist/react/captcha/vendors.js +8 -0
  390. package/dist/react/captcha/vendors.js.map +1 -0
  391. package/dist/react/contract.d.ts +2 -3
  392. package/dist/react/contract.js.map +1 -1
  393. package/dist/react/fetchResults.d.ts +1 -1
  394. package/dist/react/fetchResults.js +1 -1
  395. package/dist/react/fetchResults.js.map +1 -1
  396. package/dist/react/presentation/DialogSurface.js +1 -4
  397. package/dist/react/presentation/DialogSurface.js.map +1 -1
  398. package/dist/react/primitives/Checkbox.d.ts +6 -2
  399. package/dist/react/primitives/Checkbox.js +4 -2
  400. package/dist/react/primitives/Checkbox.js.map +1 -1
  401. package/dist/react/primitives/ChoiceGroup.d.ts +40 -0
  402. package/dist/react/primitives/ChoiceGroup.js +33 -0
  403. package/dist/react/primitives/ChoiceGroup.js.map +1 -0
  404. package/dist/react/primitives/FieldShell.d.ts +13 -5
  405. package/dist/react/primitives/FieldShell.js +35 -32
  406. package/dist/react/primitives/FieldShell.js.map +1 -1
  407. package/dist/react/primitives/Input.d.ts +4 -2
  408. package/dist/react/primitives/Input.js +2 -1
  409. package/dist/react/primitives/Input.js.map +1 -1
  410. package/dist/react/renderers/calculation.js +7 -5
  411. package/dist/react/renderers/calculation.js.map +1 -1
  412. package/dist/react/renderers/checkbox.js +3 -5
  413. package/dist/react/renderers/checkbox.js.map +1 -1
  414. package/dist/react/renderers/consent.js +84 -36
  415. package/dist/react/renderers/consent.js.map +1 -1
  416. package/dist/react/renderers/date.js +33 -0
  417. package/dist/react/renderers/date.js.map +1 -0
  418. package/dist/react/renderers/email.js +4 -5
  419. package/dist/react/renderers/email.js.map +1 -1
  420. package/dist/react/renderers/file.js +29 -14
  421. package/dist/react/renderers/file.js.map +1 -1
  422. package/dist/react/renderers/index.js +7 -0
  423. package/dist/react/renderers/index.js.map +1 -1
  424. package/dist/react/renderers/message.js +41 -0
  425. package/dist/react/renderers/message.js.map +1 -0
  426. package/dist/react/renderers/number.js +1 -4
  427. package/dist/react/renderers/number.js.map +1 -1
  428. package/dist/react/renderers/region.js +43 -0
  429. package/dist/react/renderers/region.js.map +1 -0
  430. package/dist/react/renderers/repeater.js +32 -14
  431. package/dist/react/renderers/repeater.js.map +1 -1
  432. package/dist/react/renderers/select.js +21 -6
  433. package/dist/react/renderers/select.js.map +1 -1
  434. package/dist/react/renderers/text.js +4 -5
  435. package/dist/react/renderers/text.js.map +1 -1
  436. package/dist/react/renderers/textarea.js +1 -4
  437. package/dist/react/renderers/textarea.js.map +1 -1
  438. package/dist/react/state.d.ts +46 -3
  439. package/dist/react/state.js +73 -10
  440. package/dist/react/state.js.map +1 -1
  441. package/dist/react/submitForm.js +1 -1
  442. package/dist/react/submitForm.js.map +1 -1
  443. package/dist/react/uploadFile.d.ts +2 -2
  444. package/dist/react/uploadFile.js +1 -1
  445. package/dist/react/uploadFile.js.map +1 -1
  446. package/dist/react/useCalcValues.d.ts +10 -0
  447. package/dist/react/useCalcValues.js +13 -0
  448. package/dist/react/useCalcValues.js.map +1 -0
  449. package/dist/react/useField.d.ts +0 -1
  450. package/dist/react/useField.js +7 -6
  451. package/dist/react/useField.js.map +1 -1
  452. package/dist/react/useFormState.d.ts +1 -1
  453. package/dist/react/useFormState.js +1 -1
  454. package/dist/react/useFormState.js.map +1 -1
  455. package/dist/react/validateField.js +3 -6
  456. package/dist/react/validateField.js.map +1 -1
  457. package/dist/recall/interpolate.d.ts +4 -3
  458. package/dist/recall/interpolate.js +5 -4
  459. package/dist/recall/interpolate.js.map +1 -1
  460. package/dist/recall/resolver.d.ts +1 -1
  461. package/dist/recall/resolver.js +15 -3
  462. package/dist/recall/resolver.js.map +1 -1
  463. package/dist/spam/captcha.d.ts +4 -3
  464. package/dist/spam/captcha.js +4 -3
  465. package/dist/spam/captcha.js.map +1 -1
  466. package/dist/spam/clientIp.js +9 -0
  467. package/dist/spam/clientIp.js.map +1 -0
  468. package/dist/spam/constants.js +13 -1
  469. package/dist/spam/constants.js.map +1 -1
  470. package/dist/spam/identify.js +3 -6
  471. package/dist/spam/identify.js.map +1 -1
  472. package/dist/spam/providers/hcaptcha.d.ts +17 -0
  473. package/dist/spam/providers/hcaptcha.js +18 -0
  474. package/dist/spam/providers/hcaptcha.js.map +1 -0
  475. package/dist/spam/providers/recaptcha.d.ts +23 -0
  476. package/dist/spam/providers/recaptcha.js +23 -0
  477. package/dist/spam/providers/recaptcha.js.map +1 -0
  478. package/dist/spam/providers/siteverify.js +34 -0
  479. package/dist/spam/providers/siteverify.js.map +1 -0
  480. package/dist/spam/providers/turnstile.d.ts +17 -0
  481. package/dist/spam/providers/turnstile.js +18 -0
  482. package/dist/spam/providers/turnstile.js.map +1 -0
  483. package/dist/spam/resolveSpam.js +2 -1
  484. package/dist/spam/resolveSpam.js.map +1 -1
  485. package/dist/spam/spamGuard.js +25 -11
  486. package/dist/spam/spamGuard.js.map +1 -1
  487. package/dist/spam/types.d.ts +19 -4
  488. package/dist/submissions/SubmissionAnswers.js +6 -2
  489. package/dist/submissions/SubmissionAnswers.js.map +1 -1
  490. package/dist/submissions/SubmissionAnswersClient.js +100 -64
  491. package/dist/submissions/SubmissionAnswersClient.js.map +1 -1
  492. package/dist/submissions/coerceBoolean.js +14 -0
  493. package/dist/submissions/coerceBoolean.js.map +1 -0
  494. package/dist/submissions/createSubmission.d.ts +36 -0
  495. package/dist/submissions/createSubmission.js +26 -0
  496. package/dist/submissions/createSubmission.js.map +1 -0
  497. package/dist/submissions/formIdOf.js +13 -0
  498. package/dist/submissions/formIdOf.js.map +1 -0
  499. package/dist/submissions/resolveVotedSubmission.d.ts +27 -0
  500. package/dist/submissions/resolveVotedSubmission.js +51 -0
  501. package/dist/submissions/resolveVotedSubmission.js.map +1 -0
  502. package/dist/submissions/runSubmission.d.ts +10 -0
  503. package/dist/submissions/runSubmission.js +104 -54
  504. package/dist/submissions/runSubmission.js.map +1 -1
  505. package/dist/submissions/types.d.ts +11 -4
  506. package/dist/submissions/validateSubmission.js +99 -13
  507. package/dist/submissions/validateSubmission.js.map +1 -1
  508. package/dist/submissions/verifyContext.js +35 -0
  509. package/dist/submissions/verifyContext.js.map +1 -0
  510. package/dist/submissions/voteChangeEndpoint.js +105 -0
  511. package/dist/submissions/voteChangeEndpoint.js.map +1 -0
  512. package/dist/submissions/votedCookie.d.ts +15 -0
  513. package/dist/submissions/votedCookie.js +74 -0
  514. package/dist/submissions/votedCookie.js.map +1 -0
  515. package/dist/translations/clientRuntimeKeys.d.ts +17 -0
  516. package/dist/translations/clientRuntimeKeys.js +48 -0
  517. package/dist/translations/clientRuntimeKeys.js.map +1 -0
  518. package/dist/translations/de.d.ts +12 -0
  519. package/dist/translations/de.js +380 -0
  520. package/dist/translations/de.js.map +1 -0
  521. package/dist/translations/en.js +250 -28
  522. package/dist/translations/en.js.map +1 -1
  523. package/dist/translations/index.d.ts +14 -5
  524. package/dist/translations/index.js +14 -3
  525. package/dist/translations/index.js.map +1 -1
  526. package/dist/translations/keys.d.ts +245 -23
  527. package/dist/translations/keys.js +246 -24
  528. package/dist/translations/keys.js.map +1 -1
  529. package/dist/translations/makeTranslate.d.ts +7 -3
  530. package/dist/translations/makeTranslate.js +12 -3
  531. package/dist/translations/makeTranslate.js.map +1 -1
  532. package/dist/translations/server.js +8 -1
  533. package/dist/translations/server.js.map +1 -1
  534. package/dist/uploads/captureFileRef.d.ts +10 -3
  535. package/dist/uploads/captureFileRef.js +18 -9
  536. package/dist/uploads/captureFileRef.js.map +1 -1
  537. package/dist/uploads/formatBytes.d.ts +9 -0
  538. package/dist/uploads/formatBytes.js +25 -0
  539. package/dist/uploads/formatBytes.js.map +1 -0
  540. package/dist/uploads/resolveFileRef.js +3 -2
  541. package/dist/uploads/resolveFileRef.js.map +1 -1
  542. package/dist/uploads/types.d.ts +1 -2
  543. package/dist/validation/buildRuleBlocks.js +18 -17
  544. package/dist/validation/buildRuleBlocks.js.map +1 -1
  545. package/dist/validation/builtin/email.js +2 -1
  546. package/dist/validation/builtin/email.js.map +1 -1
  547. package/dist/validation/builtin/index.d.ts +14 -0
  548. package/dist/validation/builtin/index.js +14 -1
  549. package/dist/validation/builtin/index.js.map +1 -1
  550. package/dist/validation/builtin/integer.js +15 -0
  551. package/dist/validation/builtin/integer.js.map +1 -0
  552. package/dist/validation/builtin/matchesField.js +3 -7
  553. package/dist/validation/builtin/matchesField.js.map +1 -1
  554. package/dist/validation/builtin/max.js +1 -0
  555. package/dist/validation/builtin/max.js.map +1 -1
  556. package/dist/validation/builtin/maxDate.js +24 -0
  557. package/dist/validation/builtin/maxDate.js.map +1 -0
  558. package/dist/validation/builtin/maxLength.js +1 -0
  559. package/dist/validation/builtin/maxLength.js.map +1 -1
  560. package/dist/validation/builtin/min.js +1 -0
  561. package/dist/validation/builtin/min.js.map +1 -1
  562. package/dist/validation/builtin/minDate.js +24 -0
  563. package/dist/validation/builtin/minDate.js.map +1 -0
  564. package/dist/validation/builtin/minLength.js +1 -0
  565. package/dist/validation/builtin/minLength.js.map +1 -1
  566. package/dist/validation/builtin/notAlreadySubmitted.js +5 -1
  567. package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
  568. package/dist/validation/builtin/oneOf.js +1 -0
  569. package/dist/validation/builtin/oneOf.js.map +1 -1
  570. package/dist/validation/builtin/pattern.js +11 -2
  571. package/dist/validation/builtin/pattern.js.map +1 -1
  572. package/dist/validation/builtin/url.js +1 -0
  573. package/dist/validation/builtin/url.js.map +1 -1
  574. package/dist/validation/builtin/validateDateBound.js +18 -0
  575. package/dist/validation/builtin/validateDateBound.js.map +1 -0
  576. package/dist/validation/builtin/validateRegexParams.js +44 -0
  577. package/dist/validation/builtin/validateRegexParams.js.map +1 -0
  578. package/dist/validation/emailPattern.js +10 -0
  579. package/dist/validation/emailPattern.js.map +1 -0
  580. package/dist/validation/fieldTargetParam.d.ts +22 -0
  581. package/dist/validation/fieldTargetParam.js +38 -0
  582. package/dist/validation/fieldTargetParam.js.map +1 -0
  583. package/dist/validation/registry.d.ts +2 -1
  584. package/dist/validation/registry.js +2 -9
  585. package/dist/validation/registry.js.map +1 -1
  586. package/dist/validation/runValidation.js +8 -29
  587. package/dist/validation/runValidation.js.map +1 -1
  588. package/dist/validation/types.d.ts +5 -11
  589. package/dist/validation/validateUrl.js +22 -0
  590. package/dist/validation/validateUrl.js.map +1 -0
  591. package/package.json +14 -6
  592. package/styles/form-builder.css +94 -190
  593. package/dist/collections/uploads.d.ts +0 -30
  594. package/dist/collections/uploads.js +0 -55
  595. package/dist/collections/uploads.js.map +0 -1
  596. package/dist/consent/buildConsentSourceConfig.js +0 -49
  597. package/dist/consent/buildConsentSourceConfig.js.map +0 -1
  598. package/dist/consent/builtin/index.d.ts +0 -7
  599. package/dist/consent/builtin/index.js +0 -11
  600. package/dist/consent/builtin/index.js.map +0 -1
  601. package/dist/consent/builtin/pageReference.js +0 -75
  602. package/dist/consent/builtin/pageReference.js.map +0 -1
  603. package/dist/consent/builtin/static.js +0 -44
  604. package/dist/consent/builtin/static.js.map +0 -1
  605. package/dist/consent/defineConsentSource.d.ts +0 -35
  606. package/dist/consent/defineConsentSource.js +0 -6
  607. package/dist/consent/defineConsentSource.js.map +0 -1
  608. package/dist/consent/registry.d.ts +0 -16
  609. package/dist/consent/registry.js +0 -16
  610. package/dist/consent/registry.js.map +0 -1
  611. package/dist/consent/resolveConsentLinks.d.ts +0 -19
  612. package/dist/consent/resolveConsentLinks.js +0 -26
  613. package/dist/consent/resolveConsentLinks.js.map +0 -1
  614. package/dist/presentations/registry.d.ts +0 -15
  615. package/dist/presentations/registry.js +0 -15
  616. package/dist/presentations/registry.js.map +0 -1
  617. package/dist/react/toFormDocument.d.ts +0 -24
  618. package/dist/react/toFormDocument.js +0 -22
  619. package/dist/react/toFormDocument.js.map +0 -1
@@ -0,0 +1,890 @@
1
+ "use client";
2
+ import { keys } from "../translations/keys.js";
3
+ import { CALC_FNS, CALC_OPS, isCalcFn } from "../calc/types.js";
4
+ import { normalizeCalc } from "../calc/normalizeCalc.js";
5
+ import { formatCalc } from "../calc/formatCalc.js";
6
+ import { useTranslation as useTranslation$1 } from "../translations/useTranslation.js";
7
+ import { toStaticLabel } from "./toStaticLabel.js";
8
+ import { reduceFieldsToValues } from "payload/shared";
9
+ import { Button, FieldError, FieldLabel, ReactSelect, RenderCustomComponent, useField, useFormFields } from "@payloadcms/ui";
10
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
+ import { useMemo, useState } from "react";
12
+ import "./admin.css";
13
+ //#region src/client/CalcExpressionBuilder.tsx
14
+ /** The single-argument functions offered by the "Then apply" finisher; min/max are variadic and stay Function operands. */
15
+ const UNARY_FNS = CALC_FNS.filter((fn) => fn !== "min" && fn !== "max");
16
+ const seedOperand = (kind) => {
17
+ switch (kind) {
18
+ case "ref": return {
19
+ kind: "ref",
20
+ field: ""
21
+ };
22
+ case "lit": return {
23
+ kind: "lit",
24
+ value: 0
25
+ };
26
+ case "weight": return {
27
+ kind: "weight",
28
+ field: "",
29
+ weights: {}
30
+ };
31
+ }
32
+ };
33
+ const seedAst = (kind) => {
34
+ switch (kind) {
35
+ case "ref": return {
36
+ type: "ref",
37
+ field: ""
38
+ };
39
+ case "lit": return {
40
+ type: "lit",
41
+ value: 0
42
+ };
43
+ case "weight": return {
44
+ type: "weight",
45
+ field: "",
46
+ weights: {}
47
+ };
48
+ case "fn": return {
49
+ type: "fn",
50
+ fn: "min",
51
+ args: [{
52
+ type: "lit",
53
+ value: 0
54
+ }]
55
+ };
56
+ }
57
+ };
58
+ const astToOperand = (node) => {
59
+ switch (node.type) {
60
+ case "ref": return {
61
+ kind: "ref",
62
+ field: node.field
63
+ };
64
+ case "lit": return {
65
+ kind: "lit",
66
+ value: node.value
67
+ };
68
+ case "source": return {
69
+ kind: "source",
70
+ source: node.source
71
+ };
72
+ case "weight": return {
73
+ kind: "weight",
74
+ field: node.field,
75
+ ...node.weights !== void 0 ? { weights: node.weights } : {},
76
+ ...node.source !== void 0 ? { source: node.source } : {}
77
+ };
78
+ case "neg": return {
79
+ kind: "neg",
80
+ operand: astToOperand(node.operand)
81
+ };
82
+ case "fn": return {
83
+ kind: "fn",
84
+ fn: node.fn,
85
+ args: node.args.map((arg) => toChain(arg, false))
86
+ };
87
+ case "op": return {
88
+ kind: "group",
89
+ chain: toChain(node, false)
90
+ };
91
+ }
92
+ };
93
+ const toChain = (expr, allowFinish) => {
94
+ const arg = expr.type === "fn" ? expr.args[0] : void 0;
95
+ if (allowFinish && expr.type === "fn" && expr.args.length === 1 && arg !== void 0 && isCalcFn(expr.fn) && UNARY_FNS.includes(expr.fn)) return {
96
+ ...toChain(arg, false),
97
+ finish: expr.fn
98
+ };
99
+ const steps = [];
100
+ let node = expr;
101
+ while (node.type === "op") {
102
+ steps.unshift({
103
+ op: node.op,
104
+ operand: astToOperand(node.right)
105
+ });
106
+ node = node.left;
107
+ }
108
+ return {
109
+ first: astToOperand(node),
110
+ steps
111
+ };
112
+ };
113
+ /**
114
+ * AST -> chain: the left spine of binary ops flattens into first + steps (a nested op on the right
115
+ * becomes a `group`); a root unary fn wrapping the whole expression loads as `finish` (min/max stay
116
+ * fn operands so the finisher select never holds a value it cannot offer). Total: every valid
117
+ * `CalcExpression` loads without loss, and `chainToAst(astToChain(x))` is structurally `x`.
118
+ */
119
+ const astToChain = (expr) => toChain(expr, true);
120
+ const operandToAst = (operand) => {
121
+ switch (operand.kind) {
122
+ case "ref": return {
123
+ type: "ref",
124
+ field: operand.field
125
+ };
126
+ case "lit": return {
127
+ type: "lit",
128
+ value: operand.value
129
+ };
130
+ case "weight": return {
131
+ type: "weight",
132
+ field: operand.field,
133
+ ...operand.weights !== void 0 ? { weights: operand.weights } : {},
134
+ ...operand.source !== void 0 ? { source: operand.source } : {}
135
+ };
136
+ case "source": return {
137
+ type: "source",
138
+ source: operand.source
139
+ };
140
+ case "neg": return {
141
+ type: "neg",
142
+ operand: operandToAst(operand.operand)
143
+ };
144
+ case "fn": return {
145
+ type: "fn",
146
+ fn: operand.fn,
147
+ args: operand.args.map(chainBodyToAst)
148
+ };
149
+ case "group": return chainBodyToAst(operand.chain);
150
+ }
151
+ };
152
+ /** Folds first + steps only. `finish` is root-only by design: nested chains (groups, fn args) never carry one, so it is deliberately ignored here. */
153
+ const chainBodyToAst = (chain) => chain.steps.reduce((left, step) => ({
154
+ type: "op",
155
+ op: step.op,
156
+ left,
157
+ right: operandToAst(step.operand)
158
+ }), operandToAst(chain.first));
159
+ /** Chain -> AST: left-fold first + steps into the binary tree (left-assoc matches `-`/`/`/`%`), then wrap in `finish` when set. */
160
+ const chainToAst = (chain) => {
161
+ const body = chainBodyToAst(chain);
162
+ return chain.finish ? {
163
+ type: "fn",
164
+ fn: chain.finish,
165
+ args: [body]
166
+ } : body;
167
+ };
168
+ const optionRows = (options) => {
169
+ if (!Array.isArray(options)) return [];
170
+ return options.flatMap((option) => {
171
+ if (typeof option === "string") return option.length > 0 ? [{
172
+ label: option,
173
+ value: option
174
+ }] : [];
175
+ if (!option || typeof option !== "object") return [];
176
+ const { label, value } = option;
177
+ if (typeof value !== "string" || value.length === 0) return [];
178
+ return [{
179
+ label: typeof label === "string" && label.length > 0 ? label : value,
180
+ value
181
+ }];
182
+ });
183
+ };
184
+ const siblingsFromData = (data, selfIndex) => {
185
+ const rows = Array.isArray(data.fields) ? data.fields : [];
186
+ const siblings = {
187
+ numeric: [],
188
+ choices: [],
189
+ labels: {}
190
+ };
191
+ rows.forEach((row, index) => {
192
+ if (!row || typeof row !== "object") return;
193
+ const { blockType, name, label, options } = row;
194
+ const trimmed = typeof name === "string" ? name.trim() : "";
195
+ if (trimmed.length === 0) return;
196
+ const display = typeof label === "string" && label.length > 0 ? label : trimmed;
197
+ siblings.labels[trimmed] = display;
198
+ if (blockType === "number" || blockType === "calculation" && index < selfIndex) siblings.numeric.push({
199
+ label: display,
200
+ value: trimmed
201
+ });
202
+ if (blockType === "select") siblings.choices.push({
203
+ name: trimmed,
204
+ label: display,
205
+ options: optionRows(options)
206
+ });
207
+ });
208
+ return siblings;
209
+ };
210
+ const singleOption = (selected) => {
211
+ return (Array.isArray(selected) ? selected[0] : selected) ?? void 0;
212
+ };
213
+ /** Keeps a stored reference selectable even when it no longer matches any option, like FieldNameSelect. */
214
+ const withStored = (options, stored) => stored.length > 0 && !options.some((option) => option.value === stored) ? [...options, {
215
+ label: stored,
216
+ value: stored
217
+ }] : options;
218
+ /**
219
+ * Number input with a local draft: keystrokes commit only when the text parses to a finite number,
220
+ * an invalid draft reverts to the committed value on blur, and an external value change resyncs
221
+ * the draft.
222
+ */
223
+ const NumberInput = ({ value, onCommit, className, id, disabled, "aria-label": ariaLabel }) => {
224
+ const [draft, setDraft] = useState(value === void 0 ? "" : String(value));
225
+ const [lastValue, setLastValue] = useState(value);
226
+ if (value !== lastValue) {
227
+ setLastValue(value);
228
+ if (draft.trim() === "" || Number(draft) !== value) setDraft(value === void 0 ? "" : String(value));
229
+ }
230
+ return /* @__PURE__ */ jsx("input", {
231
+ type: "number",
232
+ className,
233
+ id,
234
+ disabled,
235
+ "aria-label": ariaLabel,
236
+ value: draft,
237
+ onChange: (event) => {
238
+ const text = event.target.value;
239
+ setDraft(text);
240
+ const parsed = Number(text);
241
+ if (text.trim() !== "" && Number.isFinite(parsed)) onCommit(parsed);
242
+ },
243
+ onBlur: () => {
244
+ const parsed = Number(draft);
245
+ if (draft.trim() === "" || !Number.isFinite(parsed)) setDraft(value === void 0 ? "" : String(value));
246
+ }
247
+ });
248
+ };
249
+ const OP_OPTIONS = CALC_OPS.map((op) => ({
250
+ label: op,
251
+ value: op
252
+ }));
253
+ const FN_OPTIONS = CALC_FNS.map((fn) => ({
254
+ label: fn,
255
+ value: fn
256
+ }));
257
+ const UNARY_OPTIONS = UNARY_FNS.map((fn) => ({
258
+ label: fn,
259
+ value: fn
260
+ }));
261
+ /** Source entries share kind/start selects with the fixed kinds, namespaced to avoid key collisions. */
262
+ const SOURCE_PREFIX = "source:";
263
+ const sourceOptionValue = (key) => `${SOURCE_PREFIX}${key}`;
264
+ const sourceKeyOf = (value) => value.startsWith(SOURCE_PREFIX) ? value.slice(7) : void 0;
265
+ /** A source label is a plain string or a per-locale record; resolve it for the admin UI language. */
266
+ const resolveSourceLabel = (label, language) => typeof label === "string" ? label : label[language] ?? label.en ?? Object.values(label)[0] ?? "";
267
+ /** Fixed kinds stay flat; sources join as a labeled group when any exist (react-select mixes both). */
268
+ const withSourceGroup = (base, sourceOptions, groupLabel) => sourceOptions.length > 0 ? [...base, {
269
+ label: groupLabel,
270
+ options: sourceOptions
271
+ }] : base;
272
+ const OperandCard = ({ operand, onChange, ctx, idPrefix }) => {
273
+ const { t, siblings, readOnly } = ctx;
274
+ if (operand.kind === "group") return /* @__PURE__ */ jsxs("div", {
275
+ className: "fb-calc-operand fb-calc-operand--group",
276
+ children: [/* @__PURE__ */ jsx("div", {
277
+ className: "fb-calc-operand__title",
278
+ children: t(keys.calcBuilderGroup)
279
+ }), /* @__PURE__ */ jsx(ChainEditor, {
280
+ chain: operand.chain,
281
+ onChange: (chain) => onChange({
282
+ ...operand,
283
+ chain
284
+ }),
285
+ ctx,
286
+ idPrefix: `${idPrefix}-g`
287
+ })]
288
+ });
289
+ if (operand.kind === "fn") {
290
+ const fnOptions = withStored([...FN_OPTIONS, ...ctx.customFnOptions], operand.fn);
291
+ return /* @__PURE__ */ jsxs("div", {
292
+ className: "fb-calc-operand fb-calc-operand--fn",
293
+ children: [/* @__PURE__ */ jsxs("div", {
294
+ className: "fb-calc-operand__header",
295
+ children: [/* @__PURE__ */ jsx("label", {
296
+ className: "fb-visually-hidden",
297
+ htmlFor: `${idPrefix}-fn`,
298
+ children: t(keys.calcBuilderFunction)
299
+ }), /* @__PURE__ */ jsx(ReactSelect, {
300
+ className: "fb-calc-operand__fn",
301
+ inputId: `${idPrefix}-fn`,
302
+ options: fnOptions,
303
+ value: fnOptions.find((option) => option.value === operand.fn),
304
+ isClearable: false,
305
+ disabled: readOnly,
306
+ onChange: (selected) => {
307
+ const chosen = singleOption(selected);
308
+ if (chosen) onChange({
309
+ ...operand,
310
+ fn: String(chosen.value)
311
+ });
312
+ }
313
+ })]
314
+ }), /* @__PURE__ */ jsxs("div", {
315
+ className: "fb-calc-fn__args",
316
+ children: [operand.args.map((arg, index) => /* @__PURE__ */ jsxs("div", {
317
+ className: "fb-calc-fn__arg",
318
+ children: [/* @__PURE__ */ jsx("div", {
319
+ className: "fb-calc-fn__arg-chain",
320
+ children: /* @__PURE__ */ jsx(ChainEditor, {
321
+ chain: arg,
322
+ onChange: (next) => onChange({
323
+ ...operand,
324
+ args: operand.args.map((a, i) => i === index ? next : a)
325
+ }),
326
+ ctx,
327
+ idPrefix: `${idPrefix}-a${index}`
328
+ })
329
+ }), operand.args.length > 1 ? /* @__PURE__ */ jsx("div", {
330
+ className: "fb-calc-fn__arg-remove",
331
+ children: /* @__PURE__ */ jsx(Button, {
332
+ buttonStyle: "icon-label",
333
+ icon: "x",
334
+ "aria-label": t(keys.calcBuilderRemove),
335
+ margin: false,
336
+ disabled: readOnly,
337
+ onClick: () => onChange({
338
+ ...operand,
339
+ args: operand.args.filter((_, i) => i !== index)
340
+ })
341
+ })
342
+ }) : null]
343
+ }, index)), /* @__PURE__ */ jsx("div", {
344
+ className: "fb-calc-fn__add",
345
+ children: /* @__PURE__ */ jsx(Button, {
346
+ buttonStyle: "icon-label",
347
+ icon: "plus",
348
+ iconStyle: "with-border",
349
+ iconPosition: "left",
350
+ margin: false,
351
+ disabled: readOnly,
352
+ onClick: () => onChange({
353
+ ...operand,
354
+ args: [...operand.args, {
355
+ first: {
356
+ kind: "lit",
357
+ value: 0
358
+ },
359
+ steps: []
360
+ }]
361
+ }),
362
+ children: t(keys.calcBuilderAddArgument)
363
+ })
364
+ })]
365
+ })]
366
+ });
367
+ }
368
+ if (operand.kind === "neg") return /* @__PURE__ */ jsxs("div", {
369
+ className: "fb-calc-operand fb-calc-operand--neg",
370
+ children: [/* @__PURE__ */ jsx("div", {
371
+ className: "fb-calc-operand__title",
372
+ children: t(keys.calcBuilderNegate)
373
+ }), /* @__PURE__ */ jsx(OperandCard, {
374
+ operand: operand.operand,
375
+ onChange: (next) => onChange({
376
+ kind: "neg",
377
+ operand: next
378
+ }),
379
+ ctx,
380
+ idPrefix: `${idPrefix}-n`
381
+ })]
382
+ });
383
+ const leafKindOptions = [
384
+ {
385
+ label: t(keys.calcBuilderAnswer),
386
+ value: "ref"
387
+ },
388
+ {
389
+ label: t(keys.calcBuilderNumber),
390
+ value: "lit"
391
+ },
392
+ {
393
+ label: t(keys.calcBuilderWeights),
394
+ value: "weight"
395
+ }
396
+ ];
397
+ const kindValue = operand.kind === "source" ? sourceOptionValue(operand.source) : operand.kind;
398
+ const kindSourceOptions = operand.kind === "source" && !ctx.scalarSourceOptions.some((option) => option.value === sourceOptionValue(operand.source)) ? [...ctx.scalarSourceOptions, {
399
+ label: operand.source,
400
+ value: kindValue
401
+ }] : ctx.scalarSourceOptions;
402
+ const kindFlat = [...leafKindOptions, ...kindSourceOptions];
403
+ const refOptions = operand.kind === "ref" ? withStored(siblings.numeric, operand.field) : [];
404
+ const choiceOptions = operand.kind === "weight" ? withStored(siblings.choices.map((c) => ({
405
+ label: c.label,
406
+ value: c.name
407
+ })), operand.field) : [];
408
+ const choice = operand.kind === "weight" ? siblings.choices.find((c) => c.name === operand.field) : void 0;
409
+ const weightSource = operand.kind === "weight" ? operand.source : void 0;
410
+ const weightValuesOptions = [{
411
+ label: t(keys.calcBuilderWeightManual),
412
+ value: "manual"
413
+ }, ...weightSource !== void 0 && !ctx.weightSourceOptions.some((option) => option.value === sourceOptionValue(weightSource)) ? [...ctx.weightSourceOptions, {
414
+ label: weightSource,
415
+ value: sourceOptionValue(weightSource)
416
+ }] : ctx.weightSourceOptions];
417
+ return /* @__PURE__ */ jsxs("div", {
418
+ className: "fb-calc-operand",
419
+ children: [
420
+ /* @__PURE__ */ jsxs("div", {
421
+ className: "fb-calc-operand__header",
422
+ children: [
423
+ /* @__PURE__ */ jsx("label", {
424
+ className: "fb-visually-hidden",
425
+ htmlFor: `${idPrefix}-kind`,
426
+ children: t(keys.calcBuilderKind)
427
+ }),
428
+ /* @__PURE__ */ jsx(ReactSelect, {
429
+ className: "fb-calc-operand__kind",
430
+ inputId: `${idPrefix}-kind`,
431
+ options: withSourceGroup(leafKindOptions, kindSourceOptions, t(keys.calcBuilderSourcesGroup)),
432
+ value: kindFlat.find((option) => option.value === kindValue),
433
+ isClearable: false,
434
+ disabled: readOnly,
435
+ onChange: (selected) => {
436
+ const chosen = singleOption(selected);
437
+ if (!chosen || chosen.value === kindValue) return;
438
+ const sourceKey = sourceKeyOf(String(chosen.value));
439
+ onChange(sourceKey !== void 0 ? {
440
+ kind: "source",
441
+ source: sourceKey
442
+ } : seedOperand(chosen.value));
443
+ }
444
+ }),
445
+ operand.kind === "source" ? /* @__PURE__ */ jsx("span", {
446
+ className: "fb-calc-operand__source",
447
+ children: ctx.sourceLabelOf(operand.source)
448
+ }) : null,
449
+ operand.kind === "ref" ? refOptions.length === 0 ? /* @__PURE__ */ jsx("p", {
450
+ className: "fb-calc-hint",
451
+ children: t(keys.calcBuilderNoNumericFields)
452
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("label", {
453
+ className: "fb-visually-hidden",
454
+ htmlFor: `${idPrefix}-ref`,
455
+ children: t(keys.calcBuilderPickField)
456
+ }), /* @__PURE__ */ jsx(ReactSelect, {
457
+ className: "fb-calc-operand__ref",
458
+ inputId: `${idPrefix}-ref`,
459
+ options: refOptions,
460
+ value: refOptions.find((option) => option.value === operand.field),
461
+ isClearable: !readOnly,
462
+ disabled: readOnly,
463
+ placeholder: t(keys.calcBuilderPickField),
464
+ onChange: (selected) => {
465
+ const chosen = singleOption(selected);
466
+ onChange({
467
+ kind: "ref",
468
+ field: chosen ? String(chosen.value) : ""
469
+ });
470
+ }
471
+ })] }) : null,
472
+ operand.kind === "lit" ? /* @__PURE__ */ jsx(NumberInput, {
473
+ className: "fb-calc-operand__number",
474
+ id: `${idPrefix}-number`,
475
+ "aria-label": t(keys.calcBuilderNumber),
476
+ disabled: readOnly,
477
+ value: operand.value,
478
+ onCommit: (value) => onChange({
479
+ kind: "lit",
480
+ value
481
+ })
482
+ }) : null,
483
+ operand.kind === "weight" ? choiceOptions.length === 0 ? /* @__PURE__ */ jsx("p", {
484
+ className: "fb-calc-hint",
485
+ children: t(keys.calcBuilderNoChoiceFields)
486
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("label", {
487
+ className: "fb-visually-hidden",
488
+ htmlFor: `${idPrefix}-weight-field`,
489
+ children: t(keys.calcBuilderPickField)
490
+ }), /* @__PURE__ */ jsx(ReactSelect, {
491
+ className: "fb-calc-operand__weight-field",
492
+ inputId: `${idPrefix}-weight-field`,
493
+ options: choiceOptions,
494
+ value: choiceOptions.find((option) => option.value === operand.field),
495
+ isClearable: !readOnly,
496
+ disabled: readOnly,
497
+ placeholder: t(keys.calcBuilderPickField),
498
+ onChange: (selected) => {
499
+ const chosen = singleOption(selected);
500
+ const field = chosen ? String(chosen.value) : "";
501
+ if (field !== operand.field) onChange(operand.source !== void 0 ? {
502
+ kind: "weight",
503
+ field,
504
+ source: operand.source
505
+ } : {
506
+ kind: "weight",
507
+ field,
508
+ weights: {}
509
+ });
510
+ }
511
+ })] }) : null
512
+ ]
513
+ }),
514
+ operand.kind === "weight" && ctx.weightSourceOptions.length > 0 ? /* @__PURE__ */ jsxs("div", {
515
+ className: "fb-calc-operand__weight-values-row",
516
+ children: [/* @__PURE__ */ jsx("label", {
517
+ className: "fb-calc-operand__weight-values-label",
518
+ htmlFor: `${idPrefix}-wv`,
519
+ children: t(keys.calcBuilderWeightValues)
520
+ }), /* @__PURE__ */ jsx(ReactSelect, {
521
+ className: "fb-calc-operand__weight-values",
522
+ inputId: `${idPrefix}-wv`,
523
+ options: weightValuesOptions,
524
+ value: weightValuesOptions.find((option) => option.value === (operand.source !== void 0 ? sourceOptionValue(operand.source) : "manual")),
525
+ isClearable: false,
526
+ disabled: readOnly,
527
+ onChange: (selected) => {
528
+ const chosen = singleOption(selected);
529
+ if (!chosen) return;
530
+ const sourceKey = sourceKeyOf(String(chosen.value));
531
+ if (sourceKey === void 0) {
532
+ if (operand.source !== void 0) onChange({
533
+ kind: "weight",
534
+ field: operand.field,
535
+ weights: operand.weights ?? {}
536
+ });
537
+ return;
538
+ }
539
+ if (sourceKey !== operand.source) onChange({
540
+ ...operand,
541
+ source: sourceKey
542
+ });
543
+ }
544
+ })]
545
+ }) : null,
546
+ operand.kind === "weight" && operand.source !== void 0 ? /* @__PURE__ */ jsx("p", {
547
+ className: "fb-calc-hint",
548
+ children: t(keys.calcBuilderWeightsFromSource)
549
+ }) : null,
550
+ operand.kind === "weight" && operand.source === void 0 && choice ? /* @__PURE__ */ jsx("div", {
551
+ className: "fb-calc-operand__weights",
552
+ children: choice.options.map((option) => /* @__PURE__ */ jsxs("div", {
553
+ className: "fb-calc-operand__weight-row",
554
+ children: [/* @__PURE__ */ jsx("label", {
555
+ className: "fb-calc-operand__weight-label",
556
+ htmlFor: `${idPrefix}-weight-${option.value}`,
557
+ children: option.label
558
+ }), /* @__PURE__ */ jsx(NumberInput, {
559
+ className: "fb-calc-operand__weight",
560
+ id: `${idPrefix}-weight-${option.value}`,
561
+ disabled: readOnly,
562
+ value: operand.weights?.[option.value],
563
+ onCommit: (value) => onChange({
564
+ ...operand,
565
+ weights: {
566
+ ...operand.weights ?? {},
567
+ [option.value]: value
568
+ }
569
+ })
570
+ })]
571
+ }, option.value))
572
+ }) : null
573
+ ]
574
+ });
575
+ };
576
+ const ChainEditor = ({ chain, onChange, onEmptied, isRoot, ctx, idPrefix }) => {
577
+ const { t, readOnly } = ctx;
578
+ const removeRow = (row) => {
579
+ if (row === 0) {
580
+ const [promoted, ...rest] = chain.steps;
581
+ if (!promoted) {
582
+ onEmptied?.();
583
+ return;
584
+ }
585
+ onChange({
586
+ ...chain,
587
+ first: promoted.operand,
588
+ steps: rest
589
+ });
590
+ return;
591
+ }
592
+ onChange({
593
+ ...chain,
594
+ steps: chain.steps.filter((_, i) => i !== row - 1)
595
+ });
596
+ };
597
+ const rows = [{ operand: chain.first }, ...chain.steps.map((step) => ({
598
+ op: step.op,
599
+ operand: step.operand
600
+ }))];
601
+ return /* @__PURE__ */ jsxs("div", {
602
+ className: "fb-calc-chain",
603
+ children: [rows.map((row, index) => /* @__PURE__ */ jsxs("div", {
604
+ className: index > 0 ? "fb-calc-row fb-calc-row--divided" : "fb-calc-row",
605
+ children: [
606
+ index === 0 ? /* @__PURE__ */ jsx("div", {
607
+ className: "fb-calc-row__op-spacer",
608
+ "aria-hidden": "true"
609
+ }) : null,
610
+ index > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("label", {
611
+ className: "fb-visually-hidden",
612
+ htmlFor: `${idPrefix}-r${index}-op`,
613
+ children: t(keys.calcBuilderMath)
614
+ }), /* @__PURE__ */ jsx(ReactSelect, {
615
+ className: "fb-calc-row__op",
616
+ inputId: `${idPrefix}-r${index}-op`,
617
+ options: OP_OPTIONS,
618
+ value: OP_OPTIONS.find((option) => option.value === row.op),
619
+ isClearable: false,
620
+ disabled: readOnly,
621
+ onChange: (selected) => {
622
+ const chosen = singleOption(selected);
623
+ if (chosen) onChange({
624
+ ...chain,
625
+ steps: chain.steps.map((step, i) => i === index - 1 ? {
626
+ ...step,
627
+ op: chosen.value
628
+ } : step)
629
+ });
630
+ }
631
+ })] }) : null,
632
+ /* @__PURE__ */ jsx("div", {
633
+ className: "fb-calc-row__operand",
634
+ children: /* @__PURE__ */ jsx(OperandCard, {
635
+ operand: row.operand,
636
+ onChange: (operand) => index === 0 ? onChange({
637
+ ...chain,
638
+ first: operand
639
+ }) : onChange({
640
+ ...chain,
641
+ steps: chain.steps.map((step, i) => i === index - 1 ? {
642
+ ...step,
643
+ operand
644
+ } : step)
645
+ }),
646
+ ctx,
647
+ idPrefix: `${idPrefix}-r${index}`
648
+ })
649
+ }),
650
+ rows.length > 1 || isRoot ? /* @__PURE__ */ jsx("div", {
651
+ className: "fb-calc-row__remove",
652
+ children: /* @__PURE__ */ jsx(Button, {
653
+ buttonStyle: "icon-label",
654
+ icon: "x",
655
+ "aria-label": t(keys.calcBuilderRemove),
656
+ margin: false,
657
+ disabled: readOnly,
658
+ onClick: () => removeRow(index)
659
+ })
660
+ }) : null
661
+ ]
662
+ }, index)), /* @__PURE__ */ jsx("div", {
663
+ className: "fb-calc-chain__add",
664
+ children: /* @__PURE__ */ jsx(Button, {
665
+ buttonStyle: "icon-label",
666
+ icon: "plus",
667
+ iconStyle: "with-border",
668
+ iconPosition: "left",
669
+ margin: false,
670
+ disabled: readOnly,
671
+ onClick: () => onChange({
672
+ ...chain,
673
+ steps: [...chain.steps, {
674
+ op: "*",
675
+ operand: seedOperand("ref")
676
+ }]
677
+ }),
678
+ children: t(keys.calcBuilderAddStep)
679
+ })
680
+ })]
681
+ });
682
+ };
683
+ /**
684
+ * Visual editor for the calculation field's `expression` AST, presented as a left-to-right chain.
685
+ * Storage shape is unchanged and `validateExpression` stays the server gate; the AST remains
686
+ * authorable via the API.
687
+ */
688
+ const CalcExpressionBuilder = (props) => {
689
+ const { customComponents: { Error: ErrorComponent, Label } = {}, disabled, path, setValue, showError, value } = useField({ path: props.path });
690
+ const { t, i18n } = useTranslation$1();
691
+ const label = toStaticLabel(props.field?.label);
692
+ const readOnly = props.readOnly === true || disabled === true;
693
+ const sources = useMemo(() => props.sources ?? [], [props.sources]);
694
+ const allowed = useMemo(() => ({
695
+ sources: new Set(sources.map((source) => source.key)),
696
+ functions: new Set(props.functions ?? [])
697
+ }), [sources, props.functions]);
698
+ const sourceLabelOf = (key) => {
699
+ const meta = sources.find((source) => source.key === key);
700
+ return meta ? resolveSourceLabel(meta.label, i18n.language) : key;
701
+ };
702
+ const scalarSourceOptions = sources.filter((source) => source.scalar).map((source) => ({
703
+ label: sourceLabelOf(source.key),
704
+ value: sourceOptionValue(source.key)
705
+ }));
706
+ const weightSourceOptions = sources.filter((source) => source.weights).map((source) => ({
707
+ label: sourceLabelOf(source.key),
708
+ value: sourceOptionValue(source.key)
709
+ }));
710
+ const customFnOptions = (props.functions ?? []).map((fn) => ({
711
+ label: fn,
712
+ value: fn
713
+ }));
714
+ const expression = useMemo(() => normalizeCalc(value, allowed), [value, allowed]);
715
+ const chain = useMemo(() => expression ? astToChain(expression) : void 0, [expression]);
716
+ const storedInvalid = expression === void 0 && value != null && value !== "";
717
+ const selfIndex = useMemo(() => {
718
+ const match = /^fields\.(\d+)\./.exec(path);
719
+ return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;
720
+ }, [path]);
721
+ const siblingsJson = useFormFields(([fields]) => JSON.stringify(siblingsFromData(reduceFieldsToValues(fields, true), selfIndex)));
722
+ const siblings = useMemo(() => JSON.parse(siblingsJson), [siblingsJson]);
723
+ const startOptions = [
724
+ {
725
+ label: t(keys.calcBuilderAnswer),
726
+ value: "ref"
727
+ },
728
+ {
729
+ label: t(keys.calcBuilderNumber),
730
+ value: "lit"
731
+ },
732
+ {
733
+ label: t(keys.calcBuilderWeights),
734
+ value: "weight"
735
+ },
736
+ {
737
+ label: t(keys.calcBuilderFunction),
738
+ value: "fn"
739
+ }
740
+ ];
741
+ const startDescriptions = [
742
+ {
743
+ key: "ref",
744
+ label: t(keys.calcBuilderAnswer),
745
+ description: t(keys.calcBuilderFieldDescription)
746
+ },
747
+ {
748
+ key: "lit",
749
+ label: t(keys.calcBuilderNumber),
750
+ description: t(keys.calcBuilderNumberDescription)
751
+ },
752
+ {
753
+ key: "weight",
754
+ label: t(keys.calcBuilderWeights),
755
+ description: t(keys.calcBuilderWeightsDescription)
756
+ },
757
+ {
758
+ key: "fn",
759
+ label: t(keys.calcBuilderFunction),
760
+ description: t(keys.calcBuilderFunctionDescription)
761
+ }
762
+ ];
763
+ const commitChain = (next) => {
764
+ if (!readOnly) setValue(chainToAst(next));
765
+ };
766
+ const clear = () => {
767
+ if (!readOnly) setValue(null);
768
+ };
769
+ const labelOf = (field) => field.trim() === "" ? "?" : siblings.labels[field] ?? field;
770
+ const idBase = `calc-${path.replace(/\./g, "__")}`;
771
+ const ctx = {
772
+ t,
773
+ siblings,
774
+ readOnly,
775
+ sourceLabelOf,
776
+ scalarSourceOptions,
777
+ weightSourceOptions,
778
+ customFnOptions
779
+ };
780
+ return /* @__PURE__ */ jsxs("div", {
781
+ className: [
782
+ "field-type",
783
+ "fb-calc-builder",
784
+ showError && "error",
785
+ readOnly && "read-only"
786
+ ].filter(Boolean).join(" "),
787
+ id: path ? `field-${path.replace(/\./g, "__")}` : void 0,
788
+ children: [/* @__PURE__ */ jsx(RenderCustomComponent, {
789
+ CustomComponent: Label,
790
+ Fallback: /* @__PURE__ */ jsx(FieldLabel, {
791
+ label,
792
+ path
793
+ })
794
+ }), /* @__PURE__ */ jsxs("div", {
795
+ className: "field-type__wrap",
796
+ children: [
797
+ /* @__PURE__ */ jsx(RenderCustomComponent, {
798
+ CustomComponent: ErrorComponent,
799
+ Fallback: /* @__PURE__ */ jsx(FieldError, {
800
+ path,
801
+ showError
802
+ })
803
+ }),
804
+ chain ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ChainEditor, {
805
+ chain,
806
+ onChange: commitChain,
807
+ onEmptied: clear,
808
+ isRoot: true,
809
+ ctx,
810
+ idPrefix: idBase
811
+ }), /* @__PURE__ */ jsxs("div", {
812
+ className: "fb-calc-finish",
813
+ children: [/* @__PURE__ */ jsx("label", {
814
+ className: "fb-calc-finish__label",
815
+ htmlFor: `${idBase}-finish`,
816
+ title: t(keys.calcBuilderThenApply),
817
+ children: t(keys.calcBuilderThenApply)
818
+ }), /* @__PURE__ */ jsx(ReactSelect, {
819
+ className: "fb-calc-finish__select",
820
+ inputId: `${idBase}-finish`,
821
+ options: UNARY_OPTIONS,
822
+ value: UNARY_OPTIONS.find((option) => option.value === chain.finish),
823
+ isClearable: !readOnly,
824
+ disabled: readOnly,
825
+ onChange: (selected) => {
826
+ const chosen = singleOption(selected);
827
+ commitChain({
828
+ ...chain,
829
+ finish: chosen ? chosen.value : void 0
830
+ });
831
+ }
832
+ })]
833
+ })] }) : /* @__PURE__ */ jsxs("div", {
834
+ className: "fb-calc-builder__empty",
835
+ children: [
836
+ storedInvalid ? /* @__PURE__ */ jsx("p", {
837
+ className: "fb-calc-builder__warning",
838
+ children: t(keys.calcBuilderStoredInvalid)
839
+ }) : null,
840
+ /* @__PURE__ */ jsx("p", {
841
+ className: "fb-calc-builder__hint",
842
+ children: t(keys.calcBuilderAddExpression)
843
+ }),
844
+ /* @__PURE__ */ jsx("label", {
845
+ className: "fb-visually-hidden",
846
+ htmlFor: `${idBase}-seed`,
847
+ children: t(keys.calcBuilderStartWith)
848
+ }),
849
+ /* @__PURE__ */ jsx(ReactSelect, {
850
+ className: "fb-calc-builder__seed",
851
+ inputId: `${idBase}-seed`,
852
+ options: withSourceGroup(startOptions, scalarSourceOptions, t(keys.calcBuilderSourcesGroup)),
853
+ disabled: readOnly,
854
+ placeholder: t(keys.calcBuilderStartWith),
855
+ onChange: (selected) => {
856
+ const chosen = singleOption(selected);
857
+ if (!chosen || readOnly) return;
858
+ const sourceKey = sourceKeyOf(String(chosen.value));
859
+ setValue(sourceKey !== void 0 ? {
860
+ type: "source",
861
+ source: sourceKey
862
+ } : seedAst(chosen.value));
863
+ }
864
+ }),
865
+ /* @__PURE__ */ jsx("ul", {
866
+ className: "fb-calc-builder__kinds",
867
+ children: startDescriptions.map((entry) => /* @__PURE__ */ jsxs("li", { children: [
868
+ /* @__PURE__ */ jsx("span", {
869
+ className: "fb-calc-builder__kind-label",
870
+ children: entry.label
871
+ }),
872
+ " ",
873
+ entry.description
874
+ ] }, entry.key))
875
+ })
876
+ ]
877
+ }),
878
+ /* @__PURE__ */ jsx("p", {
879
+ className: "fb-calc-builder__preview",
880
+ "aria-live": "polite",
881
+ children: expression ? formatCalc(expression, labelOf, sourceLabelOf) : ""
882
+ })
883
+ ]
884
+ })]
885
+ });
886
+ };
887
+ //#endregion
888
+ export { CalcExpressionBuilder };
889
+
890
+ //# sourceMappingURL=CalcExpressionBuilder.js.map