@qoretechnologies/reqraft 0.10.65 → 0.10.66-pr.137.ga1983bf

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 (873) hide show
  1. package/README.md +53 -1
  2. package/dist/components/Description/AllowedValuesHelp.d.ts +20 -0
  3. package/dist/components/Description/AllowedValuesHelp.d.ts.map +1 -0
  4. package/dist/components/Description/AllowedValuesHelp.js +86 -0
  5. package/dist/components/Description/AllowedValuesHelp.js.map +1 -0
  6. package/dist/components/Description/describedControl.d.ts +54 -0
  7. package/dist/components/Description/describedControl.d.ts.map +1 -0
  8. package/dist/components/Description/describedControl.js +81 -0
  9. package/dist/components/Description/describedControl.js.map +1 -0
  10. package/dist/components/Description/index.d.ts.map +1 -1
  11. package/dist/components/Description/index.js +3 -2
  12. package/dist/components/Description/index.js.map +1 -1
  13. package/dist/components/colorValue/colorValue.d.ts +59 -0
  14. package/dist/components/colorValue/colorValue.d.ts.map +1 -0
  15. package/dist/components/colorValue/colorValue.js +245 -0
  16. package/dist/components/colorValue/colorValue.js.map +1 -0
  17. package/dist/components/colorValue/index.d.ts +34 -0
  18. package/dist/components/colorValue/index.d.ts.map +1 -0
  19. package/dist/components/colorValue/index.js +136 -0
  20. package/dist/components/colorValue/index.js.map +1 -0
  21. package/dist/components/colorValue/labels.d.ts +12 -0
  22. package/dist/components/colorValue/labels.d.ts.map +1 -0
  23. package/dist/components/colorValue/labels.js +11 -0
  24. package/dist/components/colorValue/labels.js.map +1 -0
  25. package/dist/components/composer/Composer.d.ts +1 -1
  26. package/dist/components/composer/Composer.d.ts.map +1 -1
  27. package/dist/components/composer/Composer.js +2 -2
  28. package/dist/components/composer/Composer.js.map +1 -1
  29. package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
  30. package/dist/components/dpqlEditor/DpqlEditor.js +156 -10
  31. package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
  32. package/dist/components/dpqlEditor/dpqlCompletions.d.ts +39 -0
  33. package/dist/components/dpqlEditor/dpqlCompletions.d.ts.map +1 -0
  34. package/dist/components/dpqlEditor/dpqlCompletions.js +294 -0
  35. package/dist/components/dpqlEditor/dpqlCompletions.js.map +1 -0
  36. package/dist/components/dpqlEditor/dpqlHelpers.d.ts +54 -5
  37. package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
  38. package/dist/components/dpqlEditor/dpqlHelpers.js +413 -63
  39. package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
  40. package/dist/components/dpqlEditor/dpqlInserter.d.ts.map +1 -1
  41. package/dist/components/dpqlEditor/dpqlInserter.js +67 -29
  42. package/dist/components/dpqlEditor/dpqlInserter.js.map +1 -1
  43. package/dist/components/dpqlEditor/dpqlTags.d.ts +17 -7
  44. package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
  45. package/dist/components/dpqlEditor/dpqlTags.js +44 -17
  46. package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
  47. package/dist/components/dpqlEditor/types.d.ts +94 -8
  48. package/dist/components/dpqlEditor/types.d.ts.map +1 -1
  49. package/dist/components/dpqlEditor/useDpqlSession.d.ts +7 -2
  50. package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
  51. package/dist/components/dpqlEditor/useDpqlSession.js +49 -17
  52. package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
  53. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  54. package/dist/components/form/engine/CompactRow.js +322 -124
  55. package/dist/components/form/engine/CompactRow.js.map +1 -1
  56. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  57. package/dist/components/form/engine/CompactToolbar.js +29 -3
  58. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  59. package/dist/components/form/engine/FormEngine.d.ts +66 -11
  60. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  61. package/dist/components/form/engine/FormEngine.js +570 -176
  62. package/dist/components/form/engine/FormEngine.js.map +1 -1
  63. package/dist/components/form/engine/HiddenFieldsNote.d.ts +28 -0
  64. package/dist/components/form/engine/HiddenFieldsNote.d.ts.map +1 -0
  65. package/dist/components/form/engine/HiddenFieldsNote.js +32 -0
  66. package/dist/components/form/engine/HiddenFieldsNote.js.map +1 -0
  67. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  68. package/dist/components/form/engine/OptionFieldMessages.js +25 -3
  69. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  70. package/dist/components/form/engine/OptionsHelpDialog.d.ts.map +1 -1
  71. package/dist/components/form/engine/OptionsHelpDialog.js +19 -2
  72. package/dist/components/form/engine/OptionsHelpDialog.js.map +1 -1
  73. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +2 -2
  74. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
  75. package/dist/components/form/engine/_structuredData/SchemaDataView.js +12 -6
  76. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
  77. package/dist/components/form/engine/compactRowContext.d.ts +30 -1
  78. package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
  79. package/dist/components/form/engine/compactRowContext.js.map +1 -1
  80. package/dist/components/form/engine/compactRowStyles.d.ts +59 -22
  81. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  82. package/dist/components/form/engine/compactRowStyles.js +102 -55
  83. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  84. package/dist/components/form/engine/compactToolbarColors.d.ts +16 -0
  85. package/dist/components/form/engine/compactToolbarColors.d.ts.map +1 -0
  86. package/dist/components/form/engine/compactToolbarColors.js +21 -0
  87. package/dist/components/form/engine/compactToolbarColors.js.map +1 -0
  88. package/dist/components/form/engine/inheritProps.d.ts +29 -0
  89. package/dist/components/form/engine/inheritProps.d.ts.map +1 -0
  90. package/dist/components/form/engine/inheritProps.js +43 -0
  91. package/dist/components/form/engine/inheritProps.js.map +1 -0
  92. package/dist/components/form/engine/operatorSummary.d.ts +26 -0
  93. package/dist/components/form/engine/operatorSummary.d.ts.map +1 -0
  94. package/dist/components/form/engine/operatorSummary.js +35 -0
  95. package/dist/components/form/engine/operatorSummary.js.map +1 -0
  96. package/dist/components/form/engine/readFirst.d.ts +24 -8
  97. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  98. package/dist/components/form/engine/readFirst.js +77 -109
  99. package/dist/components/form/engine/readFirst.js.map +1 -1
  100. package/dist/components/form/engine/readFirstColors.d.ts +30 -0
  101. package/dist/components/form/engine/readFirstColors.d.ts.map +1 -0
  102. package/dist/components/form/engine/readFirstColors.js +51 -0
  103. package/dist/components/form/engine/readFirstColors.js.map +1 -0
  104. package/dist/components/form/engine/rowFocus.d.ts +2 -0
  105. package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
  106. package/dist/components/form/engine/rowFocus.js +26 -3
  107. package/dist/components/form/engine/rowFocus.js.map +1 -1
  108. package/dist/components/form/engine/typeChoices.d.ts +1 -1
  109. package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -1
  110. package/dist/components/form/engine/variants/VariantCalmTable.js +2 -1
  111. package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -1
  112. package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -1
  113. package/dist/components/form/engine/variants/VariantCards.js +2 -1
  114. package/dist/components/form/engine/variants/VariantCards.js.map +1 -1
  115. package/dist/components/form/engine/variants/VariantFocus.js +1 -1
  116. package/dist/components/form/engine/variants/VariantFocus.js.map +1 -1
  117. package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -1
  118. package/dist/components/form/engine/variants/VariantMinimal.js +2 -1
  119. package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -1
  120. package/dist/components/form/engine/variants/variantParts.d.ts +1 -1
  121. package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -1
  122. package/dist/components/form/engine/variants/variantParts.js +25 -17
  123. package/dist/components/form/engine/variants/variantParts.js.map +1 -1
  124. package/dist/components/form/expressions/DpqlRendering.d.ts +1 -1
  125. package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -1
  126. package/dist/components/form/expressions/DpqlRendering.js +7 -6
  127. package/dist/components/form/expressions/DpqlRendering.js.map +1 -1
  128. package/dist/components/form/expressions/ExpressionField.d.ts +67 -3
  129. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  130. package/dist/components/form/expressions/ExpressionField.js +536 -114
  131. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  132. package/dist/components/form/expressions/argumentPresence.d.ts +14 -0
  133. package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -1
  134. package/dist/components/form/expressions/argumentPresence.js +16 -1
  135. package/dist/components/form/expressions/argumentPresence.js.map +1 -1
  136. package/dist/components/form/expressions/builder/argumentDetail.d.ts.map +1 -1
  137. package/dist/components/form/expressions/builder/argumentDetail.js +4 -1
  138. package/dist/components/form/expressions/builder/argumentDetail.js.map +1 -1
  139. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  140. package/dist/components/form/expressions/builder/argumentLabel.js +30 -11
  141. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  142. package/dist/components/form/expressions/builder/argumentWrapper.d.ts.map +1 -1
  143. package/dist/components/form/expressions/builder/argumentWrapper.js +3 -1
  144. package/dist/components/form/expressions/builder/argumentWrapper.js.map +1 -1
  145. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts +9 -0
  146. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
  147. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +30 -27
  148. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js.map +1 -1
  149. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts +1 -1
  150. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts.map +1 -1
  151. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js +7 -5
  152. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
  153. package/dist/components/form/expressions/builder/index.d.ts +34 -2
  154. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  155. package/dist/components/form/expressions/builder/index.js +170 -80
  156. package/dist/components/form/expressions/builder/index.js.map +1 -1
  157. package/dist/components/form/expressions/builder/item.d.ts +6 -2
  158. package/dist/components/form/expressions/builder/item.d.ts.map +1 -1
  159. package/dist/components/form/expressions/builder/item.js +19 -5
  160. package/dist/components/form/expressions/builder/item.js.map +1 -1
  161. package/dist/components/form/expressions/builder/renderTemplate.js +1 -1
  162. package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
  163. package/dist/components/form/expressions/dpqlMockRecordPath.d.ts +11 -0
  164. package/dist/components/form/expressions/dpqlMockRecordPath.d.ts.map +1 -0
  165. package/dist/components/form/expressions/dpqlMockRecordPath.js +254 -0
  166. package/dist/components/form/expressions/dpqlMockRecordPath.js.map +1 -0
  167. package/dist/components/form/expressions/expressionOperands.d.ts +16 -0
  168. package/dist/components/form/expressions/expressionOperands.d.ts.map +1 -0
  169. package/dist/components/form/expressions/expressionOperands.js +97 -0
  170. package/dist/components/form/expressions/expressionOperands.js.map +1 -0
  171. package/dist/components/form/expressions/fieldPath.d.ts +24 -0
  172. package/dist/components/form/expressions/fieldPath.d.ts.map +1 -0
  173. package/dist/components/form/expressions/fieldPath.js +152 -0
  174. package/dist/components/form/expressions/fieldPath.js.map +1 -0
  175. package/dist/components/form/expressions/loneValue.d.ts +17 -0
  176. package/dist/components/form/expressions/loneValue.d.ts.map +1 -0
  177. package/dist/components/form/expressions/loneValue.js +33 -0
  178. package/dist/components/form/expressions/loneValue.js.map +1 -0
  179. package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
  180. package/dist/components/form/expressions/mockExpressions.js +22 -5
  181. package/dist/components/form/expressions/mockExpressions.js.map +1 -1
  182. package/dist/components/form/expressions/renderExpressionToText.d.ts +2 -0
  183. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  184. package/dist/components/form/expressions/renderExpressionToText.js +43 -10
  185. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  186. package/dist/components/form/expressions/textOfExpression.d.ts +18 -0
  187. package/dist/components/form/expressions/textOfExpression.d.ts.map +1 -0
  188. package/dist/components/form/expressions/textOfExpression.js +49 -0
  189. package/dist/components/form/expressions/textOfExpression.js.map +1 -0
  190. package/dist/components/form/expressions/types.d.ts +12 -0
  191. package/dist/components/form/expressions/types.d.ts.map +1 -1
  192. package/dist/components/form/expressions/types.js +6 -1
  193. package/dist/components/form/expressions/types.js.map +1 -1
  194. package/dist/components/form/expressions/useExpressionType.d.ts +26 -0
  195. package/dist/components/form/expressions/useExpressionType.d.ts.map +1 -0
  196. package/dist/components/form/expressions/useExpressionType.js +181 -0
  197. package/dist/components/form/expressions/useExpressionType.js.map +1 -0
  198. package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
  199. package/dist/components/form/expressions/useRenderExpression.js +13 -9
  200. package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
  201. package/dist/components/form/expressions/wildcardExpressions.d.ts +27 -0
  202. package/dist/components/form/expressions/wildcardExpressions.d.ts.map +1 -0
  203. package/dist/components/form/expressions/wildcardExpressions.js +101 -0
  204. package/dist/components/form/expressions/wildcardExpressions.js.map +1 -0
  205. package/dist/components/form/fields/Field.d.ts.map +1 -1
  206. package/dist/components/form/fields/Field.js +43 -20
  207. package/dist/components/form/fields/Field.js.map +1 -1
  208. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  209. package/dist/components/form/fields/allowed-values/AllowedValues.js +39 -6
  210. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  211. package/dist/components/form/fields/allowed-values/choicePicture.d.ts +37 -0
  212. package/dist/components/form/fields/allowed-values/choicePicture.d.ts.map +1 -0
  213. package/dist/components/form/fields/allowed-values/choicePicture.js +64 -0
  214. package/dist/components/form/fields/allowed-values/choicePicture.js.map +1 -0
  215. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  216. package/dist/components/form/fields/array/ArrayAuto.js +24 -0
  217. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  218. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  219. package/dist/components/form/fields/array/ArrayAutoField.js +36 -13
  220. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  221. package/dist/components/form/fields/auto/AutoFormField.d.ts +30 -1
  222. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  223. package/dist/components/form/fields/auto/AutoFormField.js +119 -62
  224. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  225. package/dist/components/form/fields/auto/hostEditorValue.d.ts +30 -0
  226. package/dist/components/form/fields/auto/hostEditorValue.d.ts.map +1 -0
  227. package/dist/components/form/fields/auto/hostEditorValue.js +53 -0
  228. package/dist/components/form/fields/auto/hostEditorValue.js.map +1 -0
  229. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
  230. package/dist/components/form/fields/binary/Binary.js +23 -3
  231. package/dist/components/form/fields/binary/Binary.js.map +1 -1
  232. package/dist/components/form/fields/boolean/Boolean.d.ts +5 -0
  233. package/dist/components/form/fields/boolean/Boolean.d.ts.map +1 -1
  234. package/dist/components/form/fields/boolean/Boolean.js +9 -1
  235. package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
  236. package/dist/components/form/fields/color/Color.d.ts +103 -16
  237. package/dist/components/form/fields/color/Color.d.ts.map +1 -1
  238. package/dist/components/form/fields/color/Color.js +616 -16
  239. package/dist/components/form/fields/color/Color.js.map +1 -1
  240. package/dist/components/form/fields/emittedValues.d.ts +34 -3
  241. package/dist/components/form/fields/emittedValues.d.ts.map +1 -1
  242. package/dist/components/form/fields/emittedValues.js +24 -1
  243. package/dist/components/form/fields/emittedValues.js.map +1 -1
  244. package/dist/components/form/fields/file/File.d.ts +1 -1
  245. package/dist/components/form/fields/file/File.d.ts.map +1 -1
  246. package/dist/components/form/fields/file/File.js +4 -2
  247. package/dist/components/form/fields/file/File.js.map +1 -1
  248. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  249. package/dist/components/form/fields/long-string/LongString.js +29 -8
  250. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  251. package/dist/components/form/fields/markdown/MarkdownView.js +1 -1
  252. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  253. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +13 -9
  254. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  255. package/dist/components/form/fields/number/Number.d.ts +6 -0
  256. package/dist/components/form/fields/number/Number.d.ts.map +1 -1
  257. package/dist/components/form/fields/number/Number.js +41 -6
  258. package/dist/components/form/fields/number/Number.js.map +1 -1
  259. package/dist/components/form/fields/object/Object.d.ts +1 -1
  260. package/dist/components/form/fields/object/Object.d.ts.map +1 -1
  261. package/dist/components/form/fields/object/Object.js +4 -2
  262. package/dist/components/form/fields/object/Object.js.map +1 -1
  263. package/dist/components/form/fields/pendingEdit.d.ts +52 -0
  264. package/dist/components/form/fields/pendingEdit.d.ts.map +1 -0
  265. package/dist/components/form/fields/pendingEdit.js +79 -0
  266. package/dist/components/form/fields/pendingEdit.js.map +1 -0
  267. package/dist/components/form/fields/radio-group/RadioGroup.d.ts.map +1 -1
  268. package/dist/components/form/fields/radio-group/RadioGroup.js +4 -3
  269. package/dist/components/form/fields/radio-group/RadioGroup.js.map +1 -1
  270. package/dist/components/form/fields/rich-text/RichText.d.ts +20 -1
  271. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  272. package/dist/components/form/fields/rich-text/RichText.js +382 -91
  273. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  274. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts +18 -0
  275. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts.map +1 -0
  276. package/dist/components/form/fields/rich-text/useTemplateTags.js +80 -0
  277. package/dist/components/form/fields/rich-text/useTemplateTags.js.map +1 -0
  278. package/dist/components/form/fields/schema-definition/CatalogLeafForm.d.ts.map +1 -1
  279. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js +4 -1
  280. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js.map +1 -1
  281. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.d.ts.map +1 -1
  282. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js +20 -5
  283. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js.map +1 -1
  284. package/dist/components/form/fields/schema-definition/TableEditor.d.ts.map +1 -1
  285. package/dist/components/form/fields/schema-definition/TableEditor.js +10 -2
  286. package/dist/components/form/fields/schema-definition/TableEditor.js.map +1 -1
  287. package/dist/components/form/fields/schema-definition/index.d.ts.map +1 -1
  288. package/dist/components/form/fields/schema-definition/index.js +8 -4
  289. package/dist/components/form/fields/schema-definition/index.js.map +1 -1
  290. package/dist/components/form/fields/select/Select.d.ts +10 -1
  291. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  292. package/dist/components/form/fields/select/Select.js +28 -14
  293. package/dist/components/form/fields/select/Select.js.map +1 -1
  294. package/dist/components/form/fields/select/SelectCollection.d.ts +5 -0
  295. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  296. package/dist/components/form/fields/select/SelectCollection.js +25 -12
  297. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  298. package/dist/components/form/fields/select/unavailableRow.d.ts +23 -0
  299. package/dist/components/form/fields/select/unavailableRow.d.ts.map +1 -0
  300. package/dist/components/form/fields/select/unavailableRow.js +55 -0
  301. package/dist/components/form/fields/select/unavailableRow.js.map +1 -0
  302. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +11 -5
  303. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  304. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +21 -5
  305. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  306. package/dist/components/form/fields/template/TemplateBrowser.d.ts +16 -0
  307. package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
  308. package/dist/components/form/fields/template/TemplateBrowser.js +89 -0
  309. package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
  310. package/dist/components/form/fields/template/TemplateField.d.ts +105 -1
  311. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  312. package/dist/components/form/fields/template/TemplateField.js +678 -107
  313. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  314. package/dist/components/form/fields/template/TemplatePicker.d.ts +54 -0
  315. package/dist/components/form/fields/template/TemplatePicker.d.ts.map +1 -0
  316. package/dist/components/form/fields/template/TemplatePicker.js +451 -0
  317. package/dist/components/form/fields/template/TemplatePicker.js.map +1 -0
  318. package/dist/components/form/fields/template/TemplateText.d.ts +0 -17
  319. package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -1
  320. package/dist/components/form/fields/template/TemplateText.js +22 -16
  321. package/dist/components/form/fields/template/TemplateText.js.map +1 -1
  322. package/dist/components/form/fields/template/referenceNames.d.ts +63 -0
  323. package/dist/components/form/fields/template/referenceNames.d.ts.map +1 -0
  324. package/dist/components/form/fields/template/referenceNames.js +69 -0
  325. package/dist/components/form/fields/template/referenceNames.js.map +1 -0
  326. package/dist/components/form/fields/template/writtenAsText.d.ts +61 -0
  327. package/dist/components/form/fields/template/writtenAsText.d.ts.map +1 -0
  328. package/dist/components/form/fields/template/writtenAsText.js +204 -0
  329. package/dist/components/form/fields/template/writtenAsText.js.map +1 -0
  330. package/dist/components/form/index.d.ts +12 -0
  331. package/dist/components/form/index.d.ts.map +1 -1
  332. package/dist/components/form/index.js +25 -1
  333. package/dist/components/form/index.js.map +1 -1
  334. package/dist/components/form/typeSentenceForm.d.ts +17 -0
  335. package/dist/components/form/typeSentenceForm.d.ts.map +1 -0
  336. package/dist/components/form/typeSentenceForm.js +54 -0
  337. package/dist/components/form/typeSentenceForm.js.map +1 -0
  338. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
  339. package/dist/components/imageLightbox/ImageLightbox.js +19 -7
  340. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
  341. package/dist/components/log/Log.d.ts.map +1 -1
  342. package/dist/components/log/Log.js +20 -8
  343. package/dist/components/log/Log.js.map +1 -1
  344. package/dist/components/menu/Menu.d.ts.map +1 -1
  345. package/dist/components/menu/Menu.js +19 -10
  346. package/dist/components/menu/Menu.js.map +1 -1
  347. package/dist/components/smartEditor/CompletionMenu.d.ts +53 -0
  348. package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
  349. package/dist/components/smartEditor/CompletionMenu.js +302 -0
  350. package/dist/components/smartEditor/CompletionMenu.js.map +1 -0
  351. package/dist/components/smartEditor/MarkdownDoc.d.ts +1 -1
  352. package/dist/components/smartEditor/MarkdownDoc.js +3 -3
  353. package/dist/components/smartEditor/MarkdownDoc.js.map +1 -1
  354. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  355. package/dist/components/smartEditor/SmartEditor.js +584 -190
  356. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  357. package/dist/components/smartEditor/completionStyle.d.ts +28 -0
  358. package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
  359. package/dist/components/smartEditor/completionStyle.js +79 -0
  360. package/dist/components/smartEditor/completionStyle.js.map +1 -0
  361. package/dist/components/smartEditor/contextTitle.d.ts +10 -0
  362. package/dist/components/smartEditor/contextTitle.d.ts.map +1 -0
  363. package/dist/components/smartEditor/contextTitle.js +21 -0
  364. package/dist/components/smartEditor/contextTitle.js.map +1 -0
  365. package/dist/components/smartEditor/editingAids.d.ts +64 -0
  366. package/dist/components/smartEditor/editingAids.d.ts.map +1 -0
  367. package/dist/components/smartEditor/editingAids.js +213 -0
  368. package/dist/components/smartEditor/editingAids.js.map +1 -0
  369. package/dist/components/smartEditor/index.d.ts +6 -1
  370. package/dist/components/smartEditor/index.d.ts.map +1 -1
  371. package/dist/components/smartEditor/index.js +19 -1
  372. package/dist/components/smartEditor/index.js.map +1 -1
  373. package/dist/components/smartEditor/templateCompletions.d.ts +98 -0
  374. package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
  375. package/dist/components/smartEditor/templateCompletions.js +380 -0
  376. package/dist/components/smartEditor/templateCompletions.js.map +1 -0
  377. package/dist/components/smartEditor/typedReferences.d.ts +34 -0
  378. package/dist/components/smartEditor/typedReferences.d.ts.map +1 -0
  379. package/dist/components/smartEditor/typedReferences.js +179 -0
  380. package/dist/components/smartEditor/typedReferences.js.map +1 -0
  381. package/dist/components/smartEditor/types.d.ts +116 -2
  382. package/dist/components/smartEditor/types.d.ts.map +1 -1
  383. package/dist/components/smartEditor/useEditingAids.d.ts +38 -0
  384. package/dist/components/smartEditor/useEditingAids.d.ts.map +1 -0
  385. package/dist/components/smartEditor/useEditingAids.js +336 -0
  386. package/dist/components/smartEditor/useEditingAids.js.map +1 -0
  387. package/dist/components/smartEditor/useLspAutocomplete.d.ts +106 -3
  388. package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
  389. package/dist/components/smartEditor/useLspAutocomplete.js +562 -151
  390. package/dist/components/smartEditor/useLspAutocomplete.js.map +1 -1
  391. package/dist/components/smartEditor/useLspHover.d.ts +33 -7
  392. package/dist/components/smartEditor/useLspHover.d.ts.map +1 -1
  393. package/dist/components/smartEditor/useLspHover.js +364 -35
  394. package/dist/components/smartEditor/useLspHover.js.map +1 -1
  395. package/dist/components/smartEditor/useLspSemanticTokens.js +1 -1
  396. package/dist/components/smartEditor/useLspSemanticTokens.js.map +1 -1
  397. package/dist/components/smartEditor/useLspSession.d.ts +6 -0
  398. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  399. package/dist/components/smartEditor/useLspSession.js +7 -6
  400. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  401. package/dist/components/smartEditor/useLspSignatureHelp.d.ts.map +1 -1
  402. package/dist/components/smartEditor/useLspSignatureHelp.js +6 -11
  403. package/dist/components/smartEditor/useLspSignatureHelp.js.map +1 -1
  404. package/dist/components/smartEditor/useTabCameIn.d.ts +10 -0
  405. package/dist/components/smartEditor/useTabCameIn.d.ts.map +1 -0
  406. package/dist/components/smartEditor/useTabCameIn.js +42 -0
  407. package/dist/components/smartEditor/useTabCameIn.js.map +1 -0
  408. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -1
  409. package/dist/components/supportTicket/AttachmentChips.js +15 -5
  410. package/dist/components/supportTicket/AttachmentChips.js.map +1 -1
  411. package/dist/components/supportTicket/ReferencePicker.d.ts +9 -2
  412. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
  413. package/dist/components/supportTicket/ReferencePicker.js +27 -6
  414. package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
  415. package/dist/components/supportTicket/TicketHeader.d.ts +3 -4
  416. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
  417. package/dist/components/supportTicket/TicketHeader.js +20 -2
  418. package/dist/components/supportTicket/TicketHeader.js.map +1 -1
  419. package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
  420. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
  421. package/dist/components/ticketReferences/TicketReferences.js +9 -4
  422. package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
  423. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
  424. package/dist/components/ticketThread/TicketThread.js +38 -13
  425. package/dist/components/ticketThread/TicketThread.js.map +1 -1
  426. package/dist/helpers/allowedValues.d.ts +21 -0
  427. package/dist/helpers/allowedValues.d.ts.map +1 -1
  428. package/dist/helpers/allowedValues.js +40 -1
  429. package/dist/helpers/allowedValues.js.map +1 -1
  430. package/dist/helpers/descriptionTooltip.d.ts +46 -0
  431. package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
  432. package/dist/helpers/descriptionTooltip.js +76 -0
  433. package/dist/helpers/descriptionTooltip.js.map +1 -0
  434. package/dist/helpers/domProps.d.ts +5 -0
  435. package/dist/helpers/domProps.d.ts.map +1 -0
  436. package/dist/helpers/domProps.js +47 -0
  437. package/dist/helpers/domProps.js.map +1 -0
  438. package/dist/helpers/expressions.d.ts +115 -4
  439. package/dist/helpers/expressions.d.ts.map +1 -1
  440. package/dist/helpers/expressions.js +247 -29
  441. package/dist/helpers/expressions.js.map +1 -1
  442. package/dist/helpers/hoveringPointer.d.ts +26 -0
  443. package/dist/helpers/hoveringPointer.d.ts.map +1 -0
  444. package/dist/helpers/hoveringPointer.js +29 -0
  445. package/dist/helpers/hoveringPointer.js.map +1 -0
  446. package/dist/helpers/markdownText.d.ts +14 -0
  447. package/dist/helpers/markdownText.d.ts.map +1 -0
  448. package/dist/helpers/markdownText.js +160 -0
  449. package/dist/helpers/markdownText.js.map +1 -0
  450. package/dist/helpers/noDescription.d.ts +9 -0
  451. package/dist/helpers/noDescription.d.ts.map +1 -0
  452. package/dist/helpers/noDescription.js +13 -0
  453. package/dist/helpers/noDescription.js.map +1 -0
  454. package/dist/helpers/optionUiTypes.d.ts +2 -2
  455. package/dist/helpers/qorusTypeCatalogue.d.ts +147 -0
  456. package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
  457. package/dist/helpers/qorusTypeCatalogue.js +505 -0
  458. package/dist/helpers/qorusTypeCatalogue.js.map +1 -0
  459. package/dist/helpers/readableColors.d.ts +36 -0
  460. package/dist/helpers/readableColors.d.ts.map +1 -0
  461. package/dist/helpers/readableColors.js +116 -0
  462. package/dist/helpers/readableColors.js.map +1 -0
  463. package/dist/helpers/recordFieldReference.d.ts +15 -0
  464. package/dist/helpers/recordFieldReference.d.ts.map +1 -0
  465. package/dist/helpers/recordFieldReference.js +89 -0
  466. package/dist/helpers/recordFieldReference.js.map +1 -0
  467. package/dist/helpers/templateCatalogue.d.ts +104 -0
  468. package/dist/helpers/templateCatalogue.d.ts.map +1 -0
  469. package/dist/helpers/templateCatalogue.js +116 -0
  470. package/dist/helpers/templateCatalogue.js.map +1 -0
  471. package/dist/helpers/templateCatalogueContext.d.ts +19 -0
  472. package/dist/helpers/templateCatalogueContext.d.ts.map +1 -0
  473. package/dist/helpers/templateCatalogueContext.js +31 -0
  474. package/dist/helpers/templateCatalogueContext.js.map +1 -0
  475. package/dist/helpers/templateItems.d.ts +2 -2
  476. package/dist/helpers/templateItems.d.ts.map +1 -1
  477. package/dist/helpers/templateItems.js +6 -4
  478. package/dist/helpers/templateItems.js.map +1 -1
  479. package/dist/helpers/templateText.d.ts +1 -0
  480. package/dist/helpers/templateText.d.ts.map +1 -1
  481. package/dist/helpers/templateText.js +7 -3
  482. package/dist/helpers/templateText.js.map +1 -1
  483. package/dist/helpers/templateTree.d.ts +248 -0
  484. package/dist/helpers/templateTree.d.ts.map +1 -0
  485. package/dist/helpers/templateTree.js +892 -0
  486. package/dist/helpers/templateTree.js.map +1 -0
  487. package/dist/helpers/templateType.d.ts +28 -0
  488. package/dist/helpers/templateType.d.ts.map +1 -0
  489. package/dist/helpers/templateType.js +30 -0
  490. package/dist/helpers/templateType.js.map +1 -0
  491. package/dist/helpers/templates.d.ts +86 -16
  492. package/dist/helpers/templates.d.ts.map +1 -1
  493. package/dist/helpers/templates.js +305 -45
  494. package/dist/helpers/templates.js.map +1 -1
  495. package/dist/helpers/validations.d.ts +27 -0
  496. package/dist/helpers/validations.d.ts.map +1 -1
  497. package/dist/helpers/validations.js +169 -39
  498. package/dist/helpers/validations.js.map +1 -1
  499. package/dist/helpers/webLink.d.ts +8 -0
  500. package/dist/helpers/webLink.d.ts.map +1 -0
  501. package/dist/helpers/webLink.js +29 -0
  502. package/dist/helpers/webLink.js.map +1 -0
  503. package/dist/hooks/useQorusTypes.d.ts +12 -17
  504. package/dist/hooks/useQorusTypes.d.ts.map +1 -1
  505. package/dist/hooks/useQorusTypes.js +44 -172
  506. package/dist/hooks/useQorusTypes.js.map +1 -1
  507. package/dist/hooks/useReadableIntentShade.d.ts +9 -0
  508. package/dist/hooks/useReadableIntentShade.d.ts.map +1 -0
  509. package/dist/hooks/useReadableIntentShade.js +23 -0
  510. package/dist/hooks/useReadableIntentShade.js.map +1 -0
  511. package/dist/hooks/useReadableOpacity.d.ts +6 -0
  512. package/dist/hooks/useReadableOpacity.d.ts.map +1 -0
  513. package/dist/hooks/useReadableOpacity.js +17 -0
  514. package/dist/hooks/useReadableOpacity.js.map +1 -0
  515. package/dist/index.d.ts +8 -0
  516. package/dist/index.d.ts.map +1 -1
  517. package/dist/index.js +24 -1
  518. package/dist/index.js.map +1 -1
  519. package/dist/tracking/ui/ExperimentCard.d.ts +1 -1
  520. package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -1
  521. package/dist/tracking/ui/ExperimentCard.js +26 -10
  522. package/dist/tracking/ui/ExperimentCard.js.map +1 -1
  523. package/dist/tracking/ui/card.d.ts +2 -2
  524. package/dist/tracking/ui/card.d.ts.map +1 -1
  525. package/dist/tracking/ui/card.js +2 -2
  526. package/dist/tracking/ui/card.js.map +1 -1
  527. package/dist/tracking/ui/readable.d.ts +14 -0
  528. package/dist/tracking/ui/readable.d.ts.map +1 -0
  529. package/dist/tracking/ui/readable.js +60 -0
  530. package/dist/tracking/ui/readable.js.map +1 -0
  531. package/dist/utils/fetch.d.ts +9 -2
  532. package/dist/utils/fetch.d.ts.map +1 -1
  533. package/dist/utils/fetch.js +6 -5
  534. package/dist/utils/fetch.js.map +1 -1
  535. package/dist/utils/lspClient.types.d.ts +2 -0
  536. package/dist/utils/lspClient.types.d.ts.map +1 -1
  537. package/dist/utils/websocket.d.ts +65 -2
  538. package/dist/utils/websocket.d.ts.map +1 -1
  539. package/dist/utils/websocket.js +276 -44
  540. package/dist/utils/websocket.js.map +1 -1
  541. package/package.json +14 -6
  542. package/.claude/CLAUDE.md +0 -317
  543. package/.tasks/EXPORT_EXPRESSION_BUILDER.md +0 -38
  544. package/.tasks/EXPRESSION_BUILDER_REPORT.md +0 -149
  545. package/.tasks/EXPRESSION_FIELD_SEAMS.md +0 -66
  546. package/.tasks/FIELD_STACK_REPORT.md +0 -234
  547. package/.tasks/FORM_ENGINE_COMPACT_READ_FIRST.md +0 -558
  548. package/.tasks/FORM_ENGINE_EXPRESSIONS.md +0 -197
  549. package/.tasks/FORM_ENGINE_OPTIONS_SYNC.md +0 -95
  550. package/.tasks/FORM_FIELD_EXTRAS.md +0 -72
  551. package/.tasks/INDEX.md +0 -111
  552. package/.tasks/LSP_SHARED_CONNECTION.md +0 -75
  553. package/.tasks/QONSOLE_ASSIST_FEATURES.md +0 -306
  554. package/.tasks/RENDER_EXPRESSION_LSP.md +0 -159
  555. package/.tasks/REQRAFT_AUTO_FIELD.md +0 -176
  556. package/.tasks/SCHEMA_DEFINITION_FIELD.md +0 -250
  557. package/.tasks/SMART_EDITOR_CONTEXT_AND_POLISH.md +0 -340
  558. package/.tasks/SMART_EDITOR_LSP_FEATURES.md +0 -299
  559. package/.tasks/SMART_EDITOR_REVIEW_FOLLOWUPS.md +0 -280
  560. package/.tasks/SMART_EDITOR_UX_POLISH.md +0 -383
  561. package/.tasks/SMART_EDITOR_VISUAL_POLISH.md +0 -246
  562. package/.tasks/STORY_NETWORK_ISOLATION.md +0 -98
  563. package/.tasks/TEMPLATE_TOKEN_GRAMMAR.md +0 -72
  564. package/CODE_OF_CONDUCT.md +0 -105
  565. package/CONTRIBUTING.MD +0 -78
  566. package/SECURITY.md +0 -3
  567. package/chromatic.config.json +0 -5
  568. package/design/COMPACT_ENGINE_REDESIGN.md +0 -156
  569. package/design/COMPACT_INFO_DISPLAY.md +0 -87
  570. package/design/COMPACT_PARITY.md +0 -85
  571. package/design/EXPRESSION_BUILDER_REPORT_STRATEGY.md +0 -92
  572. package/design/FORM_ENGINE_COMPACT.md +0 -300
  573. package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +0 -353
  574. package/design/FORM_ENGINE_EXPRESSIONS.md +0 -257
  575. package/design/FORM_ENGINE_FIELD_MIGRATION.md +0 -419
  576. package/design/IDE_INTEGRATION.md +0 -64
  577. package/design/RENDER_EXPRESSION_TRANSPORT.md +0 -156
  578. package/design/SELECT_DIALOG_FLOOR.md +0 -86
  579. package/design/SMART_EDITOR_UX.md +0 -438
  580. package/design/TRACKING.md +0 -290
  581. package/design/UNAVAILABLE_ALLOWED_VALUES.md +0 -226
  582. package/src/components/Description/index.tsx +0 -254
  583. package/src/components/Description/markdownRendererContext.tsx +0 -29
  584. package/src/components/FocusedEditing/index.tsx +0 -50
  585. package/src/components/codeSize/index.tsx +0 -79
  586. package/src/components/composer/Composer.stories.tsx +0 -238
  587. package/src/components/composer/Composer.tsx +0 -554
  588. package/src/components/composer/helpers.ts +0 -74
  589. package/src/components/composer/index.ts +0 -2
  590. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -1183
  591. package/src/components/dpqlEditor/DpqlEditor.tsx +0 -219
  592. package/src/components/dpqlEditor/dpqlHelpers.ts +0 -287
  593. package/src/components/dpqlEditor/dpqlInserter.ts +0 -121
  594. package/src/components/dpqlEditor/dpqlProbe.ts +0 -165
  595. package/src/components/dpqlEditor/dpqlTags.ts +0 -114
  596. package/src/components/dpqlEditor/index.ts +0 -41
  597. package/src/components/dpqlEditor/types.ts +0 -203
  598. package/src/components/dpqlEditor/useDpqlProbe.ts +0 -33
  599. package/src/components/dpqlEditor/useDpqlSession.ts +0 -411
  600. package/src/components/form/engine/CompactRow.tsx +0 -2620
  601. package/src/components/form/engine/CompactToolbar.tsx +0 -330
  602. package/src/components/form/engine/FormEngine.stories.tsx +0 -9920
  603. package/src/components/form/engine/FormEngine.tsx +0 -4569
  604. package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
  605. package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -331
  606. package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
  607. package/src/components/form/engine/OptionFieldMessages.tsx +0 -477
  608. package/src/components/form/engine/OptionsHelpDialog.tsx +0 -29
  609. package/src/components/form/engine/__fixtures__/basicFormOptions.ts +0 -309
  610. package/src/components/form/engine/__fixtures__/fieldChromeOptions.ts +0 -45
  611. package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +0 -233
  612. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +0 -742
  613. package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +0 -85
  614. package/src/components/form/engine/_structuredData/StructuredDataView.tsx +0 -75
  615. package/src/components/form/engine/_structuredData/structuredData.ts +0 -145
  616. package/src/components/form/engine/compactRowContext.ts +0 -148
  617. package/src/components/form/engine/compactRowStyles.ts +0 -898
  618. package/src/components/form/engine/compactToolbarContext.ts +0 -69
  619. package/src/components/form/engine/optionActions.ts +0 -128
  620. package/src/components/form/engine/optionsContext.ts +0 -24
  621. package/src/components/form/engine/readFirst.ts +0 -1077
  622. package/src/components/form/engine/rendererTypes.ts +0 -107
  623. package/src/components/form/engine/revealRow.ts +0 -123
  624. package/src/components/form/engine/rowFocus.ts +0 -101
  625. package/src/components/form/engine/rowMenuContext.ts +0 -159
  626. package/src/components/form/engine/rowOpenPicker.ts +0 -27
  627. package/src/components/form/engine/typeChoices.ts +0 -63
  628. package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +0 -159
  629. package/src/components/form/engine/variants/VariantCalmTable.tsx +0 -244
  630. package/src/components/form/engine/variants/VariantCards.tsx +0 -212
  631. package/src/components/form/engine/variants/VariantFocus.tsx +0 -382
  632. package/src/components/form/engine/variants/VariantMinimal.tsx +0 -170
  633. package/src/components/form/engine/variants/focusDemo.ts +0 -145
  634. package/src/components/form/engine/variants/variantModel.ts +0 -223
  635. package/src/components/form/engine/variants/variantParts.tsx +0 -313
  636. package/src/components/form/expressions/DpqlRendering.tsx +0 -85
  637. package/src/components/form/expressions/ExpressionField.stories.tsx +0 -1395
  638. package/src/components/form/expressions/ExpressionField.tsx +0 -503
  639. package/src/components/form/expressions/argumentPresence.ts +0 -213
  640. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +0 -1683
  641. package/src/components/form/expressions/builder/argumentDetail.tsx +0 -17
  642. package/src/components/form/expressions/builder/argumentLabel.tsx +0 -146
  643. package/src/components/form/expressions/builder/argumentSlot.tsx +0 -101
  644. package/src/components/form/expressions/builder/argumentWrapper.tsx +0 -243
  645. package/src/components/form/expressions/builder/confirmMismatchedTypesModal.tsx +0 -120
  646. package/src/components/form/expressions/builder/confirmUnsupportedTypeModal.tsx +0 -69
  647. package/src/components/form/expressions/builder/index.tsx +0 -1545
  648. package/src/components/form/expressions/builder/item.tsx +0 -89
  649. package/src/components/form/expressions/builder/moveToPositionStrip.tsx +0 -156
  650. package/src/components/form/expressions/builder/renderTemplate.tsx +0 -42
  651. package/src/components/form/expressions/dpqlMockLanguage.ts +0 -566
  652. package/src/components/form/expressions/dpqlMockLsp.ts +0 -126
  653. package/src/components/form/expressions/mockExpressions.ts +0 -317
  654. package/src/components/form/expressions/renderExpressionToText.ts +0 -137
  655. package/src/components/form/expressions/types.ts +0 -110
  656. package/src/components/form/expressions/useExpressions.ts +0 -101
  657. package/src/components/form/expressions/useRenderExpression.ts +0 -165
  658. package/src/components/form/fields/Field.stories.tsx +0 -143
  659. package/src/components/form/fields/Field.tsx +0 -732
  660. package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -297
  661. package/src/components/form/fields/array/ArrayAuto.tsx +0 -237
  662. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +0 -475
  663. package/src/components/form/fields/array/ArrayAutoField.tsx +0 -367
  664. package/src/components/form/fields/auto/AutoFormField.stories.tsx +0 -825
  665. package/src/components/form/fields/auto/AutoFormField.tsx +0 -1164
  666. package/src/components/form/fields/binary/Binary.stories.tsx +0 -122
  667. package/src/components/form/fields/binary/Binary.tsx +0 -91
  668. package/src/components/form/fields/boolean/Boolean.stories.tsx +0 -125
  669. package/src/components/form/fields/boolean/Boolean.tsx +0 -34
  670. package/src/components/form/fields/byte-size/ByteSize.stories.tsx +0 -87
  671. package/src/components/form/fields/byte-size/ByteSize.tsx +0 -58
  672. package/src/components/form/fields/color/Color.stories.tsx +0 -99
  673. package/src/components/form/fields/color/Color.tsx +0 -46
  674. package/src/components/form/fields/cron/Cron.stories.tsx +0 -68
  675. package/src/components/form/fields/cron/Cron.tsx +0 -80
  676. package/src/components/form/fields/date/Date.stories.tsx +0 -77
  677. package/src/components/form/fields/date/Date.tsx +0 -55
  678. package/src/components/form/fields/emittedValues.ts +0 -70
  679. package/src/components/form/fields/file/File.stories.tsx +0 -161
  680. package/src/components/form/fields/file/File.tsx +0 -227
  681. package/src/components/form/fields/long-string/LongString.stories.tsx +0 -120
  682. package/src/components/form/fields/long-string/LongString.tsx +0 -130
  683. package/src/components/form/fields/markdown/Markdown.stories.tsx +0 -76
  684. package/src/components/form/fields/markdown/Markdown.tsx +0 -81
  685. package/src/components/form/fields/markdown/MarkdownView.tsx +0 -222
  686. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +0 -139
  687. package/src/components/form/fields/number/Number.stories.tsx +0 -159
  688. package/src/components/form/fields/number/Number.tsx +0 -160
  689. package/src/components/form/fields/object/Object.stories.tsx +0 -398
  690. package/src/components/form/fields/object/Object.tsx +0 -255
  691. package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +0 -95
  692. package/src/components/form/fields/radio-group/RadioGroup.tsx +0 -46
  693. package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
  694. package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
  695. package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
  696. package/src/components/form/fields/rich-text/RichText.stories.tsx +0 -260
  697. package/src/components/form/fields/rich-text/RichText.tsx +0 -537
  698. package/src/components/form/fields/schema-definition/CatalogLeafForm.tsx +0 -242
  699. package/src/components/form/fields/schema-definition/CatalogNodeEditor.tsx +0 -758
  700. package/src/components/form/fields/schema-definition/Hint.tsx +0 -22
  701. package/src/components/form/fields/schema-definition/InlineValidationBanner.tsx +0 -138
  702. package/src/components/form/fields/schema-definition/Loader.tsx +0 -20
  703. package/src/components/form/fields/schema-definition/MigrationsTab.tsx +0 -187
  704. package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +0 -286
  705. package/src/components/form/fields/schema-definition/TableEditor.tsx +0 -155
  706. package/src/components/form/fields/schema-definition/TablesTab.tsx +0 -138
  707. package/src/components/form/fields/schema-definition/catalog.ts +0 -237
  708. package/src/components/form/fields/schema-definition/helpers.ts +0 -90
  709. package/src/components/form/fields/schema-definition/index.tsx +0 -418
  710. package/src/components/form/fields/schema-definition/mockCatalog.ts +0 -325
  711. package/src/components/form/fields/schema-definition/mockDefinition.ts +0 -111
  712. package/src/components/form/fields/schema-definition/referenceSuggestions.tsx +0 -152
  713. package/src/components/form/fields/schema-definition/starterTemplate.ts +0 -68
  714. package/src/components/form/fields/schema-definition/types.ts +0 -185
  715. package/src/components/form/fields/schema-definition/useSchemaOptionCatalog.ts +0 -49
  716. package/src/components/form/fields/select/Select.stories.tsx +0 -872
  717. package/src/components/form/fields/select/Select.tsx +0 -624
  718. package/src/components/form/fields/select/SelectCollection.tsx +0 -594
  719. package/src/components/form/fields/string/String.stories.tsx +0 -86
  720. package/src/components/form/fields/string/String.tsx +0 -43
  721. package/src/components/form/fields/template/ExampleValueModal.stories.tsx +0 -114
  722. package/src/components/form/fields/template/ExampleValueModal.tsx +0 -99
  723. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +0 -47
  724. package/src/components/form/fields/template/TemplateField.stories.tsx +0 -1121
  725. package/src/components/form/fields/template/TemplateField.tsx +0 -1717
  726. package/src/components/form/fields/template/TemplateText.tsx +0 -115
  727. package/src/components/form/fields/template/__fixtures__/longExampleValue.ts +0 -7
  728. package/src/components/form/fields/template/__fixtures__/multiLevelTemplates.json +0 -147
  729. package/src/components/form/fields/template/__fixtures__/templates.json +0 -83
  730. package/src/components/form/fields/timeout/Timeout.stories.tsx +0 -228
  731. package/src/components/form/fields/timeout/Timeout.tsx +0 -87
  732. package/src/components/form/fields/url/Url.stories.tsx +0 -94
  733. package/src/components/form/fields/url/Url.tsx +0 -85
  734. package/src/components/form/index.tsx +0 -47
  735. package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
  736. package/src/components/imageLightbox/ImageLightbox.tsx +0 -236
  737. package/src/components/imageLightbox/index.ts +0 -1
  738. package/src/components/log/Log.stories.tsx +0 -333
  739. package/src/components/log/Log.tsx +0 -285
  740. package/src/components/menu/Menu.stories.tsx +0 -155
  741. package/src/components/menu/Menu.tsx +0 -312
  742. package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +0 -797
  743. package/src/components/qonsoleSmartInput/QonsoleSmartInput.tsx +0 -105
  744. package/src/components/qonsoleSmartInput/index.ts +0 -16
  745. package/src/components/qonsoleSmartInput/qonsoleInserter.ts +0 -77
  746. package/src/components/qonsoleSmartInput/types.ts +0 -133
  747. package/src/components/qonsoleSmartInput/useQonsoleSession.ts +0 -124
  748. package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +0 -62
  749. package/src/components/searchFilterBar/SearchFilterBar.tsx +0 -144
  750. package/src/components/searchFilterBar/index.ts +0 -1
  751. package/src/components/smartEditor/MarkdownDoc.tsx +0 -190
  752. package/src/components/smartEditor/SmartEditor.stories.tsx +0 -475
  753. package/src/components/smartEditor/SmartEditor.tsx +0 -808
  754. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +0 -205
  755. package/src/components/smartEditor/helpers.ts +0 -217
  756. package/src/components/smartEditor/index.ts +0 -35
  757. package/src/components/smartEditor/styling.ts +0 -45
  758. package/src/components/smartEditor/types.ts +0 -211
  759. package/src/components/smartEditor/useLspAutocomplete.ts +0 -758
  760. package/src/components/smartEditor/useLspDiagnosticDecorations.ts +0 -125
  761. package/src/components/smartEditor/useLspHover.ts +0 -230
  762. package/src/components/smartEditor/useLspSemanticTokens.ts +0 -298
  763. package/src/components/smartEditor/useLspSession.ts +0 -231
  764. package/src/components/smartEditor/useLspSignatureHelp.ts +0 -198
  765. package/src/components/supportTicket/AttachmentChips.stories.tsx +0 -171
  766. package/src/components/supportTicket/AttachmentChips.tsx +0 -147
  767. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +0 -257
  768. package/src/components/supportTicket/InterfaceReferenceTags.tsx +0 -129
  769. package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -584
  770. package/src/components/supportTicket/ReferencePicker.tsx +0 -563
  771. package/src/components/supportTicket/TicketConversation.stories.tsx +0 -121
  772. package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
  773. package/src/components/supportTicket/TicketHeader.tsx +0 -247
  774. package/src/components/supportTicket/TicketMetaTags.stories.tsx +0 -103
  775. package/src/components/supportTicket/TicketMetaTags.tsx +0 -85
  776. package/src/components/supportTicket/TicketReplyBox.stories.tsx +0 -354
  777. package/src/components/supportTicket/TicketReplyBox.tsx +0 -150
  778. package/src/components/supportTicket/__fixtures__/kindMarks.ts +0 -28
  779. package/src/components/supportTicket/attachmentAccess.ts +0 -97
  780. package/src/components/supportTicket/fileToAttachment.ts +0 -24
  781. package/src/components/supportTicket/index.ts +0 -10
  782. package/src/components/supportTicket/meta.ts +0 -206
  783. package/src/components/supportTicket/ticketModel.ts +0 -131
  784. package/src/components/supportTicket/useLoadedImages.ts +0 -73
  785. package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -315
  786. package/src/components/ticketReferences/TicketReferences.tsx +0 -906
  787. package/src/components/ticketReferences/index.ts +0 -2
  788. package/src/components/ticketThread/TicketThread.stories.tsx +0 -829
  789. package/src/components/ticketThread/TicketThread.tsx +0 -719
  790. package/src/components/ticketThread/index.ts +0 -6
  791. package/src/contexts/FetchContext.tsx +0 -25
  792. package/src/contexts/ReqraftContext.tsx +0 -9
  793. package/src/contexts/StorageContext.tsx +0 -33
  794. package/src/global.d.ts +0 -4
  795. package/src/helpers/allowedValues.ts +0 -249
  796. package/src/helpers/choiceChip.ts +0 -227
  797. package/src/helpers/common.ts +0 -326
  798. package/src/helpers/dpqlDetection.ts +0 -209
  799. package/src/helpers/expressions.ts +0 -140
  800. package/src/helpers/optionUiTypes.ts +0 -199
  801. package/src/helpers/options.ts +0 -150
  802. package/src/helpers/providerValue.ts +0 -125
  803. package/src/helpers/scrollbar.ts +0 -32
  804. package/src/helpers/singleLineString.ts +0 -61
  805. package/src/helpers/templateItems.ts +0 -81
  806. package/src/helpers/templateText.ts +0 -350
  807. package/src/helpers/templates.ts +0 -602
  808. package/src/helpers/validations.ts +0 -2085
  809. package/src/hooks/useArgSchema.ts +0 -37
  810. package/src/hooks/useCoarsePointer.ts +0 -30
  811. package/src/hooks/useFetch/useFetch.stories.tsx +0 -379
  812. package/src/hooks/useFetch/useFetch.tsx +0 -154
  813. package/src/hooks/usePhoneViewport.ts +0 -34
  814. package/src/hooks/useQorusTypes.ts +0 -233
  815. package/src/hooks/useReqraftProperty.ts +0 -16
  816. package/src/hooks/useStorage/useStorage.stories.tsx +0 -168
  817. package/src/hooks/useStorage/useStorage.ts +0 -35
  818. package/src/hooks/useTemplates.ts +0 -123
  819. package/src/hooks/useValidation.ts +0 -9
  820. package/src/hooks/useWebSocket/useWebSocket.ts +0 -224
  821. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +0 -640
  822. package/src/hooks/useWhyDidYouUpdate.ts +0 -38
  823. package/src/index.tsx +0 -86
  824. package/src/providers/FetchProvider.tsx +0 -40
  825. package/src/providers/ReqraftProvider.tsx +0 -52
  826. package/src/providers/StorageProvider.tsx +0 -131
  827. package/src/stores/currentUser/currentUser.stories.tsx +0 -100
  828. package/src/stores/currentUser/currentUser.tsx +0 -94
  829. package/src/stories/Data/fileFieldArgSchema.json +0 -86
  830. package/src/stories/Tests/utils.ts +0 -320
  831. package/src/stories/storyNetwork.ts +0 -92
  832. package/src/stories/tracking.tsx +0 -206
  833. package/src/tracking/browser/attach.ts +0 -186
  834. package/src/tracking/browser/env.ts +0 -78
  835. package/src/tracking/core/consent.ts +0 -37
  836. package/src/tracking/core/engagement.ts +0 -47
  837. package/src/tracking/core/experiments.ts +0 -258
  838. package/src/tracking/core/hash.ts +0 -26
  839. package/src/tracking/core/ids.ts +0 -25
  840. package/src/tracking/core/observable.ts +0 -23
  841. package/src/tracking/core/queue.ts +0 -131
  842. package/src/tracking/core/sections.ts +0 -166
  843. package/src/tracking/core/storage.ts +0 -69
  844. package/src/tracking/core/tracker.ts +0 -417
  845. package/src/tracking/core/types.ts +0 -162
  846. package/src/tracking/core/utm.ts +0 -23
  847. package/src/tracking/index.ts +0 -72
  848. package/src/tracking/markup.ts +0 -17
  849. package/src/tracking/react/Experiment.tsx +0 -44
  850. package/src/tracking/react/TrackingProvider.tsx +0 -56
  851. package/src/tracking/react/hooks.ts +0 -106
  852. package/src/tracking/react/index.ts +0 -13
  853. package/src/tracking/testing.ts +0 -108
  854. package/src/tracking/ui/ExperimentCard.stories.tsx +0 -296
  855. package/src/tracking/ui/ExperimentCard.tsx +0 -667
  856. package/src/tracking/ui/ExperimentsOverlay.stories.tsx +0 -155
  857. package/src/tracking/ui/ExperimentsOverlay.tsx +0 -437
  858. package/src/tracking/ui/anchor.ts +0 -180
  859. package/src/tracking/ui/card.ts +0 -464
  860. package/src/tracking/ui/client.ts +0 -117
  861. package/src/tracking/ui/index.ts +0 -77
  862. package/src/tracking/ui/types.ts +0 -110
  863. package/src/tracking/ui/useExperimentsAdmin.ts +0 -103
  864. package/src/types/Form.ts +0 -29
  865. package/src/types.ts +0 -14
  866. package/src/utils/datetime.ts +0 -10
  867. package/src/utils/fetch.ts +0 -457
  868. package/src/utils/lspClient.ts +0 -711
  869. package/src/utils/lspClient.types.ts +0 -211
  870. package/src/utils/queryUnlessCancelled.ts +0 -28
  871. package/src/utils/websocket.ts +0 -293
  872. package/vite.config.ts +0 -58
  873. package/vitest.config.ts +0 -69
