@qoretechnologies/reqraft 0.10.64 → 0.10.65-pr.137.g62fcecc

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 (774) hide show
  1. package/README.md +53 -1
  2. package/dist/components/Description/describedControl.d.ts +54 -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 +36 -5
  29. package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
  30. package/dist/components/dpqlEditor/dpqlHelpers.js +340 -62
  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 +35 -17
  35. package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
  36. package/dist/components/dpqlEditor/types.d.ts +54 -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 +207 -97
  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 +58 -10
  49. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  50. package/dist/components/form/engine/FormEngine.js +542 -112
  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 +21 -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 +20 -10
  67. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  68. package/dist/components/form/engine/compactRowStyles.js +36 -30
  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 +64 -3
  107. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  108. package/dist/components/form/expressions/ExpressionField.js +459 -100
  109. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  110. package/dist/components/form/expressions/argumentPresence.d.ts +14 -0
  111. package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -1
  112. package/dist/components/form/expressions/argumentPresence.js +16 -1
  113. package/dist/components/form/expressions/argumentPresence.js.map +1 -1
  114. package/dist/components/form/expressions/builder/argumentDetail.d.ts.map +1 -1
  115. package/dist/components/form/expressions/builder/argumentDetail.js +4 -1
  116. package/dist/components/form/expressions/builder/argumentDetail.js.map +1 -1
  117. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  118. package/dist/components/form/expressions/builder/argumentLabel.js +27 -9
  119. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  120. package/dist/components/form/expressions/builder/argumentWrapper.d.ts.map +1 -1
  121. package/dist/components/form/expressions/builder/argumentWrapper.js +3 -1
  122. package/dist/components/form/expressions/builder/argumentWrapper.js.map +1 -1
  123. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
  124. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +5 -4
  125. package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js.map +1 -1
  126. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts +1 -1
  127. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts.map +1 -1
  128. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js +6 -3
  129. package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
  130. package/dist/components/form/expressions/builder/index.d.ts +24 -2
  131. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  132. package/dist/components/form/expressions/builder/index.js +138 -78
  133. package/dist/components/form/expressions/builder/index.js.map +1 -1
  134. package/dist/components/form/expressions/builder/item.d.ts +6 -2
  135. package/dist/components/form/expressions/builder/item.d.ts.map +1 -1
  136. package/dist/components/form/expressions/builder/item.js +19 -5
  137. package/dist/components/form/expressions/builder/item.js.map +1 -1
  138. package/dist/components/form/expressions/builder/renderTemplate.js +1 -1
  139. package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
  140. package/dist/components/form/expressions/dpqlMockRecordPath.d.ts +11 -0
  141. package/dist/components/form/expressions/dpqlMockRecordPath.d.ts.map +1 -0
  142. package/dist/components/form/expressions/dpqlMockRecordPath.js +254 -0
  143. package/dist/components/form/expressions/dpqlMockRecordPath.js.map +1 -0
  144. package/dist/components/form/expressions/expressionOperands.d.ts +16 -0
  145. package/dist/components/form/expressions/expressionOperands.d.ts.map +1 -0
  146. package/dist/components/form/expressions/expressionOperands.js +97 -0
  147. package/dist/components/form/expressions/expressionOperands.js.map +1 -0
  148. package/dist/components/form/expressions/fieldPath.d.ts +24 -0
  149. package/dist/components/form/expressions/fieldPath.d.ts.map +1 -0
  150. package/dist/components/form/expressions/fieldPath.js +152 -0
  151. package/dist/components/form/expressions/fieldPath.js.map +1 -0
  152. package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
  153. package/dist/components/form/expressions/mockExpressions.js +22 -5
  154. package/dist/components/form/expressions/mockExpressions.js.map +1 -1
  155. package/dist/components/form/expressions/renderExpressionToText.d.ts +2 -0
  156. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  157. package/dist/components/form/expressions/renderExpressionToText.js +40 -9
  158. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  159. package/dist/components/form/expressions/textOfExpression.d.ts +18 -0
  160. package/dist/components/form/expressions/textOfExpression.d.ts.map +1 -0
  161. package/dist/components/form/expressions/textOfExpression.js +49 -0
  162. package/dist/components/form/expressions/textOfExpression.js.map +1 -0
  163. package/dist/components/form/expressions/types.d.ts +7 -0
  164. package/dist/components/form/expressions/types.d.ts.map +1 -1
  165. package/dist/components/form/expressions/types.js +6 -1
  166. package/dist/components/form/expressions/types.js.map +1 -1
  167. package/dist/components/form/expressions/useExpressionType.d.ts +26 -0
  168. package/dist/components/form/expressions/useExpressionType.d.ts.map +1 -0
  169. package/dist/components/form/expressions/useExpressionType.js +181 -0
  170. package/dist/components/form/expressions/useExpressionType.js.map +1 -0
  171. package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
  172. package/dist/components/form/expressions/useRenderExpression.js +13 -9
  173. package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
  174. package/dist/components/form/expressions/wildcardExpressions.d.ts +27 -0
  175. package/dist/components/form/expressions/wildcardExpressions.d.ts.map +1 -0
  176. package/dist/components/form/expressions/wildcardExpressions.js +101 -0
  177. package/dist/components/form/expressions/wildcardExpressions.js.map +1 -0
  178. package/dist/components/form/fields/Field.d.ts.map +1 -1
  179. package/dist/components/form/fields/Field.js +26 -9
  180. package/dist/components/form/fields/Field.js.map +1 -1
  181. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  182. package/dist/components/form/fields/allowed-values/AllowedValues.js +17 -4
  183. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  184. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  185. package/dist/components/form/fields/array/ArrayAuto.js +24 -0
  186. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  187. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  188. package/dist/components/form/fields/array/ArrayAutoField.js +36 -13
  189. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  190. package/dist/components/form/fields/auto/AutoFormField.d.ts +20 -1
  191. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  192. package/dist/components/form/fields/auto/AutoFormField.js +81 -36
  193. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  194. package/dist/components/form/fields/auto/hostEditorValue.d.ts +30 -0
  195. package/dist/components/form/fields/auto/hostEditorValue.d.ts.map +1 -0
  196. package/dist/components/form/fields/auto/hostEditorValue.js +53 -0
  197. package/dist/components/form/fields/auto/hostEditorValue.js.map +1 -0
  198. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
  199. package/dist/components/form/fields/binary/Binary.js +23 -3
  200. package/dist/components/form/fields/binary/Binary.js.map +1 -1
  201. package/dist/components/form/fields/boolean/Boolean.d.ts +5 -0
  202. package/dist/components/form/fields/boolean/Boolean.d.ts.map +1 -1
  203. package/dist/components/form/fields/boolean/Boolean.js +9 -1
  204. package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
  205. package/dist/components/form/fields/color/Color.d.ts +103 -16
  206. package/dist/components/form/fields/color/Color.d.ts.map +1 -1
  207. package/dist/components/form/fields/color/Color.js +616 -16
  208. package/dist/components/form/fields/color/Color.js.map +1 -1
  209. package/dist/components/form/fields/emittedValues.d.ts +34 -3
  210. package/dist/components/form/fields/emittedValues.d.ts.map +1 -1
  211. package/dist/components/form/fields/emittedValues.js +24 -1
  212. package/dist/components/form/fields/emittedValues.js.map +1 -1
  213. package/dist/components/form/fields/file/File.d.ts +1 -1
  214. package/dist/components/form/fields/file/File.d.ts.map +1 -1
  215. package/dist/components/form/fields/file/File.js +4 -2
  216. package/dist/components/form/fields/file/File.js.map +1 -1
  217. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  218. package/dist/components/form/fields/long-string/LongString.js +17 -3
  219. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  220. package/dist/components/form/fields/markdown/MarkdownView.js +1 -1
  221. package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
  222. package/dist/components/form/fields/multi-select/MultiSelectFormField.js +4 -1
  223. package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
  224. package/dist/components/form/fields/number/Number.d.ts +6 -0
  225. package/dist/components/form/fields/number/Number.d.ts.map +1 -1
  226. package/dist/components/form/fields/number/Number.js +41 -6
  227. package/dist/components/form/fields/number/Number.js.map +1 -1
  228. package/dist/components/form/fields/object/Object.d.ts +1 -1
  229. package/dist/components/form/fields/object/Object.d.ts.map +1 -1
  230. package/dist/components/form/fields/object/Object.js +4 -2
  231. package/dist/components/form/fields/object/Object.js.map +1 -1
  232. package/dist/components/form/fields/pendingEdit.d.ts +52 -0
  233. package/dist/components/form/fields/pendingEdit.d.ts.map +1 -0
  234. package/dist/components/form/fields/pendingEdit.js +79 -0
  235. package/dist/components/form/fields/pendingEdit.js.map +1 -0
  236. package/dist/components/form/fields/rich-text/RichText.d.ts +8 -1
  237. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  238. package/dist/components/form/fields/rich-text/RichText.js +188 -82
  239. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  240. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts +18 -0
  241. package/dist/components/form/fields/rich-text/useTemplateTags.d.ts.map +1 -0
  242. package/dist/components/form/fields/rich-text/useTemplateTags.js +49 -0
  243. package/dist/components/form/fields/rich-text/useTemplateTags.js.map +1 -0
  244. package/dist/components/form/fields/schema-definition/CatalogLeafForm.d.ts.map +1 -1
  245. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js +4 -1
  246. package/dist/components/form/fields/schema-definition/CatalogLeafForm.js.map +1 -1
  247. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.d.ts.map +1 -1
  248. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js +20 -5
  249. package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js.map +1 -1
  250. package/dist/components/form/fields/schema-definition/TableEditor.d.ts.map +1 -1
  251. package/dist/components/form/fields/schema-definition/TableEditor.js +10 -2
  252. package/dist/components/form/fields/schema-definition/TableEditor.js.map +1 -1
  253. package/dist/components/form/fields/schema-definition/index.d.ts.map +1 -1
  254. package/dist/components/form/fields/schema-definition/index.js +8 -4
  255. package/dist/components/form/fields/schema-definition/index.js.map +1 -1
  256. package/dist/components/form/fields/select/Select.d.ts +2 -0
  257. package/dist/components/form/fields/select/Select.d.ts.map +1 -1
  258. package/dist/components/form/fields/select/Select.js +19 -10
  259. package/dist/components/form/fields/select/Select.js.map +1 -1
  260. package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
  261. package/dist/components/form/fields/select/SelectCollection.js +8 -2
  262. package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
  263. package/dist/components/form/fields/select/unavailableRow.d.ts +23 -0
  264. package/dist/components/form/fields/select/unavailableRow.d.ts.map +1 -0
  265. package/dist/components/form/fields/select/unavailableRow.js +55 -0
  266. package/dist/components/form/fields/select/unavailableRow.js.map +1 -0
  267. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +11 -5
  268. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  269. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +13 -5
  270. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  271. package/dist/components/form/fields/template/TemplateBrowser.d.ts +22 -0
  272. package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
  273. package/dist/components/form/fields/template/TemplateBrowser.js +54 -0
  274. package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
  275. package/dist/components/form/fields/template/TemplateField.d.ts +102 -1
  276. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  277. package/dist/components/form/fields/template/TemplateField.js +572 -85
  278. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  279. package/dist/components/form/fields/template/TemplateText.d.ts +0 -17
  280. package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -1
  281. package/dist/components/form/fields/template/TemplateText.js +9 -11
  282. package/dist/components/form/fields/template/TemplateText.js.map +1 -1
  283. package/dist/components/form/fields/template/writtenAsText.d.ts +61 -0
  284. package/dist/components/form/fields/template/writtenAsText.d.ts.map +1 -0
  285. package/dist/components/form/fields/template/writtenAsText.js +204 -0
  286. package/dist/components/form/fields/template/writtenAsText.js.map +1 -0
  287. package/dist/components/form/index.d.ts +10 -0
  288. package/dist/components/form/index.d.ts.map +1 -1
  289. package/dist/components/form/index.js +23 -1
  290. package/dist/components/form/index.js.map +1 -1
  291. package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
  292. package/dist/components/imageLightbox/ImageLightbox.js +19 -7
  293. package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
  294. package/dist/components/log/Log.d.ts.map +1 -1
  295. package/dist/components/log/Log.js +16 -8
  296. package/dist/components/log/Log.js.map +1 -1
  297. package/dist/components/menu/Menu.d.ts.map +1 -1
  298. package/dist/components/menu/Menu.js +19 -10
  299. package/dist/components/menu/Menu.js.map +1 -1
  300. package/dist/components/smartEditor/CompletionMenu.d.ts +43 -0
  301. package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
  302. package/dist/components/smartEditor/CompletionMenu.js +196 -0
  303. package/dist/components/smartEditor/CompletionMenu.js.map +1 -0
  304. package/dist/components/smartEditor/MarkdownDoc.d.ts +1 -1
  305. package/dist/components/smartEditor/MarkdownDoc.js +3 -3
  306. package/dist/components/smartEditor/MarkdownDoc.js.map +1 -1
  307. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  308. package/dist/components/smartEditor/SmartEditor.js +164 -180
  309. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  310. package/dist/components/smartEditor/completionStyle.d.ts +27 -0
  311. package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
  312. package/dist/components/smartEditor/completionStyle.js +68 -0
  313. package/dist/components/smartEditor/completionStyle.js.map +1 -0
  314. package/dist/components/smartEditor/index.d.ts +5 -1
  315. package/dist/components/smartEditor/index.d.ts.map +1 -1
  316. package/dist/components/smartEditor/index.js +19 -1
  317. package/dist/components/smartEditor/index.js.map +1 -1
  318. package/dist/components/smartEditor/templateCompletions.d.ts +18 -0
  319. package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
  320. package/dist/components/smartEditor/templateCompletions.js +94 -0
  321. package/dist/components/smartEditor/templateCompletions.js.map +1 -0
  322. package/dist/components/smartEditor/typedReferences.d.ts +21 -0
  323. package/dist/components/smartEditor/typedReferences.d.ts.map +1 -0
  324. package/dist/components/smartEditor/typedReferences.js +82 -0
  325. package/dist/components/smartEditor/typedReferences.js.map +1 -0
  326. package/dist/components/smartEditor/types.d.ts +33 -1
  327. package/dist/components/smartEditor/types.d.ts.map +1 -1
  328. package/dist/components/smartEditor/useLspAutocomplete.d.ts +32 -0
  329. package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
  330. package/dist/components/smartEditor/useLspAutocomplete.js +228 -118
  331. package/dist/components/smartEditor/useLspAutocomplete.js.map +1 -1
  332. package/dist/components/smartEditor/useLspHover.d.ts +33 -7
  333. package/dist/components/smartEditor/useLspHover.d.ts.map +1 -1
  334. package/dist/components/smartEditor/useLspHover.js +279 -35
  335. package/dist/components/smartEditor/useLspHover.js.map +1 -1
  336. package/dist/components/smartEditor/useLspSemanticTokens.js +1 -1
  337. package/dist/components/smartEditor/useLspSemanticTokens.js.map +1 -1
  338. package/dist/components/smartEditor/useLspSession.d.ts +6 -0
  339. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  340. package/dist/components/smartEditor/useLspSession.js +7 -6
  341. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  342. package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -1
  343. package/dist/components/supportTicket/AttachmentChips.js +15 -5
  344. package/dist/components/supportTicket/AttachmentChips.js.map +1 -1
  345. package/dist/components/supportTicket/ReferencePicker.d.ts +9 -2
  346. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
  347. package/dist/components/supportTicket/ReferencePicker.js +27 -6
  348. package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
  349. package/dist/components/supportTicket/TicketHeader.d.ts +3 -4
  350. package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
  351. package/dist/components/supportTicket/TicketHeader.js +20 -2
  352. package/dist/components/supportTicket/TicketHeader.js.map +1 -1
  353. package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
  354. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
  355. package/dist/components/ticketReferences/TicketReferences.js +9 -4
  356. package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
  357. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
  358. package/dist/components/ticketThread/TicketThread.js +38 -13
  359. package/dist/components/ticketThread/TicketThread.js.map +1 -1
  360. package/dist/helpers/descriptionTooltip.d.ts +43 -0
  361. package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
  362. package/dist/helpers/descriptionTooltip.js +70 -0
  363. package/dist/helpers/descriptionTooltip.js.map +1 -0
  364. package/dist/helpers/domProps.d.ts +5 -0
  365. package/dist/helpers/domProps.d.ts.map +1 -0
  366. package/dist/helpers/domProps.js +47 -0
  367. package/dist/helpers/domProps.js.map +1 -0
  368. package/dist/helpers/expressions.d.ts +107 -2
  369. package/dist/helpers/expressions.d.ts.map +1 -1
  370. package/dist/helpers/expressions.js +223 -8
  371. package/dist/helpers/expressions.js.map +1 -1
  372. package/dist/helpers/hoveringPointer.d.ts +26 -0
  373. package/dist/helpers/hoveringPointer.d.ts.map +1 -0
  374. package/dist/helpers/hoveringPointer.js +29 -0
  375. package/dist/helpers/hoveringPointer.js.map +1 -0
  376. package/dist/helpers/markdownText.d.ts +14 -0
  377. package/dist/helpers/markdownText.d.ts.map +1 -0
  378. package/dist/helpers/markdownText.js +160 -0
  379. package/dist/helpers/markdownText.js.map +1 -0
  380. package/dist/helpers/qorusTypeCatalogue.d.ts +53 -0
  381. package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
  382. package/dist/helpers/qorusTypeCatalogue.js +262 -0
  383. package/dist/helpers/qorusTypeCatalogue.js.map +1 -0
  384. package/dist/helpers/readableColors.d.ts +36 -0
  385. package/dist/helpers/readableColors.d.ts.map +1 -0
  386. package/dist/helpers/readableColors.js +116 -0
  387. package/dist/helpers/readableColors.js.map +1 -0
  388. package/dist/helpers/recordFieldReference.d.ts +15 -0
  389. package/dist/helpers/recordFieldReference.d.ts.map +1 -0
  390. package/dist/helpers/recordFieldReference.js +89 -0
  391. package/dist/helpers/recordFieldReference.js.map +1 -0
  392. package/dist/helpers/templateItems.d.ts +2 -2
  393. package/dist/helpers/templateItems.d.ts.map +1 -1
  394. package/dist/helpers/templateItems.js +6 -4
  395. package/dist/helpers/templateItems.js.map +1 -1
  396. package/dist/helpers/templateText.js +5 -2
  397. package/dist/helpers/templateText.js.map +1 -1
  398. package/dist/helpers/templates.d.ts +41 -14
  399. package/dist/helpers/templates.d.ts.map +1 -1
  400. package/dist/helpers/templates.js +152 -9
  401. package/dist/helpers/templates.js.map +1 -1
  402. package/dist/helpers/validations.d.ts +9 -0
  403. package/dist/helpers/validations.d.ts.map +1 -1
  404. package/dist/helpers/validations.js +139 -33
  405. package/dist/helpers/validations.js.map +1 -1
  406. package/dist/hooks/useQorusTypes.d.ts +7 -15
  407. package/dist/hooks/useQorusTypes.d.ts.map +1 -1
  408. package/dist/hooks/useQorusTypes.js +25 -166
  409. package/dist/hooks/useQorusTypes.js.map +1 -1
  410. package/dist/hooks/useReadableIntentShade.d.ts +9 -0
  411. package/dist/hooks/useReadableIntentShade.d.ts.map +1 -0
  412. package/dist/hooks/useReadableIntentShade.js +23 -0
  413. package/dist/hooks/useReadableIntentShade.js.map +1 -0
  414. package/dist/hooks/useReadableOpacity.d.ts +6 -0
  415. package/dist/hooks/useReadableOpacity.d.ts.map +1 -0
  416. package/dist/hooks/useReadableOpacity.js +17 -0
  417. package/dist/hooks/useReadableOpacity.js.map +1 -0
  418. package/dist/index.d.ts +1 -0
  419. package/dist/index.d.ts.map +1 -1
  420. package/dist/index.js +1 -0
  421. package/dist/index.js.map +1 -1
  422. package/dist/tracking/ui/ExperimentCard.d.ts +1 -1
  423. package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -1
  424. package/dist/tracking/ui/ExperimentCard.js +26 -10
  425. package/dist/tracking/ui/ExperimentCard.js.map +1 -1
  426. package/dist/tracking/ui/card.d.ts +2 -2
  427. package/dist/tracking/ui/card.d.ts.map +1 -1
  428. package/dist/tracking/ui/card.js +2 -2
  429. package/dist/tracking/ui/card.js.map +1 -1
  430. package/dist/tracking/ui/readable.d.ts +14 -0
  431. package/dist/tracking/ui/readable.d.ts.map +1 -0
  432. package/dist/tracking/ui/readable.js +60 -0
  433. package/dist/tracking/ui/readable.js.map +1 -0
  434. package/dist/utils/fetch.d.ts +9 -2
  435. package/dist/utils/fetch.d.ts.map +1 -1
  436. package/dist/utils/fetch.js +6 -5
  437. package/dist/utils/fetch.js.map +1 -1
  438. package/dist/utils/websocket.d.ts +65 -2
  439. package/dist/utils/websocket.d.ts.map +1 -1
  440. package/dist/utils/websocket.js +276 -44
  441. package/dist/utils/websocket.js.map +1 -1
  442. package/package.json +14 -5
  443. package/.claude/CLAUDE.md +0 -317
  444. package/.tasks/EXPORT_EXPRESSION_BUILDER.md +0 -38
  445. package/.tasks/EXPRESSION_BUILDER_REPORT.md +0 -149
  446. package/.tasks/EXPRESSION_FIELD_SEAMS.md +0 -66
  447. package/.tasks/FIELD_STACK_REPORT.md +0 -234
  448. package/.tasks/FORM_ENGINE_COMPACT_READ_FIRST.md +0 -558
  449. package/.tasks/FORM_ENGINE_EXPRESSIONS.md +0 -197
  450. package/.tasks/FORM_ENGINE_OPTIONS_SYNC.md +0 -95
  451. package/.tasks/FORM_FIELD_EXTRAS.md +0 -72
  452. package/.tasks/INDEX.md +0 -111
  453. package/.tasks/LSP_SHARED_CONNECTION.md +0 -75
  454. package/.tasks/QONSOLE_ASSIST_FEATURES.md +0 -306
  455. package/.tasks/RENDER_EXPRESSION_LSP.md +0 -159
  456. package/.tasks/REQRAFT_AUTO_FIELD.md +0 -176
  457. package/.tasks/SCHEMA_DEFINITION_FIELD.md +0 -250
  458. package/.tasks/SMART_EDITOR_CONTEXT_AND_POLISH.md +0 -340
  459. package/.tasks/SMART_EDITOR_LSP_FEATURES.md +0 -299
  460. package/.tasks/SMART_EDITOR_REVIEW_FOLLOWUPS.md +0 -280
  461. package/.tasks/SMART_EDITOR_UX_POLISH.md +0 -383
  462. package/.tasks/SMART_EDITOR_VISUAL_POLISH.md +0 -246
  463. package/.tasks/STORY_NETWORK_ISOLATION.md +0 -98
  464. package/.tasks/TEMPLATE_TOKEN_GRAMMAR.md +0 -72
  465. package/CODE_OF_CONDUCT.md +0 -105
  466. package/CONTRIBUTING.MD +0 -78
  467. package/SECURITY.md +0 -3
  468. package/chromatic.config.json +0 -5
  469. package/design/COMPACT_ENGINE_REDESIGN.md +0 -156
  470. package/design/COMPACT_INFO_DISPLAY.md +0 -87
  471. package/design/COMPACT_PARITY.md +0 -85
  472. package/design/EXPRESSION_BUILDER_REPORT_STRATEGY.md +0 -92
  473. package/design/FORM_ENGINE_COMPACT.md +0 -300
  474. package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +0 -353
  475. package/design/FORM_ENGINE_EXPRESSIONS.md +0 -257
  476. package/design/FORM_ENGINE_FIELD_MIGRATION.md +0 -419
  477. package/design/IDE_INTEGRATION.md +0 -64
  478. package/design/RENDER_EXPRESSION_TRANSPORT.md +0 -156
  479. package/design/SELECT_DIALOG_FLOOR.md +0 -86
  480. package/design/SMART_EDITOR_UX.md +0 -438
  481. package/design/TRACKING.md +0 -290
  482. package/design/UNAVAILABLE_ALLOWED_VALUES.md +0 -226
  483. package/src/components/Description/index.tsx +0 -254
  484. package/src/components/Description/markdownRendererContext.tsx +0 -29
  485. package/src/components/FocusedEditing/index.tsx +0 -50
  486. package/src/components/codeSize/index.tsx +0 -79
  487. package/src/components/composer/Composer.stories.tsx +0 -238
  488. package/src/components/composer/Composer.tsx +0 -554
  489. package/src/components/composer/helpers.ts +0 -74
  490. package/src/components/composer/index.ts +0 -2
  491. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -1183
  492. package/src/components/dpqlEditor/DpqlEditor.tsx +0 -219
  493. package/src/components/dpqlEditor/dpqlHelpers.ts +0 -287
  494. package/src/components/dpqlEditor/dpqlInserter.ts +0 -121
  495. package/src/components/dpqlEditor/dpqlProbe.ts +0 -165
  496. package/src/components/dpqlEditor/dpqlTags.ts +0 -114
  497. package/src/components/dpqlEditor/index.ts +0 -41
  498. package/src/components/dpqlEditor/types.ts +0 -203
  499. package/src/components/dpqlEditor/useDpqlProbe.ts +0 -33
  500. package/src/components/dpqlEditor/useDpqlSession.ts +0 -411
  501. package/src/components/form/engine/CompactRow.tsx +0 -2620
  502. package/src/components/form/engine/CompactToolbar.tsx +0 -330
  503. package/src/components/form/engine/FormEngine.stories.tsx +0 -9920
  504. package/src/components/form/engine/FormEngine.tsx +0 -4569
  505. package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
  506. package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -331
  507. package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
  508. package/src/components/form/engine/OptionFieldMessages.tsx +0 -477
  509. package/src/components/form/engine/OptionsHelpDialog.tsx +0 -29
  510. package/src/components/form/engine/__fixtures__/basicFormOptions.ts +0 -309
  511. package/src/components/form/engine/__fixtures__/fieldChromeOptions.ts +0 -45
  512. package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +0 -233
  513. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +0 -742
  514. package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +0 -85
  515. package/src/components/form/engine/_structuredData/StructuredDataView.tsx +0 -75
  516. package/src/components/form/engine/_structuredData/structuredData.ts +0 -145
  517. package/src/components/form/engine/compactRowContext.ts +0 -148
  518. package/src/components/form/engine/compactRowStyles.ts +0 -898
  519. package/src/components/form/engine/compactToolbarContext.ts +0 -69
  520. package/src/components/form/engine/optionActions.ts +0 -128
  521. package/src/components/form/engine/optionsContext.ts +0 -24
  522. package/src/components/form/engine/readFirst.ts +0 -1077
  523. package/src/components/form/engine/rendererTypes.ts +0 -107
  524. package/src/components/form/engine/revealRow.ts +0 -123
  525. package/src/components/form/engine/rowFocus.ts +0 -101
  526. package/src/components/form/engine/rowMenuContext.ts +0 -159
  527. package/src/components/form/engine/rowOpenPicker.ts +0 -27
  528. package/src/components/form/engine/typeChoices.ts +0 -63
  529. package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +0 -159
  530. package/src/components/form/engine/variants/VariantCalmTable.tsx +0 -244
  531. package/src/components/form/engine/variants/VariantCards.tsx +0 -212
  532. package/src/components/form/engine/variants/VariantFocus.tsx +0 -382
  533. package/src/components/form/engine/variants/VariantMinimal.tsx +0 -170
  534. package/src/components/form/engine/variants/focusDemo.ts +0 -145
  535. package/src/components/form/engine/variants/variantModel.ts +0 -223
  536. package/src/components/form/engine/variants/variantParts.tsx +0 -313
  537. package/src/components/form/expressions/DpqlRendering.tsx +0 -85
  538. package/src/components/form/expressions/ExpressionField.stories.tsx +0 -1395
  539. package/src/components/form/expressions/ExpressionField.tsx +0 -503
  540. package/src/components/form/expressions/argumentPresence.ts +0 -213
  541. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +0 -1683
  542. package/src/components/form/expressions/builder/argumentDetail.tsx +0 -17
  543. package/src/components/form/expressions/builder/argumentLabel.tsx +0 -146
  544. package/src/components/form/expressions/builder/argumentSlot.tsx +0 -101
  545. package/src/components/form/expressions/builder/argumentWrapper.tsx +0 -243
  546. package/src/components/form/expressions/builder/confirmMismatchedTypesModal.tsx +0 -120
  547. package/src/components/form/expressions/builder/confirmUnsupportedTypeModal.tsx +0 -69
  548. package/src/components/form/expressions/builder/index.tsx +0 -1545
  549. package/src/components/form/expressions/builder/item.tsx +0 -89
  550. package/src/components/form/expressions/builder/moveToPositionStrip.tsx +0 -156
  551. package/src/components/form/expressions/builder/renderTemplate.tsx +0 -42
  552. package/src/components/form/expressions/dpqlMockLanguage.ts +0 -566
  553. package/src/components/form/expressions/dpqlMockLsp.ts +0 -126
  554. package/src/components/form/expressions/mockExpressions.ts +0 -317
  555. package/src/components/form/expressions/renderExpressionToText.ts +0 -137
  556. package/src/components/form/expressions/types.ts +0 -110
  557. package/src/components/form/expressions/useExpressions.ts +0 -101
  558. package/src/components/form/expressions/useRenderExpression.ts +0 -165
  559. package/src/components/form/fields/Field.stories.tsx +0 -143
  560. package/src/components/form/fields/Field.tsx +0 -732
  561. package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -297
  562. package/src/components/form/fields/array/ArrayAuto.tsx +0 -237
  563. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +0 -475
  564. package/src/components/form/fields/array/ArrayAutoField.tsx +0 -367
  565. package/src/components/form/fields/auto/AutoFormField.stories.tsx +0 -825
  566. package/src/components/form/fields/auto/AutoFormField.tsx +0 -1164
  567. package/src/components/form/fields/binary/Binary.stories.tsx +0 -122
  568. package/src/components/form/fields/binary/Binary.tsx +0 -91
  569. package/src/components/form/fields/boolean/Boolean.stories.tsx +0 -125
  570. package/src/components/form/fields/boolean/Boolean.tsx +0 -34
  571. package/src/components/form/fields/byte-size/ByteSize.stories.tsx +0 -87
  572. package/src/components/form/fields/byte-size/ByteSize.tsx +0 -58
  573. package/src/components/form/fields/color/Color.stories.tsx +0 -99
  574. package/src/components/form/fields/color/Color.tsx +0 -46
  575. package/src/components/form/fields/cron/Cron.stories.tsx +0 -68
  576. package/src/components/form/fields/cron/Cron.tsx +0 -80
  577. package/src/components/form/fields/date/Date.stories.tsx +0 -77
  578. package/src/components/form/fields/date/Date.tsx +0 -55
  579. package/src/components/form/fields/emittedValues.ts +0 -70
  580. package/src/components/form/fields/file/File.stories.tsx +0 -161
  581. package/src/components/form/fields/file/File.tsx +0 -227
  582. package/src/components/form/fields/long-string/LongString.stories.tsx +0 -120
  583. package/src/components/form/fields/long-string/LongString.tsx +0 -130
  584. package/src/components/form/fields/markdown/Markdown.stories.tsx +0 -76
  585. package/src/components/form/fields/markdown/Markdown.tsx +0 -81
  586. package/src/components/form/fields/markdown/MarkdownView.tsx +0 -222
  587. package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +0 -139
  588. package/src/components/form/fields/number/Number.stories.tsx +0 -159
  589. package/src/components/form/fields/number/Number.tsx +0 -160
  590. package/src/components/form/fields/object/Object.stories.tsx +0 -398
  591. package/src/components/form/fields/object/Object.tsx +0 -255
  592. package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +0 -95
  593. package/src/components/form/fields/radio-group/RadioGroup.tsx +0 -46
  594. package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
  595. package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
  596. package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
  597. package/src/components/form/fields/rich-text/RichText.stories.tsx +0 -260
  598. package/src/components/form/fields/rich-text/RichText.tsx +0 -537
  599. package/src/components/form/fields/schema-definition/CatalogLeafForm.tsx +0 -242
  600. package/src/components/form/fields/schema-definition/CatalogNodeEditor.tsx +0 -758
  601. package/src/components/form/fields/schema-definition/Hint.tsx +0 -22
  602. package/src/components/form/fields/schema-definition/InlineValidationBanner.tsx +0 -138
  603. package/src/components/form/fields/schema-definition/Loader.tsx +0 -20
  604. package/src/components/form/fields/schema-definition/MigrationsTab.tsx +0 -187
  605. package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +0 -286
  606. package/src/components/form/fields/schema-definition/TableEditor.tsx +0 -155
  607. package/src/components/form/fields/schema-definition/TablesTab.tsx +0 -138
  608. package/src/components/form/fields/schema-definition/catalog.ts +0 -237
  609. package/src/components/form/fields/schema-definition/helpers.ts +0 -90
  610. package/src/components/form/fields/schema-definition/index.tsx +0 -418
  611. package/src/components/form/fields/schema-definition/mockCatalog.ts +0 -325
  612. package/src/components/form/fields/schema-definition/mockDefinition.ts +0 -111
  613. package/src/components/form/fields/schema-definition/referenceSuggestions.tsx +0 -152
  614. package/src/components/form/fields/schema-definition/starterTemplate.ts +0 -68
  615. package/src/components/form/fields/schema-definition/types.ts +0 -185
  616. package/src/components/form/fields/schema-definition/useSchemaOptionCatalog.ts +0 -49
  617. package/src/components/form/fields/select/Select.stories.tsx +0 -872
  618. package/src/components/form/fields/select/Select.tsx +0 -624
  619. package/src/components/form/fields/select/SelectCollection.tsx +0 -594
  620. package/src/components/form/fields/string/String.stories.tsx +0 -86
  621. package/src/components/form/fields/string/String.tsx +0 -43
  622. package/src/components/form/fields/template/ExampleValueModal.stories.tsx +0 -114
  623. package/src/components/form/fields/template/ExampleValueModal.tsx +0 -99
  624. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +0 -47
  625. package/src/components/form/fields/template/TemplateField.stories.tsx +0 -1121
  626. package/src/components/form/fields/template/TemplateField.tsx +0 -1717
  627. package/src/components/form/fields/template/TemplateText.tsx +0 -115
  628. package/src/components/form/fields/template/__fixtures__/longExampleValue.ts +0 -7
  629. package/src/components/form/fields/template/__fixtures__/multiLevelTemplates.json +0 -147
  630. package/src/components/form/fields/template/__fixtures__/templates.json +0 -83
  631. package/src/components/form/fields/timeout/Timeout.stories.tsx +0 -228
  632. package/src/components/form/fields/timeout/Timeout.tsx +0 -87
  633. package/src/components/form/fields/url/Url.stories.tsx +0 -94
  634. package/src/components/form/fields/url/Url.tsx +0 -85
  635. package/src/components/form/index.tsx +0 -47
  636. package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
  637. package/src/components/imageLightbox/ImageLightbox.tsx +0 -236
  638. package/src/components/imageLightbox/index.ts +0 -1
  639. package/src/components/log/Log.stories.tsx +0 -333
  640. package/src/components/log/Log.tsx +0 -285
  641. package/src/components/menu/Menu.stories.tsx +0 -155
  642. package/src/components/menu/Menu.tsx +0 -312
  643. package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +0 -797
  644. package/src/components/qonsoleSmartInput/QonsoleSmartInput.tsx +0 -105
  645. package/src/components/qonsoleSmartInput/index.ts +0 -16
  646. package/src/components/qonsoleSmartInput/qonsoleInserter.ts +0 -77
  647. package/src/components/qonsoleSmartInput/types.ts +0 -133
  648. package/src/components/qonsoleSmartInput/useQonsoleSession.ts +0 -124
  649. package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +0 -62
  650. package/src/components/searchFilterBar/SearchFilterBar.tsx +0 -144
  651. package/src/components/searchFilterBar/index.ts +0 -1
  652. package/src/components/smartEditor/MarkdownDoc.tsx +0 -190
  653. package/src/components/smartEditor/SmartEditor.stories.tsx +0 -475
  654. package/src/components/smartEditor/SmartEditor.tsx +0 -808
  655. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +0 -205
  656. package/src/components/smartEditor/helpers.ts +0 -217
  657. package/src/components/smartEditor/index.ts +0 -35
  658. package/src/components/smartEditor/styling.ts +0 -45
  659. package/src/components/smartEditor/types.ts +0 -211
  660. package/src/components/smartEditor/useLspAutocomplete.ts +0 -758
  661. package/src/components/smartEditor/useLspDiagnosticDecorations.ts +0 -125
  662. package/src/components/smartEditor/useLspHover.ts +0 -230
  663. package/src/components/smartEditor/useLspSemanticTokens.ts +0 -298
  664. package/src/components/smartEditor/useLspSession.ts +0 -231
  665. package/src/components/smartEditor/useLspSignatureHelp.ts +0 -198
  666. package/src/components/supportTicket/AttachmentChips.stories.tsx +0 -171
  667. package/src/components/supportTicket/AttachmentChips.tsx +0 -147
  668. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +0 -257
  669. package/src/components/supportTicket/InterfaceReferenceTags.tsx +0 -129
  670. package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -584
  671. package/src/components/supportTicket/ReferencePicker.tsx +0 -563
  672. package/src/components/supportTicket/TicketConversation.stories.tsx +0 -121
  673. package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
  674. package/src/components/supportTicket/TicketHeader.tsx +0 -247
  675. package/src/components/supportTicket/TicketMetaTags.stories.tsx +0 -103
  676. package/src/components/supportTicket/TicketMetaTags.tsx +0 -85
  677. package/src/components/supportTicket/TicketReplyBox.stories.tsx +0 -354
  678. package/src/components/supportTicket/TicketReplyBox.tsx +0 -150
  679. package/src/components/supportTicket/__fixtures__/kindMarks.ts +0 -28
  680. package/src/components/supportTicket/attachmentAccess.ts +0 -97
  681. package/src/components/supportTicket/fileToAttachment.ts +0 -24
  682. package/src/components/supportTicket/index.ts +0 -10
  683. package/src/components/supportTicket/meta.ts +0 -206
  684. package/src/components/supportTicket/ticketModel.ts +0 -131
  685. package/src/components/supportTicket/useLoadedImages.ts +0 -73
  686. package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -315
  687. package/src/components/ticketReferences/TicketReferences.tsx +0 -906
  688. package/src/components/ticketReferences/index.ts +0 -2
  689. package/src/components/ticketThread/TicketThread.stories.tsx +0 -829
  690. package/src/components/ticketThread/TicketThread.tsx +0 -719
  691. package/src/components/ticketThread/index.ts +0 -6
  692. package/src/contexts/FetchContext.tsx +0 -25
  693. package/src/contexts/ReqraftContext.tsx +0 -9
  694. package/src/contexts/StorageContext.tsx +0 -33
  695. package/src/global.d.ts +0 -4
  696. package/src/helpers/allowedValues.ts +0 -249
  697. package/src/helpers/choiceChip.ts +0 -227
  698. package/src/helpers/common.ts +0 -326
  699. package/src/helpers/dpqlDetection.ts +0 -209
  700. package/src/helpers/expressions.ts +0 -140
  701. package/src/helpers/optionUiTypes.ts +0 -199
  702. package/src/helpers/options.ts +0 -150
  703. package/src/helpers/providerValue.ts +0 -125
  704. package/src/helpers/scrollbar.ts +0 -32
  705. package/src/helpers/singleLineString.ts +0 -61
  706. package/src/helpers/templateItems.ts +0 -81
  707. package/src/helpers/templateText.ts +0 -350
  708. package/src/helpers/templates.ts +0 -602
  709. package/src/helpers/validations.ts +0 -2085
  710. package/src/hooks/useArgSchema.ts +0 -37
  711. package/src/hooks/useCoarsePointer.ts +0 -30
  712. package/src/hooks/useFetch/useFetch.stories.tsx +0 -379
  713. package/src/hooks/useFetch/useFetch.tsx +0 -154
  714. package/src/hooks/usePhoneViewport.ts +0 -34
  715. package/src/hooks/useQorusTypes.ts +0 -233
  716. package/src/hooks/useReqraftProperty.ts +0 -16
  717. package/src/hooks/useStorage/useStorage.stories.tsx +0 -168
  718. package/src/hooks/useStorage/useStorage.ts +0 -35
  719. package/src/hooks/useTemplates.ts +0 -123
  720. package/src/hooks/useValidation.ts +0 -9
  721. package/src/hooks/useWebSocket/useWebSocket.ts +0 -224
  722. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +0 -640
  723. package/src/hooks/useWhyDidYouUpdate.ts +0 -38
  724. package/src/index.tsx +0 -86
  725. package/src/providers/FetchProvider.tsx +0 -40
  726. package/src/providers/ReqraftProvider.tsx +0 -52
  727. package/src/providers/StorageProvider.tsx +0 -131
  728. package/src/stores/currentUser/currentUser.stories.tsx +0 -100
  729. package/src/stores/currentUser/currentUser.tsx +0 -94
  730. package/src/stories/Data/fileFieldArgSchema.json +0 -86
  731. package/src/stories/Tests/utils.ts +0 -320
  732. package/src/stories/storyNetwork.ts +0 -92
  733. package/src/stories/tracking.tsx +0 -206
  734. package/src/tracking/browser/attach.ts +0 -186
  735. package/src/tracking/browser/env.ts +0 -78
  736. package/src/tracking/core/consent.ts +0 -37
  737. package/src/tracking/core/engagement.ts +0 -47
  738. package/src/tracking/core/experiments.ts +0 -258
  739. package/src/tracking/core/hash.ts +0 -26
  740. package/src/tracking/core/ids.ts +0 -25
  741. package/src/tracking/core/observable.ts +0 -23
  742. package/src/tracking/core/queue.ts +0 -131
  743. package/src/tracking/core/sections.ts +0 -166
  744. package/src/tracking/core/storage.ts +0 -69
  745. package/src/tracking/core/tracker.ts +0 -417
  746. package/src/tracking/core/types.ts +0 -162
  747. package/src/tracking/core/utm.ts +0 -23
  748. package/src/tracking/index.ts +0 -72
  749. package/src/tracking/markup.ts +0 -17
  750. package/src/tracking/react/Experiment.tsx +0 -44
  751. package/src/tracking/react/TrackingProvider.tsx +0 -56
  752. package/src/tracking/react/hooks.ts +0 -106
  753. package/src/tracking/react/index.ts +0 -13
  754. package/src/tracking/testing.ts +0 -108
  755. package/src/tracking/ui/ExperimentCard.stories.tsx +0 -296
  756. package/src/tracking/ui/ExperimentCard.tsx +0 -667
  757. package/src/tracking/ui/ExperimentsOverlay.stories.tsx +0 -155
  758. package/src/tracking/ui/ExperimentsOverlay.tsx +0 -437
  759. package/src/tracking/ui/anchor.ts +0 -180
  760. package/src/tracking/ui/card.ts +0 -464
  761. package/src/tracking/ui/client.ts +0 -117
  762. package/src/tracking/ui/index.ts +0 -77
  763. package/src/tracking/ui/types.ts +0 -110
  764. package/src/tracking/ui/useExperimentsAdmin.ts +0 -103
  765. package/src/types/Form.ts +0 -29
  766. package/src/types.ts +0 -14
  767. package/src/utils/datetime.ts +0 -10
  768. package/src/utils/fetch.ts +0 -457
  769. package/src/utils/lspClient.ts +0 -711
  770. package/src/utils/lspClient.types.ts +0 -211
  771. package/src/utils/queryUnlessCancelled.ts +0 -28
  772. package/src/utils/websocket.ts +0 -293
  773. package/vite.config.ts +0 -58
  774. 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
- }