@qoretechnologies/reqraft 0.10.62 → 0.10.63-pr.142.g0b675cd

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 (736) hide show
  1. package/README.md +21 -1
  2. package/dist/components/Description/describedControl.d.ts +48 -0
  3. package/dist/components/Description/describedControl.d.ts.map +1 -0
  4. package/dist/components/Description/describedControl.js +81 -0
  5. package/dist/components/Description/describedControl.js.map +1 -0
  6. package/dist/components/Description/index.d.ts.map +1 -1
  7. package/dist/components/Description/index.js +3 -2
  8. package/dist/components/Description/index.js.map +1 -1
  9. package/dist/components/colorValue/colorValue.d.ts +59 -0
  10. package/dist/components/colorValue/colorValue.d.ts.map +1 -0
  11. package/dist/components/colorValue/colorValue.js +245 -0
  12. package/dist/components/colorValue/colorValue.js.map +1 -0
  13. package/dist/components/colorValue/index.d.ts +34 -0
  14. package/dist/components/colorValue/index.d.ts.map +1 -0
  15. package/dist/components/colorValue/index.js +136 -0
  16. package/dist/components/colorValue/index.js.map +1 -0
  17. package/dist/components/colorValue/labels.d.ts +12 -0
  18. package/dist/components/colorValue/labels.d.ts.map +1 -0
  19. package/dist/components/colorValue/labels.js +11 -0
  20. package/dist/components/colorValue/labels.js.map +1 -0
  21. package/dist/components/composer/Composer.d.ts +1 -1
  22. package/dist/components/composer/Composer.d.ts.map +1 -1
  23. package/dist/components/composer/Composer.js +2 -2
  24. package/dist/components/composer/Composer.js.map +1 -1
  25. package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
  26. package/dist/components/dpqlEditor/DpqlEditor.js +25 -5
  27. package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
  28. package/dist/components/dpqlEditor/dpqlHelpers.d.ts +10 -1
  29. package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
  30. package/dist/components/dpqlEditor/dpqlHelpers.js +30 -13
  31. package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
  32. package/dist/components/dpqlEditor/dpqlTags.d.ts +11 -7
  33. package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
  34. package/dist/components/dpqlEditor/dpqlTags.js +11 -6
  35. package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
  36. package/dist/components/dpqlEditor/types.d.ts +47 -8
  37. package/dist/components/dpqlEditor/types.d.ts.map +1 -1
  38. package/dist/components/dpqlEditor/useDpqlSession.d.ts +2 -2
  39. package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
  40. package/dist/components/dpqlEditor/useDpqlSession.js +16 -7
  41. package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
  42. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  43. package/dist/components/form/engine/CompactRow.js +151 -83
  44. package/dist/components/form/engine/CompactRow.js.map +1 -1
  45. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  46. package/dist/components/form/engine/CompactToolbar.js +29 -3
  47. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  48. package/dist/components/form/engine/FormEngine.d.ts +34 -1
  49. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  50. package/dist/components/form/engine/FormEngine.js +487 -87
  51. package/dist/components/form/engine/FormEngine.js.map +1 -1
  52. package/dist/components/form/engine/HiddenFieldsNote.d.ts +28 -0
  53. package/dist/components/form/engine/HiddenFieldsNote.d.ts.map +1 -0
  54. package/dist/components/form/engine/HiddenFieldsNote.js +32 -0
  55. package/dist/components/form/engine/HiddenFieldsNote.js.map +1 -0
  56. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  57. package/dist/components/form/engine/OptionFieldMessages.js +24 -3
  58. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  59. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +2 -2
  60. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
  61. package/dist/components/form/engine/_structuredData/SchemaDataView.js +12 -6
  62. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
  63. package/dist/components/form/engine/compactRowContext.d.ts +19 -0
  64. package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
  65. package/dist/components/form/engine/compactRowContext.js.map +1 -1
  66. package/dist/components/form/engine/compactRowStyles.d.ts +0 -1
  67. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  68. package/dist/components/form/engine/compactRowStyles.js +12 -20
  69. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  70. package/dist/components/form/engine/compactToolbarColors.d.ts +16 -0
  71. package/dist/components/form/engine/compactToolbarColors.d.ts.map +1 -0
  72. package/dist/components/form/engine/compactToolbarColors.js +21 -0
  73. package/dist/components/form/engine/compactToolbarColors.js.map +1 -0
  74. package/dist/components/form/engine/readFirst.d.ts +24 -8
  75. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  76. package/dist/components/form/engine/readFirst.js +77 -109
  77. package/dist/components/form/engine/readFirst.js.map +1 -1
  78. package/dist/components/form/engine/readFirstColors.d.ts +30 -0
  79. package/dist/components/form/engine/readFirstColors.d.ts.map +1 -0
  80. package/dist/components/form/engine/readFirstColors.js +51 -0
  81. package/dist/components/form/engine/readFirstColors.js.map +1 -0
  82. package/dist/components/form/engine/rowFocus.d.ts +2 -0
  83. package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
  84. package/dist/components/form/engine/rowFocus.js +26 -3
  85. package/dist/components/form/engine/rowFocus.js.map +1 -1
  86. package/dist/components/form/engine/typeChoices.d.ts +1 -1
  87. package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -1
  88. package/dist/components/form/engine/variants/VariantCalmTable.js +2 -1
  89. package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -1
  90. package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -1
  91. package/dist/components/form/engine/variants/VariantCards.js +2 -1
  92. package/dist/components/form/engine/variants/VariantCards.js.map +1 -1
  93. package/dist/components/form/engine/variants/VariantFocus.js +1 -1
  94. package/dist/components/form/engine/variants/VariantFocus.js.map +1 -1
  95. package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -1
  96. package/dist/components/form/engine/variants/VariantMinimal.js +2 -1
  97. package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -1
  98. package/dist/components/form/engine/variants/variantParts.d.ts +1 -1
  99. package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -1
  100. package/dist/components/form/engine/variants/variantParts.js +25 -17
  101. package/dist/components/form/engine/variants/variantParts.js.map +1 -1
  102. package/dist/components/form/expressions/DpqlRendering.d.ts +1 -1
  103. package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -1
  104. package/dist/components/form/expressions/DpqlRendering.js +3 -3
  105. package/dist/components/form/expressions/DpqlRendering.js.map +1 -1
  106. package/dist/components/form/expressions/ExpressionField.d.ts +41 -3
  107. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  108. package/dist/components/form/expressions/ExpressionField.js +396 -99
  109. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  110. package/dist/components/form/expressions/builder/argumentDetail.d.ts.map +1 -1
  111. package/dist/components/form/expressions/builder/argumentDetail.js +4 -1
  112. package/dist/components/form/expressions/builder/argumentDetail.js.map +1 -1
  113. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  114. package/dist/components/form/expressions/builder/argumentLabel.js +27 -9
  115. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  116. package/dist/components/form/expressions/builder/argumentWrapper.d.ts.map +1 -1
  117. package/dist/components/form/expressions/builder/argumentWrapper.js +4 -2
  118. package/dist/components/form/expressions/builder/argumentWrapper.js.map +1 -1
  119. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
  120. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +5 -4
  121. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js.map +1 -1
  122. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts +1 -1
  123. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts.map +1 -1
  124. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js +6 -3
  125. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
  126. package/dist/components/form/expressions/builder/index.d.ts +24 -2
  127. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  128. package/dist/components/form/expressions/builder/index.js +121 -77
  129. package/dist/components/form/expressions/builder/index.js.map +1 -1
  130. package/dist/components/form/expressions/builder/item.d.ts +6 -2
  131. package/dist/components/form/expressions/builder/item.d.ts.map +1 -1
  132. package/dist/components/form/expressions/builder/item.js +19 -5
  133. package/dist/components/form/expressions/builder/item.js.map +1 -1
  134. package/dist/components/form/expressions/builder/renderTemplate.js +1 -1
  135. package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
  136. package/dist/components/form/expressions/expressionOperands.d.ts +16 -0
  137. package/dist/components/form/expressions/expressionOperands.d.ts.map +1 -0
  138. package/dist/components/form/expressions/expressionOperands.js +97 -0
  139. package/dist/components/form/expressions/expressionOperands.js.map +1 -0
  140. package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
  141. package/dist/components/form/expressions/mockExpressions.js +22 -5
  142. package/dist/components/form/expressions/mockExpressions.js.map +1 -1
  143. package/dist/components/form/expressions/renderExpressionToText.d.ts +2 -0
  144. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  145. package/dist/components/form/expressions/renderExpressionToText.js +35 -9
  146. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  147. package/dist/components/form/expressions/textOfExpression.d.ts +18 -0
  148. package/dist/components/form/expressions/textOfExpression.d.ts.map +1 -0
  149. package/dist/components/form/expressions/textOfExpression.js +37 -0
  150. package/dist/components/form/expressions/textOfExpression.js.map +1 -0
  151. package/dist/components/form/expressions/useExpressionType.d.ts +26 -0
  152. package/dist/components/form/expressions/useExpressionType.d.ts.map +1 -0
  153. package/dist/components/form/expressions/useExpressionType.js +181 -0
  154. package/dist/components/form/expressions/useExpressionType.js.map +1 -0
  155. package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
  156. package/dist/components/form/expressions/useRenderExpression.js +7 -7
  157. package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
  158. package/dist/components/form/fields/Field.d.ts.map +1 -1
  159. package/dist/components/form/fields/Field.js +20 -7
  160. package/dist/components/form/fields/Field.js.map +1 -1
  161. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  162. package/dist/components/form/fields/allowed-values/AllowedValues.js +17 -4
  163. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  164. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  165. package/dist/components/form/fields/array/ArrayAuto.js +24 -0
  166. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  167. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  168. package/dist/components/form/fields/array/ArrayAutoField.js +36 -13
  169. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  170. package/dist/components/form/fields/auto/AutoFormField.d.ts +20 -1
  171. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  172. package/dist/components/form/fields/auto/AutoFormField.js +81 -36
  173. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  174. package/dist/components/form/fields/auto/hostEditorValue.d.ts +30 -0
  175. package/dist/components/form/fields/auto/hostEditorValue.d.ts.map +1 -0
  176. package/dist/components/form/fields/auto/hostEditorValue.js +53 -0
  177. package/dist/components/form/fields/auto/hostEditorValue.js.map +1 -0
  178. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
  179. package/dist/components/form/fields/binary/Binary.js +23 -3
  180. package/dist/components/form/fields/binary/Binary.js.map +1 -1
  181. package/dist/components/form/fields/boolean/Boolean.d.ts +5 -0
  182. package/dist/components/form/fields/boolean/Boolean.d.ts.map +1 -1
  183. package/dist/components/form/fields/boolean/Boolean.js +9 -1
  184. package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
  185. package/dist/components/form/fields/color/Color.d.ts +103 -16
  186. package/dist/components/form/fields/color/Color.d.ts.map +1 -1
  187. package/dist/components/form/fields/color/Color.js +611 -16
  188. package/dist/components/form/fields/color/Color.js.map +1 -1
  189. package/dist/components/form/fields/emittedValues.d.ts +34 -3
  190. package/dist/components/form/fields/emittedValues.d.ts.map +1 -1
  191. package/dist/components/form/fields/emittedValues.js +24 -1
  192. package/dist/components/form/fields/emittedValues.js.map +1 -1
  193. package/dist/components/form/fields/file/File.d.ts +1 -1
  194. package/dist/components/form/fields/file/File.d.ts.map +1 -1
  195. package/dist/components/form/fields/file/File.js +4 -2
  196. package/dist/components/form/fields/file/File.js.map +1 -1
  197. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  198. package/dist/components/form/fields/long-string/LongString.js +17 -3
  199. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  200. package/dist/components/form/fields/markdown/MarkdownView.js +1 -1
  201. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  202. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +4 -1
  203. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  204. package/dist/components/form/fields/number/Number.d.ts +6 -0
  205. package/dist/components/form/fields/number/Number.d.ts.map +1 -1
  206. package/dist/components/form/fields/number/Number.js +41 -6
  207. package/dist/components/form/fields/number/Number.js.map +1 -1
  208. package/dist/components/form/fields/object/Object.d.ts +1 -1
  209. package/dist/components/form/fields/object/Object.d.ts.map +1 -1
  210. package/dist/components/form/fields/object/Object.js +4 -2
  211. package/dist/components/form/fields/object/Object.js.map +1 -1
  212. package/dist/components/form/fields/pendingEdit.d.ts +52 -0
  213. package/dist/components/form/fields/pendingEdit.d.ts.map +1 -0
  214. package/dist/components/form/fields/pendingEdit.js +79 -0
  215. package/dist/components/form/fields/pendingEdit.js.map +1 -0
  216. package/dist/components/form/fields/rich-text/RichText.d.ts +8 -1
  217. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  218. package/dist/components/form/fields/rich-text/RichText.js +190 -81
  219. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  220. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts +18 -0
  221. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts.map +1 -0
  222. package/dist/components/form/fields/rich-text/useTemplateTags.js +49 -0
  223. package/dist/components/form/fields/rich-text/useTemplateTags.js.map +1 -0
  224. package/dist/components/form/fields/schema-definition/CatalogLeafForm.d.ts.map +1 -1
  225. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js +4 -1
  226. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js.map +1 -1
  227. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.d.ts.map +1 -1
  228. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js +20 -5
  229. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js.map +1 -1
  230. package/dist/components/form/fields/schema-definition/TableEditor.d.ts.map +1 -1
  231. package/dist/components/form/fields/schema-definition/TableEditor.js +10 -2
  232. package/dist/components/form/fields/schema-definition/TableEditor.js.map +1 -1
  233. package/dist/components/form/fields/schema-definition/index.d.ts.map +1 -1
  234. package/dist/components/form/fields/schema-definition/index.js +8 -4
  235. package/dist/components/form/fields/schema-definition/index.js.map +1 -1
  236. package/dist/components/form/fields/select/Select.d.ts +2 -0
  237. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  238. package/dist/components/form/fields/select/Select.js +19 -10
  239. package/dist/components/form/fields/select/Select.js.map +1 -1
  240. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  241. package/dist/components/form/fields/select/SelectCollection.js +8 -2
  242. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  243. package/dist/components/form/fields/select/unavailableRow.d.ts +23 -0
  244. package/dist/components/form/fields/select/unavailableRow.d.ts.map +1 -0
  245. package/dist/components/form/fields/select/unavailableRow.js +55 -0
  246. package/dist/components/form/fields/select/unavailableRow.js.map +1 -0
  247. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +5 -5
  248. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  249. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +11 -4
  250. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  251. package/dist/components/form/fields/template/TemplateBrowser.d.ts +22 -0
  252. package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
  253. package/dist/components/form/fields/template/TemplateBrowser.js +54 -0
  254. package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
  255. package/dist/components/form/fields/template/TemplateField.d.ts +83 -1
  256. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  257. package/dist/components/form/fields/template/TemplateField.js +535 -85
  258. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  259. package/dist/components/form/fields/template/TemplateText.d.ts +0 -17
  260. package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -1
  261. package/dist/components/form/fields/template/TemplateText.js +8 -4
  262. package/dist/components/form/fields/template/TemplateText.js.map +1 -1
  263. package/dist/components/form/fields/template/writtenAsText.d.ts +55 -0
  264. package/dist/components/form/fields/template/writtenAsText.d.ts.map +1 -0
  265. package/dist/components/form/fields/template/writtenAsText.js +188 -0
  266. package/dist/components/form/fields/template/writtenAsText.js.map +1 -0
  267. package/dist/components/form/index.d.ts +10 -0
  268. package/dist/components/form/index.d.ts.map +1 -1
  269. package/dist/components/form/index.js +23 -1
  270. package/dist/components/form/index.js.map +1 -1
  271. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
  272. package/dist/components/imageLightbox/ImageLightbox.js +19 -7
  273. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
  274. package/dist/components/log/Log.d.ts.map +1 -1
  275. package/dist/components/log/Log.js +15 -7
  276. package/dist/components/log/Log.js.map +1 -1
  277. package/dist/components/menu/Menu.d.ts.map +1 -1
  278. package/dist/components/menu/Menu.js +19 -10
  279. package/dist/components/menu/Menu.js.map +1 -1
  280. package/dist/components/smartEditor/CompletionMenu.d.ts +43 -0
  281. package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
  282. package/dist/components/smartEditor/CompletionMenu.js +196 -0
  283. package/dist/components/smartEditor/CompletionMenu.js.map +1 -0
  284. package/dist/components/smartEditor/MarkdownDoc.d.ts +1 -1
  285. package/dist/components/smartEditor/MarkdownDoc.js +1 -1
  286. package/dist/components/smartEditor/MarkdownDoc.js.map +1 -1
  287. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  288. package/dist/components/smartEditor/SmartEditor.js +51 -136
  289. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  290. package/dist/components/smartEditor/completionStyle.d.ts +27 -0
  291. package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
  292. package/dist/components/smartEditor/completionStyle.js +66 -0
  293. package/dist/components/smartEditor/completionStyle.js.map +1 -0
  294. package/dist/components/smartEditor/index.d.ts +5 -1
  295. package/dist/components/smartEditor/index.d.ts.map +1 -1
  296. package/dist/components/smartEditor/index.js +19 -1
  297. package/dist/components/smartEditor/index.js.map +1 -1
  298. package/dist/components/smartEditor/templateCompletions.d.ts +18 -0
  299. package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
  300. package/dist/components/smartEditor/templateCompletions.js +94 -0
  301. package/dist/components/smartEditor/templateCompletions.js.map +1 -0
  302. package/dist/components/smartEditor/types.d.ts +12 -1
  303. package/dist/components/smartEditor/types.d.ts.map +1 -1
  304. package/dist/components/smartEditor/useLspAutocomplete.d.ts +32 -0
  305. package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
  306. package/dist/components/smartEditor/useLspAutocomplete.js +228 -118
  307. package/dist/components/smartEditor/useLspAutocomplete.js.map +1 -1
  308. package/dist/components/smartEditor/useLspHover.d.ts +22 -7
  309. package/dist/components/smartEditor/useLspHover.d.ts.map +1 -1
  310. package/dist/components/smartEditor/useLspHover.js +86 -17
  311. package/dist/components/smartEditor/useLspHover.js.map +1 -1
  312. package/dist/components/smartEditor/useLspSemanticTokens.js +1 -1
  313. package/dist/components/smartEditor/useLspSemanticTokens.js.map +1 -1
  314. package/dist/components/smartEditor/useLspSession.d.ts +6 -0
  315. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  316. package/dist/components/smartEditor/useLspSession.js +7 -6
  317. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  318. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -1
  319. package/dist/components/supportTicket/AttachmentChips.js +15 -5
  320. package/dist/components/supportTicket/AttachmentChips.js.map +1 -1
  321. package/dist/components/supportTicket/ReferencePicker.d.ts +9 -2
  322. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
  323. package/dist/components/supportTicket/ReferencePicker.js +27 -6
  324. package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
  325. package/dist/components/supportTicket/TicketHeader.d.ts +3 -4
  326. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
  327. package/dist/components/supportTicket/TicketHeader.js +20 -2
  328. package/dist/components/supportTicket/TicketHeader.js.map +1 -1
  329. package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
  330. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
  331. package/dist/components/ticketReferences/TicketReferences.js +9 -4
  332. package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
  333. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
  334. package/dist/components/ticketThread/TicketThread.js +36 -11
  335. package/dist/components/ticketThread/TicketThread.js.map +1 -1
  336. package/dist/helpers/descriptionTooltip.d.ts +43 -0
  337. package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
  338. package/dist/helpers/descriptionTooltip.js +70 -0
  339. package/dist/helpers/descriptionTooltip.js.map +1 -0
  340. package/dist/helpers/domProps.d.ts +5 -0
  341. package/dist/helpers/domProps.d.ts.map +1 -0
  342. package/dist/helpers/domProps.js +47 -0
  343. package/dist/helpers/domProps.js.map +1 -0
  344. package/dist/helpers/expressions.d.ts +107 -2
  345. package/dist/helpers/expressions.d.ts.map +1 -1
  346. package/dist/helpers/expressions.js +223 -8
  347. package/dist/helpers/expressions.js.map +1 -1
  348. package/dist/helpers/hoveringPointer.d.ts +26 -0
  349. package/dist/helpers/hoveringPointer.d.ts.map +1 -0
  350. package/dist/helpers/hoveringPointer.js +29 -0
  351. package/dist/helpers/hoveringPointer.js.map +1 -0
  352. package/dist/helpers/markdownText.d.ts +14 -0
  353. package/dist/helpers/markdownText.d.ts.map +1 -0
  354. package/dist/helpers/markdownText.js +160 -0
  355. package/dist/helpers/markdownText.js.map +1 -0
  356. package/dist/helpers/qorusTypeCatalogue.d.ts +53 -0
  357. package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
  358. package/dist/helpers/qorusTypeCatalogue.js +262 -0
  359. package/dist/helpers/qorusTypeCatalogue.js.map +1 -0
  360. package/dist/helpers/readableColors.d.ts +36 -0
  361. package/dist/helpers/readableColors.d.ts.map +1 -0
  362. package/dist/helpers/readableColors.js +116 -0
  363. package/dist/helpers/readableColors.js.map +1 -0
  364. package/dist/helpers/templateItems.d.ts +2 -2
  365. package/dist/helpers/templateItems.d.ts.map +1 -1
  366. package/dist/helpers/templateItems.js +6 -4
  367. package/dist/helpers/templateItems.js.map +1 -1
  368. package/dist/helpers/templates.d.ts +26 -1
  369. package/dist/helpers/templates.d.ts.map +1 -1
  370. package/dist/helpers/templates.js +41 -6
  371. package/dist/helpers/templates.js.map +1 -1
  372. package/dist/helpers/validations.d.ts +9 -0
  373. package/dist/helpers/validations.d.ts.map +1 -1
  374. package/dist/helpers/validations.js +139 -33
  375. package/dist/helpers/validations.js.map +1 -1
  376. package/dist/hooks/useQorusTypes.d.ts +7 -15
  377. package/dist/hooks/useQorusTypes.d.ts.map +1 -1
  378. package/dist/hooks/useQorusTypes.js +25 -166
  379. package/dist/hooks/useQorusTypes.js.map +1 -1
  380. package/dist/hooks/useReadableIntentShade.d.ts +9 -0
  381. package/dist/hooks/useReadableIntentShade.d.ts.map +1 -0
  382. package/dist/hooks/useReadableIntentShade.js +23 -0
  383. package/dist/hooks/useReadableIntentShade.js.map +1 -0
  384. package/dist/hooks/useReadableOpacity.d.ts +6 -0
  385. package/dist/hooks/useReadableOpacity.d.ts.map +1 -0
  386. package/dist/hooks/useReadableOpacity.js +17 -0
  387. package/dist/hooks/useReadableOpacity.js.map +1 -0
  388. package/dist/index.d.ts +1 -0
  389. package/dist/index.d.ts.map +1 -1
  390. package/dist/index.js +1 -0
  391. package/dist/index.js.map +1 -1
  392. package/dist/tracking/ui/ExperimentCard.d.ts +1 -1
  393. package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -1
  394. package/dist/tracking/ui/ExperimentCard.js +26 -10
  395. package/dist/tracking/ui/ExperimentCard.js.map +1 -1
  396. package/dist/tracking/ui/card.d.ts +2 -2
  397. package/dist/tracking/ui/card.d.ts.map +1 -1
  398. package/dist/tracking/ui/card.js +2 -2
  399. package/dist/tracking/ui/card.js.map +1 -1
  400. package/dist/tracking/ui/readable.d.ts +14 -0
  401. package/dist/tracking/ui/readable.d.ts.map +1 -0
  402. package/dist/tracking/ui/readable.js +60 -0
  403. package/dist/tracking/ui/readable.js.map +1 -0
  404. package/package.json +14 -5
  405. package/.claude/CLAUDE.md +0 -317
  406. package/.tasks/EXPORT_EXPRESSION_BUILDER.md +0 -38
  407. package/.tasks/EXPRESSION_BUILDER_REPORT.md +0 -149
  408. package/.tasks/EXPRESSION_FIELD_SEAMS.md +0 -66
  409. package/.tasks/FIELD_STACK_REPORT.md +0 -234
  410. package/.tasks/FORM_ENGINE_COMPACT_READ_FIRST.md +0 -558
  411. package/.tasks/FORM_ENGINE_EXPRESSIONS.md +0 -197
  412. package/.tasks/FORM_ENGINE_OPTIONS_SYNC.md +0 -95
  413. package/.tasks/FORM_FIELD_EXTRAS.md +0 -72
  414. package/.tasks/INDEX.md +0 -111
  415. package/.tasks/LSP_SHARED_CONNECTION.md +0 -75
  416. package/.tasks/QONSOLE_ASSIST_FEATURES.md +0 -306
  417. package/.tasks/RENDER_EXPRESSION_LSP.md +0 -159
  418. package/.tasks/REQRAFT_AUTO_FIELD.md +0 -176
  419. package/.tasks/SCHEMA_DEFINITION_FIELD.md +0 -250
  420. package/.tasks/SMART_EDITOR_CONTEXT_AND_POLISH.md +0 -340
  421. package/.tasks/SMART_EDITOR_LSP_FEATURES.md +0 -299
  422. package/.tasks/SMART_EDITOR_REVIEW_FOLLOWUPS.md +0 -280
  423. package/.tasks/SMART_EDITOR_UX_POLISH.md +0 -383
  424. package/.tasks/SMART_EDITOR_VISUAL_POLISH.md +0 -246
  425. package/.tasks/STORY_NETWORK_ISOLATION.md +0 -98
  426. package/.tasks/TEMPLATE_TOKEN_GRAMMAR.md +0 -72
  427. package/CODE_OF_CONDUCT.md +0 -105
  428. package/CONTRIBUTING.MD +0 -78
  429. package/SECURITY.md +0 -3
  430. package/chromatic.config.json +0 -5
  431. package/design/COMPACT_ENGINE_REDESIGN.md +0 -156
  432. package/design/COMPACT_INFO_DISPLAY.md +0 -87
  433. package/design/COMPACT_PARITY.md +0 -85
  434. package/design/EXPRESSION_BUILDER_REPORT_STRATEGY.md +0 -92
  435. package/design/FORM_ENGINE_COMPACT.md +0 -300
  436. package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +0 -353
  437. package/design/FORM_ENGINE_EXPRESSIONS.md +0 -257
  438. package/design/FORM_ENGINE_FIELD_MIGRATION.md +0 -419
  439. package/design/IDE_INTEGRATION.md +0 -64
  440. package/design/RENDER_EXPRESSION_TRANSPORT.md +0 -156
  441. package/design/SELECT_DIALOG_FLOOR.md +0 -86
  442. package/design/SMART_EDITOR_UX.md +0 -438
  443. package/design/TRACKING.md +0 -290
  444. package/design/UNAVAILABLE_ALLOWED_VALUES.md +0 -226
  445. package/src/components/Description/index.tsx +0 -254
  446. package/src/components/Description/markdownRendererContext.tsx +0 -29
  447. package/src/components/FocusedEditing/index.tsx +0 -50
  448. package/src/components/codeSize/index.tsx +0 -79
  449. package/src/components/composer/Composer.stories.tsx +0 -238
  450. package/src/components/composer/Composer.tsx +0 -554
  451. package/src/components/composer/helpers.ts +0 -74
  452. package/src/components/composer/index.ts +0 -2
  453. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -1183
  454. package/src/components/dpqlEditor/DpqlEditor.tsx +0 -219
  455. package/src/components/dpqlEditor/dpqlHelpers.ts +0 -287
  456. package/src/components/dpqlEditor/dpqlInserter.ts +0 -121
  457. package/src/components/dpqlEditor/dpqlProbe.ts +0 -165
  458. package/src/components/dpqlEditor/dpqlTags.ts +0 -114
  459. package/src/components/dpqlEditor/index.ts +0 -41
  460. package/src/components/dpqlEditor/types.ts +0 -203
  461. package/src/components/dpqlEditor/useDpqlProbe.ts +0 -33
  462. package/src/components/dpqlEditor/useDpqlSession.ts +0 -411
  463. package/src/components/form/engine/CompactRow.tsx +0 -2620
  464. package/src/components/form/engine/CompactToolbar.tsx +0 -330
  465. package/src/components/form/engine/FormEngine.stories.tsx +0 -9920
  466. package/src/components/form/engine/FormEngine.tsx +0 -4569
  467. package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
  468. package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -331
  469. package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
  470. package/src/components/form/engine/OptionFieldMessages.tsx +0 -477
  471. package/src/components/form/engine/OptionsHelpDialog.tsx +0 -29
  472. package/src/components/form/engine/__fixtures__/basicFormOptions.ts +0 -309
  473. package/src/components/form/engine/__fixtures__/fieldChromeOptions.ts +0 -45
  474. package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +0 -233
  475. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +0 -742
  476. package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +0 -85
  477. package/src/components/form/engine/_structuredData/StructuredDataView.tsx +0 -75
  478. package/src/components/form/engine/_structuredData/structuredData.ts +0 -145
  479. package/src/components/form/engine/compactRowContext.ts +0 -148
  480. package/src/components/form/engine/compactRowStyles.ts +0 -898
  481. package/src/components/form/engine/compactToolbarContext.ts +0 -69
  482. package/src/components/form/engine/optionActions.ts +0 -128
  483. package/src/components/form/engine/optionsContext.ts +0 -24
  484. package/src/components/form/engine/readFirst.ts +0 -1077
  485. package/src/components/form/engine/rendererTypes.ts +0 -107
  486. package/src/components/form/engine/revealRow.ts +0 -123
  487. package/src/components/form/engine/rowFocus.ts +0 -101
  488. package/src/components/form/engine/rowMenuContext.ts +0 -159
  489. package/src/components/form/engine/rowOpenPicker.ts +0 -27
  490. package/src/components/form/engine/typeChoices.ts +0 -63
  491. package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +0 -159
  492. package/src/components/form/engine/variants/VariantCalmTable.tsx +0 -244
  493. package/src/components/form/engine/variants/VariantCards.tsx +0 -212
  494. package/src/components/form/engine/variants/VariantFocus.tsx +0 -382
  495. package/src/components/form/engine/variants/VariantMinimal.tsx +0 -170
  496. package/src/components/form/engine/variants/focusDemo.ts +0 -145
  497. package/src/components/form/engine/variants/variantModel.ts +0 -223
  498. package/src/components/form/engine/variants/variantParts.tsx +0 -313
  499. package/src/components/form/expressions/DpqlRendering.tsx +0 -85
  500. package/src/components/form/expressions/ExpressionField.stories.tsx +0 -1395
  501. package/src/components/form/expressions/ExpressionField.tsx +0 -503
  502. package/src/components/form/expressions/argumentPresence.ts +0 -213
  503. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +0 -1683
  504. package/src/components/form/expressions/builder/argumentDetail.tsx +0 -17
  505. package/src/components/form/expressions/builder/argumentLabel.tsx +0 -146
  506. package/src/components/form/expressions/builder/argumentSlot.tsx +0 -101
  507. package/src/components/form/expressions/builder/argumentWrapper.tsx +0 -243
  508. package/src/components/form/expressions/builder/confirmMismatchedTypesModal.tsx +0 -120
  509. package/src/components/form/expressions/builder/confirmUnsupportedTypeModal.tsx +0 -69
  510. package/src/components/form/expressions/builder/index.tsx +0 -1545
  511. package/src/components/form/expressions/builder/item.tsx +0 -89
  512. package/src/components/form/expressions/builder/moveToPositionStrip.tsx +0 -156
  513. package/src/components/form/expressions/builder/renderTemplate.tsx +0 -42
  514. package/src/components/form/expressions/dpqlMockLanguage.ts +0 -566
  515. package/src/components/form/expressions/dpqlMockLsp.ts +0 -126
  516. package/src/components/form/expressions/mockExpressions.ts +0 -317
  517. package/src/components/form/expressions/renderExpressionToText.ts +0 -137
  518. package/src/components/form/expressions/types.ts +0 -110
  519. package/src/components/form/expressions/useExpressions.ts +0 -101
  520. package/src/components/form/expressions/useRenderExpression.ts +0 -165
  521. package/src/components/form/fields/Field.stories.tsx +0 -143
  522. package/src/components/form/fields/Field.tsx +0 -732
  523. package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -297
  524. package/src/components/form/fields/array/ArrayAuto.tsx +0 -237
  525. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +0 -475
  526. package/src/components/form/fields/array/ArrayAutoField.tsx +0 -367
  527. package/src/components/form/fields/auto/AutoFormField.stories.tsx +0 -825
  528. package/src/components/form/fields/auto/AutoFormField.tsx +0 -1164
  529. package/src/components/form/fields/binary/Binary.stories.tsx +0 -122
  530. package/src/components/form/fields/binary/Binary.tsx +0 -91
  531. package/src/components/form/fields/boolean/Boolean.stories.tsx +0 -125
  532. package/src/components/form/fields/boolean/Boolean.tsx +0 -34
  533. package/src/components/form/fields/byte-size/ByteSize.stories.tsx +0 -87
  534. package/src/components/form/fields/byte-size/ByteSize.tsx +0 -58
  535. package/src/components/form/fields/color/Color.stories.tsx +0 -99
  536. package/src/components/form/fields/color/Color.tsx +0 -46
  537. package/src/components/form/fields/cron/Cron.stories.tsx +0 -68
  538. package/src/components/form/fields/cron/Cron.tsx +0 -80
  539. package/src/components/form/fields/date/Date.stories.tsx +0 -77
  540. package/src/components/form/fields/date/Date.tsx +0 -55
  541. package/src/components/form/fields/emittedValues.ts +0 -70
  542. package/src/components/form/fields/file/File.stories.tsx +0 -161
  543. package/src/components/form/fields/file/File.tsx +0 -227
  544. package/src/components/form/fields/long-string/LongString.stories.tsx +0 -120
  545. package/src/components/form/fields/long-string/LongString.tsx +0 -130
  546. package/src/components/form/fields/markdown/Markdown.stories.tsx +0 -76
  547. package/src/components/form/fields/markdown/Markdown.tsx +0 -81
  548. package/src/components/form/fields/markdown/MarkdownView.tsx +0 -222
  549. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +0 -139
  550. package/src/components/form/fields/number/Number.stories.tsx +0 -159
  551. package/src/components/form/fields/number/Number.tsx +0 -160
  552. package/src/components/form/fields/object/Object.stories.tsx +0 -398
  553. package/src/components/form/fields/object/Object.tsx +0 -255
  554. package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +0 -95
  555. package/src/components/form/fields/radio-group/RadioGroup.tsx +0 -46
  556. package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
  557. package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
  558. package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
  559. package/src/components/form/fields/rich-text/RichText.stories.tsx +0 -260
  560. package/src/components/form/fields/rich-text/RichText.tsx +0 -537
  561. package/src/components/form/fields/schema-definition/CatalogLeafForm.tsx +0 -242
  562. package/src/components/form/fields/schema-definition/CatalogNodeEditor.tsx +0 -758
  563. package/src/components/form/fields/schema-definition/Hint.tsx +0 -22
  564. package/src/components/form/fields/schema-definition/InlineValidationBanner.tsx +0 -138
  565. package/src/components/form/fields/schema-definition/Loader.tsx +0 -20
  566. package/src/components/form/fields/schema-definition/MigrationsTab.tsx +0 -187
  567. package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +0 -286
  568. package/src/components/form/fields/schema-definition/TableEditor.tsx +0 -155
  569. package/src/components/form/fields/schema-definition/TablesTab.tsx +0 -138
  570. package/src/components/form/fields/schema-definition/catalog.ts +0 -237
  571. package/src/components/form/fields/schema-definition/helpers.ts +0 -90
  572. package/src/components/form/fields/schema-definition/index.tsx +0 -418
  573. package/src/components/form/fields/schema-definition/mockCatalog.ts +0 -325
  574. package/src/components/form/fields/schema-definition/mockDefinition.ts +0 -111
  575. package/src/components/form/fields/schema-definition/referenceSuggestions.tsx +0 -152
  576. package/src/components/form/fields/schema-definition/starterTemplate.ts +0 -68
  577. package/src/components/form/fields/schema-definition/types.ts +0 -185
  578. package/src/components/form/fields/schema-definition/useSchemaOptionCatalog.ts +0 -49
  579. package/src/components/form/fields/select/Select.stories.tsx +0 -872
  580. package/src/components/form/fields/select/Select.tsx +0 -624
  581. package/src/components/form/fields/select/SelectCollection.tsx +0 -594
  582. package/src/components/form/fields/string/String.stories.tsx +0 -86
  583. package/src/components/form/fields/string/String.tsx +0 -43
  584. package/src/components/form/fields/template/ExampleValueModal.stories.tsx +0 -114
  585. package/src/components/form/fields/template/ExampleValueModal.tsx +0 -99
  586. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +0 -47
  587. package/src/components/form/fields/template/TemplateField.stories.tsx +0 -1121
  588. package/src/components/form/fields/template/TemplateField.tsx +0 -1717
  589. package/src/components/form/fields/template/TemplateText.tsx +0 -115
  590. package/src/components/form/fields/template/__fixtures__/longExampleValue.ts +0 -7
  591. package/src/components/form/fields/template/__fixtures__/multiLevelTemplates.json +0 -147
  592. package/src/components/form/fields/template/__fixtures__/templates.json +0 -83
  593. package/src/components/form/fields/timeout/Timeout.stories.tsx +0 -228
  594. package/src/components/form/fields/timeout/Timeout.tsx +0 -87
  595. package/src/components/form/fields/url/Url.stories.tsx +0 -94
  596. package/src/components/form/fields/url/Url.tsx +0 -85
  597. package/src/components/form/index.tsx +0 -47
  598. package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
  599. package/src/components/imageLightbox/ImageLightbox.tsx +0 -236
  600. package/src/components/imageLightbox/index.ts +0 -1
  601. package/src/components/log/Log.stories.tsx +0 -333
  602. package/src/components/log/Log.tsx +0 -285
  603. package/src/components/menu/Menu.stories.tsx +0 -155
  604. package/src/components/menu/Menu.tsx +0 -312
  605. package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +0 -797
  606. package/src/components/qonsoleSmartInput/QonsoleSmartInput.tsx +0 -105
  607. package/src/components/qonsoleSmartInput/index.ts +0 -16
  608. package/src/components/qonsoleSmartInput/qonsoleInserter.ts +0 -77
  609. package/src/components/qonsoleSmartInput/types.ts +0 -133
  610. package/src/components/qonsoleSmartInput/useQonsoleSession.ts +0 -124
  611. package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +0 -62
  612. package/src/components/searchFilterBar/SearchFilterBar.tsx +0 -144
  613. package/src/components/searchFilterBar/index.ts +0 -1
  614. package/src/components/smartEditor/MarkdownDoc.tsx +0 -190
  615. package/src/components/smartEditor/SmartEditor.stories.tsx +0 -475
  616. package/src/components/smartEditor/SmartEditor.tsx +0 -808
  617. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +0 -205
  618. package/src/components/smartEditor/helpers.ts +0 -217
  619. package/src/components/smartEditor/index.ts +0 -35
  620. package/src/components/smartEditor/styling.ts +0 -45
  621. package/src/components/smartEditor/types.ts +0 -211
  622. package/src/components/smartEditor/useLspAutocomplete.ts +0 -758
  623. package/src/components/smartEditor/useLspDiagnosticDecorations.ts +0 -125
  624. package/src/components/smartEditor/useLspHover.ts +0 -230
  625. package/src/components/smartEditor/useLspSemanticTokens.ts +0 -298
  626. package/src/components/smartEditor/useLspSession.ts +0 -231
  627. package/src/components/smartEditor/useLspSignatureHelp.ts +0 -198
  628. package/src/components/supportTicket/AttachmentChips.stories.tsx +0 -171
  629. package/src/components/supportTicket/AttachmentChips.tsx +0 -147
  630. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +0 -257
  631. package/src/components/supportTicket/InterfaceReferenceTags.tsx +0 -129
  632. package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -584
  633. package/src/components/supportTicket/ReferencePicker.tsx +0 -563
  634. package/src/components/supportTicket/TicketConversation.stories.tsx +0 -121
  635. package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
  636. package/src/components/supportTicket/TicketHeader.tsx +0 -247
  637. package/src/components/supportTicket/TicketMetaTags.stories.tsx +0 -103
  638. package/src/components/supportTicket/TicketMetaTags.tsx +0 -85
  639. package/src/components/supportTicket/TicketReplyBox.stories.tsx +0 -354
  640. package/src/components/supportTicket/TicketReplyBox.tsx +0 -150
  641. package/src/components/supportTicket/__fixtures__/kindMarks.ts +0 -28
  642. package/src/components/supportTicket/attachmentAccess.ts +0 -97
  643. package/src/components/supportTicket/fileToAttachment.ts +0 -24
  644. package/src/components/supportTicket/index.ts +0 -10
  645. package/src/components/supportTicket/meta.ts +0 -206
  646. package/src/components/supportTicket/ticketModel.ts +0 -131
  647. package/src/components/supportTicket/useLoadedImages.ts +0 -73
  648. package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -315
  649. package/src/components/ticketReferences/TicketReferences.tsx +0 -906
  650. package/src/components/ticketReferences/index.ts +0 -2
  651. package/src/components/ticketThread/TicketThread.stories.tsx +0 -829
  652. package/src/components/ticketThread/TicketThread.tsx +0 -719
  653. package/src/components/ticketThread/index.ts +0 -6
  654. package/src/contexts/FetchContext.tsx +0 -25
  655. package/src/contexts/ReqraftContext.tsx +0 -9
  656. package/src/contexts/StorageContext.tsx +0 -33
  657. package/src/global.d.ts +0 -4
  658. package/src/helpers/allowedValues.ts +0 -249
  659. package/src/helpers/choiceChip.ts +0 -227
  660. package/src/helpers/common.ts +0 -326
  661. package/src/helpers/dpqlDetection.ts +0 -209
  662. package/src/helpers/expressions.ts +0 -140
  663. package/src/helpers/optionUiTypes.ts +0 -199
  664. package/src/helpers/options.ts +0 -150
  665. package/src/helpers/providerValue.ts +0 -125
  666. package/src/helpers/scrollbar.ts +0 -32
  667. package/src/helpers/singleLineString.ts +0 -61
  668. package/src/helpers/templateItems.ts +0 -81
  669. package/src/helpers/templateText.ts +0 -350
  670. package/src/helpers/templates.ts +0 -602
  671. package/src/helpers/validations.ts +0 -2085
  672. package/src/hooks/useArgSchema.ts +0 -37
  673. package/src/hooks/useCoarsePointer.ts +0 -30
  674. package/src/hooks/useFetch/useFetch.stories.tsx +0 -379
  675. package/src/hooks/useFetch/useFetch.tsx +0 -154
  676. package/src/hooks/usePhoneViewport.ts +0 -34
  677. package/src/hooks/useQorusTypes.ts +0 -233
  678. package/src/hooks/useReqraftProperty.ts +0 -16
  679. package/src/hooks/useStorage/useStorage.stories.tsx +0 -168
  680. package/src/hooks/useStorage/useStorage.ts +0 -35
  681. package/src/hooks/useTemplates.ts +0 -123
  682. package/src/hooks/useValidation.ts +0 -9
  683. package/src/hooks/useWebSocket/useWebSocket.ts +0 -224
  684. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +0 -640
  685. package/src/hooks/useWhyDidYouUpdate.ts +0 -38
  686. package/src/index.tsx +0 -86
  687. package/src/providers/FetchProvider.tsx +0 -40
  688. package/src/providers/ReqraftProvider.tsx +0 -52
  689. package/src/providers/StorageProvider.tsx +0 -131
  690. package/src/stores/currentUser/currentUser.stories.tsx +0 -100
  691. package/src/stores/currentUser/currentUser.tsx +0 -94
  692. package/src/stories/Data/fileFieldArgSchema.json +0 -86
  693. package/src/stories/Tests/utils.ts +0 -320
  694. package/src/stories/storyNetwork.ts +0 -92
  695. package/src/stories/tracking.tsx +0 -206
  696. package/src/tracking/browser/attach.ts +0 -186
  697. package/src/tracking/browser/env.ts +0 -78
  698. package/src/tracking/core/consent.ts +0 -37
  699. package/src/tracking/core/engagement.ts +0 -47
  700. package/src/tracking/core/experiments.ts +0 -258
  701. package/src/tracking/core/hash.ts +0 -26
  702. package/src/tracking/core/ids.ts +0 -25
  703. package/src/tracking/core/observable.ts +0 -23
  704. package/src/tracking/core/queue.ts +0 -131
  705. package/src/tracking/core/sections.ts +0 -166
  706. package/src/tracking/core/storage.ts +0 -69
  707. package/src/tracking/core/tracker.ts +0 -417
  708. package/src/tracking/core/types.ts +0 -162
  709. package/src/tracking/core/utm.ts +0 -23
  710. package/src/tracking/index.ts +0 -72
  711. package/src/tracking/markup.ts +0 -17
  712. package/src/tracking/react/Experiment.tsx +0 -44
  713. package/src/tracking/react/TrackingProvider.tsx +0 -56
  714. package/src/tracking/react/hooks.ts +0 -106
  715. package/src/tracking/react/index.ts +0 -13
  716. package/src/tracking/testing.ts +0 -108
  717. package/src/tracking/ui/ExperimentCard.stories.tsx +0 -296
  718. package/src/tracking/ui/ExperimentCard.tsx +0 -667
  719. package/src/tracking/ui/ExperimentsOverlay.stories.tsx +0 -155
  720. package/src/tracking/ui/ExperimentsOverlay.tsx +0 -437
  721. package/src/tracking/ui/anchor.ts +0 -180
  722. package/src/tracking/ui/card.ts +0 -464
  723. package/src/tracking/ui/client.ts +0 -117
  724. package/src/tracking/ui/index.ts +0 -77
  725. package/src/tracking/ui/types.ts +0 -110
  726. package/src/tracking/ui/useExperimentsAdmin.ts +0 -103
  727. package/src/types/Form.ts +0 -29
  728. package/src/types.ts +0 -14
  729. package/src/utils/datetime.ts +0 -10
  730. package/src/utils/fetch.ts +0 -457
  731. package/src/utils/lspClient.ts +0 -711
  732. package/src/utils/lspClient.types.ts +0 -211
  733. package/src/utils/queryUnlessCancelled.ts +0 -28
  734. package/src/utils/websocket.ts +0 -293
  735. package/vite.config.ts +0 -58
  736. package/vitest.config.ts +0 -69
