react-conditional-ui 1.2.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,"sources":["../src/components/Input.tsx","../src/hooks/useConditionalInput.ts","../src/condition-structure/Field.ts","../src/condition-structure/Operator.ts","../src/condition-structure/Value.ts","../src/fuzzy/operators.ts","../src/hooks/useConditionDataProvider.ts","../src/fuzzy/match-engine.ts","../src/logger.ts","../src/fuzzy/score.ts","../src/fuzzy/word-utils.ts","../src/conditions/parser.ts","../src/consts.ts","../src/fuzzy/providers/suggestions.ts","../src/fuzzy/providers/diagnostics.ts","../src/fuzzy/segments.ts","../src/id.ts","../src/condition-data-provider.ts","../src/components/Output.tsx","../src/components/OutputRow.tsx","../src/components/ConnectorChip.tsx","../src/components/OutputDndContext.tsx","../src/components/output-drag-end.ts","../src/hooks/useConditionalOutput.ts","../src/components/ConditionalUI.tsx"],"sourcesContent":["import { useCallback, useState, useRef, useLayoutEffect, forwardRef } from \"react\";\nimport TextField from \"@mui/material/TextField\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport IconButton from \"@mui/material/IconButton\";\nimport KeyboardReturnIcon from \"@mui/icons-material/KeyboardReturn\";\nimport ErrorOutlineIcon from \"@mui/icons-material/ErrorOutline\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport { useConditionalInput } from \"../hooks/useConditionalInput\";\nimport type { FieldOption, OperatorOption, ConditionGroup, Diagnostic } from \"../types\";\n\ntype BaseProps = {\n placeholder?: string;\n className?: string;\n style?: React.CSSProperties;\n};\n\ntype StandaloneProps = BaseProps & {\n fields: FieldOption[];\n operators?: OperatorOption[];\n value?: string;\n onChange?: (value: string) => void;\n onSubmit?: (group: ConditionGroup) => void;\n};\n\ntype ControlledProps = BaseProps & {\n fields?: undefined;\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n getSuggestion?: (text: string) => { completion: string; display: string } | null;\n getCompletions?: (text: string, limit?: number) => { completion: string; display: string }[];\n diagnostics?: Diagnostic[];\n};\n\nexport type InputProps = StandaloneProps | ControlledProps;\n\ntype InputViewProps = {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n placeholder?: string;\n getSuggestion?: (text: string) => { completion: string; display: string } | null;\n getCompletions?: (text: string, limit?: number) => { completion: string; display: string }[];\n diagnostics?: Diagnostic[];\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport function Input(props: InputProps) {\n if (isStandalone(props)) {\n return <StandaloneInput {...props} />;\n }\n\n return (\n <InputView\n value={props.value}\n onChange={props.onChange}\n onSubmit={props.onSubmit}\n getSuggestion={props.getSuggestion}\n getCompletions={props.getCompletions}\n diagnostics={props.diagnostics}\n placeholder={props.placeholder}\n className={props.className}\n style={props.style}\n />\n );\n}\n\nfunction isStandalone(props: InputProps): props is StandaloneProps {\n return props.fields !== undefined;\n}\n\nfunction buildOverlaySegments(value: string, diagnostics: Diagnostic[]) {\n const sorted = [...diagnostics].sort((a, b) => a.start - b.start);\n const segments: { text: string; diagnostic?: Diagnostic }[] = [];\n let cursor = 0;\n for (const d of sorted) {\n if (d.start > cursor) segments.push({ text: value.slice(cursor, d.start) });\n segments.push({ text: value.slice(d.start, d.end), diagnostic: d });\n cursor = d.end;\n }\n if (cursor < value.length) segments.push({ text: value.slice(cursor) });\n return segments;\n}\n\n// ── Custom input component that renders ghost + squiggly inline ──\n\ntype GhostInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n ghost?: string | null;\n diagnosticSegments?: { text: string; diagnostic?: Diagnostic }[] | null;\n inputValue?: string;\n onCursorOffset?: (left: number) => void;\n};\n\nconst GhostInput = forwardRef<HTMLInputElement, GhostInputProps>(function GhostInput(\n { ghost, diagnosticSegments, inputValue, onCursorOffset, className, ...inputProps },\n ref,\n) {\n const innerRef = useRef<HTMLInputElement | null>(null);\n const mirrorRef = useRef<HTMLSpanElement>(null);\n const ghostRef = useRef<HTMLSpanElement>(null);\n const squigglyRef = useRef<HTMLSpanElement>(null);\n\n useLayoutEffect(() => {\n if (!mirrorRef.current || !innerRef.current) return;\n const padding = parseFloat(getComputedStyle(innerRef.current).paddingLeft) || 0;\n const left = mirrorRef.current.offsetWidth + padding;\n\n if (ghostRef.current) ghostRef.current.style.left = `${left}px`;\n if (squigglyRef.current) {\n squigglyRef.current.style.paddingLeft = `${padding}px`;\n squigglyRef.current.style.paddingRight = `${padding}px`;\n }\n onCursorOffset?.(left);\n });\n\n const setRefs = useCallback(\n (el: HTMLInputElement | null) => {\n innerRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref],\n );\n\n const showSquiggly = diagnosticSegments && diagnosticSegments.some((s) => s.diagnostic);\n\n return (\n <div className=\"rcui-input-inner\">\n <input ref={setRefs} className={className} {...inputProps} />\n <span ref={mirrorRef} className=\"rcui-mirror\" aria-hidden=\"true\">\n {inputValue}\n </span>\n {ghost && (\n <span ref={ghostRef} className=\"rcui-ghost\" aria-hidden=\"true\">\n {ghost}\n </span>\n )}\n {showSquiggly && (\n <span ref={squigglyRef} className=\"rcui-squiggly-layer\" aria-hidden=\"true\">\n {diagnosticSegments.map((seg, i) =>\n seg.diagnostic ? (\n <span key={i} className=\"rcui-squiggly\" title={seg.diagnostic.message}>\n {seg.text}\n </span>\n ) : (\n <span key={i}>{seg.text}</span>\n ),\n )}\n </span>\n )}\n </div>\n );\n});\n\n// ── Component variants ──\n\nfunction StandaloneInput({\n fields,\n operators,\n value: controlledValue,\n onChange: controlledOnChange,\n onSubmit: onGroupParsed,\n placeholder,\n className,\n style,\n}: StandaloneProps) {\n const { text, diagnostics, handleChange, handleSubmit, getSuggestion, getCompletions } =\n useConditionalInput({\n fields,\n operators,\n value: controlledValue,\n onChange: controlledOnChange,\n onSubmit: onGroupParsed,\n });\n\n return (\n <InputView\n value={text}\n onChange={handleChange}\n onSubmit={handleSubmit}\n getSuggestion={getSuggestion}\n getCompletions={getCompletions}\n diagnostics={diagnostics}\n placeholder={placeholder}\n className={className}\n style={style}\n />\n );\n}\n\nfunction InputView({\n value,\n onChange,\n onSubmit,\n placeholder = \"e.g. age greater than 18, ctrl+space for suggestions\",\n getSuggestion,\n getCompletions,\n diagnostics = [],\n className,\n style,\n}: InputViewProps) {\n const [completions, setCompletions] = useState<{ completion: string; display: string }[]>([]);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [cursorLeft, setCursorLeft] = useState(0);\n const listRef = useRef<HTMLUListElement>(null);\n\n const ghost = getSuggestion && value ? (getSuggestion(value)?.completion ?? null) : null;\n\n function closeCompletions() {\n setCompletions([]);\n setActiveIndex(-1);\n }\n\n function openCompletions() {\n if (!getCompletions) return;\n const items = getCompletions(value);\n setCompletions(items);\n setActiveIndex(items.length > 0 ? 0 : -1);\n }\n\n function acceptCompletion(item: { completion: string }) {\n onChange(value + item.completion);\n closeCompletions();\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n onChange(e.target.value);\n closeCompletions();\n }\n\n function acceptGhost() {\n if (ghost) onChange(value + ghost);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (e.key === \" \" && e.ctrlKey) {\n e.preventDefault();\n openCompletions();\n return;\n }\n\n if (completions.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => (i + 1) % completions.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => (i - 1 + completions.length) % completions.length);\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (activeIndex >= 0) {\n acceptCompletion(completions[activeIndex]);\n } else {\n closeCompletions();\n onSubmit();\n }\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeCompletions();\n return;\n }\n if (e.key === \"Tab\") {\n e.preventDefault();\n if (activeIndex >= 0) {\n acceptCompletion(completions[activeIndex]);\n }\n return;\n }\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n onSubmit();\n return;\n }\n if (e.key === \"Tab\" && ghost) {\n e.preventDefault();\n acceptGhost();\n }\n }\n\n const hasErrors = diagnostics.length > 0;\n const errorSummary = diagnostics.map((d) => d.message).join(\"; \");\n const diagnosticSegments = hasErrors ? buildOverlaySegments(value, diagnostics) : null;\n\n const ghostInputProps = {\n ghost,\n diagnosticSegments,\n inputValue: value,\n onCursorOffset: setCursorLeft,\n };\n\n return (\n <div className={[\"rcui-input-wrapper\", className].filter(Boolean).join(\" \")} style={style}>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={() => setTimeout(closeCompletions, 150)}\n className=\"rcui-input\"\n slotProps={{\n input: {\n inputComponent: GhostInput,\n inputProps: ghostInputProps,\n endAdornment: (\n <InputAdornment position=\"end\">\n {hasErrors ? (\n <Tooltip title={errorSummary} arrow>\n <IconButton size=\"small\" onClick={onSubmit} edge=\"end\">\n <ErrorOutlineIcon\n fontSize=\"small\"\n className=\"rcui-adornment-error\"\n />\n </IconButton>\n </Tooltip>\n ) : (\n <IconButton size=\"small\" onClick={onSubmit} edge=\"end\">\n <KeyboardReturnIcon\n fontSize=\"small\"\n className=\"rcui-adornment-enter\"\n />\n </IconButton>\n )}\n </InputAdornment>\n ),\n },\n }}\n />\n {completions.length > 0 && (\n <ul\n ref={listRef}\n className=\"rcui-completions\"\n role=\"listbox\"\n style={{ left: cursorLeft }}\n >\n {completions.map((item, i) => (\n <li\n key={item.display}\n id={`rcui-completion-${i}`}\n role=\"option\"\n aria-selected={i === activeIndex}\n className={`rcui-completion-item${i === activeIndex ? \" rcui-completion-item--active\" : \"\"}`}\n onMouseDown={(e) => {\n e.preventDefault();\n acceptCompletion(item);\n }}\n onMouseEnter={() => setActiveIndex(i)}\n >\n {item.display}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { DEFAULT_OPERATORS } from \"../condition-structure\";\nimport type { FieldOption, OperatorOption, ConditionGroup, Diagnostic } from \"../types\";\nimport { useConditionDataProvider } from \"./useConditionDataProvider\";\n\nexport type UseConditionalInputOptions = {\n fields: FieldOption[];\n operators?: OperatorOption[];\n value?: string;\n onChange?: (raw: string) => void;\n onSubmit?: (group: ConditionGroup) => void;\n};\n\nexport function useConditionalInput({\n fields,\n operators = DEFAULT_OPERATORS,\n value,\n onChange,\n onSubmit,\n}: UseConditionalInputOptions) {\n const [internal, setInternal] = useState(\"\");\n const [diagnostics, setDiagnostics] = useState<Diagnostic[]>([]);\n const text = value ?? internal;\n\n const { parseComplexCondition, getSuggestion, getCompletions, diagnose } = useConditionDataProvider({\n fields,\n operators,\n });\n\n const handleChange = useCallback(\n (next: string) => {\n if (value === undefined) setInternal(next);\n onChange?.(next);\n setDiagnostics([]);\n },\n [value, onChange],\n );\n\n const handleSubmit = useCallback(() => {\n const group = parseComplexCondition(text);\n if (group) {\n const hasInvalid = group.entries.some(\n (e) =>\n !e.condition.field.isValid ||\n !e.condition.operator.isValid ||\n !e.condition.value.isValid,\n );\n if (!hasInvalid) {\n onSubmit?.(group);\n setDiagnostics([]);\n if (value === undefined) setInternal(\"\");\n onChange?.(\"\");\n return;\n }\n }\n setDiagnostics(diagnose(text));\n }, [text, parseComplexCondition, diagnose, value, onChange, onSubmit]);\n\n return { text, diagnostics, handleChange, handleSubmit, getSuggestion, getCompletions };\n}\n","export class Field {\n readonly raw: string;\n readonly value: string;\n readonly label: string;\n readonly isValid: boolean;\n\n constructor(raw: string, value: string, label: string) {\n this.raw = raw;\n this.value = value;\n this.label = label;\n this.isValid = value !== \"\";\n }\n\n static invalid(raw: string): Field {\n return new Field(raw, \"\", raw);\n }\n}\n","export class Operator {\n readonly raw: string;\n readonly value: string;\n readonly label: string;\n readonly isValid: boolean;\n\n constructor(raw: string, value: string, label: string) {\n this.raw = raw;\n this.value = value;\n this.label = label;\n this.isValid = value !== \"\";\n }\n\n static invalid(raw: string): Operator {\n return new Operator(raw, \"\", raw);\n }\n}\n","import type { FieldOption } from \"../types\";\n\nexport class Value {\n readonly raw: string;\n readonly value: string;\n readonly label: string;\n readonly isValid: boolean;\n readonly errorMessage: string | null;\n readonly matchedOption: FieldOption | null;\n\n constructor(\n raw: string,\n opts: {\n isValid: boolean;\n errorMessage?: string | null;\n matchedOption?: FieldOption | null;\n } = { isValid: raw.length > 0 },\n ) {\n this.raw = raw;\n this.isValid = opts.isValid;\n this.errorMessage = opts.errorMessage ?? null;\n this.matchedOption = opts.matchedOption ?? null;\n this.value = this.matchedOption?.value ?? raw;\n this.label = this.matchedOption?.label ?? raw;\n }\n\n static valid(raw: string, matchedOption?: FieldOption): Value {\n return new Value(raw, { isValid: true, matchedOption });\n }\n\n static invalid(raw: string, errorMessage: string): Value {\n return new Value(raw, { isValid: false, errorMessage });\n }\n\n static empty(): Value {\n return new Value(\"\", { isValid: false, errorMessage: \"Missing value\" });\n }\n}\n","import type { OperatorOption } from \"../types\";\n\nexport const DEFAULT_OPERATORS: OperatorOption[] = [\n {\n label: \"equals\",\n value: \"eq\",\n aliases: [\"equals\", \"equal\", \"equal to\", \"is equal to\", \"eq\", \"=\", \"==\", \"is\"],\n },\n {\n label: \"not equals\",\n value: \"ne\",\n aliases: [\n \"not equals\",\n \"not equal\",\n \"not equal to\",\n \"is not equal to\",\n \"ne\",\n \"!=\",\n \"is not\",\n \"isn't\",\n \"isnt\",\n \"doesn't equal\",\n \"does not equal\",\n ],\n },\n {\n label: \"greater than\",\n value: \"gt\",\n aliases: [\n \"greater than\",\n \"gt\",\n \">\",\n \"more than\",\n \"bigger than\",\n \"above\",\n \"exceeds\",\n \"higher than\",\n ],\n },\n {\n label: \"greater than or equal to\",\n value: \"gte\",\n aliases: [\n \"greater than or equal to\",\n \"greater than or equal\",\n \"gte\",\n \">=\",\n \"at least\",\n \"no less than\",\n \"not less than\",\n \"not smaller than\",\n \"not below\",\n \"not under\",\n ],\n },\n {\n label: \"less than\",\n value: \"lt\",\n aliases: [\n \"less than\",\n \"lt\",\n \"<\",\n \"fewer than\",\n \"smaller than\",\n \"below\",\n \"under\",\n \"lower than\",\n ],\n },\n {\n label: \"less than or equal to\",\n value: \"lte\",\n aliases: [\n \"less than or equal to\",\n \"less than or equal\",\n \"lte\",\n \"<=\",\n \"at most\",\n \"no more than\",\n \"not greater than\",\n \"not bigger than\",\n \"not above\",\n \"not more than\",\n ],\n },\n {\n label: \"contains\",\n value: \"contains\",\n aliases: [\"contains\", \"includes\", \"has\", \"not missing\"],\n },\n];\n","import { useMemo, useCallback } from \"react\";\nimport { ConditionDataProvider } from \"../condition-data-provider\";\nimport { DEFAULT_OPERATORS } from \"../condition-structure\";\nimport type { FieldOption, OperatorOption, ConditionGroup, Diagnostic } from \"../types\";\n\nexport type UseConditionDataProviderOptions = {\n fields: FieldOption[];\n operators?: OperatorOption[];\n};\n\nexport type UseConditionDataProviderResult = {\n provider: ConditionDataProvider;\n parseComplexCondition: (text: string) => ConditionGroup | null;\n getCompletions: (text: string, limit?: number) => { completion: string; display: string }[];\n getSuggestion: (text: string) => { completion: string; display: string } | null;\n diagnose: (text: string) => Diagnostic[];\n};\n\nexport function useConditionDataProvider({\n fields,\n operators = DEFAULT_OPERATORS,\n}: UseConditionDataProviderOptions): UseConditionDataProviderResult {\n const provider = useMemo(\n () => new ConditionDataProvider(fields, operators),\n [fields, operators],\n );\n\n const parseComplexCondition = useCallback(\n (text: string) => provider.parseComplexCondition(text),\n [provider],\n );\n const getCompletions = useCallback(\n (text: string, limit?: number) => provider.getCompletions(text, limit),\n [provider],\n );\n const getSuggestion = useCallback((text: string) => provider.getSuggestion(text), [provider]);\n const diagnose = useCallback((text: string) => provider.diagnose(text), [provider]);\n\n return { provider, parseComplexCondition, getCompletions, getSuggestion, diagnose };\n}\n","import Fuse from \"fuse.js\";\nimport type { FieldOption, FieldType, OperatorOption } from \"../types\";\nimport { Value } from \"../condition-structure/Value\";\nimport { createLogger } from \"../logger\";\n\nconst log = createLogger(\"match-engine\");\nconst valueLog = createLogger(\"value\");\n\ntype FlatAlias = { alias: string; operator: OperatorOption };\nexport type FuseMatch<T> = { option: T; score: number };\n\nconst TYPE_ALLOWED_OPS: Record<FieldType, Set<string>> = {\n number: new Set([\"eq\", \"ne\", \"gt\", \"lt\", \"gte\", \"lte\"]),\n enum: new Set([\"eq\", \"ne\"]),\n text: new Set([\"eq\", \"ne\", \"contains\", \"starts_with\"]),\n};\n\nexport class MatchEngine {\n readonly fields: FieldOption[];\n readonly operators: OperatorOption[];\n\n private readonly fieldFuse: Fuse<FieldOption>;\n private readonly opFuse: Fuse<FlatAlias>;\n private readonly perFieldOpFuse: Map<string, Fuse<FlatAlias>>;\n\n constructor(fields: FieldOption[], operators: OperatorOption[]) {\n this.fields = fields;\n this.operators = operators;\n\n this.fieldFuse = new Fuse(fields, {\n keys: [\"label\"],\n threshold: 0.4,\n includeScore: true,\n });\n\n const flatAliases: FlatAlias[] = operators.flatMap((op) =>\n op.aliases.map((alias) => ({ alias: alias.toLowerCase(), operator: op })),\n );\n this.opFuse = new Fuse(flatAliases, {\n keys: [\"alias\"],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.perFieldOpFuse = new Map();\n for (const field of fields) {\n const restricted = this.resolveOpsForField(field, operators);\n if (restricted !== operators) {\n const aliases: FlatAlias[] = restricted.flatMap((op) =>\n op.aliases.map((alias) => ({ alias: alias.toLowerCase(), operator: op })),\n );\n this.perFieldOpFuse.set(\n field.value,\n new Fuse(aliases, { keys: [\"alias\"], threshold: 0.4, includeScore: true }),\n );\n }\n }\n }\n\n matchField(candidate: string): FuseMatch<FieldOption> | null {\n const results = this.fieldFuse.search(candidate);\n if (results.length > 0 && (results[0].score ?? 1) <= 0.4) {\n log(\n \"field match: %s -> %s (score: %f)\",\n candidate,\n results[0].item.value,\n results[0].score,\n );\n return { option: results[0].item, score: results[0].score ?? 1 };\n }\n return null;\n }\n\n matchOperator(candidate: string, field?: FieldOption): FuseMatch<OperatorOption> | null {\n const fuse = (field && this.perFieldOpFuse.get(field.value)) ?? this.opFuse;\n const results = fuse.search(candidate);\n if (results.length > 0 && (results[0].score ?? 1) <= 0.4) {\n const alias = results[0].item.alias;\n const candidateWords = candidate.split(/\\s+/).length;\n const aliasWords = alias.split(/\\s+/).length;\n if (candidateWords !== aliasWords) return null;\n if (candidate.length < alias.length * 0.5) return null;\n\n log(\n \"operator match: %s -> %s (score: %f)\",\n candidate,\n results[0].item.operator.value,\n results[0].score,\n );\n return { option: results[0].item.operator, score: results[0].score ?? 1 };\n }\n return null;\n }\n\n static matchValue(raw: string, fieldConfig?: FieldOption): Value {\n const knownValues = fieldConfig?.fieldValues;\n const validateValue = fieldConfig?.validateValue;\n const fieldType = fieldConfig?.type;\n\n if (knownValues && knownValues.length > 0) {\n return MatchEngine.matchKnownValue(raw, knownValues, validateValue);\n }\n\n if (raw.length === 0) return Value.empty();\n\n if (validateValue) {\n const result = validateValue(raw);\n if (result !== true) return Value.invalid(raw, result);\n return Value.valid(raw);\n }\n\n if (fieldType === \"number\" && !isFinite(Number(raw))) {\n valueLog(\"numeric validation failed: raw=%s\", raw);\n return Value.invalid(raw, \"Expected a number\");\n }\n\n return Value.valid(raw);\n }\n\n private static matchKnownValue(\n raw: string,\n knownValues: FieldOption[],\n validateValue?: (raw: string) => true | string,\n ): Value {\n const lower = raw.toLowerCase();\n const exact = knownValues.find(\n (v) => v.value.toLowerCase() === lower || v.label.toLowerCase() === lower,\n );\n\n if (exact) {\n valueLog(\"exact match: raw=%s -> %s\", raw, exact.value);\n return MatchEngine.applyValidator(raw, exact, validateValue);\n }\n\n if (raw.length === 0) return Value.invalid(raw, \"Value not recognized\");\n\n const fuse = new Fuse(knownValues, {\n keys: [\"label\", \"value\"],\n threshold: 0.4,\n includeScore: true,\n });\n\n const results = fuse.search(raw);\n if (results.length > 0 && (results[0].score ?? 1) <= 0.4) {\n valueLog(\n \"fuzzy match: raw=%s -> %s (score: %f)\",\n raw,\n results[0].item.value,\n results[0].score,\n );\n return MatchEngine.applyValidator(raw, results[0].item, validateValue);\n }\n\n valueLog(\"no match: raw=%s\", raw);\n return Value.invalid(raw, \"Value not recognized\");\n }\n\n private static applyValidator(\n raw: string,\n matched: FieldOption,\n validateValue?: (raw: string) => true | string,\n ): Value {\n if (validateValue) {\n const result = validateValue(raw);\n if (result !== true) return Value.invalid(raw, result);\n }\n return Value.valid(raw, matched);\n }\n\n private resolveOpsForField(field: FieldOption, allOps: OperatorOption[]): OperatorOption[] {\n if (field.operators) return field.operators;\n if (field.type) {\n const allowed = TYPE_ALLOWED_OPS[field.type];\n return allOps.filter((op) => allowed.has(op.value));\n }\n return allOps;\n }\n}\n","import createDebug from \"debug\";\n\nconst BASE = \"react-conditional-ui\";\n\nexport const createLogger = (namespace: string) => createDebug(`${BASE}:${namespace}`);\n","import { ParsedCondition } from \"../types\";\n\nconst AMBIGUOUS_OP_WORDS = new Set([\"is\", \"has\"]);\nconst AMBIGUITY_PENALTY = 0.35;\nconst LINKING_VERB_PENALTY = 0.35;\nconst LENGTH_BONUS_PER_WORD = 0.01;\nconst GAP_PENALTY_PER_WORD = 0.3;\n\nconst UNPARSED_PENALTY = 10;\nconst FREETEXT_WORD_COST = 0.1;\n\nexport function adjustOperatorScore(\n baseScore: number,\n words: string[],\n start: number,\n end: number,\n): number {\n let score = baseScore;\n\n const firstWord = words[start];\n if (end - start === 1 && AMBIGUOUS_OP_WORDS.has(firstWord)) {\n score += AMBIGUITY_PENALTY;\n } else if (end - start > 1 && AMBIGUOUS_OP_WORDS.has(firstWord)) {\n score += LINKING_VERB_PENALTY;\n }\n\n score -= (end - start) * LENGTH_BONUS_PER_WORD;\n\n if (start > 0) {\n score += start * GAP_PENALTY_PER_WORD;\n }\n\n return score;\n}\n\nexport function scoreConditions(conditions: ParsedCondition[], segmentCount: number): number {\n const unparsed = segmentCount - conditions.length;\n let score = unparsed * UNPARSED_PENALTY;\n for (const c of conditions) {\n score += c.score;\n if (!c.field.isValid) score += UNPARSED_PENALTY;\n if (!c.operator.isValid) score += UNPARSED_PENALTY;\n if (!c.value.isValid) score += UNPARSED_PENALTY;\n if (c.value.isValid && c.value.matchedOption === null) {\n score += c.value.raw.split(/\\s+/).length * FREETEXT_WORD_COST;\n }\n }\n return score;\n}\n","const NOISE_WORDS = new Set([\n \"when\",\n \"if\",\n \"the\",\n \"where\",\n \"show\",\n \"that\",\n \"then\",\n \"a\",\n \"an\",\n \"for\",\n \"while\",\n \"can\",\n \"expect\",\n \"check\",\n \"verify\",\n \"ensure\",\n \"find\",\n \"get\",\n \"list\",\n \"filter\",\n \"only\",\n \"all\",\n \"with\",\n \"having\",\n \"whose\",\n \"which\",\n \"given\",\n \"assuming\",\n \"suppose\",\n \"i\",\n \"want\",\n \"need\",\n \"like\",\n \"please\",\n \"me\",\n \"my\",\n]);\n\nexport function powerSet<T>(items: T[]): T[][] {\n const result: T[][] = [];\n const total = 1 << items.length;\n for (let mask = 1; mask < total; mask++) {\n const subset: T[] = [];\n for (let i = 0; i < items.length; i++) {\n if (mask & (1 << i)) subset.push(items[i]);\n }\n result.push(subset);\n }\n return result;\n}\n\nexport function splitAtIndices(words: string[], indices: number[]): string[] {\n const segments: string[] = [];\n let start = 0;\n for (const idx of indices) {\n segments.push(words.slice(start, idx).join(\" \"));\n start = idx + 1;\n }\n segments.push(words.slice(start).join(\" \"));\n return segments;\n}\n\nexport function stripLeadingNoise(words: string[]): string[] {\n let i = 0;\n while (i < words.length && NOISE_WORDS.has(words[i])) i++;\n const result = words.slice(i);\n return result;\n}\n","import type { FieldOption, FieldType, OperatorOption, ParsedCondition } from \"../types\";\nimport { createLogger } from \"../logger\";\nimport { Operator, Value, Field } from \"../condition-structure\";\nimport { adjustOperatorScore } from \"../fuzzy/score\";\nimport { stripLeadingNoise } from \"../fuzzy/word-utils\";\nimport { MatchEngine, type FuseMatch } from \"../fuzzy/match-engine\";\n\nconst log = createLogger(\"parser\");\n\ntype OpCandidate = {\n match: FuseMatch<OperatorOption>;\n raw: string;\n endIdx: number;\n adjustedScore: number;\n};\n\nconst TYPE_ALLOWED_OPS: Record<FieldType, Set<string>> = {\n number: new Set([\"eq\", \"ne\", \"gt\", \"lt\", \"gte\", \"lte\"]),\n enum: new Set([\"eq\", \"ne\"]),\n text: new Set([\"eq\", \"ne\", \"contains\", \"starts_with\"]),\n};\n\nexport class ConditionParser {\n readonly fields: FieldOption[];\n readonly operators: OperatorOption[];\n private readonly engine: MatchEngine;\n\n constructor(engine: MatchEngine) {\n this.fields = engine.fields;\n this.operators = engine.operators;\n this.engine = engine;\n }\n\n public parse(text: string): ParsedCondition | null {\n const input = text.trim().toLowerCase();\n if (!input) return null;\n\n const allWords = input.split(/\\s+/);\n const words = stripLeadingNoise(allWords);\n if (words.length === 0) return null;\n\n const fieldResult = this.identifyField(words);\n if (!fieldResult) return null;\n\n if (fieldResult.remaining.length === 0) {\n return {\n field: fieldResult.field,\n operator: Operator.invalid(\"\"),\n value: Value.empty(),\n score: fieldResult.fieldScore,\n };\n }\n\n const { operator, value, operatorScore } = this.resolveOperator(\n fieldResult.remaining,\n fieldResult.fieldOption,\n );\n\n const result: ParsedCondition = {\n field: fieldResult.field,\n operator,\n value,\n score: fieldResult.fieldScore + operatorScore,\n };\n\n log(\n \"result: field=%s(%s) op=%s(%s) value=%s (valid: %o)\",\n result.field.value,\n result.field.label,\n result.operator.value,\n result.operator.label,\n result.value.value,\n {\n field: result.field.isValid,\n op: result.operator.isValid,\n value: result.value.isValid,\n },\n );\n\n return result;\n }\n\n public identifyField(words: string[]): {\n field: Field;\n fieldOption: FieldOption;\n fieldScore: number;\n remaining: string[];\n } | null {\n let best: { candidate: string; match: FuseMatch<FieldOption>; wordCount: number } | null =\n null;\n\n for (let i = words.length; i >= 1; i--) {\n const candidate = words.slice(0, i).join(\" \");\n const match = this.engine.matchField(candidate);\n if (match && (!best || match.score < best.match.score)) {\n best = { candidate, match, wordCount: i };\n }\n }\n\n if (!best) return null;\n\n return {\n field: new Field(best.candidate, best.match.option.value, best.match.option.label),\n fieldOption: best.match.option,\n fieldScore: best.match.score,\n remaining: words.slice(best.wordCount),\n };\n }\n\n public getOperatorCandidates(words: string[], fieldOption: FieldOption): OpCandidate[] {\n const candidates: OpCandidate[] = [];\n\n for (let start = 0; start < words.length; start++) {\n for (let end = start + 1; end <= words.length; end++) {\n const opRaw = words.slice(start, end).join(\" \");\n const opMatch = this.engine.matchOperator(opRaw, fieldOption);\n if (!opMatch) continue;\n\n const adjustedScore = adjustOperatorScore(opMatch.score, words, start, end);\n\n candidates.push({\n match: opMatch,\n raw: opRaw,\n endIdx: end,\n adjustedScore,\n });\n }\n }\n\n candidates.sort((a, b) => a.adjustedScore - b.adjustedScore);\n\n if (candidates.length > 0) {\n log(\n \"operator candidates: %o\",\n candidates.map(\n (c) => `${c.raw} -> ${c.match.option.value} (${c.adjustedScore.toFixed(3)})`,\n ),\n );\n }\n\n return candidates;\n }\n\n resolveOperator(\n words: string[],\n fieldOption: FieldOption,\n ): { operator: Operator; value: Value; operatorScore: number } {\n const candidates = this.getOperatorCandidates(words, fieldOption);\n\n if (candidates.length === 0) {\n return {\n operator: Operator.invalid(words.join(\" \")),\n value: Value.empty(),\n operatorScore: 1,\n };\n }\n\n for (const candidate of candidates) {\n const valueRaw = words.slice(candidate.endIdx).join(\" \");\n const value = MatchEngine.matchValue(valueRaw, fieldOption);\n\n if (value.isValid) {\n const op = candidate.match.option;\n return {\n operator: new Operator(candidate.raw, op.value, op.label),\n value,\n operatorScore: candidate.adjustedScore,\n };\n }\n\n log(\n \"operator '%s' (%s) rejected — value '%s' invalid, trying next\",\n candidate.raw,\n candidate.match.option.value,\n valueRaw,\n );\n }\n\n const best = candidates[0];\n const bestOp = best.match.option;\n const valueRaw = words.slice(best.endIdx).join(\" \");\n return {\n operator: new Operator(best.raw, bestOp.value, bestOp.label),\n value: MatchEngine.matchValue(valueRaw, fieldOption),\n operatorScore: best.adjustedScore,\n };\n }\n\n resolveOpsForField(field: FieldOption, allOps: OperatorOption[]): OperatorOption[] {\n if (field.operators) return field.operators;\n if (field.type) {\n const allowed = TYPE_ALLOWED_OPS[field.type];\n return allOps.filter((op) => allowed.has(op.value));\n }\n return allOps;\n }\n\n allowedOpsForField(field: FieldOption): OperatorOption[] {\n return this.resolveOpsForField(field, this.operators);\n }\n\n prefixMatch(\n partial: string,\n candidates: string[],\n ): { completion: string; display: string } | null {\n const matches = this.prefixMatches(partial, candidates);\n return matches.length > 0 ? matches[0] : null;\n }\n\n prefixMatches(\n partial: string,\n candidates: string[],\n limit = 6,\n ): { completion: string; display: string }[] {\n const lower = partial.toLowerCase();\n const results: { completion: string; display: string }[] = [];\n for (const candidate of candidates) {\n const cl = candidate.toLowerCase();\n if (cl.startsWith(lower) && cl !== lower) {\n results.push({ completion: cl.slice(lower.length), display: candidate });\n if (results.length >= limit) break;\n }\n }\n return results;\n }\n}\n","export const AND_CONJUNCTION = \"and\";\nexport const OR_CONJUNCTION = \"or\";\n","import { AND_CONJUNCTION, OR_CONJUNCTION } from \"../../consts\";\nimport { ConditionParser } from \"../../conditions/parser\";\nimport { SegmentResolver } from \"../segments\";\n\nexport class SuggestionsProvider {\n public constructor(\n private readonly parser: ConditionParser,\n private readonly segmentResolver: SegmentResolver,\n ) {}\n\n public getCompletions(text: string, limit = 6): { completion: string; display: string }[] {\n const { last, before } = this.splitForSuggestion(text);\n const trailingSpace = /\\s$/.test(text) ? \" \" : \"\";\n\n const direct = this.completionsForSegment(last + trailingSpace, limit);\n if (direct.length > 0) return direct;\n\n if (!before) return [];\n const { conditions } = this.segmentResolver.resolve(before);\n const previous = conditions[conditions.length - 1];\n if (!previous) return [];\n\n const inherited = `${previous.field.raw} ${previous.operator.raw} ${last}${trailingSpace}`;\n return this.completionsForSegment(inherited, limit);\n }\n\n public getSuggestion(text: string): { completion: string; display: string } | null {\n if (!text.trim()) return null;\n const results = this.getCompletions(text, 1);\n if (results.length === 0) return null;\n const r = results[0];\n if (r.completion === r.display && /\\s$/.test(text)) return null;\n return r;\n }\n\n private completionsForSegment(\n text: string,\n limit: number,\n ): { completion: string; display: string }[] {\n const input = text.trimStart().toLowerCase();\n if (!input) {\n return this.parser.fields\n .slice(0, limit)\n .map((f) => ({ completion: f.label, display: f.label }));\n }\n\n const endsWithSpace = /\\s$/.test(input);\n const words = input.split(/\\s+/).filter(Boolean);\n if (words.length === 0) return [];\n\n const fieldResult = this.parser.identifyField(words);\n\n if (!fieldResult) {\n if (endsWithSpace) return [];\n return this.parser.prefixMatches(\n words.join(\" \"),\n this.parser.fields.map((f) => f.label),\n limit,\n );\n }\n\n const fieldOption = fieldResult.fieldOption;\n\n if (fieldResult.remaining.length === 0) {\n if (endsWithSpace) {\n const ops = this.parser.allowedOpsForField(fieldOption);\n return ops\n .slice(0, limit)\n .map((op) => ({ completion: op.label, display: op.label }));\n }\n return this.parser.prefixMatches(\n words.join(\" \"),\n this.parser.fields.map((f) => f.label),\n limit,\n );\n }\n\n const candidates = this.parser.getOperatorCandidates(fieldResult.remaining, fieldOption);\n const bestOp = candidates[0];\n\n if (!bestOp || bestOp.endIdx > fieldResult.remaining.length) {\n if (endsWithSpace) return [];\n const ops = this.parser.allowedOpsForField(fieldOption);\n const aliases = ops.flatMap((op) => op.aliases);\n const opPartial = fieldResult.remaining.join(\" \");\n return this.parser.prefixMatches(opPartial, aliases, limit);\n }\n\n const valueRaw = fieldResult.remaining.slice(bestOp.endIdx).join(\" \");\n\n if (!valueRaw) {\n if (endsWithSpace) {\n const fieldValues = fieldOption.fieldValues;\n if (!fieldValues?.length) return [];\n return fieldValues\n .slice(0, limit)\n .map((v) => ({ completion: v.label, display: v.label }));\n }\n const ops = this.parser.allowedOpsForField(fieldOption);\n const aliases = ops.flatMap((op) => op.aliases);\n const opPartial = fieldResult.remaining.join(\" \");\n return this.parser.prefixMatches(opPartial, aliases, limit);\n }\n\n if (endsWithSpace) return [];\n const fieldValues = fieldOption.fieldValues;\n if (!fieldValues?.length) return [];\n return this.parser.prefixMatches(\n valueRaw,\n fieldValues.map((v) => v.label),\n limit,\n );\n }\n\n private splitForSuggestion(text: string): { last: string; before: string | null } {\n const words = text.split(/\\s+/);\n for (let i = words.length - 1; i > 0; i--) {\n const lower = words[i].toLowerCase();\n if (lower === AND_CONJUNCTION || lower === OR_CONJUNCTION) {\n const last = words.slice(i + 1).join(\" \");\n if (!last) break;\n return {\n before: words.slice(0, i).join(\" \"),\n last,\n };\n }\n }\n return { last: text, before: null };\n }\n}\n","import { Diagnostic } from \"../../types\";\nimport { ConditionParser } from \"../../conditions/parser\";\nimport { SegmentResolver } from \"../segments\";\n\nexport class DiagnosticsProvider {\n public constructor(\n private readonly parser: ConditionParser,\n private readonly segmentResolver: SegmentResolver,\n ) {}\n\n public diagnose(text: string): Diagnostic[] {\n const input = text.trim();\n if (!input) return [{ start: 0, end: text.length || 1, message: \"Empty condition\" }];\n\n const { segments, conditions } = this.segmentResolver.resolve(input);\n const diagnostics: Diagnostic[] = [];\n\n if (conditions.length === 0) {\n return [\n { start: 0, end: input.length, message: \"Could not understand this condition\" },\n ];\n }\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const offset = input.toLowerCase().indexOf(seg.toLowerCase());\n const condition = conditions[i];\n\n if (!condition) {\n diagnostics.push({\n start: offset,\n end: offset + seg.length,\n message: \"Could not understand this condition\",\n });\n continue;\n }\n\n if (!condition.operator.isValid) {\n const fieldEnd = offset + condition.field.raw.length;\n const fieldConfig = this.parser.fields.find(\n (f) => f.value === condition.field.value,\n );\n const hasRestriction = fieldConfig?.operators || fieldConfig?.type;\n diagnostics.push({\n start: fieldEnd,\n end: offset + seg.length,\n message: hasRestriction\n ? `Operator not supported for ${condition.field.label}`\n : \"Unknown operator\",\n });\n }\n\n if (condition.operator.isValid && !condition.value.isValid) {\n if (!condition.value.raw) {\n diagnostics.push({\n start: offset + seg.length,\n end: offset + seg.length + 1,\n message: \"Missing value\",\n });\n } else {\n const valStart =\n offset + seg.toLowerCase().lastIndexOf(condition.value.raw.toLowerCase());\n diagnostics.push({\n start: valStart,\n end: valStart + condition.value.raw.length,\n message:\n condition.value.errorMessage ??\n `Value not recognized for ${condition.field.label}`,\n });\n }\n }\n }\n\n return diagnostics;\n }\n}\n","import { log } from \"debug\";\nimport { ParsedCondition, LogicalOperator, ConditionEntry, ConditionGroup } from \"../types\";\nimport { scoreConditions } from \"./score\";\nimport { powerSet, splitAtIndices } from \"./word-utils\";\nimport { AND_CONJUNCTION, OR_CONJUNCTION } from \"../consts\";\nimport { generateId } from \"../id\";\nimport { ConditionParser } from \"../conditions/parser\";\n\ntype SplitCandidate = {\n segments: string[];\n conditions: ParsedCondition[];\n connector: LogicalOperator;\n};\n\nexport class SegmentResolver {\n public constructor(private readonly parser: ConditionParser) {}\n\n public resolve(text: string): {\n segments: string[];\n conditions: ParsedCondition[];\n connector: LogicalOperator;\n } {\n const originalWords = text.split(/\\s+/);\n const lowerWords = originalWords.map((w) => w.toLowerCase());\n\n const conjIndices: { index: number; conjunction: LogicalOperator }[] = [];\n for (let i = 0; i < lowerWords.length; i++) {\n if (lowerWords[i] === AND_CONJUNCTION || lowerWords[i] === OR_CONJUNCTION) {\n conjIndices.push({ index: i, conjunction: lowerWords[i] as LogicalOperator });\n }\n }\n\n if (conjIndices.length === 0) {\n const single = this.parser.parse(text);\n return {\n segments: [text],\n conditions: single ? [single] : [],\n connector: AND_CONJUNCTION,\n };\n }\n\n const noSplit = this.parser.parse(text);\n let best: SplitCandidate = {\n segments: [text],\n conditions: noSplit ? [noSplit] : [],\n connector: AND_CONJUNCTION,\n };\n let bestScore = scoreConditions(best.conditions, 1);\n\n for (const subset of powerSet(conjIndices)) {\n const connector = subset[0].conjunction;\n if (subset.some((s) => s.conjunction !== connector)) continue;\n\n const splitIndices = subset.map((s) => s.index);\n const segments = splitAtIndices(originalWords, splitIndices);\n if (segments.some((s) => !s)) continue;\n\n const conditions = this.parseSegments(segments);\n const score = scoreConditions(conditions, segments.length);\n\n if (score < bestScore) {\n bestScore = score;\n best = { segments, conditions, connector };\n }\n }\n\n if (\n best.conditions.length === 1 &&\n best.conditions[0].value.isValid &&\n best.conditions[0].value.matchedOption === null\n ) {\n const valueWords = best.conditions[0].value.raw.split(/\\s+/);\n const conjInValue = valueWords.find(\n (w) => w.toLowerCase() === AND_CONJUNCTION || w.toLowerCase() === OR_CONJUNCTION,\n );\n\n if (conjInValue) {\n const connector = conjInValue.toLowerCase() as LogicalOperator;\n const matching = conjIndices.filter((c) => c.conjunction === connector);\n\n for (const subset of powerSet(matching).reverse()) {\n const splitIndices = subset.map((s) => s.index);\n const segments = splitAtIndices(originalWords, splitIndices);\n if (segments.some((s) => !s)) continue;\n\n const conditions = this.parseSegments(segments);\n if (\n conditions.length === segments.length &&\n conditions.every((c) => c.field.isValid && c.operator.isValid)\n ) {\n return { segments, conditions, connector };\n }\n }\n }\n }\n\n return best;\n }\n\n public parseConditions(text: string): ConditionGroup | null {\n const input = text.trim();\n if (!input) return null;\n\n const { conditions, connector } = this.resolve(input);\n if (conditions.length === 0) return null;\n\n const entries: ConditionEntry[] = conditions.map((condition: ParsedCondition) => ({\n id: generateId(),\n condition,\n connector,\n }));\n\n return { id: generateId(), entries };\n }\n\n private parseSegments(segments: string[]): ParsedCondition[] {\n const conditions: ParsedCondition[] = [];\n for (const segment of segments) {\n const previous = conditions[conditions.length - 1] ?? null;\n const result = this.getInherited(segment, previous) ?? this.parser.parse(segment);\n if (result) conditions.push(result);\n }\n return conditions;\n }\n\n private getInherited(\n segment: string,\n previous: ParsedCondition | null,\n ): ParsedCondition | null {\n if (!previous) return null;\n\n const direct = this.parser.parse(segment);\n if (direct && direct.operator.isValid) return direct;\n\n const inheritField = `${previous.field.raw} ${segment}`;\n const fieldOnly = this.parser.parse(inheritField);\n if (fieldOnly && fieldOnly.operator.isValid) {\n log(\"inheriting field for segment: %s -> %s\", segment, inheritField);\n return fieldOnly;\n }\n\n const inheritAll = `${previous.field.raw} ${previous.operator.raw} ${segment}`;\n const full = this.parser.parse(inheritAll);\n if (full) {\n log(\"inheriting field+op for segment: %s -> %s\", segment, inheritAll);\n return full;\n }\n\n return direct;\n }\n}\n","let counter = 0;\n\nexport const generateId = (): string => {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return `id-${Date.now()}-${++counter}`;\n};\n","import { MatchEngine } from \"./fuzzy/match-engine\";\nimport { ConditionParser } from \"./conditions/parser\";\nimport { SuggestionsProvider } from \"./fuzzy/providers/suggestions\";\nimport { DiagnosticsProvider } from \"./fuzzy/providers/diagnostics\";\nimport type { FieldOption, OperatorOption, ConditionGroup, Diagnostic } from \"./types\";\nimport { SegmentResolver } from \"./fuzzy/segments\";\n\nexport class ConditionDataProvider {\n private readonly suggestions: SuggestionsProvider;\n private readonly diagnostics: DiagnosticsProvider;\n private readonly segments: SegmentResolver;\n\n public constructor(fields: FieldOption[], operators: OperatorOption[]) {\n const engine = new MatchEngine(fields, operators);\n const parser = new ConditionParser(engine);\n this.segments = new SegmentResolver(parser);\n this.suggestions = new SuggestionsProvider(parser, this.segments);\n this.diagnostics = new DiagnosticsProvider(parser, this.segments);\n }\n\n public parseComplexCondition(text: string): ConditionGroup | null {\n return this.segments.parseConditions(text);\n }\n\n public getCompletions(text: string, limit = 6): { completion: string; display: string }[] {\n return this.suggestions.getCompletions(text, limit);\n }\n\n public getSuggestion(text: string): { completion: string; display: string } | null {\n return this.suggestions.getSuggestion(text);\n }\n\n public diagnose(text: string): Diagnostic[] {\n return this.diagnostics.diagnose(text);\n }\n}\n","import Chip from \"@mui/material/Chip\";\nimport Paper from \"@mui/material/Paper\";\nimport Typography from \"@mui/material/Typography\";\nimport { SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport { useDroppable } from \"@dnd-kit/core\";\nimport { OutputRow } from \"./OutputRow\";\nimport { ConnectorChip } from \"./ConnectorChip\";\nimport { OutputDndContext, UNGROUP_ZONE_ID } from \"./OutputDndContext\";\nimport { useConditionalOutput } from \"../hooks/useConditionalOutput\";\nimport type {\n FieldOption,\n OperatorOption,\n ConditionGroup,\n ConditionEntry,\n GroupConfig,\n} from \"../types\";\nimport type { GroupMutations } from \"../hooks/useConditionalOutput\";\n\nexport type OutputProps = {\n fields: FieldOption[];\n operators: OperatorOption[];\n /** Controlled groups. Omit for uncontrolled (internal state). */\n groups?: ConditionGroup[];\n /** Fires whenever groups change (works in both controlled and uncontrolled mode). */\n onGroupsChange?: (groups: ConditionGroup[]) => void;\n /** Default config applied to every group unless overridden by group.config. */\n defaultGroupConfig?: GroupConfig;\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport type { GroupMutations };\n\ntype ResolvedConfig = Required<Omit<GroupConfig, \"label\" | \"connector\">> &\n Pick<GroupConfig, \"label\" | \"connector\">;\n\nconst DEFAULT_GROUP_CONFIG: Required<Omit<GroupConfig, \"label\" | \"connector\">> = {\n editable: true,\n removable: true,\n variant: \"outlined\",\n};\n\nexport function Output({\n fields,\n operators,\n groups: controlledGroups,\n onGroupsChange,\n defaultGroupConfig,\n className,\n style,\n}: OutputProps) {\n const { groups, mutations } = useConditionalOutput({\n groups: controlledGroups,\n onGroupsChange,\n });\n\n const readOnly = controlledGroups !== undefined && !onGroupsChange;\n const effectiveDefault: GroupConfig | undefined = readOnly\n ? { editable: false, removable: false, ...defaultGroupConfig }\n : defaultGroupConfig;\n\n const rootClass = [\"rcui-output\", className].filter(Boolean).join(\" \");\n\n const renderOverlay = (entry: ConditionEntry) => (\n <div className=\"rcui-overlay\">\n <Chip label={entry.condition.field.label} size=\"small\" className=\"rcui-chip-field\" />\n <Chip\n label={entry.condition.operator.label}\n size=\"small\"\n className=\"rcui-chip-operator\"\n />\n <Chip\n label={entry.condition.value.label || \"…\"}\n size=\"small\"\n className=\"rcui-chip-value\"\n />\n </div>\n );\n\n return (\n <OutputDndContext groups={groups} mutations={mutations} renderOverlay={renderOverlay}>\n <DropZone className={rootClass} style={style}>\n {groups.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Parsed condition will appear here…\n </Typography>\n ) : (\n groups.map((group) => (\n <GroupCard\n key={group.id}\n group={group}\n fields={fields}\n operators={operators}\n config={resolveConfig(group.config, effectiveDefault)}\n mutations={mutations}\n />\n ))\n )}\n </DropZone>\n </OutputDndContext>\n );\n}\n\nfunction resolveConfig(groupConfig?: GroupConfig, defaultConfig?: GroupConfig): ResolvedConfig {\n return { ...DEFAULT_GROUP_CONFIG, ...defaultConfig, ...groupConfig };\n}\n\nfunction GroupCard({\n group,\n fields,\n operators,\n config,\n mutations,\n}: {\n group: ConditionGroup;\n fields: FieldOption[];\n operators: OperatorOption[];\n config: ResolvedConfig;\n mutations: GroupMutations;\n}) {\n const allIds = group.entries.map((e) => e.id);\n const isMulti = group.entries.length > 1;\n const { setNodeRef, isOver } = useDroppable({ id: `group:${group.id}` });\n\n const entries = (\n <SortableContext items={allIds} strategy={verticalListSortingStrategy}>\n {config.label && (\n <Typography variant=\"caption\" color=\"text.secondary\" className=\"rcui-group-label\">\n {config.label}\n </Typography>\n )}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {group.entries.map((entry, idx) => (\n <div key={entry.id}>\n {idx > 0 && (\n <ConnectorChip\n connector={entry.connector}\n onToggle={\n config.editable\n ? () => mutations.toggleConnector(group.id, entry.id)\n : undefined\n }\n />\n )}\n <OutputRow\n id={entry.id}\n condition={entry.condition}\n fields={fields}\n operators={operators}\n onUpdate={\n config.editable\n ? (c) => mutations.updateCondition(group.id, entry.id, c)\n : undefined\n }\n onRemove={\n config.removable\n ? () => mutations.removeEntry(group.id, entry.id)\n : undefined\n }\n />\n </div>\n ))}\n </div>\n </SortableContext>\n );\n\n if (!isMulti) {\n const singleClass = [\"rcui-droppable-single\", isOver ? \"rcui-droppable-single--over\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div ref={setNodeRef} className={singleClass}>\n {entries}\n </div>\n );\n }\n\n const paperClass = [\"rcui-group-paper\", isOver ? \"rcui-group-paper--over\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <Paper\n ref={setNodeRef}\n variant={config.variant as \"outlined\" | \"elevation\"}\n className={paperClass}\n >\n {entries}\n </Paper>\n );\n}\n\nfunction DropZone({\n children,\n className,\n style,\n}: {\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}) {\n const { setNodeRef, isOver } = useDroppable({ id: UNGROUP_ZONE_ID });\n\n const zoneClass = [\"rcui-drop-zone\", isOver ? \"rcui-drop-zone--over\" : \"\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div ref={setNodeRef} className={zoneClass} style={style}>\n {children}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport Chip from \"@mui/material/Chip\";\nimport Popover from \"@mui/material/Popover\";\nimport List from \"@mui/material/List\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport TextField from \"@mui/material/TextField\";\nimport IconButton from \"@mui/material/IconButton\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport DragIndicatorIcon from \"@mui/icons-material/DragIndicator\";\nimport type { FieldOption, OperatorOption, ParsedCondition as Condition } from \"../types\";\nimport { Field, Operator } from \"../condition-structure\";\nimport { MatchEngine } from \"../fuzzy/match-engine\";\n\ntype ChipTarget = \"field\" | \"operator\" | \"value\";\n\nexport type OutputRowProps = {\n id: string;\n condition: Condition;\n fields: FieldOption[];\n operators: OperatorOption[];\n onUpdate?: (condition: Condition) => void;\n onRemove?: () => void;\n};\n\nexport function OutputRow({\n id,\n condition,\n fields,\n operators,\n onUpdate,\n onRemove,\n}: OutputRowProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging, isOver } =\n useSortable({ id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.3 : 1,\n };\n\n const [popover, setPopover] = useState<{\n target: ChipTarget;\n anchor: HTMLElement;\n } | null>(null);\n const [valueEdit, setValueEdit] = useState(\"\");\n\n const openPopover = (target: ChipTarget, anchor: HTMLElement) => {\n setPopover({ target, anchor });\n if (target === \"value\") setValueEdit(condition.value.raw ?? \"\");\n };\n\n const closePopover = () => setPopover(null);\n\n const editable = !!onUpdate;\n\n const resolveFieldValues = (f: FieldOption) => f.fieldValues;\n\n const resolveOperators = (f: FieldOption) => f.operators ?? operators;\n\n const selectField = (f: FieldOption) => {\n onUpdate?.({\n ...condition,\n field: new Field(f.label, f.value, f.label),\n value: MatchEngine.matchValue(condition.value.raw, f),\n });\n closePopover();\n };\n\n const selectOperator = (op: OperatorOption) => {\n onUpdate?.({\n ...condition,\n operator: new Operator(op.label, op.value, op.label),\n });\n closePopover();\n };\n\n const submitValue = (raw: string) => {\n const fieldConfig = fields.find((f) => f.value === condition.field.value);\n onUpdate?.({\n ...condition,\n value: MatchEngine.matchValue(raw, fieldConfig),\n });\n closePopover();\n };\n\n const currentField = fields.find((f) => f.value === condition.field.value);\n const fieldValues = currentField ? resolveFieldValues(currentField) : undefined;\n const activeOperators = currentField ? resolveOperators(currentField) : operators;\n\n const rowClass = [\"rcui-row\", isOver && !isDragging ? \"rcui-row--over\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div ref={setNodeRef} style={style} className={rowClass}>\n <div\n {...attributes}\n {...listeners}\n className=\"rcui-drag-handle\"\n aria-label=\"drag handle\"\n >\n <DragIndicatorIcon fontSize=\"small\" />\n </div>\n <Chip\n label={condition.field.label}\n color={condition.field.isValid ? \"primary\" : \"error\"}\n variant=\"filled\"\n onClick={editable ? (e) => openPopover(\"field\", e.currentTarget) : undefined}\n className={condition.field.isValid ? \"rcui-chip-field\" : \"rcui-chip-field--error\"}\n />\n <Chip\n label={condition.operator.label}\n color={condition.operator.isValid ? \"secondary\" : \"error\"}\n variant=\"filled\"\n onClick={editable ? (e) => openPopover(\"operator\", e.currentTarget) : undefined}\n className={\n condition.operator.isValid ? \"rcui-chip-operator\" : \"rcui-chip-operator--error\"\n }\n />\n <Chip\n label={condition.value.label || \"…\"}\n variant=\"filled\"\n onClick={editable ? (e) => openPopover(\"value\", e.currentTarget) : undefined}\n className=\"rcui-chip-value\"\n />\n {onRemove && (\n <IconButton size=\"small\" onClick={onRemove} aria-label=\"remove condition\">\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )}\n\n {editable && (\n <Popover\n open={!!popover}\n anchorEl={popover?.anchor}\n onClose={closePopover}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\n >\n {popover?.target === \"field\" && (\n <List dense>\n {fields.map((f) => (\n <ListItemButton\n key={f.value}\n selected={f.value === condition.field.value}\n onClick={() => selectField(f)}\n >\n <ListItemText primary={f.label} />\n </ListItemButton>\n ))}\n </List>\n )}\n\n {popover?.target === \"operator\" && (\n <List dense>\n {activeOperators.map((op) => (\n <ListItemButton\n key={op.value}\n selected={op.value === condition.operator.value}\n onClick={() => selectOperator(op)}\n >\n <ListItemText primary={op.label} />\n </ListItemButton>\n ))}\n </List>\n )}\n\n {popover?.target === \"value\" &&\n (fieldValues ? (\n <List dense>\n {fieldValues.map((v) => (\n <ListItemButton\n key={v.value}\n selected={v.value === condition.value.value}\n onClick={() => submitValue(v.value)}\n >\n <ListItemText primary={v.label} />\n </ListItemButton>\n ))}\n </List>\n ) : (\n <div className=\"rcui-popover-value-edit\">\n <TextField\n size=\"small\"\n autoFocus\n value={valueEdit}\n onChange={(e) => setValueEdit(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitValue(valueEdit);\n }}\n placeholder=\"Enter value\"\n />\n </div>\n ))}\n </Popover>\n )}\n </div>\n );\n}\n","import Chip from \"@mui/material/Chip\";\nimport type { LogicalOperator } from \"../types\";\n\nexport type ConnectorChipProps = {\n connector: LogicalOperator;\n onToggle?: () => void;\n};\n\nexport function ConnectorChip({ connector, onToggle }: ConnectorChipProps) {\n const chipClass = [\"rcui-connector-chip\", onToggle ? \"rcui-connector-chip--clickable\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"rcui-connector\">\n <Chip\n label={connector.toUpperCase()}\n size=\"small\"\n variant=\"filled\"\n onClick={onToggle}\n className={chipClass}\n />\n </div>\n );\n}\n","import { type ReactNode, useCallback, useState } from \"react\";\nimport {\n DndContext,\n DragOverlay,\n pointerWithin,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n type DragStartEvent,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport { sortableKeyboardCoordinates } from \"@dnd-kit/sortable\";\nimport type { ConditionGroup, ConditionEntry } from \"../types\";\nimport type { GroupMutations } from \"../hooks/useConditionalOutput\";\nimport { applyOutputDragEnd } from \"./output-drag-end\";\n\nexport { UNGROUP_ZONE_ID, GROUP_DROPPABLE_PREFIX, applyOutputDragEnd } from \"./output-drag-end\";\n\ntype Props = {\n groups: ConditionGroup[];\n mutations: GroupMutations;\n children: ReactNode;\n renderOverlay?: (entry: ConditionEntry) => ReactNode;\n};\n\nexport function OutputDndContext({ groups, mutations, children, renderOverlay }: Props) {\n const [activeEntry, setActiveEntry] = useState<ConditionEntry | null>(null);\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const handleDragStart = useCallback(\n (event: DragStartEvent) => {\n const entryId = String(event.active.id);\n for (const group of groups) {\n const entry = group.entries.find((e) => e.id === entryId);\n if (entry) {\n setActiveEntry(entry);\n return;\n }\n }\n },\n [groups],\n );\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n setActiveEntry(null);\n const over = event.over;\n applyOutputDragEnd(\n groups,\n String(event.active.id),\n over ? String(over.id) : null,\n mutations,\n );\n },\n [groups, mutations],\n );\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n {children}\n <DragOverlay dropAnimation={null}>\n {activeEntry && renderOverlay ? renderOverlay(activeEntry) : null}\n </DragOverlay>\n </DndContext>\n );\n}\n","import type { ConditionGroup } from \"../types\";\nimport type { GroupMutations } from \"../hooks/useConditionalOutput\";\n\nexport const UNGROUP_ZONE_ID = \"ungrouped-drop-zone\";\nexport const GROUP_DROPPABLE_PREFIX = \"group:\";\n\nfunction findGroupByEntryId(groups: ConditionGroup[], entryId: string): ConditionGroup | null {\n for (const group of groups) {\n if (group.entries.some((e) => e.id === entryId)) return group;\n }\n return null;\n}\n\n/**\n * Maps a finished drag (active id + drop target id) to our output mutations.\n * Kept pure so tests cover our rules without mounting @dnd-kit.\n */\nexport function applyOutputDragEnd(\n groups: ConditionGroup[],\n activeId: string,\n overId: string | null,\n mutations: Pick<GroupMutations, \"ungroupEntry\" | \"moveBetweenGroups\" | \"reorderWithinGroup\">,\n): void {\n if (!overId || activeId === overId) return;\n\n const sourceGroup = findGroupByEntryId(groups, activeId);\n if (!sourceGroup) return;\n\n if (overId === UNGROUP_ZONE_ID) {\n mutations.ungroupEntry(sourceGroup.id, activeId);\n return;\n }\n\n if (overId.startsWith(GROUP_DROPPABLE_PREFIX)) {\n const targetGroupId = overId.slice(GROUP_DROPPABLE_PREFIX.length);\n if (targetGroupId !== sourceGroup.id) {\n mutations.moveBetweenGroups(sourceGroup.id, targetGroupId, activeId, null);\n }\n return;\n }\n\n const targetGroup = findGroupByEntryId(groups, overId);\n\n if (targetGroup && sourceGroup.id === targetGroup.id) {\n mutations.reorderWithinGroup(sourceGroup.id, activeId, overId);\n } else if (targetGroup) {\n mutations.moveBetweenGroups(sourceGroup.id, targetGroup.id, activeId, overId);\n } else {\n mutations.ungroupEntry(sourceGroup.id, activeId);\n }\n}\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { generateId } from \"../id\";\nimport type {\n ConditionGroup,\n ConditionEntry,\n ParsedCondition,\n LogicalOperator,\n GroupConfig,\n} from \"../types\";\n\nexport type GroupMutations = {\n addGroup: (group: ConditionGroup) => void;\n removeEntry: (groupId: string, entryId: string) => void;\n toggleConnector: (groupId: string, entryId: string) => void;\n updateCondition: (groupId: string, entryId: string, condition: ParsedCondition) => void;\n updateGroupConfig: (groupId: string, config: Partial<GroupConfig>) => void;\n reorderWithinGroup: (groupId: string, activeId: string, overId: string) => void;\n moveBetweenGroups: (\n sourceGroupId: string,\n targetGroupId: string,\n entryId: string,\n overEntryId: string | null,\n ) => void;\n ungroupEntry: (groupId: string, entryId: string) => void;\n setGroups: (groups: ConditionGroup[]) => void;\n};\n\nexport type UseConditionalOutputOptions = {\n groups?: ConditionGroup[];\n onGroupsChange?: (groups: ConditionGroup[]) => void;\n};\n\nexport function useConditionalOutput({\n groups: controlledGroups,\n onGroupsChange,\n}: UseConditionalOutputOptions = {}) {\n const [internalGroups, setInternalGroups] = useState<ConditionGroup[]>([]);\n const isControlled = controlledGroups !== undefined;\n const groups = isControlled ? controlledGroups : internalGroups;\n\n const onGroupsChangeRef = useRef(onGroupsChange);\n useEffect(() => {\n onGroupsChangeRef.current = onGroupsChange;\n }, [onGroupsChange]);\n\n const didMount = useRef(false);\n useEffect(() => {\n if (!didMount.current) {\n didMount.current = true;\n onGroupsChangeRef.current?.(groups);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const commit = useCallback(\n (next: ConditionGroup[]) => {\n if (!isControlled) setInternalGroups(next);\n onGroupsChangeRef.current?.(next);\n },\n [isControlled],\n );\n\n const addGroup = useCallback(\n (group: ConditionGroup) => {\n commit([...groups, group]);\n },\n [groups, commit],\n );\n\n const removeEntry = useCallback(\n (groupId: string, entryId: string) => {\n commit(\n groups\n .map((g) =>\n g.id === groupId\n ? { ...g, entries: g.entries.filter((e) => e.id !== entryId) }\n : g,\n )\n .filter((g) => g.entries.length > 0),\n );\n },\n [groups, commit],\n );\n\n const toggleConnector = useCallback(\n (groupId: string, entryId: string) => {\n commit(\n groups.map((g) => {\n if (g.id !== groupId) return g;\n return {\n ...g,\n entries: g.entries.map((e) =>\n e.id === entryId\n ? {\n ...e,\n connector: (e.connector === \"and\"\n ? \"or\"\n : \"and\") as LogicalOperator,\n }\n : e,\n ),\n };\n }),\n );\n },\n [groups, commit],\n );\n\n const updateCondition = useCallback(\n (groupId: string, entryId: string, condition: ParsedCondition) => {\n commit(\n groups.map((g) => {\n if (g.id !== groupId) return g;\n return {\n ...g,\n entries: g.entries.map((e) => (e.id === entryId ? { ...e, condition } : e)),\n };\n }),\n );\n },\n [groups, commit],\n );\n\n const updateGroupConfig = useCallback(\n (groupId: string, config: Partial<GroupConfig>) => {\n commit(\n groups.map((g) =>\n g.id === groupId ? { ...g, config: { ...g.config, ...config } } : g,\n ),\n );\n },\n [groups, commit],\n );\n\n const reorderWithinGroup = useCallback(\n (groupId: string, activeId: string, overId: string) => {\n commit(\n groups.map((g) => {\n if (g.id !== groupId) return g;\n const oldIdx = g.entries.findIndex((e) => e.id === activeId);\n const newIdx = g.entries.findIndex((e) => e.id === overId);\n if (oldIdx === -1 || newIdx === -1) return g;\n const entries = [...g.entries];\n const [moved] = entries.splice(oldIdx, 1);\n entries.splice(newIdx, 0, moved);\n return { ...g, entries };\n }),\n );\n },\n [groups, commit],\n );\n\n const moveBetweenGroups = useCallback(\n (\n sourceGroupId: string,\n targetGroupId: string,\n entryId: string,\n overEntryId: string | null,\n ) => {\n const sourceGroup = groups.find((g) => g.id === sourceGroupId);\n const targetGroup = groups.find((g) => g.id === targetGroupId);\n if (!sourceGroup || !targetGroup) return;\n\n const entry = sourceGroup.entries.find((e) => e.id === entryId);\n if (!entry) return;\n\n const targetConnector: LogicalOperator =\n targetGroup.entries.length > 0 ? targetGroup.entries[0].connector : \"and\";\n\n const movedEntry: ConditionEntry = { ...entry, connector: targetConnector };\n\n let newGroups = groups.map((g) => {\n if (g.id === sourceGroupId) {\n return { ...g, entries: g.entries.filter((e) => e.id !== entryId) };\n }\n if (g.id === targetGroupId) {\n const entries = [...g.entries];\n if (overEntryId) {\n const idx = entries.findIndex((e) => e.id === overEntryId);\n entries.splice(idx + 1, 0, movedEntry);\n } else {\n entries.push(movedEntry);\n }\n return { ...g, entries };\n }\n return g;\n });\n\n commit(newGroups.filter((g) => g.entries.length > 0));\n },\n [groups, commit],\n );\n\n const ungroupEntry = useCallback(\n (groupId: string, entryId: string) => {\n const group = groups.find((g) => g.id === groupId);\n if (!group) return;\n const entry = group.entries.find((e) => e.id === entryId);\n if (!entry) return;\n\n const newGroup: ConditionGroup = {\n id: generateId(),\n entries: [{ ...entry, connector: \"and\" }],\n };\n\n let newGroups = groups\n .map((g) =>\n g.id === groupId\n ? { ...g, entries: g.entries.filter((e) => e.id !== entryId) }\n : g,\n )\n .filter((g) => g.entries.length > 0);\n\n newGroups.push(newGroup);\n commit(newGroups);\n },\n [groups, commit],\n );\n\n const setGroups = useCallback((next: ConditionGroup[]) => commit(next), [commit]);\n\n const mutations: GroupMutations = {\n addGroup,\n removeEntry,\n toggleConnector,\n updateCondition,\n updateGroupConfig,\n reorderWithinGroup,\n moveBetweenGroups,\n ungroupEntry,\n setGroups,\n };\n\n return { groups, mutations };\n}\n","import { Input } from \"./Input\";\nimport { Output } from \"./Output\";\nimport { useConditionalOutput } from \"../hooks/useConditionalOutput\";\nimport { DEFAULT_OPERATORS } from \"../condition-structure\";\nimport type { ConditionalUIProps } from \"../types\";\n\nexport function ConditionalUI({\n fields,\n operators = DEFAULT_OPERATORS,\n value,\n onChange,\n onConditionsChange,\n className,\n style,\n}: ConditionalUIProps) {\n const { groups, mutations } = useConditionalOutput({\n onGroupsChange: onConditionsChange,\n });\n\n const rootClass = [\"rcui-root\", className].filter(Boolean).join(\" \");\n\n return (\n <div className={rootClass} style={style}>\n <Input\n fields={fields}\n operators={operators}\n value={value}\n onChange={onChange}\n onSubmit={mutations.addGroup}\n />\n <Output\n groups={groups}\n fields={fields}\n operators={operators}\n onGroupsChange={mutations.setGroups}\n />\n </div>\n );\n}\n"],"mappings":"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","names":["useCallback","useState","useCallback","log","TYPE_ALLOWED_OPS","valueRaw","fieldValues","log","log","useCallback","GhostInput","useCallback","useState","Chip","useState","TextField","IconButton","jsx","jsxs","useState","IconButton","TextField","Chip","jsx","useCallback","useState","jsx","jsxs","useState","useCallback","useState","useCallback","useRef","useState","useRef","useCallback","jsx","jsxs","Chip","jsx","jsxs"]}
@@ -0,0 +1,281 @@
1
+ /* react-conditional-ui default styles */
2
+
3
+ /* ── Root ── */
4
+ .rcui-root {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 12px;
8
+ }
9
+
10
+ /* ── Input ── */
11
+ .rcui-input .MuiOutlinedInput-root {
12
+ border-radius: 8px;
13
+ background-color: rgba(255, 255, 255, 0.04);
14
+ }
15
+
16
+ .rcui-input .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline {
17
+ border-color: var(--rcui-primary, #7c8aff);
18
+ }
19
+
20
+ /* ── Output Row ── */
21
+ .rcui-row {
22
+ display: flex;
23
+ gap: 8px;
24
+ align-items: center;
25
+ flex-wrap: wrap;
26
+ border-radius: 4px;
27
+ padding: 4px;
28
+ transition:
29
+ background-color 0.15s,
30
+ box-shadow 0.15s;
31
+ }
32
+
33
+ .rcui-row--over {
34
+ background-color: rgba(255, 255, 255, 0.06);
35
+ box-shadow: inset 0 0 0 2px var(--rcui-primary, #7c8aff);
36
+ }
37
+
38
+ /* ── Drag handle ── */
39
+ .rcui-drag-handle {
40
+ display: flex;
41
+ cursor: grab;
42
+ color: rgba(255, 255, 255, 0.5);
43
+ }
44
+
45
+ /* ── Chips ── */
46
+ .rcui-chip-field {
47
+ font-weight: 500;
48
+ background-color: rgba(124, 138, 255, 0.15) !important;
49
+ border: 1px solid rgba(124, 138, 255, 0.4) !important;
50
+ }
51
+
52
+ .rcui-chip-field:hover {
53
+ background-color: rgba(124, 138, 255, 0.25) !important;
54
+ }
55
+
56
+ .rcui-chip-field--error {
57
+ font-weight: 500;
58
+ border: 1px solid !important;
59
+ }
60
+
61
+ .rcui-chip-operator {
62
+ font-weight: 500;
63
+ background-color: rgba(192, 132, 252, 0.15) !important;
64
+ border: 1px solid rgba(192, 132, 252, 0.4) !important;
65
+ }
66
+
67
+ .rcui-chip-operator:hover {
68
+ background-color: rgba(192, 132, 252, 0.25) !important;
69
+ }
70
+
71
+ .rcui-chip-operator--error {
72
+ font-weight: 500;
73
+ border: 1px solid !important;
74
+ }
75
+
76
+ .rcui-chip-value {
77
+ font-weight: 500;
78
+ background-color: rgba(255, 255, 255, 0.08) !important;
79
+ border: 1px solid rgba(255, 255, 255, 0.16) !important;
80
+ }
81
+
82
+ .rcui-chip-value:hover {
83
+ background-color: rgba(255, 255, 255, 0.14) !important;
84
+ }
85
+
86
+ /* ── Connector chip ── */
87
+ .rcui-connector {
88
+ display: flex;
89
+ justify-content: center;
90
+ padding: 2px 0;
91
+ }
92
+
93
+ .rcui-connector-chip {
94
+ font-weight: 600 !important;
95
+ font-size: 0.7rem !important;
96
+ letter-spacing: 0.05em;
97
+ background-color: rgba(103, 232, 249, 0.12) !important;
98
+ color: var(--rcui-info, #67e8f9) !important;
99
+ border: 1px solid rgba(103, 232, 249, 0.3) !important;
100
+ }
101
+
102
+ .rcui-connector-chip--clickable {
103
+ cursor: pointer;
104
+ }
105
+
106
+ .rcui-connector-chip--clickable:hover {
107
+ background-color: rgba(103, 232, 249, 0.22) !important;
108
+ }
109
+
110
+ /* ── Drag overlay ── */
111
+ .rcui-overlay {
112
+ display: flex;
113
+ gap: 8px;
114
+ align-items: center;
115
+ opacity: 0.9;
116
+ }
117
+
118
+ /* ── Group paper ── */
119
+ .rcui-group-paper {
120
+ padding: 12px;
121
+ border-color: rgba(255, 255, 255, 0.08) !important;
122
+ background-color: rgba(255, 255, 255, 0.02) !important;
123
+ backdrop-filter: blur(8px);
124
+ transition:
125
+ border-color 0.15s,
126
+ background-color 0.15s;
127
+ }
128
+
129
+ .rcui-group-paper--over {
130
+ border-color: var(--rcui-primary, #7c8aff) !important;
131
+ background-color: rgba(124, 138, 255, 0.06) !important;
132
+ }
133
+
134
+ /* ── Single-row droppable wrapper ── */
135
+ .rcui-droppable-single {
136
+ border-radius: 4px;
137
+ transition:
138
+ background-color 0.15s,
139
+ outline-color 0.15s;
140
+ }
141
+
142
+ .rcui-droppable-single--over {
143
+ background-color: rgba(255, 255, 255, 0.06);
144
+ outline: 2px solid var(--rcui-primary, #7c8aff);
145
+ }
146
+
147
+ /* ── Ungroup drop zone ── */
148
+ .rcui-drop-zone {
149
+ display: flex;
150
+ flex-direction: column;
151
+ gap: 12px;
152
+ min-height: 48px;
153
+ padding: 8px;
154
+ border-radius: 4px;
155
+ border: 2px dashed rgba(255, 255, 255, 0.06);
156
+ background-color: transparent;
157
+ transition:
158
+ border-color 0.2s,
159
+ background-color 0.2s;
160
+ }
161
+
162
+ .rcui-drop-zone--over {
163
+ border-color: var(--rcui-primary, #7c8aff);
164
+ background-color: rgba(124, 138, 255, 0.06);
165
+ }
166
+
167
+ /* ── Input wrapper ── */
168
+ .rcui-input-wrapper {
169
+ position: relative;
170
+ }
171
+
172
+ /* ── Ghost input inner container ── */
173
+ .rcui-input-inner {
174
+ position: relative;
175
+ display: inline-flex;
176
+ align-items: center;
177
+ width: 100%;
178
+ }
179
+
180
+ .rcui-input-inner > input {
181
+ width: 100%;
182
+ background: transparent;
183
+ }
184
+
185
+ /* Hidden mirror span: same font as input, used to measure text width */
186
+ .rcui-mirror {
187
+ position: absolute;
188
+ top: 0;
189
+ left: 0;
190
+ height: 0;
191
+ overflow: hidden;
192
+ white-space: pre;
193
+ pointer-events: none;
194
+ font: inherit;
195
+ letter-spacing: inherit;
196
+ visibility: hidden;
197
+ }
198
+
199
+ /* Ghost completion text, positioned right after the typed text */
200
+ .rcui-ghost {
201
+ position: absolute;
202
+ top: 50%;
203
+ transform: translateY(-50%);
204
+ white-space: pre;
205
+ pointer-events: none;
206
+ font: inherit;
207
+ letter-spacing: inherit;
208
+ color: rgba(255, 255, 255, 0.25);
209
+ }
210
+
211
+ /* Squiggly underline layer, overlaid on top of the input text */
212
+ .rcui-squiggly-layer {
213
+ position: absolute;
214
+ top: 0;
215
+ left: 0;
216
+ right: 0;
217
+ bottom: 0;
218
+ display: flex;
219
+ align-items: center;
220
+ pointer-events: none;
221
+ font: inherit;
222
+ letter-spacing: inherit;
223
+ white-space: pre;
224
+ color: transparent;
225
+ overflow: visible;
226
+ }
227
+
228
+ .rcui-squiggly {
229
+ text-decoration: underline wavy #f5c542;
230
+ text-underline-offset: 1px;
231
+ text-decoration-thickness: 1px;
232
+ text-decoration-skip-ink: none;
233
+ }
234
+
235
+ /* ── Input adornment icons ── */
236
+ .rcui-adornment-enter {
237
+ color: rgba(255, 255, 255, 0.3) !important;
238
+ }
239
+
240
+ .rcui-adornment-error {
241
+ color: #f5c542 !important;
242
+ }
243
+
244
+ /* ── Autocomplete dropdown ── */
245
+ .rcui-completions {
246
+ position: absolute;
247
+ top: 100%;
248
+ z-index: 1300;
249
+ margin: 4px 0 0;
250
+ padding: 4px 0;
251
+ list-style: none;
252
+ border-radius: 6px;
253
+ border: 1px solid rgba(255, 255, 255, 0.12);
254
+ background-color: #212738;
255
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
256
+ max-height: 240px;
257
+ overflow-y: auto;
258
+ width: max-content;
259
+ min-width: 120px;
260
+ max-width: 280px;
261
+ }
262
+
263
+ .rcui-completion-item {
264
+ padding: 6px 14px;
265
+ font-size: 0.875rem;
266
+ cursor: pointer;
267
+ color: rgba(255, 255, 255, 0.8);
268
+ white-space: nowrap;
269
+ overflow: hidden;
270
+ text-overflow: ellipsis;
271
+ }
272
+
273
+ .rcui-completion-item--active {
274
+ background-color: rgba(124, 138, 255, 0.18);
275
+ color: #e6edf3;
276
+ }
277
+
278
+ /* ── Popover value edit ── */
279
+ .rcui-popover-value-edit {
280
+ padding: 12px;
281
+ }
package/logo.png ADDED
Binary file