@@ -33,6 +33,42 @@ var __importStar = (this && this.__importStar) || function (mod) {
33
33
  __setModuleDefault(result, mod);
34
34
  return result;
35
35
  };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
36
72
  var __rest = (this && this.__rest) || function (s, e) {
37
73
  var t = {};
38
74
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -57,7 +93,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
57
93
  return (mod && mod.__esModule) ? mod : { "default": mod };
58
94
  };
59
95
  Object.defineProperty(exports, "__esModule", { value: true });
60
- exports.TemplateField = exports.isTemplateAwareUiType = exports.BuiltInTemplateAwareUiTypes = exports.TemplateDropdownSelector = exports.CustomMenuItems = exports.ComponentMap = exports.TemplatesListProps = exports.isValueTemplate = exports.getTemplateValue = exports.getTemplateKey = void 0;
96
+ exports.TemplateField = exports.isTemplateAwareUiType = exports.BuiltInTemplateAwareUiTypes = exports.TemplateDropdownSelector = exports.CustomMenuItems = exports.DEFAULT_VALUE_TABS_LABELS = exports.NO_TEMPLATES_ON_OFFER = exports.ComponentMap = exports.TemplatesListProps = exports.isValueTemplate = exports.getTemplateValue = exports.getTemplateKey = void 0;
61
97
  var react_1 = require("react");