@@ -1,186 +0,0 @@
1
- import { effectiveRatio } from '../core/sections';
2
- import type { Tracker } from '../core/tracker';
3
-
4
- /**
5
- * Connects a `Tracker` to the page: tab visibility, page leave, interactions,
6
- * scroll depth, the heartbeat, section visibility (IntersectionObserver on every
7
- * `[data-track-section]`) and clicks (one delegated listener for
8
- * `[data-track-click]`). Returns a function that removes all of it.
9
- *
10
- * Markup contract (see design/TRACKING.md):
11
- * data-track-section="<id>" a section: visible time, seen, exit section
12
- * data-track-click="<target>" a tracked click (`get-started`, `contact`, …)
13
- * data-track-placement="<where>" optional; defaults to the enclosing section id
14
- * data-track-label="<text>" optional; defaults to the element's text
15
- */
16
-
17
- const SECTION_SELECTOR = '[data-track-section]';
18
- const THRESHOLDS = Array.from({ length: 21 }, (_, i) => i / 20);
19
- const TICK_MS = 250;
20
- const ACTIVITY_EVENTS = ['pointerdown', 'keydown', 'wheel', 'touchstart', 'mousemove', 'scroll'] as const;
21
-
22
- export interface IAttached {
23
- detach: () => void;
24
- /** Observes an element under a synthetic id (an experiment's wrapped element); not in the page summary. */
25
- observeElement: (el: Element, id: string) => () => void;
26
- }
27
-
28
- const clean = (s: string | null | undefined, max = 80) => {
29
- const t = (s ?? '').replace(/\s+/g, ' ').trim();
30
- return t ? t.slice(0, max) : null;
31
- };
32
-
33
- export const attachToPage = (tracker: Tracker, heartbeatMs: number): IAttached => {
34
- const cleanup: (() => void)[] = [];
35
- const on = (target: EventTarget, type: string, fn: EventListener, opts?: AddEventListenerOptions) => {
36
- target.addEventListener(type, fn, opts);
37
- cleanup.push(() => target.removeEventListener(type, fn, opts));
38
- };
39
- const safe = (fn: () => void) => () => {
40
- try {
41
- fn();
42
- } catch {
43
- /* never into the page */
44
- }
45
- };
46
-
47
- // ── tab visibility and page leave
48
- on(document, 'visibilitychange', safe(() => tracker.setTabVisible(document.visibilityState === 'visible')));
49
- on(window, 'pagehide', safe(() => tracker.leave()));
50
- if (document.visibilityState !== 'visible') tracker.setTabVisible(false);
51
-
52
- // ── engagement (throttled to one signal per second)
53
- let lastActivity = 0;
54
- const activity = safe(() => {
55
- const now = Date.now();
56
- if (now - lastActivity < 1000) return;
57
- lastActivity = now;
58
- tracker.activity();
59
- });
60
- ACTIVITY_EVENTS.forEach((t) => on(window, t, activity, { passive: true, capture: true }));
61
-
62
- // ── scroll depth (once per frame)
63
- let scrollQueued = false;
64
- const measureScroll = safe(() => {
65
- scrollQueued = false;
66
- const doc = document.documentElement;
67
- const scrollable = Math.max(doc.scrollHeight, document.body?.scrollHeight ?? 0);
68
- const seen = window.scrollY + window.innerHeight;
69
- tracker.scrolled(scrollable > 0 ? (seen / scrollable) * 100 : 100);
70
- });
71
- on(window, 'scroll', () => {
72
- if (scrollQueued) return;
73
- scrollQueued = true;
74
- requestAnimationFrame(measureScroll);
75
- }, { passive: true });
76
-
77
- // ── heartbeat while visible, and the section clock
78
- const heartbeat = setInterval(safe(() => document.visibilityState === 'visible' && tracker.heartbeat()), heartbeatMs);
79
- const tick = setInterval(safe(() => tracker.sections.tick(tracker.now())), TICK_MS);
80
- cleanup.push(() => clearInterval(heartbeat), () => clearInterval(tick));
81
-
82
- // ── sections
83
- const ratios = new Map<Element, number>();
84
- const ids = new Map<Element, string>();
85
- const report = new Map<string, boolean>();
86
- const apply = (id: string) => {
87
- let best = 0;
88
- ids.forEach((other, el) => other === id && (best = Math.max(best, ratios.get(el) ?? 0)));
89
- tracker.sections.update(id, best, tracker.now());
90
- };
91
- const io =
92
- typeof IntersectionObserver !== 'undefined'
93
- ? new IntersectionObserver(
94
- (entries) =>
95
- safe(() => {
96
- const vh = window.innerHeight || document.documentElement.clientHeight;
97
- entries.forEach((e) => {
98
- const id = ids.get(e.target);
99
- if (!id) return;
100
- ratios.set(e.target, effectiveRatio(e.intersectionRatio, e.intersectionRect.height, e.rootBounds?.height ?? vh));
101
- apply(id);
102
- });
103
- })(),
104
- { threshold: THRESHOLDS },
105
- )
106
- : null;
107
-
108
- const track = (el: Element, id: string, inSummary: boolean) => {
109
- if (ids.get(el) === id) return;
110
- ids.set(el, id);
111
- report.set(id, (report.get(id) ?? false) || inSummary);
112
- tracker.sections.register(id, inSummary);
113
- io?.observe(el);
114
- };
115
- const untrack = (el: Element) => {
116
- const id = ids.get(el);
117
- if (!id) return;
118
- io?.unobserve(el);
119
- ids.delete(el);
120
- ratios.delete(el);
121
- apply(id);
122
- };
123
-
124
- const scan = safe(() => {
125
- const present = new Set<Element>(Array.from(document.querySelectorAll(SECTION_SELECTOR)));
126
- ids.forEach((id, el) => report.get(id) && !present.has(el) && !el.isConnected && untrack(el));
127
- present.forEach((el) => {
128
- const id = (el as HTMLElement).dataset.trackSection;
129
- if (id) track(el, id, true);
130
- });
131
- });
132
-
133
- // Re-measure everything at a new page view: the section clock starts from zero,
134
- // and re-observing makes the observer report every element's current state.
135
- const remeasure = safe(() => {
136
- scan();
137
- ids.forEach((_id, el) => {
138
- io?.unobserve(el);
139
- io?.observe(el);
140
- });
141
- });
142
- cleanup.push(tracker.pageViewId.subscribe(remeasure));
143
-
144
- let scanTimer: ReturnType<typeof setTimeout> | null = null;
145
- const mo =
146
- typeof MutationObserver !== 'undefined'
147
- ? new MutationObserver(() => {
148
- if (scanTimer) return;
149
- scanTimer = setTimeout(() => {
150
- scanTimer = null;
151
- scan();
152
- }, 150);
153
- })
154
- : null;
155
- mo?.observe(document.body, { childList: true, subtree: true });
156
- scan();
157
- cleanup.push(() => {
158
- mo?.disconnect();
159
- io?.disconnect();
160
- if (scanTimer) clearTimeout(scanTimer);
161
- });
162
-
163
- // ── clicks: one delegated listener
164
- const onClick = (e: Event) =>
165
- safe(() => {
166
- const el = (e.target as Element | null)?.closest?.('[data-track-click]') as HTMLElement | null;
167
- if (!el) return;
168
- const d = el.dataset;
169
- const link = el.closest('a');
170
- tracker.click({
171
- target: d.trackClick || 'unknown',
172
- placement: d.trackPlacement || (el.closest(SECTION_SELECTOR) as HTMLElement | null)?.dataset.trackSection || null,
173
- label: clean(d.trackLabel) ?? clean(el.innerText) ?? clean(el.getAttribute('aria-label')),
174
- href: d.trackHref || link?.href || null,
175
- });
176
- })();
177
- on(document, 'click', onClick, { capture: true });
178
-
179
- return {
180
- detach: () => cleanup.forEach((fn) => fn()),
181
- observeElement: (el, id) => {
182
- track(el, id, false);
183
- return () => untrack(el);
184
- },
185
- };
186
- };
@@ -1,78 +0,0 @@
1
- import type { ITransport } from '../core/queue';
2
- import { safeStorage } from '../core/storage';
3
- import type { IPageInfo, ITrackerEnv } from '../core/tracker';
4
-
5
- /**
6
- * Sends a batch. `beacon` (page going away): `navigator.sendBeacon`, falling back
7
- * to `fetch(…, { keepalive: true })` when the beacon is refused (too big, or the
8
- * browser has none). Any HTTP answer counts as delivered — the collector always
9
- * answers 204, and a 404 (collector not installed) must not turn into a retry loop;
10
- * only a network error keeps the batch for the next flush.
11
- */
12
- export const browserTransport = (endpoint: string): ITransport => ({
13
- async send(body, mode) {
14
- if (mode === 'beacon' && typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {
15
- try {
16
- if (navigator.sendBeacon(endpoint, new Blob([body], { type: 'application/json' }))) return true;
17
- } catch {
18
- /* fall through to fetch */
19
- }
20
- }
21
- try {
22
- await fetch(endpoint, {
23
- method: 'POST',
24
- body,
25
- headers: { 'Content-Type': 'application/json' },
26
- // Batches stay under 60 KB (queue.ts), inside keepalive's 64 KB budget.
27
- keepalive: true,
28
- credentials: 'same-origin',
29
- });
30
- return true;
31
- } catch {
32
- return false;
33
- }
34
- },
35
- });
36
-
37
- const fetchJson = async (url: string, timeoutMs: number): Promise<unknown> => {
38
- const ctrl = typeof AbortController !== 'undefined' ? new AbortController() : undefined;
39
- const timer = setTimeout(() => ctrl?.abort(), timeoutMs);
40
- try {
41
- const res = await fetch(url, { headers: { Accept: 'application/json' }, signal: ctrl?.signal, credentials: 'same-origin' });
42
- if (!res.ok) throw new Error(`HTTP ${res.status}`);
43
- return await res.json();
44
- } finally {
45
- clearTimeout(timer);
46
- }
47
- };
48
-
49
- /** desktop / tablet / mobile from the user agent (targeting only; the server classifies for reports). */
50
- export const deviceOf = (ua: string): IPageInfo['device'] => {
51
- if (/iPad|Tablet|PlayBook|Silk|Android(?!.*Mobile)/i.test(ua)) return 'tablet';
52
- if (/Mobi|iPhone|iPod|Android.*Mobile|Opera Mini|IEMobile/i.test(ua)) return 'mobile';
53
- return 'desktop';
54
- };
55
-
56
- const readPage = (): IPageInfo => ({
57
- origin: window.location.origin,
58
- path: window.location.pathname,
59
- search: window.location.search,
60
- title: document.title,
61
- referrer: document.referrer,
62
- lang: navigator.language || 'en',
63
- viewport: [window.innerWidth, window.innerHeight],
64
- device: deviceOf(navigator.userAgent || ''),
65
- });
66
-
67
- export const browserEnv = (endpoint: string): ITrackerEnv => ({
68
- local: safeStorage(() => window.localStorage),
69
- session: safeStorage(() => window.sessionStorage),
70
- transport: browserTransport(endpoint),
71
- now: () => Date.now(),
72
- setTimer: (fn, ms) => setTimeout(fn, ms),
73
- clearTimer: (h) => clearTimeout(h as ReturnType<typeof setTimeout>),
74
- page: readPage,
75
- fetchJson,
76
- // eslint-disable-next-line no-console
77
- log: (...args) => console.info(...args),
78
- });
@@ -1,37 +0,0 @@
1
- import type { IStorage } from './storage';
2
- import { Observable } from './observable';
3
- import { KEYS, type TConsentState, type TStorageKeys } from './types';
4
-
5
- /**
6
- * The visitor's answer (§3 of the contract): `localStorage["<prefix>consent"]` is
7
- * `granted` | `denied`, `<prefix>consent.v` the version of the text they answered
8
- * (prefix `qa.` by default). An answer to an older version counts as no answer, so
9
- * the consent prompt asks again.
10
- */
11
- export class ConsentStore {
12
- readonly state: Observable<TConsentState>;
13
-
14
- constructor(
15
- private readonly storage: IStorage,
16
- private readonly version: number,
17
- private readonly keys: TStorageKeys = KEYS,
18
- ) {
19
- this.state = new Observable<TConsentState>(this.read());
20
- }
21
-
22
- private read(): TConsentState {
23
- const answer = this.storage.get(this.keys.consent);
24
- const version = Number(this.storage.get(this.keys.consentVersion) ?? 0);
25
- if ((answer === 'granted' || answer === 'denied') && version >= this.version) return answer;
26
- return 'unknown';
27
- }
28
-
29
- get = (): TConsentState => this.state.get();
30
- granted = (): boolean => this.state.get() === 'granted';
31
-
32
- answer(state: 'granted' | 'denied') {
33
- this.storage.set(this.keys.consent, state);
34
- this.storage.set(this.keys.consentVersion, String(this.version));
35
- this.state.set(state);
36
- }
37
- }
@@ -1,47 +0,0 @@
1
- /**
2
- * Engaged time: the tab is visible AND the visitor did something (scroll, pointer,
3
- * key, touch) within the last `windowMs`. Each interaction extends the engaged
4
- * stretch to `interaction + windowMs`; hiding the tab ends it at once.
5
- */
6
- export class EngagementClock {
7
- private engagedMs = 0;
8
- /** Start and end of the current engaged stretch (end is in the future while active). */
9
- private from: number | null = null;
10
- private until = 0;
11
- private tabVisible = true;
12
-
13
- constructor(private readonly windowMs: number) {}
14
-
15
- reset() {
16
- this.engagedMs = 0;
17
- this.from = null;
18
- this.until = 0;
19
- }
20
-
21
- activity(now: number) {
22
- if (!this.tabVisible) return;
23
- if (this.from != null && now <= this.until) {
24
- this.until = now + this.windowMs;
25
- return;
26
- }
27
- this.close(now);
28
- this.from = now;
29
- this.until = now + this.windowMs;
30
- }
31
-
32
- setTabVisible(visible: boolean, now: number) {
33
- if (!visible) this.close(now);
34
- this.tabVisible = visible;
35
- }
36
-
37
- private close(now: number) {
38
- if (this.from == null) return;
39
- this.engagedMs += Math.max(0, Math.min(now, this.until) - this.from);
40
- this.from = null;
41
- }
42
-
43
- total(now: number): number {
44
- const open = this.from != null ? Math.max(0, Math.min(now, this.until) - this.from) : 0;
45
- return Math.round(this.engagedMs + open);
46
- }
47
- }
@@ -1,258 +0,0 @@
1
- import { hashV2 } from './hash';
2
- import { Observable } from './observable';
3
- import { readJson, writeJson, type IStorage } from './storage';
4
- import { KEYS, type IExperimentDefinition, type IExperimentVariant, type TStorageKeys } from './types';
5
-
6
- /**
7
- * Client-side assignment (§5 of the contract). No round trip: the running
8
- * experiments are fetched once (public fields only) and every visitor is bucketed
9
- * locally from their `vid`, the same way every time, on any page.
10
- */
11
-
12
- export type TAssignmentReason =
13
- /** Bucketed into a variant: an exposure is logged when the trigger is seen. */
14
- | 'assigned'
15
- /** Outside the experiment's traffic share: control, no exposure. */
16
- | 'not-enrolled'
17
- /** Targeting (path, device, language) does not match: control, no exposure. */
18
- | 'not-targeted'
19
- /** No consent (no vid) or tracking disabled: control, no exposure. */
20
- | 'no-consent'
21
- /** Definitions not loaded (yet, or the endpoint is missing) or experiment not running: control. */
22
- | 'not-running'
23
- /** A preview link (`?qa_variant=`) or the in-app version switch: that variant, never logged. */
24
- | 'preview'
25
- /** The experiment ended: everybody sees the winner, nothing is logged. */
26
- | 'concluded';
27
-
28
- export interface IAssignment {
29
- key: string;
30
- variant: string;
31
- /** Whether this visitor counts for the experiment (exposure is logged). */
32
- enrolled: boolean;
33
- reason: TAssignmentReason;
34
- /** The section whose being seen logs the exposure; null → on render. */
35
- trigger: string | null;
36
- }
37
-
38
- export interface IAssignContext {
39
- path: string;
40
- device?: 'desktop' | 'tablet' | 'mobile';
41
- lang?: string;
42
- }
43
-
44
- export const controlOf = (variants: IExperimentVariant[], fallback = 'a'): string =>
45
- (variants.find((v) => v.control) ?? variants[0])?.key ?? fallback;
46
-
47
- /**
48
- * GrowthBook's bucket ranges: variant i owns `[c_i, c_i + traffic * w_i)` where
49
- * `c_i` is the sum of the weights before it. The enrolled share equals `traffic`,
50
- * and raising `traffic` later never moves an enrolled visitor to another variant.
51
- * Weights that do not add up to 1 are normalised.
52
- */
53
- export const bucketRanges = (weights: number[], traffic: number): [number, number][] => {
54
- const cover = Math.min(1, Math.max(0, Number.isFinite(traffic) ? traffic : 0));
55
- const clean = weights.map((w) => (Number.isFinite(w) && w > 0 ? w : 0));
56
- const sum = clean.reduce((a, b) => a + b, 0);
57
- const norm = sum > 0 ? clean.map((w) => w / sum) : clean.map(() => 1 / clean.length);
58
- let cumulative = 0;
59
- return norm.map((w) => {
60
- const start = cumulative;
61
- cumulative += w;
62
- return [start, start + cover * w];
63
- });
64
- };
65
-
66
- /** `/` matches `/` only; `/blog/*` matches `/blog/` and everything under it. */
67
- export const pathMatches = (patterns: string[] | null | undefined, path: string): boolean => {
68
- if (!patterns || !patterns.length) return true;
69
- const clean = path.split(/[?#]/)[0] || '/';
70
- return patterns.some((p) => (p.endsWith('*') ? clean.startsWith(p.slice(0, -1)) : clean === p || clean === `${p}/`));
71
- };
72
-
73
- const targeted = (def: IExperimentDefinition, ctx: IAssignContext): boolean => {
74
- const t = def.targeting;
75
- if (!t) return true;
76
- if (!pathMatches(t.paths, ctx.path)) return false;
77
- if (t.device && ctx.device && t.device !== ctx.device) return false;
78
- if (t.lang && ctx.lang && !ctx.lang.toLowerCase().startsWith(t.lang.toLowerCase())) return false;
79
- return true;
80
- };
81
-
82
- /** Pure assignment of one visitor to one experiment. */
83
- export const assign = (def: IExperimentDefinition, vid: string | null, ctx: IAssignContext): IAssignment => {
84
- const control = controlOf(def.variants);
85
- const trigger = def.trigger?.section ?? null;
86
- const base = { key: def.key, variant: control, enrolled: false, trigger };
87
- if (def.status === 'concluded') return { ...base, variant: def.winner || control, reason: 'concluded' };
88
- if (!vid) return { ...base, reason: 'no-consent' };
89
- if (!def.variants.length) return { ...base, reason: 'not-running' };
90
- if (!targeted(def, ctx)) return { ...base, reason: 'not-targeted' };
91
- const n = hashV2(def.key, vid);
92
- const ranges = bucketRanges(
93
- def.variants.map((v) => v.weight),
94
- def.traffic,
95
- );
96
- const i = ranges.findIndex(([from, to]) => n >= from && n < to);
97
- if (i < 0) return { ...base, reason: 'not-enrolled' };
98
- return { ...base, variant: def.variants[i].key, enrolled: true, reason: 'assigned' };
99
- };
100
-
101
- /** The default preview query parameter. */
102
- export const DEFAULT_PREVIEW_PARAM = 'qa_variant';
103
-
104
- /**
105
- * `?qa_variant=signup-cta:b,other:a` → `{ 'signup-cta': 'b', other: 'a' }`.
106
- * `?qa_variant=clear` (or `off`) → `{}` and clears the saved preview.
107
- * Returns null when the parameter is absent. `param` names the query parameter.
108
- */
109
- export const parsePreview = (search: string, param: string = DEFAULT_PREVIEW_PARAM): Record<string, string> | null => {
110
- let raw: string | null = null;
111
- try {
112
- raw = new URLSearchParams(search).get(param);
113
- } catch {
114
- return null;
115
- }
116
- if (raw == null) return null;
117
- const out: Record<string, string> = {};
118
- if (raw === 'clear' || raw === 'off') return out;
119
- raw.split(',').forEach((pair) => {
120
- const [k, v] = pair.split(':').map((s) => s?.trim());
121
- if (k && v && /^[\w.-]{1,80}$/.test(k) && /^[\w.-]{1,40}$/.test(v)) out[k] = v;
122
- });
123
- return out;
124
- };
125
-
126
- export type TExperimentsStatus = 'idle' | 'loading' | 'ready' | 'failed';
127
-
128
- interface ICache {
129
- at: number;
130
- property: string;
131
- experiments: IExperimentDefinition[];
132
- }
133
-
134
- /** Cached definitions are used for a flicker-free first render for up to a day, then refreshed. */
135
- const CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000;
136
- const FETCH_TIMEOUT_MS = 4000;
137
-
138
- /** A usable entry, normalised (a concluded entry gets `variants: []`); null for junk. */
139
- export const normaliseDefinition = (x: unknown): IExperimentDefinition | null => {
140
- const d = x as IExperimentDefinition;
141
- if (!d || typeof d.key !== 'string') return null;
142
- if (d.status === 'concluded') return typeof d.winner === 'string' && d.winner ? { ...d, variants: d.variants ?? [] } : null;
143
- if (d.status && d.status !== 'running') return null;
144
- const ok = Array.isArray(d.variants) && d.variants.every((v) => v && typeof v.key === 'string' && typeof v.weight === 'number');
145
- return ok ? d : null;
146
- };
147
-
148
- export interface IExperimentsDeps {
149
- property: string;
150
- endpoint: string;
151
- local: IStorage;
152
- session: IStorage;
153
- now: () => number;
154
- fetchJson: (url: string, timeoutMs: number) => Promise<unknown>;
155
- /** Storage keys (default prefix `qa.`). */
156
- keys?: TStorageKeys;
157
- /** The preview query parameter (default `qa_variant`). */
158
- previewParam?: string;
159
- }
160
-
161
- /** Holds the running experiments and the preview overrides. */
162
- export class ExperimentStore {
163
- readonly status = new Observable<TExperimentsStatus>('idle');
164
- /**
165
- * An in-app version switch, per experiment (`{ key: variant }`), in this browser's
166
- * localStorage (an editor lets its user see each version). A preview: never logged.
167
- * Rendered variants follow it live.
168
- */
169
- readonly editorOverrides: Observable<Record<string, string>>;
170
- /**
171
- * Bumped by `refresh()` (an editor, after it accepted a winner or removed a version): mounted
172
- * experiments decide again, so an accepted test shows its winner at once. Visitors never
173
- * trigger it, so their variant stays fixed for the page view.
174
- */
175
- readonly revision = new Observable<number>(0);
176
- private definitions = new Map<string, IExperimentDefinition>();
177
- private preview: Record<string, string>;
178
- private readonly keys: TStorageKeys;
179
-
180
- constructor(private readonly d: IExperimentsDeps) {
181
- this.keys = d.keys ?? KEYS;
182
- this.preview = readJson<Record<string, string>>(d.session, this.keys.preview) ?? {};
183
- this.editorOverrides = new Observable<Record<string, string>>(readJson<Record<string, string>>(d.local, this.keys.editorVariants) ?? {});
184
- const cache = readJson<ICache>(d.local, this.keys.experimentsCache);
185
- if (cache && cache.property === d.property && d.now() - cache.at < CACHE_MAX_AGE_MS && Array.isArray(cache.experiments)) {
186
- this.setDefinitions(cache.experiments);
187
- this.status.set('ready');
188
- }
189
- }
190
-
191
- /** Reads the preview parameter (`?qa_variant=`) from the URL; the preview sticks for the browser session. */
192
- applyPreviewFrom(search: string) {
193
- const parsed = parsePreview(search, this.d.previewParam ?? DEFAULT_PREVIEW_PARAM);
194
- if (!parsed) return;
195
- this.preview = Object.keys(parsed).length ? { ...this.preview, ...parsed } : {};
196
- if (Object.keys(this.preview).length) writeJson(this.d.session, this.keys.preview, this.preview);
197
- else this.d.session.remove(this.keys.preview);
198
- }
199
-
200
- /** The in-app switch first, then a preview link. */
201
- previewOf = (key: string): string | undefined => this.editorOverrides.get()[key] ?? this.preview[key];
202
-
203
- editorOverrideOf = (key: string): string | undefined => this.editorOverrides.get()[key];
204
-
205
- /** The in-app version switch for one experiment; `null` goes back to the visitor's own variant. */
206
- setEditorOverride(key: string, variant: string | null) {
207
- const next = { ...this.editorOverrides.get() };
208
- if (variant) next[key] = variant;
209
- else delete next[key];
210
- if (Object.keys(next).length) writeJson(this.d.local, this.keys.editorVariants, next);
211
- else this.d.local.remove(this.keys.editorVariants);
212
- this.editorOverrides.set(next);
213
- }
214
-
215
- /** Re-reads the switches (another window of the same app changed them). */
216
- reloadEditorOverrides() {
217
- const stored = readJson<Record<string, string>>(this.d.local, this.keys.editorVariants) ?? {};
218
- if (JSON.stringify(stored) !== JSON.stringify(this.editorOverrides.get())) this.editorOverrides.set(stored);
219
- }
220
-
221
- /** Loads the definitions again and makes mounted experiments decide again (for an editor, never for visitors). */
222
- async refresh(): Promise<void> {
223
- await this.load(true);
224
- this.revision.set(this.revision.get() + 1);
225
- }
226
-
227
- private setDefinitions(list: unknown[]) {
228
- this.definitions = new Map(
229
- list.map(normaliseDefinition).filter((d): d is IExperimentDefinition => !!d).map((d) => [d.key, d]),
230
- );
231
- }
232
-
233
- get(key: string) {
234
- return this.definitions.get(key);
235
- }
236
-
237
- /** Fetches the running experiments; a missing endpoint leaves everyone on the control. */
238
- async load(force = false): Promise<void> {
239
- if (this.status.get() === 'loading' && !force) return;
240
- const hadCache = this.status.get() === 'ready';
241
- if (!hadCache) this.status.set('loading');
242
- try {
243
- const sep = this.d.endpoint.includes('?') ? '&' : '?';
244
- const body = await this.d.fetchJson(`${this.d.endpoint}${sep}property=${encodeURIComponent(this.d.property)}`, FETCH_TIMEOUT_MS);
245
- const list = Array.isArray(body) ? body : ((body as { experiments?: unknown[] } | null)?.experiments ?? null);
246
- if (!Array.isArray(list)) throw new Error('unexpected experiments payload');
247
- this.setDefinitions(list);
248
- writeJson(this.d.local, this.keys.experimentsCache, {
249
- at: this.d.now(),
250
- property: this.d.property,
251
- experiments: Array.from(this.definitions.values()),
252
- } satisfies ICache);
253
- this.status.set('ready');
254
- } catch {
255
- if (!hadCache) this.status.set('failed');
256
- }
257
- }
258
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * Deterministic bucketing: GrowthBook's hash v2 (MIT), so assignments match what
3
- * GrowthBook-compatible tooling (and the server, if it ever recomputes) gets.
4
- *
5
- * n = (fnv1a32(String(fnv1a32(seed + value))) % 10000) / 10000
6
- *
7
- * The inner hash is turned into its *decimal string* before it is hashed again —
8
- * that is GrowthBook's definition (`hashFnv32a(hashFnv32a(seed + value) + "")`).
9
- * Characters are hashed as UTF-16 code units (`charCodeAt`), like GrowthBook; for
10
- * the ASCII ids and keys we use that equals FNV-1a over the bytes.
11
- */
12
-
13
- /** FNV-1a, 32 bit. `fnv1a32('a') === 0xe40c292c` (the reference test vector). */
14
- export const fnv1a32 = (input: string): number => {
15
- let h = 0x811c9dc5;
16
- for (let i = 0; i < input.length; i++) {
17
- h ^= input.charCodeAt(i);
18
- // h *= 16777619 (the FNV prime) in 32-bit arithmetic, as shifts and adds.
19
- h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);
20
- }
21
- return h >>> 0;
22
- };
23
-
24
- /** A number in [0, 1) with 4 decimals; the same inputs always give the same number. */
25
- export const hashV2 = (seed: string, value: string): number =>
26
- (fnv1a32(String(fnv1a32(seed + value))) % 10000) / 10000;
@@ -1,25 +0,0 @@
1
- /** Random ids from the platform CSPRNG (never Math.random: ids must not collide or be guessable). */
2
-
3
- const toBase64Url = (bytes: Uint8Array): string => {
4
- let bin = '';
5
- bytes.forEach((b) => (bin += String.fromCharCode(b)));
6
- return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
7
- };
8
-
9
- /** `bytes` random bytes as base64url: 16 bytes = 128 bits = 22 characters. */
10
- export const randomId = (bytes = 16): string => {
11
- const buf = new Uint8Array(bytes);
12
- globalThis.crypto.getRandomValues(buf);
13
- return toBase64Url(buf);
14
- };
15
-
16
- /** Event id (a UUID v4). */
17
- export const eventId = (): string => {
18
- if (typeof globalThis.crypto?.randomUUID === 'function') return globalThis.crypto.randomUUID();
19
- const b = new Uint8Array(16);
20
- globalThis.crypto.getRandomValues(b);
21
- b[6] = (b[6] & 0x0f) | 0x40;
22
- b[8] = (b[8] & 0x3f) | 0x80;
23
- const h = Array.from(b).map((x) => x.toString(16).padStart(2, '0')).join('');
24
- return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
25
- };
@@ -1,23 +0,0 @@
1
- type TListener = () => void;
2
-
3
- /** A tiny observable value (what React's `useSyncExternalStore` wants). */
4
- export class Observable<T> {
5
- private listeners = new Set<TListener>();
6
- constructor(private value: T) {}
7
- get = (): T => this.value;
8
- set(next: T) {
9
- if (Object.is(next, this.value)) return;
10
- this.value = next;
11
- this.listeners.forEach((l) => {
12
- try {
13
- l();
14
- } catch {
15
- /* a listener never breaks the tracker */
16
- }
17
- });
18
- }
19
- subscribe = (listener: TListener) => {
20
- this.listeners.add(listener);
21
- return () => void this.listeners.delete(listener);
22
- };
23
- }