@qoretechnologies/reqraft 0.10.66-pr.145.gcb1e59d → 0.10.66
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/AllowedValuesHelp.d.ts +20 -0
- package/dist/components/Description/AllowedValuesHelp.d.ts.map +1 -0
- package/dist/components/Description/AllowedValuesHelp.js +86 -0
- package/dist/components/Description/AllowedValuesHelp.js.map +1 -0
- 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 +156 -10
- package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlCompletions.d.ts +39 -0
- package/dist/components/dpqlEditor/dpqlCompletions.d.ts.map +1 -0
- package/dist/components/dpqlEditor/dpqlCompletions.js +294 -0
- package/dist/components/dpqlEditor/dpqlCompletions.js.map +1 -0
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts +54 -5
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.js +420 -63
- package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlInserter.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlInserter.js +67 -29
- package/dist/components/dpqlEditor/dpqlInserter.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.d.ts +17 -7
- package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.js +44 -17
- package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
- package/dist/components/dpqlEditor/types.d.ts +94 -8
- package/dist/components/dpqlEditor/types.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.d.ts +7 -2
- package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.js +49 -17
- 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 +336 -243
- 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 +20 -57
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +67 -59
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +606 -409
- 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 +2 -18
- package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.js +28 -25
- package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
- package/dist/components/form/engine/OptionsHelpDialog.d.ts.map +1 -1
- package/dist/components/form/engine/OptionsHelpDialog.js +19 -2
- package/dist/components/form/engine/OptionsHelpDialog.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 +11 -31
- package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +30 -6
- 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 +56 -31
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +121 -110
- 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/compactToolbarContext.d.ts +0 -3
- package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
- package/dist/components/form/engine/inheritProps.d.ts +29 -0
- package/dist/components/form/engine/inheritProps.d.ts.map +1 -0
- package/dist/components/form/engine/inheritProps.js +43 -0
- package/dist/components/form/engine/inheritProps.js.map +1 -0
- package/dist/components/form/engine/operatorSummary.d.ts +26 -0
- package/dist/components/form/engine/operatorSummary.d.ts.map +1 -0
- package/dist/components/form/engine/operatorSummary.js +35 -0
- package/dist/components/form/engine/operatorSummary.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +26 -22
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +79 -115
- 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 +3 -9
- package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
- package/dist/components/form/engine/rowFocus.js +30 -19
- 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 +7 -6
- package/dist/components/form/expressions/DpqlRendering.js.map +1 -1
- package/dist/components/form/expressions/ExpressionField.d.ts +67 -3
- package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
- package/dist/components/form/expressions/ExpressionField.js +536 -114
- 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 +30 -11
- 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 +9 -0
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +30 -27
- 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 +7 -5
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
- package/dist/components/form/expressions/builder/index.d.ts +34 -2
- package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/index.js +170 -80
- 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/loneValue.d.ts +17 -0
- package/dist/components/form/expressions/loneValue.d.ts.map +1 -0
- package/dist/components/form/expressions/loneValue.js +33 -0
- package/dist/components/form/expressions/loneValue.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 +37 -25
- 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 +12 -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 +39 -18
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +0 -7
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +46 -35
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/allowed-values/choicePicture.d.ts +37 -0
- package/dist/components/form/fields/allowed-values/choicePicture.d.ts.map +1 -0
- package/dist/components/form/fields/allowed-values/choicePicture.js +64 -0
- package/dist/components/form/fields/allowed-values/choicePicture.js.map +1 -0
- 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 +30 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +123 -79
- 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 +1 -7
- package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +30 -13
- 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 +10 -7
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/number/Number.d.ts +7 -4
- package/dist/components/form/fields/number/Number.d.ts.map +1 -1
- package/dist/components/form/fields/number/Number.js +45 -18
- 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/radio-group/RadioGroup.d.ts.map +1 -1
- package/dist/components/form/fields/radio-group/RadioGroup.js +8 -13
- package/dist/components/form/fields/radio-group/RadioGroup.js.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.d.ts +20 -1
- package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.js +426 -91
- 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 +80 -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 +10 -1
- package/dist/components/form/fields/select/Select.d.ts.map +1 -1
- package/dist/components/form/fields/select/Select.js +28 -14
- package/dist/components/form/fields/select/Select.js.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.d.ts +5 -0
- package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.js +25 -12
- 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 +21 -5
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
- package/dist/components/form/fields/template/TemplateBrowser.d.ts +16 -0
- package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
- package/dist/components/form/fields/template/TemplateBrowser.js +89 -0
- package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
- package/dist/components/form/fields/template/TemplateField.d.ts +105 -1
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +706 -168
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/components/form/fields/template/TemplatePicker.d.ts +54 -0
- package/dist/components/form/fields/template/TemplatePicker.d.ts.map +1 -0
- package/dist/components/form/fields/template/TemplatePicker.js +459 -0
- package/dist/components/form/fields/template/TemplatePicker.js.map +1 -0
- 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 +22 -16
- package/dist/components/form/fields/template/TemplateText.js.map +1 -1
- package/dist/components/form/fields/template/referenceNames.d.ts +63 -0
- package/dist/components/form/fields/template/referenceNames.d.ts.map +1 -0
- package/dist/components/form/fields/template/referenceNames.js +69 -0
- package/dist/components/form/fields/template/referenceNames.js.map +1 -0
- 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 +12 -2
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +25 -3
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/form/typeSentenceForm.d.ts +17 -0
- package/dist/components/form/typeSentenceForm.d.ts.map +1 -0
- package/dist/components/form/typeSentenceForm.js +54 -0
- package/dist/components/form/typeSentenceForm.js.map +1 -0
- package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.js +19 -9
- 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 +20 -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 +53 -0
- package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
- package/dist/components/smartEditor/CompletionMenu.js +302 -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 +616 -190
- package/dist/components/smartEditor/SmartEditor.js.map +1 -1
- package/dist/components/smartEditor/completionStyle.d.ts +28 -0
- package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
- package/dist/components/smartEditor/completionStyle.js +79 -0
- package/dist/components/smartEditor/completionStyle.js.map +1 -0
- package/dist/components/smartEditor/contextTitle.d.ts +10 -0
- package/dist/components/smartEditor/contextTitle.d.ts.map +1 -0
- package/dist/components/smartEditor/contextTitle.js +21 -0
- package/dist/components/smartEditor/contextTitle.js.map +1 -0
- package/dist/components/smartEditor/editingAids.d.ts +64 -0
- package/dist/components/smartEditor/editingAids.d.ts.map +1 -0
- package/dist/components/smartEditor/editingAids.js +213 -0
- package/dist/components/smartEditor/editingAids.js.map +1 -0
- package/dist/components/smartEditor/index.d.ts +6 -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 +98 -0
- package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
- package/dist/components/smartEditor/templateCompletions.js +380 -0
- package/dist/components/smartEditor/templateCompletions.js.map +1 -0
- package/dist/components/smartEditor/typedReferences.d.ts +34 -0
- package/dist/components/smartEditor/typedReferences.d.ts.map +1 -0
- package/dist/components/smartEditor/typedReferences.js +179 -0
- package/dist/components/smartEditor/typedReferences.js.map +1 -0
- package/dist/components/smartEditor/types.d.ts +116 -2
- package/dist/components/smartEditor/types.d.ts.map +1 -1
- package/dist/components/smartEditor/useEditingAids.d.ts +38 -0
- package/dist/components/smartEditor/useEditingAids.d.ts.map +1 -0
- package/dist/components/smartEditor/useEditingAids.js +392 -0
- package/dist/components/smartEditor/useEditingAids.js.map +1 -0
- package/dist/components/smartEditor/useLspAutocomplete.d.ts +106 -3
- package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspAutocomplete.js +592 -149
- 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 +364 -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/smartEditor/useLspSignatureHelp.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspSignatureHelp.js +6 -11
- package/dist/components/smartEditor/useLspSignatureHelp.js.map +1 -1
- package/dist/components/smartEditor/useTabCameIn.d.ts +10 -0
- package/dist/components/smartEditor/useTabCameIn.d.ts.map +1 -0
- package/dist/components/smartEditor/useTabCameIn.js +42 -0
- package/dist/components/smartEditor/useTabCameIn.js.map +1 -0
- 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/InterfaceReferenceTags.d.ts +2 -3
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -1
- package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.d.ts +9 -3
- package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.js +38 -23
- 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 +21 -6
- package/dist/components/supportTicket/TicketHeader.js.map +1 -1
- package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
- package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.js +10 -29
- package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
- package/dist/components/supportTicket/useLoadedImages.d.ts +0 -10
- package/dist/components/supportTicket/useLoadedImages.d.ts.map +1 -1
- package/dist/components/supportTicket/useLoadedImages.js +1 -63
- package/dist/components/supportTicket/useLoadedImages.js.map +1 -1
- package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
- package/dist/components/ticketReferences/TicketReferences.js +10 -9
- 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 +52 -21
- package/dist/components/ticketThread/TicketThread.js.map +1 -1
- package/dist/helpers/allowedValues.d.ts +21 -12
- package/dist/helpers/allowedValues.d.ts.map +1 -1
- package/dist/helpers/allowedValues.js +40 -20
- package/dist/helpers/allowedValues.js.map +1 -1
- package/dist/helpers/descriptionTooltip.d.ts +46 -0
- package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
- package/dist/helpers/descriptionTooltip.js +76 -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 +115 -4
- package/dist/helpers/expressions.d.ts.map +1 -1
- package/dist/helpers/expressions.js +247 -29
- 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/noDescription.d.ts +9 -0
- package/dist/helpers/noDescription.d.ts.map +1 -0
- package/dist/helpers/noDescription.js +13 -0
- package/dist/helpers/noDescription.js.map +1 -0
- package/dist/helpers/optionUiTypes.d.ts +2 -2
- package/dist/helpers/qorusTypeCatalogue.d.ts +147 -0
- package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
- package/dist/helpers/qorusTypeCatalogue.js +505 -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/singleLineString.d.ts.map +1 -1
- package/dist/helpers/singleLineString.js +0 -1
- package/dist/helpers/singleLineString.js.map +1 -1
- package/dist/helpers/templateCatalogue.d.ts +104 -0
- package/dist/helpers/templateCatalogue.d.ts.map +1 -0
- package/dist/helpers/templateCatalogue.js +116 -0
- package/dist/helpers/templateCatalogue.js.map +1 -0
- package/dist/helpers/templateCatalogueContext.d.ts +19 -0
- package/dist/helpers/templateCatalogueContext.d.ts.map +1 -0
- package/dist/helpers/templateCatalogueContext.js +31 -0
- package/dist/helpers/templateCatalogueContext.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.d.ts +1 -0
- package/dist/helpers/templateText.d.ts.map +1 -1
- package/dist/helpers/templateText.js +7 -3
- package/dist/helpers/templateText.js.map +1 -1
- package/dist/helpers/templateTree.d.ts +248 -0
- package/dist/helpers/templateTree.d.ts.map +1 -0
- package/dist/helpers/templateTree.js +892 -0
- package/dist/helpers/templateTree.js.map +1 -0
- package/dist/helpers/templateType.d.ts +28 -0
- package/dist/helpers/templateType.d.ts.map +1 -0
- package/dist/helpers/templateType.js +30 -0
- package/dist/helpers/templateType.js.map +1 -0
- package/dist/helpers/templates.d.ts +86 -16
- package/dist/helpers/templates.d.ts.map +1 -1
- package/dist/helpers/templates.js +305 -45
- package/dist/helpers/templates.js.map +1 -1
- package/dist/helpers/validations.d.ts +27 -0
- package/dist/helpers/validations.d.ts.map +1 -1
- package/dist/helpers/validations.js +169 -39
- package/dist/helpers/validations.js.map +1 -1
- package/dist/helpers/webLink.d.ts +8 -0
- package/dist/helpers/webLink.d.ts.map +1 -0
- package/dist/helpers/webLink.js +29 -0
- package/dist/helpers/webLink.js.map +1 -0
- package/dist/hooks/useQorusTypes.d.ts +12 -17
- package/dist/hooks/useQorusTypes.d.ts.map +1 -1
- package/dist/hooks/useQorusTypes.js +44 -172
- 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 +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -1
- 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/lspClient.types.d.ts +2 -0
- package/dist/utils/lspClient.types.d.ts.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 -6
- 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/dist/components/form/engine/formAppearance.d.ts +0 -49
- package/dist/components/form/engine/formAppearance.d.ts.map +0 -1
- package/dist/components/form/engine/formAppearance.js +0 -50
- package/dist/components/form/engine/formAppearance.js.map +0 -1
- package/dist/components/form/fields/ChoiceGroupHeading.d.ts +0 -21
- package/dist/components/form/fields/ChoiceGroupHeading.d.ts.map +0 -1
- package/dist/components/form/fields/ChoiceGroupHeading.js +0 -33
- package/dist/components/form/fields/ChoiceGroupHeading.js.map +0 -1
- package/dist/components/form/fields/allowed-values/savedValues.d.ts +0 -30
- package/dist/components/form/fields/allowed-values/savedValues.d.ts.map +0 -1
- package/dist/components/form/fields/allowed-values/savedValues.js +0 -39
- package/dist/components/form/fields/allowed-values/savedValues.js.map +0 -1
- package/dist/helpers/fieldDescription.d.ts +0 -16
- package/dist/helpers/fieldDescription.d.ts.map +0 -1
- package/dist/helpers/fieldDescription.js +0 -40
- package/dist/helpers/fieldDescription.js.map +0 -1
- 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 -2740
- package/src/components/form/engine/CompactToolbar.tsx +0 -399
- package/src/components/form/engine/FormEngine.stories.tsx +0 -9934
- package/src/components/form/engine/FormEngine.tsx +0 -4891
- package/src/components/form/engine/FormEngineAppearance.stories.tsx +0 -609
- package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
- package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -335
- package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
- package/src/components/form/engine/OptionFieldMessages.tsx +0 -548
- 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 -755
- 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 -153
- package/src/components/form/engine/compactRowStyles.ts +0 -1087
- package/src/components/form/engine/compactToolbarContext.ts +0 -72
- package/src/components/form/engine/formAppearance.ts +0 -79
- 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 -1090
- 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 -112
- 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 -152
- 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/ChoiceGroupHeading.tsx +0 -38
- package/src/components/form/fields/Field.stories.tsx +0 -143
- package/src/components/form/fields/Field.tsx +0 -734
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -321
- package/src/components/form/fields/allowed-values/savedValues.ts +0 -64
- 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 -1183
- 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 -147
- package/src/components/form/fields/long-string/LongString.tsx +0 -141
- 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 -140
- package/src/components/form/fields/number/Number.stories.tsx +0 -159
- package/src/components/form/fields/number/Number.tsx +0 -175
- 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 -52
- 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 -1749
- 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 -49
- package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
- package/src/components/imageLightbox/ImageLightbox.tsx +0 -238
- 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 -130
- package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -580
- package/src/components/supportTicket/ReferencePicker.tsx +0 -573
- package/src/components/supportTicket/TicketConversation.stories.tsx +0 -120
- package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
- package/src/components/supportTicket/TicketHeader.tsx +0 -248
- 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 -357
- package/src/components/supportTicket/TicketReplyBox.tsx +0 -172
- 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 -93
- package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -341
- package/src/components/ticketReferences/TicketReferences.tsx +0 -914
- package/src/components/ticketReferences/index.ts +0 -2
- package/src/components/ticketThread/TicketThread.stories.tsx +0 -898
- package/src/components/ticketThread/TicketThread.tsx +0 -706
- 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 -268
- 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/fieldDescription.ts +0 -39
- 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 -62
- 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
package/design/TRACKING.md
DELETED
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
# Tracking, consent and A/B testing
|
|
2
|
-
|
|
3
|
-
First-party analytics, a consent gate and client-side A/B testing for any Qore web app (the
|
|
4
|
-
landing site, the Qorus IDE, the admin portal). One module, one server: every product sends to
|
|
5
|
-
the same collector and reads the same experiments, and **the server keeps each product's data
|
|
6
|
-
separate by `property`**: events, goals, experiments and results never mix between properties.
|
|
7
|
-
|
|
8
|
-
The contract (event shapes, the batch envelope, experiment definitions, goals, statistics,
|
|
9
|
-
storage, the admin API) is owned by qorus-api:
|
|
10
|
-
[`design/analytics-and-experiments-design.md`](https://git.qoretechnologies.com/qorus/qorus-api/-/blob/develop/design/analytics-and-experiments-design.md)
|
|
11
|
-
(introduced in [qorus-api MR !34](https://git.qoretechnologies.com/qorus/qorus-api/-/merge_requests/34)).
|
|
12
|
-
Change the contract there first, then the code here. Section numbers below (§3, §5 …) refer to it.
|
|
13
|
-
|
|
14
|
-
## 1. What it does
|
|
15
|
-
|
|
16
|
-
- **Anonymous, with consent.** Nothing is sent and no id exists until the user allows tracking.
|
|
17
|
-
Then a random visitor id (`vid`) lives in `localStorage["<prefix>vid"]`. Declining or
|
|
18
|
-
withdrawing deletes it and stops everything.
|
|
19
|
-
- **Events** go in batches to the collector: page views, a page summary (time, engaged time,
|
|
20
|
-
scroll depth, per-section attention), clicks on tagged elements, a heartbeat, goals, custom
|
|
21
|
-
events and experiment exposures.
|
|
22
|
-
- **Experiments** are fetched from the experiments endpoint (`?property=<property>` appended)
|
|
23
|
-
and every visitor is assigned locally with GrowthBook's hash v2 on the `vid`, the same way on
|
|
24
|
-
every visit and every page.
|
|
25
|
-
- **Fails open.** No backend, no consent, blocked storage, an error anywhere: the app works as
|
|
26
|
-
without the module, every experiment shows its control, and nothing is thrown into the page.
|
|
27
|
-
|
|
28
|
-
## 2. Install and import
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
yarn add @qoretechnologies/reqraft
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Everything is exported from the package root, and from its own entry, which loads nothing else
|
|
35
|
-
from Reqraft (no Reqore, react-query or editors; React is its only dependency). Prefer the entry
|
|
36
|
-
in an app that does not already use Reqraft:
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import { createBrowserTracker, TrackingProvider, Experiment } from '@qoretechnologies/reqraft/dist/tracking';
|
|
40
|
-
// or
|
|
41
|
-
import { createBrowserTracker, TrackingProvider, Experiment } from '@qoretechnologies/reqraft';
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
The module has three layers, and each only imports the ones above it:
|
|
45
|
-
|
|
46
|
-
| Layer | Folder | What |
|
|
47
|
-
|---|---|---|
|
|
48
|
-
| core | `src/tracking/core/` | plain TypeScript, no DOM: `Tracker`, consent, the batching queue, section and engagement clocks, hashing, assignment, the experiments client |
|
|
49
|
-
| browser | `src/tracking/browser/` | the only code that touches `window` / `document`: transport (`sendBeacon` → `fetch` keepalive), storage, listeners, `IntersectionObserver` on sections, delegated clicks |
|
|
50
|
-
| react | `src/tracking/react/` | `<TrackingProvider>`, `useTracker`, `useConsent`, `useExperiment`, `<Experiment>` |
|
|
51
|
-
|
|
52
|
-
Plus `markup.ts` (`trackClick`, `trackSection`) and `testing.ts` (`createMemoryTracker`). The A/B test UI (the card and the overlay, on Reqore) is a fourth layer, `src/tracking/ui/`, with its own entry (§8); the engine never imports it.
|
|
53
|
-
|
|
54
|
-
## 3. Configure one tracker per app
|
|
55
|
-
|
|
56
|
-
Create the tracker once, at module level, and mount the provider at the app shell:
|
|
57
|
-
|
|
58
|
-
```tsx
|
|
59
|
-
import { createBrowserTracker, TrackingProvider } from '@qoretechnologies/reqraft/dist/tracking';
|
|
60
|
-
|
|
61
|
-
export const tracking = createBrowserTracker({
|
|
62
|
-
property: 'ide', // required: which product the data belongs to
|
|
63
|
-
endpoint: '/qorus-cloud/collect', // required: the collector (POST)
|
|
64
|
-
experimentsEndpoint: '/qorus-cloud/experiments', // required: running experiments (GET)
|
|
65
|
-
storagePrefix: 'qa.ide.', // when another product shares the origin
|
|
66
|
-
consentVersion: 1,
|
|
67
|
-
enabled: import.meta.env.PROD,
|
|
68
|
-
debug: false,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
const App = () => {
|
|
72
|
-
const location = useLocation();
|
|
73
|
-
return (
|
|
74
|
-
<TrackingProvider tracker={tracking.tracker} attach={tracking.attach} location={location.pathname + location.search}>
|
|
75
|
-
<Routes>…</Routes>
|
|
76
|
-
</TrackingProvider>
|
|
77
|
-
);
|
|
78
|
-
};
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Each `location` change is a new page view. Without a provider (or with `tracker={null}`),
|
|
82
|
-
everything still renders: consent reads `unknown` and experiments show their control.
|
|
83
|
-
|
|
84
|
-
| Option | Default | Meaning |
|
|
85
|
-
|---|---|---|
|
|
86
|
-
| `property` | required | The product (`landing`, `ide`, `admin`, …). Sent with every batch and with the experiments request; the server keeps each property's data apart. |
|
|
87
|
-
| `endpoint` | required | Collector URL. Same origin in the products so far. |
|
|
88
|
-
| `experimentsEndpoint` | required | Running-experiments URL; `?property=` is appended. |
|
|
89
|
-
| `enabled` | `true` | `false`: nothing is ever sent and every experiment shows its control. Turn it off where a page view is not a visit (a preview iframe, a test build). |
|
|
90
|
-
| `consentVersion` | `1` | Bump when the consent text changes materially: stored answers to older versions count as no answer, so the prompt asks again. |
|
|
91
|
-
| `storagePrefix` | `qa.` | Prefix of every storage key. **Two products on one origin need different prefixes**, or they share one consent answer, one visitor id and one experiments cache. |
|
|
92
|
-
| `previewParam` | `qa_variant` | Query parameter of a shareable preview link. |
|
|
93
|
-
| `debug` | `false` | Log every batch (and every swallowed error) to the console. |
|
|
94
|
-
| `flushIntervalMs`, `maxQueued`, `heartbeatMs`, `sessionTimeoutMs`, `engagedWindowMs` | 5 s, 20, 15 s, 30 min, 10 s | Batching and timing. |
|
|
95
|
-
|
|
96
|
-
`resolveConfig(options)` gives the full config; `DEFAULT_CONFIG` holds the defaults.
|
|
97
|
-
|
|
98
|
-
## 4. Consent
|
|
99
|
-
|
|
100
|
-
```tsx
|
|
101
|
-
const { state, grant, deny, available } = useConsent(); // state: 'unknown' | 'granted' | 'denied'
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
- Stored in `localStorage["<prefix>consent"]` (`granted` | `denied`) and `<prefix>consent.v`
|
|
105
|
-
(the version answered).
|
|
106
|
-
- Before `granted`: no id, no request to the collector, controls only, sign-up links
|
|
107
|
-
undecorated. The experiments list is still fetched: it is public and carries no visitor data.
|
|
108
|
-
- `deny()` (declining or withdrawing) deletes `vid`, `exp`, `sid` and `utm` and drops unsent events.
|
|
109
|
-
- The consent prompt is the app's own UI. `openConsentSettings()` / `closeConsentSettings()` /
|
|
110
|
-
`useConsentPanelOpen()` let a "Cookie settings" link reopen it.
|
|
111
|
-
|
|
112
|
-
## 5. Experiments
|
|
113
|
-
|
|
114
|
-
Wrap what is being tested:
|
|
115
|
-
|
|
116
|
-
```tsx
|
|
117
|
-
<Experiment id='signup-cta' trigger='pricing' variants={{ a: <Current />, b: <New /> }} />
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
or, for logic rather than markup:
|
|
121
|
-
|
|
122
|
-
```tsx
|
|
123
|
-
const { variant, assignment, triggerRef } = useExperiment('signup-cta', { variants: ['a', 'b'] });
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
- `a` is the control unless `control="…"` says otherwise; the control must be today's behaviour.
|
|
127
|
-
- **The variant is decided once when the component mounts** and kept for the page view: no
|
|
128
|
-
flicker. A consent or definition that arrives later applies from the next page view.
|
|
129
|
-
- **Exposure** is logged once per page view, only for enrolled visitors, when the trigger is
|
|
130
|
-
seen: the definition's `trigger.section`, else the `trigger` prop, else the element you put
|
|
131
|
-
`triggerRef` on, else at render.
|
|
132
|
-
- Visitors without consent, outside `traffic`, or not targeted see the control and log nothing.
|
|
133
|
-
A concluded experiment shows its winner to everybody and logs nothing.
|
|
134
|
-
- Order of `tracker.decide()`: a concluded winner, then the in-app switch or a preview link, then
|
|
135
|
-
consent, the definition and the assignment. `assignment.reason` says which one decided.
|
|
136
|
-
- `<Experiment>` wraps its output in a `display: contents` element (no box, so the layout is
|
|
137
|
-
unchanged) with `data-experiment`, `data-variant`, `data-variants` and
|
|
138
|
-
`data-experiment-reason`, so an editor overlay can find every test on the page.
|
|
139
|
-
- **Preview link:** `?qa_variant=signup-cta:b` (several: `?qa_variant=a-test:b,other:a`) shows a
|
|
140
|
-
version for QA, sticks for the browser session, works without consent and is never logged.
|
|
141
|
-
`?qa_variant=clear` removes it.
|
|
142
|
-
- **In-app switch** (for an editor): `tracker.experiments.setEditorOverride(key, variant | null)`
|
|
143
|
-
shows one version in this browser, live and never logged; `tracker.experiments.refresh()`
|
|
144
|
-
reloads the definitions and makes mounted experiments decide again.
|
|
145
|
-
|
|
146
|
-
Assignment (§5.2): `n = fnv1a32(String(fnv1a32(key + vid))) % 10000 / 10000`; variant *i* owns
|
|
147
|
-
`[c_i, c_i + traffic × w_i)` where `c_i` is the sum of the weights before it. Raising `traffic`
|
|
148
|
-
never moves an enrolled visitor. Fixed vectors: `__tests__/tracking/hash.test.ts`; if one of them
|
|
149
|
-
changes, every visitor's assignment changes.
|
|
150
|
-
|
|
151
|
-
The experiment itself (key, variants, weights, traffic, targeting, trigger, metrics) is created
|
|
152
|
-
and started through the admin API (§9); until it runs, everybody sees the control.
|
|
153
|
-
|
|
154
|
-
## 6. Events, goals and markup
|
|
155
|
-
|
|
156
|
-
```ts
|
|
157
|
-
const tracker = useTracker(); // null outside the provider: always use ?.
|
|
158
|
-
tracker?.goal('contact-submitted'); // a conversion the server's goals can match
|
|
159
|
-
tracker?.goal('demo-booked', 1); // with a value
|
|
160
|
-
tracker?.custom('plan-picked', { plan: 'pro' }); // a named event with props
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Never put free text a user typed, emails or names in props.
|
|
164
|
-
|
|
165
|
-
**Sections** (visible time, "seen", exit section) and **clicks** are tagged in markup; one
|
|
166
|
-
`IntersectionObserver` and one delegated click listener pick them up:
|
|
167
|
-
|
|
168
|
-
```tsx
|
|
169
|
-
<section data-track-section='pricing'>…</section>
|
|
170
|
-
<ReqoreButton data-track-click='get-started' data-track-placement='hero'>Get started</ReqoreButton>
|
|
171
|
-
// where JSX attributes cannot be written (object-literal props, e.g. panel actions):
|
|
172
|
-
<ReqorePanel actions={[{ ...trackClick('contact', 'pricing-panel'), label: 'Talk to us' }]} />
|
|
173
|
-
<div {...trackSection('pricing')}>…</div>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
- `data-track-click` is what the click means (`get-started`, `contact`, …);
|
|
177
|
-
`data-track-placement` is where (defaults to the enclosing section's id);
|
|
178
|
-
`data-track-label` overrides the label (defaults to the element's text).
|
|
179
|
-
- "Seen" is at least 50 % of the section, or 50 % of the screen covered by it, for at least one
|
|
180
|
-
second in one stretch, with the tab visible. Reports key on section ids: keep them stable.
|
|
181
|
-
|
|
182
|
-
**Sign-up attribution** (§5.4): `tracker.decorateSignupUrl(url)` adds
|
|
183
|
-
`qa_exp=<experiment>:<variant>,…` and the session's first-touch `utm_*` to a sign-up link (with
|
|
184
|
-
consent only, never the `vid`); the server's sign-up flow reads them.
|
|
185
|
-
|
|
186
|
-
## 7. Tests and stories
|
|
187
|
-
|
|
188
|
-
`createMemoryTracker(options)` is a tracker with no browser behind it: memory storage, a clock
|
|
189
|
-
and timers you drive, and a transport that records every batch.
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
import { createMemoryTracker } from '@qoretechnologies/reqraft/dist/tracking';
|
|
193
|
-
|
|
194
|
-
const m = createMemoryTracker({ consent: 'granted', vid: 'visitor-1', experiments: [definition] });
|
|
195
|
-
m.tracker.start();
|
|
196
|
-
await m.advance(5000); // runs due timers: the queue flushes
|
|
197
|
-
m.sent[0].batch.events; // what reached the collector
|
|
198
|
-
m.local.get(m.keys.vid); // storage, under the configured prefix
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
Options: `config` (any config field; `property` defaults to `test`), `consent`, `experiments`
|
|
202
|
-
(a list, a function read on every load, or `'fail'`), `page` (path, search, device, …), `vid`,
|
|
203
|
-
`start` (the clock), `seed` (localStorage before the tracker starts). In a story, pass
|
|
204
|
-
`m.tracker` to `<TrackingProvider>` without `attach`; seed the experiments cache
|
|
205
|
-
(`KEYS.experimentsCache`) so the first render already has the definitions — see
|
|
206
|
-
`src/tracking/ui/ExperimentsOverlay.stories.tsx`.
|
|
207
|
-
|
|
208
|
-
Unit tests: `__tests__/tracking/` (hashing vectors, assignment, consent gating, batching,
|
|
209
|
-
sections, page views, sign-up links, concluded winners, the in-app switch, product config,
|
|
210
|
-
the React bindings, and the layer rules).
|
|
211
|
-
|
|
212
|
-
## 8. The A/B test UI: embed the overlay
|
|
213
|
-
|
|
214
|
-
The same A/B test controls every product shows, built on Reqore, in their own entry so the engine
|
|
215
|
-
stays light:
|
|
216
|
-
|
|
217
|
-
```ts
|
|
218
|
-
import { ExperimentsOverlay, ExperimentCard, useExperimentsAdmin } from '@qoretechnologies/reqraft/dist/tracking/ui';
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
| Export | What |
|
|
222
|
-
|---|---|
|
|
223
|
-
| `<ExperimentsOverlay>` | Finds every `<Experiment>` on the page (its `data-experiment` marker) and draws a dashed outline and an "A/B test · <name>" handle at its corner. Hover, keyboard focus or a click opens the test's card, anchored to the element: it scrolls and resizes with it and flips above or below the handle to stay in view. ✕, Esc and a click outside close it. An ended test shows "Winner live · code clean-up pending" instead. |
|
|
224
|
-
| `<ExperimentCard>` | One test: name, status tag, a "?" help and ✕; the verdict; one row per version, best first (conversion on the primary metric, then visitors; re-sorted only when new data arrives), the best one tagged "Leading", or "Winner" for a likely winner or an ended test's winner (a success-coloured glow and wash on its row, stronger for a winner; static, nothing animates), the original tagged "Original". Tags use Reqore's `appearance="soft"` (reqore 0.77.2+); a long title stays on one line with an ellipsis. A row shows visitors, conversion, chance to beat the original and a bar; the shown version has an info-coloured ring and wash (`aria-current`; the row itself takes no intent, so its actions stay neutral); the whole row shows that version (Enter / Space too). Row actions: a neutral, minimal "Show analytics" for that version (`versionDetailsUrl`), minimal Accept, and a bin icon (Remove) at the far end. Footer: the optional "Open in …" link (hidden while the test is not set up; just its icon in a card narrower than 400 px) and Start / Resume (solid), Pause, Stop. Past three and a half rows the list scrolls inside the card. Every action asks first (Reqore's confirm dialog) and notifies what happened. |
|
|
225
|
-
| `useExperimentsAdmin(options)` | Optional: the list and the actions from the qorus-api routes. |
|
|
226
|
-
| `createExperimentsAdminClient(options)` | The same without React. |
|
|
227
|
-
| `placeCard`, `cardReducer`, `versionRows`, `verdictLine`, `versionsMaxHeight`, … | The plain logic behind them, for tests and custom UIs. |
|
|
228
|
-
|
|
229
|
-
Both components are driven by props only: the data is the qorus-api editor / admin list (an array of
|
|
230
|
-
`{ experiment, results }`: the admin experiment object with `status`, `variants`, `phase`,
|
|
231
|
-
`phases`, `history`, `winner`, and the results object with `verdict_text` and the per-metric
|
|
232
|
-
numbers), and every action is a callback that may return a promise (the button shows busy until it
|
|
233
|
-
settles, and a rejection's message is shown). An action whose callback is not given does not
|
|
234
|
-
appear. Neither makes a request of its own.
|
|
235
|
-
|
|
236
|
-
```tsx
|
|
237
|
-
import { ExperimentsOverlay, useExperimentsAdmin } from '@qoretechnologies/reqraft/dist/tracking/ui';
|
|
238
|
-
|
|
239
|
-
const AbTestsLayer = ({ visible }: { visible: boolean }) => {
|
|
240
|
-
const admin = useExperimentsAdmin({
|
|
241
|
-
listUrl: '/qorus-cloud/editor/experiments?property=ide', // actions go to …/experiments/<key>/<action>
|
|
242
|
-
headers: { Authorization: `Bearer ${editorToken}` }, // or leave it to a proxy
|
|
243
|
-
enabled: visible,
|
|
244
|
-
});
|
|
245
|
-
return (
|
|
246
|
-
<ExperimentsOverlay
|
|
247
|
-
visible={visible} // the product's "hide editor elements"
|
|
248
|
-
tests={admin.tests}
|
|
249
|
-
loadError={admin.error}
|
|
250
|
-
onAccept={admin.accept}
|
|
251
|
-
onRemove={admin.remove}
|
|
252
|
-
onStart={admin.start}
|
|
253
|
-
onPause={admin.pause}
|
|
254
|
-
onStop={admin.stop}
|
|
255
|
-
detailsUrl={(key) => `${ADMIN_PORTAL}/analytics?dashboard=tracking&experiment=${key}`}
|
|
256
|
-
actorLabels={{ 'ide-editor': 'in the IDE' }}
|
|
257
|
-
topInset={() => document.querySelector('header')?.getBoundingClientRect().bottom ?? 0}
|
|
258
|
-
/>
|
|
259
|
-
);
|
|
260
|
-
};
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
- Mount it inside `<TrackingProvider>`: then clicking a version's row uses the tracker's in-app
|
|
264
|
-
switch (`tracker.experiments.setEditorOverride`, this browser only, never logged), and after
|
|
265
|
-
an action the page shows what visitors see now (the switch is cleared and the tracker reloads
|
|
266
|
-
the definitions). Pass `onShow` / `onSettled` to do something else.
|
|
267
|
-
- `versionDetailsUrl={(key, variant) => \`${ADMIN_PORTAL}/analytics?dashboard=tracking&experiment=${key}&variant=${variant}\`}`
|
|
268
|
-
adds the per-version "Show analytics" action (the admin portal opens the test with that version
|
|
269
|
-
expanded); without it the action is hidden. `detailsUrl` stays for the whole test.
|
|
270
|
-
- The "?" opens a dialog explaining the test for a marketer: every button, how visitors are split
|
|
271
|
-
and counted, reading the verdict and the chance to beat, the too-early rule (the test's
|
|
272
|
-
`min_sample`, 200 visitors per version and 7 days by default), a test that is not set up, and
|
|
273
|
-
where the full analytics are (`analyticsLabel`).
|
|
274
|
-
- A test that is in the page's code (`<Experiment>`) but not registered in the analytics service
|
|
275
|
-
yet shows "Not set up" and asks to have it set up (`notSetUpText` changes the words); when the list
|
|
276
|
-
cannot be loaded (`loadError`) it shows "No connection" instead.
|
|
277
|
-
- `exclude` (a selector) skips markers inside the product's own UI (e.g. its preview frames);
|
|
278
|
-
markers inside the overlay itself are always skipped.
|
|
279
|
-
- The same overlay works inside a phone-preview iframe: mount it in the frame's page too. The
|
|
280
|
-
switch is shared through `localStorage`, so both follow it.
|
|
281
|
-
- `useExperimentsAdmin` reloads the list every minute (`refreshMs`) and after every action; its
|
|
282
|
-
errors explain a 401 / 403 as a missing or wrong key. `actionUrl` and `createUrl` change the
|
|
283
|
-
routes; `fetch` replaces the transport.
|
|
284
|
-
- The card on its own: `<ExperimentCard experimentKey="signup-cta" test={entry} shown="a" codeVariants={['a', 'b']} onShow={…} onAccept={…} … />`.
|
|
285
|
-
|
|
286
|
-
Stories: `Tracking/Experiment Card` (draft, running with two and five versions, paused, concluded,
|
|
287
|
-
no data yet, not set up, no connection, the confirm step on Remove, the help) and
|
|
288
|
-
`Tracking/Experiments Overlay` (anchored, flipped above near the bottom, hidden), each in dark,
|
|
289
|
-
light and phone. The visually empty ones (hidden, the phone flip) run as tests without a Qlip
|
|
290
|
-
snapshot (`parameters.qlip.skip`).
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
# An offered value that cannot be picked
|
|
2
|
-
|
|
3
|
-
**As-built.**
|
|
4
|
-
`src/components/form/engine/OptionFieldMessages.tsx` —
|
|
5
|
-
`getAllowedValueAvailability`, `useAllowedValueAvailability`,
|
|
6
|
-
`ALLOWED_VALUE_AVAILABLE`;
|
|
7
|
-
`src/helpers/options.ts` — `getRefusalMessage`,
|
|
8
|
-
`UNAVAILABLE_VALUE_FALLBACK_REASON`;
|
|
9
|
-
`src/components/form/fields/select/SelectCollection.tsx` —
|
|
10
|
-
`getSelectItemUnavailability`, `UNAVAILABLE_ITEM_CLASS`,
|
|
11
|
-
`getSelectItemTitleActions`;
|
|
12
|
-
`src/helpers/validations.ts` — `parseDependency`, `isDependencyFulfilled`.
|
|
13
|
-
|
|
14
|
-
## The rule
|
|
15
|
-
|
|
16
|
-
A value that is offered and cannot be picked is **disabled and says why**. It
|
|
17
|
-
is never hidden, and it is never silently inert.
|
|
18
|
-
|
|
19
|
-
Hiding it is worse than either: a choice that vanishes takes its own
|
|
20
|
-
explanation with it, and leaves the reader looking for something they were
|
|
21
|
-
told exists.
|
|
22
|
-
|
|
23
|
-
The rule already existed one level up, on whole FIELDS — a field whose
|
|
24
|
-
`depends_on` is unmet renders locked with the dependency named. A VALUE had no
|
|
25
|
-
such grammar: a picker could mark a choice `disabled`, and the result was a row
|
|
26
|
-
that ignored clicks and explained nothing.
|
|
27
|
-
|
|
28
|
-
## The two sources, and why they render identically
|
|
29
|
-
|
|
30
|
-
Two things can refuse a value:
|
|
31
|
-
|
|
32
|
-
- **the predicate** — the value's own `depends_on`, judged against the form it
|
|
33
|
-
is standing in. Whatever the form itself can decide.
|
|
34
|
-
- **the pre-resolved refusal** — `disabled: true` with `messages`, from whoever
|
|
35
|
-
already knows: the server, for a sandbox or permission context, a capability
|
|
36
|
-
of the selected kind, or a requirement in a scope `depends_on` deliberately
|
|
37
|
-
cannot reach.
|
|
38
|
-
|
|
39
|
-
They render identically, because a reader has no way to tell them apart and no
|
|
40
|
-
reason to care. The predicate is checked first when both could speak: it names
|
|
41
|
-
a field in this very form, so the reader can act on it without leaving the row,
|
|
42
|
-
while a served reason is a statement about somewhere else.
|
|
43
|
-
|
|
44
|
-
`getAllowedValueAvailability` is the one place that decides, and
|
|
45
|
-
`getRefusalMessage` is the one place that decides WHICH of a value's messages
|
|
46
|
-
is the reason — `danger`, then `warning`, then the first. Without that, the
|
|
47
|
-
picker and the form's own resolver could word the same refusal differently.
|
|
48
|
-
|
|
49
|
-
A refusal with no message at all still says something
|
|
50
|
-
(`UNAVAILABLE_VALUE_FALLBACK_REASON`, "This value is not available"). Silence
|
|
51
|
-
over a value that will not respond is the defect this exists to remove.
|
|
52
|
-
|
|
53
|
-
### Never reqore's `disabled`
|
|
54
|
-
|
|
55
|
-
A refused VALUE is never handed to reqore's `disabled`. That applies
|
|
56
|
-
`DisabledElement`, which is `pointer-events: none` — and it takes the row's
|
|
57
|
-
tooltip and any control in its title bar with it, which are the two places the
|
|
58
|
-
reason can be read. What makes a row inert is **having no handler**: reqore
|
|
59
|
-
derives `interactive` from the handlers a panel or a button was given, so a row
|
|
60
|
-
with none gets no pointer cursor and no hover lift while keeping every pointer
|
|
61
|
-
event it had.
|
|
62
|
-
|
|
63
|
-
The FIELD's own `disabled` still goes through reqore. A field nobody may edit
|
|
64
|
-
has no explanation to protect.
|
|
65
|
-
|
|
66
|
-
The dimming lands on the **title**, never on the row: `opacity` creates a
|
|
67
|
-
stacking context, so dimming the row would dim the reason inside it.
|
|
68
|
-
|
|
69
|
-
## The `!name` grammar
|
|
70
|
-
|
|
71
|
-
`depends_on` on a value is the same grammar, the same parser and the same
|
|
72
|
-
evaluator a FIELD's `depends_on` uses, one level down. Top-level entries are an
|
|
73
|
-
AND; a nested array is an OR of its own entries. Four entry forms:
|
|
74
|
-
|
|
75
|
-
| Entry | Holds when |
|
|
76
|
-
| ------------- | ----------------------------------------------- |
|
|
77
|
-
| `name` | the sibling has a value |
|
|
78
|
-
| `!name` | the sibling has **no** value |
|
|
79
|
-
| `name=value` | the sibling holds exactly that value |
|
|
80
|
-
| `name!=value` | the sibling is answered, and not with that value |
|
|
81
|
-
|
|
82
|
-
`!name` is the form `name!=value` cannot make. "Not X" is a statement about an
|
|
83
|
-
answer, so `!=` requires the sibling to be answered; two options that exclude
|
|
84
|
-
one another each apply only while the OTHER has not been answered at all.
|
|
85
|
-
`!` binds to the whole entry, so `!name` never carries a value, and `!=` is
|
|
86
|
-
parsed first — which is what keeps `name!=value` from being read as a leading
|
|
87
|
-
`!`.
|
|
88
|
-
|
|
89
|
-
An absent sibling satisfies `!name`, exactly as it fails the bare form: neither
|
|
90
|
-
has an answer to judge, and a mutual exclusion that locked both halves until
|
|
91
|
-
one of them was materialised would offer the author no way in.
|
|
92
|
-
|
|
93
|
-
`!name` also gets a sentence of its own when it is named to the reader
|
|
94
|
-
(`"Session Cookie Name" must have no value`). Run through the comparison
|
|
95
|
-
template it would have read `must not be "undefined"`.
|
|
96
|
-
|
|
97
|
-
## Which paths are converted
|
|
98
|
-
|
|
99
|
-
Every single-value picker reqraft draws carries the full shape — **no reqore
|
|
100
|
-
`disabled`, no handler, the reason printed in the row and readable on hover,
|
|
101
|
-
the name dimmed, a padlock**:
|
|
102
|
-
|
|
103
|
-
| Path | Refused by | Notes |
|
|
104
|
-
| ----------------------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------- |
|
|
105
|
-
| `SelectFieldCollection` (the dialog picker) | no row handler | reason ABOVE the description, padlock title action, tooltip, and folded into `searchString` so the reason is searchable |
|
|
106
|
-
| `SelectFormField` → `reqoreItems` (anchored dropdown) | no row handler | reason leads the description; `effect` dims |
|
|
107
|
-
| `SelectFormField` → `asMenu` | no row handler | `readOnly` for the cursor, `effect` dims |
|
|
108
|
-
| `SelectFormField` → `creatableItems` (`ReqoreSelect`) | `handleCreatableChange` | reqore owns this list's selection — see below |
|
|
109
|
-
| `FieldAllowedValuesCheckGroup` (≤3 values) | no row handler | `labelEffect` + `readOnly`; the reason is the checkbox `description` |
|
|
110
|
-
| `FormField`'s own ≤3 checkbox group | no row handler | same |
|
|
111
|
-
| `MultiSelectFormField` | `onValueChange` | reqore owns this list's selection — see below |
|
|
112
|
-
|
|
113
|
-
On a checkbox the reason is IN the row rather than only on its hover: a
|
|
114
|
-
checkbox has no body to bury it in, and a hover is the one affordance a touch
|
|
115
|
-
screen and a keyboard never reach. The dimming there is `labelEffect`, not
|
|
116
|
-
`effect` — a non-switch `ReqoreCheckbox` destructures `effect` out and never
|
|
117
|
-
applies it, so a row that asked for `effect` got the padlock, the cursor and
|
|
118
|
-
**no dimming at all**. `labelEffect` reaches the label's `ReqoreTextEffect`,
|
|
119
|
-
which is also the right thing to dim, since the `description` beside it carries
|
|
120
|
-
the reason.
|
|
121
|
-
|
|
122
|
-
### Where the refusal is not on the row
|
|
123
|
-
|
|
124
|
-
`ReqoreSelect` and `ReqoreMultiSelect` own their own selection: their rows take
|
|
125
|
-
no per-item handler this code could withhold. Against the reqore we pin
|
|
126
|
-
(`^0.74.1`) the only per-row prop that refuses is `disabled`, which is the one
|
|
127
|
-
prop the rule forbids — so for those two the row is *marked* (reason,
|
|
128
|
-
tooltip, padlock, dimming, `readOnly` cursor) and the refusal lands in the one
|
|
129
|
-
handler this code does own:
|
|
130
|
-
|
|
131
|
-
- `handleCreatableChange` drops an offered value that is unavailable. A
|
|
132
|
-
creatable field can reach the same value by typing its text, which is the
|
|
133
|
-
same value by another route and is refused as one. Clearing (`undefined`) is
|
|
134
|
-
the author's own act and is never refused.
|
|
135
|
-
- `MultiSelectFormField`'s `onValueChange` drops a newly added refused value
|
|
136
|
-
and **keeps** any value the selection already held (see "A value that becomes
|
|
137
|
-
unavailable", below).
|
|
138
|
-
|
|
139
|
-
reqore 0.76.0 makes a `readOnly` dropdown / select item unchoosable by click
|
|
140
|
-
and by keyboard. When reqraft's pin moves to it, those rows refuse themselves
|
|
141
|
-
and the two handler guards become a second lock on the same door.
|
|
142
|
-
|
|
143
|
-
## What is deliberately NOT converted
|
|
144
|
-
|
|
145
|
-
- **The `*` wildcard in `MultiSelectFormField`** still uses reqore's
|
|
146
|
-
`disabled` for the other items while `*` is selected. That is a state of the
|
|
147
|
-
SELECTION, not a refusal of the value, and it has no reason of its own to
|
|
148
|
-
protect.
|
|
149
|
-
- **`MultiSelectFormField` does not judge `depends_on` on a value.** It is
|
|
150
|
-
handed the raw `allowed_values` rather than the mapped items the single-value
|
|
151
|
-
pickers build, so only a server-resolved refusal (`disabled` + `messages`)
|
|
152
|
-
reaches it. Closing this means calling `useAllowedValueAvailability` inside
|
|
153
|
-
that component; it is a behaviour extension rather than a fix, and it is not
|
|
154
|
-
in this change.
|
|
155
|
-
- **Keyboard navigation still stops on a refused dropdown row.** reqore 0.74.1
|
|
156
|
-
excludes `disabled` rows from a dropdown's arrow-key walk, and it has no
|
|
157
|
-
notion of a row that merely carries no handler. So the arrows land on a
|
|
158
|
-
refused row and Enter silently does nothing. The row is fully readable there,
|
|
159
|
-
which is the point, but the keyboard gives no other signal. reqore 0.76.0
|
|
160
|
-
excludes a `readOnly` row from the same walk, so this closes when the pin
|
|
161
|
-
moves.
|
|
162
|
-
- **The resolver and the hook are not exported.**
|
|
163
|
-
`getAllowedValueAvailability`, `useAllowedValueAvailability`,
|
|
164
|
-
`UNAVAILABLE_VALUE_FALLBACK_REASON` and `getRefusalMessage` are not in
|
|
165
|
-
`src/index.tsx` or `src/components/form/index.tsx`, so a host cannot reach
|
|
166
|
-
any of them today. Only `getSelectItemUnavailability` and
|
|
167
|
-
`UNAVAILABLE_ITEM_CLASS` are public, through the `SelectCollection` barrel
|
|
168
|
-
entry. A host that wants to resolve availability itself needs the exports
|
|
169
|
-
added — this is a deliberate hold, not an oversight: the shape of
|
|
170
|
-
`IAllowedValueAvailabilityInput` is provisional until ts-toolkit publishes
|
|
171
|
-
`depends_on` on `IQorusAllowedValue` and `IReqraftAllowedValue` collapses
|
|
172
|
-
into it.
|
|
173
|
-
|
|
174
|
-
## Two behaviour changes worth knowing about
|
|
175
|
-
|
|
176
|
-
### A bare `disabled` item with no message
|
|
177
|
-
|
|
178
|
-
`getSelectItemUnavailability` treats ANY `disabled` item as a refusal, and
|
|
179
|
-
gives it the fallback reason when it carries no message. A caller who marked an
|
|
180
|
-
item `disabled` purely to grey it out now gets a row that is dimmed, padlocked,
|
|
181
|
-
carries the words "This value is not available", and — in the collection and
|
|
182
|
-
dropdown paths — keeps its pointer events instead of being `pointer-events:
|
|
183
|
-
none`. That is the intended treatment: a value that will not respond and says
|
|
184
|
-
nothing is exactly the defect this mechanism removes. A caller who wants the
|
|
185
|
-
old deadening on an offered value has no way to ask for it.
|
|
186
|
-
|
|
187
|
-
### `metadata` woke a dead branch
|
|
188
|
-
|
|
189
|
-
`mapAllowedValue` used to be an eleven-key whitelist, and `metadata` was not
|
|
190
|
-
one of the keys. `SelectFormField`'s `hasItemsWithWarning` / `hasWarning`
|
|
191
|
-
(`Select.tsx`, ≈L243 and ≈L256) read `item.metadata?.needs_auth` and colour the
|
|
192
|
-
control and its item-count badge `warning` — a branch that could never fire for
|
|
193
|
-
items built by `mapAllowedValue`. Forwarding `metadata` activated it: a field
|
|
194
|
-
offering a connection that needs authentication now shows a warning intent
|
|
195
|
-
where it previously showed none. This is the branch doing what it was written
|
|
196
|
-
to do, but it is a visible change, and it arrived as a side effect of widening
|
|
197
|
-
the whitelist rather than as its own decision.
|
|
198
|
-
|
|
199
|
-
## A value that becomes unavailable while it is selected
|
|
200
|
-
|
|
201
|
-
**Deliberately left alone.** An already-selected value that later becomes
|
|
202
|
-
unavailable is neither cleared nor flagged as an error: the picker refuses it,
|
|
203
|
-
and the form goes on holding it and reporting it valid.
|
|
204
|
-
|
|
205
|
-
Clearing it would destroy an answer the author gave, on an edit to a *sibling*
|
|
206
|
-
field — which is a far worse failure than holding a value the form can no
|
|
207
|
-
longer offer. The author can still see the value, and still change or remove it
|
|
208
|
-
themselves; in the multi-select they can still remove its chip. The refusal
|
|
209
|
-
only ever prevents a NEW selection, which is why
|
|
210
|
-
`MultiSelectFormField.onValueChange` compares against the values it already
|
|
211
|
-
holds rather than filtering the refused list wholesale.
|
|
212
|
-
|
|
213
|
-
Two consequences to know:
|
|
214
|
-
|
|
215
|
-
- Validation does not object. `validateField` has no general notion of an
|
|
216
|
-
allowed value being unavailable. The one exception is a `connection`-typed
|
|
217
|
-
field, which has always rejected a value whose allowed-value entry carries
|
|
218
|
-
`disabled` or `metadata.needs_auth` — and that check reads the SCHEMA's own
|
|
219
|
-
`disabled`, so a value refused only by its `depends_on` still validates.
|
|
220
|
-
- In the creatable and multi-select pickers the selected chip is built by
|
|
221
|
-
spreading the item, so a held value that is now refused shows dimmed and
|
|
222
|
-
padlocked. That is the only place the state is visible on the value itself.
|
|
223
|
-
|
|
224
|
-
If a held-but-refused value should ever become an error, it belongs in
|
|
225
|
-
`validateField` beside the `connection` case, and it needs the resolved
|
|
226
|
-
availability — not the schema's `disabled` — to be correct.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import { IReqoreTheme } from '@qoretechnologies/reqore/dist/constants/theme';
|
|
3
|
-
/**
|
|
4
|
-
* How a form looks. The look only: which fields exist, how they bucket, what a
|
|
5
|
-
* click does and what is validated are identical in every appearance.
|
|
6
|
-
*
|
|
7
|
-
* - `'calm'` (the default) — colour only where something needs a person. The
|
|
8
|
-
* status boxes are plain panels on the theme's panel surface with label/value
|
|
9
|
-
* rows split by hairlines; labels are grey; a missing required value is an
|
|
10
|
-
* amber word instead of a red asterisk and message; counts are quiet numbers;
|
|
11
|
-
* a healthy row carries no dot; Yes/No are plain words; nothing is forced
|
|
12
|
-
* into uppercase.
|
|
13
|
-
* - `'classic'` — the earlier read-first look, for a host that asks for it:
|
|
14
|
-
* tinted status boxes, an intent-coloured completion meter, a status dot on
|
|
15
|
-
* every row.
|
|
16
|
-
*/
|
|
17
|
-
export type TFormEngineAppearance = 'calm' | 'classic';
|
|
18
|
-
/**
|
|
19
|
-
* The appearance in force for everything below it: the engine's own rows and
|
|
20
|
-
* toolbar, every field editor it mounts, and every nested (`arg_schema`)
|
|
21
|
-
* sub-form, which inherits it unless it is given one of its own.
|
|
22
|
-
*
|
|
23
|
-
* `FormEngine` provides it from its `appearance` prop. A host may also wrap
|
|
24
|
-
* its whole tree in it, to set the appearance once for every form — and for
|
|
25
|
-
* the field components it renders outside a form.
|
|
26
|
-
*/
|
|
27
|
-
export declare const FormAppearanceContext: import("react").Context<TFormEngineAppearance>;
|
|
28
|
-
export declare const FormAppearanceProvider: import("react").Provider<TFormEngineAppearance>;
|
|
29
|
-
/** The appearance in force here; `'calm'` when nothing set one. */
|
|
30
|
-
export declare const useFormAppearance: () => TFormEngineAppearance;
|
|
31
|
-
/** Shorthand for the one question most call sites ask. */
|
|
32
|
-
export declare const useIsCalmForm: () => boolean;
|
|
33
|
-
/**
|
|
34
|
-
* The surface a calm section paints, matching the one Reqore gives a panel:
|
|
35
|
-
* `theme.panel.main` when the theme declares one, else the panel shade Reqore
|
|
36
|
-
* derives from `main`. Read here rather than through Reqore's own helper so the
|
|
37
|
-
* whole peer range keeps working — the helper arrived after the floor.
|
|
38
|
-
*/
|
|
39
|
-
export declare const getCalmPanelSurface: (theme: IReqoreTheme) => string;
|
|
40
|
-
/** The neutral 1px edge of a calm section, and of every row inside it. */
|
|
41
|
-
export declare const getCalmPanelHairline: (theme: IReqoreTheme) => string;
|
|
42
|
-
/**
|
|
43
|
-
* What a calm form writes in place of an empty required value. Editable: what
|
|
44
|
-
* to do about it. Read-only: only what is the case, because the reader cannot
|
|
45
|
-
* add anything.
|
|
46
|
-
*/
|
|
47
|
-
export declare const CALM_REQUIRED_LABEL = "Required \u00B7 add a value";
|
|
48
|
-
export declare const CALM_REQUIRED_READ_LABEL = "Required \u00B7 not set";
|
|
49
|
-
//# sourceMappingURL=formAppearance.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formAppearance.d.ts","sourceRoot":"","sources":["../../../../src/components/form/engine/formAppearance.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAQ7E;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvD;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,gDAA8D,CAAC;AAEjG,eAAO,MAAM,sBAAsB,iDAAiC,CAAC;AAErE,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,QAAO,qBACQ,CAAC;AAE9C,0DAA0D;AAC1D,eAAO,MAAM,aAAa,QAAO,OAAyC,CAAC;AAiB3E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,UAAW,YAAY,KAAG,MACmC,CAAC;AAE9F,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,UAAW,YAAY,KAAG,MACqC,CAAC;AAEjG;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,gCAA2B,CAAC;AAC5D,eAAO,MAAM,wBAAwB,4BAAuB,CAAC"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CALM_REQUIRED_READ_LABEL = exports.CALM_REQUIRED_LABEL = exports.getCalmPanelHairline = exports.getCalmPanelSurface = exports.useIsCalmForm = exports.useFormAppearance = exports.FormAppearanceProvider = exports.FormAppearanceContext = void 0;
|
|
4
|
-
var colors_1 = require("@qoretechnologies/reqore/dist/helpers/colors");
|
|
5
|
-
var react_1 = require("react");
|
|
6
|
-
/**
|
|
7
|
-
* The appearance in force for everything below it: the engine's own rows and
|
|
8
|
-
* toolbar, every field editor it mounts, and every nested (`arg_schema`)
|
|
9
|
-
* sub-form, which inherits it unless it is given one of its own.
|
|
10
|
-
*
|
|
11
|
-
* `FormEngine` provides it from its `appearance` prop. A host may also wrap
|
|
12
|
-
* its whole tree in it, to set the appearance once for every form — and for
|
|
13
|
-
* the field components it renders outside a form.
|
|
14
|
-
*/
|
|
15
|
-
exports.FormAppearanceContext = (0, react_1.createContext)(undefined);
|
|
16
|
-
exports.FormAppearanceProvider = exports.FormAppearanceContext.Provider;
|
|
17
|
-
/** The appearance in force here; `'calm'` when nothing set one. */
|
|
18
|
-
var useFormAppearance = function () { var _a; return (_a = (0, react_1.useContext)(exports.FormAppearanceContext)) !== null && _a !== void 0 ? _a : 'calm'; };
|
|
19
|
-
exports.useFormAppearance = useFormAppearance;
|
|
20
|
-
/** Shorthand for the one question most call sites ask. */
|
|
21
|
-
var useIsCalmForm = function () { return (0, exports.useFormAppearance)() === 'calm'; };
|
|
22
|
-
exports.useIsCalmForm = useIsCalmForm;
|
|
23
|
-
/** The theme's own panel surface, when it declares one (Reqore >= 0.78.6). */
|
|
24
|
-
var getDeclaredPanelSurface = function (theme) {
|
|
25
|
-
var themed = theme;
|
|
26
|
-
// Same rule as Reqore's `getThemePanelSurface`: a component whose `main` was
|
|
27
|
-
// moved off the original (a custom theme, an intent) keeps deriving its own.
|
|
28
|
-
return themed.panel && (!themed.originalMain || themed.main === themed.originalMain) ?
|
|
29
|
-
themed.panel
|
|
30
|
-
: undefined;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* The surface a calm section paints, matching the one Reqore gives a panel:
|
|
34
|
-
* `theme.panel.main` when the theme declares one, else the panel shade Reqore
|
|
35
|
-
* derives from `main`. Read here rather than through Reqore's own helper so the
|
|
36
|
-
* whole peer range keeps working — the helper arrived after the floor.
|
|
37
|
-
*/
|
|
38
|
-
var getCalmPanelSurface = function (theme) { var _a, _b; return (_b = (_a = getDeclaredPanelSurface(theme)) === null || _a === void 0 ? void 0 : _a.main) !== null && _b !== void 0 ? _b : (0, colors_1.changeDarkness)((0, colors_1.getMainBackgroundColor)(theme), 0.03); };
|
|
39
|
-
exports.getCalmPanelSurface = getCalmPanelSurface;
|
|
40
|
-
/** The neutral 1px edge of a calm section, and of every row inside it. */
|
|
41
|
-
var getCalmPanelHairline = function (theme) { var _a, _b; return (_b = (_a = getDeclaredPanelSurface(theme)) === null || _a === void 0 ? void 0 : _a.border) !== null && _b !== void 0 ? _b : (0, colors_1.changeLightness)((0, colors_1.getMainBackgroundColor)(theme), 0.08); };
|
|
42
|
-
exports.getCalmPanelHairline = getCalmPanelHairline;
|
|
43
|
-
/**
|
|
44
|
-
* What a calm form writes in place of an empty required value. Editable: what
|
|
45
|
-
* to do about it. Read-only: only what is the case, because the reader cannot
|
|
46
|
-
* add anything.
|
|
47
|
-
*/
|
|
48
|
-
exports.CALM_REQUIRED_LABEL = 'Required · add a value';
|
|
49
|
-
exports.CALM_REQUIRED_READ_LABEL = 'Required · not set';
|
|
50
|
-
//# sourceMappingURL=formAppearance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formAppearance.js","sourceRoot":"","sources":["../../../../src/components/form/engine/formAppearance.ts"],"names":[],"mappings":";;;AACA,uEAIsD;AACtD,+BAAkD;AAkBlD;;;;;;;;GAQG;AACU,QAAA,qBAAqB,GAAG,IAAA,qBAAa,EAAoC,SAAS,CAAC,CAAC;AAEpF,QAAA,sBAAsB,GAAG,6BAAqB,CAAC,QAAQ,CAAC;AAErE,mEAAmE;AAC5D,IAAM,iBAAiB,GAAG,sBAC/B,OAAA,MAAA,IAAA,kBAAU,EAAC,6BAAqB,CAAC,mCAAI,MAAM,CAAA,EAAA,CAAC;AADjC,QAAA,iBAAiB,qBACgB;AAE9C,0DAA0D;AACnD,IAAM,aAAa,GAAG,cAAe,OAAA,IAAA,yBAAiB,GAAE,KAAK,MAAM,EAA9B,CAA8B,CAAC;AAA9D,QAAA,aAAa,iBAAiD;AAE3E,8EAA8E;AAC9E,IAAM,uBAAuB,GAAG,UAC9B,KAAmB;IAEnB,IAAM,MAAM,GAAG,KAGd,CAAC;IACF,6EAA6E;IAC7E,6EAA6E;IAC7E,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;GAKG;AACI,IAAM,mBAAmB,GAAG,UAAC,KAAmB,gBACrD,OAAA,MAAA,MAAA,uBAAuB,CAAC,KAAK,CAAC,0CAAE,IAAI,mCAAI,IAAA,uBAAc,EAAC,IAAA,+BAAsB,EAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA,EAAA,CAAC;AADjF,QAAA,mBAAmB,uBAC8D;AAE9F,0EAA0E;AACnE,IAAM,oBAAoB,GAAG,UAAC,KAAmB,gBACtD,OAAA,MAAA,MAAA,uBAAuB,CAAC,KAAK,CAAC,0CAAE,MAAM,mCAAI,IAAA,wBAAe,EAAC,IAAA,+BAAsB,EAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA,EAAA,CAAC;AADpF,QAAA,oBAAoB,wBACgE;AAEjG;;;;GAIG;AACU,QAAA,mBAAmB,GAAG,wBAAwB,CAAC;AAC/C,QAAA,wBAAwB,GAAG,oBAAoB,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
/**
|
|
3
|
-
* The heading over a small group of choices (the checkboxes a field with three
|
|
4
|
-
* or fewer allowed values renders) — the field's own name, or "Select one:"
|
|
5
|
-
* when it has none.
|
|
6
|
-
*
|
|
7
|
-
* One component so both choice editors head their groups the same way, in
|
|
8
|
-
* either appearance: an upper-case micro label by default; in the calm look the
|
|
9
|
-
* words as written, at the small text size, because nothing in a calm form is
|
|
10
|
-
* forced into capitals.
|
|
11
|
-
*/
|
|
12
|
-
export declare const ChoiceGroupHeading: import("react").MemoExoticComponent<({ children }: {
|
|
13
|
-
children: React.ReactNode;
|
|
14
|
-
}) => import("react/jsx-runtime").JSX.Element>;
|
|
15
|
-
/**
|
|
16
|
-
* The intent a picked choice in those groups takes. Blue by default; none in
|
|
17
|
-
* the calm look, where blue says only "a filter is on" and the checked mark
|
|
18
|
-
* already says which choice is picked.
|
|
19
|
-
*/
|
|
20
|
-
export declare const useSelectedChoiceIntent: () => ((selected: boolean) => 'info' | undefined);
|
|
21
|
-
//# sourceMappingURL=ChoiceGroupHeading.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChoiceGroupHeading.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ChoiceGroupHeading.tsx"],"names":[],"mappings":";AAIA;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,qDAAuB;IAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;CAAE,6CAYjF,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAIpF,CAAC"}
|