@splunk/dynamic-editors 0.39.0 → 0.40.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkGraphDynamicColorEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ScreenReaderContent\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/colorConstants\"","webpack://@splunk/dynamic-editors/./src/editors/ColorEditor.jsx","webpack://@splunk/dynamic-editors/./src/editors/RadioBarEditor.jsx","webpack://@splunk/dynamic-editors/./src/editors/SelectEditor.jsx","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/schemaUtils\"","webpack://@splunk/dynamic-editors/./src/utils/EditorFunctions.js","webpack://@splunk/dynamic-editors/./src/utils/token.js","webpack://@splunk/dynamic-editors/./src/editors/CustomizedInSourceEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/DynamicColorEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/NetworkGraphDynamicColorEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/ColorPreview.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/FormatterEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/AddAndReverseStops.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/GradientColor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/GradientPreview.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/GradientTextColor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/GradientValueConfigurer.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/RemoveStop.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Gradient/gradientUtils.ts","webpack://@splunk/dynamic-editors/./src/editors/formatters/GradientEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValue/AddAndReverseMatches.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValue/MatchColor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValue/MatchValueConfigurer.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValue/MatchValueText.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValue/RemoveMatch.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValue/matchValueUtils.ts","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValueEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/MatchValuePreview.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Palettes/PalettesConfigurer.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Palettes/PalettesDropdown.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Palettes/PresetPaletteTheme.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/Palettes/paletteUtils.ts","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValue/AddAndReverseRanges.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValue/RangeBoundary.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValue/RangeColor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValue/RangeValueConfigurer.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValue/RemoveRange.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValue/rangeValueUtils.ts","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValueEditor.tsx","webpack://@splunk/dynamic-editors/./src/editors/formatters/RangeValuePreview.tsx","webpack://@splunk/dynamic-editors/./src/interfaces/BaseEditorProps.ts","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/ArrowLayer.tsx","webpack://@splunk/dynamic-editors/./src/shared/CustomizedInSourceMessage.tsx","webpack://@splunk/dynamic-editors/./src/shared/PreviewWrapper.tsx","webpack://@splunk/dynamic-editors/./src/shared/dimensionConstants.ts","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/extends\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/ArrowDown\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/ArrowUp\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/ArrowsRectangularDouble\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/Cross\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Color\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ColumnLayout\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Dropdown\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Menu\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Message\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Number\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Popover\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/RadioBar\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Select\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Text\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes/variables\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/id\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-color-palettes/editors/PresetPalettes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-encoding/utils/dsl\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/colorUtils\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/style\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/webpack/startup"],"sourcesContent":["const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/react-ui/ScreenReaderContent\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualizations-shared/colorConstants\");","import React, { useEffect, useCallback, useState, useMemo } from 'react';\nimport T from 'prop-types';\nimport styled from 'styled-components';\nimport { debounce, noop, toLower } from 'lodash';\nimport { variables } from '@splunk/themes';\nimport Color from '@splunk/react-ui/Color';\nimport Text from '@splunk/react-ui/Text';\nimport { createDOMID } from '@splunk/ui-utils/id';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport ScreenReaderContent from '@splunk/react-ui/ScreenReaderContent';\nimport { COLOR_EDITOR_PALETTE } from '@splunk/visualizations-shared/colorConstants';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst TextContainer = styled.div`\n max-height: ${variables.inputHeight};\n width: 100%;\n min-width: 0;\n`;\n\n// hardcoded style to sync with SUI color picker's hardcoded dimensions\n// TODO(fkurniawan): see if we can leverage prisma's consolidated textInput out of the box instead of our own component\n// right now, we're using hideInput\nconst StyledText = styled(Text)`\n max-height: ${variables.inputHeight};\n`;\n\n/**\n * Trims the color input and returns the result, or default color if the default color is valid, or previous color\n * @param {String} color The color the user entered\n * @param {String} defaultColor The default color of the component\n * @param {String} prevColor The previous color of the component\n * @returns {String}\n */\nconst getColor = ({ color, defaultColor, prevColor }) => {\n const newColor = typeof color === 'string' ? color.trim() : color;\n\n // color === null is `N/A` in color picker\n if (isColor(newColor) || newColor === null) {\n return newColor;\n }\n\n if (isColor(defaultColor)) {\n return defaultColor;\n }\n\n if (isColor(prevColor) || prevColor === null) {\n return prevColor;\n }\n\n return 'transparent';\n};\n\nconst ColorAndTextWrapper = ({\n id,\n showTextInput,\n color,\n palette,\n handleColorChange,\n labelledBy,\n textWidth,\n value,\n name,\n handleTextColorChange,\n handleKeyPress,\n handleBlur,\n isDisabled,\n}) => {\n const textLabelId = useMemo(() => createDOMID('color-code'), []);\n\n return (\n <>\n <div>\n <Color\n key=\"color-editor\"\n append={showTextInput}\n value={getColor({ color })}\n palette={palette}\n onChange={handleColorChange}\n data-test={`color-picker-${name}`}\n disabled={isDisabled}\n hideInput\n labelledBy={labelledBy}\n />\n </div>\n {showTextInput && (\n <TextContainer data-test=\"text-container\" textWidth={textWidth}>\n <ScreenReaderContent id={textLabelId}>{_('Color code input')}</ScreenReaderContent>\n <StyledText\n key={value}\n data-test={name}\n prepend\n value={color === null ? 'N/A' : color}\n onChange={handleTextColorChange}\n onKeyDown={handleKeyPress}\n onBlur={handleBlur}\n disabled={isDisabled}\n // hardcoded style to sync with SUI color picker's hardcoded dimensions\n // TODO(fkurniawan): see if we can leverage prisma's consolidated textInput out of the box\n style={{ height: '32px' }}\n labelledBy={`${labelledBy} ${textLabelId}`}\n inputId={id}\n />\n </TextContainer>\n )}\n </>\n );\n};\n\nColorAndTextWrapper.propTypes = {\n id: T.string,\n showTextInput: T.bool,\n color: T.string,\n palette: T.arrayOf(T.string),\n handleColorChange: T.func,\n labelledBy: T.string,\n textWidth: T.oneOfType([T.string, T.number]),\n value: T.string,\n name: T.string.isRequired,\n handleTextColorChange: T.func,\n handleKeyPress: T.func,\n handleBlur: T.func,\n isDisabled: T.bool,\n};\n\nconst defaultItemSchema = { default: 'transparent' };\nconst emptyStyle = {};\n\n// The propTypes typing for TS callers isn't working for the onChange callback\n/**\n * @param {Object} props\n * @param {(e: import('react').SyntheticEvent, name: string, value: string) => void} [props.onChange]\n * @returns\n */\nconst ColorEditor = ({\n name = 'color',\n value = 'transparent',\n label = '',\n labelPosition = 'top',\n labelWidth,\n palette = COLOR_EDITOR_PALETTE,\n onChange = noop,\n itemSchema = defaultItemSchema,\n isDisabled = false,\n textWidth = 'auto',\n hideLabel = false,\n showTextInput = true,\n style: customEditorStyle = emptyStyle,\n}) => {\n const [color, setColor] = useState(value);\n\n useEffect(() => {\n setColor(value);\n }, [value]);\n\n const debouncedOnChange = useMemo(() => debounce(onChange, 250), [onChange]);\n\n const handleColorChange = useCallback(\n ({ value: val }) => {\n const newColor = getColor({ color: val, defaultColor: itemSchema.default, prevColor: value });\n setColor(newColor);\n if (value !== newColor) {\n // No event to pass back, so it is null\n debouncedOnChange(null, name, newColor);\n }\n },\n [debouncedOnChange, itemSchema.default, name, value]\n );\n\n const handleTextColorChange = useCallback((_event, { value: val }) => {\n const colorToValue = toLower(val).trim() === 'n/a' ? null : val;\n setColor(colorToValue);\n }, []);\n\n const handleKeyPress = useCallback(\n event => {\n if (event.key === 'Escape') {\n setColor(value);\n return;\n }\n if (event.key !== 'Enter') {\n return;\n }\n\n if (value !== color) {\n const newColor = getColor({ color, defaultColor: itemSchema.default, prevColor: value });\n setColor(newColor);\n if (newColor !== value) {\n onChange(event, name, newColor);\n }\n }\n },\n [name, color, value, onChange, itemSchema.default]\n );\n\n const handleBlur = useCallback(\n event => {\n if (color !== value) {\n const newColor = getColor({ color, defaultColor: itemSchema.default, prevColor: value });\n setColor(newColor);\n if (newColor !== value) {\n onChange(event, name, newColor);\n }\n }\n },\n [name, color, value, onChange, itemSchema.default]\n );\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n style={customEditorStyle}\n hideLabel={hideLabel}\n controlsLayout=\"fillJoin\"\n >\n <ColorAndTextWrapper\n showTextInput={showTextInput}\n color={color}\n palette={palette}\n handleColorChange={handleColorChange}\n name={name}\n isDisabled={isDisabled}\n textWidth={textWidth}\n value={value}\n handleTextColorChange={handleTextColorChange}\n handleKeyPress={handleKeyPress}\n handleBlur={handleBlur}\n />\n </ControlGroup>\n );\n};\n\nColorEditor.propTypes = {\n /**\n * The option name\n */\n name: T.string.isRequired,\n\n /**\n * The option value\n */\n value: T.string,\n\n /**\n * @param {Object} itemSchema Either the dataContract or schema for the selected item\n */\n itemSchema: T.object,\n\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n\n /**\n * Flag to hide the editor label\n */\n hideLabel: T.bool,\n\n /**\n * Flag to hide the color text input\n */\n showTextInput: T.bool,\n\n /**\n * Custom styling for the editor layout, eg: setting margin-bottom to 0px for ControlGroup, SUI has it at 15px\n */\n style: T.object,\n\n /**\n * Label position\n */\n labelPosition: T.oneOf(['top', 'left']),\n\n /**\n * Label position\n */\n labelWidth: T.number,\n\n /**\n * An array of color swatch values\n */\n palette: T.arrayOf(T.string),\n\n /**\n * Callback when changing the text value\n *\n * @param {SyntheticEvent} event The react `SyntheticEvent`\n * @param {string} name The option name\n * @param {string} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n textWidth: T.oneOfType([T.string, T.number]),\n};\n\nexport default ColorEditor;\n","import React, { useCallback } from 'react';\nimport T from 'prop-types';\nimport RadioBar from '@splunk/react-ui/RadioBar';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport { hasTokens } from '../utils/token';\nimport { getOptions } from '../utils/EditorFunctions';\nimport { editorStyle } from '../shared/dimensionConstants';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst RadioBarEditor = ({\n onChange,\n name,\n itemSchema,\n values,\n value,\n labelPosition = 'top',\n labelWidth,\n label,\n isDisabled = false,\n}) => {\n const options = getOptions(itemSchema, values);\n const disabled = hasTokens(value) || isDisabled;\n const handleChange = useCallback((event, { value: v }) => onChange(event, name, v), [onChange, name]);\n\n // TODO: SUI 4.0 renders empty labels differently. Labels should never be empty strings, instead pass\n // a valid label and set hideLabel on ControlGroup\n const controlGroupMarginFix = !label || label === '' ? { marginTop: '-8px' } : undefined;\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n style={controlGroupMarginFix}\n >\n <RadioBar\n data-test={name}\n onChange={handleChange}\n value={value}\n style={editorStyle}\n disabled={disabled}\n >\n {options.map(v => {\n const displayContent = v.label || v.value;\n\n // TODO: Revisit this. SUI supports label with icon, so why doesn't this editor?\n const optionProps = {};\n if (v.icon) {\n // Splunk-UI Button does not support tooltip as of now, so we need to use Tooltip on icon\n optionProps.startAdornment = (\n <Tooltip content={displayContent}>\n <v.icon hideDefaultTooltip />\n </Tooltip>\n );\n } else {\n optionProps.label = displayContent;\n }\n\n return (\n <RadioBar.Option key={v.value} value={v.value} disabled={disabled} {...optionProps} />\n );\n })}\n </RadioBar>\n </ControlGroup>\n );\n};\n\nRadioBarEditor.propTypes = {\n /**\n * Callback when selecting an item from radio bar\n *\n * @param {SyntheticEvent} event The React `SyntheticEvent`\n * @param {string} name The option name\n * @param {string|boolean} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * The item JSON schema, it should contain `enum` property. Note this will only be used when `values` prop is undefined\n */\n itemSchema: T.object,\n /**\n * The option values that can be selected\n */\n values: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.oneOfType([T.string, T.bool]).isRequired,\n })\n ),\n /**\n * The option value\n */\n value: T.oneOfType([T.string, T.bool]),\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['left', 'top']),\n labelWidth: T.number,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n};\n\nexport default RadioBarEditor;\n","import React, { useCallback } from 'react';\nimport T from 'prop-types';\nimport Select from '@splunk/react-ui/Select';\nimport { hasTokens } from '../utils/token';\nimport { getOptions } from '../utils/EditorFunctions';\nimport { editorStyle } from '../shared/dimensionConstants';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst SelectEditor = ({\n onChange,\n name,\n itemSchema,\n values,\n value,\n labelPosition = 'top',\n labelWidth,\n label,\n tooltip,\n isDisabled = false,\n isAdvanced,\n hideLabel,\n help,\n}) => {\n const options = getOptions(itemSchema, values);\n const disabled = hasTokens(value) || isDisabled;\n const handleChange = useCallback((event, { value: v }) => onChange(event, name, v), [onChange, name]);\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n isAdvanced={isAdvanced}\n hideLabel={hideLabel}\n >\n <Select\n data-test={name}\n onChange={handleChange}\n value={value}\n disabled={disabled}\n style={editorStyle}\n >\n {options.map(v => (\n <Select.Option\n key={v.value}\n value={v.value}\n label={v.label || v.value}\n icon={v.icon ? <v.icon /> : null}\n description={v.description}\n />\n ))}\n </Select>\n </ControlGroup>\n );\n};\n\nSelectEditor.propTypes = {\n /**\n * Callback when selecting an item from the menu\n *\n * @param {SyntheticEvent} event The React `SyntheticEvent`\n * @param {string} name The option name\n * @param {string|boolean} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * The item JSON schema, it should contain `enum` property. Note this will only be used when `values` prop is undefined\n */\n itemSchema: T.object,\n /**\n * The option values that can be selected\n */\n values: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.oneOfType([T.string, T.number]).isRequired,\n description: T.string,\n })\n ),\n /**\n * The option value\n */\n value: T.oneOfType([T.string, T.number]),\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['left', 'top']),\n labelWidth: T.number,\n /**\n * Text to display in a tooltip next to the label\n */\n tooltip: T.string,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n /**\n * As advanced editor to show advanced config button\n */\n isAdvanced: T.bool,\n /**\n * Disable label of control group\n */\n hideLabel: T.bool,\n /**\n * Text to display under the the input\n */\n help: T.string,\n};\n\nexport default SelectEditor;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualizations-shared/schemaUtils\");","import { cloneDeep, forIn, isPlainObject, omit, set } from 'lodash';\nimport { DYNAMIC_OPTIONS_DSL_PATTERN } from '@splunk/visualizations-shared/schemaUtils';\n\n/**\n * Return values, or parse enum values if values do not exist\n * @param {Object} itemSchema Validation config for an editor item\n * @param {Object[]} values List of predefined { label, value } objects for use by editor\n * @returns {Object[]} List of { label, value } objects for use by editor\n */\nexport const getOptions = (itemSchema, values) => {\n if (Array.isArray(values)) {\n return values;\n }\n\n if (itemSchema && Array.isArray(itemSchema.enum)) {\n return itemSchema.enum.map(item => ({ value: item }));\n }\n\n throw Error(`No valid values provided to editor: ${JSON.stringify(itemSchema)}`);\n};\n\nexport function handleOptionsChange(name, value, options = { debounce: false }) {\n const { visualization } = this.props;\n if (value == null) {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: omit(visualization.options, [name]),\n },\n options\n );\n } else {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: {\n ...visualization.options,\n [name]: value,\n },\n },\n options\n );\n }\n}\n\n/*\n * @method isMultipleRulesSchema\n * @param {Object} itemSchema\n * @returns {Boolean}\n */\nexport const isMultipleRulesSchema = itemSchema => !!itemSchema.anyOf && itemSchema.anyOf.length > 0;\n\n/*\n * @method isDynamicOptionSchema\n * @param {Object} schema\n * @returns {Boolean}\n */\nexport const isDynamicOptionSchema = schema =>\n schema.type === 'string' && schema.pattern === DYNAMIC_OPTIONS_DSL_PATTERN;\n\n/*\n * @method isNestedOption\n * @param {String} optionName\n * @returns {Boolean}\n */\nexport const isNestedOption = optionName => {\n const nestedOptionPattern = /^\\w+\\[\\d+\\]\\.(.+)$/;\n return nestedOptionPattern.exec(optionName) !== null;\n};\n\n/*\n * @method getStaticItemSchema\n * @param {Object} itemSchema\n * @returns {Object} staticItemSchema\n */\nexport const getStaticItemSchema = itemSchema => {\n if (!isMultipleRulesSchema(itemSchema)) {\n return itemSchema;\n }\n\n const staticSchema = itemSchema.anyOf.find(schema => !isDynamicOptionSchema(schema));\n return { ...omit(itemSchema, 'anyOf'), ...staticSchema };\n};\n\n/**\n * @method isContextCompatibleWithFormatter\n * @param {Array | Object} contextConfig\n * @param {String} formatterType\n * @returns {Boolean} true if context structure is compatible with formatter type\n */\nconst isContextCompatibleWithFormatter = (contextConfig, formatterType) => {\n if (!contextConfig || !formatterType) {\n return false;\n }\n\n // Gradient formatter expects an object with 'colors' property\n if (formatterType === 'gradient') {\n return (\n typeof contextConfig === 'object' && !Array.isArray(contextConfig) && 'colors' in contextConfig\n );\n }\n\n // Range/Match formatters expect an array\n if (formatterType === 'rangeValue' || formatterType === 'matchValue') {\n return Array.isArray(contextConfig);\n }\n\n // For unknown formatters, assume compatible to maintain existing behavior\n return true;\n};\n\n/**\n * @method getFormatterConfig\n * @param {Object} props\n * @param {Array | Object} [props.contextConfig]\n * @param {Array} props.formatters\n * @param {String} props.formatterFromDSL\n * @param {String} props.selectedDataSelector\n * @returns {Array | Object} the default formatter config of dynamic color editors' fomatter\n */\nexport const getFormatterConfig = ({ contextConfig, formatters, formatterFromDSL, selectedDataSelector }) => {\n // If no context exists, use default config\n if (!contextConfig) {\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n }\n\n // If no formatter type is provided, return context as-is for backward compatibility\n if (!formatterFromDSL) {\n return contextConfig;\n }\n\n // Check if existing context is compatible with the formatter type\n if (isContextCompatibleWithFormatter(contextConfig, formatterFromDSL)) {\n return contextConfig;\n }\n\n // Context is incompatible, use default config instead\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n};\n\n/**\n * @method isSupportedDataSelector\n * @param {Object} config\n * @param {String} config.selectedDataSelector e.g. 'majorValue'\n * @param {Array} config.dataSelectors e.g. [{ label: 'value', value: 'majorValue'}]\n * @returns {Boolean} true if dataSelectors includes selectedDataSelector\n */\nexport const isSupportedDataSelector = ({ selectedDataSelector, dataSelectors }) => {\n if (!selectedDataSelector || !dataSelectors?.length) {\n return false;\n }\n return dataSelectors.some(ds => ds.value === selectedDataSelector);\n};\n\n/**\n * @method isSupportedFormatter\n * @param {Object} config\n * @param {String} [config.selectedFormatterType] e.g. 'rangeValue'\n * @param {Array} [config.formattersFromEditor] e.g. [{ label: 'rangle', value: 'rangeValue', defaults: {}}]\n * @param {Object} config.supportedFormatters e.g. {rangeValue: {}, matchValue: {}}\n * @returns {Boolean} true if formattersFromEditor includes selectedFormatterType and selectedFormatterType is one of supportedFormatters on editor\n */\nexport const isSupportedFormatter = ({\n selectedFormatterType,\n formattersFromEditor,\n supportedFormatters,\n}) => {\n if (\n !selectedFormatterType ||\n !supportedFormatters?.[selectedFormatterType] ||\n !formattersFromEditor?.length\n ) {\n return false;\n }\n return formattersFromEditor.some(fm => fm.value === selectedFormatterType);\n};\n\n/**\n * @method getFilteredRowsByShowEditor filters the EditorItem objects which are visible based on showEditor property\n * @param {Object} args\n * @param {Array} args.row\n * @param {Object} args.options // item options\n * @param {Object} args.encoding\n * @param {Object} args.featureFlags\n * @returns array of EditorItem objects or empty array\n */\nexport const getFilteredRowsByShowEditor = ({ row, options, encoding, featureFlags }) => {\n if (!row || !Array.isArray(row)) {\n return [];\n }\n const filteredRow = row.filter(\n item =>\n typeof item.showEditor === 'undefined' ||\n (typeof item.showEditor === 'function' && item.showEditor({ options, encoding, featureFlags }))\n );\n return filteredRow;\n};\n\n/**\n * @method removeEmptyEntries Removes of all entries where the value is null, undefined, and convert nulls in arrays to undefined\n * @param {Object} obj\n */\nconst removeEmptyEntries = obj => {\n const returnObj = cloneDeep(obj);\n forIn(returnObj, (value, key) => {\n if ((value !== null && value !== undefined && Array.isArray(value)) || isPlainObject(value)) {\n returnObj[key] = removeEmptyEntries(returnObj[key]);\n }\n if (Array.isArray(value)) {\n returnObj[key] = value.map(val => (val === null ? undefined : val));\n }\n if (value === null || value === undefined) {\n delete returnObj[key];\n }\n });\n return returnObj;\n};\n\n/**\n * @method getToggleOffValueForDataColors determines the appropriate value when toggling off dataColors\n * @param {Object} config\n * @param {String} config.name - the option name (e.g., 'dataColors', 'layers[0].dataColors')\n * @param {Object} config.options - all visualization options\n * @param {String[]} config.dataSelectors - available data selectors (e.g., ['areaValues'])\n * @returns {String} appropriate toggle-off value (empty string or gradient fallback)\n */\nexport const getToggleOffValueForDataColors = ({ name, options, dataSelectors = [] }) => {\n // Only process dataColors options\n if (!name?.includes('dataColors')) {\n return '';\n }\n\n // Check if this is a choropleth layer by examining the layer configuration\n const isChoroplethLayer = () => {\n // Handle top-level dataColors\n if (name === 'dataColors') {\n return options?.type === 'choropleth' || options?.layerType === 'choropleth';\n }\n\n // Handle nested layer dataColors (e.g., layers[0].dataColors)\n const layerPattern = /^layers\\[(\\d+)\\]\\.dataColors$/;\n const layerMatch = layerPattern.exec(name);\n if (layerMatch) {\n const layerIndex = parseInt(layerMatch[1], 10);\n const layer = options?.layers?.[layerIndex];\n return layer?.type === 'choropleth' || layer?.layerType === 'choropleth';\n }\n\n return false;\n };\n\n // Check if areaValues is available as a data selector\n const hasAreaValuesSelector = dataSelectors.includes('areaValues');\n\n // Return gradient fallback for choropleth layers with areaValues, empty string otherwise\n if (isChoroplethLayer() && hasAreaValuesSelector) {\n return '> areaValues | gradient()';\n }\n\n return '';\n};\n\n/**\n * @method convertEmptyDataColorsForChoropleth handles the conversion of empty dataColors option to gradient fallback for choropleth layers\n * @param {Object} config\n * @param {String} config.option - the option name (e.g., 'dataColors', 'layers[0].dataColors')\n * @param {Any} config.value - the option value\n * @param {Object} config.options - all visualization options\n * @param {String[]} config.dataSelectors - available data selectors (e.g., ['areaValues'])\n * @returns {String|Any} converted value for choropleth or original value\n */\nexport const convertEmptyDataColorsForChoropleth = ({ option, value, options, dataSelectors = [] }) => {\n // Only process dataColors options\n if (!option?.includes('dataColors')) {\n return value;\n }\n\n // Only convert empty string values\n if (value !== '') {\n return value;\n }\n\n // Use the toggle-off value logic\n return getToggleOffValueForDataColors({ name: option, options, dataSelectors });\n};\n\n/**\n * @method setOption sets an options value\n * @param {String} option\n * @param {Any} value\n * @param {Object} oldVisualization\n * @param {Object} optionSchema\n * @param {Object} defaultOverrides\n * @param {String[]} dataSelectors - available data selectors for choropleth conversion\n * @returns visualization object with updated options\n */\nexport const setOption = (option, value, oldVisualization, optionSchema, defaultOverrides, dataSelectors) => {\n const obj = {\n ...oldVisualization,\n };\n\n let newOption = option;\n let newValue = value;\n\n // Apply choropleth-specific conversion for empty dataColors\n if (newValue === '' && newOption?.includes('dataColors')) {\n newValue = convertEmptyDataColorsForChoropleth({\n option: newOption,\n value: newValue,\n options: oldVisualization.options,\n dataSelectors,\n });\n }\n\n // Remove from definition if value is null/undefined, and the key is explicitly set in the optionSchema\n if ((newValue === null || newValue === undefined) && optionSchema[newOption]) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n\n // Remove from definition if value is the same as the default from the overrides or the schema\n const schemaDefault = defaultOverrides?.[newOption] ?? optionSchema[newOption]?.default;\n if (typeof schemaDefault !== 'undefined' && newValue === schemaDefault) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n // Copy options\n obj.options = cloneDeep(oldVisualization.options);\n obj.options ??= {};\n // ColumnSelectionEditor returns the option as an object\n // with a key/value pair inside that object with the param value as undefiend\n if ((value === null || value === undefined) && isPlainObject(option) && isPlainObject(option.options)) {\n [newOption] = Object.keys(option.options);\n [newValue] = Object.values(option.options);\n }\n // Select explicitly exposed option first for non arrays / objects\n if (optionSchema[newOption]) {\n if (optionSchema[newOption].type !== 'array') {\n obj.options[newOption] = newValue;\n return obj;\n }\n }\n // Set option using loadash to translate string path like `object.object.key` to target a specific key within nested objects\n if (newValue === null) {\n newValue = undefined;\n }\n set(obj.options, newOption, newValue);\n // Remove any null, undefined, nad nulls from arrays\n obj.options = removeEmptyEntries(obj.options);\n return obj;\n};\n","const TOKEN_NAMESPACE_PREFIX_PATTERN = /(\\w+:)?/.source;\n// ex: token.name|suh (old-style filter chain)\n// ex: token.name|lower|capitalize (new-style filter chain)\nconst TOKEN_NAME_CHARS_PATTERN = /([^$|:]+?)(\\|[|\\w]+)?/.source;\n// ex: $ns:token.name|suh$\nconst TOKEN_PATTERN = /\\$/.source + TOKEN_NAMESPACE_PREFIX_PATTERN + TOKEN_NAME_CHARS_PATTERN + /\\$/.source;\n\nconst TokenRegExp = new RegExp(TOKEN_PATTERN);\n\nexport const hasTokens = value => typeof value === 'string' && TokenRegExp.test(value);\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport ControlGroup from '@splunk/react-ui/ControlGroup';\nimport Button from '@splunk/react-ui/Button';\nimport Popover from '@splunk/react-ui/Popover';\nimport CustomizedInSourceMessage from '../shared/CustomizedInSourceMessage';\n\nconst { useRef, useState, useCallback } = React;\n\nexport interface CustomizedInSourceEditorProps {\n label: string;\n labelPosition?: 'left' | 'top';\n labelWidth?: number;\n onResetToDefault?: (...args: any[]) => void;\n}\n\nconst propTypes: Record<keyof CustomizedInSourceEditorProps, T.Validator<any>> = {\n label: T.string,\n labelPosition: T.oneOf(['top', 'left']),\n labelWidth: T.number,\n onResetToDefault: T.func,\n};\n\nconst CustomizedInSourceEditor = ({\n label,\n labelPosition = 'left',\n labelWidth,\n onResetToDefault,\n}: CustomizedInSourceEditorProps) => {\n const [open, setOpen] = useState(false);\n const anchor = useRef(null);\n const handleOpen = useCallback((): void => setOpen(true), []);\n const handleRequestClose = useCallback((): void => setOpen(false), []);\n\n return (\n <ControlGroup label={_(label)} labelPosition={labelPosition} labelWidth={labelWidth}>\n <Button\n data-test=\"customized-in-source-button\"\n onClick={handleOpen}\n appearance=\"default\"\n ref={anchor}\n label={_('Customized in source')}\n />\n <Popover\n data-test=\"customized-in-source-popover\"\n open={open}\n anchor={anchor.current}\n onRequestClose={handleRequestClose}\n defaultPlacement=\"horizontal\"\n >\n <CustomizedInSourceMessage onResetToDefault={onResetToDefault} />\n </Popover>\n </ControlGroup>\n );\n};\n\nCustomizedInSourceEditor.propTypes = propTypes;\n\nexport default CustomizedInSourceEditor;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { toPx } from '@splunk/visualizations-shared/style';\nimport ControlGroup from '@splunk/react-ui/ControlGroup';\nimport Button from '@splunk/react-ui/Button';\nimport Popover from '@splunk/react-ui/Popover';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { defaultPalettesConfig as initialPalettesConfig } from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport { find, isEmpty } from 'lodash';\nimport {\n getDataSelectorsFromDSL,\n getLastFormatterFromDSL,\n buildDSLFromDataSelectorAndFormatter,\n} from '@splunk/visualization-encoding/utils/dsl';\nimport type { OptionsStanza } from '@splunk/visualization-encoding/AST';\nimport RadioBar from '@splunk/react-ui/RadioBar';\nimport {\n FormatterEditor,\n supportedFormatters,\n sharedPalettesConfigPropType,\n} from './formatters/FormatterEditor';\nimport type { UiConfig, FormatterUiConfig } from './formatters/FormatterEditor';\nimport CustomizedInSourceEditor from './CustomizedInSourceEditor';\nimport { FLYOUT_WIDTH, FLYOUT_PADDING } from '../shared/dimensionConstants';\nimport { BaseEditorPropTypes } from '../interfaces/BaseEditorProps';\nimport type { BaseEditorProps } from '../interfaces/BaseEditorProps';\nimport type { PalettesConfig } from '../interfaces/PalettesConfig';\nimport { getFormatterConfig, isSupportedDataSelector, isSupportedFormatter } from '../utils/EditorFunctions';\n\nconst { useRef, useState, useEffect } = React;\n\nconst FlyoutHeader = styled.div`\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 8px;\n`;\n\nconst StyledLabel = styled.div`\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 8px;\n`;\n\nconst StyledFlyoutContent = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'DynamicColorFlyoutContent',\n}))`\n box-sizing: border-box;\n padding: ${toPx(FLYOUT_PADDING)};\n width: ${toPx(FLYOUT_WIDTH)};\n`;\n\nconst StyledButton = styled(Button)`\n padding: '4px';\n`;\n\nexport interface DynamicColorEditorProps extends BaseEditorProps {\n value: string; // @TODO(pwied): will need to be refactored to object once we pass whole options object to resolve dependencies\n flyoutTitle?: string;\n dataSelectors?: UiConfig[];\n formatters?: FormatterUiConfig[];\n defaultPalettesConfig: PalettesConfig;\n showStaticTextColor?: boolean;\n colorMode?: 'text' | 'background' | 'off';\n handleColorModeChange?: (event: any, value: any) => void;\n}\nconst propTypes: Record<keyof DynamicColorEditorProps, T.Validator<any>> = {\n ...BaseEditorPropTypes,\n flyoutTitle: T.string,\n formatters: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.string,\n defaults: T.object,\n isDefault: T.bool,\n })\n ),\n dataSelectors: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.string,\n })\n ),\n defaultPalettesConfig: sharedPalettesConfigPropType,\n showStaticTextColor: T.bool,\n colorMode: T.oneOf(['text', 'background', 'off']),\n handleColorModeChange: T.func,\n};\n\nexport const prepareUpdate = ({\n name,\n selectedDataSelector,\n selectedFormatterType,\n currentFormatterConfig,\n}): OptionsStanza => {\n const contextKey = `${name}EditorConfig`;\n // use regex to remove top-level array references. keeping only the nested field name.\n // if only top-level, stay unchanged.\n // example 1: layers[0].dataColorsEditorConfig → dataColorsEditorConfig\n // example 2: rangeValueColorConfig → rangeValueColorConfig\n const extractedContextKey = contextKey.replace(/^\\w+\\[\\d+\\]\\.(.+)$/, '$1');\n\n return {\n options: {\n [name]: buildDSLFromDataSelectorAndFormatter(\n selectedDataSelector,\n selectedFormatterType,\n contextKey\n ),\n },\n context: {\n [extractedContextKey]: currentFormatterConfig,\n },\n };\n};\n/**\n * The DynamicColorEditor receives a DSL string as value prop and breaks it up into two parts\n * 1) a data selector\n * 2) a formatter\n * Based on those two parts and editorProps from the editor config (formatters & dataSelectors) it initializes a UI to edit color formatter configurations.\n *\n * For now the data selector part is limited to a data selector reference that needs to be defined in editorProps.dataSelectors\n *\n * Example:\n * `> majorValue | rangeValue(config)` requires majorValue to be part of editorProps.dataSelectors and rangeValue to be part of editorProps.formatters\n * Advanced data selection such as `> primary | seriesByIndex(0) | rangeValue(config)` exceeds the capabilities of the editor\n */\nexport const DynamicColorEditor: React.FunctionComponent<DynamicColorEditorProps> = ({\n name,\n value,\n label = '',\n labelPosition = 'left',\n labelWidth,\n context,\n onChange = (): void => undefined,\n flyoutTitle = _('Dynamic coloring'),\n formatters = [],\n dataSelectors = [],\n defaultPalettesConfig = initialPalettesConfig,\n isDisabled = false,\n showStaticTextColor = false,\n colorMode = undefined,\n handleColorModeChange = undefined,\n}) => {\n const [showFlyout, setShowFlyout] = useState(false);\n const buttonRef = useRef(null);\n const { type: formatterFromDSL, paramKey: formatterContextKey } = getLastFormatterFromDSL(value) || {\n type: 'unknown',\n paramKey: 'unknown',\n };\n const dataSelectorFromDSL = getDataSelectorsFromDSL(value)[0];\n const [selectedFormatterType, setSelectedFormatterType] = useState(formatterFromDSL);\n useEffect((): void => {\n setSelectedFormatterType(formatterFromDSL);\n }, [formatterFromDSL]);\n\n const [selectedDataSelector, setSelectedDataSelector] = useState(dataSelectorFromDSL);\n useEffect((): void => {\n setSelectedDataSelector(dataSelectorFromDSL);\n }, [dataSelectorFromDSL]);\n\n const formatterConfigFromDSL = getFormatterConfig({\n contextConfig: context[formatterContextKey],\n formatters,\n formatterFromDSL,\n selectedDataSelector,\n });\n const [currentFormatterConfig, setCurrentFormatterConfig] = useState(formatterConfigFromDSL);\n useEffect((): void => {\n setCurrentFormatterConfig(formatterConfigFromDSL);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [context, formatters, formatterContextKey, formatterFromDSL, dataSelectorFromDSL]);\n\n const handleDataSelectorChange = (event, editorName, newDataSelector): void => {\n setSelectedDataSelector(newDataSelector);\n // pick the first available formatter that has a config for this data selector\n const formatter = find(\n formatters,\n (f): Record<string, unknown> => f.defaults[newDataSelector]\n ) as FormatterUiConfig;\n setSelectedFormatterType(formatter.value);\n const formatterCfg = formatter.defaults[newDataSelector];\n setCurrentFormatterConfig(formatterCfg);\n onChange(\n event,\n prepareUpdate({\n name,\n selectedDataSelector: newDataSelector,\n selectedFormatterType: formatter.value,\n currentFormatterConfig: formatterCfg,\n })\n );\n };\n const handleFormatterChange = (event, editorName, newFormatter): void => {\n setSelectedFormatterType(newFormatter);\n const formatter = find(formatters, ['value', newFormatter]);\n const formatterCfg = formatter.defaults[selectedDataSelector];\n setCurrentFormatterConfig(formatterCfg);\n onChange(\n event,\n prepareUpdate({\n name,\n selectedDataSelector,\n selectedFormatterType: newFormatter,\n currentFormatterConfig: formatterCfg,\n })\n );\n };\n const handleFormatterConfigChange = (event, editorName, newFormatterConfig): void => {\n setCurrentFormatterConfig(newFormatterConfig);\n onChange(\n event,\n prepareUpdate({\n name,\n selectedDataSelector,\n selectedFormatterType,\n currentFormatterConfig: newFormatterConfig,\n })\n );\n };\n const handleResetToDefault = (event): void => {\n const getDefaultFormatter = (): FormatterUiConfig => {\n return find(formatters, (f): boolean => f.isDefault);\n };\n const getRangeValueFormatter = (): FormatterUiConfig => {\n return find(formatters, (f): boolean => f.value === 'rangeValue');\n };\n const formatter = getDefaultFormatter() || getRangeValueFormatter() || formatters[0];\n if (isEmpty(formatter)) {\n return;\n }\n\n const defaultFormatter = formatter.value;\n const defaultDataSelector = Object.keys(formatter.defaults)[0];\n const formatterCfg = formatter.defaults[defaultDataSelector];\n\n setSelectedDataSelector(defaultDataSelector);\n setSelectedFormatterType(defaultFormatter);\n setCurrentFormatterConfig(formatterCfg);\n onChange(\n event,\n prepareUpdate({\n name,\n selectedDataSelector: defaultDataSelector,\n selectedFormatterType: defaultFormatter,\n currentFormatterConfig: formatterCfg,\n })\n );\n };\n\n const handleButtonClick = React.useCallback(() => {\n setShowFlyout(currentValue => !currentValue);\n }, []);\n\n // implement source exceeds editor state\n if (\n !isSupportedDataSelector({ selectedDataSelector, dataSelectors }) ||\n !isSupportedFormatter({\n selectedFormatterType,\n formattersFromEditor: formatters,\n supportedFormatters,\n })\n ) {\n return (\n <CustomizedInSourceEditor\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n onResetToDefault={handleResetToDefault}\n />\n );\n }\n\n const FormatterConfigPreview = supportedFormatters[selectedFormatterType].preview;\n\n return (\n <>\n <ControlGroup\n data-test=\"DynamicColorEditorGroup\"\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n >\n <StyledButton\n inline={false}\n data-test=\"DynamicColorEditorButton\"\n appearance=\"default\"\n ref={buttonRef}\n onClick={handleButtonClick}\n disabled={isDisabled}\n >\n <FormatterConfigPreview\n data-test=\"FormatterConfigPreview\"\n config={currentFormatterConfig}\n />\n </StyledButton>\n </ControlGroup>\n <Popover\n data-test=\"DynamicColorEditorFlyout\"\n open={showFlyout}\n anchor={buttonRef.current}\n defaultPlacement=\"horizontal\"\n style={{ padding: '10px' }}\n onRequestClose={(): void => setShowFlyout(false)}\n takeFocus\n >\n <StyledFlyoutContent>\n {!colorMode && <FlyoutHeader>{flyoutTitle}</FlyoutHeader>}\n {colorMode && (\n <ControlGroup\n data-test=\"TableDynamicColorEditorGroup\"\n label={flyoutTitle}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n >\n <RadioBar value={colorMode} onChange={handleColorModeChange}>\n {[\n { label: _('Off'), value: 'off' },\n { label: _('Text'), value: 'text' },\n { label: _('Background'), value: 'background' },\n ].map(({ label: optionLabel, value: optionValue }) => (\n <RadioBar.Option\n key={optionValue}\n value={optionValue}\n label={_(optionLabel)}\n />\n ))}\n </RadioBar>\n </ControlGroup>\n )}\n {colorMode && <StyledLabel>{_('Method')}</StyledLabel>}\n <FormatterEditor\n selectedDataSelector={selectedDataSelector}\n selectedFormatterType={selectedFormatterType}\n currentFormatterConfig={currentFormatterConfig}\n onDataSelectorChange={handleDataSelectorChange}\n onFormatterTypeChange={handleFormatterChange}\n onFormatterConfigChange={handleFormatterConfigChange}\n formatters={formatters}\n dataSelectors={dataSelectors}\n defaultPalettesConfig={defaultPalettesConfig}\n showStaticTextColor={showStaticTextColor}\n />\n </StyledFlyoutContent>\n </Popover>\n </>\n );\n};\n\nDynamicColorEditor.propTypes = propTypes;\n","import * as React from 'react';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport ColumnLayout from '@splunk/react-ui/ColumnLayout';\nimport type { OptionsStanza } from '@splunk/visualization-encoding/AST';\nimport type { UiConfig, FormatterUiConfig } from './formatters/FormatterEditor';\nimport { DynamicColorEditor } from './DynamicColorEditor';\nimport SelectEditor from './SelectEditor';\nimport ColorEditor from './ColorEditor';\n\nimport type { BaseEditorProps } from '../interfaces/BaseEditorProps';\nimport type { PalettesConfig } from '../interfaces/PalettesConfig';\nimport type { DynamicOptionsConfig } from '../types';\n\ntype Options = Record<string, string | number | boolean | Record<string, any>>;\n\nexport interface NetworkGraphDynamicColorEditorProps extends BaseEditorProps {\n name: string;\n value: string;\n contextName: string;\n flyoutTitle?: string;\n dataSelectors?: UiConfig[];\n formatters?: FormatterUiConfig[];\n defaultPalettesConfig: PalettesConfig;\n tooltip?: string;\n options?: Options;\n onChange: (event: React.SyntheticEvent | null, updatedConfig: DynamicOptionsConfig) => void;\n}\n\nconst TOTAL_COLUMN_SPAN = 12;\nconst COLOR_COLUMN_SPAN = TOTAL_COLUMN_SPAN / 2;\n\nexport const NetworkGraphDynamicColorEditor: React.FC<NetworkGraphDynamicColorEditorProps> = ({\n name,\n value,\n contextName,\n label = '',\n labelWidth,\n context,\n flyoutTitle = _('Dynamic coloring'),\n formatters = [],\n dataSelectors = [],\n defaultPalettesConfig,\n tooltip,\n options = {},\n onChange = () => undefined,\n}) => {\n const dataSelector = dataSelectors[0]?.value;\n\n const getCurrentColoringType = React.useCallback((optionValue: string) => {\n // if option is undefined, the default is static coloring\n if (!optionValue || optionValue.trim().startsWith('#')) return 'static';\n\n return 'dynamic';\n }, []);\n\n const [coloringType, setColoringType] = React.useState(getCurrentColoringType(value));\n const selectColumnSpan = TOTAL_COLUMN_SPAN - COLOR_COLUMN_SPAN;\n\n // Change coloring type if value changes in source code\n React.useEffect(() => {\n const newColoringType = getCurrentColoringType(value);\n setColoringType(newColoringType);\n }, [getCurrentColoringType, value]);\n\n const handleSelectChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>, selectedName, selectedValue) => {\n setColoringType(selectedValue);\n\n const updatedOptions: Record<string, any> = {\n ...options,\n };\n const updatedContext: Record<string, any> = { ...context };\n\n if (selectedValue === 'dynamic') {\n const defaultFormatter = formatters[0]?.value || 'gradient';\n const defaultConfig = formatters[0]?.defaults?.[dataSelector] || {};\n\n const dsl = `> ${dataSelector} | ${defaultFormatter}(${contextName})`;\n updatedOptions[name] = dsl;\n updatedContext[contextName] = defaultConfig;\n\n onChange(event, { options: updatedOptions, context: updatedContext });\n } else if (selectedValue === 'static') {\n updatedOptions[name] = undefined;\n updatedContext[contextName] = undefined;\n onChange(event, { options: updatedOptions, context: updatedContext });\n }\n },\n [options, context, formatters, dataSelector, contextName, name, onChange]\n );\n\n const handleDynamicColorEditorChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>, optionStanza: OptionsStanza) => {\n const dsl = optionStanza.options[name];\n const config = optionStanza.context?.[contextName];\n const updatedOptions = { ...options, [name]: dsl };\n\n const updatedContext = { ...context, [contextName]: config };\n onChange(event, { options: updatedOptions, context: updatedContext });\n },\n [options, name, context, onChange, contextName]\n );\n\n const handleStaticColorChange = React.useCallback(\n (event, optionName: string, color: string) => {\n const updatedOptions = { ...options, [optionName]: color };\n const updatedContext = { ...context };\n updatedContext[contextName] = undefined;\n\n onChange(event, { options: updatedOptions, context: updatedContext });\n },\n [context, onChange, options, contextName]\n );\n\n return (\n <ColumnLayout data-test=\"dynamic-color-toggle\" gutter={15}>\n <ColumnLayout.Row data-test=\"network-graph-dynamic-color-row\" alignItems=\"start\">\n <ColumnLayout.Column span={selectColumnSpan}>\n <SelectEditor\n name={name}\n label={_(label)}\n labelPosition=\"top\"\n value={coloringType}\n onChange={handleSelectChange}\n itemSchema={{ type: 'string' }}\n values={[\n { label: _('Static coloring'), value: 'static' },\n {\n label: _('Dynamic coloring'),\n value: 'dynamic',\n },\n ]}\n help={tooltip}\n />\n </ColumnLayout.Column>\n {coloringType === 'dynamic' && (\n <ColumnLayout.Column span={COLOR_COLUMN_SPAN}>\n <DynamicColorEditor\n name={name}\n label={' '}\n labelPosition=\"top\"\n labelWidth={labelWidth}\n value={value}\n context={context}\n onChange={handleDynamicColorEditorChange}\n flyoutTitle={flyoutTitle}\n formatters={formatters}\n dataSelectors={dataSelectors}\n defaultPalettesConfig={defaultPalettesConfig}\n />\n </ColumnLayout.Column>\n )}\n {coloringType === 'static' && (\n <ColumnLayout.Column span={COLOR_COLUMN_SPAN}>\n <ColorEditor\n name={name}\n label={' '}\n labelPosition=\"top\"\n labelWidth={labelWidth}\n value={value}\n onChange={handleStaticColorChange}\n />\n </ColumnLayout.Column>\n )}\n </ColumnLayout.Row>\n </ColumnLayout>\n );\n};\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport { createDOMID } from '@splunk/ui-utils/id';\n\nconst DEFAULT_MAX_COLOR_COUNT = 7;\n\ninterface ColorPreviewWrapperProps {\n isReversed?: boolean;\n}\n\nconst ColorPreviewWrapper = styled.div.attrs<ColorPreviewWrapperProps>(props => ({\n 'data-test': 'ColorPreviewWrapper',\n isReversed: props.isReversed,\n}))<ColorPreviewWrapperProps>`\n display: flex;\n flex-direction: row;\n height: 100%;\n`;\n\ninterface ColorPreviewItemProps {\n color: string;\n widthGrow?: boolean;\n maxColorCount?: number;\n}\n\nconst ColorPreviewItem = styled.div.attrs<ColorPreviewItemProps>(() => ({\n 'data-test': 'ColorPreviewItem',\n}))<ColorPreviewItemProps>`\n flex-grow: ${({ widthGrow }): number => (widthGrow ? 1 : 0)};\n width: ${({ maxColorCount }): string => `calc(100% / ${maxColorCount})`};\n margin-right: 1px;\n background-color: ${({ color }): string => color};\n &:last-of-type {\n margin-right: 0;\n }\n`;\n\ninterface ColorPreviewProps {\n colors: string[];\n maxColorCount?: number;\n expandToFillHorizontalSpace?: boolean;\n isReversed?: boolean;\n}\nconst propTypes: Record<keyof ColorPreviewProps, T.Validator<any>> = {\n colors: T.arrayOf(T.string).isRequired,\n maxColorCount: T.number,\n expandToFillHorizontalSpace: T.bool,\n isReversed: T.bool,\n};\n\nexport const ColorPreview: React.FunctionComponent<ColorPreviewProps> = ({\n colors = [],\n maxColorCount = DEFAULT_MAX_COLOR_COUNT,\n expandToFillHorizontalSpace = true,\n isReversed = false,\n}): React.ReactElement => {\n const trueColors = isReversed ? [...colors].reverse() : [...colors];\n return (\n <ColorPreviewWrapper isReversed={isReversed}>\n {trueColors.map(\n (color, _i): React.ReactElement =>\n isColor(color) && (\n <ColorPreviewItem\n key={createDOMID()}\n color={color}\n widthGrow={expandToFillHorizontalSpace}\n maxColorCount={maxColorCount}\n />\n )\n )}\n </ColorPreviewWrapper>\n );\n};\nColorPreview.propTypes = propTypes;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport type { RangesConfig } from '@splunk/visualization-encoding/formatters/RangeValue';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { createGradientConfigFromPalettes } from './Gradient/gradientUtils';\nimport type { GradientConfig } from './Gradient/gradientUtils';\nimport type { BaseEditorProps } from '../../interfaces/BaseEditorProps';\nimport type { BasePreviewProps } from '../../interfaces/BasePreviewProps';\nimport type { PalettesConfig } from '../../interfaces/PalettesConfig';\nimport { RangeValuePreview } from './RangeValuePreview';\nimport { MatchValuePreview } from './MatchValuePreview';\nimport GradientPreview from './Gradient/GradientPreview';\nimport RadioBarEditor from '../RadioBarEditor';\nimport RangeValueEditor from './RangeValueEditor';\nimport MatchValueEditor from './MatchValueEditor';\nimport GradientEditor from './GradientEditor';\nimport type { MatchValueEditorProps } from './MatchValueEditor';\nimport CustomizedInSourceEditor from '../CustomizedInSourceEditor';\n\nexport const sharedPalettesConfigPropType = T.exact({\n paletteTheme: T.string,\n paletteEntry: T.exact({\n type: T.string,\n index: T.number,\n }),\n});\n\nexport const getSortedRanges = (ranges = []): RangesConfig[] => {\n const rangesToSort = [...(Array.isArray(ranges) ? ranges : [])];\n rangesToSort.sort((a, b): number => {\n if (a.to == null) return 1;\n if (b.to == null) return -1;\n return +a.to - +b.to;\n });\n return rangesToSort;\n};\n\nconst DEFAULT_GRADIENT_PALETTES_CONFIG: PalettesConfig = {\n paletteTheme: 'DARK_COLORS',\n paletteEntry: {\n type: 'sequential',\n index: 0,\n },\n};\n\nexport interface RangeValueEditorProps extends BaseEditorProps {\n defaultPalettesConfig: PalettesConfig;\n selectedDataSelector?: string;\n}\n\nexport const RangeValueEditorWrapper: React.FunctionComponent<RangeValueEditorProps> = ({\n defaultPalettesConfig,\n value,\n onChange,\n selectedDataSelector,\n}): React.ReactElement => (\n <RangeValueEditor\n data-test=\"RangeValueEditor\"\n defaultPalettesConfig={defaultPalettesConfig}\n value={value}\n onChange={(event, name, rangeValues): void => onChange(event, name, rangeValues)}\n selectedDataSelector={selectedDataSelector}\n />\n);\n\nRangeValueEditorWrapper.propTypes = {\n defaultPalettesConfig: sharedPalettesConfigPropType,\n value: T.arrayOf(\n T.shape({\n from: T.number,\n to: T.number,\n value: T.string,\n })\n ),\n onChange: T.func,\n selectedDataSelector: T.string,\n};\n\nexport const MatchValueEditorWrapper: React.FunctionComponent<MatchValueEditorProps> = ({\n defaultPalettesConfig,\n value,\n onChange,\n selectedDataSelector,\n}): React.ReactElement => (\n <MatchValueEditor\n data-test=\"MatchValueEditor\"\n defaultPalettesConfig={defaultPalettesConfig}\n value={value}\n onChange={(event, name, matchValues): void => onChange(event, name, matchValues)}\n selectedDataSelector={selectedDataSelector}\n />\n);\n\nMatchValueEditorWrapper.propTypes = {\n defaultPalettesConfig: sharedPalettesConfigPropType,\n value: T.arrayOf(\n T.shape({\n match: T.oneOfType([T.string, T.number]),\n value: T.string,\n })\n ),\n onChange: T.func,\n selectedDataSelector: T.string,\n};\n\nexport interface GradientEditorProps extends BaseEditorProps {\n defaultPalettesConfig: PalettesConfig;\n value: GradientConfig;\n showStaticTextColor?: boolean;\n selectedDataSelector?: string;\n onChange: (event: React.SyntheticEvent, name: string, value: GradientConfig) => void;\n}\n\nexport const GradientEditorWrapper: React.FunctionComponent<GradientEditorProps> = ({\n defaultPalettesConfig = DEFAULT_GRADIENT_PALETTES_CONFIG,\n value,\n onChange,\n showStaticTextColor,\n selectedDataSelector,\n}): React.ReactElement => {\n // if stops are defined or more than 7 colors, it means the gradient is customized\n const isCustomized = value?.stops?.length > 0 || (value?.colors?.length ?? 0) > 7;\n if (isCustomized) {\n return (\n <CustomizedInSourceEditor\n label=\"Data colors\"\n labelPosition=\"top\"\n onResetToDefault={() => {\n const defaultGradient = createGradientConfigFromPalettes(defaultPalettesConfig);\n onChange(undefined, undefined, defaultGradient);\n }}\n />\n );\n }\n\n return (\n <GradientEditor\n data-test=\"GradientEditor\"\n name=\"gradient\"\n defaultPalettesConfig={defaultPalettesConfig}\n value={value}\n onChange={(event, name, gradientValues): void => onChange(event, name, gradientValues)}\n showStaticTextColor={showStaticTextColor}\n selectedDataSelector={selectedDataSelector}\n />\n );\n};\n\nGradientEditorWrapper.propTypes = {\n defaultPalettesConfig: sharedPalettesConfigPropType,\n value: T.exact({\n colors: T.arrayOf(T.string).isRequired,\n textColor: T.string,\n }).isRequired,\n onChange: T.func,\n showStaticTextColor: T.bool,\n selectedDataSelector: T.string,\n};\n\ntype ValidEditorProps = BaseEditorProps | RangeValueEditorProps | MatchValueEditorProps | GradientEditorProps;\n\ninterface SupportedFormattersShape {\n [key: string]: {\n preview: React.JSXElementConstructor<BasePreviewProps>;\n // @TODO: extend w/ other props types once other formatting editors are added\n editor?: React.JSXElementConstructor<ValidEditorProps>;\n };\n}\n/**\n * This object will be used to dynamically look up the preview/editor to render\n */\nexport const supportedFormatters: SupportedFormattersShape = {\n gradient: {\n preview: GradientPreview,\n editor: GradientEditorWrapper,\n },\n rangeValue: {\n preview: RangeValuePreview,\n editor: RangeValueEditorWrapper,\n },\n matchValue: {\n preview: MatchValuePreview,\n editor: MatchValueEditorWrapper,\n },\n};\nconst validFormatterTypes = Object.keys(supportedFormatters);\nexport interface UiConfig {\n label: string;\n value: string;\n}\nexport interface FormatterUiConfig extends UiConfig {\n /**\n * Keys in this object reference DataSelectors.\n * Values represent default formatter configurations for this data selector.\n *\n * Example:\n * {\n * majorValue: [{ from: 0, value: '#f00' }],\n * deltaValue: [{ to: 0, value: 'red' }, { from: 0, value: 'green' }]\n * }\n *\n */\n defaults: {\n [key: string]: any;\n };\n /*\n * show it by default when open dynamic color flyout\n */\n isDefault?: boolean;\n}\n\ninterface FormatterEditorProps {\n selectedDataSelector: string;\n selectedFormatterType: (typeof validFormatterTypes)[number];\n currentFormatterConfig: any;\n dataSelectors: UiConfig[];\n formatters: FormatterUiConfig[];\n showStaticTextColor?: boolean;\n onDataSelectorChange?: (evt: string, name: string, newDataSelector: string) => void;\n onFormatterTypeChange: (evt: string, name: string, newFormatter: string) => void;\n onFormatterConfigChange: (...args: any[]) => void;\n defaultPalettesConfig: PalettesConfig;\n}\nconst propTypes: Record<keyof FormatterEditorProps, T.Validator<any>> = {\n selectedDataSelector: T.string,\n selectedFormatterType: T.oneOf(validFormatterTypes),\n currentFormatterConfig: T.any,\n formatters: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.string,\n defaults: T.object,\n isDefault: T.bool,\n })\n ),\n dataSelectors: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.string,\n })\n ),\n onDataSelectorChange: T.func,\n onFormatterTypeChange: T.func,\n onFormatterConfigChange: T.func,\n defaultPalettesConfig: sharedPalettesConfigPropType,\n showStaticTextColor: T.bool,\n};\n\nexport const FormatterEditor: React.FunctionComponent<FormatterEditorProps> = ({\n selectedDataSelector,\n selectedFormatterType,\n currentFormatterConfig,\n formatters = [],\n dataSelectors = [],\n onDataSelectorChange,\n onFormatterTypeChange,\n onFormatterConfigChange,\n defaultPalettesConfig,\n showStaticTextColor = false,\n}): React.ReactElement => {\n // if there's only 1 dataselector don't show a button group\n const showDataSelectorButtonGroup = dataSelectors.length > 1;\n const formatterSelectorLabel = showDataSelectorButtonGroup ? _('Method') : '';\n const filteredFormatters = formatters.filter(\n (formatter): any => formatter.defaults?.[selectedDataSelector]\n );\n // same for formatters\n const showFormatterButtonGroup = filteredFormatters.length > 1;\n const FormatterConfigEditor = supportedFormatters[selectedFormatterType]?.editor;\n return (\n <>\n {showDataSelectorButtonGroup && (\n <RadioBarEditor\n name=\"dataSelector\"\n label={_('Based on')}\n data-test=\"FormatterEditorDataSelector\"\n values={dataSelectors}\n value={selectedDataSelector}\n onChange={onDataSelectorChange}\n />\n )}\n {showFormatterButtonGroup && (\n <RadioBarEditor\n name=\"formatterSelector\"\n label={formatterSelectorLabel}\n data-test=\"FormatterEditorFormatterSelector\"\n values={filteredFormatters}\n value={selectedFormatterType}\n onChange={onFormatterTypeChange}\n />\n )}\n <FormatterConfigEditor\n data-test=\"FormatterEditorConfigEditor\"\n name=\"formatterConfig\"\n value={currentFormatterConfig}\n onChange={onFormatterConfigChange}\n defaultPalettesConfig={defaultPalettesConfig}\n selectedDataSelector={selectedDataSelector}\n showStaticTextColor={selectedFormatterType === 'gradient' && showStaticTextColor}\n />\n </>\n );\n};\n\nFormatterEditor.propTypes = propTypes;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport styled from 'styled-components';\nimport Button from '@splunk/react-ui/Button';\nimport ArrowsRectangularDouble from '@splunk/react-icons/ArrowsRectangularDouble';\n\nconst AddStopWrapper = styled.div`\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n`;\n\nconst AddStopButtonWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n`;\n\nconst ReverseStopWrapper = styled.div`\n display: flex;\n`;\n\nconst ButtonStyle = {\n marginRight: '12px',\n};\n\nconst reverseIcon = <ArrowsRectangularDouble />;\n\nconst AddAndReverseStops = ({\n disableAddStops = false,\n handleAddStop,\n handleReverse,\n}: {\n disableAddStops: boolean;\n handleAddStop: () => void;\n handleReverse: () => void;\n}): React.ReactElement => {\n return (\n <AddStopWrapper>\n <ReverseStopWrapper>\n <Button\n data-test=\"reverse-stops-button\"\n icon={reverseIcon}\n style={ButtonStyle}\n onClick={handleReverse}\n />\n </ReverseStopWrapper>\n <AddStopButtonWrapper>\n <Button\n data-test=\"add-stop-button\"\n appearance=\"secondary\"\n label={`+ ${_('Add stop')}`}\n disabled={disableAddStops}\n onClick={handleAddStop}\n />\n </AddStopButtonWrapper>\n </AddStopWrapper>\n );\n};\n\nAddAndReverseStops.propTypes = {\n disableAddStops: T.bool,\n handleAddStop: T.func,\n handleReverse: T.func,\n};\n\nexport default AddAndReverseStops;\n","import * as React from 'react';\nimport Color, { defaultPalette } from '@splunk/react-ui/Color';\n\ninterface GradientColorProps {\n color: string;\n colorIndex: number;\n palette: string[];\n onChange: (payload: { colorIndex: number; value: string }) => void;\n}\n\nconst GradientColor: React.FunctionComponent<GradientColorProps> = ({\n color,\n colorIndex,\n palette,\n onChange,\n}) => {\n const handleColorChange = React.useCallback(\n ({ value }: { value: string }): void => {\n if (\n value == null ||\n value === '' ||\n value.toLowerCase() === 'n/a' ||\n value.toLowerCase() === 'null'\n ) {\n return; // disallow n/a, null, or empty\n }\n onChange({ colorIndex, value });\n },\n [colorIndex, onChange]\n );\n\n return (\n <Color\n data-test={`gradient-color-${color}`}\n value={color}\n palette={palette || [...defaultPalette, 'transparent']}\n onChange={handleColorChange}\n hideInput\n />\n );\n};\n\nexport default GradientColor;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport type { BasePreviewProps } from '../../../interfaces/BasePreviewProps';\nimport type { GradientConfig } from './gradientUtils';\nimport ArrowLayer from '../../../shared/ArrowLayer';\nimport PreviewWrapper from '../../../shared/PreviewWrapper';\n\n// Simple luminance calculation for hex colors\nfunction getLuminance(hex: string): number {\n let c = hex.replace('#', '');\n if (c.length === 3)\n c = c\n .split('')\n .map(x => x + x)\n .join('');\n const r = parseInt(c.substring(0, 2), 16) / 255;\n const g = parseInt(c.substring(2, 4), 16) / 255;\n const b = parseInt(c.substring(4, 6), 16) / 255;\n // Standard luminance formula\n return 0.299 * r + 0.587 * g + 0.114 * b;\n}\n\ninterface GradientPreviewProps extends BasePreviewProps {\n config: GradientConfig;\n}\n\nconst GradientPreview: React.FunctionComponent<GradientPreviewProps> = ({ config }) => {\n // Only renders once per test, as expected.\n const { colors = [] } = config || {};\n const gradientString = `linear-gradient(90deg, ${colors.join(', ')})`;\n\n // Calculate luminance for the first and last color for the arrows\n const firstColor = colors && colors.length > 0 ? colors[0] : '#fff';\n const lastColor = colors && colors.length > 1 ? colors[colors.length - 1] : firstColor;\n const luminanceFirst = getLuminance(firstColor);\n const luminanceLast = getLuminance(lastColor);\n const arrowDownColor = luminanceFirst > 0.5 ? '#000' : '#fff';\n const arrowUpColor = luminanceLast > 0.5 ? '#000' : '#fff';\n\n return (\n <PreviewWrapper>\n <ArrowLayer colorDown={arrowDownColor} colorUp={arrowUpColor} />\n <div\n data-test=\"gradient-color-preview\"\n style={{\n width: '100%',\n height: 18,\n borderRadius: 4,\n background: gradientString,\n }}\n />\n </PreviewWrapper>\n );\n};\n\nGradientPreview.propTypes = {\n config: T.any.isRequired,\n};\n\nexport default GradientPreview;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport variables from '@splunk/themes/variables';\nimport Text from '@splunk/react-ui/Text';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport ControlGroup from '@splunk/react-ui/ControlGroup';\nimport Color from '@splunk/react-ui/Color';\n\nconst StyledControlGroup = styled(ControlGroup)`\n margin-bottom: 16px;\n width: 100%;\n`;\n\nconst TextColorContainer = styled.div`\n display: flex;\n align-items: stretch;\n width: 100%;\n position: relative;\n flex: 1 1 0%;\n`;\n\nconst TextColorWrapper = styled.div`\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n position: relative;\n`;\n\nconst SwatchWrapper = styled.div`\n display: flex;\n align-items: stretch;\n height: 32px;\n flex: 0 0 32px;\n width: 32px;\n min-width: 32px;\n max-width: 32px;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n`;\n\nconst AutoSwatch = styled.div<{ color?: string; $isAuto?: boolean }>`\n width: 32px;\n height: 32px;\n border: 1px solid ${variables.borderColor};\n border-right: none;\n background: linear-gradient(135deg, #fff 50%, #000 50%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-sizing: border-box;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n`;\n\nconst StyledText = styled(Text).attrs(({ name }) => ({\n 'data-test': name,\n}))`\n max-height: ${variables.inputHeight};\n width: 100%;\n min-width: 0;\n flex: 1 1 0%;\n border-radius: 0 4px 4px 0;\n border: 1px solid ${variables.borderColor};\n border-left: none;\n background: transparent;\n color: ${variables.contentColorActive};\n font-size: 14px;\n padding: 0 12px;\n height: 32px;\n outline: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n`;\n\nconst SwatchButton = styled.button`\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n cursor: pointer;\n outline: none;\n display: flex;\n align-items: stretch;\n height: 32px;\n`;\n\nconst ClearButton = styled.button`\n background: none;\n border: none;\n color: ${variables.contentColorActive};\n font-size: 18px;\n cursor: pointer;\n position: absolute;\n right: 0;\n top: 0;\n height: 32px;\n width: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n /* Remove margin-left and margin-right to avoid shifting layout */\n padding: 0;\n`;\n\nconst AutoTextDisplay = styled.div`\n display: flex;\n align-items: center;\n padding: 0 12px;\n height: 32px;\n font-size: 14px;\n color: ${variables.contentColorActive};\n background: transparent;\n border: 1px solid ${variables.borderColor};\n border-left: none;\n border-radius: 0 4px 4px 0;\n min-width: 0;\n flex: 1 1 0%;\n box-sizing: border-box;\n`;\n\nconst AUTO_OPTION = 'auto';\nconst DEFAULT_PALETTE_COLOR = '#ffffff';\n\ninterface GradientTextColorProps {\n textColor: string;\n onTextColorChange: (color: string) => void;\n}\n\nconst GradientTextColor: React.FunctionComponent<GradientTextColorProps> = ({\n textColor,\n onTextColorChange,\n}) => {\n const [isAuto, setIsAuto] = React.useState(!textColor || textColor === AUTO_OPTION);\n const [color, setColor] = React.useState(isAuto ? '' : textColor || '');\n const colorRef = React.useRef<HTMLButtonElement | null>(null);\n\n React.useEffect(() => {\n setIsAuto(!textColor || textColor === AUTO_OPTION);\n setColor(!textColor || textColor === AUTO_OPTION ? '' : textColor);\n }, [textColor]);\n\n // Handle color swatch or color picker change\n const handleColorChange = React.useCallback(\n data => {\n const value = data?.value || '';\n if (value === AUTO_OPTION) {\n setIsAuto(true);\n setColor('');\n onTextColorChange(AUTO_OPTION);\n } else {\n setIsAuto(false);\n setColor(value);\n onTextColorChange(value);\n }\n },\n [onTextColorChange]\n );\n\n // Handle text input change\n const handleInputChange = React.useCallback(\n e => {\n const val = e.target.value;\n setColor(val);\n setIsAuto(false);\n onTextColorChange(val);\n },\n [onTextColorChange]\n );\n\n // Handle key press for text input\n const handleKeyPress = React.useCallback(\n event => {\n if (event.key === 'Escape') {\n setColor(textColor || '');\n }\n },\n [textColor]\n );\n\n // Handle clear button\n const handleClear = React.useCallback(() => {\n setColor('');\n setIsAuto(true);\n onTextColorChange(AUTO_OPTION);\n }, [onTextColorChange]);\n\n // When switching from auto to color, focus the color swatch\n React.useEffect(() => {\n if (!isAuto && colorRef.current) {\n colorRef.current.focus();\n }\n }, [isAuto]);\n\n return (\n <StyledControlGroup\n label={_('Static text color')}\n tooltip={_('Auto will choose black or white for text color to get more contrast')}\n style={{ width: '100%' }}\n >\n <TextColorContainer>\n {isAuto ? (\n <TextColorWrapper>\n <SwatchWrapper>\n <SwatchButton\n type=\"button\"\n aria-label={_('Choose text color')}\n onClick={() => {\n setIsAuto(false);\n setColor(DEFAULT_PALETTE_COLOR);\n onTextColorChange(DEFAULT_PALETTE_COLOR);\n }}\n tabIndex={0}\n >\n <AutoSwatch />\n </SwatchButton>\n </SwatchWrapper>\n <AutoTextDisplay data-test=\"gradient-text-color-auto\">{_('Auto')}</AutoTextDisplay>\n </TextColorWrapper>\n ) : (\n <TextColorWrapper>\n <SwatchWrapper>\n <Color\n key=\"gradient-text-color-editor\"\n value={color || ''}\n onChange={handleColorChange}\n hideInput\n append\n />\n </SwatchWrapper>\n <StyledText\n name=\"gradient-text-color-input\"\n value={color}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n />\n\n <ClearButton\n type=\"button\"\n aria-label={_('Clear text color')}\n onClick={handleClear}\n tabIndex={0}\n >\n ×\n </ClearButton>\n </TextColorWrapper>\n )}\n </TextColorContainer>\n </StyledControlGroup>\n );\n};\n\nGradientTextColor.propTypes = {\n textColor: T.string.isRequired,\n onTextColorChange: T.func.isRequired,\n};\n\nexport default GradientTextColor;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { variables } from '@splunk/themes';\nimport { addCustomGradientStop, addPaletteGradientStop } from './gradientUtils';\nimport type { GradientConfig as GradientConfigType } from './gradientUtils';\nimport type { BaseEditorProps } from '../../../interfaces/BaseEditorProps';\nimport AddAndReverseStops from './AddAndReverseStops';\nimport GradientColor from './GradientColor';\nimport GradientTextColor from './GradientTextColor';\nimport RemoveStop from './RemoveStop';\n\nconst GradientValueConfigurerWrapper = styled.div`\n padding-top: 10px;\n`;\n\nconst GradientsWrapper = styled.div`\n display: flex;\n flex-direction: column-reverse;\n`;\n\nconst GradientEntry = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'gradient-entry-row',\n}))`\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-bottom: 10px;\n justify-content: space-between;\n`;\n\nconst GradientLeft = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst GradientLabel = styled.div`\n margin-left: 8px;\n color: ${variables.contentColorMuted};\n`;\n\ninterface GradientValueConfigurerProps extends BaseEditorProps {\n showStaticTextColor?: boolean;\n value: GradientConfigType;\n onChange: (payload: { colors: string[]; textColor?: string }) => void;\n isReversed?: boolean;\n swatchColors?: string[];\n setIsReversed?: (isReversed: boolean) => void;\n selectedColors: string[];\n isSwatchCustomized?: boolean;\n disableAddStops?: boolean; // <-- add this prop\n}\n\nconst GradientValueConfigurer: React.FC<GradientValueConfigurerProps> = props => {\n const {\n value,\n onChange,\n showStaticTextColor,\n isReversed,\n swatchColors,\n setIsReversed,\n selectedColors,\n isSwatchCustomized,\n disableAddStops: disableAddStopsProp,\n } = props;\n const textColor = value?.textColor;\n // state to track if addStops should be disabled\n const [disableAddStops, setDisableAddStops] = React.useState(false);\n // state to track interpolated vs chosen colors for custom state\n const [isCustomSelected, setIsCustomSelected] = React.useState(selectedColors.map(() => true));\n\n React.useEffect(() => {\n if (typeof disableAddStopsProp === 'boolean') {\n setDisableAddStops(disableAddStopsProp);\n return;\n }\n const shouldDisable = !isSwatchCustomized ? selectedColors.length >= swatchColors?.length : false;\n setDisableAddStops(shouldDisable);\n }, [isReversed, selectedColors, isSwatchCustomized, swatchColors?.length, disableAddStopsProp]);\n\n const handleTextColorChange = React.useCallback(\n newTextColor => {\n const payload: any = { colors: selectedColors, textColor: newTextColor };\n onChange(payload);\n },\n [selectedColors, onChange]\n );\n\n const handleRemoveStop = React.useCallback(\n (indexToRemove: number) => {\n // remove the color at the specified index\n const newColors = [...selectedColors].filter((unused, idx) => idx !== indexToRemove);\n const payload: any = { colors: newColors };\n onChange(payload);\n // remove the custom item\n if (isSwatchCustomized) {\n const newIsCustomSelected = isCustomSelected.filter((unused, idx) => idx !== indexToRemove);\n setIsCustomSelected(newIsCustomSelected);\n }\n },\n [selectedColors, onChange, isSwatchCustomized, isCustomSelected]\n );\n\n const handleAddStop = React.useCallback(() => {\n if (selectedColors.length === 1) {\n // If only one color, add black as the highest value\n const newColors = [selectedColors[0], '#000000'];\n const payload: any = { colors: newColors };\n onChange(payload);\n return;\n }\n if (!isSwatchCustomized) {\n // prevent adding more stops than swatchColors allows\n if (selectedColors.length >= swatchColors?.length) {\n setDisableAddStops(true);\n return;\n }\n const newColors = addPaletteGradientStop(swatchColors, selectedColors, isReversed);\n if (newColors) {\n const payload: any = { colors: newColors };\n onChange(payload);\n if (newColors.length >= swatchColors?.length) {\n setDisableAddStops(true);\n }\n }\n return;\n }\n // fallback to custom interpolation if not using a palette or palette is null/undefined\n const newColors = addCustomGradientStop(selectedColors, isCustomSelected, setIsCustomSelected);\n const payload: any = { colors: newColors };\n onChange(payload);\n }, [isSwatchCustomized, selectedColors, isCustomSelected, onChange, swatchColors, isReversed]);\n\n const handleReverse = React.useCallback(() => {\n const reversedColors = [...selectedColors].reverse();\n const payload: any = { colors: reversedColors };\n onChange(payload);\n setIsReversed?.(!isReversed);\n if (isSwatchCustomized) {\n const newIsCustomSelected = [...isCustomSelected].reverse();\n setIsCustomSelected(newIsCustomSelected);\n }\n }, [selectedColors, onChange, setIsReversed, isReversed, isSwatchCustomized, isCustomSelected]);\n\n const handleColorChange = React.useCallback(\n (payload: { colorIndex: number; value: string }): void => {\n const { colorIndex, value: newColor } = payload;\n const newSelectedColors = [...selectedColors];\n newSelectedColors[colorIndex] = newColor;\n onChange({ colors: newSelectedColors });\n if (isSwatchCustomized) {\n const newIsCustomSelected = [...isCustomSelected];\n newIsCustomSelected[colorIndex] = true;\n setIsCustomSelected(newIsCustomSelected);\n }\n },\n [isCustomSelected, isSwatchCustomized, onChange, selectedColors]\n );\n\n return (\n <GradientValueConfigurerWrapper data-test=\"gradient-configurer\">\n <AddAndReverseStops\n data-test=\"add-reverse-stops\"\n disableAddStops={disableAddStops}\n handleAddStop={handleAddStop}\n handleReverse={handleReverse}\n />\n <GradientsWrapper data-test=\"gradients-wrapper\">\n {selectedColors.map((color: string, i: number): React.ReactElement => {\n // render from highest (last) to lowest (first)\n let label = '';\n if (i === 0) label = _(`Lowest value`);\n else if (i === selectedColors.length - 1) label = _(`Highest value`);\n const canRemove = selectedColors.length > 2 && i !== 0 && i !== selectedColors.length - 1;\n // Use both color and index in the key to avoid duplicate key issues with duplicate colors\n return (\n // eslint-disable-next-line react/no-array-index-key\n <GradientEntry\n key={`gradient-color-${color.replace('#', '')}`}\n data-test={`gradient-entry-row-${i}`}\n >\n <GradientLeft data-test={`gradient-left-${i}`}>\n <GradientColor\n data-test={`gradient-color-${color}`}\n color={color}\n colorIndex={i}\n palette={isSwatchCustomized ? undefined : swatchColors}\n onChange={handleColorChange}\n />\n <GradientLabel data-test={`gradient-label-${i}`}>{label}</GradientLabel>\n </GradientLeft>\n {canRemove && (\n <RemoveStop\n data-test={`gradient-remove-button-${i}`}\n colorIndex={i}\n onRemove={() => handleRemoveStop(i)}\n />\n )}\n </GradientEntry>\n );\n })}\n </GradientsWrapper>\n {showStaticTextColor && (\n <GradientEntry data-test=\"gradient-text-color-entry\">\n <GradientTextColor\n data-test=\"gradient-text-color\"\n textColor={textColor}\n onTextColorChange={handleTextColorChange}\n />\n </GradientEntry>\n )}\n </GradientValueConfigurerWrapper>\n );\n};\n\nGradientValueConfigurer.propTypes = {\n value: T.any,\n onChange: T.func,\n showStaticTextColor: T.bool,\n};\n\nexport default GradientValueConfigurer;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport Button, { ButtonProps } from '@splunk/react-ui/Button';\nimport CloseIcon from '@splunk/react-icons/Cross';\nimport { variables } from '@splunk/themes';\n\nconst RemoveStopWrapper = styled.div`\n width: 32px;\n height: 32px;\n align-self: flex-end;\n`;\n\nconst RemoveStopButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nconst RemoveStop = ({\n colorIndex,\n onRemove,\n}: {\n colorIndex: number;\n onRemove: (colorIdx: number) => void;\n}): React.ReactElement => {\n const handleOnRemove = React.useCallback((): void => onRemove(colorIndex), [colorIndex, onRemove]);\n\n return (\n <RemoveStopWrapper>\n <RemoveStopButton\n data-test=\"gradient-remove-button\"\n icon={<CloseIcon />}\n appearance=\"subtle\"\n onClick={handleOnRemove}\n />\n </RemoveStopWrapper>\n );\n};\n\nRemoveStop.propTypes = {\n onRemove: T.func,\n};\n\nexport default RemoveStop;\n","import palettes from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport type { PalettesConfig } from '../../../interfaces/PalettesConfig';\nimport type { Palettes } from '../Palettes/paletteUtils';\n\nexport interface GradientConfig {\n colors: string[];\n stops?: number[];\n textColor?: string;\n}\n\nexport const defaultDarkGradientConfig: GradientConfig = {\n colors: [\n palettes.DARK_COLORS.sequential.swatches[1][0],\n palettes.DARK_COLORS.sequential.swatches[1][palettes.DARK_COLORS.sequential.swatches[1].length - 1],\n ],\n};\n\nexport const defaultLightGradientConfig: GradientConfig = {\n colors: [\n palettes.LIGHT_COLORS.sequential.swatches[1][0],\n palettes.LIGHT_COLORS.sequential.swatches[1][palettes.LIGHT_COLORS.sequential.swatches[1].length - 1],\n ],\n};\n\n/**\n * Creates a default palette configuration with proper fallbacks\n * paletteTheme: DARK_COLORS || providedPaletteTheme\n * paletteEntry: {\n * type: 'sequential' || providedType\n * index: 1 || providedIndex\n * }\n */\nexport const createDefaultPalettesConfig = (providedConfig?: PalettesConfig): PalettesConfig => {\n const paletteTheme = providedConfig?.paletteTheme || 'DARK_COLORS';\n const type = providedConfig?.paletteEntry?.type || 'sequential';\n const index = providedConfig?.paletteEntry?.index ?? 1;\n\n return {\n paletteTheme,\n paletteEntry: {\n type,\n index,\n },\n };\n};\n\n/**\n * Creates a gradient config based on the provided palettes configuration\n * If only paletteTheme is provided, uses the 2nd item (index 1) in the sequential type\n * If all items are provided, uses that specific configuration\n * For gradients, only uses the first and last colors from the selected palette\n */\nexport const createGradientConfigFromPalettes = (\n palettesConfig?: PalettesConfig,\n showTextColor?: boolean,\n textColor?: string\n): GradientConfig => {\n const defaultedConfig = createDefaultPalettesConfig(palettesConfig);\n const { paletteTheme, paletteEntry } = defaultedConfig;\n\n const paletteColors =\n palettes[paletteTheme]?.[paletteEntry.type]?.swatches?.[paletteEntry.index] ||\n defaultDarkGradientConfig.colors;\n\n // For gradients, only use the first and last colors from the palette\n const colors =\n paletteColors.length >= 2\n ? [paletteColors[0], paletteColors[paletteColors.length - 1]]\n : paletteColors;\n\n if (!showTextColor) {\n return {\n colors,\n };\n }\n return {\n colors,\n textColor: textColor || 'auto',\n };\n};\n// Find the best position to insert the new color (largest gap)\n\n/**\n * Interpolates between two hex colors\n * @param color1 - First hex color (e.g., \"#FF0000\")\n * @param color2 - Second hex color (e.g., \"#00FF00\")\n * @param factor - Interpolation factor between 0 and 1\n * @returns Interpolated hex color\n */\nexport const interpolateColor = (color1: string, color2: string, factor: number): string => {\n // Remove # and convert to RGB\n const hex1 = color1.replace('#', '');\n const hex2 = color2.replace('#', '');\n\n const r1 = parseInt(hex1.substring(0, 2), 16);\n const g1 = parseInt(hex1.substring(2, 4), 16);\n const b1 = parseInt(hex1.substring(4, 6), 16);\n\n const r2 = parseInt(hex2.substring(0, 2), 16);\n const g2 = parseInt(hex2.substring(2, 4), 16);\n const b2 = parseInt(hex2.substring(4, 6), 16);\n\n // Interpolate each channel\n const r = Math.round(r1 + factor * (r2 - r1));\n const g = Math.round(g1 + factor * (g2 - g1));\n const b = Math.round(b1 + factor * (b2 - b1));\n\n // Convert back to hex\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\nexport const addCustomGradientStop = (\n colors: string[],\n isCustomSelected: boolean[],\n setIsCustomSelected: (selected: boolean[]) => void\n): string[] => {\n if (colors.length < 2) {\n return colors;\n }\n\n // find all indices where isCustomSelected is true\n const customIndices = isCustomSelected.map((v, i) => (v ? i : -1)).filter(i => i !== -1);\n\n // if there are less than 2 custom points, fallback to default behavior (interpolate before highest)\n if (customIndices.length < 2) {\n const highestColor = colors[colors.length - 1];\n const beforeHighestColor = colors[colors.length - 2];\n const newColor = interpolateColor(beforeHighestColor, highestColor, 0.5);\n const newColors = [...colors.slice(0, colors.length - 1), newColor, highestColor];\n const newIsCustomSelected = [\n ...isCustomSelected.slice(0, isCustomSelected.length - 1),\n false,\n isCustomSelected[isCustomSelected.length - 1] ?? false,\n ];\n setIsCustomSelected(newIsCustomSelected);\n return newColors;\n }\n\n // for each pair of custom indices, interpolate all falses between them\n let newColors = [...colors];\n let newIsCustomSelected = [...isCustomSelected];\n for (let i = 0; i < customIndices.length - 1; i += 1) {\n const startIdx = customIndices[i];\n const endIdx = customIndices[i + 1];\n const segmentLength = endIdx - startIdx;\n\n // only interpolate if there are any falses between startIdx and endIdx\n if (segmentLength > 1) {\n const colorA = colors[startIdx];\n const colorB = colors[endIdx];\n\n // Count how many falses are between startIdx and endIdx\n const falseIndices: number[] = [];\n for (let j = startIdx + 1; j < endIdx; j += 1) {\n if (!isCustomSelected[j]) {\n falseIndices.push(j);\n }\n }\n\n // If there are any falses, recalculate their colors\n if (falseIndices.length > 0) {\n for (let m = 0; m < falseIndices.length; m += 1) {\n const idx = falseIndices[m];\n // Evenly space the interpolation for each false\n const t = (idx - startIdx) / (endIdx - startIdx);\n newColors[idx] = interpolateColor(colorA, colorB, t);\n }\n }\n }\n }\n\n // Always insert a new interpolated color before the last color\n const highestColor = newColors[newColors.length - 1];\n const beforeHighestColor = newColors[newColors.length - 2];\n const newColor = interpolateColor(beforeHighestColor, highestColor, 0.5);\n newColors = [...newColors.slice(0, newColors.length - 1), newColor, highestColor];\n newIsCustomSelected = [\n ...newIsCustomSelected.slice(0, newIsCustomSelected.length - 1),\n false,\n newIsCustomSelected[newIsCustomSelected.length - 1] ?? false,\n ];\n\n setIsCustomSelected(newIsCustomSelected);\n return newColors;\n};\n\n/**\n * Adds a palette color at the specified insert index.\n * @param swatch The full palette swatch array.\n * @param selectedColors The current array of selected colors.\n * @param isReversed If true, reverse the swatch before picking the color.\n * @returns The new colors array with the palette color inserted.\n */\nexport const addPaletteGradientStop = (\n swatch: string[],\n selectedColors: string[],\n isReversed: boolean\n): string[] => {\n const insertIndex = selectedColors.length - 1; // Insert before the last color\n // Only allow up to insertIndex <= 5\n if (insertIndex > 5) {\n return selectedColors;\n }\n const palette = isReversed ? [...swatch].reverse() : swatch;\n // Clamp insertIndex to valid palette range\n const idx = Math.max(1, Math.min(insertIndex, palette.length - 2));\n const colorToAdd = palette[idx];\n return [...selectedColors.slice(0, insertIndex), colorToAdd, ...selectedColors.slice(insertIndex)];\n};\n\n// Find a palette match, considering both normal and reversed order\nexport const findMatchingPaletteGradient = (\n colorArr: string[],\n paletteObj: Palettes\n): {\n paletteTheme: string;\n paletteEntry: { type: string; index: number };\n isReversed: boolean;\n} | null => {\n if (\n !Array.isArray(colorArr) ||\n colorArr.length < 2 ||\n !paletteObj ||\n typeof paletteObj !== 'object' ||\n !paletteObj.DARK_COLORS ||\n !paletteObj.LIGHT_COLORS\n ) {\n return null;\n }\n const themes = ['DARK_COLORS', 'LIGHT_COLORS'];\n const candidates: Array<{\n paletteTheme: string;\n paletteEntry: { type: string; index: number };\n isReversed: boolean;\n swatch: string[];\n }> = [];\n themes.forEach(theme => {\n const entries = Object.entries(paletteObj[theme] || {})\n .filter(([type]) => type !== '_meta')\n .flatMap(([type, { swatches }]) =>\n swatches.map((swatch: string[], i: number) => ({ type, swatch, index: i }))\n );\n entries.forEach(({ type, swatch, index }) => {\n // Skip if the color array has more colors than the swatch can provide\n if (colorArr.length > swatch.length) {\n return;\n }\n\n if (\n swatch.length >= 2 &&\n swatch[0].trim().toLowerCase() === colorArr[0].trim().toLowerCase() &&\n swatch[swatch.length - 1].trim().toLowerCase() ===\n colorArr[colorArr.length - 1].trim().toLowerCase()\n ) {\n candidates.push({\n paletteTheme: theme,\n paletteEntry: { type, index },\n isReversed: false,\n swatch,\n });\n } else if (\n swatch.length >= 2 &&\n swatch[0].trim().toLowerCase() === colorArr[colorArr.length - 1].trim().toLowerCase() &&\n swatch[swatch.length - 1].trim().toLowerCase() === colorArr[0].trim().toLowerCase()\n ) {\n candidates.push({\n paletteTheme: theme,\n paletteEntry: { type, index },\n isReversed: true,\n swatch,\n });\n }\n });\n });\n // If more than 2 colors, prefer full match (middle colors can be any order)\n if (colorArr.length > 2 && candidates.length > 0) {\n const fullMatch = candidates.find(({ swatch, isReversed }) => {\n if (swatch.length < colorArr.length) return false;\n const compareArr = isReversed ? [...swatch].reverse() : swatch;\n // Endpoints must match\n if (\n colorArr[0].trim().toLowerCase() !== compareArr[0].trim().toLowerCase() ||\n colorArr[colorArr.length - 1].trim().toLowerCase() !==\n compareArr[compareArr.length - 1].trim().toLowerCase()\n ) {\n return false;\n }\n // Middle colors can be any order\n const inputMiddle = colorArr.slice(1, colorArr.length - 1).map(c => c.trim().toLowerCase());\n const swatchMiddle = compareArr.slice(1, colorArr.length - 1).map(c => c.trim().toLowerCase());\n return inputMiddle.every(c => swatchMiddle.includes(c));\n });\n if (fullMatch) {\n return {\n paletteTheme: fullMatch.paletteTheme,\n paletteEntry: fullMatch.paletteEntry,\n isReversed: fullMatch.isReversed,\n };\n }\n }\n // Otherwise, return first high/low match\n if (candidates.length > 0) {\n const first = candidates[0];\n return {\n paletteTheme: first.paletteTheme,\n paletteEntry: first.paletteEntry,\n isReversed: first.isReversed,\n };\n }\n return null;\n};\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport defaultPalettes from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport type { BaseEditorProps } from '../../interfaces/BaseEditorProps';\nimport type { PalettesConfig } from '../../interfaces/PalettesConfig';\nimport PalettesConfigurer from './Palettes/PalettesConfigurer';\nimport { findMatchingPaletteGradient } from './Gradient/gradientUtils';\nimport type { GradientConfig as GradientConfigType } from './Gradient/gradientUtils';\nimport { getSwatchColorsFromPalette, hasCustomColors } from './Palettes/paletteUtils';\nimport type { Palettes, PaletteInfo } from './Palettes/paletteUtils';\nimport GradientValueConfigurer from './Gradient/GradientValueConfigurer';\n\ninterface GradientEditorProps extends BaseEditorProps {\n defaultPalettesConfig?: PalettesConfig;\n showStaticTextColor?: boolean;\n value: GradientConfigType;\n palettes?: Palettes;\n selectedDataSelector?: string;\n onChange: (event: React.SyntheticEvent, name: string, value: GradientConfigType) => void;\n}\n\nexport const GradientEditor: React.FunctionComponent<GradientEditorProps> = ({\n defaultPalettesConfig = { paletteTheme: 'DARK_COLORS', paletteEntry: { type: 'sequential', index: 1 } },\n onChange,\n palettes = defaultPalettes,\n showStaticTextColor = false,\n selectedDataSelector,\n value = { colors: ['#252214', '#b846bb'], textColor: 'auto' },\n}) => {\n const { colors, textColor } = value;\n // Get initial palette config and reversed state from findMatchingPaletteGradient\n let initialPaletteTheme: string | null = null;\n let initialPaletteEntry: PaletteInfo | null = null;\n let initialIsReversed: boolean | undefined;\n if (colors && colors.length > 1) {\n const match = findMatchingPaletteGradient(colors, palettes);\n if (match) {\n initialPaletteTheme = match.paletteTheme;\n initialPaletteEntry = match.paletteEntry;\n initialIsReversed = match.isReversed;\n }\n }\n // Fallbacks if no match\n if (!initialPaletteTheme && defaultPalettesConfig?.paletteTheme) {\n initialPaletteTheme = defaultPalettesConfig.paletteTheme;\n }\n if (!initialPaletteEntry && defaultPalettesConfig?.paletteEntry) {\n initialPaletteEntry = defaultPalettesConfig.paletteEntry;\n }\n\n const [palettesConfig, setPalettesConfig] = React.useState<{\n paletteTheme: string;\n paletteEntry: PaletteInfo;\n }>(() => ({\n paletteTheme: initialPaletteTheme,\n paletteEntry: initialPaletteEntry,\n }));\n const selectedPaletteTheme = palettesConfig?.paletteTheme ?? defaultPalettesConfig.paletteTheme;\n const selectedPaletteEntry = palettesConfig?.paletteEntry ?? defaultPalettesConfig.paletteEntry;\n\n // Only get swatch colors if palette is selected\n const currentSwatchColors =\n selectedPaletteTheme && selectedPaletteEntry\n ? getSwatchColorsFromPalette({\n palettes,\n paletteInfo: selectedPaletteEntry,\n paletteTheme: selectedPaletteTheme,\n })\n : [];\n\n const isSwatchCustomized = hasCustomColors({\n currentSwatchColors,\n selectedColors: colors,\n });\n\n // Limit custom colors to MAX_CUSTOM_COLORS\n const MAX_CUSTOM_COLORS = 7;\n const limitedColors =\n isSwatchCustomized && colors.length > MAX_CUSTOM_COLORS ? colors.slice(0, MAX_CUSTOM_COLORS) : colors;\n\n // Disable add stop if custom and at max\n const disableAddStops =\n (isSwatchCustomized && limitedColors.length >= MAX_CUSTOM_COLORS) ||\n (!isSwatchCustomized && limitedColors.length >= currentSwatchColors.length);\n\n const [isReversed, setIsReversed] = React.useState(initialIsReversed || false);\n\n // Always align to palette: lowest at index 0, highest at last index\n\n type OnChangePaletteTheme = (newPaletteTheme: string) => void;\n\n const handleOnGradientValueChange = React.useCallback(\n (payload: { colors?: string[]; textColor?: string }): void => {\n // Defensive: always pass a valid colors array\n const result: { colors: string[]; textColor?: string } = {\n colors: payload?.colors || colors,\n };\n if (showStaticTextColor) {\n result.textColor = payload.textColor || textColor;\n }\n onChange(null, null, result);\n },\n [colors, showStaticTextColor, onChange, textColor]\n );\n\n const onChangePaletteTheme: OnChangePaletteTheme = React.useCallback(\n (newPaletteTheme: string): void => {\n if (!selectedPaletteEntry) return;\n let swatch: string[] = getSwatchColorsFromPalette({\n palettes,\n paletteInfo: selectedPaletteEntry,\n paletteTheme: newPaletteTheme,\n });\n if (isReversed) {\n swatch = [...swatch].reverse();\n }\n let newColors: string[] = [];\n if (isSwatchCustomized && colors.length > 7) {\n newColors = swatch.slice();\n } else {\n const count: number = colors.length;\n if (count === 1) {\n newColors = [swatch[swatch.length - 1]];\n } else if (count === 2) {\n newColors = [swatch[0], swatch[swatch.length - 1]];\n } else if (count > 2) {\n newColors = [swatch[0]];\n for (let i = 1; i < count - 1; i += 1) {\n newColors.push(swatch[i]);\n }\n newColors.push(swatch[swatch.length - 1]);\n }\n }\n setPalettesConfig(prev => ({ ...prev, paletteTheme: newPaletteTheme }));\n handleOnGradientValueChange({ colors: newColors });\n },\n [selectedPaletteEntry, palettes, isReversed, handleOnGradientValueChange, isSwatchCustomized, colors]\n );\n\n const onPaletteChange = React.useCallback(\n (paletteInfo: PaletteInfo | null) => {\n if (!paletteInfo) {\n setPalettesConfig({ paletteTheme: null, paletteEntry: null });\n setIsReversed(false);\n return;\n }\n const swatch =\n selectedPaletteTheme && paletteInfo\n ? getSwatchColorsFromPalette({\n palettes,\n paletteInfo,\n paletteTheme: selectedPaletteTheme,\n })\n : [];\n const count = colors.length;\n let newColors: string[] = [];\n if (isSwatchCustomized && colors.length > 7) {\n newColors = swatch.slice();\n } else if (count === 1) {\n newColors = [swatch[swatch.length - 1]];\n } else if (count === 2) {\n newColors = [swatch[0], swatch[swatch.length - 1]];\n } else if (count > 2) {\n newColors = [swatch[0]];\n for (let i = 1; i < count - 1; i += 1) {\n newColors.push(swatch[i]);\n }\n newColors.push(swatch[swatch.length - 1]);\n }\n setPalettesConfig({ paletteTheme: selectedPaletteTheme, paletteEntry: paletteInfo });\n setIsReversed(false);\n const payload: any = { colors: newColors };\n if (showStaticTextColor) {\n payload.textColor = textColor;\n }\n handleOnGradientValueChange(payload);\n },\n [\n selectedPaletteTheme,\n palettes,\n showStaticTextColor,\n handleOnGradientValueChange,\n textColor,\n isSwatchCustomized,\n colors,\n ]\n );\n // if the user changes the dataSelector (e.g. from major to trend) for something like background coloring,\n // reinitialize the palette config and the initial range values + colors using the newly selected formatter config (value)\n React.useEffect((): void => {\n setPalettesConfig(findMatchingPaletteGradient(colors, palettes));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedDataSelector]);\n\n return (\n <>\n <PalettesConfigurer\n isSwatchCustomized={isSwatchCustomized}\n isReversed={isReversed}\n onChangePaletteTheme={onChangePaletteTheme}\n onPaletteChange={onPaletteChange}\n palettes={palettes}\n selectedPaletteInfo={selectedPaletteEntry}\n selectedPaletteTheme={selectedPaletteTheme}\n />\n <GradientValueConfigurer\n isSwatchCustomized={isSwatchCustomized}\n isReversed={isReversed}\n setIsReversed={setIsReversed}\n onChange={handleOnGradientValueChange}\n value={value}\n swatchColors={currentSwatchColors}\n selectedColors={limitedColors}\n name=\"GradientValueConfigurer\"\n showStaticTextColor={showStaticTextColor}\n disableAddStops={disableAddStops}\n />\n </>\n );\n};\n\nGradientEditor.propTypes = {\n value: T.any,\n onChange: T.func,\n palettes: T.shape({\n _meta: T.any.isRequired,\n }),\n showStaticTextColor: T.bool,\n};\n\nexport default GradientEditor;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport styled from 'styled-components';\nimport Button from '@splunk/react-ui/Button';\nimport ArrowsRectangularDouble from '@splunk/react-icons/ArrowsRectangularDouble';\n\nconst AddMatchWrapper = styled.div`\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n`;\n\nconst AddMatchButtonWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n`;\n\nconst ReverseMatchWrapper = styled.div`\n display: flex;\n`;\n\nconst reverseMatchButtonStyle = { marginRight: '12px' };\n\nconst reverseIcon = <ArrowsRectangularDouble />;\n\nconst AddAndReverseMatches = ({\n disableAddMatches = false,\n handleAddMatch,\n handleReverse,\n}: {\n disableAddMatches: boolean;\n handleAddMatch: () => void;\n handleReverse: () => void;\n}): React.ReactElement => {\n return (\n <AddMatchWrapper>\n <ReverseMatchWrapper>\n <Button\n data-test=\"reverse-matches-button\"\n icon={reverseIcon}\n style={reverseMatchButtonStyle}\n onClick={handleReverse}\n />\n </ReverseMatchWrapper>\n <AddMatchButtonWrapper>\n <Button\n data-test=\"add-match-button\"\n appearance=\"secondary\"\n label={`+ ${_('Add match')}`}\n disabled={disableAddMatches}\n onClick={handleAddMatch}\n />\n </AddMatchButtonWrapper>\n </AddMatchWrapper>\n );\n};\n\nAddAndReverseMatches.propTypes = {\n disableAddMatches: T.bool,\n handleAddMatch: T.func,\n handleReverse: T.func,\n};\n\nexport default AddAndReverseMatches;\n","import * as React from 'react';\nimport Color from '@splunk/react-ui/Color';\n\nconst MatchColor = ({\n color,\n colorIndex,\n onChange,\n palette,\n}: {\n color: string;\n colorIndex: number;\n onChange: (payload: { colorIndex: number; value: string }) => void;\n palette: string[];\n}): React.ReactElement => {\n const handleColorChange = React.useCallback(\n ({ value }): void => onChange({ colorIndex, value }),\n [colorIndex, onChange]\n );\n\n return (\n <Color\n data-test={`match-color-${color}`}\n value={color}\n palette={palette}\n onChange={handleColorChange}\n hideInput // prisma only\n />\n );\n};\n\nexport default MatchColor;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { getNewColors } from '../Palettes/paletteUtils';\nimport AddAndReverseMatches from './AddAndReverseMatches';\n\nimport MatchColor from './MatchColor';\nimport MatchValueText from './MatchValueText';\nimport { isNumeric } from './matchValueUtils';\nimport RemoveMatch from './RemoveMatch';\n\nconst MatchValueConfigurerWrapper = styled.div`\n padding-top: 10px;\n`;\n\nconst MatchesWrapper = styled.div`\n display: flex;\n flex-direction: column-reverse;\n`;\n\nconst MatchEntry = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'match-entry-row',\n}))`\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n`;\n\nconst MatchValueConfigurer = ({\n // while this could be calculated inside the MatchValueConfigurer directly,\n // the palette dropdown also needs to know if the swatch was customized\n // it was more convenient to hoist up customizedColors than recalculating it in the child components\n customizedColors,\n isReversed,\n onChange,\n precedence,\n swatchColors,\n matchValues,\n setIsReversed,\n selectedColors,\n}: {\n customizedColors: boolean;\n isReversed: boolean;\n onChange: (payload: { colors: string[]; matchValues: (string | number)[] }) => void;\n precedence: number[][];\n swatchColors: string[];\n matchValues: (string | number)[];\n setIsReversed: (payload: boolean) => void;\n selectedColors: string[];\n}): React.ReactElement => {\n const handleColorChange = React.useCallback(\n ({ colorIndex, value }): void => {\n const newSelectedColors = [...selectedColors];\n newSelectedColors[colorIndex] = value;\n onChange({ colors: newSelectedColors, matchValues });\n },\n [onChange, matchValues, selectedColors]\n );\n\n const handleAddMatch = React.useCallback((): void => {\n // Can add as many empty matches, per PM discussion, so this is commented.\n // if(matchValues.some(match => match === '')) return;\n const newMatchValues = [...matchValues, ''];\n const newSelectedColors = customizedColors\n ? [...selectedColors, '#000000'] // insert black color as per design if colors are customized\n : getNewColors({\n isReversed,\n // number of colors = number of matches\n numColors: newMatchValues.length,\n precedence,\n swatchColors,\n });\n onChange({ colors: newSelectedColors, matchValues: newMatchValues });\n }, [onChange, matchValues, customizedColors, selectedColors, isReversed, precedence, swatchColors]);\n\n const handleReverse = React.useCallback((): void => {\n const newColors = [...selectedColors];\n newColors.reverse();\n setIsReversed(!isReversed);\n onChange({ colors: newColors, matchValues });\n }, [onChange, matchValues, isReversed, selectedColors, setIsReversed]);\n\n const handleUpdateMatch = React.useCallback(\n (updatedValue, matchIndex): { error: string } => {\n // Evaluates whether the inputted value should be treated as a number for matching.\n const value = isNumeric(updatedValue) ? Number(updatedValue) : updatedValue;\n if (matchValues.includes(value)) {\n return { error: _('Value already exists') };\n }\n const newMatchValues = [...matchValues];\n newMatchValues[matchIndex] = value;\n onChange({ colors: selectedColors, matchValues: newMatchValues });\n return { error: null };\n },\n [onChange, selectedColors, matchValues]\n );\n\n const handleRemoveMatch = React.useCallback(\n (colorIndex: number, matchIndex: number): void => {\n if (matchValues.length > 1) {\n const newMatchValues = [...matchValues];\n newMatchValues.splice(matchIndex, 1);\n\n // check if there are still custom colors after the user removes the current one\n const newSelectedColorsWithCurrentOmitted = [...selectedColors];\n newSelectedColorsWithCurrentOmitted.splice(colorIndex, 1);\n onChange({ colors: newSelectedColorsWithCurrentOmitted, matchValues: newMatchValues });\n }\n },\n [onChange, matchValues, selectedColors]\n );\n\n return (\n <MatchValueConfigurerWrapper>\n <AddAndReverseMatches\n disableAddMatches={selectedColors.length > 6}\n handleAddMatch={handleAddMatch}\n handleReverse={handleReverse}\n />\n <MatchesWrapper>\n {selectedColors.map((color: string, i: number): React.ReactElement => {\n const matchValue = matchValues[i];\n const key = `${color}-${matchValue}-${i}`;\n\n return (\n <MatchEntry key={key}>\n <MatchColor\n color={color}\n colorIndex={i}\n palette={swatchColors}\n onChange={handleColorChange}\n />\n <MatchValueText\n initialValue={matchValue}\n matchValues={matchValues}\n matchIndex={i}\n updateMatch={handleUpdateMatch}\n />\n <RemoveMatch\n colorIndex={i}\n matchIndex={i}\n disabled={matchValues.length < 2}\n onRemove={handleRemoveMatch}\n />\n </MatchEntry>\n );\n })}\n </MatchesWrapper>\n </MatchValueConfigurerWrapper>\n );\n};\n\nMatchValueConfigurer.propTypes = {\n customizedColors: T.bool,\n isReversed: T.bool,\n precedence: T.arrayOf(T.arrayOf(T.number)),\n swatchColors: T.arrayOf(T.string),\n matchValues: T.arrayOf(T.oneOfType([T.string, T.number])),\n setIsReversed: T.func,\n selectedColors: T.arrayOf(T.string),\n};\n\nexport default MatchValueConfigurer;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport Text from '@splunk/react-ui/Text';\nimport variables from '@splunk/themes/variables';\n\nconst MatchTextWrapper = styled.div`\n display: flex;\n flex-grow: 1;\n margin-left: ${variables.spacingMedium};\n`;\n\nconst TextRowWrapper = styled.div`\n flex-grow: 1;\n`;\n\nconst MatchErrorMessage = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'match-value-error',\n}))`\n color: ${variables.contentColorNegative};\n padding-top: 5px;\n font-size: 12px;\n display: block;\n`;\n\nexport const handleUpdateMatch = ({\n matchIndex,\n setError,\n shouldUpdate,\n updateMatch,\n value,\n}: {\n matchIndex: number;\n setError: (payload: string) => void;\n shouldUpdate: boolean;\n updateMatch: (payload: number | string, idx: number) => { error: any };\n value: number | string;\n}): void => {\n if (shouldUpdate) {\n const result = updateMatch(value, matchIndex);\n if (result && result.error) {\n setError(result.error);\n }\n }\n};\n\nconst MatchValueText = ({\n initialValue,\n matchIndex,\n matchValues,\n updateMatch,\n}: {\n initialValue?: number | string;\n matchIndex: number;\n matchValues: (string | number)[];\n updateMatch: (value: number | string, index: number) => { error: string };\n}): React.ReactElement => {\n const [updatedMatchValue, setUpdatedMatchValue] = React.useState(null);\n const [isFocused, setIsFocused] = React.useState(false);\n const [error, setError] = React.useState(null);\n\n const handleOnFocus = React.useCallback((): void => {\n setIsFocused(true);\n }, []);\n\n const handleOnChange = React.useCallback(\n (e, { value }: { e: React.KeyboardEvent<HTMLDivElement>; value: string }): void => {\n setUpdatedMatchValue(value);\n handleUpdateMatch({\n matchIndex,\n setError,\n shouldUpdate: !isFocused,\n updateMatch,\n value,\n });\n },\n [isFocused, matchIndex, updateMatch]\n );\n\n const handleOnBlur = React.useCallback((): void => {\n setIsFocused(false);\n handleUpdateMatch({\n matchIndex,\n setError,\n shouldUpdate: updatedMatchValue != null && updatedMatchValue !== initialValue,\n updateMatch,\n value: updatedMatchValue,\n });\n }, [matchIndex, updatedMatchValue, initialValue, updateMatch]);\n\n const handleOnKeyUp = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>): void =>\n handleUpdateMatch({\n matchIndex,\n setError,\n shouldUpdate:\n e.key === 'Enter' && updatedMatchValue !== null && updatedMatchValue !== initialValue,\n updateMatch,\n value: updatedMatchValue,\n }),\n [matchIndex, updatedMatchValue, initialValue, updateMatch]\n );\n\n // if changes made to match values by editing an adjacent value to address the duplication,\n // clear the error state and persist the currently state value if the current state value would not cause duplication\n React.useEffect((): void => {\n // Added .map since values may be numbers.\n if (error && !matchValues.map(value => `${value}`).includes(updatedMatchValue)) {\n setError(null);\n handleUpdateMatch({\n matchIndex,\n setError,\n shouldUpdate: true,\n updateMatch,\n value: updatedMatchValue,\n });\n }\n }, [updatedMatchValue, error, matchIndex, matchValues, updateMatch]);\n\n return (\n <MatchTextWrapper>\n <TextRowWrapper>\n <Text\n data-test=\"match-text-editor\"\n canClear={false}\n error={!!error}\n onChange={handleOnChange}\n onFocus={handleOnFocus}\n onBlur={handleOnBlur}\n onKeyUp={handleOnKeyUp}\n value={`${updatedMatchValue ?? initialValue}`}\n />\n {error && <MatchErrorMessage>{error}</MatchErrorMessage>}\n </TextRowWrapper>\n </MatchTextWrapper>\n );\n};\n\nMatchValueText.propTypes = {\n initialValue: T.oneOfType([T.string, T.number]),\n matchValues: T.arrayOf(T.oneOfType([T.string, T.number])),\n updateMatch: T.func,\n};\n\nexport default MatchValueText;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport Button, { ButtonProps } from '@splunk/react-ui/Button';\nimport CloseIcon from '@splunk/react-icons/Cross';\nimport { variables } from '@splunk/themes';\n\nconst RemoveMatchWrapper = styled.div`\n display: flex;\n flex: 1;\n justify-content: flex-end;\n`;\n\nconst RemoveMatchButton = styled(Button)<ButtonProps>`\n color: ${props =>\n props.disabled ? variables.contentColorDisabled : variables.contentColorActive} !important;\n &:hover {\n background-color: ${props => !props.disabled && variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nconst RemoveMatch = ({\n colorIndex,\n disabled = false,\n onRemove,\n matchIndex,\n}: {\n colorIndex: number;\n disabled?: boolean;\n onRemove: (colorIdx: number, matchIdx: number) => void;\n matchIndex: number;\n}): React.ReactElement => {\n const handleOnRemove = React.useCallback(\n (): void => onRemove(colorIndex, matchIndex),\n [colorIndex, onRemove, matchIndex]\n );\n\n return (\n <RemoveMatchWrapper>\n <div>\n <RemoveMatchButton\n data-test=\"match-remove-button\"\n disabled={disabled}\n icon={<CloseIcon />}\n appearance=\"subtle\"\n onClick={handleOnRemove}\n />\n </div>\n </RemoveMatchWrapper>\n );\n};\n\nRemoveMatch.propTypes = {\n disabled: T.bool,\n onRemove: T.func,\n};\n\nexport default RemoveMatch;\n","import { isEmpty } from 'lodash';\nimport type { MatchesConfig } from '@splunk/visualization-encoding/formatters/MatchValue';\n\n/*\n * @method getMatches\n * @params {Array} matches\n * @return {Array} matches or an initialized match array by default\n */\nexport const getMatches = (matches = []): MatchesConfig[] => {\n if (isEmpty(matches)) {\n return [{ match: '', value: '#ff0000' }];\n }\n return matches;\n};\n\n/*\n * @method isNumeric\n * @params {string} val - input value for the given match\n * @return {boolean} whether the string is numeric\n */\nexport const isNumeric = (val: string): boolean => {\n // eslint-disable-next-line no-restricted-globals\n return !isNaN(Number(val)) && !isNaN(parseFloat(val));\n};\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { variables } from '@splunk/themes';\nimport defaultPalettes from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport type { PalettesConfig } from '../../interfaces/PalettesConfig';\nimport PalettesConfigurer from './Palettes/PalettesConfigurer';\nimport MatchValueConfigurer from './MatchValue/MatchValueConfigurer';\nimport {\n getSwatchColorsFromPalette,\n getPrecedenceFromPalette,\n inferInitialPaletteFromContext,\n hasCustomColors,\n hasInitiallyReversedColors,\n} from './Palettes/paletteUtils';\nimport type { Palettes } from './Palettes/paletteUtils';\nimport { getMatches } from './MatchValue/matchValueUtils';\n\nexport const MATCH_VALUE_WILDCARD_INFO_TEXT = _(\"Enter a value to match. Wildcards '*' can be used.\");\n\nconst MatchValueWildcardInfo = styled.div`\n margin: 6px 0px;\n color: ${variables.contentColorMuted};\n`;\n\ninterface MatchesConfig {\n match?: string | number;\n value?: string;\n}\n\nexport interface MatchValueEditorProps {\n defaultPalettesConfig: PalettesConfig;\n onChange?: (e: string, opt: string, payload: MatchesConfig[]) => void;\n palettes?: Palettes;\n selectedDataSelector?: string;\n value?: MatchesConfig[] | null;\n}\n\nconst getNewColorsFromPalette = ({\n palettes,\n paletteTheme,\n paletteInfo,\n matchValues,\n setIsReversed,\n}): string[] => {\n const newSwatchColors = getSwatchColorsFromPalette({\n palettes,\n paletteInfo,\n paletteTheme,\n });\n const precedence = getPrecedenceFromPalette({\n palettes,\n paletteTheme,\n paletteInfo,\n });\n\n const n = matchValues.length;\n // It's an array of 6 elements (indices from 0 to 5) so if there are\n // less than 7 match values, select the precedence normally. If 7 or greater,\n // select the final array in the precedence array at index 5.\n // Added .slice because there is one too many colors -\n // e.g. for matchValues array of length 1, precedence[0] returns\n // 2 elements (as was the minimum # for use with rangeValue)\n const newSelectedColors = precedence[n < 7 ? n - 1 : 5]\n .map((colorIdx): string => newSwatchColors[colorIdx])\n .slice(0, n);\n\n setIsReversed(false);\n return newSelectedColors;\n};\n\nexport const matchValuesToContextConfig = ({ colors, matchValues }): MatchesConfig[] =>\n colors.map((color, i): MatchesConfig => {\n const entry: MatchesConfig = {\n match: matchValues[i],\n value: color,\n };\n\n return entry;\n });\n\nconst MatchValueEditor = ({\n defaultPalettesConfig,\n onChange = () => undefined,\n palettes = defaultPalettes,\n selectedDataSelector,\n value,\n}: MatchValueEditorProps): React.ReactElement => {\n const matches = React.useMemo(() => getMatches(value), [value]);\n\n const { matchValues, selectedColors } = React.useMemo(\n () =>\n matches.reduce(\n (acc, next) => {\n acc.matchValues.push(next.match);\n acc.selectedColors.push(next.value);\n return acc;\n },\n { matchValues: [], selectedColors: [] }\n ),\n [matches]\n );\n\n const [{ paletteTheme: selectedPaletteTheme, paletteEntry: selectedPaletteEntry }, setPalettesConfig] =\n React.useState<PalettesConfig>(() =>\n inferInitialPaletteFromContext({ defaultPalettesConfig, palettes, ranges: matches })\n );\n\n const currentSwatchColors = getSwatchColorsFromPalette({\n palettes,\n paletteInfo: selectedPaletteEntry,\n paletteTheme: selectedPaletteTheme,\n });\n\n const isSwatchCustomized = React.useMemo(\n () => hasCustomColors({ currentSwatchColors, selectedColors }),\n [currentSwatchColors, selectedColors]\n );\n\n // we only want to calculate the initial reversed state when the RangeValueEditor opens since this is somewhat expensive\n // after this, the reversed state should be tracked internally by the editor itself\n\n const [isReversed, setIsReversed] = React.useState(() =>\n hasInitiallyReversedColors({\n isSwatchCustomized,\n palettes,\n selectedColors,\n selectedPaletteInfo: selectedPaletteEntry,\n selectedPaletteTheme,\n minimumNumberOfColors: 1,\n })\n );\n const calculateNewColors = React.useCallback(\n ({ paletteTheme, paletteInfo }): string[] => {\n // RangeValue had 6 here because it was the number of boundaries -\n // we have max 7 matches.\n if (matchValues.length > 7) return selectedColors;\n return getNewColorsFromPalette({\n palettes,\n paletteTheme,\n paletteInfo,\n matchValues,\n setIsReversed,\n });\n },\n [matchValues, palettes, selectedColors]\n );\n\n const onChangePaletteTheme = React.useCallback(\n (newPaletteTheme): void => {\n const newColors = calculateNewColors({\n paletteTheme: newPaletteTheme,\n paletteInfo: selectedPaletteEntry,\n });\n setPalettesConfig(prev => ({ ...prev, paletteTheme: newPaletteTheme }));\n const newMatches = matchValuesToContextConfig({ colors: newColors, matchValues });\n onChange(null, null, newMatches);\n },\n [calculateNewColors, selectedPaletteEntry, matchValues, onChange]\n );\n\n const onPaletteChange = React.useCallback(\n (newPaletteInfo): void => {\n const newColors = calculateNewColors({\n paletteTheme: selectedPaletteTheme,\n paletteInfo: newPaletteInfo,\n });\n setPalettesConfig(prev => ({ ...prev, paletteEntry: newPaletteInfo }));\n const newMatches = matchValuesToContextConfig({ colors: newColors, matchValues });\n onChange(null, null, newMatches);\n },\n [calculateNewColors, selectedPaletteTheme, matchValues, onChange]\n );\n\n const handleOnMatchValueChange = React.useCallback(\n ({ colors, matchValues: newMatchValues }): void => {\n const newMatches = matchValuesToContextConfig({ colors, matchValues: newMatchValues });\n onChange(null, null, newMatches);\n },\n [onChange]\n );\n\n // if the user changes the dataSelector (e.g. from major to trend) for something like background coloring,\n // reinitialize the palette config and the initial match values + colors using the newly selected formatter config (value)\n React.useEffect((): void => {\n setPalettesConfig(\n inferInitialPaletteFromContext({\n defaultPalettesConfig,\n palettes,\n ranges: matches,\n })\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedDataSelector]);\n\n return (\n <>\n <PalettesConfigurer\n isReversed={isReversed}\n isSwatchCustomized={isSwatchCustomized}\n shouldShowArrows={false}\n onChangePaletteTheme={onChangePaletteTheme}\n onPaletteChange={onPaletteChange}\n palettes={palettes}\n selectedPaletteInfo={selectedPaletteEntry}\n selectedPaletteTheme={selectedPaletteTheme}\n />\n <MatchValueConfigurer\n customizedColors={isSwatchCustomized}\n isReversed={isReversed}\n onChange={handleOnMatchValueChange}\n precedence={getPrecedenceFromPalette({\n palettes,\n paletteTheme: selectedPaletteTheme,\n paletteInfo: selectedPaletteEntry,\n })}\n matchValues={matchValues}\n selectedColors={selectedColors}\n swatchColors={currentSwatchColors}\n setIsReversed={setIsReversed}\n />\n <MatchValueWildcardInfo>{MATCH_VALUE_WILDCARD_INFO_TEXT}</MatchValueWildcardInfo>\n </>\n );\n};\n\nMatchValueEditor.propTypes = {\n /**\n * An onChange callback that allows the editor to customize the context accordingly based on the new thresholds\n */\n onChange: T.func,\n /**\n * The palettes object\n *\n * This consists of a theme and each themed-variant of the palettes\n */\n palettes: T.objectOf(\n T.shape({\n precedence: T.arrayOf(T.arrayOf(T.number)),\n swatches: T.arrayOf(T.arrayOf(T.string)),\n })\n ),\n /**\n * The initial matches config from the viz context\n */\n value: T.arrayOf(\n T.shape({\n match: T.oneOfType([T.string, T.number]),\n value: T.string,\n })\n ),\n /**\n * The field upon which the matchValue formatter is operating on - e.g. 'majorValue'\n */\n selectedDataSelector: T.string,\n /**\n * The default palette configuration, consisting of the theme and specific palette entry\n */\n defaultPalettesConfig: T.shape({\n paletteTheme: T.string,\n paletteEntry: T.shape({\n type: T.string,\n index: T.number,\n }),\n }),\n};\n\nexport default MatchValueEditor;\n","import React, { useMemo } from 'react';\nimport * as T from 'prop-types';\nimport type { MatchesConfig } from '@splunk/visualization-encoding/formatters/MatchValue';\nimport { ColorPreview } from './ColorPreview';\nimport type { BasePreviewProps } from '../../interfaces/BasePreviewProps';\nimport PreviewWrapper from '../../shared/PreviewWrapper';\n\nconst MAX_PREVIEW_COLOR_COUNT = 8;\ninterface MatchValuePreviewProps extends BasePreviewProps {\n config: MatchesConfig[];\n}\nconst propTypes: Record<keyof MatchValuePreviewProps, T.Validator<any>> = {\n config: T.arrayOf(\n T.shape({\n match: T.oneOfType([T.number, T.string]),\n value: T.string.isRequired,\n })\n ),\n};\n\nexport const MatchValuePreview: React.FunctionComponent<MatchValuePreviewProps> = ({\n config,\n}): React.ReactElement => {\n const colors = useMemo(\n () => config.map((entry): string => entry.value).slice(0, MAX_PREVIEW_COLOR_COUNT),\n [config]\n );\n return (\n <PreviewWrapper>\n <ColorPreview data-test=\"ColorPreview\" colors={colors} maxColorCount={MAX_PREVIEW_COLOR_COUNT} />\n </PreviewWrapper>\n );\n};\nMatchValuePreview.propTypes = propTypes;\n","import * as React from 'react';\nimport PresetPaletteTheme from './PresetPaletteTheme';\nimport PalettesDropdown from './PalettesDropdown';\nimport { getThemedPalettesWithoutMeta } from './paletteUtils';\nimport type { Palettes, PaletteInfo, PaletteEntryMap, PaletteThemeMeta } from './paletteUtils';\n\nconst PalettesConfigurer = ({\n isReversed,\n isSwatchCustomized,\n shouldShowArrows = true,\n onChangePaletteTheme,\n onPaletteChange,\n palettes,\n selectedPaletteInfo,\n selectedPaletteTheme,\n}: {\n isReversed: boolean;\n isSwatchCustomized: boolean;\n shouldShowArrows?: boolean;\n onChangePaletteTheme: (theme: string) => void;\n onPaletteChange: ({ type, index }: PaletteInfo) => void;\n palettes: Palettes;\n selectedPaletteInfo: PaletteInfo;\n selectedPaletteTheme: string;\n}): React.ReactElement => {\n const paletteThemes = React.useMemo(\n (): PaletteThemeMeta[] =>\n Object.keys(palettes).map(\n (palette): PaletteThemeMeta => ({\n value: palette,\n // eslint-disable-next-line no-underscore-dangle\n label: palettes[palette]._meta.label,\n })\n ),\n [palettes]\n );\n\n const filteredThemedPalettes = React.useMemo(\n (): PaletteEntryMap => getThemedPalettesWithoutMeta({ palettes, paletteTheme: selectedPaletteTheme }),\n [palettes, selectedPaletteTheme]\n );\n\n return (\n <>\n <PresetPaletteTheme\n onChange={onChangePaletteTheme}\n paletteThemes={paletteThemes}\n selectedPaletteTheme={selectedPaletteTheme}\n />\n <PalettesDropdown\n isReversed={isReversed}\n isSwatchCustomized={isSwatchCustomized}\n shouldShowArrows={shouldShowArrows}\n onPaletteChange={onPaletteChange}\n palettes={filteredThemedPalettes}\n selectedPaletteInfo={selectedPaletteInfo}\n />\n </>\n );\n};\n\nexport default PalettesConfigurer;\n","import * as React from 'react';\nimport { get } from 'lodash';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Button from '@splunk/react-ui/Button';\nimport Dropdown from '@splunk/react-ui/Dropdown';\nimport Menu from '@splunk/react-ui/Menu';\nimport variables from '@splunk/themes/variables';\nimport ArrowLayer from '../../../shared/ArrowLayer';\nimport { ColorPreview } from '../ColorPreview';\nimport PreviewWrapper from '../../../shared/PreviewWrapper';\nimport type { PaletteInfo } from './paletteUtils';\n\nexport interface PalettesDropdownProps {\n isReversed?: boolean;\n isSwatchCustomized?: boolean;\n shouldShowArrows?: boolean;\n onPaletteChange: ({ type, index }: PaletteInfo) => void;\n palettes: { [key: string]: { swatches: string[][]; precedence: number[][] } };\n selectedPaletteInfo: { type: string; index: number };\n}\n\nconst ColorPreviewSpacer = styled.div`\n width: ${variables.spacingMedium}; //enterprise: 15px, prisma: 12px\n`;\n\nconst CustomizedSwatchText = styled.span.attrs(() => ({\n 'data-test': 'custom-swatch-text',\n}))`\n display: flex;\n flex: 1;\n padding-left: 10px;\n`;\nconst PalettesDropdown = ({\n isReversed = false,\n isSwatchCustomized = false,\n shouldShowArrows = true,\n onPaletteChange,\n palettes,\n selectedPaletteInfo,\n}: PalettesDropdownProps): React.ReactElement => {\n const previewColors = get(\n palettes,\n [selectedPaletteInfo.type, 'swatches', selectedPaletteInfo.index],\n []\n );\n\n const initialPalettePreview = (\n <Button\n style={{ width: '100%', padding: `0 ${variables.spacingSmall}` }}\n isMenu\n data-test=\"palettes-dropdown-toggle\"\n >\n {isSwatchCustomized ? (\n <CustomizedSwatchText>Customized in swatches below</CustomizedSwatchText>\n ) : (\n <>\n <PreviewWrapper>\n {shouldShowArrows && <ArrowLayer />}\n <ColorPreview colors={previewColors} isReversed={isReversed} />\n </PreviewWrapper>\n <ColorPreviewSpacer />\n </>\n )}\n </Button>\n );\n\n const menuItems = React.useMemo(\n // can't use React.Fragment - it will break keyboard navigation,\n // Menu accepts only Menu.Item, Menu.Heading, Menu.Divider as child components\n () =>\n Object.keys(palettes).reduce<JSX.Element[]>((items, palette, index, arr) => {\n items.push(\n <Menu.Heading key={`title-${palette}`} title>\n {_(palette).toUpperCase()}\n </Menu.Heading>\n );\n items.push(\n ...palettes[palette].swatches.map((colors: string[], i) => {\n const isSelected =\n !isSwatchCustomized &&\n palette === selectedPaletteInfo.type &&\n selectedPaletteInfo.index === i;\n\n return (\n <Menu.Item\n data-test={`palette-swatch-row-${palette}-${i}`}\n key={`${palette}-${JSON.stringify(colors)}`}\n onClick={() => onPaletteChange({ type: palette, index: i })}\n selected={isSelected}\n selectable\n >\n <PreviewWrapper>\n <ColorPreview colors={colors} />\n </PreviewWrapper>\n </Menu.Item>\n );\n })\n );\n if (index < arr.length - 1) {\n items.push(<Menu.Divider key={`divider-${palette}`} />);\n }\n return items;\n }, []),\n [isSwatchCustomized, onPaletteChange, palettes, selectedPaletteInfo.index, selectedPaletteInfo.type]\n );\n\n return (\n <Dropdown toggle={initialPalettePreview}>\n <Menu style={{ width: 302 }}>{menuItems}</Menu>\n </Dropdown>\n );\n};\n\nexport default PalettesDropdown;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport RadioBar from '@splunk/react-ui/RadioBar';\nimport ControlGroup from '@splunk/react-ui/ControlGroup';\nimport type { PaletteThemeMeta } from './paletteUtils';\n\nconst PresetPaletteTheme = ({\n labelPosition = 'top',\n onChange,\n paletteThemes,\n selectedPaletteTheme,\n}: {\n labelPosition?: 'left' | 'top';\n onChange: (payload: string) => void;\n paletteThemes: PaletteThemeMeta[];\n selectedPaletteTheme: string;\n}): React.ReactElement => {\n const onPaletteThemeChange = React.useCallback((e, { value }): void => onChange(value), [onChange]);\n\n return (\n <ControlGroup label={_('Preset palette')} labelPosition={labelPosition}>\n <RadioBar onChange={onPaletteThemeChange} value={selectedPaletteTheme}>\n {paletteThemes.map(\n ({ value, label }): React.ReactElement => (\n <RadioBar.Option\n key={value}\n value={value}\n label={label}\n data-test={`preset-palette-theme-${value}`}\n />\n )\n )}\n </RadioBar>\n </ControlGroup>\n );\n};\n\nPresetPaletteTheme.propTypes = {\n labelPosition: T.string,\n onChange: T.func,\n paletteThemes: T.arrayOf(\n T.shape({\n value: T.string,\n label: T.string,\n })\n ),\n selectedPaletteTheme: T.string,\n};\n\nexport default PresetPaletteTheme;\n","import { get } from 'lodash';\nimport type { RangesConfig } from '@splunk/visualization-encoding/formatters/RangeValue';\nimport type { MatchesConfig } from '@splunk/visualization-encoding/formatters/MatchValue';\nimport type { PalettesConfig } from '../../../interfaces/PalettesConfig';\n\ninterface PaletteEntry {\n swatches: string[][];\n precedence: number[][];\n}\n\nexport interface PaletteEntryMap {\n [palette: string]: PaletteEntry;\n}\n\nexport interface PaletteInfo {\n type: string;\n index: number;\n}\n\nexport interface Palettes {\n [theme: string]: {\n _meta: any; // hack to get an interface with combined known keys and unknown keys\n [key: string]: PaletteEntry;\n };\n}\n\nexport interface PaletteThemeMeta {\n value: string;\n label: string;\n}\n\ninterface SharedPalettesParams {\n palettes: Palettes;\n paletteInfo: PaletteInfo;\n paletteTheme: string;\n}\n\nexport const defaultPalettesConfig = {\n paletteTheme: 'DARK_COLORS',\n paletteEntry: {\n type: 'sequential',\n index: 0,\n },\n};\n\n/**\n * Obtains the new colors given the set of swatchColors and a precedence to pick the desired swatch colors\n * Each entry in 2D precedence dictates which colors out of the (i + 2) colors, where i is the index for the entry\n * E.g the 0th precedence entry tells us which 2 elements to select from the swatch colors\n * the 1st entry tells us which 3 elements to select, and so forth\n *\n * @param {Boolean} params.isReversed - indicates that the selected colors should be reversed based on the insertion precedence\n * @param {Number} params.numColors - number of colors to return\n * @param {Number[][]} params.precedence - the order from which the new selected colors should pick from the swatch\n * the ith precedence entry dictates the indices that should be selected for (i + 2) swatchColors (e.g. [[0, 1], [0, 1, 2], [0, 1, 2, 3]])\n * @param {String[]} params.swatchColors - the swatch from which the colors are picked from\n */\nexport const getNewColors = ({\n isReversed,\n numColors,\n precedence,\n swatchColors,\n}: {\n isReversed: boolean;\n numColors: number;\n precedence: number[][];\n swatchColors: string[];\n}): string[] => {\n const newSelectedColors = Array.isArray(precedence[numColors - 2])\n ? precedence[numColors - 2].map((colorIdx): string => {\n return swatchColors[colorIdx];\n })\n : [];\n\n if (isReversed) {\n newSelectedColors.reverse();\n }\n return newSelectedColors;\n};\n\n/**\n * Returns the swatch precedence defined for a given palette type\n *\n * @param {Palettes} params.palettes - the nested palettes object\n * @param {PaletteInfo} params.paletteInfo - object holding the palette type (e.g. divergent, categorical), and index within the palette swatches\n * @param {String} params.paletteTheme - the palette theme that should be a key at the root level of the Palettes object\n *\n * @return {Number[][]}\n */\nexport const getPrecedenceFromPalette = ({\n palettes,\n paletteInfo,\n paletteTheme,\n}: SharedPalettesParams): number[][] => {\n return get(palettes, [paletteTheme, paletteInfo.type, 'precedence'], []);\n};\n\n/**\n * Returns the swatch colors for a given palette type and index\n *\n * @param {Palettes} params.palettes - the nested palettes object\n * @param {PaletteInfo} params.paletteInfo - object holding the palette type (e.g. divergent, categorical), and index within the palette swatches\n * @param {String} params.paletteTheme - the palette theme that should be a key at the root level of the Palettes object\n *\n * @return {String[]}\n */\nexport const getSwatchColorsFromPalette = ({\n palettes,\n paletteInfo,\n paletteTheme,\n}: SharedPalettesParams): string[] => {\n return get(palettes, [paletteTheme, paletteInfo.type, 'swatches', paletteInfo.index], []);\n};\n\n/**\n * Determines if the current selected colors are customized compared to the current swatch colors\n *\n * @param {String[]} params.currentSwatchColors - the currently selected swatch within the Palette Dropdown\n * @param {String[]} params.selectedColors - the colors present within the range value config\n *\n * @return {Boolean}\n */\nexport const hasCustomColors = ({\n currentSwatchColors,\n selectedColors,\n}: {\n currentSwatchColors: string[];\n selectedColors: string[];\n}): boolean => {\n if (selectedColors.length > currentSwatchColors.length) {\n return true;\n }\n\n // NOTE: for detecting custom colors, the color to evaluate must be lowercased, as SUI's Color editor\n // converts all selected hex colors to their lowercased counterpart, regardless of the casing in the palette\n const swatchColorMap = {};\n currentSwatchColors.forEach((color): void => {\n swatchColorMap[color.toLowerCase()] = color.toLowerCase();\n });\n\n return selectedColors.some((color): boolean => !swatchColorMap[color.toLowerCase()]);\n};\n\n/**\n * Returns the palette entries within the palettes object for a given theme without the _meta field\n *\n * @param {Palettes} params.palettes - the nested palettes object\n * @param {String} params.paletteTheme - the palette theme that should be a key at the root level of the Palettes object\n *\n * @return {Palettes} - the selectedTheme palettes object with the _meta field stripped out from each palette entry\n */\nexport const getThemedPalettesWithoutMeta = ({\n palettes,\n paletteTheme,\n}: {\n palettes: Palettes;\n paletteTheme: string;\n}): PaletteEntryMap => {\n return Object.keys(palettes[paletteTheme]).reduce((filteredPalettes, field): Record<string, unknown> => {\n if (field !== '_meta') {\n // eslint-disable-next-line no-param-reassign\n filteredPalettes[field] = palettes[paletteTheme][field];\n }\n return filteredPalettes;\n }, {});\n};\n\n/**\n * Internal helper to check if the user-selected colors adhere to the default palette insertion order\n */\nconst hasMatchingPrecedence = ({\n currentSwatchColors,\n precedence,\n selectedColors,\n}: {\n currentSwatchColors: string[];\n precedence: number[];\n selectedColors: string[];\n}): boolean => {\n if (!precedence) {\n return false;\n }\n if (precedence.every((idx: number): boolean => currentSwatchColors[idx] === selectedColors[idx]))\n return true;\n const reversedPrecedenceEntry = [...precedence].reverse();\n if (\n reversedPrecedenceEntry.every(\n (idx: number): boolean => currentSwatchColors[idx] === selectedColors[idx]\n )\n )\n return true;\n\n // the given precedence (nor its reversed counterpart) do not match\n return false;\n};\n\n/**\n * Determines if the selected colors relative to the palette had a reversed precedence\n * @param {Boolean} params.isSwatchCustomized - indicates if user was using non-palette derived colors\n * @param {Palettes} params.palettes - the palettes object used to power the range value editor palette\n * @param {String[]} params.selectedColors - the colors that are currently populating the range value formatter editor\n * @param {PaletteInfo} params.selectedPaletteInfo - metadata about the currently selected palette for the range value formatter editor\n * @param {String} params.selectedPaletteTheme - the current palette theme\n *\n * @returns {Boolean}\n */\nexport const hasInitiallyReversedColors = ({\n isSwatchCustomized,\n palettes,\n selectedColors,\n selectedPaletteInfo,\n selectedPaletteTheme,\n // minimumNumberOfColors reflects the minimum number of colors needed in the particular formatter editor's implementation\n // defaulted to two as to not break previous rangeValue formatter editor implementation\n minimumNumberOfColors = 2,\n}: {\n isSwatchCustomized: boolean;\n palettes: Palettes;\n selectedColors: string[];\n selectedPaletteInfo: PaletteInfo;\n selectedPaletteTheme: string;\n minimumNumberOfColors?: number;\n}): boolean => {\n if (isSwatchCustomized) {\n return false;\n }\n\n const n = selectedColors.length;\n // if for rangevalue (min # of colors = 2) then default behavior, otherwise adjust for matchvalue\n const precedenceIndexIfMatch = n < 7 ? n - 1 : 5;\n const precedenceIndex = minimumNumberOfColors === 2 ? n - 2 : precedenceIndexIfMatch;\n\n const currentPaletteColors =\n palettes?.[selectedPaletteTheme]?.[selectedPaletteInfo.type]?.swatches?.[selectedPaletteInfo.index];\n const currentPrecedence =\n palettes?.[selectedPaletteTheme]?.[selectedPaletteInfo.type]?.precedence?.[precedenceIndex];\n\n const reversedPrecedence = [...currentPrecedence].reverse();\n\n return selectedColors.every(\n (selectedColor, index) =>\n currentPaletteColors[reversedPrecedence[index]].toLowerCase() === selectedColor.toLowerCase()\n );\n};\n\n/**\n * Helper to determine if the user was using a pre-existing palette to populate the rangeValue, matchValue, or gradient config.\n *\n * Accepts RangesConfig, MatchesConfig, or GradientConfig (array of colors).\n * Checks all palettes from all themes to determine which one the user was previously using.\n * If multiple matches are found (possible since palettes can have overlapping colors), insertion precedence is used to infer the correct palette type.\n * If no match is found, returns the defaultPalettesConfig.\n *\n * @param {PalettesConfig} params.defaultPalettesConfig - if no palette match is found, the swatch info from this palette will be used for the color editors\n * @param {RangesConfig[] | MatchesConfig[]} params.ranges - the ranges/matches context config or gradient config\n * @param {Palettes} params.palettes - the nested palettes object\n */\nexport const inferInitialPaletteFromContext = ({\n defaultPalettesConfig: defaultPalettes,\n ranges,\n palettes,\n}: {\n defaultPalettesConfig: PalettesConfig;\n ranges: RangesConfig[] | MatchesConfig[];\n palettes: Palettes;\n}): PalettesConfig => {\n // Determine selectedColors based on input type\n let selectedColors: string[] = [];\n if (Array.isArray(ranges)) {\n // RangesConfig or MatchesConfig\n selectedColors = ranges.map(({ value }) => value);\n }\n\n let matchingPalette;\n let matchedPrecedence = false;\n\n Object.keys(palettes).forEach(paletteTheme => {\n Object.keys(palettes[paletteTheme])\n .filter(paletteType => paletteType !== '_meta')\n .forEach(paletteType => {\n const { swatches } = palettes[paletteTheme][paletteType];\n const precedence = palettes[paletteTheme][paletteType].precedence[selectedColors.length - 2];\n for (let k = 0; k < swatches.length; k += 1) {\n const currentSwatchColors = swatches[k];\n if (!hasCustomColors({ currentSwatchColors, selectedColors })) {\n matchedPrecedence = hasMatchingPrecedence({\n currentSwatchColors,\n selectedColors,\n precedence,\n });\n if (!matchingPalette || matchedPrecedence) {\n matchingPalette = {\n paletteTheme,\n paletteEntry: {\n type: paletteType,\n index: k,\n },\n };\n }\n }\n }\n });\n });\n\n return matchingPalette || defaultPalettes;\n};\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport styled from 'styled-components';\nimport Button from '@splunk/react-ui/Button';\nimport ArrowsRectangularDouble from '@splunk/react-icons/ArrowsRectangularDouble';\n\nconst AddRangeWrapper = styled.div`\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n`;\n\nconst AddRangeButtonWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n`;\n\nconst ReverseRangeWrapper = styled.div`\n display: flex;\n`;\n\nconst ButtonStyle = {\n marginRight: '12px',\n};\n\nconst reverseIcon = <ArrowsRectangularDouble />;\n\nconst AddAndReverseRanges = ({\n disableAddRanges = false,\n handleAddRange,\n handleReverse,\n}: {\n disableAddRanges: boolean;\n handleAddRange: () => void;\n handleReverse: () => void;\n}): React.ReactElement => {\n return (\n <AddRangeWrapper>\n <ReverseRangeWrapper>\n <Button\n data-test=\"reverse-ranges-button\"\n icon={reverseIcon}\n style={ButtonStyle}\n onClick={handleReverse}\n />\n </ReverseRangeWrapper>\n <AddRangeButtonWrapper>\n <Button\n data-test=\"add-range-button\"\n appearance=\"secondary\"\n label={`+ ${_('Add range')}`}\n disabled={disableAddRanges}\n onClick={handleAddRange}\n />\n </AddRangeButtonWrapper>\n </AddRangeWrapper>\n );\n};\n\nAddAndReverseRanges.propTypes = {\n disableAddRanges: T.bool,\n handleAddRange: T.func,\n handleReverse: T.func,\n};\n\nexport default AddAndReverseRanges;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport Number, { type NumberChangeHandler } from '@splunk/react-ui/Number';\nimport variables from '@splunk/themes/variables';\n\nconst RangeBoundaryText = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'range-boundary-text',\n}))`\n color: ${variables.contentColorMuted};\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-right: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst BoundaryErrorMessage = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'range-boundary-error',\n}))`\n color: ${variables.contentColorNegative};\n padding-top: 5px;\n font-size: 12px;\n display: block;\n`;\n\nconst StyledNumberEditor = styled(Number)`\n max-width: 105px;\n margin-right: ${variables.spacingMedium};\n`;\n\nconst BoundaryRowWrapper = styled.div`\n display: flex;\n height: 100%;\n`;\n\nconst RangeBoundaryWrapper = styled.div`\n display: flex;\n flex-direction: column;\n margin-left: ${variables.spacingMedium};\n`;\n\nexport const handleUpdateRangeBoundary = ({\n rangeBoundaryIndex,\n setError,\n shouldUpdate,\n updateRangeBoundary,\n value,\n}: {\n rangeBoundaryIndex: number;\n setError: (payload: string) => void;\n shouldUpdate: boolean;\n updateRangeBoundary: (payload: number, idx: number) => { error: any };\n value: number;\n}): void => {\n if (shouldUpdate) {\n const result = updateRangeBoundary(value, rangeBoundaryIndex);\n if (result && result.error) {\n setError(result.error);\n }\n }\n};\n\nconst RangeBoundary = ({\n initialValue,\n rangeBoundaryIndex,\n rangeText,\n rangeValues,\n showNumberEditor = true,\n updateRangeBoundary,\n}: {\n initialValue?: number;\n rangeBoundaryIndex: number;\n rangeText: string;\n rangeValues: number[];\n showNumberEditor?: boolean;\n updateRangeBoundary: (value: number, updatedRangeBoundaryIndex: number) => { error: string };\n}): React.ReactElement => {\n const [boundaryInputValue, setBoundaryInputValue] = React.useState(null);\n const [isFocused, setIsFocused] = React.useState(false);\n const [error, setError] = React.useState(null);\n\n const handleOnFocus = React.useCallback((): void => {\n setIsFocused(true);\n }, []);\n\n const handleOnChange = React.useCallback<NumberChangeHandler>(\n (_e, { value }): void => {\n // this is invoked if the user uses the up/down arrows (want to update rangevalues immediately)\n setBoundaryInputValue(value);\n handleUpdateRangeBoundary({\n rangeBoundaryIndex,\n setError,\n shouldUpdate: !isFocused,\n updateRangeBoundary,\n value,\n });\n },\n [isFocused, rangeBoundaryIndex, updateRangeBoundary]\n );\n\n const handleOnBlur = React.useCallback((): void => {\n setIsFocused(false);\n handleUpdateRangeBoundary({\n rangeBoundaryIndex,\n setError,\n shouldUpdate: typeof boundaryInputValue === 'number' && boundaryInputValue !== initialValue,\n updateRangeBoundary,\n value: boundaryInputValue,\n });\n }, [rangeBoundaryIndex, boundaryInputValue, initialValue, updateRangeBoundary]);\n\n const handleOnKeyUp = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>): void =>\n handleUpdateRangeBoundary({\n rangeBoundaryIndex,\n setError,\n shouldUpdate:\n e.key === 'Enter' &&\n typeof boundaryInputValue === 'number' &&\n boundaryInputValue !== initialValue,\n updateRangeBoundary,\n value: boundaryInputValue,\n }),\n [rangeBoundaryIndex, boundaryInputValue, initialValue, updateRangeBoundary]\n );\n\n // if the changes the range values by editing an adjacent value to address the duplication,\n // clear the error state and persist the currently state value if the current state value would not cause duplication\n React.useEffect((): void => {\n if (error && !rangeValues.includes(boundaryInputValue)) {\n setError(null);\n handleUpdateRangeBoundary({\n rangeBoundaryIndex,\n setError,\n shouldUpdate: typeof boundaryInputValue === 'number',\n updateRangeBoundary,\n value: boundaryInputValue,\n });\n }\n }, [boundaryInputValue, error, rangeBoundaryIndex, rangeValues, updateRangeBoundary]);\n\n return (\n <RangeBoundaryWrapper>\n <BoundaryRowWrapper>\n {showNumberEditor && (\n <StyledNumberEditor\n data-test=\"range-boundary-editor\"\n error={!!error}\n onBlur={handleOnBlur}\n onChange={handleOnChange}\n onFocus={handleOnFocus}\n onKeyUp={handleOnKeyUp}\n value={boundaryInputValue ?? initialValue}\n />\n )}\n <RangeBoundaryText>{rangeText}</RangeBoundaryText>\n </BoundaryRowWrapper>\n {showNumberEditor && error && <BoundaryErrorMessage>{error}</BoundaryErrorMessage>}\n </RangeBoundaryWrapper>\n );\n};\n\nRangeBoundary.propTypes = {\n initialValue: T.number,\n rangeBoundaryIndex: T.number,\n rangeText: T.string,\n showNumberEditor: T.bool,\n updateRangeBoundary: T.func,\n};\n\nexport default RangeBoundary;\n","import * as React from 'react';\nimport Color from '@splunk/react-ui/Color';\n\nconst RangeColor = ({\n color,\n colorIndex,\n onChange,\n palette,\n}: {\n color: string;\n colorIndex: number;\n onChange: (payload: { colorIndex: number; value: string }) => void;\n palette: string[];\n}): React.ReactElement => {\n const handleColorChange = React.useCallback(\n ({ value }): void => onChange({ colorIndex, value }),\n [colorIndex, onChange]\n );\n\n return (\n <Color\n data-test={`range-color-${color}`}\n value={color}\n palette={palette}\n onChange={handleColorChange}\n hideInput // prisma only\n />\n );\n};\n\nexport default RangeColor;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AddAndReverseRanges from './AddAndReverseRanges';\nimport RangeBoundary from './RangeBoundary';\nimport RangeColor from './RangeColor';\nimport RemoveRange from './RemoveRange';\nimport { getNewColors, hasCustomColors } from '../Palettes/paletteUtils';\n\nconst RangeValueConfigurerWrapper = styled.div`\n padding-top: 10px;\n`;\n\nconst RangesWrapper = styled.div`\n display: flex;\n flex-direction: column-reverse;\n`;\n\nconst RangeEntry = styled.div.attrs((): { 'data-test': string } => ({\n 'data-test': 'range-entry-row',\n}))`\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n`;\n\n// note; getRangeText applies i18n at the static string level\nconst getRangeText = ({ lastColorIndex, rangeBoundaryIndex, rangeValues }): string => {\n switch (rangeBoundaryIndex) {\n case lastColorIndex:\n return _('and greater');\n case 0:\n return `${_('less than')} ${rangeValues[rangeBoundaryIndex]}`;\n default:\n return `${_('to')} ${rangeValues[rangeBoundaryIndex]}`;\n }\n};\n\nconst RangeValueConfigurer = ({\n // while this could be calculated inside the RangeValueConfigurer directly,\n // the palette dropdown also needs to know if the swatch was customized\n // it was more convenient to hoist up customizedColors than recalculating it in the child components\n customizedColors,\n isReversed,\n onChange,\n precedence,\n swatchColors,\n rangeValues,\n setIsReversed,\n selectedColors,\n}: {\n customizedColors: boolean;\n isReversed: boolean;\n onChange: (payload: { colors: string[]; rangeValues: number[] }) => void;\n precedence: number[][];\n swatchColors: string[];\n rangeValues: number[];\n setIsReversed: (payload: boolean) => void;\n selectedColors: string[];\n}): React.ReactElement => {\n const handleColorChange = React.useCallback(\n ({ colorIndex, value }): void => {\n const newSelectedColors = [...selectedColors];\n newSelectedColors[colorIndex] = value;\n onChange({ colors: newSelectedColors, rangeValues });\n },\n [onChange, rangeValues, selectedColors]\n );\n\n const handleAddRange = React.useCallback((): void => {\n // TODO(fkurniawan): figure out how to determine value of newly added range\n const newRangeValues = [...rangeValues, rangeValues[rangeValues.length - 1] + 10];\n const newSelectedColors = customizedColors\n ? [...selectedColors, '#000000'] // insert black color as per design if colors are customized\n : getNewColors({\n isReversed,\n // there is one more color than there are range boundaries\n numColors: newRangeValues.length + 1,\n precedence,\n swatchColors,\n });\n onChange({ colors: newSelectedColors, rangeValues: newRangeValues });\n }, [onChange, rangeValues, customizedColors, selectedColors, isReversed, precedence, swatchColors]);\n\n const handleReverse = React.useCallback((): void => {\n const newColors = [...selectedColors];\n newColors.reverse();\n setIsReversed(!isReversed);\n onChange({ colors: newColors, rangeValues });\n }, [onChange, rangeValues, isReversed, selectedColors, setIsReversed]);\n\n const handleUpdateRangeBoundary = React.useCallback(\n (updatedValue, rangeBoundaryIndex): { error: string } => {\n if (rangeValues.includes(updatedValue)) {\n return { error: _('Value already exists') };\n }\n const newRangeValues = [...rangeValues];\n newRangeValues[rangeBoundaryIndex] = updatedValue;\n newRangeValues.sort((a, b): number => a - b);\n onChange({ colors: selectedColors, rangeValues: newRangeValues });\n return { error: null };\n },\n [onChange, selectedColors, rangeValues]\n );\n\n const handleRemoveRange = React.useCallback(\n (colorIndex: number, rangeBoundaryIndex: number): void => {\n if (rangeValues.length > 1) {\n const newRangeValues = [...rangeValues];\n newRangeValues.splice(rangeBoundaryIndex, 1);\n\n // check if there are still custom colors after the user removes the current one\n const newSelectedColorsWithCurrentOmitted = [...selectedColors];\n newSelectedColorsWithCurrentOmitted.splice(colorIndex, 1);\n\n const newSelectedColors = hasCustomColors({\n currentSwatchColors: swatchColors,\n selectedColors: newSelectedColorsWithCurrentOmitted,\n })\n ? newSelectedColorsWithCurrentOmitted\n : getNewColors({\n isReversed,\n // there is one more color than there are range boundaries\n numColors: newRangeValues.length + 1,\n precedence,\n swatchColors,\n });\n\n onChange({ colors: newSelectedColors, rangeValues: newRangeValues });\n }\n },\n [isReversed, onChange, precedence, rangeValues, selectedColors, swatchColors]\n );\n\n return (\n <RangeValueConfigurerWrapper>\n <AddAndReverseRanges\n // TODO(fkurniawan): CTA if the user wishes to configure more than 7 ranges\n // the info state should tell users that anything > 7 ranges should be added via source\n disableAddRanges={selectedColors.length > 6}\n handleAddRange={handleAddRange}\n handleReverse={handleReverse}\n />\n <RangesWrapper>\n {selectedColors.map((color: string, i: number): React.ReactElement => {\n // there is always one more color than the number of range boundaries (unless there is only one range)\n // the customizable rangeBoundaryIndex corresponds to one less than the current selectedColor index\n const isLastItem = i === selectedColors.length - 1;\n const rangeBoundaryIndex = i > 0 ? i - 1 : 0;\n const rangeBoundaryValue = rangeValues[rangeBoundaryIndex];\n\n return (\n <RangeEntry key={`${color}-${rangeBoundaryValue}`}>\n <RangeColor\n color={color}\n colorIndex={i}\n palette={swatchColors}\n onChange={handleColorChange}\n />\n <RangeBoundary\n initialValue={rangeBoundaryValue}\n rangeBoundaryIndex={rangeBoundaryIndex}\n rangeText={getRangeText({\n lastColorIndex: selectedColors.length - 1,\n rangeBoundaryIndex: i,\n rangeValues,\n })}\n // unfortunately RangeBoundary has to know adjacent rangeValues if the user tries to address duplicates by changing an adjacent range\n // (instead of changing the currently errored RangeBoundary)\n rangeValues={rangeValues}\n showNumberEditor={isLastItem || i > 0}\n updateRangeBoundary={handleUpdateRangeBoundary}\n />\n <RemoveRange\n colorIndex={i}\n disabled={rangeValues.length < 2}\n onRemove={handleRemoveRange}\n rangeBoundaryIndex={rangeBoundaryIndex}\n />\n </RangeEntry>\n );\n })}\n </RangesWrapper>\n </RangeValueConfigurerWrapper>\n );\n};\n\nRangeValueConfigurer.propTypes = {\n customizedColors: T.bool,\n isReversed: T.bool,\n precedence: T.arrayOf(T.arrayOf(T.number)),\n swatchColors: T.arrayOf(T.string),\n rangeValues: T.arrayOf(T.number),\n setIsReversed: T.func,\n selectedColors: T.arrayOf(T.string),\n};\n\nexport default RangeValueConfigurer;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport Button, { ButtonProps } from '@splunk/react-ui/Button';\nimport CloseIcon from '@splunk/react-icons/Cross';\nimport { variables } from '@splunk/themes';\n\nconst RemoveRangeWrapper = styled.div`\n display: flex;\n flex: 1;\n justify-content: flex-end;\n`;\n\nconst RemoveRangeButton = styled(Button)<ButtonProps>`\n color: ${props =>\n props.disabled ? variables.contentColorDisabled : variables.contentColorActive} !important;\n &:hover {\n background-color: ${props => !props.disabled && variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nconst RemoveRange = ({\n colorIndex,\n disabled = false,\n onRemove,\n rangeBoundaryIndex,\n}: {\n colorIndex: number;\n disabled?: boolean;\n onRemove: (colorIdx: number, rangeBoundaryIdx: number) => void;\n rangeBoundaryIndex: number;\n}): React.ReactElement => {\n const handleOnRemove = React.useCallback(\n (): void => onRemove(colorIndex, rangeBoundaryIndex),\n [colorIndex, onRemove, rangeBoundaryIndex]\n );\n\n return (\n <RemoveRangeWrapper>\n <div>\n <RemoveRangeButton\n data-test=\"range-remove-button\"\n disabled={disabled}\n icon={<CloseIcon />}\n appearance=\"subtle\"\n onClick={handleOnRemove}\n />\n </div>\n </RemoveRangeWrapper>\n );\n};\n\nRemoveRange.propTypes = {\n disabled: T.bool,\n onRemove: T.func,\n};\n\nexport default RemoveRange;\n","import { isEmpty } from 'lodash';\nimport type { RangesConfig } from '@splunk/visualization-encoding/formatters/RangeValue';\n\n/*\n * @method getSortedRanges\n * @params {Array} ranges\n * @return {Array} sorted ranges\n */\nexport const getSortedRanges = (ranges = []): RangesConfig[] => {\n if (isEmpty(ranges)) {\n return [\n { to: 0, value: '#f00' },\n { from: 0, value: '#0f0' },\n ];\n }\n const rangesToSort = [...ranges];\n rangesToSort.sort((a, b): number => {\n if (a.to == null) return 1;\n if (b.to == null) return -1;\n return +a.to - +b.to;\n });\n return rangesToSort;\n};\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport defaultPalettes from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport type { RangesConfig } from '@splunk/visualization-encoding/formatters/RangeValue';\nimport type { PalettesConfig } from '../../interfaces/PalettesConfig';\nimport PalettesConfigurer from './Palettes/PalettesConfigurer';\nimport RangeValueConfigurer from './RangeValue/RangeValueConfigurer';\nimport { getSortedRanges } from './RangeValue/rangeValueUtils';\nimport {\n getSwatchColorsFromPalette,\n getPrecedenceFromPalette,\n inferInitialPaletteFromContext,\n hasCustomColors,\n hasInitiallyReversedColors,\n} from './Palettes/paletteUtils';\nimport type { Palettes } from './Palettes/paletteUtils';\n\nconst getNewColorsFromPalette = ({\n palettes,\n paletteTheme,\n paletteInfo,\n rangeValues,\n setIsReversed,\n}): string[] => {\n const newSwatchColors = getSwatchColorsFromPalette({\n palettes,\n paletteInfo,\n paletteTheme,\n });\n const precedence = getPrecedenceFromPalette({\n palettes,\n paletteTheme,\n paletteInfo,\n });\n\n const newSelectedColors = precedence[rangeValues.length - 1].map(\n (colorIdx): string => newSwatchColors[colorIdx]\n );\n setIsReversed(false);\n return newSelectedColors;\n};\n\nexport const rangeValuesToContextConfig = ({ colors, rangeValues }): RangesConfig[] =>\n colors.map((color, i): RangesConfig => {\n const entry: RangesConfig = {\n value: color,\n };\n\n if (i > 0) {\n entry.from = rangeValues[i - 1];\n }\n if (i < colors.length - 1) {\n entry.to = rangeValues[i];\n }\n\n return entry;\n });\n\nconst RangeValueEditor = ({\n defaultPalettesConfig,\n onChange = () => undefined,\n palettes = defaultPalettes,\n selectedDataSelector,\n value,\n}: {\n defaultPalettesConfig: PalettesConfig;\n onChange?: (e: string, opt: string, payload: RangesConfig[]) => void;\n palettes?: Palettes;\n selectedDataSelector?: string;\n value: RangesConfig[] | null;\n}): React.ReactElement => {\n const sortedRanges = React.useMemo((): RangesConfig[] => getSortedRanges(value), [value]);\n\n const { rangeValues, selectedColors } = React.useMemo(\n () =>\n sortedRanges.reduce(\n (acc, next) => {\n if (typeof next.to === 'number') {\n acc.rangeValues.push(next.to);\n }\n acc.selectedColors.push(next.value);\n return acc;\n },\n { rangeValues: [], selectedColors: [] }\n ),\n [sortedRanges]\n );\n\n const [{ paletteTheme: selectedPaletteTheme, paletteEntry: selectedPaletteEntry }, setPalettesConfig] =\n React.useState<PalettesConfig>(() =>\n inferInitialPaletteFromContext({ defaultPalettesConfig, palettes, ranges: sortedRanges })\n );\n\n const currentSwatchColors = getSwatchColorsFromPalette({\n palettes,\n paletteInfo: selectedPaletteEntry,\n paletteTheme: selectedPaletteTheme,\n });\n\n const isSwatchCustomized = hasCustomColors({ currentSwatchColors, selectedColors });\n\n // we only want to calculate the initial reversed state when the RangeValueEditor opens since this is somewhat expensive\n // after this, the reversed state should be tracked internally by the editor itself\n\n const [isReversed, setIsReversed] = React.useState(() =>\n hasInitiallyReversedColors({\n isSwatchCustomized,\n palettes,\n selectedColors,\n selectedPaletteInfo: selectedPaletteEntry,\n selectedPaletteTheme,\n })\n );\n const calculateNewColors = React.useCallback(\n ({ paletteTheme, paletteInfo }): string[] => {\n // we don't have insertion orders if the user has gone beyond 6 range boundaries\n // in this case, the previously selected colors would be used\n // TODO(fkurniawan): A/C for more graceful state handling if more than 6 boundaries are configured\n if (rangeValues.length > 6) return selectedColors;\n return getNewColorsFromPalette({\n palettes,\n paletteTheme,\n paletteInfo,\n rangeValues,\n setIsReversed,\n });\n },\n [palettes, rangeValues, selectedColors]\n );\n\n const onChangePaletteTheme = React.useCallback(\n (newPaletteTheme): void => {\n const newColors = calculateNewColors({\n paletteTheme: newPaletteTheme,\n paletteInfo: selectedPaletteEntry,\n });\n setPalettesConfig(prev => ({ ...prev, paletteTheme: newPaletteTheme }));\n const newRanges = rangeValuesToContextConfig({ colors: newColors, rangeValues });\n onChange(null, null, newRanges);\n },\n [calculateNewColors, selectedPaletteEntry, rangeValues, onChange]\n );\n\n const onPaletteChange = React.useCallback(\n (newPaletteInfo): void => {\n const newColors = calculateNewColors({\n paletteTheme: selectedPaletteTheme,\n paletteInfo: newPaletteInfo,\n });\n setPalettesConfig(prev => ({ ...prev, paletteEntry: newPaletteInfo }));\n const newRanges = rangeValuesToContextConfig({ colors: newColors, rangeValues });\n onChange(null, null, newRanges);\n },\n [calculateNewColors, selectedPaletteTheme, rangeValues, onChange]\n );\n\n const handleOnRangeValueChange = React.useCallback(\n ({ colors, rangeValues: newRangeValues }): void => {\n const newRanges = rangeValuesToContextConfig({ colors, rangeValues: newRangeValues });\n onChange(null, null, newRanges);\n },\n [onChange]\n );\n\n // if the user changes the dataSelector (e.g. from major to trend) for something like background coloring,\n // reinitialize the palette config and the initial range values + colors using the newly selected formatter config (value)\n React.useEffect((): void => {\n setPalettesConfig(\n inferInitialPaletteFromContext({\n defaultPalettesConfig,\n palettes,\n ranges: sortedRanges,\n })\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedDataSelector]);\n\n return (\n <>\n <PalettesConfigurer\n isReversed={isReversed}\n isSwatchCustomized={isSwatchCustomized}\n onChangePaletteTheme={onChangePaletteTheme}\n onPaletteChange={onPaletteChange}\n palettes={palettes}\n selectedPaletteInfo={selectedPaletteEntry}\n selectedPaletteTheme={selectedPaletteTheme}\n />\n <RangeValueConfigurer\n customizedColors={isSwatchCustomized}\n isReversed={isReversed}\n onChange={handleOnRangeValueChange}\n precedence={getPrecedenceFromPalette({\n palettes,\n paletteTheme: selectedPaletteTheme,\n paletteInfo: selectedPaletteEntry,\n })}\n rangeValues={rangeValues}\n selectedColors={selectedColors}\n swatchColors={currentSwatchColors}\n setIsReversed={setIsReversed}\n />\n </>\n );\n};\n\nRangeValueEditor.propTypes = {\n /**\n * An onChange callback that allows the editor to customize the context accordingly based on the new thresholds\n */\n onChange: T.func,\n /**\n * The palettes object\n *\n * This consists of a theme and each themed-variant of the palettes\n */\n palettes: T.objectOf(\n T.shape({\n precedence: T.arrayOf(T.arrayOf(T.number)),\n swatches: T.arrayOf(T.arrayOf(T.string)),\n })\n ),\n /**\n * The initial ranges config from the viz context\n */\n value: T.any,\n};\n\nexport default RangeValueEditor;\n","import React, { useMemo } from 'react';\nimport * as T from 'prop-types';\nimport type { RangesConfig } from '@splunk/visualization-encoding/formatters/RangeValue';\nimport ArrowLayer from '../../shared/ArrowLayer';\nimport { ColorPreview } from './ColorPreview';\nimport type { BasePreviewProps } from '../../interfaces/BasePreviewProps';\nimport PreviewWrapper from '../../shared/PreviewWrapper';\nimport { getSortedRanges } from './RangeValue/rangeValueUtils';\n\nconst MAX_PREVIEW_COLOR_COUNT = 8;\ninterface RangeValuePreviewProps extends BasePreviewProps {\n config: RangesConfig[];\n}\nconst propTypes: Record<keyof RangeValuePreviewProps, T.Validator<any>> = {\n config: T.arrayOf(\n T.shape({\n from: T.number,\n to: T.number,\n value: T.string.isRequired,\n })\n ),\n};\n\n/**\n * For now we expect range value previews always to map to colors (until rangeValue icon use case needs it)\n * @TODO(pwied): we could provide the actual bottom and top value range to screen readers\n */\nexport const RangeValuePreview: React.FunctionComponent<RangeValuePreviewProps> = ({\n config,\n}): React.ReactElement => {\n const sortedRanges = useMemo(() => getSortedRanges(config), [config]);\n const colors = useMemo(\n () => sortedRanges.map((entry): string => entry.value).slice(0, MAX_PREVIEW_COLOR_COUNT),\n [sortedRanges]\n );\n return (\n <PreviewWrapper>\n <ArrowLayer />\n <ColorPreview data-test=\"ColorPreview\" colors={colors} maxColorCount={MAX_PREVIEW_COLOR_COUNT} />\n </PreviewWrapper>\n );\n};\nRangeValuePreview.propTypes = propTypes;\n","import * as T from 'prop-types';\nimport type { JSONSchema7 } from 'json-schema';\n\nexport interface BaseEditorProps {\n name: string;\n value: any;\n onChange?: (...args: any[]) => void;\n label?: string; // @TODO(pwied): this should not live in editor props\n labelPosition?: 'top' | 'left'; // ^^^\n context?: Record<string, any>;\n labelWidth?: number;\n isAdvanced?: boolean;\n isDisabled?: boolean;\n dataSourceBindings?: Record<string, any>;\n options?: { [k: string]: any };\n optionsSchema?: {\n [key: string]: JSONSchema7;\n };\n}\n\nexport const BaseEditorPropTypes: Record<keyof BaseEditorProps, T.Validator<any>> = {\n name: T.string.isRequired,\n value: T.oneOfType([T.string, T.object, T.arrayOf(T.string)]),\n context: T.object,\n label: T.string,\n labelPosition: T.oneOf(['top', 'left']),\n labelWidth: T.number,\n onChange: T.func,\n isAdvanced: T.bool,\n isDisabled: T.bool,\n dataSourceBindings: T.object,\n options: T.object,\n optionsSchema: T.object,\n};\n","import React, { Children, cloneElement } from 'react';\nimport type { ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup from '@splunk/react-ui/ControlGroup';\nimport type { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced = false,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nexport default AdvancedControlGroup;\n","import * as React from 'react';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport ArrowDown from '@splunk/react-icons/ArrowDown';\nimport ArrowUp from '@splunk/react-icons/ArrowUp';\n\nconst Wrapper = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n /* this aligns the first item on the far left and the other item is aligned to flex end */\n & :first-child {\n margin-right: auto;\n }\n & {\n padding: 4px 1px;\n }\n`;\n\ninterface ArrowLayerProps {\n colorDown?: string;\n colorUp?: string;\n}\n\nconst ArrowLayer = ({ colorDown, colorUp }: ArrowLayerProps): React.ReactElement => (\n <Wrapper>\n <ArrowDown aria-label={_('Bottom range')} style={{ color: colorDown || 'white' }} />\n <ArrowUp aria-label={_('Top range')} style={{ color: colorUp || 'white' }} />\n </Wrapper>\n);\n\nexport default ArrowLayer;\n","import * as React from 'react';\nimport * as T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport styled from 'styled-components';\nimport variables from '@splunk/themes/variables';\nimport Message from '@splunk/react-ui/Message';\nimport Button from '@splunk/react-ui/Button';\n\nconst defaultHeaderText = _('Dynamic Option: Customized in source');\nconst defaultInfo = _(\n 'Configured in source code beyond what can be shown here. Resetting to default will overwrite this custom configurations.'\n);\nconst defaultResetButtonText = _('Reset to default');\n\nconst PopoverContent = styled.div<{\n padding?: number | string;\n width?: number | string;\n}>`\n padding: ${({ padding }: any) => padding ?? '20px'};\n width: ${({ width }: any) => width ?? '300px'};\n color: ${variables.contentColorActive};\n`;\n\nconst PopoverHeader = styled.div`\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 10px;\n`;\n\nexport interface CustomizedInSourceMessageProps {\n headerText?: string;\n info?: string;\n resetButtonText?: string;\n onResetToDefault?: (...args: any[]) => void;\n style?: Record<string, any>;\n}\n\nconst propTypes: Record<keyof CustomizedInSourceMessageProps, T.Validator<any>> = {\n headerText: T.string,\n info: T.string,\n resetButtonText: T.string,\n onResetToDefault: T.func,\n style: T.object,\n};\n\nconst CustomizedInSourceMessage = ({\n headerText = defaultHeaderText,\n info = defaultInfo,\n resetButtonText = defaultResetButtonText,\n onResetToDefault = (): void => undefined,\n style = {},\n}: CustomizedInSourceMessageProps): React.ReactElement => (\n <PopoverContent style={style}>\n <PopoverHeader data-test=\"popover-header\">{headerText}</PopoverHeader>\n <Message data-test=\"customized-source-popover-message\" type=\"info\">\n {info}\n </Message>\n <Button\n data-test=\"popover-reset\"\n appearance=\"secondary\"\n onClick={onResetToDefault}\n label={resetButtonText}\n />\n </PopoverContent>\n);\n\nCustomizedInSourceMessage.propTypes = propTypes;\n\nexport default CustomizedInSourceMessage;\n","import styled from 'styled-components';\n\nexport default styled.div`\n border-radius: 3px; /* @TODO(pwied): should this be imported from SUI variables? */\n overflow: hidden;\n position: relative;\n width: 100%;\n height: 20px;\n`;\n","export const FLYOUT_PADDING = 21;\nexport const COLUMN_FLYOUT_PADDING = 16;\nexport const FLYOUT_WIDTH = 344;\n\nexport const VERTICAL_EDITOR_SPACING = 16;\n\nexport const DROPDOWN_MENU_WIDTH = 327;\n\nexport const editorStyle = { width: '100%' };\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@babel/runtime/helpers/extends\");","module.exports = require(\"@splunk/react-icons/ArrowDown\");","module.exports = require(\"@splunk/react-icons/ArrowUp\");","module.exports = require(\"@splunk/react-icons/ArrowsRectangularDouble\");","module.exports = require(\"@splunk/react-icons/Cross\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/Color\");","module.exports = require(\"@splunk/react-ui/ColumnLayout\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/Dropdown\");","module.exports = require(\"@splunk/react-ui/Menu\");","module.exports = require(\"@splunk/react-ui/Message\");","module.exports = require(\"@splunk/react-ui/Number\");","module.exports = require(\"@splunk/react-ui/Popover\");","module.exports = require(\"@splunk/react-ui/RadioBar\");","module.exports = require(\"@splunk/react-ui/Select\");","module.exports = require(\"@splunk/react-ui/Text\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/themes/variables\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"@splunk/ui-utils/id\");","module.exports = require(\"@splunk/visualization-color-palettes/editors/PresetPalettes\");","module.exports = require(\"@splunk/visualization-encoding/utils/dsl\");","module.exports = require(\"@splunk/visualizations-shared/colorUtils\");","module.exports = require(\"@splunk/visualizations-shared/style\");","module.exports = require(\"lodash\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(1546);\n"],"names":["require","TextContainer","styled","variables","inputHeight","StyledText","Text","getColor","color","defaultColor","prevColor","newColor","trim","isColor","ColorAndTextWrapper","id","showTextInput","palette","handleColorChange","labelledBy","textWidth","value","name","handleTextColorChange","handleKeyPress","handleBlur","isDisabled","textLabelId","useMemo","createDOMID","React","Color","key","append","onChange","disabled","hideInput","ScreenReaderContent","_","prepend","onKeyDown","onBlur","style","height","inputId","propTypes","T","isRequired","defaultItemSchema","default","emptyStyle","ColorEditor","label","labelPosition","labelWidth","COLOR_EDITOR_PALETTE","noop","itemSchema","hideLabel","customEditorStyle","setColor","useState","useEffect","debouncedOnChange","debounce","useCallback","val","_event","colorToValue","toLower","event","ControlGroup","controlsLayout","RadioBarEditor","values","options","getOptions","hasTokens","handleChange","v","controlGroupMarginFix","undefined","marginTop","RadioBar","editorStyle","map","displayContent","optionProps","icon","startAdornment","Tooltip","content","hideDefaultTooltip","_extends","SelectEditor","tooltip","isAdvanced","help","Select","description","Array","isArray","enum","item","Error","JSON","stringify","handleOptionsChange","visualization","this","props","onVisualizationChange","_objectSpread","omit","isMultipleRulesSchema","anyOf","length","isDynamicOptionSchema","schema","type","pattern","DYNAMIC_OPTIONS_DSL_PATTERN","isNestedOption","optionName","exec","getStaticItemSchema","staticSchema","find","getFormatterConfig","contextConfig","formatters","formatterFromDSL","selectedDataSelector","_currentFormatter$def2","_currentFormatter$def","currentFormatter","formatter","defaults","isContextCompatibleWithFormatter","formatterType","isSupportedDataSelector","dataSelectors","some","ds","isSupportedFormatter","selectedFormatterType","formattersFromEditor","supportedFormatters","fm","getFilteredRowsByShowEditor","row","encoding","featureFlags","filter","showEditor","removeEmptyEntries","obj","returnObj","cloneDeep","forIn","isPlainObject","getToggleOffValueForDataColors","includes","hasAreaValuesSelector","isChoroplethLayer","layerType","layerMatch","_options$layers","layerIndex","parseInt","layer","layers","convertEmptyDataColorsForChoropleth","option","setOption","oldVisualization","optionSchema","defaultOverrides","_newOption","_defaultOverrides$new","_optionSchema$newOpti","_obj$options","newOption","newValue","schemaDefault","Object","keys","set","TokenRegExp","RegExp","source","test","useRef","string","oneOf","number","onResetToDefault","func","CustomizedInSourceEditor","open","setOpen","anchor","handleOpen","handleRequestClose","onClick","appearance","ref","current","onRequestClose","defaultPlacement","FlyoutHeader","div","StyledLabel","StyledFlyoutContent","attrs","toPx","FLYOUT_PADDING","FLYOUT_WIDTH","StyledButton","BaseEditorPropTypes","flyoutTitle","arrayOf","shape","object","isDefault","bool","defaultPalettesConfig","sharedPalettesConfigPropType","showStaticTextColor","colorMode","handleColorModeChange","prepareUpdate","currentFormatterConfig","contextKey","extractedContextKey","replace","buildDSLFromDataSelectorAndFormatter","context","DynamicColorEditor","showFlyout","setShowFlyout","buttonRef","paramKey","formatterContextKey","getLastFormatterFromDSL","dataSelectorFromDSL","getDataSelectorsFromDSL","setSelectedFormatterType","setSelectedDataSelector","formatterConfigFromDSL","setCurrentFormatterConfig","handleResetToDefault","f","isEmpty","defaultFormatter","defaultDataSelector","formatterCfg","handleButtonClick","currentValue","FormatterConfigPreview","preview","inline","config","padding","takeFocus","optionLabel","optionValue","Option","FormatterEditor","onDataSelectorChange","editorName","newDataSelector","onFormatterTypeChange","newFormatter","onFormatterConfigChange","newFormatterConfig","NetworkGraphDynamicColorEditor","contextName","dataSelector","getCurrentColoringType","startsWith","coloringType","setColoringType","newColoringType","handleSelectChange","selectedName","selectedValue","updatedOptions","updatedContext","defaultConfig","dsl","handleDynamicColorEditorChange","optionStanza","handleStaticColorChange","gutter","Row","alignItems","Column","span","TOTAL_COLUMN_SPAN","ColorPreviewWrapper","isReversed","ColorPreviewItem","widthGrow","maxColorCount","colors","expandToFillHorizontalSpace","ColorPreview","trueColors","reverse","_i","exact","paletteTheme","paletteEntry","index","getSortedRanges","ranges","rangesToSort","sort","a","b","to","DEFAULT_GRADIENT_PALETTES_CONFIG","RangeValueEditorWrapper","rangeValues","from","MatchValueEditorWrapper","matchValues","match","oneOfType","GradientEditorWrapper","stops","defaultGradient","createGradientConfigFromPalettes","gradientValues","textColor","gradient","editor","rangeValue","RangeValuePreview","matchValue","MatchValuePreview","validFormatterTypes","any","showDataSelectorButtonGroup","formatterSelectorLabel","filteredFormatters","showFormatterButtonGroup","FormatterConfigEditor","AddStopWrapper","AddStopButtonWrapper","ReverseStopWrapper","ButtonStyle","marginRight","reverseIcon","AddAndReverseStops","disableAddStops","handleAddStop","handleReverse","colorIndex","toLowerCase","defaultPalette","getLuminance","hex","c","split","x","join","substring","GradientPreview","gradientString","firstColor","lastColor","arrowDownColor","arrowUpColor","colorDown","colorUp","width","borderRadius","background","StyledControlGroup","TextColorContainer","TextColorWrapper","SwatchWrapper","AutoSwatch","borderColor","contentColorActive","SwatchButton","button","ClearButton","AutoTextDisplay","AUTO_OPTION","DEFAULT_PALETTE_COLOR","GradientTextColor","onTextColorChange","isAuto","setIsAuto","colorRef","data","handleInputChange","e","target","handleClear","focus","tabIndex","GradientValueConfigurerWrapper","GradientsWrapper","GradientEntry","GradientLeft","GradientLabel","contentColorMuted","GradientValueConfigurer","swatchColors","setIsReversed","selectedColors","isSwatchCustomized","disableAddStopsProp","setDisableAddStops","isCustomSelected","setIsCustomSelected","shouldDisable","newTextColor","handleRemoveStop","indexToRemove","newColors","unused","idx","newIsCustomSelected","addPaletteGradientStop","addCustomGradientStop","reversedColors","payload","newSelectedColors","i","canRemove","onRemove","RemoveStopWrapper","RemoveStopButton","interactiveColorOverlayDrag","RemoveStop","handleOnRemove","defaultDarkGradientConfig","DARK_COLORS","sequential","swatches","defaultLightGradientConfig","LIGHT_COLORS","createDefaultPalettesConfig","providedConfig","palettesConfig","showTextColor","defaultedConfig","paletteColors","interpolateColor","color1","color2","factor","hex1","hex2","r1","g1","b1","r2","g2","b2","r","Math","round","g","toHex","n","toString","padStart","customIndices","highestColor","beforeHighestColor","slice","startIdx","endIdx","colorA","colorB","falseIndices","j","push","m","t","swatch","insertIndex","colorToAdd","max","min","findMatchingPaletteGradient","colorArr","paletteObj","candidates","forEach","theme","entries","flatMap","fullMatch","compareArr","inputMiddle","swatchMiddle","every","first","GradientEditor","palettes","initialIsReversed","initialPaletteTheme","initialPaletteEntry","setPalettesConfig","selectedPaletteTheme","selectedPaletteEntry","currentSwatchColors","getSwatchColorsFromPalette","paletteInfo","hasCustomColors","limitedColors","handleOnGradientValueChange","result","onChangePaletteTheme","newPaletteTheme","count","prev","onPaletteChange","selectedPaletteInfo","_meta","AddMatchWrapper","AddMatchButtonWrapper","ReverseMatchWrapper","reverseMatchButtonStyle","AddAndReverseMatches","disableAddMatches","handleAddMatch","MatchValueConfigurerWrapper","MatchesWrapper","MatchEntry","MatchValueConfigurer","customizedColors","precedence","newMatchValues","getNewColors","numColors","handleUpdateMatch","updatedValue","matchIndex","isNumeric","Number","error","handleRemoveMatch","splice","newSelectedColorsWithCurrentOmitted","initialValue","updateMatch","MatchTextWrapper","spacingMedium","TextRowWrapper","MatchErrorMessage","contentColorNegative","setError","shouldUpdate","MatchValueText","updatedMatchValue","setUpdatedMatchValue","isFocused","setIsFocused","handleOnFocus","handleOnChange","handleOnBlur","handleOnKeyUp","canClear","onFocus","onKeyUp","RemoveMatchWrapper","RemoveMatchButton","contentColorDisabled","RemoveMatch","getMatches","matches","isNaN","parseFloat","MATCH_VALUE_WILDCARD_INFO_TEXT","MatchValueWildcardInfo","matchValuesToContextConfig","MatchValueEditor","reduce","acc","next","inferInitialPaletteFromContext","hasInitiallyReversedColors","minimumNumberOfColors","calculateNewColors","newSwatchColors","getPrecedenceFromPalette","colorIdx","getNewColorsFromPalette","newMatches","newPaletteInfo","handleOnMatchValueChange","shouldShowArrows","objectOf","entry","paletteThemes","filteredThemedPalettes","getThemedPalettesWithoutMeta","ColorPreviewSpacer","CustomizedSwatchText","previewColors","get","initialPalettePreview","spacingSmall","isMenu","menuItems","items","arr","Heading","title","toUpperCase","isSelected","Item","selected","selectable","Divider","toggle","PresetPaletteTheme","onPaletteThemeChange","swatchColorMap","filteredPalettes","field","hasMatchingPrecedence","precedenceIndex","currentPaletteColors","reversedPrecedence","selectedColor","defaultPalettes","matchingPalette","matchedPrecedence","paletteType","k","AddRangeWrapper","AddRangeButtonWrapper","ReverseRangeWrapper","AddAndReverseRanges","disableAddRanges","handleAddRange","RangeBoundaryText","BoundaryErrorMessage","StyledNumberEditor","BoundaryRowWrapper","RangeBoundaryWrapper","handleUpdateRangeBoundary","rangeBoundaryIndex","updateRangeBoundary","RangeBoundary","rangeText","showNumberEditor","boundaryInputValue","setBoundaryInputValue","_e","RangeValueConfigurerWrapper","RangesWrapper","RangeEntry","getRangeText","lastColorIndex","RangeValueConfigurer","newRangeValues","handleRemoveRange","isLastItem","rangeBoundaryValue","RemoveRangeWrapper","RemoveRangeButton","RemoveRange","rangeValuesToContextConfig","RangeValueEditor","sortedRanges","newRanges","handleOnRangeValueChange","dataSourceBindings","optionsSchema","ControlGroupContainer","StyledToolTip","StyledAdvancedConfigButton","AdvancedConfigButton","AdvancedControlGroup","dataTest","children","onAdvancedConfigButtonClick","Children","toArray","Boolean","child","cloneElement","flex","Wrapper","defaultHeaderText","defaultInfo","defaultResetButtonText","PopoverContent","PopoverHeader","headerText","info","resetButtonText","CustomizedInSourceMessage","COLUMN_FLYOUT_PADDING","VERTICAL_EDITOR_SPACING","DROPDOWN_MENU_WIDTH","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","getter","__esModule","d","definition","o","defineProperty","enumerable","prop","prototype","hasOwnProperty","Symbol","toStringTag","__webpack_exports__"],"sourceRoot":""}