@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.
- package/README.md +53 -1
- package/dist/components/Description/describedControl.d.ts +54 -0
- package/dist/components/Description/describedControl.d.ts.map +1 -0
- package/dist/components/Description/describedControl.js +81 -0
- package/dist/components/Description/describedControl.js.map +1 -0
- package/dist/components/Description/index.d.ts.map +1 -1
- package/dist/components/Description/index.js +3 -2
- package/dist/components/Description/index.js.map +1 -1
- package/dist/components/colorValue/colorValue.d.ts +59 -0
- package/dist/components/colorValue/colorValue.d.ts.map +1 -0
- package/dist/components/colorValue/colorValue.js +245 -0
- package/dist/components/colorValue/colorValue.js.map +1 -0
- package/dist/components/colorValue/index.d.ts +34 -0
- package/dist/components/colorValue/index.d.ts.map +1 -0
- package/dist/components/colorValue/index.js +136 -0
- package/dist/components/colorValue/index.js.map +1 -0
- package/dist/components/colorValue/labels.d.ts +12 -0
- package/dist/components/colorValue/labels.d.ts.map +1 -0
- package/dist/components/colorValue/labels.js +11 -0
- package/dist/components/colorValue/labels.js.map +1 -0
- package/dist/components/composer/Composer.d.ts +1 -1
- package/dist/components/composer/Composer.d.ts.map +1 -1
- package/dist/components/composer/Composer.js +2 -2
- package/dist/components/composer/Composer.js.map +1 -1
- package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
- package/dist/components/dpqlEditor/DpqlEditor.js +25 -5
- package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts +36 -5
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.js +340 -62
- package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.d.ts +11 -7
- package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.js +35 -17
- package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
- package/dist/components/dpqlEditor/types.d.ts +54 -8
- package/dist/components/dpqlEditor/types.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.d.ts +2 -2
- package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.js +16 -7
- package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
- package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +207 -97
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
- package/dist/components/form/engine/CompactToolbar.js +29 -3
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +58 -10
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +542 -112
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/HiddenFieldsNote.d.ts +28 -0
- package/dist/components/form/engine/HiddenFieldsNote.d.ts.map +1 -0
- package/dist/components/form/engine/HiddenFieldsNote.js +32 -0
- package/dist/components/form/engine/HiddenFieldsNote.js.map +1 -0
- package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.js +24 -3
- package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +2 -2
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.js +12 -6
- package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +21 -0
- package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowContext.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts +20 -10
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +36 -30
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarColors.d.ts +16 -0
- package/dist/components/form/engine/compactToolbarColors.d.ts.map +1 -0
- package/dist/components/form/engine/compactToolbarColors.js +21 -0
- package/dist/components/form/engine/compactToolbarColors.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +24 -8
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +77 -109
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/readFirstColors.d.ts +30 -0
- package/dist/components/form/engine/readFirstColors.d.ts.map +1 -0
- package/dist/components/form/engine/readFirstColors.js +51 -0
- package/dist/components/form/engine/readFirstColors.js.map +1 -0
- package/dist/components/form/engine/rowFocus.d.ts +2 -0
- package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
- package/dist/components/form/engine/rowFocus.js +26 -3
- package/dist/components/form/engine/rowFocus.js.map +1 -1
- package/dist/components/form/engine/typeChoices.d.ts +1 -1
- package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -1
- package/dist/components/form/engine/variants/VariantCalmTable.js +2 -1
- package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -1
- package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -1
- package/dist/components/form/engine/variants/VariantCards.js +2 -1
- package/dist/components/form/engine/variants/VariantCards.js.map +1 -1
- package/dist/components/form/engine/variants/VariantFocus.js +1 -1
- package/dist/components/form/engine/variants/VariantFocus.js.map +1 -1
- package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -1
- package/dist/components/form/engine/variants/VariantMinimal.js +2 -1
- package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -1
- package/dist/components/form/engine/variants/variantParts.d.ts +1 -1
- package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -1
- package/dist/components/form/engine/variants/variantParts.js +25 -17
- package/dist/components/form/engine/variants/variantParts.js.map +1 -1
- package/dist/components/form/expressions/DpqlRendering.d.ts +1 -1
- package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -1
- package/dist/components/form/expressions/DpqlRendering.js +3 -3
- package/dist/components/form/expressions/DpqlRendering.js.map +1 -1
- package/dist/components/form/expressions/ExpressionField.d.ts +64 -3
- package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
- package/dist/components/form/expressions/ExpressionField.js +459 -100
- package/dist/components/form/expressions/ExpressionField.js.map +1 -1
- package/dist/components/form/expressions/argumentPresence.d.ts +14 -0
- package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -1
- package/dist/components/form/expressions/argumentPresence.js +16 -1
- package/dist/components/form/expressions/argumentPresence.js.map +1 -1
- package/dist/components/form/expressions/builder/argumentDetail.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentDetail.js +4 -1
- package/dist/components/form/expressions/builder/argumentDetail.js.map +1 -1
- package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentLabel.js +27 -9
- package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
- package/dist/components/form/expressions/builder/argumentWrapper.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentWrapper.js +3 -1
- package/dist/components/form/expressions/builder/argumentWrapper.js.map +1 -1
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +5 -4
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js.map +1 -1
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts +1 -1
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js +6 -3
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
- package/dist/components/form/expressions/builder/index.d.ts +24 -2
- package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/index.js +138 -78
- package/dist/components/form/expressions/builder/index.js.map +1 -1
- package/dist/components/form/expressions/builder/item.d.ts +6 -2
- package/dist/components/form/expressions/builder/item.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/item.js +19 -5
- package/dist/components/form/expressions/builder/item.js.map +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.js +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
- package/dist/components/form/expressions/dpqlMockRecordPath.d.ts +11 -0
- package/dist/components/form/expressions/dpqlMockRecordPath.d.ts.map +1 -0
- package/dist/components/form/expressions/dpqlMockRecordPath.js +254 -0
- package/dist/components/form/expressions/dpqlMockRecordPath.js.map +1 -0
- package/dist/components/form/expressions/expressionOperands.d.ts +16 -0
- package/dist/components/form/expressions/expressionOperands.d.ts.map +1 -0
- package/dist/components/form/expressions/expressionOperands.js +97 -0
- package/dist/components/form/expressions/expressionOperands.js.map +1 -0
- package/dist/components/form/expressions/fieldPath.d.ts +24 -0
- package/dist/components/form/expressions/fieldPath.d.ts.map +1 -0
- package/dist/components/form/expressions/fieldPath.js +152 -0
- package/dist/components/form/expressions/fieldPath.js.map +1 -0
- package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/mockExpressions.js +22 -5
- package/dist/components/form/expressions/mockExpressions.js.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts +2 -0
- package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.js +40 -9
- package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
- package/dist/components/form/expressions/textOfExpression.d.ts +18 -0
- package/dist/components/form/expressions/textOfExpression.d.ts.map +1 -0
- package/dist/components/form/expressions/textOfExpression.js +49 -0
- package/dist/components/form/expressions/textOfExpression.js.map +1 -0
- package/dist/components/form/expressions/types.d.ts +7 -0
- package/dist/components/form/expressions/types.d.ts.map +1 -1
- package/dist/components/form/expressions/types.js +6 -1
- package/dist/components/form/expressions/types.js.map +1 -1
- package/dist/components/form/expressions/useExpressionType.d.ts +26 -0
- package/dist/components/form/expressions/useExpressionType.d.ts.map +1 -0
- package/dist/components/form/expressions/useExpressionType.js +181 -0
- package/dist/components/form/expressions/useExpressionType.js.map +1 -0
- package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
- package/dist/components/form/expressions/useRenderExpression.js +13 -9
- package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
- package/dist/components/form/expressions/wildcardExpressions.d.ts +27 -0
- package/dist/components/form/expressions/wildcardExpressions.d.ts.map +1 -0
- package/dist/components/form/expressions/wildcardExpressions.js +101 -0
- package/dist/components/form/expressions/wildcardExpressions.js.map +1 -0
- package/dist/components/form/fields/Field.d.ts.map +1 -1
- package/dist/components/form/fields/Field.js +26 -9
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +17 -4
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
- package/dist/components/form/fields/array/ArrayAuto.js +24 -0
- package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
- package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
- package/dist/components/form/fields/array/ArrayAutoField.js +36 -13
- package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts +20 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +81 -36
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/dist/components/form/fields/auto/hostEditorValue.d.ts +30 -0
- package/dist/components/form/fields/auto/hostEditorValue.d.ts.map +1 -0
- package/dist/components/form/fields/auto/hostEditorValue.js +53 -0
- package/dist/components/form/fields/auto/hostEditorValue.js.map +1 -0
- package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
- package/dist/components/form/fields/binary/Binary.js +23 -3
- package/dist/components/form/fields/binary/Binary.js.map +1 -1
- package/dist/components/form/fields/boolean/Boolean.d.ts +5 -0
- package/dist/components/form/fields/boolean/Boolean.d.ts.map +1 -1
- package/dist/components/form/fields/boolean/Boolean.js +9 -1
- package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
- package/dist/components/form/fields/color/Color.d.ts +103 -16
- package/dist/components/form/fields/color/Color.d.ts.map +1 -1
- package/dist/components/form/fields/color/Color.js +616 -16
- package/dist/components/form/fields/color/Color.js.map +1 -1
- package/dist/components/form/fields/emittedValues.d.ts +34 -3
- package/dist/components/form/fields/emittedValues.d.ts.map +1 -1
- package/dist/components/form/fields/emittedValues.js +24 -1
- package/dist/components/form/fields/emittedValues.js.map +1 -1
- package/dist/components/form/fields/file/File.d.ts +1 -1
- package/dist/components/form/fields/file/File.d.ts.map +1 -1
- package/dist/components/form/fields/file/File.js +4 -2
- package/dist/components/form/fields/file/File.js.map +1 -1
- package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +17 -3
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/markdown/MarkdownView.js +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js +4 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/number/Number.d.ts +6 -0
- package/dist/components/form/fields/number/Number.d.ts.map +1 -1
- package/dist/components/form/fields/number/Number.js +41 -6
- package/dist/components/form/fields/number/Number.js.map +1 -1
- package/dist/components/form/fields/object/Object.d.ts +1 -1
- package/dist/components/form/fields/object/Object.d.ts.map +1 -1
- package/dist/components/form/fields/object/Object.js +4 -2
- package/dist/components/form/fields/object/Object.js.map +1 -1
- package/dist/components/form/fields/pendingEdit.d.ts +52 -0
- package/dist/components/form/fields/pendingEdit.d.ts.map +1 -0
- package/dist/components/form/fields/pendingEdit.js +79 -0
- package/dist/components/form/fields/pendingEdit.js.map +1 -0
- package/dist/components/form/fields/rich-text/RichText.d.ts +8 -1
- package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.js +188 -82
- package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
- package/dist/components/form/fields/rich-text/useTemplateTags.d.ts +18 -0
- package/dist/components/form/fields/rich-text/useTemplateTags.d.ts.map +1 -0
- package/dist/components/form/fields/rich-text/useTemplateTags.js +49 -0
- package/dist/components/form/fields/rich-text/useTemplateTags.js.map +1 -0
- package/dist/components/form/fields/schema-definition/CatalogLeafForm.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/CatalogLeafForm.js +4 -1
- package/dist/components/form/fields/schema-definition/CatalogLeafForm.js.map +1 -1
- package/dist/components/form/fields/schema-definition/CatalogNodeEditor.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js +20 -5
- package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js.map +1 -1
- package/dist/components/form/fields/schema-definition/TableEditor.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/TableEditor.js +10 -2
- package/dist/components/form/fields/schema-definition/TableEditor.js.map +1 -1
- package/dist/components/form/fields/schema-definition/index.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/index.js +8 -4
- package/dist/components/form/fields/schema-definition/index.js.map +1 -1
- package/dist/components/form/fields/select/Select.d.ts +2 -0
- package/dist/components/form/fields/select/Select.d.ts.map +1 -1
- package/dist/components/form/fields/select/Select.js +19 -10
- package/dist/components/form/fields/select/Select.js.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.js +8 -2
- package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
- package/dist/components/form/fields/select/unavailableRow.d.ts +23 -0
- package/dist/components/form/fields/select/unavailableRow.d.ts.map +1 -0
- package/dist/components/form/fields/select/unavailableRow.js +55 -0
- package/dist/components/form/fields/select/unavailableRow.js.map +1 -0
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +11 -5
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +13 -5
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
- package/dist/components/form/fields/template/TemplateBrowser.d.ts +22 -0
- package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
- package/dist/components/form/fields/template/TemplateBrowser.js +54 -0
- package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
- package/dist/components/form/fields/template/TemplateField.d.ts +102 -1
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +572 -85
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/components/form/fields/template/TemplateText.d.ts +0 -17
- package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateText.js +9 -11
- package/dist/components/form/fields/template/TemplateText.js.map +1 -1
- package/dist/components/form/fields/template/writtenAsText.d.ts +61 -0
- package/dist/components/form/fields/template/writtenAsText.d.ts.map +1 -0
- package/dist/components/form/fields/template/writtenAsText.js +204 -0
- package/dist/components/form/fields/template/writtenAsText.js.map +1 -0
- package/dist/components/form/index.d.ts +10 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +23 -1
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.js +19 -7
- package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
- package/dist/components/log/Log.d.ts.map +1 -1
- package/dist/components/log/Log.js +16 -8
- package/dist/components/log/Log.js.map +1 -1
- package/dist/components/menu/Menu.d.ts.map +1 -1
- package/dist/components/menu/Menu.js +19 -10
- package/dist/components/menu/Menu.js.map +1 -1
- package/dist/components/smartEditor/CompletionMenu.d.ts +43 -0
- package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
- package/dist/components/smartEditor/CompletionMenu.js +196 -0
- package/dist/components/smartEditor/CompletionMenu.js.map +1 -0
- package/dist/components/smartEditor/MarkdownDoc.d.ts +1 -1
- package/dist/components/smartEditor/MarkdownDoc.js +3 -3
- package/dist/components/smartEditor/MarkdownDoc.js.map +1 -1
- package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
- package/dist/components/smartEditor/SmartEditor.js +164 -180
- package/dist/components/smartEditor/SmartEditor.js.map +1 -1
- package/dist/components/smartEditor/completionStyle.d.ts +27 -0
- package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
- package/dist/components/smartEditor/completionStyle.js +68 -0
- package/dist/components/smartEditor/completionStyle.js.map +1 -0
- package/dist/components/smartEditor/index.d.ts +5 -1
- package/dist/components/smartEditor/index.d.ts.map +1 -1
- package/dist/components/smartEditor/index.js +19 -1
- package/dist/components/smartEditor/index.js.map +1 -1
- package/dist/components/smartEditor/templateCompletions.d.ts +18 -0
- package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
- package/dist/components/smartEditor/templateCompletions.js +94 -0
- package/dist/components/smartEditor/templateCompletions.js.map +1 -0
- package/dist/components/smartEditor/typedReferences.d.ts +21 -0
- package/dist/components/smartEditor/typedReferences.d.ts.map +1 -0
- package/dist/components/smartEditor/typedReferences.js +82 -0
- package/dist/components/smartEditor/typedReferences.js.map +1 -0
- package/dist/components/smartEditor/types.d.ts +33 -1
- package/dist/components/smartEditor/types.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspAutocomplete.d.ts +32 -0
- package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspAutocomplete.js +228 -118
- package/dist/components/smartEditor/useLspAutocomplete.js.map +1 -1
- package/dist/components/smartEditor/useLspHover.d.ts +33 -7
- package/dist/components/smartEditor/useLspHover.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspHover.js +279 -35
- package/dist/components/smartEditor/useLspHover.js.map +1 -1
- package/dist/components/smartEditor/useLspSemanticTokens.js +1 -1
- package/dist/components/smartEditor/useLspSemanticTokens.js.map +1 -1
- package/dist/components/smartEditor/useLspSession.d.ts +6 -0
- package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspSession.js +7 -6
- package/dist/components/smartEditor/useLspSession.js.map +1 -1
- package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -1
- package/dist/components/supportTicket/AttachmentChips.js +15 -5
- package/dist/components/supportTicket/AttachmentChips.js.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.d.ts +9 -2
- package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.js +27 -6
- package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
- package/dist/components/supportTicket/TicketHeader.d.ts +3 -4
- package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketHeader.js +20 -2
- package/dist/components/supportTicket/TicketHeader.js.map +1 -1
- package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
- package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
- package/dist/components/ticketReferences/TicketReferences.js +9 -4
- package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
- package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
- package/dist/components/ticketThread/TicketThread.js +38 -13
- package/dist/components/ticketThread/TicketThread.js.map +1 -1
- package/dist/helpers/descriptionTooltip.d.ts +43 -0
- package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
- package/dist/helpers/descriptionTooltip.js +70 -0
- package/dist/helpers/descriptionTooltip.js.map +1 -0
- package/dist/helpers/domProps.d.ts +5 -0
- package/dist/helpers/domProps.d.ts.map +1 -0
- package/dist/helpers/domProps.js +47 -0
- package/dist/helpers/domProps.js.map +1 -0
- package/dist/helpers/expressions.d.ts +107 -2
- package/dist/helpers/expressions.d.ts.map +1 -1
- package/dist/helpers/expressions.js +223 -8
- package/dist/helpers/expressions.js.map +1 -1
- package/dist/helpers/hoveringPointer.d.ts +26 -0
- package/dist/helpers/hoveringPointer.d.ts.map +1 -0
- package/dist/helpers/hoveringPointer.js +29 -0
- package/dist/helpers/hoveringPointer.js.map +1 -0
- package/dist/helpers/markdownText.d.ts +14 -0
- package/dist/helpers/markdownText.d.ts.map +1 -0
- package/dist/helpers/markdownText.js +160 -0
- package/dist/helpers/markdownText.js.map +1 -0
- package/dist/helpers/qorusTypeCatalogue.d.ts +53 -0
- package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
- package/dist/helpers/qorusTypeCatalogue.js +262 -0
- package/dist/helpers/qorusTypeCatalogue.js.map +1 -0
- package/dist/helpers/readableColors.d.ts +36 -0
- package/dist/helpers/readableColors.d.ts.map +1 -0
- package/dist/helpers/readableColors.js +116 -0
- package/dist/helpers/readableColors.js.map +1 -0
- package/dist/helpers/recordFieldReference.d.ts +15 -0
- package/dist/helpers/recordFieldReference.d.ts.map +1 -0
- package/dist/helpers/recordFieldReference.js +89 -0
- package/dist/helpers/recordFieldReference.js.map +1 -0
- package/dist/helpers/templateItems.d.ts +2 -2
- package/dist/helpers/templateItems.d.ts.map +1 -1
- package/dist/helpers/templateItems.js +6 -4
- package/dist/helpers/templateItems.js.map +1 -1
- package/dist/helpers/templateText.js +5 -2
- package/dist/helpers/templateText.js.map +1 -1
- package/dist/helpers/templates.d.ts +41 -14
- package/dist/helpers/templates.d.ts.map +1 -1
- package/dist/helpers/templates.js +152 -9
- package/dist/helpers/templates.js.map +1 -1
- package/dist/helpers/validations.d.ts +9 -0
- package/dist/helpers/validations.d.ts.map +1 -1
- package/dist/helpers/validations.js +139 -33
- package/dist/helpers/validations.js.map +1 -1
- package/dist/hooks/useQorusTypes.d.ts +7 -15
- package/dist/hooks/useQorusTypes.d.ts.map +1 -1
- package/dist/hooks/useQorusTypes.js +25 -166
- package/dist/hooks/useQorusTypes.js.map +1 -1
- package/dist/hooks/useReadableIntentShade.d.ts +9 -0
- package/dist/hooks/useReadableIntentShade.d.ts.map +1 -0
- package/dist/hooks/useReadableIntentShade.js +23 -0
- package/dist/hooks/useReadableIntentShade.js.map +1 -0
- package/dist/hooks/useReadableOpacity.d.ts +6 -0
- package/dist/hooks/useReadableOpacity.d.ts.map +1 -0
- package/dist/hooks/useReadableOpacity.js +17 -0
- package/dist/hooks/useReadableOpacity.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tracking/ui/ExperimentCard.d.ts +1 -1
- package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -1
- package/dist/tracking/ui/ExperimentCard.js +26 -10
- package/dist/tracking/ui/ExperimentCard.js.map +1 -1
- package/dist/tracking/ui/card.d.ts +2 -2
- package/dist/tracking/ui/card.d.ts.map +1 -1
- package/dist/tracking/ui/card.js +2 -2
- package/dist/tracking/ui/card.js.map +1 -1
- package/dist/tracking/ui/readable.d.ts +14 -0
- package/dist/tracking/ui/readable.d.ts.map +1 -0
- package/dist/tracking/ui/readable.js +60 -0
- package/dist/tracking/ui/readable.js.map +1 -0
- package/dist/utils/fetch.d.ts +9 -2
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +6 -5
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/websocket.d.ts +65 -2
- package/dist/utils/websocket.d.ts.map +1 -1
- package/dist/utils/websocket.js +276 -44
- package/dist/utils/websocket.js.map +1 -1
- package/package.json +14 -5
- package/.claude/CLAUDE.md +0 -317
- package/.tasks/EXPORT_EXPRESSION_BUILDER.md +0 -38
- package/.tasks/EXPRESSION_BUILDER_REPORT.md +0 -149
- package/.tasks/EXPRESSION_FIELD_SEAMS.md +0 -66
- package/.tasks/FIELD_STACK_REPORT.md +0 -234
- package/.tasks/FORM_ENGINE_COMPACT_READ_FIRST.md +0 -558
- package/.tasks/FORM_ENGINE_EXPRESSIONS.md +0 -197
- package/.tasks/FORM_ENGINE_OPTIONS_SYNC.md +0 -95
- package/.tasks/FORM_FIELD_EXTRAS.md +0 -72
- package/.tasks/INDEX.md +0 -111
- package/.tasks/LSP_SHARED_CONNECTION.md +0 -75
- package/.tasks/QONSOLE_ASSIST_FEATURES.md +0 -306
- package/.tasks/RENDER_EXPRESSION_LSP.md +0 -159
- package/.tasks/REQRAFT_AUTO_FIELD.md +0 -176
- package/.tasks/SCHEMA_DEFINITION_FIELD.md +0 -250
- package/.tasks/SMART_EDITOR_CONTEXT_AND_POLISH.md +0 -340
- package/.tasks/SMART_EDITOR_LSP_FEATURES.md +0 -299
- package/.tasks/SMART_EDITOR_REVIEW_FOLLOWUPS.md +0 -280
- package/.tasks/SMART_EDITOR_UX_POLISH.md +0 -383
- package/.tasks/SMART_EDITOR_VISUAL_POLISH.md +0 -246
- package/.tasks/STORY_NETWORK_ISOLATION.md +0 -98
- package/.tasks/TEMPLATE_TOKEN_GRAMMAR.md +0 -72
- package/CODE_OF_CONDUCT.md +0 -105
- package/CONTRIBUTING.MD +0 -78
- package/SECURITY.md +0 -3
- package/chromatic.config.json +0 -5
- package/design/COMPACT_ENGINE_REDESIGN.md +0 -156
- package/design/COMPACT_INFO_DISPLAY.md +0 -87
- package/design/COMPACT_PARITY.md +0 -85
- package/design/EXPRESSION_BUILDER_REPORT_STRATEGY.md +0 -92
- package/design/FORM_ENGINE_COMPACT.md +0 -300
- package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +0 -353
- package/design/FORM_ENGINE_EXPRESSIONS.md +0 -257
- package/design/FORM_ENGINE_FIELD_MIGRATION.md +0 -419
- package/design/IDE_INTEGRATION.md +0 -64
- package/design/RENDER_EXPRESSION_TRANSPORT.md +0 -156
- package/design/SELECT_DIALOG_FLOOR.md +0 -86
- package/design/SMART_EDITOR_UX.md +0 -438
- package/design/TRACKING.md +0 -290
- package/design/UNAVAILABLE_ALLOWED_VALUES.md +0 -226
- package/src/components/Description/index.tsx +0 -254
- package/src/components/Description/markdownRendererContext.tsx +0 -29
- package/src/components/FocusedEditing/index.tsx +0 -50
- package/src/components/codeSize/index.tsx +0 -79
- package/src/components/composer/Composer.stories.tsx +0 -238
- package/src/components/composer/Composer.tsx +0 -554
- package/src/components/composer/helpers.ts +0 -74
- package/src/components/composer/index.ts +0 -2
- package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -1183
- package/src/components/dpqlEditor/DpqlEditor.tsx +0 -219
- package/src/components/dpqlEditor/dpqlHelpers.ts +0 -287
- package/src/components/dpqlEditor/dpqlInserter.ts +0 -121
- package/src/components/dpqlEditor/dpqlProbe.ts +0 -165
- package/src/components/dpqlEditor/dpqlTags.ts +0 -114
- package/src/components/dpqlEditor/index.ts +0 -41
- package/src/components/dpqlEditor/types.ts +0 -203
- package/src/components/dpqlEditor/useDpqlProbe.ts +0 -33
- package/src/components/dpqlEditor/useDpqlSession.ts +0 -411
- package/src/components/form/engine/CompactRow.tsx +0 -2620
- package/src/components/form/engine/CompactToolbar.tsx +0 -330
- package/src/components/form/engine/FormEngine.stories.tsx +0 -9920
- package/src/components/form/engine/FormEngine.tsx +0 -4569
- package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
- package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -331
- package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
- package/src/components/form/engine/OptionFieldMessages.tsx +0 -477
- package/src/components/form/engine/OptionsHelpDialog.tsx +0 -29
- package/src/components/form/engine/__fixtures__/basicFormOptions.ts +0 -309
- package/src/components/form/engine/__fixtures__/fieldChromeOptions.ts +0 -45
- package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +0 -233
- package/src/components/form/engine/_structuredData/SchemaDataView.tsx +0 -742
- package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +0 -85
- package/src/components/form/engine/_structuredData/StructuredDataView.tsx +0 -75
- package/src/components/form/engine/_structuredData/structuredData.ts +0 -145
- package/src/components/form/engine/compactRowContext.ts +0 -148
- package/src/components/form/engine/compactRowStyles.ts +0 -898
- package/src/components/form/engine/compactToolbarContext.ts +0 -69
- package/src/components/form/engine/optionActions.ts +0 -128
- package/src/components/form/engine/optionsContext.ts +0 -24
- package/src/components/form/engine/readFirst.ts +0 -1077
- package/src/components/form/engine/rendererTypes.ts +0 -107
- package/src/components/form/engine/revealRow.ts +0 -123
- package/src/components/form/engine/rowFocus.ts +0 -101
- package/src/components/form/engine/rowMenuContext.ts +0 -159
- package/src/components/form/engine/rowOpenPicker.ts +0 -27
- package/src/components/form/engine/typeChoices.ts +0 -63
- package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +0 -159
- package/src/components/form/engine/variants/VariantCalmTable.tsx +0 -244
- package/src/components/form/engine/variants/VariantCards.tsx +0 -212
- package/src/components/form/engine/variants/VariantFocus.tsx +0 -382
- package/src/components/form/engine/variants/VariantMinimal.tsx +0 -170
- package/src/components/form/engine/variants/focusDemo.ts +0 -145
- package/src/components/form/engine/variants/variantModel.ts +0 -223
- package/src/components/form/engine/variants/variantParts.tsx +0 -313
- package/src/components/form/expressions/DpqlRendering.tsx +0 -85
- package/src/components/form/expressions/ExpressionField.stories.tsx +0 -1395
- package/src/components/form/expressions/ExpressionField.tsx +0 -503
- package/src/components/form/expressions/argumentPresence.ts +0 -213
- package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +0 -1683
- package/src/components/form/expressions/builder/argumentDetail.tsx +0 -17
- package/src/components/form/expressions/builder/argumentLabel.tsx +0 -146
- package/src/components/form/expressions/builder/argumentSlot.tsx +0 -101
- package/src/components/form/expressions/builder/argumentWrapper.tsx +0 -243
- package/src/components/form/expressions/builder/confirmMismatchedTypesModal.tsx +0 -120
- package/src/components/form/expressions/builder/confirmUnsupportedTypeModal.tsx +0 -69
- package/src/components/form/expressions/builder/index.tsx +0 -1545
- package/src/components/form/expressions/builder/item.tsx +0 -89
- package/src/components/form/expressions/builder/moveToPositionStrip.tsx +0 -156
- package/src/components/form/expressions/builder/renderTemplate.tsx +0 -42
- package/src/components/form/expressions/dpqlMockLanguage.ts +0 -566
- package/src/components/form/expressions/dpqlMockLsp.ts +0 -126
- package/src/components/form/expressions/mockExpressions.ts +0 -317
- package/src/components/form/expressions/renderExpressionToText.ts +0 -137
- package/src/components/form/expressions/types.ts +0 -110
- package/src/components/form/expressions/useExpressions.ts +0 -101
- package/src/components/form/expressions/useRenderExpression.ts +0 -165
- package/src/components/form/fields/Field.stories.tsx +0 -143
- package/src/components/form/fields/Field.tsx +0 -732
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -297
- package/src/components/form/fields/array/ArrayAuto.tsx +0 -237
- package/src/components/form/fields/array/ArrayAutoField.stories.tsx +0 -475
- package/src/components/form/fields/array/ArrayAutoField.tsx +0 -367
- package/src/components/form/fields/auto/AutoFormField.stories.tsx +0 -825
- package/src/components/form/fields/auto/AutoFormField.tsx +0 -1164
- package/src/components/form/fields/binary/Binary.stories.tsx +0 -122
- package/src/components/form/fields/binary/Binary.tsx +0 -91
- package/src/components/form/fields/boolean/Boolean.stories.tsx +0 -125
- package/src/components/form/fields/boolean/Boolean.tsx +0 -34
- package/src/components/form/fields/byte-size/ByteSize.stories.tsx +0 -87
- package/src/components/form/fields/byte-size/ByteSize.tsx +0 -58
- package/src/components/form/fields/color/Color.stories.tsx +0 -99
- package/src/components/form/fields/color/Color.tsx +0 -46
- package/src/components/form/fields/cron/Cron.stories.tsx +0 -68
- package/src/components/form/fields/cron/Cron.tsx +0 -80
- package/src/components/form/fields/date/Date.stories.tsx +0 -77
- package/src/components/form/fields/date/Date.tsx +0 -55
- package/src/components/form/fields/emittedValues.ts +0 -70
- package/src/components/form/fields/file/File.stories.tsx +0 -161
- package/src/components/form/fields/file/File.tsx +0 -227
- package/src/components/form/fields/long-string/LongString.stories.tsx +0 -120
- package/src/components/form/fields/long-string/LongString.tsx +0 -130
- package/src/components/form/fields/markdown/Markdown.stories.tsx +0 -76
- package/src/components/form/fields/markdown/Markdown.tsx +0 -81
- package/src/components/form/fields/markdown/MarkdownView.tsx +0 -222
- package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +0 -139
- package/src/components/form/fields/number/Number.stories.tsx +0 -159
- package/src/components/form/fields/number/Number.tsx +0 -160
- package/src/components/form/fields/object/Object.stories.tsx +0 -398
- package/src/components/form/fields/object/Object.tsx +0 -255
- package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +0 -95
- package/src/components/form/fields/radio-group/RadioGroup.tsx +0 -46
- package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
- package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
- package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
- package/src/components/form/fields/rich-text/RichText.stories.tsx +0 -260
- package/src/components/form/fields/rich-text/RichText.tsx +0 -537
- package/src/components/form/fields/schema-definition/CatalogLeafForm.tsx +0 -242
- package/src/components/form/fields/schema-definition/CatalogNodeEditor.tsx +0 -758
- package/src/components/form/fields/schema-definition/Hint.tsx +0 -22
- package/src/components/form/fields/schema-definition/InlineValidationBanner.tsx +0 -138
- package/src/components/form/fields/schema-definition/Loader.tsx +0 -20
- package/src/components/form/fields/schema-definition/MigrationsTab.tsx +0 -187
- package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +0 -286
- package/src/components/form/fields/schema-definition/TableEditor.tsx +0 -155
- package/src/components/form/fields/schema-definition/TablesTab.tsx +0 -138
- package/src/components/form/fields/schema-definition/catalog.ts +0 -237
- package/src/components/form/fields/schema-definition/helpers.ts +0 -90
- package/src/components/form/fields/schema-definition/index.tsx +0 -418
- package/src/components/form/fields/schema-definition/mockCatalog.ts +0 -325
- package/src/components/form/fields/schema-definition/mockDefinition.ts +0 -111
- package/src/components/form/fields/schema-definition/referenceSuggestions.tsx +0 -152
- package/src/components/form/fields/schema-definition/starterTemplate.ts +0 -68
- package/src/components/form/fields/schema-definition/types.ts +0 -185
- package/src/components/form/fields/schema-definition/useSchemaOptionCatalog.ts +0 -49
- package/src/components/form/fields/select/Select.stories.tsx +0 -872
- package/src/components/form/fields/select/Select.tsx +0 -624
- package/src/components/form/fields/select/SelectCollection.tsx +0 -594
- package/src/components/form/fields/string/String.stories.tsx +0 -86
- package/src/components/form/fields/string/String.tsx +0 -43
- package/src/components/form/fields/template/ExampleValueModal.stories.tsx +0 -114
- package/src/components/form/fields/template/ExampleValueModal.tsx +0 -99
- package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +0 -47
- package/src/components/form/fields/template/TemplateField.stories.tsx +0 -1121
- package/src/components/form/fields/template/TemplateField.tsx +0 -1717
- package/src/components/form/fields/template/TemplateText.tsx +0 -115
- package/src/components/form/fields/template/__fixtures__/longExampleValue.ts +0 -7
- package/src/components/form/fields/template/__fixtures__/multiLevelTemplates.json +0 -147
- package/src/components/form/fields/template/__fixtures__/templates.json +0 -83
- package/src/components/form/fields/timeout/Timeout.stories.tsx +0 -228
- package/src/components/form/fields/timeout/Timeout.tsx +0 -87
- package/src/components/form/fields/url/Url.stories.tsx +0 -94
- package/src/components/form/fields/url/Url.tsx +0 -85
- package/src/components/form/index.tsx +0 -47
- package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
- package/src/components/imageLightbox/ImageLightbox.tsx +0 -236
- package/src/components/imageLightbox/index.ts +0 -1
- package/src/components/log/Log.stories.tsx +0 -333
- package/src/components/log/Log.tsx +0 -285
- package/src/components/menu/Menu.stories.tsx +0 -155
- package/src/components/menu/Menu.tsx +0 -312
- package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +0 -797
- package/src/components/qonsoleSmartInput/QonsoleSmartInput.tsx +0 -105
- package/src/components/qonsoleSmartInput/index.ts +0 -16
- package/src/components/qonsoleSmartInput/qonsoleInserter.ts +0 -77
- package/src/components/qonsoleSmartInput/types.ts +0 -133
- package/src/components/qonsoleSmartInput/useQonsoleSession.ts +0 -124
- package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +0 -62
- package/src/components/searchFilterBar/SearchFilterBar.tsx +0 -144
- package/src/components/searchFilterBar/index.ts +0 -1
- package/src/components/smartEditor/MarkdownDoc.tsx +0 -190
- package/src/components/smartEditor/SmartEditor.stories.tsx +0 -475
- package/src/components/smartEditor/SmartEditor.tsx +0 -808
- package/src/components/smartEditor/__fixtures__/mockLspServer.ts +0 -205
- package/src/components/smartEditor/helpers.ts +0 -217
- package/src/components/smartEditor/index.ts +0 -35
- package/src/components/smartEditor/styling.ts +0 -45
- package/src/components/smartEditor/types.ts +0 -211
- package/src/components/smartEditor/useLspAutocomplete.ts +0 -758
- package/src/components/smartEditor/useLspDiagnosticDecorations.ts +0 -125
- package/src/components/smartEditor/useLspHover.ts +0 -230
- package/src/components/smartEditor/useLspSemanticTokens.ts +0 -298
- package/src/components/smartEditor/useLspSession.ts +0 -231
- package/src/components/smartEditor/useLspSignatureHelp.ts +0 -198
- package/src/components/supportTicket/AttachmentChips.stories.tsx +0 -171
- package/src/components/supportTicket/AttachmentChips.tsx +0 -147
- package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +0 -257
- package/src/components/supportTicket/InterfaceReferenceTags.tsx +0 -129
- package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -584
- package/src/components/supportTicket/ReferencePicker.tsx +0 -563
- package/src/components/supportTicket/TicketConversation.stories.tsx +0 -121
- package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
- package/src/components/supportTicket/TicketHeader.tsx +0 -247
- package/src/components/supportTicket/TicketMetaTags.stories.tsx +0 -103
- package/src/components/supportTicket/TicketMetaTags.tsx +0 -85
- package/src/components/supportTicket/TicketReplyBox.stories.tsx +0 -354
- package/src/components/supportTicket/TicketReplyBox.tsx +0 -150
- package/src/components/supportTicket/__fixtures__/kindMarks.ts +0 -28
- package/src/components/supportTicket/attachmentAccess.ts +0 -97
- package/src/components/supportTicket/fileToAttachment.ts +0 -24
- package/src/components/supportTicket/index.ts +0 -10
- package/src/components/supportTicket/meta.ts +0 -206
- package/src/components/supportTicket/ticketModel.ts +0 -131
- package/src/components/supportTicket/useLoadedImages.ts +0 -73
- package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -315
- package/src/components/ticketReferences/TicketReferences.tsx +0 -906
- package/src/components/ticketReferences/index.ts +0 -2
- package/src/components/ticketThread/TicketThread.stories.tsx +0 -829
- package/src/components/ticketThread/TicketThread.tsx +0 -719
- package/src/components/ticketThread/index.ts +0 -6
- package/src/contexts/FetchContext.tsx +0 -25
- package/src/contexts/ReqraftContext.tsx +0 -9
- package/src/contexts/StorageContext.tsx +0 -33
- package/src/global.d.ts +0 -4
- package/src/helpers/allowedValues.ts +0 -249
- package/src/helpers/choiceChip.ts +0 -227
- package/src/helpers/common.ts +0 -326
- package/src/helpers/dpqlDetection.ts +0 -209
- package/src/helpers/expressions.ts +0 -140
- package/src/helpers/optionUiTypes.ts +0 -199
- package/src/helpers/options.ts +0 -150
- package/src/helpers/providerValue.ts +0 -125
- package/src/helpers/scrollbar.ts +0 -32
- package/src/helpers/singleLineString.ts +0 -61
- package/src/helpers/templateItems.ts +0 -81
- package/src/helpers/templateText.ts +0 -350
- package/src/helpers/templates.ts +0 -602
- package/src/helpers/validations.ts +0 -2085
- package/src/hooks/useArgSchema.ts +0 -37
- package/src/hooks/useCoarsePointer.ts +0 -30
- package/src/hooks/useFetch/useFetch.stories.tsx +0 -379
- package/src/hooks/useFetch/useFetch.tsx +0 -154
- package/src/hooks/usePhoneViewport.ts +0 -34
- package/src/hooks/useQorusTypes.ts +0 -233
- package/src/hooks/useReqraftProperty.ts +0 -16
- package/src/hooks/useStorage/useStorage.stories.tsx +0 -168
- package/src/hooks/useStorage/useStorage.ts +0 -35
- package/src/hooks/useTemplates.ts +0 -123
- package/src/hooks/useValidation.ts +0 -9
- package/src/hooks/useWebSocket/useWebSocket.ts +0 -224
- package/src/hooks/useWebSocket/useWebsocket.stories.tsx +0 -640
- package/src/hooks/useWhyDidYouUpdate.ts +0 -38
- package/src/index.tsx +0 -86
- package/src/providers/FetchProvider.tsx +0 -40
- package/src/providers/ReqraftProvider.tsx +0 -52
- package/src/providers/StorageProvider.tsx +0 -131
- package/src/stores/currentUser/currentUser.stories.tsx +0 -100
- package/src/stores/currentUser/currentUser.tsx +0 -94
- package/src/stories/Data/fileFieldArgSchema.json +0 -86
- package/src/stories/Tests/utils.ts +0 -320
- package/src/stories/storyNetwork.ts +0 -92
- package/src/stories/tracking.tsx +0 -206
- package/src/tracking/browser/attach.ts +0 -186
- package/src/tracking/browser/env.ts +0 -78
- package/src/tracking/core/consent.ts +0 -37
- package/src/tracking/core/engagement.ts +0 -47
- package/src/tracking/core/experiments.ts +0 -258
- package/src/tracking/core/hash.ts +0 -26
- package/src/tracking/core/ids.ts +0 -25
- package/src/tracking/core/observable.ts +0 -23
- package/src/tracking/core/queue.ts +0 -131
- package/src/tracking/core/sections.ts +0 -166
- package/src/tracking/core/storage.ts +0 -69
- package/src/tracking/core/tracker.ts +0 -417
- package/src/tracking/core/types.ts +0 -162
- package/src/tracking/core/utm.ts +0 -23
- package/src/tracking/index.ts +0 -72
- package/src/tracking/markup.ts +0 -17
- package/src/tracking/react/Experiment.tsx +0 -44
- package/src/tracking/react/TrackingProvider.tsx +0 -56
- package/src/tracking/react/hooks.ts +0 -106
- package/src/tracking/react/index.ts +0 -13
- package/src/tracking/testing.ts +0 -108
- package/src/tracking/ui/ExperimentCard.stories.tsx +0 -296
- package/src/tracking/ui/ExperimentCard.tsx +0 -667
- package/src/tracking/ui/ExperimentsOverlay.stories.tsx +0 -155
- package/src/tracking/ui/ExperimentsOverlay.tsx +0 -437
- package/src/tracking/ui/anchor.ts +0 -180
- package/src/tracking/ui/card.ts +0 -464
- package/src/tracking/ui/client.ts +0 -117
- package/src/tracking/ui/index.ts +0 -77
- package/src/tracking/ui/types.ts +0 -110
- package/src/tracking/ui/useExperimentsAdmin.ts +0 -103
- package/src/types/Form.ts +0 -29
- package/src/types.ts +0 -14
- package/src/utils/datetime.ts +0 -10
- package/src/utils/fetch.ts +0 -457
- package/src/utils/lspClient.ts +0 -711
- package/src/utils/lspClient.types.ts +0 -211
- package/src/utils/queryUnlessCancelled.ts +0 -28
- package/src/utils/websocket.ts +0 -293
- package/vite.config.ts +0 -58
- 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;
|
package/src/tracking/core/ids.ts
DELETED
|
@@ -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
|
-
}
|