62
98
  var jsx_runtime_1 = require("react/jsx-runtime");
63
99
  // Verbatim port of qorus-ide `src/components/Field/template.tsx` (774 LOC,
@@ -76,7 +112,6 @@ Object.defineProperty(exports, "getTemplateValue", { enumerable: true, get: func
76
112
  Object.defineProperty(exports, "isValueTemplate", { enumerable: true, get: function () { return templates_1.isValueTemplate; } });
77
113
  var dpqlDetection_1 = require("../../../../helpers/dpqlDetection");
78
114
  var templateItems_1 = require("../../../../helpers/templateItems");
79
- var markdownRendererContext_1 = require("../../../Description/markdownRendererContext");
80
115
  var validations_1 = require("../../../../helpers/validations");
81
116
  var useDpqlProbe_1 = require("../../../dpqlEditor/useDpqlProbe");
82
117
  var useQorusTypes_1 = require("../../../../hooks/useQorusTypes");
@@ -87,16 +122,21 @@ var builder_1 = require("../../expressions/builder");
87
122
  var ExpressionField_1 = require("../../expressions/ExpressionField");
88
123
  var useExpressions_1 = require("../../expressions/useExpressions");
89
124
  var AutoFormField_1 = require("../auto/AutoFormField");
90
- var Boolean_1 = __importDefault(require("../boolean/Boolean"));
125
+ var Boolean_1 = __importStar(require("../boolean/Boolean"));
91
126
  var Date_1 = require("../date/Date");
92
127
  var File_1 = require("../file/File");
93
128
  var LongString_1 = __importDefault(require("../long-string/LongString"));
94
- var Number_1 = __importDefault(require("../number/Number"));
129
+ var Number_1 = __importStar(require("../number/Number"));
95
130
  var ReadOnlyTemplateTag_1 = require("./ReadOnlyTemplateTag");
96
131
  var RichText_1 = require("../rich-text/RichText");
132
+ var TemplateBrowser_1 = require("./TemplateBrowser");
97
133
  var common_1 = require("../../../../helpers/common");
98
134
  var singleLineString_1 = require("../../../../helpers/singleLineString");
99
135
  var optionUiTypes_1 = require("../../../../helpers/optionUiTypes");
136
+ var qorusTypeCatalogue_1 = require("../../../../helpers/qorusTypeCatalogue");
137
+ var expressions_1 = require("../../../../helpers/expressions");
138
+ var templateCompletions_1 = require("../../../smartEditor/templateCompletions");
139
+ var writtenAsText_1 = require("./writtenAsText");
100
140
  var rowMenuContext_1 = require("../../engine/rowMenuContext");
101
141
  /**
102
142
  * How long the author must pause before typed text is sent to the DPQL
@@ -128,13 +168,15 @@ var LongStringField = function (_a) {
128
168
  var name = _a.name, onChange = _a.onChange, type = _a.type, level = _a.level, allowTemplates = _a.allowTemplates, rest = __rest(_a, ["name", "onChange", "type", "level", "allowTemplates"]);
129
169
  return ((0, jsx_runtime_1.jsx)(LongString_1.default, __assign({}, rest, { type: type, onChange: function (value) { return onChange === null || onChange === void 0 ? void 0 : onChange(name, value); } })));
130
170
  };
171
+ // `type` becomes the kind of number it holds: without it, a float field took every number for a
172
+ // whole one.
131
173
  var Number = function (_a) {
132
174
  var name = _a.name, onChange = _a.onChange, type = _a.type, level = _a.level, allowTemplates = _a.allowTemplates, rest = __rest(_a, ["name", "onChange", "type", "level", "allowTemplates"]);
133
- return ((0, jsx_runtime_1.jsx)(Number_1.default, __assign({}, rest, { onChange: function (value) { return onChange === null || onChange === void 0 ? void 0 : onChange(name, value); } })));
175
+ return ((0, jsx_runtime_1.jsx)(Number_1.default, __assign({}, rest, { type: (0, Number_1.numberKindOf)(type), onChange: function (value) { return onChange === null || onChange === void 0 ? void 0 : onChange(name, value); } })));
134
176
  };
135
177
  var BooleanField = function (_a) {
136
178
  var name = _a.name, onChange = _a.onChange, value = _a.value, type = _a.type, level = _a.level, allowTemplates = _a.allowTemplates, rest = __rest(_a, ["name", "onChange", "value", "type", "level", "allowTemplates"]);
137
- return ((0, jsx_runtime_1.jsx)(Boolean_1.default, __assign({}, rest, { checked: !!value, onChange: function (checked) { return onChange === null || onChange === void 0 ? void 0 : onChange(name, checked); } })));
179
+ return ((0, jsx_runtime_1.jsx)(Boolean_1.default, __assign({}, rest, { checked: (0, Boolean_1.yesNoShown)(value), onChange: function (checked) { return onChange === null || onChange === void 0 ? void 0 : onChange(name, checked); } })));
138
180
  };
139
181
  var DateField = function (_a) {
140
182
  var name = _a.name, onChange = _a.onChange, type = _a.type, level = _a.level, allowTemplates = _a.allowTemplates, rest = __rest(_a, ["name", "onChange", "type", "level", "allowTemplates"]);
@@ -148,6 +190,17 @@ var FileField = function (_a) {
148
190
  var name = _a.name, onChange = _a.onChange, type = _a.type, level = _a.level, allowTemplates = _a.allowTemplates, rest = __rest(_a, ["name", "onChange", "type", "level", "allowTemplates"]);
149
191
  return ((0, jsx_runtime_1.jsx)(File_1.ReqraftFileFormField, __assign({}, rest, { onChange: function (value) { return onChange === null || onChange === void 0 ? void 0 : onChange(name, value); } })));
150
192
  };
193
+ /** The box a value written as text is drawn in, by `textWidth` (see it). */
194
+ var FIELD_WIDTH_BOX = {
195
+ width: '150px',
196
+ maxWidth: '100%',
197
+ minWidth: 'fit-content',
198
+ };
199
+ var CONTENT_WIDTH_BOX = { width: 'auto', maxWidth: '100%', minWidth: 0 };
200
+ /** A value beside the offer of an expression: the row's room left of the offer, never narrower than a text field. */
201
+ var OFFER_BESIDE_VALUE_BOX = { flex: '1 1 150px', width: 'auto', minWidth: '150px' };
202
+ /** The editor in a `content` box: never narrower than a free text field. */
203
+ var CONTENT_WIDTH_EDITOR = { minWidth: '150px' };
151
204
  exports.ComponentMap = {
152
205
  string: LongStringField,
153
206
  number: Number,
@@ -162,6 +215,53 @@ exports.ComponentMap = {
162
215
  richtext: RichTextField,
163
216
  file: FileField,
164
217
  };
218
+ /** Why a field that takes templates offers none here: its context's catalogue has none of its type. */
219
+ exports.NO_TEMPLATES_ON_OFFER = 'No templates are offered here for this field.';
220
+ /** The keyboard a whole number or a number is typed on, on the Value tab. */
221
+ var TEXTABLE_INPUT_MODES = {
222
+ int: 'numeric',
223
+ integer: 'numeric',
224
+ softint: 'numeric',
225
+ number: 'decimal',
226
+ float: 'decimal',
227
+ softfloat: 'decimal',
228
+ softnumber: 'decimal',
229
+ };
230
+ exports.DEFAULT_VALUE_TABS_LABELS = {
231
+ value: 'Value',
232
+ expression: 'Expression',
233
+ visual: 'Visual',
234
+ template: 'Template',
235
+ expressionTooltip: 'Write an expression - it also takes templates',
236
+ visualTooltip: 'Build the expression visually',
237
+ templateTooltip: 'Choose a template',
238
+ cannotShowExpression: "This expression can't be shown as a value.",
239
+ conditionTooltip: 'Write the condition as an expression',
240
+ conditionVisualTooltip: 'Build the condition visually',
241
+ cannotShowCondition: "This condition can't be shown as a value.",
242
+ templateShownOn: function (tab) { return "A template is shown on the ".concat(tab, " tab, not here."); },
243
+ replaceWithAValue: 'Replace it with a value',
244
+ // the sentence starts with the first type
245
+ conversion: function (from, to) {
246
+ return "".concat(from.charAt(0).toUpperCase()).concat(from.slice(1), " is converted to ").concat(to, " when the value is used; a value that does not convert fails");
247
+ },
248
+ undo: 'Undo',
249
+ undoTooltip: function (text) { return "Keep \"".concat(text, "\" as a value instead"); },
250
+ expressionDraftNotUsed: 'The Expression tab holds text that does not parse, so the field keeps this value until it does.',
251
+ };
252
+ var DEFAULT_SAVED_VALUES_LABELS = {
253
+ save: 'Save this value',
254
+ saveTooltip: 'Save this value to use it again',
255
+ use: 'Use a saved value',
256
+ remove: 'Remove saved value',
257
+ };
258
+ /** A badge's words: its label, or the badge itself when it is a string or a number. */
259
+ var badgeText = function (badge) {
260
+ var label = badge !== null && typeof badge === 'object' && 'label' in badge ?
261
+ badge.label
262
+ : badge;
263
+ return typeof label === 'string' || typeof label === 'number' ? String(label) : undefined;
264
+ };
165
265
  var renderMenuActionRows = function (actions, closePopover, size) {
166
266
  return actions.items.map(function (item, index) {
167
267
  if ('isDivider' in item) {
@@ -215,12 +315,9 @@ exports.CustomMenuItems = (0, react_2.memo)(function (_a) {
215
315
  }) })));
216
316
  });
217
317
  exports.TemplateDropdownSelector = (0, react_2.memo)(function (_a) {
218
- var onItemSelect = _a.onItemSelect, onRemoveClick = _a.onRemoveClick, items = _a.items, templates = _a.templates, allowCustomValues = _a.allowCustomValues, hasOnlyAllowedValues = _a.hasOnlyAllowedValues, value = _a.value, size = _a.size, rest = __rest(_a, ["onItemSelect", "onRemoveClick", "items", "templates", "allowCustomValues", "hasOnlyAllowedValues", "value", "size"]);
219
- /* The LAST hop before Reqore, which is the only place a drawn description
220
- may be made: `filteredTemplates` upstream is a `JSON.stringify` memo key,
221
- and an element in it throws on its own circular owner. */
222
- var renderMarkdown = (0, markdownRendererContext_1.useMarkdownRenderer)();
223
- var shownItems = (0, react_2.useMemo)(function () { return (0, templateItems_1.renderTemplateItemDescriptions)((0, templateItems_1.templateItemsToShow)(items), renderMarkdown); }, [items, renderMarkdown]);
318
+ var onItemSelect = _a.onItemSelect, onRemoveClick = _a.onRemoveClick, items = _a.items, templates = _a.templates, allowCustomValues = _a.allowCustomValues, hasOnlyAllowedValues = _a.hasOnlyAllowedValues, value = _a.value, size = _a.size, templateBadge = _a.templateBadge, wholeRecords = _a.wholeRecords, rest = __rest(_a, ["onItemSelect", "onRemoveClick", "items", "templates", "allowCustomValues", "hasOnlyAllowedValues", "value", "size", "templateBadge", "wholeRecords"]);
319
+ /* The catalogue browsed: `TemplateBrowser` draws its descriptions at the hand-off to Reqore. */
320
+ var browsed = (0, react_2.useMemo)(function () { return ({ items: items }); }, [items]);
224
321
  // One resolver for every surface that names a reference — the picker chip
225
322
  // here, the read-only tag, and the compact row's expression summary. The
226
323
  // row and this editor must agree: a reference that reads as its path when
@@ -235,10 +332,10 @@ exports.TemplateDropdownSelector = (0, react_2.memo)(function (_a) {
235
332
  icon: 'ExchangeDollarLine',
236
333
  });
237
334
  }, [template]);
238
- // SEAM (reqraft): the IDE resolves the template's app/action via
239
- // `useGetAppActionData` and renders the action's display name as a badge
240
- // here — the app catalogue is IDE-only, so the badge is dropped.
241
- return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, children: [hasOnlyAllowedValues && ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { intent: 'warning', size: 'small', opaque: false, children: "This field has pre-defined allowed values, make sure the template you select is compatible with those" })), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreDropdown, __assign({ className: 'template-selector', customTheme: exports.TemplatesListProps.listCustomTheme, minimal: true, compact: true, onItemSelect: onItemSelect, items: shownItems, label: label, leftIconProps: leftIconProps, caretPosition: 'right', filterable: true, size: size }, exports.TemplatesListProps)), allowCustomValues || value ?
335
+ // SEAM (reqraft): where the template comes from (the IDE: the app action that captures it), as the
336
+ // host says, beside its name
337
+ var badge = template && templateBadge ? templateBadge(template) : undefined;
338
+ return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, children: [hasOnlyAllowedValues && ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { intent: 'warning', size: 'small', opaque: false, children: "This field has pre-defined allowed values, make sure the template you select is compatible with those" })), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, children: [(0, jsx_runtime_1.jsx)(TemplateBrowser_1.TemplateBrowser, __assign({ className: 'template-selector', customTheme: exports.TemplatesListProps.listCustomTheme, minimal: true, compact: true, onItemSelect: onItemSelect, templates: browsed, wholeRecords: wholeRecords, focusFilter: true, label: label, leftIconProps: leftIconProps, badge: badge, caretPosition: 'right', size: size }, exports.TemplatesListProps)), allowCustomValues || value ?
242
339
  (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { customTheme: exports.TemplatesListProps.listCustomTheme, fixed: true, icon: 'CloseLine', tooltip: 'Remove template value', minimal: true, className: 'template-remove', compact: true, size: size, onClick: onRemoveClick })
243
340
  : null] })] }));
