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/index.ts","../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 \"../assets/styles.css\";\n\nexport { ConditionalUI } from \"./components/ConditionalUI\";\nexport { Input } from \"./components/Input\";\nexport { Output } from \"./components/Output\";\nexport { useConditionalInput } from \"./hooks/useConditionalInput\";\nexport { useConditionalOutput } from \"./hooks/useConditionalOutput\";\nexport { useConditionDataProvider } from \"./hooks/useConditionDataProvider\";\nexport { ConditionDataProvider, ConditionDataProvider as ConditionParser } from \"./condition-data-provider\";\nexport { DEFAULT_OPERATORS } from \"./fuzzy/operators\";\nexport type {\n FieldOption,\n FieldType,\n OperatorOption,\n ParsedCondition,\n LogicalOperator,\n ConditionEntry,\n ConditionGroup,\n GroupConfig,\n ConditionalUIProps,\n Diagnostic,\n} from \"./types\";\nexport type { InputProps } from \"./components/Input\";\nexport type { OutputProps, GroupMutations } from \"./components/Output\";\nexport type { UseConditionalInputOptions } from \"./hooks/useConditionalInput\";\nexport type { UseConditionalOutputOptions } from \"./hooks/useConditionalOutput\";\nexport type {\n UseConditionDataProviderOptions,\n UseConditionDataProviderResult,\n} from \"./hooks/useConditionDataProvider\";\n","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":["import_react","import_react","createDebug","Fuse","log","TYPE_ALLOWED_OPS","valueRaw","fieldValues","import_debug","GhostInput","TextField","InputAdornment","Tooltip","IconButton","ErrorOutlineIcon","KeyboardReturnIcon","import_Chip","import_sortable","import_core","import_react","import_TextField","import_IconButton","import_jsx_runtime","DragIndicatorIcon","Chip","IconButton","CloseIcon","Popover","List","ListItemButton","ListItemText","TextField","import_Chip","import_jsx_runtime","Chip","import_react","import_sortable","import_jsx_runtime","import_react","import_jsx_runtime","Chip","Typography","Paper","import_jsx_runtime"]}
package/dist/index.css ADDED
@@ -0,0 +1,218 @@
1
+ /* assets/styles.css */
2
+ .rcui-root {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 12px;
6
+ }
7
+ .rcui-input .MuiOutlinedInput-root {
8
+ border-radius: 8px;
9
+ background-color: rgba(255, 255, 255, 0.04);
10
+ }
11
+ .rcui-input .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline {
12
+ border-color: var(--rcui-primary, #7c8aff);
13
+ }
14
+ .rcui-row {
15
+ display: flex;
16
+ gap: 8px;
17
+ align-items: center;
18
+ flex-wrap: wrap;
19
+ border-radius: 4px;
20
+ padding: 4px;
21
+ transition: background-color 0.15s, box-shadow 0.15s;
22
+ }
23
+ .rcui-row--over {
24
+ background-color: rgba(255, 255, 255, 0.06);
25
+ box-shadow: inset 0 0 0 2px var(--rcui-primary, #7c8aff);
26
+ }
27
+ .rcui-drag-handle {
28
+ display: flex;
29
+ cursor: grab;
30
+ color: rgba(255, 255, 255, 0.5);
31
+ }
32
+ .rcui-chip-field {
33
+ font-weight: 500;
34
+ background-color: rgba(124, 138, 255, 0.15) !important;
35
+ border: 1px solid rgba(124, 138, 255, 0.4) !important;
36
+ }
37
+ .rcui-chip-field:hover {
38
+ background-color: rgba(124, 138, 255, 0.25) !important;
39
+ }
40
+ .rcui-chip-field--error {
41
+ font-weight: 500;
42
+ border: 1px solid !important;
43
+ }
44
+ .rcui-chip-operator {
45
+ font-weight: 500;
46
+ background-color: rgba(192, 132, 252, 0.15) !important;
47
+ border: 1px solid rgba(192, 132, 252, 0.4) !important;
48
+ }
49
+ .rcui-chip-operator:hover {
50
+ background-color: rgba(192, 132, 252, 0.25) !important;
51
+ }
52
+ .rcui-chip-operator--error {
53
+ font-weight: 500;
54
+ border: 1px solid !important;
55
+ }
56
+ .rcui-chip-value {
57
+ font-weight: 500;
58
+ background-color: rgba(255, 255, 255, 0.08) !important;
59
+ border: 1px solid rgba(255, 255, 255, 0.16) !important;
60
+ }
61
+ .rcui-chip-value:hover {
62
+ background-color: rgba(255, 255, 255, 0.14) !important;
63
+ }
64
+ .rcui-connector {
65
+ display: flex;
66
+ justify-content: center;
67
+ padding: 2px 0;
68
+ }
69
+ .rcui-connector-chip {
70
+ font-weight: 600 !important;
71
+ font-size: 0.7rem !important;
72
+ letter-spacing: 0.05em;
73
+ background-color: rgba(103, 232, 249, 0.12) !important;
74
+ color: var(--rcui-info, #67e8f9) !important;
75
+ border: 1px solid rgba(103, 232, 249, 0.3) !important;
76
+ }
77
+ .rcui-connector-chip--clickable {
78
+ cursor: pointer;
79
+ }
80
+ .rcui-connector-chip--clickable:hover {
81
+ background-color: rgba(103, 232, 249, 0.22) !important;
82
+ }
83
+ .rcui-overlay {
84
+ display: flex;
85
+ gap: 8px;
86
+ align-items: center;
87
+ opacity: 0.9;
88
+ }
89
+ .rcui-group-paper {
90
+ padding: 12px;
91
+ border-color: rgba(255, 255, 255, 0.08) !important;
92
+ background-color: rgba(255, 255, 255, 0.02) !important;
93
+ backdrop-filter: blur(8px);
94
+ transition: border-color 0.15s, background-color 0.15s;
95
+ }
96
+ .rcui-group-paper--over {
97
+ border-color: var(--rcui-primary, #7c8aff) !important;
98
+ background-color: rgba(124, 138, 255, 0.06) !important;
99
+ }
100
+ .rcui-droppable-single {
101
+ border-radius: 4px;
102
+ transition: background-color 0.15s, outline-color 0.15s;
103
+ }
104
+ .rcui-droppable-single--over {
105
+ background-color: rgba(255, 255, 255, 0.06);
106
+ outline: 2px solid var(--rcui-primary, #7c8aff);
107
+ }
108
+ .rcui-drop-zone {
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 12px;
112
+ min-height: 48px;
113
+ padding: 8px;
114
+ border-radius: 4px;
115
+ border: 2px dashed rgba(255, 255, 255, 0.06);
116
+ background-color: transparent;
117
+ transition: border-color 0.2s, background-color 0.2s;
118
+ }
119
+ .rcui-drop-zone--over {
120
+ border-color: var(--rcui-primary, #7c8aff);
121
+ background-color: rgba(124, 138, 255, 0.06);
122
+ }
123
+ .rcui-input-wrapper {
124
+ position: relative;
125
+ }
126
+ .rcui-input-inner {
127
+ position: relative;
128
+ display: inline-flex;
129
+ align-items: center;
130
+ width: 100%;
131
+ }
132
+ .rcui-input-inner > input {
133
+ width: 100%;
134
+ background: transparent;
135
+ }
136
+ .rcui-mirror {
137
+ position: absolute;
138
+ top: 0;
139
+ left: 0;
140
+ height: 0;
141
+ overflow: hidden;
142
+ white-space: pre;
143
+ pointer-events: none;
144
+ font: inherit;
145
+ letter-spacing: inherit;
146
+ visibility: hidden;
147
+ }
148
+ .rcui-ghost {
149
+ position: absolute;
150
+ top: 50%;
151
+ transform: translateY(-50%);
152
+ white-space: pre;
153
+ pointer-events: none;
154
+ font: inherit;
155
+ letter-spacing: inherit;
156
+ color: rgba(255, 255, 255, 0.25);
157
+ }
158
+ .rcui-squiggly-layer {
159
+ position: absolute;
160
+ top: 0;
161
+ left: 0;
162
+ right: 0;
163
+ bottom: 0;
164
+ display: flex;
165
+ align-items: center;
166
+ pointer-events: none;
167
+ font: inherit;
168
+ letter-spacing: inherit;
169
+ white-space: pre;
170
+ color: transparent;
171
+ overflow: visible;
172
+ }
173
+ .rcui-squiggly {
174
+ text-decoration: underline wavy #f5c542;
175
+ text-underline-offset: 1px;
176
+ text-decoration-thickness: 1px;
177
+ text-decoration-skip-ink: none;
178
+ }
179
+ .rcui-adornment-enter {
180
+ color: rgba(255, 255, 255, 0.3) !important;
181
+ }
182
+ .rcui-adornment-error {
183
+ color: #f5c542 !important;
184
+ }
185
+ .rcui-completions {
186
+ position: absolute;
187
+ top: 100%;
188
+ z-index: 1300;
189
+ margin: 4px 0 0;
190
+ padding: 4px 0;
191
+ list-style: none;
192
+ border-radius: 6px;
193
+ border: 1px solid rgba(255, 255, 255, 0.12);
194
+ background-color: #212738;
195
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
196
+ max-height: 240px;
197
+ overflow-y: auto;
198
+ width: max-content;
199
+ min-width: 120px;
200
+ max-width: 280px;
201
+ }
202
+ .rcui-completion-item {
203
+ padding: 6px 14px;
204
+ font-size: 0.875rem;
205
+ cursor: pointer;
206
+ color: rgba(255, 255, 255, 0.8);
207
+ white-space: nowrap;
208
+ overflow: hidden;
209
+ text-overflow: ellipsis;
210
+ }
211
+ .rcui-completion-item--active {
212
+ background-color: rgba(124, 138, 255, 0.18);
213
+ color: #e6edf3;
214
+ }
215
+ .rcui-popover-value-edit {
216
+ padding: 12px;
217
+ }
218
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../assets/styles.css"],"sourcesContent":["/* react-conditional-ui default styles */\n\n/* ── Root ── */\n.rcui-root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* ── Input ── */\n.rcui-input .MuiOutlinedInput-root {\n border-radius: 8px;\n background-color: rgba(255, 255, 255, 0.04);\n}\n\n.rcui-input .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline {\n border-color: var(--rcui-primary, #7c8aff);\n}\n\n/* ── Output Row ── */\n.rcui-row {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-wrap: wrap;\n border-radius: 4px;\n padding: 4px;\n transition:\n background-color 0.15s,\n box-shadow 0.15s;\n}\n\n.rcui-row--over {\n background-color: rgba(255, 255, 255, 0.06);\n box-shadow: inset 0 0 0 2px var(--rcui-primary, #7c8aff);\n}\n\n/* ── Drag handle ── */\n.rcui-drag-handle {\n display: flex;\n cursor: grab;\n color: rgba(255, 255, 255, 0.5);\n}\n\n/* ── Chips ── */\n.rcui-chip-field {\n font-weight: 500;\n background-color: rgba(124, 138, 255, 0.15) !important;\n border: 1px solid rgba(124, 138, 255, 0.4) !important;\n}\n\n.rcui-chip-field:hover {\n background-color: rgba(124, 138, 255, 0.25) !important;\n}\n\n.rcui-chip-field--error {\n font-weight: 500;\n border: 1px solid !important;\n}\n\n.rcui-chip-operator {\n font-weight: 500;\n background-color: rgba(192, 132, 252, 0.15) !important;\n border: 1px solid rgba(192, 132, 252, 0.4) !important;\n}\n\n.rcui-chip-operator:hover {\n background-color: rgba(192, 132, 252, 0.25) !important;\n}\n\n.rcui-chip-operator--error {\n font-weight: 500;\n border: 1px solid !important;\n}\n\n.rcui-chip-value {\n font-weight: 500;\n background-color: rgba(255, 255, 255, 0.08) !important;\n border: 1px solid rgba(255, 255, 255, 0.16) !important;\n}\n\n.rcui-chip-value:hover {\n background-color: rgba(255, 255, 255, 0.14) !important;\n}\n\n/* ── Connector chip ── */\n.rcui-connector {\n display: flex;\n justify-content: center;\n padding: 2px 0;\n}\n\n.rcui-connector-chip {\n font-weight: 600 !important;\n font-size: 0.7rem !important;\n letter-spacing: 0.05em;\n background-color: rgba(103, 232, 249, 0.12) !important;\n color: var(--rcui-info, #67e8f9) !important;\n border: 1px solid rgba(103, 232, 249, 0.3) !important;\n}\n\n.rcui-connector-chip--clickable {\n cursor: pointer;\n}\n\n.rcui-connector-chip--clickable:hover {\n background-color: rgba(103, 232, 249, 0.22) !important;\n}\n\n/* ── Drag overlay ── */\n.rcui-overlay {\n display: flex;\n gap: 8px;\n align-items: center;\n opacity: 0.9;\n}\n\n/* ── Group paper ── */\n.rcui-group-paper {\n padding: 12px;\n border-color: rgba(255, 255, 255, 0.08) !important;\n background-color: rgba(255, 255, 255, 0.02) !important;\n backdrop-filter: blur(8px);\n transition:\n border-color 0.15s,\n background-color 0.15s;\n}\n\n.rcui-group-paper--over {\n border-color: var(--rcui-primary, #7c8aff) !important;\n background-color: rgba(124, 138, 255, 0.06) !important;\n}\n\n/* ── Single-row droppable wrapper ── */\n.rcui-droppable-single {\n border-radius: 4px;\n transition:\n background-color 0.15s,\n outline-color 0.15s;\n}\n\n.rcui-droppable-single--over {\n background-color: rgba(255, 255, 255, 0.06);\n outline: 2px solid var(--rcui-primary, #7c8aff);\n}\n\n/* ── Ungroup drop zone ── */\n.rcui-drop-zone {\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 48px;\n padding: 8px;\n border-radius: 4px;\n border: 2px dashed rgba(255, 255, 255, 0.06);\n background-color: transparent;\n transition:\n border-color 0.2s,\n background-color 0.2s;\n}\n\n.rcui-drop-zone--over {\n border-color: var(--rcui-primary, #7c8aff);\n background-color: rgba(124, 138, 255, 0.06);\n}\n\n/* ── Input wrapper ── */\n.rcui-input-wrapper {\n position: relative;\n}\n\n/* ── Ghost input inner container ── */\n.rcui-input-inner {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n}\n\n.rcui-input-inner > input {\n width: 100%;\n background: transparent;\n}\n\n/* Hidden mirror span: same font as input, used to measure text width */\n.rcui-mirror {\n position: absolute;\n top: 0;\n left: 0;\n height: 0;\n overflow: hidden;\n white-space: pre;\n pointer-events: none;\n font: inherit;\n letter-spacing: inherit;\n visibility: hidden;\n}\n\n/* Ghost completion text, positioned right after the typed text */\n.rcui-ghost {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n white-space: pre;\n pointer-events: none;\n font: inherit;\n letter-spacing: inherit;\n color: rgba(255, 255, 255, 0.25);\n}\n\n/* Squiggly underline layer, overlaid on top of the input text */\n.rcui-squiggly-layer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n pointer-events: none;\n font: inherit;\n letter-spacing: inherit;\n white-space: pre;\n color: transparent;\n overflow: visible;\n}\n\n.rcui-squiggly {\n text-decoration: underline wavy #f5c542;\n text-underline-offset: 1px;\n text-decoration-thickness: 1px;\n text-decoration-skip-ink: none;\n}\n\n/* ── Input adornment icons ── */\n.rcui-adornment-enter {\n color: rgba(255, 255, 255, 0.3) !important;\n}\n\n.rcui-adornment-error {\n color: #f5c542 !important;\n}\n\n/* ── Autocomplete dropdown ── */\n.rcui-completions {\n position: absolute;\n top: 100%;\n z-index: 1300;\n margin: 4px 0 0;\n padding: 4px 0;\n list-style: none;\n border-radius: 6px;\n border: 1px solid rgba(255, 255, 255, 0.12);\n background-color: #212738;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);\n max-height: 240px;\n overflow-y: auto;\n width: max-content;\n min-width: 120px;\n max-width: 280px;\n}\n\n.rcui-completion-item {\n padding: 6px 14px;\n font-size: 0.875rem;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.8);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.rcui-completion-item--active {\n background-color: rgba(124, 138, 255, 0.18);\n color: #e6edf3;\n}\n\n/* ── Popover value edit ── */\n.rcui-popover-value-edit {\n padding: 12px;\n}\n"],"mappings":"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","names":[]}