244
341
  });
@@ -261,10 +358,10 @@ var isTemplateAwareUiType = function (uiType, extra) {
261
358
  };
262
359
  exports.isTemplateAwareUiType = isTemplateAwareUiType;
263
360
  var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
264
- var _b, _c, _d;
265
- var rowMenu = _a.rowMenu, value = _a.value, name = _a.name, onChange = _a.onChange, _e = _a.component, Comp = _e === void 0 ? AutoFormField_1.AutoFormField : _e, templates = _a.templates, interfaceContext = _a.interfaceContext, // eslint-disable-line @typescript-eslint/no-unused-vars
266
- _f = _a.allowTemplates, // eslint-disable-line @typescript-eslint/no-unused-vars
267
- allowTemplates = _f === void 0 ? true : _f, allowFunctions = _a.allowFunctions, allowTextExpressions = _a.allowTextExpressions, extraActions = _a.extraActions, componentOverrides = _a.componentOverrides, _g = _a.allowCustomValues, allowCustomValues = _g === void 0 ? true : _g, _h = _a.filterTemplatesByType, filterTemplatesByType = _h === void 0 ? true : _h, filterTemplatesFunc = _a.filterTemplatesFunc, componentFromType = _a.componentFromType, isFunction = _a.isFunction, isDefaultFunction = _a.isDefaultFunction, isDefaultTemplate = _a.isDefaultTemplate, returnType = _a.returnType, level = _a.level, className = _a.className, menuItems = _a.menuItems, menuActions = _a.menuActions, menuTrailingItems = _a.menuTrailingItems, reorder = _a.reorder, label = _a.label, rest = __rest(_a, ["rowMenu", "value", "name", "onChange", "component", "templates", "interfaceContext", "allowTemplates", "allowFunctions", "allowTextExpressions", "extraActions", "componentOverrides", "allowCustomValues", "filterTemplatesByType", "filterTemplatesFunc", "componentFromType", "isFunction", "isDefaultFunction", "isDefaultTemplate", "returnType", "level", "className", "menuItems", "menuActions", "menuTrailingItems", "reorder", "label"]);
361
+ var _b, _c, _d, _e, _f, _g;
362
+ var rowMenu = _a.rowMenu, value = _a.value, name = _a.name, onChange = _a.onChange, _h = _a.component, Comp = _h === void 0 ? AutoFormField_1.AutoFormField : _h, templates = _a.templates, interfaceContext = _a.interfaceContext, // eslint-disable-line @typescript-eslint/no-unused-vars
363
+ _j = _a.allowTemplates, // eslint-disable-line @typescript-eslint/no-unused-vars
364
+ allowTemplates = _j === void 0 ? true : _j, allowFunctions = _a.allowFunctions, allowTextExpressions = _a.allowTextExpressions, valueTabs = _a.valueTabs, valueTabsLabels = _a.valueTabsLabels, expressionModeLabels = _a.expressionModeLabels, _k = _a.textWidth, textWidth = _k === void 0 ? 'field' : _k, savedValues = _a.savedValues, templateBadge = _a.templateBadge, extraActions = _a.extraActions, componentOverrides = _a.componentOverrides, _l = _a.allowCustomValues, allowCustomValues = _l === void 0 ? true : _l, _m = _a.filterTemplatesByType, filterTemplatesByType = _m === void 0 ? true : _m, filterTemplatesFunc = _a.filterTemplatesFunc, componentFromType = _a.componentFromType, isFunction = _a.isFunction, isDefaultFunction = _a.isDefaultFunction, isDefaultTemplate = _a.isDefaultTemplate, returnType = _a.returnType, level = _a.level, className = _a.className, menuItems = _a.menuItems, menuActions = _a.menuActions, menuTrailingItems = _a.menuTrailingItems, reorder = _a.reorder, label = _a.label, rest = __rest(_a, ["rowMenu", "value", "name", "onChange", "component", "templates", "interfaceContext", "allowTemplates", "allowFunctions", "allowTextExpressions", "valueTabs", "valueTabsLabels", "expressionModeLabels", "textWidth", "savedValues", "templateBadge", "extraActions", "componentOverrides", "allowCustomValues", "filterTemplatesByType", "filterTemplatesFunc", "componentFromType", "isFunction", "isDefaultFunction", "isDefaultTemplate", "returnType", "level", "className", "menuItems", "menuActions", "menuTrailingItems", "reorder", "label"]);
268
365
  var qorusTypes = (0, useQorusTypes_1.useQorusTypes)();
269
366
  var functions = (0, useExpressions_1.useExpressions)({
270
367
  allow: !!allowFunctions,
@@ -291,7 +388,7 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
291
388
  }
292
389
  var result = templates;
293
390
  if (filterTemplatesByType) {
294
- result = (0, templates_1.filterTemplatesByType)(templates, type, !!rest.arg_schema);
391
+ result = (0, templates_1.filterTemplatesByType)(templates, type, !!rest.arg_schema, qorusTypes.value, rest.base_type);
295
392
  }
296
393
  if (filterTemplatesFunc) {
297
394
  result = filterTemplatesFunc(result);
@@ -317,7 +414,19 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
317
414
  filterTemplatesByType,
318
415
  JSON.stringify(rest.arg_schema),
319
416
  filterTemplatesFunc,
417
+ qorusTypes.value,
418
+ rest.base_type,
320
419
  ]);
420
+ /* Where each template comes from, as the host says (`templateBadge`): the template picker showed it beside
421
+ the template held, and the lists of templates the value's text and an expression's text open show it in
422
+ the template's row - a text field's templates are picked there, not on a tab of their own (qorus#646). */
423
+ var sourceOfTemplate = (0, react_2.useMemo)(function () {
424
+ return templateBadge ?
425
+ function (template) { return badgeText(templateBadge(template)); }
426
+ : undefined;
427
+ }, [templateBadge]);
428
+ var listedTemplates = (0, react_2.useMemo)(function () { return (0, templateCompletions_1.withTemplateSources)(filteredTemplates, sourceOfTemplate); }, [filteredTemplates, sourceOfTemplate]);
429
+ var listedCatalogue = (0, react_2.useMemo)(function () { return (0, templateCompletions_1.withTemplateSources)(templates, sourceOfTemplate); }, [templates, sourceOfTemplate]);
321
430
  // An `any`-typed field has no editor of its own until a concrete type is
322
431
  // chosen, so it opened on the TYPE PICKER: before an author could say what
323
432
  // they meant, they had to answer a question about storage — "is this a Text
@@ -342,6 +451,10 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
342
451
  // picker and stayed there. A pick-only field (no custom values) is in
343
452
  // template mode regardless, by the `!allowCustomValues` term.
344
453
  var typeIsAnyLike = (0, optionUiTypes_1.isUntypedOptionType)(type);
454
+ /* a field of any type or a hash takes a record whole: a record and a Qog state's data are offered whole as well
455
+ as opened (qorus#646, David's review); a scalar field's are only opened */
456
+ var takesRecords = typeIsAnyLike ||
457
+ (0, qorusTypeCatalogue_1.qorusTypeTakesRecords)(qorusTypes.value, type, rest.base_type);
345
458
  /* An EMPTY field, for the purpose of offering the template selector.
346
459
 
347
460
  `null` is deliberately not empty. It is the DPQL null literal — a value
@@ -369,21 +482,82 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
369
482
  /** Where this field lands when it is empty: an untyped one in template mode — see above. */
370
483
  var emptyLandsOnTemplates = typeIsAnyLike && (hasTemplatesOnOffer || (!!allowCustomValues && !hasOnlyAllowedValues));
371
484
  var opensOnTemplates = isEmptyValue && emptyLandsOnTemplates;
372
- var _j = (0, react_2.useState)((isDefaultTemplate || (0, templates_1.isValueTemplate)(value) || !allowCustomValues || opensOnTemplates) &&
373
- allowTemplates), isTemplateState = _j[0], setIsTemplate = _j[1];
485
+ /* An untyped field holding null is written in the same text field, as `null`: the editor an untyped
486
+ field otherwise falls to drew null as an empty box, the same as a field holding nothing, so the
487
+ author could not tell the two apart (qorus#646). */
488
+ var nullWrittenAsText = value === null && typeIsAnyLike && !!allowCustomValues && !hasOnlyAllowedValues;
489
+ /* The tabs a value is entered on (qorus#646, David): Value · Expression · Visual where the field takes
490
+ templates and expressions written as text, Value · Template where it takes templates only, none where
491
+ it takes no templates. One value, three views: see `selectTab`. */
492
+ var valueTabIsText = (0, writtenAsText_1.isWrittenAsTextOnTheValueTab)(type) && !hasOnlyAllowedValues;
493
+ var tabsKind = !valueTabs || !allowTemplates || editorHandlesTemplates || rest.arg_schema ? undefined
494
+ : allowFunctions && allowTextExpressions && !hasOnlyAllowedValues ? 'full'
495
+ : 'template';
496
+ /** The value is an expression (its AST), as the host says. */
497
+ var valueIsExpression = !!(isFunction || isDefaultFunction) && value !== null && typeof value === 'object';
498
+ /** An expression that is nothing but one template (`value($record:{pos})`, as a host may hold a reference to
499
+ * a field): the Value tab shows it as that template, where it can show no other expression (qorus#646). */
500
+ var expressionTemplate = valueIsExpression ? (0, writtenAsText_1.templateOfExpression)(value) : undefined;
501
+ /** Where a saved value opens: an expression on Expression; a template on Value where it is written as
502
+ * text, else on Expression (or Template, for a template-only field); anything else on Value. */
503
+ var _o = (0, react_2.useState)(function () {
504
+ if (!tabsKind)
505
+ return 'value';
506
+ if (valueIsExpression)
507
+ return tabsKind === 'full' ? 'expression' : 'value';
508
+ if (typeof value === 'string' && (0, templates_1.isValueTemplate)(value) && !valueTabIsText) {
509
+ return tabsKind === 'full' ? 'expression' : 'template';
510
+ }
511
+ return 'value';
512
+ }), tab = _o[0], setTab = _o[1];
513
+ var opensInExpressionText = tabsKind === 'full' && tab === 'expression' && !valueIsExpression;
514
+ var tabsKindRef = (0, react_2.useRef)(tabsKind);
515
+ tabsKindRef.current = tabsKind;
516
+ /** What the Text view is seeded with when the value is not an expression yet; null outside it. */
517
+ var _p = (0, react_2.useState)(opensInExpressionText ? (0, writtenAsText_1.expressionTextOfValue)(value) : null), expressionSeed = _p[0], setExpressionSeed = _p[1];
518
+ /* What the author wrote on the Expression tab that the field does not hold (it did not parse), and the value
519
+ it was written over. The tab's editor goes when the tab is left; the next visit shows the text as it was
520
+ written while the field still holds that value, not the value written out (qorus#646). */
521
+ var expressionDraft = (0, react_2.useRef)(null);
522
+ var valueRef = (0, react_2.useRef)(value);
523
+ valueRef.current = value;
524
+ var handleExpressionDraft = (0, react_2.useCallback)(function (text) {
525
+ expressionDraft.current = text === undefined ? null : { text: text, over: valueRef.current };
526
+ }, []);
527
+ /** The draft the Expression tab's editor is given back on this visit; null when there is none. */
528
+ var _q = (0, react_2.useState)(null), expressionDraftText = _q[0], setExpressionDraftText = _q[1];
529
+ /** Whether the Expression tab was left with a draft (see the Value tab's note); read with the value it holds. */
530
+ var _r = (0, react_2.useState)(false), leftWithDraft = _r[0], setLeftWithDraft = _r[1];
531
+ var hasExpressionDraft = leftWithDraft && !!expressionDraft.current && (0, lodash_1.isEqual)(expressionDraft.current.over, value);
532
+ var _s = (0, react_2.useState)(tabsKind ?
533
+ tab === 'template' || (tab === 'value' && valueTabIsText)
534
+ : (isDefaultTemplate ||
535
+ (0, templates_1.isValueTemplate)(value) ||
536
+ !allowCustomValues ||
537
+ opensOnTemplates ||
538
+ nullWrittenAsText) &&
539
+ !!allowTemplates), isTemplateState = _s[0], setIsTemplate = _s[1];
374
540
  var isTemplate = editorHandlesTemplates ? false : isTemplateState;
375
- var _k = (0, react_2.useState)(!!isDefaultFunction && !!allowFunctions), internalIsFunction = _k[0], setInternalIsFunction = _k[1];
376
- var _l = (0, react_2.useState)(value), templateValue = _l[0], setTemplateValue = _l[1];
541
+ var _t = (0, react_2.useState)(tabsKind ? tab === 'expression' || tab === 'visual' : !!isDefaultFunction && !!allowFunctions), internalIsFunction = _t[0], setInternalIsFunction = _t[1];
542
+ var _u = (0, react_2.useState)(value), templateValue = _u[0], setTemplateValue = _u[1];
377
543
  // Typed text that turned out to be an expression the author may accept.
378
- var _m = (0, react_2.useState)(null), dpqlOffer = _m[0], setDpqlOffer = _m[1];
544
+ var _v = (0, react_2.useState)(null), dpqlOffer = _v[0], setDpqlOffer = _v[1];
379
545
  // The literal this field held before typed text switched it into
380
546
  // expression mode — kept so the switch is undoable, and so the editor
381
547
  // opens on the Text view the author was already writing in.
382
- var _o = (0, react_2.useState)(null), expressionFromText = _o[0], setExpressionFromText = _o[1];
548
+ var _w = (0, react_2.useState)(null), expressionFromText = _w[0], setExpressionFromText = _w[1];
549
+ /* The view the expression editor (without value tabs) is on. It opens on Text (qorus#646, David); when it
550
+ is mounted again - an expression removed in Visual and put back empty by its host, as a row rule's
551
+ condition is - it opens where the author was, not back on Text. */
552
+ var _x = (0, react_2.useState)('text'), expressionMode = _x[0], setExpressionMode = _x[1];
383
553
  // Texts the author has said no to. Without this, dismissing an offer (or
384
554
  // undoing a switch) would re-detect the same text on the next render and
385
555
  // ask again forever.
386
556
  var declinedTexts = (0, react_2.useRef)(new Set());
557
+ /* What detection found for each text: the server's expression, and whether the text could stay a value of
558
+ the field's type ('offer') or could not ('switch'). An undone switch is asked about again (see
559
+ `undoExpressionFromText`), so the expression it would become is kept here. */
560
+ var detectedTexts = (0, react_2.useRef)(new Map());
387
561
  var detectTimer = (0, react_2.useRef)(null);
388
562
  var probeDpql = (0, useDpqlProbe_1.useDpqlProbe)();
389
563
  var effectiveIsFunction = isFunction || internalIsFunction;
@@ -392,6 +566,12 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
392
566
  if (isTemplate && (0, templates_1.isValueTemplate)(value)) {
393
567
  setTemplateValue(value);
394
568
  }
569
+ /* Emptied from outside the editor - the card's "Clear value", an undo, a host's reset - the text the
570
+ value is written in is emptied too. It kept its own copy, so a cleared value went on showing what it
571
+ had held (qorus#646: "Clear value" had no effect). The editor's own emptying sets this already. */
572
+ if (isEmptyValue && templateValue) {
573
+ setTemplateValue(null);
574
+ }
395
575
  }, [JSON.stringify(value)]);
396
576
  /* Clearing an untyped field returns it to the template selector, which is
397
577
  where mounting it empty already lands.
@@ -450,8 +630,19 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
450
630
  setIsTemplate(false);
451
631
  }
452
632
  }, [allowCustomValues]);
633
+ // null arriving later (written in the Text tab, say) is written in the text field too - see above
634
+ (0, react_2.useEffect)(function () {
635
+ if (!isTemplate && nullWrittenAsText && allowTemplates) {
636
+ setTemplateValue(null);
637
+ setIsTemplate(true);
638
+ }
639
+ }, [nullWrittenAsText, allowTemplates]);
453
640
  (0, react_2.useEffect)(function () {
454
- if (!isTemplate && (0, templates_1.isValueTemplate)(value) && allowTemplates) {
641
+ // a template on the Expression tab stays there: it is the expression editor's to show
642
+ if (!isTemplate &&
643
+ (0, templates_1.isValueTemplate)(value) &&
644
+ allowTemplates &&
645
+ !(tabsKind && internalIsFunction)) {
455
646
  // In auto mode, leave user-typed dollar-strings alone ('$foo: hello'
456
647
  // passes the loose check) — but a string that IS one well-formed token
457
648
  // ($data:{…}, $config:item) must still flip into template mode, or an
@@ -478,20 +669,25 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
478
669
  // When template key or template value change run the onChange function
479
670
  (0, react_use_1.useUpdateEffect)(function () {
480
671
  if (templateValue) {
481
- onChange === null || onChange === void 0 ? void 0 : onChange(name, templateValue, type, effectiveIsFunction);
672
+ /* On the tabs this text is the Value or the Template tab's - a value, never an expression -
673
+ whichever tab is open by the time it arrives: an edit sent as its field goes away (the tab
674
+ switched straight after it) arrives on the next tab (qorus#646). */
675
+ var asExpression = tabsKindRef.current ? false : effectiveIsFunction;
676
+ /* Read from the text where the field is written as text: a lone template takes its own
677
+ type in an untyped field, a scalar's literal is that literal, other text is text. The Value
678
+ tab's text is the value written as text too, even where the field takes no value of the
679
+ author's own (an untyped field's templates are picked there: qorus#646). */
680
+ if (templateSupportsCustomValues || (tabsKindRef.current && valueTabIsText)) {
681
+ var read = (0, writtenAsText_1.templateTextValue)(templateValue, type, filteredTemplates);
682
+ onChange === null || onChange === void 0 ? void 0 : onChange(name, read.value, read.type, asExpression);
683
+ return;
684
+ }
685
+ onChange === null || onChange === void 0 ? void 0 : onChange(name, templateValue, type, asExpression);
482
686
  }
483
687
  }, [JSON.stringify(templateValue)]);
484
688
  // an editor that takes templates into its own text has no template mode to switch to: "Use Template"
485
689
  // there emptied the field and showed nothing in its place
486
690
  var showTemplateToggle = allowCustomValues && allowTemplates && !rest.arg_schema && !editorHandlesTemplates;
487
- // Only a BRACED context ref (`$data:{…}` — machine-written, nobody types
488
- // one) renders as the picker chip (named via `resolveTemplateLabel`)
489
- // rather than as its raw text in a string editor. Plain word-path tokens
490
- // (`$local:id`) are typeable, so per the build #123 review they keep the
491
- // input that offers templates while typing. Mixed text-and-token strings
492
- // keep the string editor too; the chip-in-editor treatment arrives with
493
- // the rich-text string mode.
494
- var templateValueIsBracedToken = (0, templates_1.isBracedTemplateToken)(templateValue);
495
691
  /* An UNTYPED field can be typed into as well as picked from.
496
692
 
497
693
  Template mode has a typable editor whenever the field's type can hold
@@ -507,9 +703,16 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
507
703
  specific to that field: every empty untyped field with templates on
508
704
  offer got the same downgrade. The editor still offers the same templates
509
705
  on focus, so nothing is lost by being able to type as well. */
510
- var templateSupportsCustomValues = allowCustomValues && (type === 'string' || typeIsAnyLike) && !hasOnlyAllowedValues;
706
+ /* And so can a scalar: a whole number, a number or a yes/no is written as text too
707
+ (qorus#646). A template chosen into it is a chip in that text, not a pick-only
708
+ control that holds the template and nothing else, so text can be written around it;
709
+ what the field then holds is read from the text (writtenAsText). A date keeps its
710
+ date control. */
711
+ var templateSupportsCustomValues = allowCustomValues && (0, writtenAsText_1.isWrittenAsText)(type) && !hasOnlyAllowedValues;
511
712
  var showTemplatesDropdown = allowTemplates && (!allowCustomValues || (isTemplate && !templateSupportsCustomValues));
512
713
  var hasOnlyExpressions = !allowCustomValues && !allowTemplates && allowFunctions;
714
+ /** A date field with templates on offer: they are offered beside its date control. */
715
+ var dateTakesTemplates = type === 'date' && !!allowTemplates && hasTemplatesOnOffer && !hasOnlyAllowedValues;
513
716
  // True when some input control renders besides the ⋮ menu. When nothing
514
717
  // does (an empty `any` field: custom values are disallowed and the value's
515
718
  // type is picked FROM the menu), the menu trigger is the field's only
@@ -529,8 +732,11 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
529
732
  /* Emptying the text leaves the field where an empty field lands. For
530
733
  an untyped field that is THIS editor: switching to custom mode here
531
734
  mounted a different editor in its place, so deleting the last
532
- character lost the cursor. */
533
- if (!(emptyLandsOnTemplates && allowTemplates)) {
735
+ character lost the cursor. A field written as text (a whole number, a
736
+ number, a yes/no) is the same: deleting the template in it left a
737
+ different, empty editor in its place, and what was typed next went
738
+ nowhere. */
739
+ if (!((emptyLandsOnTemplates || templateSupportsCustomValues) && allowTemplates)) {
534
740
  setIsTemplate(false);
535
741
  }
536
742
  setTemplateValue(null);
@@ -539,13 +745,14 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
539
745
  else {
540
746
  setTemplateValue(val);
541
747
  }
542
- }, [name, onChange, emptyLandsOnTemplates, allowTemplates]);
748
+ }, [name, onChange, emptyLandsOnTemplates, templateSupportsCustomValues, allowTemplates]);
543
749
  var handleTemplateTextChange = (0, react_2.useCallback)(function (val) { return handleTemplateFieldChange(name, typeof val === 'string' ? val : ''); }, [handleTemplateFieldChange, name]);
544
750
  var handleSelectTemplateFromList = (0, react_2.useCallback)(
545
751
  // If the field has allowed values and supports templates, we do not want to overwrite the field type with the template type
546
752
  function (item) {
547
753
  // If the template type is richtext, we need to wrap the template value in the richtext template format
548
- var value = item.badge === 'richtext' ?
754
+ // the template's type (`templateType`): a list's badge is its type's name
755
+ var value = (0, templates_1.templateType)(item) === 'richtext' ?
549
756
  [
550
757
  {
551
758
  type: 'paragraph',
@@ -571,11 +778,20 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
571
778
  },
572
779
  ]
573
780
  : item.value;
574
- onChange(name, value, hasOnlyAllowedValues ? type : item.badge);
781
+ onChange(name, value, hasOnlyAllowedValues ? type : (0, templates_1.templateType)(item));
575
782
  }, [name, onChange]);
576
783
  // SEAM (reqraft): the IDE computes `canSaveValue` here and renders a
577
784
  // `SaveValueButton` in the controls menu — the saved-values storage is
578
785
  // IDE-only, so the menu item is dropped (`allowSaving` is inert).
786
+ /* A template chosen beside a date control is the value at once, IN the template control: handed to
787
+ the form while the field was still drawing its date control, the reference reached the date
788
+ picker first, which threw on it ("Invalid ISO 8601 date time string"). */
789
+ var handleSelectDateTemplate = (0, react_2.useCallback)(function (item) {
790
+ if (typeof (item === null || item === void 0 ? void 0 : item.value) !== 'string')
791
+ return;
792
+ setIsTemplate(true);
793
+ setTemplateValue(item.value);
794
+ }, []);
579
795
  var handleRemoveTemplateClick = (0, react_2.useCallback)(function () {
580
796
  /* This is the `×` ON the template control, and it means "I do not want a
581
797
  template here" — on a field whose menu offers no `Set Custom Value` it
@@ -631,6 +847,146 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
631
847
  onChange === null || onChange === void 0 ? void 0 : onChange(name, undefined);
632
848
  }
633
849
  }, [name, onChange, value, templateValue]);
850
+ /* One value, three views (qorus#646, David). Value → Expression writes the literal or template as
851
+ expression text, emitting nothing until it is edited. Expression ↔ Visual is the editor's own toggle.
852
+ Expression → Value converts only a literal or a lone template; any other expression stays, and the
853
+ Value tab says it cannot show it and offers to replace it. Nothing is lost silently. */
854
+ /** Reads the Expression tab's text typed and not yet read (see `ExpressionField.flushRef`). */
855
+ var expressionFlush = (0, react_2.useRef)(null);
856
+ var selectTab = (0, react_2.useCallback)(function (next) { return __awaiter(void 0, void 0, void 0, function () {
857
+ var flushed, _a, envelope, template, literal, draft, keepsDraft;
858
+ var _b;
859
+ return __generator(this, function (_c) {
860
+ switch (_c.label) {
861
+ case 0:
862
+ if (next === tab)
863
+ return [2 /*return*/];
864
+ if (!(tab === 'expression')) return [3 /*break*/, 2];
865
+ return [4 /*yield*/, ((_b = expressionFlush.current) === null || _b === void 0 ? void 0 : _b.call(expressionFlush))];
866
+ case 1:
867
+ _a = _c.sent();
868
+ return [3 /*break*/, 3];
869
+ case 2:
870
+ _a = undefined;
871
+ _c.label = 3;
872
+ case 3:
873
+ flushed = _a;
874
+ // left with text that did not parse: the Value tab says the field keeps its value
875
+ setLeftWithDraft(tab === 'expression' && !flushed && !!expressionDraft.current);
876
+ envelope = flushed !== null && flushed !== void 0 ? flushed : (valueIsExpression ? { is_expression: true, value: value } : undefined);
877
+ if (next === 'value' || next === 'template') {
878
+ if (envelope) {
879
+ template = (0, writtenAsText_1.loneTemplateOf)(envelope);
880
+ literal = template === undefined ? (0, writtenAsText_1.loneValueOf)(envelope) : undefined;
881
+ if (template !== undefined) {
882
+ setTemplateValue(template);
883
+ onChange === null || onChange === void 0 ? void 0 : onChange(name, template, type, false);
884
+ }
885
+ else if (literal !== undefined) {
886
+ setTemplateValue((0, writtenAsText_1.valueTextOf)(literal.value, type) || null);
887
+ onChange === null || onChange === void 0 ? void 0 : onChange(name, literal.value, type, false);
888
+ }
889
+ }
890
+ setInternalIsFunction(false);
891
+ setExpressionFromText(null);
892
+ setIsTemplate(next === 'template' || valueTabIsText);
893
+ }
894
+ else {
895
+ /* The seed is the value written as text while it is not an expression yet. One that is shows itself:
896
+ a seed left from an earlier visit was shown in its place - the value as it was opened, not the
897
+ expression written since - and leaving the tab saved it (qorus#646). */
898
+ setExpressionSeed(!flushed && !valueIsExpression ? (0, writtenAsText_1.expressionTextOfValue)(value) : null);
899
+ draft = expressionDraft.current;
900
+ keepsDraft = !flushed && !!draft && (0, lodash_1.isEqual)(draft.over, value);
901
+ if (!keepsDraft)
902
+ expressionDraft.current = null;
903
+ setExpressionDraftText(keepsDraft ? draft.text : null);
904
+ setInternalIsFunction(true);
905
+ }
906
+ setTab(next);
907
+ return [2 /*return*/];
908
+ }
909
+ });
910
+ }); }, [tab, valueIsExpression, value, name, onChange, type, valueTabIsText]);
911
+ /** Replace what a tab cannot show with an empty value of its own kind. */
912
+ var replaceWithAValue = (0, react_2.useCallback)(function () {
913
+ setInternalIsFunction(false);
914
+ setTemplateValue(null);
915
+ setExpressionSeed(null);
916
+ onChange === null || onChange === void 0 ? void 0 : onChange(name, undefined, type, false);
917
+ }, [name, onChange, type]);
918
+ /* A saved value is the value at once, shown where its kind is: a template on the Value tab where the
919
+ field is written as text, else on the Expression tab (or Template, for a template-only field); any
920
+ other value on the Value tab - or, without tabs, in template mode for a template. */
921
+ var takeSavedValue = (0, react_2.useCallback)(function (saved) {
922
+ var isSavedTemplate = typeof saved === 'string' && (0, templates_1.isValueTemplate)(saved);
923
+ setExpressionFromText(null);
924
+ setTemplateValue(typeof saved === 'string' ? saved : null);
925
+ if (tabsKindRef.current) {
926
+ var next = isSavedTemplate && !valueTabIsText ?
927
+ tabsKindRef.current === 'full' ?
928
+ 'expression'
929
+ : 'template'
930
+ : 'value';
931
+ setExpressionSeed(next === 'expression' ? (0, writtenAsText_1.expressionTextOfValue)(saved) : null);
932
+ setInternalIsFunction(next === 'expression');
933
+ setIsTemplate(next === 'template' || (next === 'value' && valueTabIsText));
934
+ setTab(next);
935
+ }
936
+ else {
937
+ setExpressionSeed(null);
938
+ setInternalIsFunction(false);
939
+ setIsTemplate(isSavedTemplate && !!allowTemplates);
940
+ }
941
+ onChange === null || onChange === void 0 ? void 0 : onChange(name, saved, type, false);
942
+ }, [name, onChange, type, valueTabIsText, allowTemplates]);
943
+ // the values saved for this field's type, and whether this value can be saved
944
+ var savedWords = __assign(__assign({}, DEFAULT_SAVED_VALUES_LABELS), savedValues === null || savedValues === void 0 ? void 0 : savedValues.labels);
945
+ var savedForType = (0, react_2.useMemo)(function () { var _a; return ((_a = savedValues === null || savedValues === void 0 ? void 0 : savedValues.items) !== null && _a !== void 0 ? _a : []).filter(function (item) { return item.type === type; }); }, [savedValues === null || savedValues === void 0 ? void 0 : savedValues.items, type]);
946
+ var editable = !rest.readonly && !rest.readOnly && !rest.disabled;
947
+ var canSaveValue = !!(savedValues === null || savedValues === void 0 ? void 0 : savedValues.onSave) &&
948
+ editable &&
949
+ type !== 'bool' &&
950
+ type !== 'boolean' &&
951
+ !hasOnlyAllowedValues &&
952
+ !valueIsExpression &&
953
+ !isEmptyValue &&
954
+ value !== null;
955
+ var canUseSavedValue = editable && savedForType.length > 0;
956
+ var savedValueItems = __spreadArray(__spreadArray([], (canSaveValue ?
957
+ [
958
+ {
959
+ label: savedWords.save,
960
+ icon: 'SaveLine',
961
+ tooltip: savedWords.saveTooltip,
962
+ className: 'save-value',
963
+ onClick: function () { return savedValues.onSave(value, type); },
964
+ },
965
+ ]
966
+ : []), true), (canUseSavedValue ?
967
+ [
968
+ {
969
+ label: savedWords.use,
970
+ icon: 'HistoryLine',
971
+ className: 'use-saved-value',
972
+ items: savedForType.map(function (item) { return (__assign({ label: item.label, description: item.description, className: 'saved-value', onClick: function () { return takeSavedValue(item.value); } }, ((savedValues === null || savedValues === void 0 ? void 0 : savedValues.onRemove) ?
973
+ {
974
+ rightAction: {
975
+ icon: 'DeleteBinLine',
976
+ intent: 'danger',
977
+ minimal: true,
978
+ className: 'saved-value-remove',
979
+ tooltip: savedWords.remove,
980
+ onClick: function (event) {
981
+ event.stopPropagation();
982
+ savedValues.onRemove(item.id);
983
+ },
984
+ },
985
+ }
986
+ : {}))); }),
987
+ },
988
+ ]
989
+ : []), true);
634
990
  var handleTemplateToggleClick = (0, react_2.useCallback)(function () {
635
991
  setInternalIsFunction(false);
636
992
  onChange(name, undefined, undefined, false);
@@ -640,11 +996,23 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
640
996
  var handleExpressionChange = (0, react_2.useCallback)(function (expressionValue, remove) {
641
997
  if (remove) {
642
998
  setInternalIsFunction(false);
999
+ setExpressionSeed(null);
643
1000
  // The expression is gone, so there is no longer a switch to undo.
644
1001
  setExpressionFromText(null);
645
1002
  }
1003
+ /* On the Expression tab a lone template is kept as the expression the server parses it into,
1004
+ template(...): the option takes expressions (qorus#646, David). A template-only option has no
1005
+ Expression tab and keeps the bare template. A lone value (12, true) is that value, the field's own
1006
+ shape (see `loneValueOf`). */
1007
+ var onTabs = !!tabsKindRef.current;
1008
+ var literal = remove || !onTabs ? undefined : (0, writtenAsText_1.loneValueOf)(expressionValue);
1009
+ if (literal !== undefined) {
1010
+ setExpressionSeed((0, writtenAsText_1.expressionSeedOf)(literal.value));
1011
+ onChange(name, literal.value, type, false);
1012
+ return;
1013
+ }
646
1014
  onChange(name, expressionValue === null || expressionValue === void 0 ? void 0 : expressionValue.value, expressionDataType, !remove);
647
- }, [name, onChange, expressionDataType, value]);
1015
+ }, [name, onChange, expressionDataType, value, type]);
648
1016
  // ─── Text typed into a plain field that is really a DPQL expression ───
649
1017
  //
650
1018
  // A field that accepts expressions still gets DPQL TYPED into it, in the
@@ -660,12 +1028,16 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
660
1028
  // `helpers/dpqlDetection` for why a successful parse alone means nothing.
661
1029
  var validationField = (0, react_2.useMemo)(function () { return ({
662
1030
  validation_regex: rest.validation_regex,
1031
+ validation_regex_desc: rest.validation_regex_desc,
1032
+ example_value: rest.example_value,
663
1033
  has_to_be_valid_identifier: rest.has_to_be_valid_identifier,
664
1034
  has_to_have_value: rest.has_to_have_value,
665
1035
  rules: rest.rules,
666
1036
  arg_schema: rest.arg_schema,
667
1037
  }); }, [
668
1038
  rest.validation_regex,
1039
+ rest.validation_regex_desc,
1040
+ JSON.stringify(rest.example_value),
669
1041
  rest.has_to_be_valid_identifier,
670
1042
  rest.has_to_have_value,
671
1043
  JSON.stringify(rest.rules),
@@ -675,9 +1047,16 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
675
1047
  var _a;
676
1048
  setDpqlOffer(null);
677
1049
  setExpressionFromText(text);
1050
+ /* The value is an expression now, and the Text view shows it. A seed left from an earlier visit to
1051
+ the Expression tab - the value as it was then - was shown in its place, and leaving the tab saved
1052
+ it: what had just been typed was lost (qorus#646). */
1053
+ setExpressionSeed(null);
678
1054
  setInternalIsFunction(true);
679
1055
  setIsTemplate(false);
680
1056
  setTemplateValue(null);
1057
+ // the Value tab never holds an expression: detected, it moves to the Expression tab, with an undo
1058
+ if (tabsKindRef.current === 'full')
1059
+ setTab('expression');
681
1060
  // `dpql/parse` answers with the field-ready envelope
682
1061
  // (`{is_expression, value}`); this field stores the inner AST and
683
1062
  // signals the flag through `onChange`'s fourth argument, exactly as
@@ -690,8 +1069,20 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
690
1069
  }
691
1070
  declinedTexts.current.add(expressionFromText);
692
1071
  setInternalIsFunction(false);
1072
+ if (tabsKind) {
1073
+ setTab('value');
1074
+ setIsTemplate(valueTabIsText);
1075
+ }
693
1076
  setExpressionFromText(null);
694
1077
  onChange === null || onChange === void 0 ? void 0 : onChange(name, expressionFromText, type, false);
1078
+ /* Text that cannot be a value of the field's type (`12 + 2` in a whole number) is not a value it can
1079
+ keep: put back, it is a value the field refuses. It is offered again as an expression, beside that
1080
+ refusal, so the way back is in sight; text that can be a value is kept as one, as the undo asked
1081
+ (David on FormEngine · Expression Typed On Value Switches With Undo, qorus#646). */
1082
+ var detected = detectedTexts.current.get(expressionFromText);
1083
+ if ((detected === null || detected === void 0 ? void 0 : detected.outcome) === 'switch') {
1084
+ setDpqlOffer({ text: expressionFromText, expression: detected.expression });
1085
+ }
695
1086
  }, [expressionFromText, name, onChange, type]);
696
1087
  var declineDpqlOffer = (0, react_2.useCallback)(function () {
697
1088
  if (dpqlOffer) {
@@ -704,22 +1095,29 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
704
1095
  enterExpressionFromText(dpqlOffer.text, dpqlOffer.expression);
705
1096
  }
706
1097
  }, [dpqlOffer, enterExpressionFromText]);
707
- // Held in a ref so the debounce below does not depend on it. `onChange`
708
- // comes from the host form and can be a fresh function on any render;
709
- // with the callback in the effect's deps, a re-render caused by a
710
- // DIFFERENT field would restart this field's timer, and a form the
711
- // author is typing in re-renders constantly.
712
- var enterExpressionRef = (0, react_2.useRef)(enterExpressionFromText);
713
- (0, react_2.useEffect)(function () {
714
- enterExpressionRef.current = enterExpressionFromText;
715
- }, [enterExpressionFromText]);
1098
+ /* The offer of an expression detected in text the field keeps, beside the field, in every layout: on the
1099
+ Value tab of a form's tabs too, where it is how an undone switch's text is made an expression again. */
1100
+ var dpqlOfferPrompt = dpqlOffer ?
1101
+ (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fixed: true, stack: true, size: rest.size, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, icon: 'Functions', intent: 'info', className: 'dpql-detected-offer', tooltip: "\"".concat(dpqlOffer.text, "\" could be an expression. It is kept as text; use it as an expression instead?"), onClick: acceptDpqlOffer, children: "Use as expression" }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, icon: 'CloseLine', intent: 'info', className: 'dpql-detected-dismiss', tooltip: 'Keep it as plain text', onClick: declineDpqlOffer })] })
1102
+ : null;
1103
+ /* The offer beside the field it is of, to its right, and under it only where the row has no room for both: under
1104
+ it, with the field's message under that, an offer was one more line to read before the value (Foxhoundn, qlip
1105
+ #392: "move the `Use as an expression` to the right of the field"). */
1106
+ var withOfferBeside = function (field) {
1107
+ return dpqlOfferPrompt ?
1108
+ (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fluid: true, wrap: true, gapSize: 'small', verticalAlign: 'flex-start', className: 'dpql-offer-beside', children: [field, dpqlOfferPrompt] })
1109
+ : field;
1110
+ };
716
1111
  // Detection only runs on a field that could hold an expression and is
717
1112
  // currently showing a plain editor — never on a read-only field, a
718
1113
  // fixed-value list, or one already in template or expression mode.
719
1114
  var canDetectDpql = !!allowFunctions &&
720
1115
  !!allowTextExpressions &&
721
1116
  !effectiveIsFunction &&
722
- !isTemplate &&
1117
+ /* the template editor is text too: an expression written around a template is detected there; and a
1118
+ form's Value tab written as text takes any text, whatever the field says of custom values (an untyped
1119
+ option's did, and an expression typed there was kept as text, offered as nothing: qorus#646) */
1120
+ (!isTemplate || templateSupportsCustomValues || (tabsKind === 'full' && valueTabIsText)) &&
723
1121
  !hasOnlyAllowedValues &&
724
1122
  !rest.readonly &&
725
1123
  !rest.readOnly &&
@@ -744,10 +1142,12 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
744
1142
  var text = typeof value === 'string' ? value
745
1143
  : Array.isArray(value) ? (0, common_1.richtextToString)(value)
746
1144
  : undefined;
747
- if (!canDetectDpql ||
748
- !text ||
749
- declinedTexts.current.has(text) ||
750
- !(0, dpqlDetection_1.mightBeDpqlExpression)(text)) {
1145
+ if (text && canDetectDpql && declinedTexts.current.has(text)) {
1146
+ // asked about already: an offer made for this very text (an undone switch's) stands, any other goes
1147
+ setDpqlOffer(function (offer) { return ((offer === null || offer === void 0 ? void 0 : offer.text) === text ? offer : null); });
1148
+ return undefined;
1149
+ }
1150
+ if (!canDetectDpql || !text || !(0, dpqlDetection_1.mightBeDpqlExpression)(text)) {
751
1151
  setDpqlOffer(null);
752
1152
  return undefined;
753
1153
  }
@@ -760,10 +1160,13 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
760
1160
  return;
761
1161
  }
762
1162
  var outcome = (0, dpqlDetection_1.classifyTypedText)({ text: text, type: type, field: validationField, parsed: parsed });
763
- if (outcome === 'switch') {
764
- enterExpressionRef.current(text, parsed.expression);
1163
+ if (outcome !== 'none') {
1164
+ detectedTexts.current.set(text, { expression: parsed.expression, outcome: outcome });
765
1165
  }
766
- else if (outcome === 'offer') {
1166
+ /* An expression detected is offered, never switched to: the author chooses (qorus#646, David's
1167
+ review: "@pos + @bezeichnung" became an expression without asking). Text that cannot be a value
1168
+ of the field's type is said to be one it refuses, beside the offer. */
1169
+ if (outcome !== 'none') {
767
1170
  setDpqlOffer({ text: text, expression: parsed.expression });
768
1171
  }
769
1172
  else {
@@ -794,26 +1197,26 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
794
1197
  the row's — so leaving this out of the published list meant template mode
795
1198
  was a one-way door on the surface most options are edited from. */
796
1199
  var canOfferCustomValue = showTemplateToggle && isTemplate && templateSupportsCustomValues;
797
- var publishedItems = (0, react_2.useMemo)(function () { return __spreadArray(__spreadArray(__spreadArray(__spreadArray([], (canOfferExpression && !functions.loading
798
- ? [
799
- {
800
- label: 'Use Expression',
801
- icon: 'Functions',
802
- tooltip: 'Run a function on this value',
803
- onClick: handleSelectFunctionChange,
804
- },
805
- ]
806
- : []), true), (canOfferTemplate
807
- ? [
808
- {
809
- label: 'Use Template',
810
- icon: 'MoneyDollarCircleLine',
811
- tooltip: 'Use a template',
812
- onClick: handleTemplateToggleClick,
813
- },
814
- ]
815
- : []), true), (canOfferCustomValue
816
- ? [
1200
+ var publishedItems = (0, react_2.useMemo)(function () { return __spreadArray(__spreadArray(__spreadArray(__spreadArray([], (tabsKind ?
1201
+ []
1202
+ : __spreadArray(__spreadArray([], (canOfferExpression && !functions.loading ?
1203
+ [
1204
+ __assign(__assign({
1205
+ // in a condition field the label says what it is for; the value's tooltip would only repeat it
1206
+ label: (0, expressions_1.isConditionOption)(rest) ? 'Write a condition' : 'Use Expression', icon: 'Functions' }, ((0, expressions_1.isConditionOption)(rest) ? {} : { tooltip: 'Run a function on this value' })), { onClick: handleSelectFunctionChange }),
1207
+ ]
1208
+ : []), true), (canOfferTemplate ?
1209
+ [
1210
+ __assign(__assign({ label: 'Use Template', icon: 'MoneyDollarCircleLine' }, (hasTemplatesOnOffer ?
1211
+ { tooltip: 'Use a template' }
1212
+ : {
1213
+ disabled: true,
1214
+ description: exports.NO_TEMPLATES_ON_OFFER,
1215
+ tooltip: exports.NO_TEMPLATES_ON_OFFER,
1216
+ })), { onClick: handleTemplateToggleClick }),
1217
+ ]
1218
+ : []), true)), true), (canOfferCustomValue && !tabsKind ?
1219
+ [
817
1220
  {
818
1221
  label: 'Use Custom Value',
819
1222
  icon: 'EditLine',
@@ -833,33 +1236,50 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
833
1236
  setTemplateValue(null);
834
1237
  });
835
1238
  },
836
- }); }), true); }, [
1239
+ }); }), true), savedValueItems, true); }, [
837
1240
  canOfferExpression,
838
1241
  functions.loading,
839
1242
  canOfferTemplate,
1243
+ hasTemplatesOnOffer,
840
1244
  canOfferCustomValue,
841
1245
  menuItems,
842
1246
  handleSelectFunctionChange,
843
1247
  handleTemplateToggleClick,
844
1248
  handleUseCustomValueClick,
1249
+ // the saved values offered, and whether this value can be saved
1250
+ canSaveValue,
1251
+ value,
1252
+ savedForType,
1253
+ takeSavedValue,
845
1254
  ]);
846
1255
  /* Keyed on WHICH items are offered, never on the items: they carry
847
1256
  handlers, so they are a new array every render and a row comparing them
848
1257
  by value would loop. */
849
1258
  var publishedKey = [
850
1259
  canOfferExpression && !functions.loading ? 'expression' : '',
851
- canOfferTemplate ? 'template' : '',
1260
+ canOfferTemplate ? "template".concat(hasTemplatesOnOffer ? '' : '-none-on-offer') : '',
852
1261
  canOfferCustomValue ? 'custom-value' : '',
853
1262
  "custom:".concat((menuItems !== null && menuItems !== void 0 ? menuItems : []).map(function (item) { var _a; return String((_a = item.label) !== null && _a !== void 0 ? _a : ''); }).join('|')),
1263
+ canSaveValue ? "save:".concat(JSON.stringify(value)) : '',
1264
+ canUseSavedValue ? "saved:".concat(savedForType.map(function (item) { return item.id; }).join('|')) : '',
854
1265
  ].join(',');
855
1266
  (0, rowMenuContext_1.useRowMenuPublisher)(rowMenu, publishedKey, publishedItems);
856
1267
  var renderControls = (0, react_2.useCallback)(function () {
857
- var showFunctionsDropdown = allowFunctions && !hasOnlyAllowedValues && !rest.readonly && !internalIsFunction;
858
- var showTemplatesButton = showTemplateToggle && !isTemplate;
1268
+ // on tabs, the tabs are the mode switch: the menu keeps value actions only
1269
+ var showFunctionsDropdown = !tabsKind &&
1270
+ allowFunctions &&
1271
+ !hasOnlyAllowedValues &&
1272
+ !rest.readonly &&
1273
+ !internalIsFunction;
1274
+ var showTemplatesButton = !tabsKind && showTemplateToggle && !isTemplate;
859
1275
  // The way back out of template mode, where the editor draws no `×`.
860
- var showCustomValueButton = showTemplateToggle && isTemplate && templateSupportsCustomValues;
1276
+ var showCustomValueButton = !tabsKind && showTemplateToggle && isTemplate && templateSupportsCustomValues;
861
1277
  // The "Set value" label promises a way to set one — reorder rows alone don't.
862
- var hasValueRows = showFunctionsDropdown || showTemplatesButton || showCustomValueButton || (0, lodash_1.size)(menuItems) > 0;
1278
+ var hasValueRows = showFunctionsDropdown ||
1279
+ showTemplatesButton ||
1280
+ showCustomValueButton ||
1281
+ (0, lodash_1.size)(menuItems) > 0 ||
1282
+ savedValueItems.length > 0;
863
1283
  /* A lone group opens itself. Two of the menu's groups are collapsed
864
1284
  sections, so a menu holding nothing but one of them asked for a click
865
1285
  to reach the only thing on offer — on an untyped field, "Set Custom
@@ -873,6 +1293,7 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
873
1293
  showCustomValueButton,
874
1294
  (0, lodash_1.size)(menuActions === null || menuActions === void 0 ? void 0 : menuActions.items) > 0,
875
1295
  (0, lodash_1.size)(menuItems) > 0,
1296
+ canUseSavedValue,
876
1297
  ].filter(Boolean).length === 1;
877
1298
  /* ONE menu per control. Where this field sits in a form ROW, the row
878
1299
  already renders a ⋮ of its own, and drawing a second one beside it
@@ -888,7 +1309,7 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
888
1309
  return (showFunctionsDropdown ?
889
1310
  functions.loading ?
890
1311
  (0, jsx_runtime_1.jsx)(reqore_1.ReqoreSkeleton, { size: rest.size })
891
- : (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, minimal: true, label: 'Create New Expression', className: 'function-selector', icon: 'Functions', tooltip: 'This field only accepts expressions', onClick: function () {
1312
+ : (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, minimal: true, label: 'Create New Expression', className: 'function-selector', icon: 'Functions', tooltip: 'This field takes an expression.', onClick: function () {
892
1313
  setIsTemplate(false);
893
1314
  setTemplateValue(null);
894
1315
  onChange === null || onChange === void 0 ? void 0 : onChange(name, {
@@ -939,15 +1360,33 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
939
1360
  }, handler: 'click', content: (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreMenu, { size: rest.size, maxHeight: '400px', style: { overflow: 'auto' }, children: [showFunctionsDropdown ?
940
1361
  functions.loading ?
941
1362
  (0, jsx_runtime_1.jsx)(reqore_1.ReqoreSkeleton, { size: rest.size })
942
- : (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, transparent: true, label: 'Use Expression', className: 'function-selector', icon: 'Functions', tooltip: 'Run a function on this value', onClick: handleSelectFunctionChange })
943
- : null, showTemplatesButton ?
944
- (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreButton, { transparent: true, icon: 'MoneyDollarCircleLine', className: 'template-toggle', tooltip: 'Use a template', compact: true, size: rest.size, onClick: handleTemplateToggleClick, children: [' ', "Use Template", ' '] })
1363
+ : (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, transparent: true, label: (0, expressions_1.isConditionOption)(rest) ? 'Write a condition' : 'Use Expression', className: 'function-selector', icon: 'Functions', tooltip: (0, expressions_1.isConditionOption)(rest) ? undefined : 'Run a function on this value', onClick: handleSelectFunctionChange })
1364
+ : null, showTemplatesButton && !(showFunctionsDropdown && allowTextExpressions) ?
1365
+ (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreButton, { transparent: true, icon: 'MoneyDollarCircleLine', className: 'template-toggle',
1366
+ // none on offer: shown, not taken, and saying why (as the menu's item does)
1367
+ tooltip: hasTemplatesOnOffer ? 'Use a template' : exports.NO_TEMPLATES_ON_OFFER, disabled: !hasTemplatesOnOffer, compact: true, size: rest.size, onClick: handleTemplateToggleClick, children: [' ', "Use Template", ' '] })
945
1368
  : null, showCustomValueButton ?
946
1369
  (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreButton, { transparent: true, icon: 'EditLine', className: 'template-custom-value', tooltip: 'Write the value here instead of choosing a template', compact: true, size: rest.size, onClick: handleUseCustomValueClick, children: [' ', "Use Custom Value", ' '] })
947
1370
  : null, (0, lodash_1.size)(menuActions === null || menuActions === void 0 ? void 0 : menuActions.items) > 0 ?
948
1371
  (0, jsx_runtime_1.jsx)(MenuActionsSection, { actions: menuActions, size: rest.size, startExpanded: loneSectionStartsExpanded })
949
1372
  : null, (0, lodash_1.size)(menuItems) > 0 ?
950
1373
  (0, jsx_runtime_1.jsx)(exports.CustomMenuItems, { items: menuItems, setIsTemplate: setIsTemplate, setTemplateValue: setTemplateValue, startExpanded: loneSectionStartsExpanded })
1374
+ : null, canSaveValue ?
1375
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, transparent: true, icon: 'SaveLine', className: 'save-value', tooltip: savedWords.saveTooltip, size: rest.size, onClick: function () { return savedValues.onSave(value, type); }, children: savedWords.save })
1376
+ : null, canUseSavedValue ?
1377
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreMenuSection, { label: savedWords.use, icon: 'HistoryLine', className: 'use-saved-value', transparent: true, isCollapsed: !loneSectionStartsExpanded, children: savedForType.map(function (item) { return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMenuItem, { className: 'saved-value', label: item.label, description: item.description, onClick: function () { return takeSavedValue(item.value); }, rightAction: (savedValues === null || savedValues === void 0 ? void 0 : savedValues.onRemove) ?
1378
+ {
1379
+ icon: 'DeleteBinLine',
1380
+ intent: 'danger',
1381
+ minimal: true,
1382
+ className: 'saved-value-remove',
1383
+ tooltip: savedWords.remove,
1384
+ onClick: function (event) {
1385
+ event.stopPropagation();
1386
+ savedValues.onRemove(item.id);
1387
+ },
1388
+ }
1389
+ : undefined }, item.id)); }) })
951
1390
  : null, (0, lodash_1.size)(menuTrailingItems) > 0 ?
952
1391
  (0, jsx_runtime_1.jsx)(MenuTrailingItems, { items: menuTrailingItems, size: rest.size })
953
1392
  : null] }) }));
@@ -959,11 +1398,13 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
959
1398
  handleSelectFunctionChange,
960
1399
  handleTemplateToggleClick,
961
1400
  handleUseCustomValueClick,
1401
+ allowTextExpressions,
962
1402
  hasOnlyAllowedValues,
963
1403
  isTemplate,
964
1404
  rest.readonly,
965
1405
  rest.size,
966
1406
  showTemplateToggle,
1407
+ hasTemplatesOnOffer,
967
1408
  // reaches the menu through `templateSupportsCustomValues`
968
1409
  allowCustomValues,
969
1410
  hasOnlyExpressions,
@@ -977,6 +1418,12 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
977
1418
  hasInputAffordance,
978
1419
  // the row decides whether this field draws a menu at all
979
1420
  rowMenu,
1421
+ tabsKind,
1422
+ canSaveValue,
1423
+ canUseSavedValue,
1424
+ savedForType,
1425
+ takeSavedValue,
1426
+ savedValues,
980
1427
  ]);
981
1428
  // When the type is a list, and it has an element type - that element type is different
982
1429
  // from the field type, so we need to send down the full templates object
@@ -998,6 +1445,105 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
998
1445
  rest.element_type,
999
1446
  type,
1000
1447
  ]);
1448
+ // ─── Value · Expression · Visual (or Value · Template) ───────────────────────────────────────────
1449
+ if (tabsKind && !rest.disabled) {
1450
+ var words_1 = __assign(__assign({}, exports.DEFAULT_VALUE_TABS_LABELS), valueTabsLabels);
1451
+ /** A type named inside a sentence: the host's own words, or the type catalogue's sentence form (none for no type). */
1452
+ var typeInSentence = (_e = words_1.typeName) !== null && _e !== void 0 ? _e : qorusTypes.getTypeSentenceForm;
1453
+ /* A condition field's Expression tab is called Expression, as every field's is: a condition is written as
1454
+ an expression, and the tab's hover says so (qorus#646). */
1455
+ var conditionField_1 = (0, expressions_1.isConditionOption)(rest);
1456
+ var expressionTabLabel_1 = words_1.expression;
1457
+ var tabButton = function (key, label, icon, tooltip) { return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, size: rest.size, icon: icon, active: tab === key, "aria-pressed": tab === key, "data-tab": key, className: "value-tab value-tab-".concat(key), tooltip: tooltip, disabled: rest.readOnly || rest.readonly, onClick: function () { return selectTab(key); }, children: label }, key)); };
1458
+ /* A lone template of another type than the field's is converted when the value is used: said as a
1459
+ warning, not a block - whether it converts depends on the data (qorus#646, David). */
1460
+ var loneTemplate_1 = typeof value === 'string' && (0, templates_1.isCompleteTemplateToken)(value) ? value : expressionTemplate;
1461
+ var loneTemplateType = loneTemplate_1 && !typeIsAnyLike ?
1462
+ (0, templates_1.templateType)((0, templates_1.findTemplate)(templates !== null && templates !== void 0 ? templates : {}, loneTemplate_1))
1463
+ : undefined;
1464
+ // the types inside the sentence; with either one not known there is nothing to say converts to what
1465
+ var conversionFrom = typeof loneTemplateType === 'string' && !(0, writtenAsText_1.sameValueType)(loneTemplateType, type) ?
1466
+ typeInSentence(loneTemplateType)
1467
+ : undefined;
1468
+ var conversionTo = conversionFrom ? typeInSentence(type) : undefined;
1469
+ var conversionNote_1 = conversionFrom && conversionTo ? words_1.conversion(conversionFrom, conversionTo) : undefined;
1470
+ var cannotShow_1 = function (message) { return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreMessage, { size: 'small', flat: true, opaque: false, intent: 'muted', className: 'value-tab-cannot-show', children: [message, ' ', (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, size: rest.size, className: 'value-tab-replace', onClick: replaceWithAValue, disabled: rest.readOnly || rest.readonly, children: words_1.replaceWithAValue })] })); };
1471
+ var valueBody = function () {
1472
+ var _a;
1473
+ if (valueIsExpression && expressionTemplate === undefined) {
1474
+ return cannotShow_1(conditionField_1 ? words_1.cannotShowCondition : words_1.cannotShowExpression);
1475
+ }
1476
+ if (valueTabIsText) {
1477
+ var valueText = ((0, jsx_runtime_1.jsx)(RichText_1.RichTextFormField, __assign({ wholeRecords: takesRecords, className: 'template-selector value-tab-text', valueFormat: 'text',
1478
+ /* A whole number or a number is typed on a numeric keyboard where the device has one, as its own
1479
+ input was (qorus#646); templates are picked from the list the field opens, and an expression
1480
+ is written on the Expression tab. */
1481
+ inputMode: TEXTABLE_INPUT_MODES[type], singleLine: (0, singleLineString_1.isSingleLineStringType)('string'), value: typeof templateValue === 'string' ? templateValue : ((expressionTemplate !== null && expressionTemplate !== void 0 ? expressionTemplate : (0, writtenAsText_1.valueTextOf)(value, type))), templates: listedTemplates,
1482
+ // a chip of a field not of this type is named as the catalogue names it
1483
+ namingTemplates: templates, allowTemplates: true, onChange: handleTemplateTextChange }, rest, { fixed: false, fluid: true,
1484
+ /* The value takes the row the tabs give it (qorus#646, David: a small box beside empty room
1485
+ was clicked beside, and offered nothing). An operand's own field sizes itself to its
1486
+ column instead - that is the field outside the tabs. */
1487
+ panelProps: __assign(__assign({}, rest.panelProps), { style: __assign(__assign({}, (_a = rest.panelProps) === null || _a === void 0 ? void 0 : _a.style), (dpqlOfferPrompt ? OFFER_BESIDE_VALUE_BOX : { width: '100%' })) }), "aria-label": fieldAriaLabel })));
1488
+ return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, gapSize: 'small', children: [withOfferBeside(valueText), conversionNote_1 ?
1489
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { size: 'small', flat: true, opaque: false, intent: 'warning', className: 'value-tab-conversion', children: conversionNote_1 })
1490
+ : null] }));
1491
+ }
1492
+ if (loneTemplate_1 !== undefined || (typeof value === 'string' && (0, templates_1.isValueTemplate)(value))) {
1493
+ return cannotShow_1(words_1.templateShownOn(tabsKind === 'full' ? expressionTabLabel_1 : words_1.template));
1494
+ }
1495
+ var ownControl = ((0, jsx_runtime_1.jsx)(Component, __assign({ value: value, allowTemplates: false, onChange: onChange, name: name, level: level }, rest, { componentOverrides: componentOverrides }, componentTypeProp, { "aria-label": fieldAriaLabel, className: "".concat(className, " template-selector") })));
1496
+ // an expression detected in what the type's own control holds is offered beside it, as on the text
1497
+ return withOfferBeside(ownControl);
1498
+ };
1499
+ var expressionBody = function () { return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, gapSize: 'small', children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreErrorBoundary, { children: (0, jsx_runtime_1.jsx)(ExpressionField_1.ExpressionField
1500
+ /* A value that is not an expression yet is shown as the server reads it written alone:
1501
+ value(12) - so the Visual tab starts from the value, not from an operand with no operation. */
1502
+ , {
1503
+ /* A value that is not an expression yet is shown as the server reads it written alone:
1504
+ value(12) - so the Visual tab starts from the value, not from an operand with no operation. */
1505
+ value: {
1506
+ is_expression: true,
1507
+ value: value !== null && typeof value === 'object' ? value
1508
+ : !isEmptyValue && value !== null ?
1509
+ { exp: 'value', args: [{ type: type, value: value }] }
1510
+ : undefined,
1511
+ }, initialText: expressionSeed !== null && expressionSeed !== void 0 ? expressionSeed : undefined, draftText: expressionDraftText !== null && expressionDraftText !== void 0 ? expressionDraftText : undefined, onDraftChange: handleExpressionDraft, heldAsValue: !isEmptyValue && value !== null && typeof value !== 'object', componentOverrides: componentOverrides, localTemplates: listedCatalogue, type: type, returnType: (returnType || expressionDataType),
1512
+ // a field of a type the catalogue does not list takes what its base type takes
1513
+ returnBaseType: returnType ? undefined : rest.base_type, onChange: handleExpressionChange, readOnly: rest.readOnly || rest.disabled, expressions: rest.expressions, expressionsUrl: rest.expressions_url, fields: rest.dpql_fields,
1514
+ /* The record the server names for the option (`dpql_provider`: its connection and path), with the
1515
+ server's own default record type. It was never read: the server sends it, and the Text view
1516
+ offered no field of the record (qorus#646). */
1517
+ provider: rest.dpql_provider, recordType: rest.dpql_provider ? 'record' : undefined, serverHandled: rest.server_expression_handling,
1518
+ // a condition (a Qog if state's value, a while or for block's condition), marked by the host
1519
+ condition: (0, expressions_1.isConditionOption)(rest), extraActions: extraActions, size: rest.size, defaultMode: tab === 'visual' ? 'visual' : 'text', requestedMode: tab === 'visual' ? 'visual' : 'text', hideModeToggle: true, flushRef: expressionFlush,
1520
+ // no language server: the Visual tab is where the expression is built
1521
+ onTextUnavailable: function () { return setTab('visual'); }, reorder: reorder }) }), expressionFromText !== null ?
1522
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { fixed: true, compact: true, minimal: true, icon: 'ArrowGoBackLine', size: rest.size, className: 'dpql-detected-undo', tooltip: words_1.undoTooltip(expressionFromText), onClick: undoExpressionFromText, children: words_1.undo })
1523
+ : null] })); };
1524
+ var templateBody = function () { return ((0, jsx_runtime_1.jsx)(exports.TemplateDropdownSelector, { wholeRecords: takesRecords, allowCustomValues: false, templates: templates, value: typeof value === 'string' && (0, templates_1.isValueTemplate)(value) ? value : null, items: filteredTemplates === null || filteredTemplates === void 0 ? void 0 : filteredTemplates.items, onItemSelect: handleSelectTemplateFromList, onRemoveClick: replaceWithAValue, templateBadge: templateBadge, size: rest.size, label: label, hasOnlyAllowedValues: hasOnlyAllowedValues })); };
1525
+ /* A field that takes templates and no expression, whose value is written as text: the text takes its
1526
+ templates as chips, from the list it opens, so a Template tab beside it would be a second way to do the
1527
+ one thing (qorus#646, David). It is the value alone, with the field's menu beside it. */
1528
+ if (tabsKind === 'template' && valueTabIsText) {
1529
+ var controls = renderControls();
1530
+ return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, gapSize: 'small', className: 'value-tabs-field value-only', children: controls ?
1531
+ (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fluid: true, size: rest.size, verticalAlign: 'flex-start', children: [valueBody(), controls] })
1532
+ : valueBody() }));
1533
+ }
1534
+ return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, gapSize: 'small', className: 'value-tabs-field', children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fluid: true, size: rest.size, verticalAlign: 'center', children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, size: rest.size, className: 'value-tabs', fixed: true, children: [tabButton('value', words_1.value, 'EditLine'), tabsKind === 'full' ?
1535
+ [
1536
+ tabButton('expression', expressionTabLabel_1, 'CodeLine', conditionField_1 ? words_1.conditionTooltip : words_1.expressionTooltip),
1537
+ tabButton('visual', words_1.visual, 'NodeTree', conditionField_1 ? words_1.conditionVisualTooltip : words_1.visualTooltip),
1538
+ ]
1539
+ : tabButton('template', words_1.template, 'MoneyDollarCircleLine', words_1.templateTooltip)] }), renderControls()] }), tab === 'value' && hasExpressionDraft ?
1540
+ (0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { size: 'small', flat: true, opaque: false, intent: 'warning', className: 'value-tab-expression-draft', children: words_1.expressionDraftNotUsed })
1541
+ : null, tab === 'value' ?
1542
+ valueBody()
1543
+ : tab === 'template' ?
1544
+ templateBody()
1545
+ : expressionBody()] }));
1546
+ }
1001
1547
  if (effectiveIsFunction && !hasOnlyAllowedValues) {
1002
1548
  // SEAM (reqraft): `allowTextExpressions` swaps the IDE's bare builder
1003
1549
  // for the ExpressionField shell (Visual = the same builder, Text = the
@@ -1012,13 +1558,21 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
1012
1558
  // rest-spread; the expression shell needs them explicitly or the
1013
1559
  // builder's operands render "Unknown type!" for any consumer
1014
1560
  // ui_type (an assertion's `test-reference` Value, for one).
1015
- componentOverrides: componentOverrides, localTemplates: templates, type: type, returnType: (returnType || expressionDataType), onChange: handleExpressionChange, readOnly: rest.readOnly || rest.disabled, expressions: rest.expressions, expressionsUrl: rest.expressions_url,
1561
+ componentOverrides: componentOverrides, localTemplates: listedCatalogue, type: type, returnType: (returnType || expressionDataType),
1562
+ // a field of a type the catalogue does not list takes what its base type takes
1563
+ returnBaseType: returnType ? undefined : rest.base_type, onChange: handleExpressionChange, readOnly: rest.readOnly || rest.disabled, expressions: rest.expressions, expressionsUrl: rest.expressions_url,
1016
1564
  // the record's fields for the Text view, from the field's schema (`dpql_fields`)
1017
- fields: rest.dpql_fields, serverHandled: rest.server_expression_handling, extraActions: extraActions, size: rest.size,
1018
- // An author who typed the expression as text is already
1019
- // writing in that language — dropping them into the visual
1020
- // builder would make them find their own sentence again.
1021
- defaultMode: expressionFromText !== null ? 'text' : 'visual', reorder: reorder }) }), expressionFromText !== null ?
1565
+ fields: rest.dpql_fields,
1566
+ // the record the server names for the option (see above)
1567
+ provider: rest.dpql_provider, recordType: rest.dpql_provider ? 'record' : undefined, serverHandled: rest.server_expression_handling,
1568
+ // a condition (a Qog if state's value, a while or for block's condition), marked by the host
1569
+ condition: (0, expressions_1.isConditionOption)(rest), extraActions: extraActions, size: rest.size, modeLabels: expressionModeLabels,
1570
+ /* An expression opens on its Text view, the first of Text · Visual, as the value's tabs open on
1571
+ Expression before Visual (qorus#646, David); without a language server it falls back to
1572
+ Visual by itself. It opened on Visual, on an empty "Select operation", unless the
1573
+ expression had just been typed as text. Mounted again, it opens on the view the author
1574
+ was on - except for an expression just typed as text, which is shown as the text it is. */
1575
+ defaultMode: expressionFromText !== null ? 'text' : expressionMode, onModeChange: setExpressionMode, reorder: reorder }) }), expressionFromText !== null ?
1022
1576
  (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { fixed: true, compact: true, minimal: true, icon: 'ArrowGoBackLine',
1023
1577
  // No `intent` with `minimal`: a Reqore intent is a FILL, and
1024
1578
  // `muted` as TEXT is 1.3:1 on the app surface.
@@ -1028,27 +1582,44 @@ var TemplateFieldImpl = (0, react_2.memo)(function (_a) {
1028
1582
  return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreErrorBoundary, { children: (0, jsx_runtime_1.jsx)(builder_1.ExpressionBuilder, { value: {
1029
1583
  is_expression: true,
1030
1584
  value: value,
1031
- }, componentOverrides: componentOverrides, localTemplates: templates, level: level, type: type, returnType: (returnType || expressionDataType), onChange: handleExpressionChange, readOnly: rest.readOnly || rest.disabled, expressions: rest.expressions, expressionsUrl: rest.expressions_url, serverHandled: rest.server_expression_handling, extraActions: extraActions, reorder: reorder }) }), renderControls()] }));
1585
+ }, componentOverrides: componentOverrides, localTemplates: listedCatalogue, level: level, type: type, returnType: (returnType || expressionDataType),
1586
+ // a field of a type the catalogue does not list takes what its base type takes
1587
+ returnBaseType: returnType ? undefined : rest.base_type, onChange: handleExpressionChange, readOnly: rest.readOnly || rest.disabled, expressions: rest.expressions, expressionsUrl: rest.expressions_url, serverHandled: rest.server_expression_handling,
1588
+ // a condition (a Qog if state's value, a while or for block's condition), marked by the host
1589
+ condition: (0, expressions_1.isConditionOption)(rest), extraActions: extraActions, reorder: reorder }) }), renderControls()] }));
1032
1590
  }
1033
1591
  if (rest.disabled) {
1034
1592
  if (isTemplate) {
1035
1593
  // SEAM (reqraft): the IDE renders a bare `<ReqoreTag label={templateValue}/>`
1036
1594
  // here; reqraft upgrades the read-only template to a proper picker chip —
1037
- // the $-dollar icon + resolved display name + app image, coloured by the
1595
+ // the $-dollar icon + resolved display name + app image, colored by the
1038
1596
  // IDE's intent scheme. Shared with the compact read-first row.
1039
- return (0, jsx_runtime_1.jsx)(ReadOnlyTemplateTag_1.ReadOnlyTemplateTag, { value: templateValue, templates: templates, size: rest.size });
1597
+ return (0, jsx_runtime_1.jsx)(ReadOnlyTemplateTag_1.ReadOnlyTemplateTag, { value: templateValue, templates: templates });
1040
1598
  }
1041
1599
  return ((0, jsx_runtime_1.jsx)(Comp, __assign({ value: value, onChange: onChange, name: name }, rest, { componentOverrides: componentOverrides })));
1042
1600
  }
1043
1601
  return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, __assign({ fluid: rest.fluid, fixed: rest.fixed, size: rest.size }, rest, { stack: false, verticalAlign: 'flex-start', children: [!isTemplate && allowCustomValues ?
1044
1602
  (0, jsx_runtime_1.jsx)(Component, __assign({ value: value, allowTemplates: allowTemplates, onChange: onChange, name: name, level: level }, rest, { componentOverrides: componentOverrides }, componentTypeProp, { "aria-label": fieldAriaLabel, className: "".concat(className, " template-selector"), templates: componentTemplates }))
1045
- : null, isTemplate && templateSupportsCustomValues && !templateValueIsBracedToken ?
1046
- (0, jsx_runtime_1.jsx)(RichText_1.RichTextFormField, __assign({ className: 'template-selector', valueFormat: 'text', singleLine: (0, singleLineString_1.isSingleLineStringType)('string'), value: typeof templateValue === 'string' ? templateValue : '', templates: filteredTemplates, allowTemplates: true, onChange: handleTemplateTextChange }, rest, { "aria-label": fieldAriaLabel }))
1047
- : null, dpqlOffer ?
1048
- (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fixed: true, stack: true, size: rest.size, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, icon: 'Functions', intent: 'info', className: 'dpql-detected-offer', tooltip: "\"".concat(dpqlOffer.text, "\" reads as an expression. It is also valid text here, so nothing has been changed \u2014 use it as an expression?"), onClick: acceptDpqlOffer, children: "Use as expression" }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { compact: true, icon: 'CloseLine', intent: 'info', className: 'dpql-detected-dismiss', tooltip: 'Keep it as plain text', onClick: declineDpqlOffer })] })
1049
- : null, (showTemplatesDropdown ||
1050
- (isTemplate && templateSupportsCustomValues && templateValueIsBracedToken)) ?
1051
- (0, jsx_runtime_1.jsx)(exports.TemplateDropdownSelector, { allowCustomValues: allowCustomValues, templates: templates, value: templateValue, items: filteredTemplates === null || filteredTemplates === void 0 ? void 0 : filteredTemplates.items, onItemSelect: handleSelectTemplateFromList, onRemoveClick: handleRemoveTemplateClick, size: rest.size, label: label, hasOnlyAllowedValues: hasOnlyAllowedValues })
1603
+ : null, !isTemplate && allowCustomValues && dateTakesTemplates ?
1604
+ (0, jsx_runtime_1.jsx)(TemplateBrowser_1.TemplateBrowser, { className: 'date-template-picker', icon: 'MoneyDollarCircleLine', fixed: true, compact: true, size: rest.size, tooltip: 'Use a template', "aria-label": 'Use a template', templates: filteredTemplates, focusFilter: true, onItemSelect: handleSelectDateTemplate })
1605
+ : null, isTemplate && templateSupportsCustomValues ?
1606
+ (0, jsx_runtime_1.jsx)(RichText_1.RichTextFormField, __assign({ wholeRecords: takesRecords, className: 'template-selector', valueFormat: 'text', singleLine: (0, singleLineString_1.isSingleLineStringType)('string'),
1607
+ /* null shows as null, not as an empty field: the two are different values, and an
1608
+ untyped field holding null looked exactly like one holding nothing (qorus#646) */
1609
+ value: typeof templateValue === 'string' ? templateValue : (((_f = (0, writtenAsText_1.untypedTextOf)(value, type)) !== null && _f !== void 0 ? _f : '')), templates: listedTemplates,
1610
+ // a chip of a field not of this type (text around it, say) is named as the catalogue names it
1611
+ namingTemplates: templates, allowTemplates: true, onChange: handleTemplateTextChange }, rest, {
1612
+ /* The text the value is written in takes the room its row gives it and gives it back: a
1613
+ caller's \`fixed\` sized a picker chip, and on a text field it kept the field at its full
1614
+ width, pushing the ⋮ past an operand's row in a narrow column. */
1615
+ fixed: false, fluid: true,
1616
+ /* As wide as `textWidth` says. A field: 150px, as a free text field is, wider for what it
1617
+ holds, and narrower only where its row has less room, as a number's input is (a fixed 150px
1618
+ minimum held it at full width in a narrow column). Its content: the box takes its width from
1619
+ what it holds, with no minimum, and the editor in it keeps 150px. */
1620
+ panelProps: __assign(__assign(__assign({}, rest.panelProps), { style: __assign(__assign({}, (_g = rest.panelProps) === null || _g === void 0 ? void 0 : _g.style), (textWidth === 'content' ? CONTENT_WIDTH_BOX : FIELD_WIDTH_BOX)) }), (textWidth === 'content' ? { contentStyle: CONTENT_WIDTH_EDITOR } : {})), "aria-label": fieldAriaLabel }))
1621
+ : null, dpqlOfferPrompt, showTemplatesDropdown ?
1622
+ (0, jsx_runtime_1.jsx)(exports.TemplateDropdownSelector, { wholeRecords: takesRecords, allowCustomValues: allowCustomValues, templates: templates, value: templateValue, items: filteredTemplates === null || filteredTemplates === void 0 ? void 0 : filteredTemplates.items, onItemSelect: handleSelectTemplateFromList, onRemoveClick: handleRemoveTemplateClick, templateBadge: templateBadge, size: rest.size, label: label, hasOnlyAllowedValues: hasOnlyAllowedValues })
1052
1623
  : null, renderControls()] })));
1053
1624
  });
1054
1625
  /**