@startsimpli/funnels 0.1.2 → 0.1.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/engine.ts","../../src/hooks/useDebouncedValue.ts","../../src/components/FunnelPreview/PreviewStats.tsx","../../src/components/FunnelPreview/StageBreakdown.tsx","../../src/components/FunnelPreview/EntityCard.tsx","../../src/components/FunnelPreview/LoadingPreview.tsx","../../src/components/FunnelPreview/FunnelPreview.tsx","../../src/components/FunnelCard/StatusBadge.tsx","../../src/components/FunnelCard/StageIndicator.tsx","../../src/components/FunnelCard/MatchBar.tsx","../../src/components/FunnelCard/FunnelStats.tsx","../../src/components/FunnelCard/FunnelCard.tsx","../../src/components/FunnelVisualFlow/StageNode.tsx","../../src/components/FunnelVisualFlow/FlowLegend.tsx","../../src/components/FunnelVisualFlow/FunnelVisualFlow.tsx","../../src/components/FilterRuleEditor/LogicToggle.tsx","../../src/components/FilterRuleEditor/FieldSelector.tsx","../../src/components/FilterRuleEditor/constants.ts","../../src/components/FilterRuleEditor/OperatorSelector.tsx","../../src/components/FilterRuleEditor/ValueInputs/TextValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/NumberValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/DateValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/BooleanValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/ChoiceValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/MultiChoiceValueInput.tsx","../../src/components/FilterRuleEditor/RuleRow.tsx","../../src/types/index.ts","../../src/components/FilterRuleEditor/FilterRuleEditor.tsx","../../src/components/FunnelStageBuilder/StageActions.tsx","../../src/components/FunnelStageBuilder/TagInput.tsx","../../src/components/FunnelStageBuilder/StageForm.tsx","../../src/components/FunnelStageBuilder/StageCard.tsx","../../src/components/FunnelStageBuilder/AddStageButton.tsx","../../src/components/FunnelStageBuilder/FunnelStageBuilder.tsx","../../src/components/FunnelRunHistory/RunFilters.tsx","../../src/components/FunnelRunHistory/RunStatusBadge.tsx","../../src/components/FunnelRunHistory/RunActions.tsx","../../src/components/FunnelRunHistory/utils.ts","../../src/components/FunnelRunHistory/RunRow.tsx","../../src/components/FunnelRunHistory/StageBreakdownList.tsx","../../src/components/FunnelRunHistory/RunDetailsModal.tsx","../../src/components/FunnelRunHistory/FunnelRunHistory.tsx"],"names":["useState","useEffect","jsxs","jsx","Fragment","Handle","Position","Panel","useMemo","useNodesState","useEdgesState","useCallback","ReactFlow","Background","BackgroundVariant","Controls","useSortable","CSS","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","statusConfig","useRef"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @startsimpli/funnels - Core Funnel Execution Engine\n *\n * BRUTALLY GENERIC - Works for ANY entity type:\n * - Investors, firms, contacts, organizations\n * - Recipes, ingredients, users\n * - Leads, tasks, projects\n * - GitHub repos, pull requests, issues\n *\n * The engine processes entities through stages sequentially,\n * evaluating rules and applying actions based on match results.\n */\n\nimport type {\n Funnel,\n FunnelStage,\n FilterRule,\n MatchAction,\n NoMatchAction,\n FunnelResult,\n StageResult,\n RuleResult,\n StageStats,\n} from '../types';\n\n// ============================================================================\n// Execution Result Types\n// ============================================================================\n\n/**\n * Complete result of funnel execution\n */\nexport interface ExecutionResult<T = any> {\n /** Entities that matched and are in output */\n matched: FunnelResult<T>[];\n\n /** Entities that were excluded */\n excluded: FunnelResult<T>[];\n\n /** Total entities processed */\n total_input: number;\n\n /** Total entities that matched */\n total_matched: number;\n\n /** Total entities excluded */\n total_excluded: number;\n\n /** Total entities tagged */\n total_tagged: number;\n\n /** Per-stage statistics */\n stage_stats: Record<string, StageStats>;\n\n /** Execution duration in milliseconds */\n duration_ms: number;\n\n /** Errors encountered (non-fatal) */\n errors?: string[];\n}\n\n// ============================================================================\n// BEAD: fund-your-startup-a0b8 - Funnel engine evaluateRule is a non-functional stub\n// evaluateRule always returns error='Evaluator not implemented yet' — funnels cannot match anything\n// resolveField should import from /packages/funnels/src/core/field-resolver.ts\n// ============================================================================\n\nfunction evaluateRule<T>(_entity: T, _rule: FilterRule): RuleResult {\n throw new Error('Not implemented - BEAD: fund-your-startup-a0b8. evaluateRule must import from rule evaluator.');\n // return {\n // field_path: _rule.field_path,\n // operator: _rule.operator,\n // value: _rule.value,\n // actual_value: undefined,\n // matched: false,\n // error: 'Evaluator not implemented yet',\n // };\n}\n\nfunction resolveField<T>(_entity: T, _fieldPath: string): any {\n throw new Error('Not implemented - BEAD: fund-your-startup-a0b8. resolveField must import from field-resolver.ts.');\n // const keys = _fieldPath.split('.');\n // let value: any = _entity;\n // for (const key of keys) {\n // if (value === null || value === undefined) return undefined;\n // value = value[key];\n // }\n // return value;\n}\n\n// ============================================================================\n// Funnel Engine\n// ============================================================================\n\n/**\n * Core funnel execution engine\n *\n * Processes entities through stages sequentially, evaluating rules\n * and applying actions based on match results.\n *\n * Generic over entity type T - works with ANY data structure.\n */\nexport class FunnelEngine<T = any> {\n /**\n * Execute a funnel on a set of entities\n *\n * @param funnel - The funnel definition to execute\n * @param entities - Input entities to process\n * @returns ExecutionResult with matched/excluded entities and stats\n */\n execute(funnel: Funnel<T>, entities: T[]): ExecutionResult<T> {\n const startTime = Date.now();\n\n // Initialize results\n const results: FunnelResult<T>[] = entities.map(entity => ({\n entity,\n matched: true, // Start as matched, exclude as needed\n accumulated_tags: [],\n context: {},\n stage_results: [],\n }));\n\n const stageStats: Record<string, StageStats> = {};\n const errors: string[] = [];\n\n // Sort stages by order\n const sortedStages = [...funnel.stages].sort((a, b) => a.order - b.order);\n\n // Process each stage sequentially\n for (const stage of sortedStages) {\n const stageStartTime = Date.now();\n\n // Track entities entering this stage\n const inputEntities = results.filter(r => r.matched && !r.excluded_at_stage);\n\n const stats: StageStats = {\n stage_id: stage.id,\n stage_name: stage.name,\n input_count: inputEntities.length,\n matched_count: 0,\n not_matched_count: 0,\n excluded_count: 0,\n tagged_count: 0,\n continued_count: 0,\n error_count: 0,\n };\n\n // Process each entity through this stage\n for (const result of inputEntities) {\n try {\n const stageResult = this.processStage(stage, result.entity);\n\n // Update entity result\n result.stage_results!.push(stageResult);\n\n // Apply stage result to entity\n if (stageResult.matched) {\n stats.matched_count++;\n } else {\n stats.not_matched_count++;\n }\n\n if (stageResult.tags_added && stageResult.tags_added.length > 0) {\n result.accumulated_tags.push(...stageResult.tags_added);\n stats.tagged_count++;\n }\n\n if (stageResult.context_added) {\n result.context = { ...result.context, ...stageResult.context_added };\n }\n\n if (stageResult.excluded) {\n result.matched = false;\n result.excluded_at_stage = stage.id;\n stats.excluded_count++;\n } else if (stageResult.continued) {\n stats.continued_count++;\n }\n } catch (error) {\n stats.error_count!++;\n errors.push(`Stage ${stage.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n stats.duration_ms = Date.now() - stageStartTime;\n stageStats[stage.id] = stats;\n }\n\n // Apply completion tags to matched entities\n if (funnel.completion_tags && funnel.completion_tags.length > 0) {\n for (const result of results) {\n if (result.matched) {\n result.accumulated_tags.push(...funnel.completion_tags);\n }\n }\n }\n\n // Separate matched and excluded\n const matched = results.filter(r => r.matched);\n const excluded = results.filter(r => !r.matched);\n\n // Count unique tagged entities\n const totalTagged = results.filter(r => r.accumulated_tags.length > 0).length;\n\n return {\n matched,\n excluded,\n total_input: entities.length,\n total_matched: matched.length,\n total_excluded: excluded.length,\n total_tagged: totalTagged,\n stage_stats: stageStats,\n duration_ms: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined,\n };\n }\n\n /**\n * Process a single entity through a stage\n *\n * @param stage - The stage to process\n * @param entity - The entity to evaluate\n * @returns StageResult with match status and actions taken\n */\n private processStage(stage: FunnelStage<T>, entity: T): StageResult {\n // Evaluate all rules\n const ruleResults: RuleResult[] = [];\n let matched = false;\n\n if (stage.custom_evaluator) {\n // Use custom evaluator if provided (highest priority)\n try {\n matched = stage.custom_evaluator(entity);\n } catch (error) {\n matched = false;\n }\n } else if (stage.rules.length === 0) {\n // No rules and no custom evaluator = always match\n matched = true;\n } else {\n // Evaluate rules with filter logic\n for (const rule of stage.rules) {\n const ruleResult = evaluateRule(entity, rule);\n ruleResults.push(ruleResult);\n }\n\n // Apply filter logic (AND/OR)\n if (stage.filter_logic === 'AND') {\n // All rules must match\n matched = ruleResults.every(r => r.matched);\n } else {\n // At least one rule must match\n matched = ruleResults.some(r => r.matched);\n }\n }\n\n // Determine action based on match result\n let action: MatchAction | NoMatchAction;\n let tagsAdded: string[] = [];\n let contextAdded: Record<string, any> | undefined;\n let excluded = false;\n let continued = false;\n\n if (matched) {\n action = stage.match_action;\n\n // Add match tags\n if (stage.match_tags && stage.match_tags.length > 0) {\n tagsAdded = [...stage.match_tags];\n }\n\n // Add match context\n if (stage.match_context) {\n contextAdded = stage.match_context;\n }\n\n // Apply match action\n switch (stage.match_action) {\n case 'continue':\n continued = true;\n break;\n case 'tag':\n // Tags added, stop processing\n excluded = true;\n break;\n case 'tag_continue':\n // Tags added, continue processing\n continued = true;\n break;\n case 'output':\n // Add to output, stop processing (but not excluded)\n continued = false;\n break;\n }\n } else {\n action = stage.no_match_action;\n\n // Add no-match tags\n if (stage.no_match_tags && stage.no_match_tags.length > 0) {\n tagsAdded = [...stage.no_match_tags];\n }\n\n // Apply no-match action\n switch (stage.no_match_action) {\n case 'continue':\n continued = true;\n break;\n case 'exclude':\n excluded = true;\n break;\n case 'tag_exclude':\n excluded = true;\n break;\n }\n }\n\n return {\n stage_id: stage.id,\n stage_name: stage.name,\n matched,\n rule_results: ruleResults.length > 0 ? ruleResults : undefined,\n action,\n tags_added: tagsAdded.length > 0 ? tagsAdded : undefined,\n context_added: contextAdded,\n excluded,\n continued,\n };\n }\n}\n","/**\n * useDebouncedValue Hook\n *\n * Returns a debounced version of the input value that only updates\n * after the specified delay has elapsed without changes.\n *\n * Use for expensive computations that shouldn't run on every keystroke.\n */\n\nimport { useEffect, useState } from 'react';\n\nexport function useDebouncedValue<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Set timeout to update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Cleanup: cancel timeout if value changes before delay elapses\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","/**\n * PreviewStats Component\n *\n * Progress bar showing matched vs excluded entities with percentage.\n *\n * Design Rationale:\n * - Horizontal progress bar shows match rate at a glance\n * - Green (matched) and red (excluded) create clear visual distinction\n * - Percentage provides quick understanding of funnel effectiveness\n * - Counts below bar provide exact numbers\n *\n * Accessibility:\n * - ARIA progressbar role for screen readers\n * - Text labels provide non-visual indication\n * - Sufficient color contrast\n */\n\ninterface PreviewStatsProps {\n totalMatched: number;\n totalExcluded: number;\n matchPercentage: number;\n className?: string;\n}\n\nexport function PreviewStats({\n totalMatched,\n totalExcluded,\n matchPercentage,\n className = '',\n}: PreviewStatsProps) {\n const total = totalMatched + totalExcluded;\n\n return (\n <div className={`space-y-2 ${className}`}>\n {/* Progress bar */}\n <div className=\"relative h-8 bg-gray-200 rounded-lg overflow-hidden\">\n <div\n className=\"absolute inset-y-0 left-0 bg-gradient-to-r from-green-500 to-green-600 transition-all duration-300 flex items-center justify-center\"\n style={{ width: `${matchPercentage}%` }}\n role=\"progressbar\"\n aria-valuenow={matchPercentage}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${totalMatched} of ${total} matched (${matchPercentage}%)`}\n >\n {matchPercentage > 15 && (\n <span className=\"text-xs font-semibold text-white\">\n {totalMatched.toLocaleString()}/{total.toLocaleString()} ({matchPercentage}%)\n </span>\n )}\n </div>\n {matchPercentage <= 15 && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span className=\"text-xs font-semibold text-gray-600\">\n {totalMatched.toLocaleString()}/{total.toLocaleString()} ({matchPercentage}%)\n </span>\n </div>\n )}\n </div>\n\n {/* Match/Exclude counts */}\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-sm bg-green-500\" />\n <span className=\"font-medium text-gray-700\">\n {totalMatched.toLocaleString()} Matched\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-sm bg-gray-300\" />\n <span className=\"font-medium text-gray-700\">\n {totalExcluded.toLocaleString()} Excluded\n </span>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * StageBreakdown Component\n *\n * Shows per-stage statistics in a funnel flow visualization.\n *\n * Design Rationale:\n * - Sequential list shows funnel flow from top to bottom\n * - Stage numbers (①②③) provide clear ordering\n * - Exclusion count (-N) shows entities removed at each stage\n * - Remaining count shows entities continuing to next stage\n * - Color coding: gray for excluded, green for final matched\n *\n * Accessibility:\n * - Semantic list structure\n * - Clear text labels for all metrics\n * - Color is supplementary to text\n */\n\nimport type { StageStats } from '../../types';\n\nexport interface StagePreviewStats {\n stage_id: string;\n stage_name: string;\n input_count: number;\n excluded_count: number;\n remaining_count: number;\n}\n\ninterface StageBreakdownProps {\n stageStats: Record<string, StagePreviewStats>;\n stages: Array<{ id: string; name: string; order: number }>;\n className?: string;\n}\n\nexport function StageBreakdown({\n stageStats,\n stages,\n className = '',\n}: StageBreakdownProps) {\n // Sort stages by order\n const sortedStages = [...stages].sort((a, b) => a.order - b.order);\n\n return (\n <div className={className}>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">\n Stage Breakdown\n </h3>\n\n <ol className=\"space-y-2\">\n {sortedStages.map((stage, index) => {\n const stats = stageStats[stage.id];\n if (!stats) return null;\n\n const isLast = index === sortedStages.length - 1;\n const excludedCount = stats.excluded_count;\n const remainingCount = stats.remaining_count;\n\n return (\n <li\n key={stage.id}\n className=\"flex items-center justify-between py-2 px-3 bg-gray-50 rounded-lg\"\n >\n {/* Stage info */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <span className=\"flex-shrink-0 w-6 h-6 flex items-center justify-center bg-blue-100 text-blue-700 rounded-full text-xs font-bold\">\n {index + 1}\n </span>\n <span className=\"text-sm font-medium text-gray-900 truncate\">\n {stage.name}\n </span>\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center gap-3 text-sm\">\n {excludedCount > 0 && (\n <span className=\"text-red-600 font-medium\">\n -{excludedCount.toLocaleString()}\n </span>\n )}\n <span\n className={`font-semibold ${\n isLast ? 'text-green-600' : 'text-gray-700'\n }`}\n >\n {remainingCount.toLocaleString()} {isLast ? 'final' : 'left'}\n </span>\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n","/**\n * EntityCard Component\n *\n * Displays a single entity in the preview list.\n * Supports custom rendering via render prop for entity-specific display.\n *\n * Design Rationale:\n * - Card design provides visual containment\n * - Border and shadow create depth\n * - Rounded corners match overall design system\n * - Render prop pattern keeps component BRUTALLY GENERIC\n *\n * Accessibility:\n * - Semantic article element for content\n * - Focus states for keyboard navigation\n */\n\nimport type { ReactNode } from 'react';\n\ninterface EntityCardProps {\n entity: any;\n renderEntity?: (entity: any) => ReactNode;\n className?: string;\n}\n\n/**\n * Default entity renderer\n * Shows entity name if available, otherwise shows JSON preview\n */\nfunction defaultEntityRenderer(entity: any): ReactNode {\n if (entity.name) {\n return (\n <div>\n <div className=\"font-medium text-gray-900\">{entity.name}</div>\n <div className=\"text-sm text-gray-600 mt-1\">\n {Object.keys(entity)\n .filter((key) => key !== 'name')\n .slice(0, 3)\n .map((key) => (\n <span key={key} className=\"mr-2\">\n {key}: {String(entity[key]).slice(0, 20)}\n </span>\n ))}\n </div>\n </div>\n );\n }\n\n // Fallback: show JSON preview\n return (\n <div className=\"text-sm text-gray-700 font-mono\">\n <pre className=\"whitespace-pre-wrap break-all\">\n {JSON.stringify(entity, null, 2).slice(0, 150)}\n {JSON.stringify(entity, null, 2).length > 150 ? '...' : ''}\n </pre>\n </div>\n );\n}\n\nexport function EntityCard({\n entity,\n renderEntity = defaultEntityRenderer,\n className = '',\n}: EntityCardProps) {\n return (\n <article\n className={`p-3 bg-white border border-gray-200 rounded-lg shadow-sm hover:border-gray-300 transition-colors ${className}`}\n >\n {renderEntity(entity)}\n </article>\n );\n}\n","/**\n * LoadingPreview Component\n *\n * Skeleton loading state for FunnelPreview.\n *\n * Design Rationale:\n * - Skeleton shapes match actual content layout\n * - Pulse animation indicates loading\n * - Gray placeholders maintain visual hierarchy\n * - Reduces perceived loading time\n *\n * Accessibility:\n * - ARIA live region announces loading state\n * - Screen readers informed of status change\n */\n\nexport function LoadingPreview() {\n return (\n <div className=\"animate-pulse\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">Loading preview...</span>\n\n {/* Stats bar skeleton */}\n <div className=\"space-y-2 mb-6\">\n <div className=\"h-8 bg-gray-200 rounded-lg\" />\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-32 bg-gray-200 rounded\" />\n <div className=\"h-4 w-32 bg-gray-200 rounded\" />\n </div>\n </div>\n\n {/* Stage breakdown skeleton */}\n <div className=\"mb-6\">\n <div className=\"h-5 w-40 bg-gray-200 rounded mb-3\" />\n <div className=\"space-y-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-12 bg-gray-100 rounded-lg flex items-center px-3 gap-3\"\n >\n <div className=\"w-6 h-6 bg-gray-200 rounded-full\" />\n <div className=\"h-4 bg-gray-200 rounded flex-1\" />\n <div className=\"h-4 w-16 bg-gray-200 rounded\" />\n </div>\n ))}\n </div>\n </div>\n\n {/* Entity cards skeleton */}\n <div className=\"space-y-3\">\n <div className=\"h-5 w-48 bg-gray-200 rounded mb-3\" />\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-20 bg-gray-100 border border-gray-200 rounded-lg p-3\">\n <div className=\"h-4 bg-gray-200 rounded w-3/4 mb-2\" />\n <div className=\"h-3 bg-gray-200 rounded w-1/2\" />\n </div>\n ))}\n </div>\n </div>\n );\n}\n","/**\n * FunnelPreview Component\n *\n * Real-time preview of funnel execution on sample entities.\n *\n * Design Goal:\n * Users should immediately see how their funnel configuration affects entities.\n * Preview updates automatically as they edit rules, providing instant feedback\n * on match rates and stage-by-stage filtering results.\n *\n * Visual Hierarchy Rationale:\n * 1. Match stats bar (top) - Most important: overall funnel effectiveness\n * 2. Stage breakdown - Shows filtering flow and where entities drop off\n * 3. Sample entities - Concrete examples of what matched\n *\n * Interaction Notes:\n * - Debounced updates (300ms) prevent excessive computation during editing\n * - Loading skeleton maintains layout and reduces perceived lag\n * - Custom entity renderer via render prop for domain-specific display\n *\n * Responsive Behavior:\n * - Single column layout works on all screen sizes\n * - Entity cards stack vertically\n * - Stage breakdown scrolls horizontally on mobile if needed\n *\n * Accessibility Considerations:\n * - ARIA live region announces when preview updates\n * - Loading state communicated to screen readers\n * - All metrics have text labels (color is supplementary)\n * - Keyboard navigation through entity cards\n *\n * Component Specification:\n * - States: loading, empty (no matches), populated\n * - Behaviors: auto-compute on funnel/entity changes\n * - Variations: with/without custom entity renderer\n */\n\nimport { useEffect, useState, type ReactNode } from 'react';\nimport type { Funnel } from '../../types';\nimport { FunnelEngine, type ExecutionResult } from '../../core/engine';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { PreviewStats } from './PreviewStats';\nimport { StageBreakdown, type StagePreviewStats } from './StageBreakdown';\nimport { EntityCard } from './EntityCard';\nimport { LoadingPreview } from './LoadingPreview';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PreviewResult {\n totalMatched: number;\n totalExcluded: number;\n matchPercentage: number;\n previewEntities: any[];\n stageStats: Record<string, StagePreviewStats>;\n}\n\nexport interface FunnelPreviewProps {\n funnel: Funnel;\n sampleEntities: any[];\n onPreview?: (result: PreviewResult) => void;\n renderEntity?: (entity: any) => ReactNode;\n maxPreviewEntities?: number;\n className?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert ExecutionResult to PreviewResult\n */\nfunction convertToPreviewResult(\n execResult: ExecutionResult,\n maxEntities: number = 10\n): PreviewResult {\n const { matched, total_matched, total_excluded, stage_stats } = execResult;\n\n // Calculate match percentage\n const total = total_matched + total_excluded;\n const matchPercentage =\n total > 0 ? Math.round((total_matched / total) * 100) : 0;\n\n // Get preview entities (first N matched)\n const previewEntities = matched.slice(0, maxEntities).map((r) => r.entity);\n\n // Convert stage stats to preview format\n const previewStageStats: Record<string, StagePreviewStats> = {};\n\n Object.entries(stage_stats).forEach(([stageId, stats]) => {\n previewStageStats[stageId] = {\n stage_id: stats.stage_id,\n stage_name: stats.stage_name,\n input_count: stats.input_count,\n excluded_count: stats.excluded_count,\n remaining_count: stats.input_count - stats.excluded_count,\n };\n });\n\n return {\n totalMatched: total_matched,\n totalExcluded: total_excluded,\n matchPercentage,\n previewEntities,\n stageStats: previewStageStats,\n };\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FunnelPreview({\n funnel,\n sampleEntities,\n onPreview,\n renderEntity,\n maxPreviewEntities = 10,\n className = '',\n}: FunnelPreviewProps) {\n const [result, setResult] = useState<PreviewResult | null>(null);\n const [isComputing, setIsComputing] = useState(false);\n\n // Debounce funnel to avoid excessive computation\n const debouncedFunnel = useDebouncedValue(funnel, 300);\n\n // Compute preview when funnel or entities change\n useEffect(() => {\n async function compute() {\n setIsComputing(true);\n\n try {\n const engine = new FunnelEngine();\n const execResult = engine.execute(debouncedFunnel, sampleEntities);\n const previewResult = convertToPreviewResult(\n execResult,\n maxPreviewEntities\n );\n\n setResult(previewResult);\n\n // Notify parent component\n if (onPreview) {\n onPreview(previewResult);\n }\n } catch (error) {\n console.error('Preview computation failed:', error);\n // Set empty result on error\n setResult({\n totalMatched: 0,\n totalExcluded: sampleEntities.length,\n matchPercentage: 0,\n previewEntities: [],\n stageStats: {},\n });\n } finally {\n setIsComputing(false);\n }\n }\n\n compute();\n }, [debouncedFunnel, sampleEntities, maxPreviewEntities, onPreview]);\n\n // Loading state\n if (isComputing && !result) {\n return (\n <div className={className}>\n <LoadingPreview />\n </div>\n );\n }\n\n // No result yet\n if (!result) {\n return null;\n }\n\n const { totalMatched, totalExcluded, matchPercentage, previewEntities, stageStats } =\n result;\n\n return (\n <div className={className} role=\"region\" aria-label=\"Funnel preview\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Preview Results\n </h2>\n\n {/* Match stats */}\n <PreviewStats\n totalMatched={totalMatched}\n totalExcluded={totalExcluded}\n matchPercentage={matchPercentage}\n className=\"mb-6\"\n />\n\n {/* Stage breakdown */}\n {funnel.stages.length > 0 && (\n <StageBreakdown\n stageStats={stageStats}\n stages={funnel.stages}\n className=\"mb-6\"\n />\n )}\n\n {/* Sample matches */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">\n Sample Matches ({Math.min(previewEntities.length, maxPreviewEntities)} of{' '}\n {totalMatched.toLocaleString()})\n </h3>\n\n {previewEntities.length === 0 ? (\n <div className=\"p-8 text-center bg-gray-50 rounded-lg border-2 border-dashed border-gray-300\">\n <p className=\"text-gray-600\">No entities matched this funnel</p>\n <p className=\"text-sm text-gray-500 mt-1\">\n Try adjusting your filter rules\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {previewEntities.map((entity, index) => (\n <EntityCard\n key={index}\n entity={entity}\n renderEntity={renderEntity}\n />\n ))}\n {totalMatched > maxPreviewEntities && (\n <div className=\"text-center py-2 text-sm text-gray-500\">\n + {(totalMatched - maxPreviewEntities).toLocaleString()} more...\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Loading overlay */}\n {isComputing && (\n <div className=\"absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center rounded-lg\">\n <div className=\"flex items-center gap-2 text-gray-600\">\n <div className=\"w-5 h-5 border-2 border-gray-300 border-t-blue-600 rounded-full animate-spin\" />\n <span className=\"text-sm font-medium\">Updating preview...</span>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * StatusBadge Component\n *\n * Displays funnel status as a color-coded pill badge.\n *\n * Design Rationale:\n * - Pill shape provides soft, approachable aesthetic\n * - Color coding enables instant status recognition\n * - Uppercase text improves scannability\n */\n\nimport { FunnelStatus } from '../../types';\n\ninterface StatusBadgeProps {\n status: FunnelStatus;\n className?: string;\n}\n\nconst statusConfig: Record<FunnelStatus, { color: string; bgColor: string; label: string }> = {\n active: {\n color: 'text-green-800',\n bgColor: 'bg-green-100',\n label: 'ACTIVE',\n },\n draft: {\n color: 'text-yellow-800',\n bgColor: 'bg-yellow-100',\n label: 'DRAFT',\n },\n paused: {\n color: 'text-gray-800',\n bgColor: 'bg-gray-100',\n label: 'PAUSED',\n },\n archived: {\n color: 'text-red-800',\n bgColor: 'bg-red-100',\n label: 'ARCHIVED',\n },\n};\n\nexport function StatusBadge({ status, className = '' }: StatusBadgeProps) {\n const config = statusConfig[status];\n\n return (\n <span\n className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${config.bgColor} ${config.color} ${className}`}\n >\n {config.label}\n </span>\n );\n}\n","/**\n * StageIndicator Component\n *\n * Displays a numbered circle badge for funnel stages with connecting vertical line.\n *\n * Design Rationale:\n * - Numbered circles (①②③) provide clear sequential ordering\n * - Vertical connecting line shows flow/progression\n * - Compact layout conserves vertical space\n * - Gray text for rule count de-emphasizes secondary info\n *\n * Accessibility:\n * - Sufficient color contrast (4.5:1 minimum)\n * - Semantic HTML structure\n */\n\ninterface StageIndicatorProps {\n order: number;\n name: string;\n ruleCount: number;\n isLast?: boolean;\n className?: string;\n}\n\nexport function StageIndicator({\n order,\n name,\n ruleCount,\n isLast = false,\n className = ''\n}: StageIndicatorProps) {\n // Format order as circled number (1-20 supported by Unicode)\n const circledNumber = order < 20\n ? String.fromCharCode(9312 + order) // ① = U+2460\n : `(${order + 1})`;\n\n return (\n <div className={`flex items-start gap-2 ${className}`}>\n {/* Stage number circle with connecting line */}\n <div className=\"flex flex-col items-center\">\n <div className=\"flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 text-blue-800 flex items-center justify-center text-sm font-medium\">\n {circledNumber}\n </div>\n {!isLast && (\n <div className=\"w-0.5 h-6 bg-gray-200 mt-1\" />\n )}\n </div>\n\n {/* Stage name and rule count */}\n <div className=\"flex-1 pt-0.5 min-w-0\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-sm font-medium text-gray-900 truncate\">\n {name}\n </span>\n <span className=\"text-xs text-gray-500 whitespace-nowrap\">\n {ruleCount} {ruleCount === 1 ? 'rule' : 'rules'}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * MatchBar Component\n *\n * Progress bar showing match percentage with count label.\n *\n * Design Rationale:\n * - Green gradient conveys success/completion\n * - Rounded corners match card aesthetic\n * - Label shows absolute count (more actionable than percentage alone)\n * - Gray background shows full scale\n *\n * Accessibility:\n * - Text label provides non-visual indication of value\n * - Sufficient contrast between bar and background\n */\n\ninterface MatchBarProps {\n matched: number;\n total: number;\n className?: string;\n}\n\nexport function MatchBar({ matched, total, className = '' }: MatchBarProps) {\n const percentage = total > 0 ? Math.round((matched / total) * 100) : 0;\n\n return (\n <div className={`space-y-1 ${className}`}>\n {/* Progress bar */}\n <div className=\"relative h-6 bg-gray-200 rounded-md overflow-hidden\">\n <div\n className=\"absolute inset-y-0 left-0 bg-gradient-to-r from-green-500 to-green-600 transition-all duration-300\"\n style={{ width: `${percentage}%` }}\n role=\"progressbar\"\n aria-valuenow={percentage}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${matched} of ${total} matched`}\n />\n </div>\n\n {/* Match count label */}\n <div className=\"text-right\">\n <span className=\"text-sm font-medium text-gray-700\">\n {matched.toLocaleString()} matched\n </span>\n </div>\n </div>\n );\n}\n","/**\n * FunnelStats Component\n *\n * Three-column stats display showing INPUT / MATCHED / EXCLUDED counts.\n *\n * Design Rationale:\n * - Three equal columns for balance\n * - Color coding: Blue (input/neutral), Green (matched/success), Red (excluded/warning)\n * - Large numbers draw attention to key metrics\n * - Labels use uppercase for consistency with status badge\n *\n * Accessibility:\n * - Semantic HTML (dl/dt/dd structure)\n * - Color is supplementary (text labels provide meaning)\n */\n\ninterface FunnelStatsProps {\n input: number;\n matched: number;\n excluded: number;\n className?: string;\n}\n\nexport function FunnelStats({\n input,\n matched,\n excluded,\n className = ''\n}: FunnelStatsProps) {\n const stats = [\n {\n label: 'INPUT',\n value: input,\n color: 'text-blue-600',\n bgColor: 'bg-blue-50'\n },\n {\n label: 'MATCHED',\n value: matched,\n color: 'text-green-600',\n bgColor: 'bg-green-50'\n },\n {\n label: 'EXCLUDED',\n value: excluded,\n color: 'text-red-600',\n bgColor: 'bg-red-50'\n },\n ];\n\n return (\n <dl className={`grid grid-cols-3 gap-2 ${className}`}>\n {stats.map(({ label, value, color, bgColor }) => (\n <div\n key={label}\n className={`${bgColor} rounded-lg px-3 py-2.5 text-center`}\n >\n <dt className=\"text-xs font-medium text-gray-600 mb-1\">\n {label}\n </dt>\n <dd className={`text-lg font-bold ${color}`}>\n {value.toLocaleString()}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n","/**\n * FunnelCard Component\n *\n * Main card component displaying funnel overview with stages, match stats, and actions.\n *\n * Design Goal:\n * Users should be able to quickly assess funnel health, understand its structure,\n * and take action (view details) without cognitive overload.\n *\n * Visual Hierarchy:\n * 1. Funnel name + status (primary identification)\n * 2. Description (context)\n * 3. Stage flow (structure understanding)\n * 4. Match bar (visual performance indicator)\n * 5. Stats (detailed performance metrics)\n * 6. Action button (next step)\n *\n * Layout: Card with white background, shadow, rounded corners (matches Django admin aesthetic)\n *\n * Responsive Behavior:\n * - Mobile (< 640px): Full width, stack all elements\n * - Tablet (640px - 1024px): Constrained width, same vertical layout\n * - Desktop (> 1024px): Max width with horizontal centering possible\n *\n * Accessibility:\n * - Semantic HTML (article, header, section, footer)\n * - ARIA labels for interactive elements\n * - Keyboard navigation support\n * - Color contrast meets WCAG AA (4.5:1)\n * - Focus indicators on interactive elements\n *\n * Interaction Notes:\n * - Card hover: subtle elevation increase (shadow deepens)\n * - Button hover: background darkens, arrow shifts right\n * - Button focus: ring outline for keyboard navigation\n * - Click zones: entire button is clickable, not just text\n *\n * Performance:\n * - No images (icon-free design)\n * - CSS-only animations\n * - Efficient re-renders (React.memo potential)\n */\n\nimport { Funnel, FunnelRun } from '../../types';\nimport { StatusBadge } from './StatusBadge';\nimport { StageIndicator } from './StageIndicator';\nimport { MatchBar } from './MatchBar';\nimport { FunnelStats } from './FunnelStats';\n\nexport interface FunnelCardProps {\n /** Funnel definition (BRUTALLY GENERIC - works for any entity type) */\n funnel: Funnel;\n\n /** Latest run results (optional - shows \"no runs yet\" state if missing) */\n latestRun?: FunnelRun;\n\n /** Callback when \"View Flow\" is clicked */\n onViewFlow?: (funnel: Funnel) => void;\n\n /** Callback when edit action is triggered (future: click on card header) */\n onEdit?: (funnel: Funnel) => void;\n\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function FunnelCard({\n funnel,\n latestRun,\n onViewFlow,\n onEdit,\n className = ''\n}: FunnelCardProps) {\n // Extract stats from latest run or use zeros\n const stats = latestRun ? {\n input: latestRun.total_input,\n matched: latestRun.total_matched,\n excluded: latestRun.total_excluded,\n } : {\n input: 0,\n matched: 0,\n excluded: 0,\n };\n\n const handleViewFlow = () => {\n if (onViewFlow) {\n onViewFlow(funnel);\n }\n };\n\n const hasRun = latestRun && latestRun.status === 'completed';\n\n return (\n <article\n className={`bg-white rounded-lg border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200 ${className}`}\n aria-label={`Funnel: ${funnel.name}`}\n >\n {/* Header: Name + Status Badge */}\n <header className=\"px-6 pt-5 pb-3 border-b border-gray-100\">\n <div className=\"flex items-start justify-between gap-3\">\n <h3 className=\"text-lg font-semibold text-gray-900 flex-1 min-w-0\">\n {funnel.name}\n </h3>\n <StatusBadge status={funnel.status} />\n </div>\n {funnel.description && (\n <p className=\"mt-2 text-sm text-gray-600 line-clamp-2\">\n {funnel.description}\n </p>\n )}\n </header>\n\n {/* Stage List */}\n <section\n className=\"px-6 py-4 space-y-0\"\n aria-label=\"Funnel stages\"\n >\n {funnel.stages.length === 0 ? (\n <div className=\"text-sm text-gray-500 italic py-4 text-center\">\n No stages defined\n </div>\n ) : (\n funnel.stages.map((stage, index) => (\n <StageIndicator\n key={stage.id}\n order={index}\n name={stage.name}\n ruleCount={stage.rules.length}\n isLast={index === funnel.stages.length - 1}\n />\n ))\n )}\n </section>\n\n {/* Match Visualization */}\n {hasRun && (\n <section\n className=\"px-6 py-4 border-t border-gray-100\"\n aria-label=\"Match results\"\n >\n <MatchBar\n matched={stats.matched}\n total={stats.input}\n />\n </section>\n )}\n\n {/* Stats Row */}\n {hasRun && (\n <section\n className=\"px-6 py-4 border-t border-gray-100\"\n aria-label=\"Funnel statistics\"\n >\n <FunnelStats\n input={stats.input}\n matched={stats.matched}\n excluded={stats.excluded}\n />\n </section>\n )}\n\n {/* No Run State */}\n {!hasRun && (\n <section\n className=\"px-6 py-4 border-t border-gray-100 text-center\"\n aria-label=\"Funnel status\"\n >\n <p className=\"text-sm text-gray-500\">\n {latestRun?.status === 'failed'\n ? 'Last run failed'\n : latestRun?.status === 'running'\n ? 'Running...'\n : 'No runs yet'}\n </p>\n </section>\n )}\n\n {/* Footer: Action Button */}\n <footer className=\"px-6 py-4 border-t border-gray-100\">\n <button\n onClick={handleViewFlow}\n className=\"w-full inline-flex items-center justify-center gap-2 px-4 py-2.5 bg-gray-50 hover:bg-gray-100 text-gray-900 text-sm font-medium rounded-md transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n aria-label={`View flow details for ${funnel.name}`}\n >\n <span>View Flow</span>\n <svg\n className=\"w-4 h-4 transition-transform group-hover:translate-x-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\n />\n </svg>\n </button>\n </footer>\n </article>\n );\n}\n","/**\n * StageNode Component\n *\n * Custom React Flow node representing a funnel stage.\n *\n * Visual Design:\n * - Circled number indicator (①②③)\n * - Stage name (truncated if too long)\n * - Rule count\n * - Match/exclude counts (if run data available)\n * - Color-coded border based on action type\n *\n * Color Coding:\n * - Continue: Blue (#3b82f6)\n * - Exclude/Tag+Exclude: Red (#ef4444)\n * - Tag/Tag+Continue: Yellow (#eab308)\n * - Output: Green (#22c55e)\n *\n * Interaction:\n * - Hover: Border darkens, shadow increases\n * - Click: Triggers onStageClick callback\n * - Focus: Keyboard accessible with ring outline\n *\n * Accessibility:\n * - Semantic HTML with proper roles\n * - ARIA labels for screen readers\n * - Keyboard navigation support\n */\n\nimport React from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { FunnelStage, StageStats, MatchAction, NoMatchAction } from '../../types';\nimport { getCircledNumber } from './FunnelVisualFlow';\n\nexport interface StageNodeData {\n stage: FunnelStage;\n stats?: StageStats;\n onStageClick?: (stage: FunnelStage) => void;\n}\n\n/**\n * Get color based on stage actions\n */\nfunction getStageColor(stage: FunnelStage): string {\n // Primary action determines color\n const matchAction = stage.match_action;\n const noMatchAction = stage.no_match_action;\n\n // Output stages are green\n if (matchAction === 'output') {\n return '#22c55e'; // green-500\n }\n\n // Exclude stages are red\n if (noMatchAction === 'exclude' || noMatchAction === 'tag_exclude') {\n return '#ef4444'; // red-500\n }\n\n // Tag stages are yellow\n if (matchAction === 'tag' || matchAction === 'tag_continue') {\n return '#eab308'; // yellow-500\n }\n\n // Default: continue is blue\n return '#3b82f6'; // blue-500\n}\n\n/**\n * Get action label for display\n */\nfunction getActionLabel(stage: FunnelStage): string {\n const matchAction = stage.match_action;\n const noMatchAction = stage.no_match_action;\n\n if (matchAction === 'output') return 'Output';\n if (noMatchAction === 'exclude') return 'Exclude Non-Matches';\n if (noMatchAction === 'tag_exclude') return 'Tag & Exclude';\n if (matchAction === 'tag') return 'Tag Matches';\n if (matchAction === 'tag_continue') return 'Tag & Continue';\n\n return 'Continue';\n}\n\nexport function StageNode({ data }: NodeProps) {\n const { stage, stats, onStageClick } = data as unknown as StageNodeData;\n const color = getStageColor(stage);\n const actionLabel = getActionLabel(stage);\n\n const handleClick = () => {\n if (onStageClick) {\n onStageClick(stage);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n\n return (\n <>\n {/* Input handle (top) - hidden for first stage */}\n <Handle\n type=\"target\"\n position={Position.Top}\n style={{ background: color, opacity: 0 }}\n isConnectable={false}\n />\n\n <div\n className=\"stage-node\"\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={`Stage ${stage.order + 1}: ${stage.name}`}\n style={{\n borderColor: color,\n borderWidth: '2px',\n borderStyle: 'solid',\n }}\n >\n {/* Stage number */}\n <div className=\"stage-number\" style={{ color }}>\n {getCircledNumber(stage.order + 1)}\n </div>\n\n {/* Stage name */}\n <div className=\"stage-name\" title={stage.name}>\n {stage.name}\n </div>\n\n {/* Rule count */}\n <div className=\"stage-rules\">\n {stage.rules.length} {stage.rules.length === 1 ? 'rule' : 'rules'}\n </div>\n\n {/* Action label */}\n <div className=\"stage-action\" style={{ color }}>\n {actionLabel}\n </div>\n\n {/* Stats (if available) */}\n {stats && (\n <div className=\"stage-stats\">\n <div className=\"stat-row\">\n <span className=\"stat-label\">Input:</span>\n <span className=\"stat-value\">{stats.input_count}</span>\n </div>\n <div className=\"stat-row\">\n <span className=\"stat-label\">Matched:</span>\n <span className=\"stat-value text-green-600\">\n {stats.matched_count}\n </span>\n </div>\n {stats.excluded_count > 0 && (\n <div className=\"stat-row\">\n <span className=\"stat-label\">Excluded:</span>\n <span className=\"stat-value text-red-600\">\n {stats.excluded_count}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Description tooltip */}\n {stage.description && (\n <div className=\"stage-description\" title={stage.description}>\n {stage.description.length > 50\n ? `${stage.description.substring(0, 50)}...`\n : stage.description}\n </div>\n )}\n </div>\n\n {/* Output handle (bottom) - hidden for last stage */}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n style={{ background: color, opacity: 0 }}\n isConnectable={false}\n />\n </>\n );\n}\n","/**\n * FlowLegend Component\n *\n * Legend explaining the color coding of funnel stages.\n *\n * Design:\n * - Minimal, non-intrusive panel in bottom-right\n * - Color swatches with labels\n * - Collapsible to save space\n *\n * Colors:\n * - Blue: Continue to next stage\n * - Red: Exclude entities\n * - Yellow: Tag entities\n * - Green: Final output\n */\n\nimport React, { useState } from 'react';\nimport { Panel } from '@xyflow/react';\n\nexport function FlowLegend() {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const legendItems = [\n { color: '#3b82f6', label: 'Continue' },\n { color: '#ef4444', label: 'Exclude' },\n { color: '#eab308', label: 'Tag' },\n { color: '#22c55e', label: 'Output' },\n ];\n\n return (\n <Panel position=\"bottom-right\" className=\"flow-legend-panel\">\n <div className=\"flow-legend\">\n <button\n className=\"legend-toggle\"\n onClick={() => setIsExpanded(!isExpanded)}\n aria-label={isExpanded ? 'Collapse legend' : 'Expand legend'}\n >\n <span className=\"legend-title\">Legend</span>\n <svg\n className={`legend-chevron ${isExpanded ? 'expanded' : ''}`}\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {isExpanded && (\n <div className=\"legend-items\">\n {legendItems.map((item) => (\n <div key={item.label} className=\"legend-item\">\n <div\n className=\"legend-color\"\n style={{\n backgroundColor: item.color,\n border: `2px solid ${item.color}`,\n }}\n />\n <span className=\"legend-label\">{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </Panel>\n );\n}\n","/**\n * FunnelVisualFlow Component\n *\n * Interactive funnel visualization using React Flow.\n * Shows stages as nodes in a vertical flow with edges connecting them.\n *\n * Design Goals:\n * - Clear visual hierarchy of funnel stages\n * - Show entity counts and exclusions between stages\n * - Interactive - click stages for details, edges for excluded entities\n * - Auto-layout with vertical flow\n * - Color-coded by action type\n *\n * Visual Layout:\n * ```\n * ┌──────────────────────┐\n * │ ① High ICP Score │\n * │ 3 rules │\n * │ 500/1000 matched │\n * └──────────────────────┘\n * ↓ -500\n * ┌──────────────────────┐\n * │ ② Frontend Stack │\n * │ 2 rules │\n * │ 350/500 matched │\n * └──────────────────────┘\n * ```\n *\n * Node Colors (based on action):\n * - Continue: Blue\n * - Exclude: Red\n * - Tag: Yellow\n * - Output: Green\n *\n * Accessibility:\n * - Keyboard navigation via React Flow controls\n * - ARIA labels on interactive elements\n * - Color + text indicators (not color alone)\n *\n * Performance:\n * - Memoized node/edge calculations\n * - React Flow's built-in virtualization for large graphs\n * - CSS-only styling (no images)\n */\n\nimport React, { useMemo, useCallback } from 'react';\nimport {\n ReactFlow,\n Node,\n Edge,\n Controls,\n Background,\n BackgroundVariant,\n NodeTypes,\n useNodesState,\n useEdgesState,\n OnNodesChange,\n OnEdgesChange,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\n\nimport { Funnel, FunnelStage, FunnelRun } from '../../types';\nimport { StageNode } from './StageNode';\nimport { FlowLegend } from './FlowLegend';\nimport './FunnelVisualFlow.css';\n\nexport interface FunnelVisualFlowProps {\n /** Funnel definition */\n funnel: Funnel;\n\n /** Optional run data for showing counts */\n runData?: FunnelRun;\n\n /** Callback when stage node is clicked */\n onStageClick?: (stage: FunnelStage) => void;\n\n /** Callback when edge is clicked (fromStageId, toStageId) */\n onEdgeClick?: (fromStage: string, toStage: string) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Height of the flow container (default: 600px) */\n height?: number | string;\n}\n\n/**\n * Get excluded count between two stages\n */\nfunction getExcludedCount(\n runData: FunnelRun,\n fromStageId: string,\n toStageId: string\n): number {\n const fromStats = runData.stage_stats[fromStageId];\n const toStats = runData.stage_stats[toStageId];\n\n if (!fromStats || !toStats) return 0;\n\n // Calculate how many entities didn't continue to next stage\n return fromStats.continued_count - toStats.input_count;\n}\n\n/**\n * Generate circled numbers for stage indicators (①②③)\n */\nexport function getCircledNumber(num: number): string {\n const circledNumbers = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩'];\n return num <= 10 ? circledNumbers[num - 1] : `${num}`;\n}\n\nconst VERTICAL_SPACING = 180;\nconst HORIZONTAL_CENTER = 250;\n\nexport function FunnelVisualFlow({\n funnel,\n runData,\n onStageClick,\n onEdgeClick,\n className = '',\n height = 600,\n}: FunnelVisualFlowProps) {\n // Define custom node types\n const nodeTypes = useMemo(\n () => ({\n stageNode: StageNode,\n }),\n []\n );\n\n // Build nodes from funnel stages\n const initialNodes: Node[] = useMemo(() => {\n return funnel.stages.map((stage, index) => {\n const stats = runData?.stage_stats?.[stage.id];\n\n return {\n id: stage.id,\n type: 'stageNode',\n position: { x: HORIZONTAL_CENTER, y: index * VERTICAL_SPACING },\n data: {\n stage,\n stats,\n onStageClick,\n },\n };\n });\n }, [funnel.stages, runData, onStageClick]);\n\n // Build edges between stages\n const initialEdges: Edge[] = useMemo(() => {\n if (funnel.stages.length < 2) return [];\n\n return funnel.stages.slice(0, -1).map((stage, index) => {\n const nextStage = funnel.stages[index + 1];\n const excludedCount = runData\n ? getExcludedCount(runData, stage.id, nextStage.id)\n : undefined;\n\n return {\n id: `${stage.id}-${nextStage.id}`,\n source: stage.id,\n target: nextStage.id,\n label: excludedCount !== undefined ? `-${excludedCount}` : '',\n animated: true,\n style: { stroke: '#94a3b8', strokeWidth: 2 },\n labelStyle: { fill: '#ef4444', fontWeight: 600 },\n labelBgStyle: { fill: '#fef2f2', fillOpacity: 0.9 },\n };\n });\n }, [funnel.stages, runData]);\n\n const [nodes, , onNodesChange] = useNodesState(initialNodes);\n const [edges, , onEdgesChange] = useEdgesState(initialEdges);\n\n // Handle edge clicks\n const handleEdgeClick = useCallback(\n (event: React.MouseEvent, edge: Edge) => {\n if (onEdgeClick) {\n onEdgeClick(edge.source, edge.target);\n }\n },\n [onEdgeClick]\n );\n\n // Empty state\n if (funnel.stages.length === 0) {\n return (\n <div\n className={`funnel-visual-flow-empty ${className}`}\n style={{ height }}\n >\n <div className=\"empty-state\">\n <p className=\"text-gray-500 text-sm\">No stages to visualize</p>\n <p className=\"text-gray-400 text-xs mt-1\">\n Add stages to see the funnel flow\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`funnel-visual-flow ${className}`} style={{ height }}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onEdgeClick={handleEdgeClick}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{\n padding: 0.2,\n includeHiddenNodes: false,\n }}\n minZoom={0.5}\n maxZoom={1.5}\n defaultViewport={{ x: 0, y: 0, zoom: 1 }}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={true}\n >\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n <Controls showInteractive={false} />\n <FlowLegend />\n </ReactFlow>\n </div>\n );\n}\n","/**\n * LogicToggle Component\n *\n * Toggle between AND/OR filter logic.\n *\n * Design Goal:\n * Users need to switch between requiring all rules to match (AND)\n * or any rule to match (OR).\n *\n * Visual Hierarchy Rationale:\n * - Radio button pattern is familiar and clearly shows mutually exclusive options\n * - Horizontal layout keeps it compact\n * - Blue accent color indicates selected state\n * - Label explains the logic clearly\n *\n * Interaction Notes:\n * - Click either option to change logic\n * - Visual feedback on hover and focus\n * - Keyboard accessible (Tab to focus, Arrow keys to change)\n */\n\nimport { FilterLogic } from '../../types';\n\ninterface LogicToggleProps {\n logic: FilterLogic;\n onChange: (logic: FilterLogic) => void;\n className?: string;\n}\n\nexport function LogicToggle({ logic, onChange, className = '' }: LogicToggleProps) {\n return (\n <div className={`flex items-center gap-4 ${className}`}>\n <span className=\"text-sm font-medium text-gray-700\">Logic:</span>\n\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"filter-logic\"\n value=\"AND\"\n checked={logic === 'AND'}\n onChange={(e) => onChange(e.target.value as FilterLogic)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">\n AND <span className=\"text-xs text-gray-500\">(all must match)</span>\n </span>\n </label>\n\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"filter-logic\"\n value=\"OR\"\n checked={logic === 'OR'}\n onChange={(e) => onChange(e.target.value as FilterLogic)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">\n OR <span className=\"text-xs text-gray-500\">(any can match)</span>\n </span>\n </label>\n </div>\n );\n}\n","/**\n * FieldSelector Component\n *\n * Dropdown for selecting a field from the field registry, grouped by category.\n *\n * Design Goal:\n * Users need to select from potentially dozens of fields. Grouping by category\n * (Profile, Investment, Metrics, etc.) makes fields easier to find.\n *\n * Visual Hierarchy Rationale:\n * - Categories shown with indentation for visual hierarchy\n * - Field names indented under categories\n * - Selected field shown in dropdown button\n * - Full-width for consistency with other inputs\n *\n * Interaction Notes:\n * - Click to open dropdown\n * - Category labels are not selectable (disabled options)\n * - Field selection updates the rule\n * - Keyboard navigation supported\n *\n * Responsive Behavior:\n * - Full width on all screen sizes\n * - Dropdown scrolls if too many options\n *\n * Accessibility Considerations:\n * - Proper label association\n * - Category grouping preserved in select\n * - Focus visible on keyboard navigation\n */\n\nimport { FieldDefinition } from '../../types';\n\ninterface FieldSelectorProps {\n fields: FieldDefinition[];\n value: string;\n onChange: (fieldName: string) => void;\n error?: string;\n className?: string;\n}\n\nexport function FieldSelector({\n fields,\n value,\n onChange,\n error,\n className = '',\n}: FieldSelectorProps) {\n // Group fields by category\n const grouped = fields.reduce((acc, field) => {\n const category = field.category || 'Other';\n if (!acc[category]) {\n acc[category] = [];\n }\n acc[category].push(field);\n return acc;\n }, {} as Record<string, FieldDefinition[]>);\n\n const categories = Object.keys(grouped).sort();\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"field-selector\" className=\"text-xs font-medium text-gray-700\">\n Field\n </label>\n <select\n id=\"field-selector\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">Select a field...</option>\n {categories.map((category) => (\n <optgroup key={category} label={category}>\n {grouped[category].map((field) => (\n <option key={field.name} value={field.name}>\n {field.label}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * FilterRuleEditor Constants\n *\n * Operator labels and field type mappings\n */\n\nimport { Operator } from '../../types';\n\nexport const OPERATOR_LABELS: Record<Operator, string> = {\n // Equality\n eq: 'equals',\n ne: 'not equals',\n\n // Comparison\n gt: 'greater than',\n lt: 'less than',\n gte: 'greater or equal',\n lte: 'less or equal',\n\n // String operations\n contains: 'contains',\n not_contains: 'does not contain',\n startswith: 'starts with',\n endswith: 'ends with',\n matches: 'matches regex',\n\n // Array/Set operations\n in: 'is one of',\n not_in: 'is not one of',\n has_any: 'has any of',\n has_all: 'has all of',\n\n // Null checks\n isnull: 'is empty',\n isnotnull: 'is not empty',\n\n // Tag operations\n has_tag: 'has tag',\n not_has_tag: 'does not have tag',\n\n // Boolean\n is_true: 'is true',\n is_false: 'is false',\n};\n\n/**\n * Operators that don't require a value input\n */\nexport const NULL_VALUE_OPERATORS: Operator[] = [\n 'isnull',\n 'isnotnull',\n 'is_true',\n 'is_false',\n];\n\n/**\n * Operators that require array/multi-value input\n */\nexport const MULTI_VALUE_OPERATORS: Operator[] = [\n 'in',\n 'not_in',\n 'has_any',\n 'has_all',\n];\n","/**\n * OperatorSelector Component\n *\n * Dropdown for selecting an operator, filtered by field type.\n *\n * Design Goal:\n * Show only valid operators for the selected field type. For example,\n * numeric fields show comparison operators (>, <, >=, <=) while string\n * fields show text operators (contains, starts with, etc.).\n *\n * Visual Hierarchy Rationale:\n * - Labeled clearly as \"Operator\"\n * - Human-readable labels (not technical symbols)\n * - Full-width for alignment with other inputs\n *\n * Interaction Notes:\n * - Only enabled when field is selected\n * - Shows operators valid for current field type\n * - Resets to first valid operator when field changes\n *\n * Accessibility Considerations:\n * - Disabled state clearly indicated\n * - Proper label association\n * - Focus visible on keyboard navigation\n */\n\nimport { Operator, FieldDefinition } from '../../types';\nimport { OPERATOR_LABELS } from './constants';\n\ninterface OperatorSelectorProps {\n operators: Operator[];\n value: Operator | '';\n onChange: (operator: Operator) => void;\n disabled?: boolean;\n error?: string;\n className?: string;\n}\n\nexport function OperatorSelector({\n operators,\n value,\n onChange,\n disabled = false,\n error,\n className = '',\n}: OperatorSelectorProps) {\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"operator-selector\" className=\"text-xs font-medium text-gray-700\">\n Operator\n </label>\n <select\n id=\"operator-selector\"\n value={value}\n onChange={(e) => onChange(e.target.value as Operator)}\n disabled={disabled}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n disabled:bg-gray-100 disabled:cursor-not-allowed disabled:text-gray-500\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">Select operator...</option>\n {operators.map((op) => (\n <option key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </option>\n ))}\n </select>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * TextValueInput Component\n *\n * Text input for string values.\n *\n * Design Goal:\n * Simple text entry for string comparisons (contains, equals, etc.).\n *\n * Visual Hierarchy Rationale:\n * - Standard text input styling\n * - Placeholder text provides context\n * - Error state clearly indicated with red border\n */\n\ninterface TextValueInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function TextValueInput({\n value,\n onChange,\n placeholder = 'Enter text...',\n error,\n className = '',\n}: TextValueInputProps) {\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"text-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <input\n id=\"text-value\"\n type=\"text\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n />\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * NumberValueInput Component\n *\n * Numeric input for number comparisons.\n *\n * Design Goal:\n * Precise number entry with validation for numeric fields.\n *\n * Visual Hierarchy Rationale:\n * - Standard number input with browser controls\n * - Constraints (min/max) applied if provided\n * - Error state clearly indicated\n *\n * Interaction Notes:\n * - Arrow keys increment/decrement\n * - Scroll wheel adjusts value (browser default)\n * - Respects min/max constraints\n */\n\ninterface NumberValueInputProps {\n value: number | null;\n onChange: (value: number | null) => void;\n min?: number;\n max?: number;\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function NumberValueInput({\n value,\n onChange,\n min,\n max,\n placeholder = 'Enter number...',\n error,\n className = '',\n}: NumberValueInputProps) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n if (val === '') {\n onChange(null);\n } else {\n const num = parseFloat(val);\n if (!isNaN(num)) {\n onChange(num);\n }\n }\n };\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"number-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <input\n id=\"number-value\"\n type=\"number\"\n value={value ?? ''}\n onChange={handleChange}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n />\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * DateValueInput Component\n *\n * Date input for date comparisons.\n *\n * Design Goal:\n * Intuitive date selection with browser-native date picker.\n *\n * Visual Hierarchy Rationale:\n * - Native date input for familiar UX\n * - Calendar picker on click (browser default)\n * - ISO date format for consistency\n *\n * Interaction Notes:\n * - Click to open calendar picker\n * - Keyboard entry also supported (YYYY-MM-DD)\n * - Respects min/max constraints\n *\n * Accessibility Considerations:\n * - Native date input is screen reader friendly\n * - Keyboard navigation supported\n */\n\ninterface DateValueInputProps {\n value: string | null;\n onChange: (value: string | null) => void;\n min?: string;\n max?: string;\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function DateValueInput({\n value,\n onChange,\n min,\n max,\n placeholder = 'Select date...',\n error,\n className = '',\n}: DateValueInputProps) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n onChange(val || null);\n };\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"date-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <input\n id=\"date-value\"\n type=\"date\"\n value={value || ''}\n onChange={handleChange}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n />\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * BooleanValueInput Component\n *\n * Checkbox input for boolean values.\n *\n * Design Goal:\n * Simple true/false toggle for boolean fields.\n *\n * Visual Hierarchy Rationale:\n * - Checkbox with clear label\n * - Aligned with other value inputs\n * - Checked state visually distinct\n *\n * Interaction Notes:\n * - Click checkbox or label to toggle\n * - Space bar toggles when focused\n *\n * Accessibility Considerations:\n * - Proper label association\n * - Keyboard accessible\n * - Focus visible\n */\n\ninterface BooleanValueInputProps {\n value: boolean;\n onChange: (value: boolean) => void;\n label?: string;\n error?: string;\n className?: string;\n}\n\nexport function BooleanValueInput({\n value,\n onChange,\n label = 'True',\n error,\n className = '',\n}: BooleanValueInputProps) {\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label className=\"text-xs font-medium text-gray-700\">Value</label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => onChange(e.target.checked)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">{label}</span>\n </label>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * ChoiceValueInput Component\n *\n * Single-select dropdown for choice fields.\n *\n * Design Goal:\n * Select a single value from predefined choices (e.g., firm stage, recipe cuisine).\n *\n * Visual Hierarchy Rationale:\n * - Standard select dropdown\n * - Choices provided by field definition\n * - Clear placeholder when nothing selected\n *\n * Interaction Notes:\n * - Click to open dropdown\n * - Keyboard navigation supported\n * - Selected value shown in dropdown\n *\n * Accessibility Considerations:\n * - Proper label association\n * - Keyboard navigation (arrow keys)\n * - Focus visible\n */\n\ninterface ChoiceValueInputProps {\n value: string;\n onChange: (value: string) => void;\n choices: any[];\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function ChoiceValueInput({\n value,\n onChange,\n choices,\n placeholder = 'Select option...',\n error,\n className = '',\n}: ChoiceValueInputProps) {\n // Handle both string arrays and {value, label} arrays\n const getChoiceValue = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.value || choice;\n };\n\n const getChoiceLabel = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.label || choice.value || String(choice);\n };\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"choice-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <select\n id=\"choice-value\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">{placeholder}</option>\n {choices.map((choice, index) => {\n const val = getChoiceValue(choice);\n const label = getChoiceLabel(choice);\n return (\n <option key={`${val}-${index}`} value={val}>\n {label}\n </option>\n );\n })}\n </select>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * MultiChoiceValueInput Component\n *\n * Multi-select for choosing multiple values from choices.\n *\n * Design Goal:\n * Select multiple values for 'in', 'has_any', 'has_all' operators.\n * For example: \"Firm stage is one of [Series A, Series B, Series C]\".\n *\n * Visual Hierarchy Rationale:\n * - Tag-based interface shows selected values as pills\n * - Each tag has an X button to remove\n * - Dropdown allows adding more selections\n * - Compact layout for multiple values\n *\n * Interaction Notes:\n * - Select from dropdown to add value\n * - Click X on tag to remove value\n * - Can select multiple values\n * - Already-selected values hidden from dropdown\n *\n * Accessibility Considerations:\n * - Keyboard navigation for dropdown\n * - Focus management for tag removal\n * - Screen reader announces selected items\n */\n\ninterface MultiChoiceValueInputProps {\n value: string[];\n onChange: (value: string[]) => void;\n choices: any[];\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function MultiChoiceValueInput({\n value = [],\n onChange,\n choices,\n placeholder = 'Select options...',\n error,\n className = '',\n}: MultiChoiceValueInputProps) {\n // Handle both string arrays and {value, label} arrays\n const getChoiceValue = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.value || choice;\n };\n\n const getChoiceLabel = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.label || choice.value || String(choice);\n };\n\n const handleAdd = (newValue: string) => {\n if (newValue && !value.includes(newValue)) {\n onChange([...value, newValue]);\n }\n };\n\n const handleRemove = (removeValue: string) => {\n onChange(value.filter((v) => v !== removeValue));\n };\n\n // Get label for a selected value\n const getValueLabel = (val: string): string => {\n const choice = choices.find((c) => getChoiceValue(c) === val);\n return choice ? getChoiceLabel(choice) : val;\n };\n\n // Filter out already-selected values from dropdown\n const availableChoices = choices.filter(\n (choice) => !value.includes(getChoiceValue(choice))\n );\n\n return (\n <div className={`flex flex-col gap-2 ${className}`}>\n <label htmlFor=\"multi-choice-value\" className=\"text-xs font-medium text-gray-700\">\n Values\n </label>\n\n {/* Selected tags */}\n {value.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {value.map((val) => (\n <span\n key={val}\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-blue-800 bg-blue-100 rounded\"\n >\n {getValueLabel(val)}\n <button\n type=\"button\"\n onClick={() => handleRemove(val)}\n className=\"hover:text-blue-900 focus:outline-none\"\n aria-label={`Remove ${getValueLabel(val)}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {/* Dropdown to add more */}\n <select\n id=\"multi-choice-value\"\n value=\"\"\n onChange={(e) => handleAdd(e.target.value)}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">{placeholder}</option>\n {availableChoices.map((choice, index) => {\n const val = getChoiceValue(choice);\n const label = getChoiceLabel(choice);\n return (\n <option key={`${val}-${index}`} value={val}>\n {label}\n </option>\n );\n })}\n </select>\n\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * RuleRow Component\n *\n * A single filter rule row with field, operator, and value inputs.\n *\n * Design Goal:\n * Users need to configure a complete filter rule: which field to check,\n * what comparison to make, and what value to compare against.\n *\n * Visual Hierarchy Rationale:\n * - Horizontal layout on desktop (3 columns + delete button)\n * - Responsive: stacks vertically on mobile\n * - Delete button (X) aligned to right for easy removal\n * - Border and padding create visual grouping\n * - Slight shadow on hover indicates interactivity\n *\n * Component Specification:\n * - Field selector: Full field registry, grouped by category\n * - Operator selector: Filtered by selected field type\n * - Value input: Dynamic based on field type + operator\n * - Delete button: Removes this rule\n *\n * Interaction Notes:\n * - Selecting field updates available operators\n * - Selecting field/operator changes value input type\n * - Operators that don't need values (isnull, is_true) hide value input\n * - Delete button shows on hover (desktop) or always (mobile)\n *\n * Responsive Behavior:\n * - Desktop (lg+): 3-column grid with delete button\n * - Tablet (md): 2-column grid\n * - Mobile: Stacked vertically\n *\n * Accessibility Considerations:\n * - All inputs properly labeled\n * - Delete button has aria-label\n * - Keyboard navigation supported\n * - Focus management when adding/removing rules\n */\n\nimport { FilterRule, FieldDefinition, Operator } from '../../types';\nimport { FieldSelector } from './FieldSelector';\nimport { OperatorSelector } from './OperatorSelector';\nimport { NULL_VALUE_OPERATORS, MULTI_VALUE_OPERATORS } from './constants';\nimport {\n TextValueInput,\n NumberValueInput,\n DateValueInput,\n BooleanValueInput,\n ChoiceValueInput,\n MultiChoiceValueInput,\n} from './ValueInputs';\n\ninterface RuleRowProps {\n rule: FilterRule;\n onChange: (rule: FilterRule) => void;\n onRemove: () => void;\n fieldRegistry: FieldDefinition[];\n className?: string;\n}\n\nexport function RuleRow({\n rule,\n onChange,\n onRemove,\n fieldRegistry,\n className = '',\n}: RuleRowProps) {\n // Find the selected field definition\n const selectedField = fieldRegistry.find((f) => f.name === rule.field_path);\n\n // Get valid operators for the selected field\n const availableOperators = selectedField?.operators || [];\n\n // Determine if value input is needed\n const needsValue = rule.operator && !NULL_VALUE_OPERATORS.includes(rule.operator);\n const needsMultiValue =\n rule.operator && MULTI_VALUE_OPERATORS.includes(rule.operator);\n\n // Handle field change\n const handleFieldChange = (fieldName: string) => {\n const field = fieldRegistry.find((f) => f.name === fieldName);\n onChange({\n ...rule,\n field_path: fieldName,\n operator: field?.operators[0] || ('' as Operator),\n value: null,\n });\n };\n\n // Handle operator change\n const handleOperatorChange = (operator: Operator) => {\n onChange({\n ...rule,\n operator,\n value: MULTI_VALUE_OPERATORS.includes(operator) ? [] : null,\n });\n };\n\n // Handle value change\n const handleValueChange = (value: any) => {\n onChange({\n ...rule,\n value,\n });\n };\n\n // Render the appropriate value input based on field type and operator\n const renderValueInput = () => {\n if (!needsValue) return null;\n if (!selectedField) return null;\n\n const { type, constraints } = selectedField;\n\n // Multi-value operators\n if (needsMultiValue) {\n if (constraints?.choices) {\n return (\n <MultiChoiceValueInput\n value={Array.isArray(rule.value) ? rule.value : []}\n onChange={handleValueChange}\n choices={constraints.choices}\n />\n );\n }\n // Fallback: text input with comma-separated values\n return (\n <TextValueInput\n value={Array.isArray(rule.value) ? rule.value.join(', ') : ''}\n onChange={(val) => handleValueChange(val.split(',').map((v) => v.trim()))}\n placeholder=\"Enter values, comma-separated...\"\n />\n );\n }\n\n // Single-value operators\n switch (type) {\n case 'string':\n if (constraints?.choices && rule.operator === 'eq') {\n return (\n <ChoiceValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n choices={constraints.choices}\n />\n );\n }\n return (\n <TextValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n />\n );\n\n case 'number':\n return (\n <NumberValueInput\n value={rule.value}\n onChange={handleValueChange}\n min={constraints?.min_value as number}\n max={constraints?.max_value as number}\n />\n );\n\n case 'date':\n return (\n <DateValueInput\n value={rule.value || null}\n onChange={handleValueChange}\n min={constraints?.min_value as string}\n max={constraints?.max_value as string}\n />\n );\n\n case 'boolean':\n return (\n <BooleanValueInput\n value={rule.value || false}\n onChange={handleValueChange}\n />\n );\n\n case 'tag':\n return (\n <TextValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n placeholder=\"Enter tag name...\"\n />\n );\n\n default:\n return (\n <TextValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n />\n );\n }\n };\n\n return (\n <div\n className={`\n relative group\n border border-gray-200 rounded-lg p-4\n bg-white hover:shadow-sm transition-shadow\n ${className}\n `}\n >\n {/* Delete button */}\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"\n absolute top-2 right-2\n w-6 h-6 flex items-center justify-center\n text-gray-400 hover:text-red-600 hover:bg-red-50\n rounded transition-colors\n focus:outline-none focus:ring-2 focus:ring-red-500\n \"\n aria-label=\"Remove rule\"\n >\n ×\n </button>\n\n {/* Grid layout: Field | Operator | Value */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 pr-8\">\n <FieldSelector\n fields={fieldRegistry}\n value={rule.field_path}\n onChange={handleFieldChange}\n />\n\n <OperatorSelector\n operators={availableOperators}\n value={rule.operator || ''}\n onChange={handleOperatorChange}\n disabled={!rule.field_path}\n />\n\n {needsValue && renderValueInput()}\n </div>\n </div>\n );\n}\n","/**\n * @startsimpli/funnels - BRUTALLY GENERIC Funnel Type System\n *\n * This type system works for ANY entity type:\n * - Investors, firms, contacts, organizations\n * - Recipes, ingredients, users\n * - Leads, tasks, projects\n * - GitHub repos, pull requests, issues\n *\n * Zero domain-specific types. All filtering is based on field paths and operators.\n */\n\n// ============================================================================\n// Core Operators\n// ============================================================================\n\n/**\n * Filter operators - works with any data type\n */\nexport type Operator =\n // Equality\n | 'eq' // Equal to\n | 'ne' // Not equal to\n\n // Comparison (numbers, dates, strings)\n | 'gt' // Greater than\n | 'lt' // Less than\n | 'gte' // Greater than or equal\n | 'lte' // Less than or equal\n\n // String operations\n | 'contains' // String contains substring\n | 'not_contains' // String does not contain substring\n | 'startswith' // String starts with\n | 'endswith' // String ends with\n | 'matches' // Regex match\n\n // Array/Set operations\n | 'in' // Value is in array\n | 'not_in' // Value is not in array\n | 'has_any' // Array has any of these values\n | 'has_all' // Array has all of these values\n\n // Null checks\n | 'isnull' // Field is null/undefined\n | 'isnotnull' // Field is not null/undefined\n\n // Tag operations\n | 'has_tag' // Entity has tag\n | 'not_has_tag' // Entity does not have tag\n\n // Boolean\n | 'is_true' // Boolean is true\n | 'is_false'; // Boolean is false\n\n/**\n * Field data types - for operator validation\n */\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'date'\n | 'array'\n | 'object'\n | 'tag'\n | 'any';\n\n// ============================================================================\n// Filter Rules\n// ============================================================================\n\n/**\n * A single filter rule\n *\n * Examples:\n * - { field_path: 'firm.stage', operator: 'eq', value: 'Series A' }\n * - { field_path: 'recipe.cuisine', operator: 'in', value: ['Italian', 'French'] }\n * - { field_path: 'contact.email', operator: 'isnotnull', value: null }\n * - { field_path: 'organization.tags', operator: 'has_tag', value: 'enterprise' }\n */\nexport interface FilterRule {\n /**\n * Dot-notation path to field\n * Examples: 'name', 'firm.stage', 'profile.linkedin_url', 'tags', 'metrics.arr_usd'\n */\n field_path: string;\n\n /** Comparison operator */\n operator: Operator;\n\n /**\n * Value to compare against\n * Type depends on operator:\n * - eq/ne/gt/lt/gte/lte: any primitive\n * - contains/startswith/endswith: string\n * - in/not_in: array\n * - isnull/isnotnull: null (value ignored)\n * - has_tag/not_has_tag: string (tag name)\n */\n value: any;\n\n /**\n * Optional: negate the rule result\n * Default: false\n */\n negate?: boolean;\n}\n\n/**\n * Filter logic for combining rules\n */\nexport type FilterLogic = 'AND' | 'OR';\n\n/**\n * Action to take when stage rules match\n */\nexport type MatchAction =\n | 'continue' // Continue to next stage\n | 'tag' // Add tags and stop processing\n | 'tag_continue' // Add tags and continue to next stage\n | 'output'; // Add to output and stop processing\n\n/**\n * Action to take when stage rules don't match\n */\nexport type NoMatchAction =\n | 'continue' // Continue to next stage\n | 'exclude' // Exclude from output and stop processing\n | 'tag_exclude'; // Add tags, exclude from output, stop processing\n\n// ============================================================================\n// Funnel Stages\n// ============================================================================\n\n/**\n * A single stage in a funnel\n *\n * Generic over entity type TEntity\n */\nexport interface FunnelStage<TEntity = any> {\n /** Unique stage identifier */\n id: string;\n\n /** Stage execution order (0-indexed) */\n order: number;\n\n /** Human-readable stage name */\n name: string;\n\n /** Optional description */\n description?: string;\n\n /**\n * How to combine filter rules\n * - AND: All rules must match\n * - OR: At least one rule must match\n */\n filter_logic: FilterLogic;\n\n /** Filter rules to evaluate */\n rules: FilterRule[];\n\n /** Action when rules match */\n match_action: MatchAction;\n\n /** Action when rules don't match */\n no_match_action: NoMatchAction;\n\n /** Tags to add when rules match */\n match_tags?: string[];\n\n /** Tags to add when rules don't match */\n no_match_tags?: string[];\n\n /**\n * Context to add to entity when rules match\n * Can be used to track why entity matched\n * Examples:\n * - { stage: 'qualified_leads', reason: 'high_fit_score' }\n * - { tier: 'premium', discount: 0.2 }\n */\n match_context?: Record<string, any>;\n\n /**\n * Optional: Custom evaluation function\n * For complex logic that can't be expressed with rules\n */\n custom_evaluator?: (entity: TEntity) => boolean;\n}\n\n// ============================================================================\n// Funnel Definition\n// ============================================================================\n\n/**\n * Funnel status\n */\nexport type FunnelStatus = 'draft' | 'active' | 'paused' | 'archived';\n\n/**\n * Input entity types\n */\nexport type InputType = 'contacts' | 'organizations' | 'both' | 'any';\n\n/**\n * A complete funnel definition\n *\n * Generic over entity type TEntity\n */\nexport interface Funnel<TEntity = any> {\n /** Unique funnel identifier */\n id: string;\n\n /** Human-readable funnel name */\n name: string;\n\n /** Optional description */\n description?: string;\n\n /** Funnel status */\n status: FunnelStatus;\n\n /**\n * Type of entities this funnel processes\n * Used for field registry lookup\n */\n input_type: InputType;\n\n /** Ordered stages */\n stages: FunnelStage<TEntity>[];\n\n /** Created timestamp */\n created_at: Date | string;\n\n /** Last updated timestamp */\n updated_at: Date | string;\n\n /** Owner user ID */\n owner_id?: string;\n\n /** Team/company ID for multi-tenancy */\n team_id?: string;\n\n /**\n * Optional: Tags to automatically add to all entities\n * that complete the funnel\n */\n completion_tags?: string[];\n\n /**\n * Optional: Metadata for custom integrations\n */\n metadata?: Record<string, any>;\n}\n\n// ============================================================================\n// Funnel Execution\n// ============================================================================\n\n/**\n * Funnel run status\n */\nexport type FunnelRunStatus =\n | 'pending' // Queued, not started\n | 'running' // Currently executing\n | 'completed' // Finished successfully\n | 'failed' // Error occurred\n | 'cancelled'; // Manually stopped\n\n/**\n * How the funnel run was triggered\n */\nexport type TriggerType =\n | 'manual' // User initiated\n | 'scheduled' // Cron/scheduled run\n | 'webhook' // External event\n | 'api'; // API call\n\n/**\n * Statistics for a single stage execution\n */\nexport interface StageStats {\n /** Stage ID */\n stage_id: string;\n\n /** Stage name */\n stage_name: string;\n\n /** Entities that entered this stage */\n input_count: number;\n\n /** Entities that matched rules */\n matched_count: number;\n\n /** Entities that didn't match rules */\n not_matched_count: number;\n\n /** Entities excluded at this stage */\n excluded_count: number;\n\n /** Entities tagged at this stage */\n tagged_count: number;\n\n /** Entities that continued to next stage */\n continued_count: number;\n\n /** Execution time in milliseconds */\n duration_ms?: number;\n\n /** Error count */\n error_count?: number;\n}\n\n/**\n * A funnel execution run\n */\nexport interface FunnelRun {\n /** Unique run identifier */\n id: string;\n\n /** Funnel ID */\n funnel_id: string;\n\n /** Funnel snapshot (copy of funnel at run time) */\n funnel?: Funnel;\n\n /** Run status */\n status: FunnelRunStatus;\n\n /** How run was triggered */\n trigger_type: TriggerType;\n\n /** User who triggered (if manual) */\n triggered_by?: string;\n\n /** Started timestamp */\n started_at: Date | string;\n\n /** Completed timestamp */\n completed_at?: Date | string;\n\n /** Duration in milliseconds */\n duration_ms?: number;\n\n /** Total entities input */\n total_input: number;\n\n /** Total entities matched (in output) */\n total_matched: number;\n\n /** Total entities excluded */\n total_excluded: number;\n\n /** Total entities tagged */\n total_tagged: number;\n\n /** Per-stage statistics */\n stage_stats: Record<string, StageStats>;\n\n /** Error message (if failed) */\n error?: string;\n\n /** Stack trace (if failed) */\n stack_trace?: string;\n\n /** Metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Result for a single entity processed through funnel\n */\nexport interface FunnelResult<TEntity = any> {\n /** The entity that was processed */\n entity: TEntity;\n\n /** Whether entity matched and is in output */\n matched: boolean;\n\n /** Stage where entity was excluded (if excluded) */\n excluded_at_stage?: string;\n\n /** Tags accumulated during processing */\n accumulated_tags: string[];\n\n /** Context accumulated during processing */\n context: Record<string, any>;\n\n /** Stage-by-stage results */\n stage_results?: StageResult[];\n}\n\n/**\n * Result for a single stage evaluation\n */\nexport interface StageResult {\n /** Stage ID */\n stage_id: string;\n\n /** Stage name */\n stage_name: string;\n\n /** Whether rules matched */\n matched: boolean;\n\n /** Rule evaluation results */\n rule_results?: RuleResult[];\n\n /** Action taken */\n action: MatchAction | NoMatchAction;\n\n /** Tags added */\n tags_added?: string[];\n\n /** Context added */\n context_added?: Record<string, any>;\n\n /** Whether entity was excluded */\n excluded: boolean;\n\n /** Whether entity continued to next stage */\n continued: boolean;\n}\n\n/**\n * Result for a single rule evaluation\n */\nexport interface RuleResult {\n /** Rule field path */\n field_path: string;\n\n /** Rule operator */\n operator: Operator;\n\n /** Value compared against */\n value: any;\n\n /** Actual value from entity */\n actual_value: any;\n\n /** Whether rule matched */\n matched: boolean;\n\n /** Error (if evaluation failed) */\n error?: string;\n}\n\n// ============================================================================\n// Field Registry\n// ============================================================================\n\n/**\n * Valid operators for a field type\n */\nexport type ValidOperators = Operator[];\n\n/**\n * Field constraints\n */\nexport interface FieldConstraints {\n /** Minimum value (numbers, dates) */\n min_value?: number | string;\n\n /** Maximum value (numbers, dates) */\n max_value?: number | string;\n\n /** Allowed values (enums) */\n choices?: any[];\n\n /** Regex pattern */\n pattern?: string;\n\n /** Required field */\n required?: boolean;\n}\n\n/**\n * Field definition in registry\n *\n * Describes what fields are available for filtering\n * on a given entity type\n */\nexport interface FieldDefinition {\n /** Unique field identifier (dot-notation path) */\n name: string;\n\n /** Human-readable label */\n label: string;\n\n /** Field data type */\n type: FieldType;\n\n /** Valid operators for this field */\n operators: ValidOperators;\n\n /** Field category (for UI grouping) */\n category?: string;\n\n /** Optional description */\n description?: string;\n\n /** Field constraints */\n constraints?: FieldConstraints;\n\n /** Whether field is sortable */\n sortable?: boolean;\n\n /** Whether field is searchable */\n searchable?: boolean;\n\n /** Example values (for UI help) */\n examples?: any[];\n\n /** Related fields (for UI suggestions) */\n related_fields?: string[];\n}\n\n/**\n * Field registry for an entity type\n *\n * Maps field paths to their definitions\n */\nexport interface FieldRegistry {\n /** Entity type this registry is for */\n entity_type: string;\n\n /** Available fields */\n fields: FieldDefinition[];\n\n /** Field lookup by name */\n field_map?: Map<string, FieldDefinition>;\n\n /** Categories (for UI grouping) */\n categories?: string[];\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Filter configuration (rules + logic)\n */\nexport interface FilterConfig {\n logic: FilterLogic;\n rules: FilterRule[];\n}\n\n/**\n * Partial type helper\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Extract field paths from object type\n * Helper for type-safe field path completion\n */\nexport type FieldPath<T, Prefix extends string = ''> = {\n [K in keyof T]: T[K] extends object\n ? K extends string\n ? `${Prefix}${K}` | FieldPath<T[K], `${Prefix}${K}.`>\n : never\n : K extends string\n ? `${Prefix}${K}`\n : never;\n}[keyof T];\n\n/**\n * Funnel creation input (omits auto-generated fields)\n */\nexport type CreateFunnelInput<TEntity = any> = Omit<\n Funnel<TEntity>,\n 'id' | 'created_at' | 'updated_at'\n>;\n\n/**\n * Funnel update input (all fields optional except id)\n */\nexport type UpdateFunnelInput<TEntity = any> = DeepPartial<Funnel<TEntity>> & {\n id: string;\n};\n\n/**\n * Stage creation input\n */\nexport type CreateStageInput<TEntity = any> = Omit<FunnelStage<TEntity>, 'id'>;\n\n/**\n * Stage update input\n */\nexport type UpdateStageInput<TEntity = any> = DeepPartial<FunnelStage<TEntity>> & {\n id: string;\n};\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard: is value a valid Funnel?\n */\nexport function isFunnel<TEntity = any>(value: unknown): value is Funnel<TEntity> {\n const f = value as Funnel<TEntity>;\n return (\n typeof f === 'object' &&\n f !== null &&\n typeof f.id === 'string' &&\n typeof f.name === 'string' &&\n ['draft', 'active', 'paused', 'archived'].includes(f.status) &&\n Array.isArray(f.stages)\n );\n}\n\n/**\n * Type guard: is value a valid FunnelStage?\n */\nexport function isStage<TEntity = any>(value: unknown): value is FunnelStage<TEntity> {\n const s = value as FunnelStage<TEntity>;\n return (\n typeof s === 'object' &&\n s !== null &&\n typeof s.id === 'string' &&\n typeof s.name === 'string' &&\n typeof s.order === 'number' &&\n ['AND', 'OR'].includes(s.filter_logic) &&\n Array.isArray(s.rules)\n );\n}\n\n/**\n * Type guard: is value a valid FilterRule?\n */\nexport function isFilterRule(value: unknown): value is FilterRule {\n const r = value as FilterRule;\n return (\n typeof r === 'object' &&\n r !== null &&\n typeof r.field_path === 'string' &&\n typeof r.operator === 'string' &&\n r.value !== undefined\n );\n}\n\n/**\n * Type guard: is value a valid FunnelRun?\n */\nexport function isFunnelRun(value: unknown): value is FunnelRun {\n const r = value as FunnelRun;\n return (\n typeof r === 'object' &&\n r !== null &&\n typeof r.id === 'string' &&\n typeof r.funnel_id === 'string' &&\n ['pending', 'running', 'completed', 'failed', 'cancelled'].includes(r.status)\n );\n}\n\n/**\n * Type guard: is value a valid FunnelResult?\n */\nexport function isFunnelResult<TEntity = any>(\n value: unknown\n): value is FunnelResult<TEntity> {\n const r = value as FunnelResult<TEntity>;\n return (\n typeof r === 'object' &&\n r !== null &&\n r.entity !== undefined &&\n typeof r.matched === 'boolean' &&\n Array.isArray(r.accumulated_tags)\n );\n}\n\n/**\n * Type guard: is value a valid FieldDefinition?\n */\nexport function isFieldDefinition(value: unknown): value is FieldDefinition {\n const f = value as FieldDefinition;\n return (\n typeof f === 'object' &&\n f !== null &&\n typeof f.name === 'string' &&\n typeof f.label === 'string' &&\n typeof f.type === 'string' &&\n Array.isArray(f.operators)\n );\n}\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Get valid operators for a field type\n */\nexport function getValidOperators(fieldType: FieldType): ValidOperators {\n switch (fieldType) {\n case 'string':\n return [\n 'eq', 'ne', 'contains', 'not_contains', 'startswith', 'endswith',\n 'matches', 'in', 'not_in', 'isnull', 'isnotnull'\n ];\n\n case 'number':\n return [\n 'eq', 'ne', 'gt', 'lt', 'gte', 'lte',\n 'in', 'not_in', 'isnull', 'isnotnull'\n ];\n\n case 'boolean':\n return ['eq', 'ne', 'is_true', 'is_false', 'isnull', 'isnotnull'];\n\n case 'date':\n return [\n 'eq', 'ne', 'gt', 'lt', 'gte', 'lte',\n 'isnull', 'isnotnull'\n ];\n\n case 'array':\n return [\n 'in', 'not_in', 'has_any', 'has_all',\n 'isnull', 'isnotnull'\n ];\n\n case 'tag':\n return ['has_tag', 'not_has_tag'];\n\n case 'object':\n return ['isnull', 'isnotnull'];\n\n case 'any':\n default:\n return [\n 'eq', 'ne', 'gt', 'lt', 'gte', 'lte',\n 'contains', 'not_contains', 'startswith', 'endswith',\n 'in', 'not_in', 'isnull', 'isnotnull'\n ];\n }\n}\n\n/**\n * Validate operator is allowed for field type\n */\nexport function isValidOperator(\n operator: Operator,\n fieldType: FieldType\n): boolean {\n const validOps = getValidOperators(fieldType);\n return validOps.includes(operator);\n}\n\n/**\n * Validate filter rule\n */\nexport function validateFilterRule(rule: FilterRule): string[] {\n const errors: string[] = [];\n\n if (!rule.field_path) {\n errors.push('field_path is required');\n }\n\n if (!rule.operator) {\n errors.push('operator is required');\n }\n\n // Value required for most operators\n const nullOps = ['isnull', 'isnotnull', 'is_true', 'is_false'];\n if (!nullOps.includes(rule.operator) && rule.value === undefined) {\n errors.push(`value is required for operator '${rule.operator}'`);\n }\n\n return errors;\n}\n\n/**\n * Validate funnel stage\n */\nexport function validateStage<TEntity = any>(\n stage: FunnelStage<TEntity>\n): string[] {\n const errors: string[] = [];\n\n if (!stage.name) {\n errors.push('name is required');\n }\n\n if (typeof stage.order !== 'number') {\n errors.push('order must be a number');\n }\n\n if (!['AND', 'OR'].includes(stage.filter_logic)) {\n errors.push('filter_logic must be AND or OR');\n }\n\n if (!Array.isArray(stage.rules)) {\n errors.push('rules must be an array');\n } else {\n stage.rules.forEach((rule, i) => {\n const ruleErrors = validateFilterRule(rule);\n ruleErrors.forEach(err => errors.push(`rules[${i}]: ${err}`));\n });\n }\n\n return errors;\n}\n\n/**\n * Validate funnel\n */\nexport function validateFunnel<TEntity = any>(\n funnel: Funnel<TEntity>\n): string[] {\n const errors: string[] = [];\n\n if (!funnel.name) {\n errors.push('name is required');\n }\n\n if (!['draft', 'active', 'paused', 'archived'].includes(funnel.status)) {\n errors.push('status must be draft, active, paused, or archived');\n }\n\n if (!Array.isArray(funnel.stages)) {\n errors.push('stages must be an array');\n } else {\n funnel.stages.forEach((stage, i) => {\n const stageErrors = validateStage(stage);\n stageErrors.forEach(err => errors.push(`stages[${i}]: ${err}`));\n });\n\n // Check stage order is sequential\n const orders = funnel.stages.map(s => s.order).sort((a, b) => a - b);\n const expectedOrders = Array.from({ length: orders.length }, (_, i) => i);\n if (JSON.stringify(orders) !== JSON.stringify(expectedOrders)) {\n errors.push('stage orders must be sequential starting from 0');\n }\n }\n\n return errors;\n}\n","/**\n * FilterRuleEditor Component\n *\n * Main component for creating and editing filter rules.\n *\n * Design Goal:\n * Users need to build complex filters by combining multiple rules with AND/OR logic.\n * This component provides a visual rule builder that dynamically adapts to any\n * entity type (investors, recipes, contacts, etc.) based on the field registry.\n *\n * Visual Hierarchy Rationale:\n * - Logic toggle at top sets the mode (AND/OR)\n * - Rules stacked vertically for clarity\n * - AND/OR connectors between rules reinforce the logic visually\n * - Add Rule button at bottom for progressive disclosure\n * - Empty state shown when no rules exist\n *\n * Component Specification:\n * - Logic toggle: Switch between AND/OR\n * - Rule rows: Each rule is a self-contained row\n * - Add button: Adds a new empty rule\n * - Remove button: Each rule has a delete button\n * - Validation: Real-time validation with error messages\n *\n * Interaction Notes:\n * - Users can add unlimited rules (within reason)\n * - Removing a rule updates immediately\n * - Logic toggle applies to all rules\n * - Each rule validates independently\n * - Focus management when adding/removing rules\n *\n * Responsive Behavior:\n * - Full width container\n * - Rule rows responsive (see RuleRow component)\n * - Add button full-width on mobile\n *\n * Accessibility Considerations:\n * - ARIA labels for controls\n * - Keyboard navigation throughout\n * - Focus management for add/remove actions\n * - Screen reader announces rule count\n * - Error messages associated with fields\n *\n * Design Handoff Notes:\n * - Uses Tailwind utility classes\n * - Border radius: rounded-lg (8px)\n * - Spacing: 4px units (gap-4, p-4)\n * - Colors: gray-{100-800}, blue-{500-600}, red-{500-600}\n * - Shadows: shadow-sm on hover\n * - Transitions: transition-all, duration-200\n */\n\nimport { FilterRule, FilterLogic, FieldDefinition } from '../../types';\nimport { LogicToggle } from './LogicToggle';\nimport { RuleRow } from './RuleRow';\nimport { validateFilterRule } from '../../types';\n\nexport interface FilterRuleEditorProps {\n /** Current filter rules */\n rules: FilterRule[];\n\n /** Callback when rules change */\n onChange: (rules: FilterRule[]) => void;\n\n /** Field registry for the entity type */\n fieldRegistry: FieldDefinition[];\n\n /** Filter logic (AND/OR) */\n logic?: FilterLogic;\n\n /** Callback when logic changes */\n onLogicChange?: (logic: FilterLogic) => void;\n\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function FilterRuleEditor({\n rules,\n onChange,\n fieldRegistry,\n logic = 'AND',\n onLogicChange,\n className = '',\n}: FilterRuleEditorProps) {\n // Add a new empty rule\n const handleAddRule = () => {\n const newRule: FilterRule = {\n field_path: '',\n operator: 'eq' as any,\n value: null,\n };\n onChange([...rules, newRule]);\n };\n\n // Update a specific rule\n const handleUpdateRule = (index: number, updatedRule: FilterRule) => {\n const newRules = [...rules];\n newRules[index] = updatedRule;\n onChange(newRules);\n };\n\n // Remove a specific rule\n const handleRemoveRule = (index: number) => {\n const newRules = rules.filter((_, i) => i !== index);\n onChange(newRules);\n };\n\n // Validate rules\n const ruleErrors = rules.map((rule) => validateFilterRule(rule));\n\n return (\n <div className={`flex flex-col gap-4 ${className}`}>\n {/* Logic toggle */}\n {onLogicChange && (\n <LogicToggle logic={logic} onChange={onLogicChange} />\n )}\n\n {/* Empty state */}\n {rules.length === 0 && (\n <div className=\"flex flex-col items-center justify-center py-12 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\n <svg\n className=\"w-12 h-12 text-gray-400 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n <p className=\"text-sm text-gray-600 mb-4\">No filter rules yet</p>\n <button\n type=\"button\"\n onClick={handleAddRule}\n className=\"\n inline-flex items-center gap-2\n px-4 py-2\n text-sm font-medium text-white\n bg-blue-600 hover:bg-blue-700\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\n transition-colors\n \"\n >\n <span className=\"text-lg\">+</span>\n Add First Rule\n </button>\n </div>\n )}\n\n {/* Rule list */}\n {rules.length > 0 && (\n <div className=\"flex flex-col gap-3\">\n {rules.map((rule, index) => (\n <div key={index}>\n <RuleRow\n rule={rule}\n onChange={(updatedRule) => handleUpdateRule(index, updatedRule)}\n onRemove={() => handleRemoveRule(index)}\n fieldRegistry={fieldRegistry}\n />\n\n {/* Logic connector between rules */}\n {index < rules.length - 1 && (\n <div className=\"flex items-center justify-center py-2\">\n <span className=\"px-3 py-1 text-xs font-semibold text-gray-700 bg-gray-100 border border-gray-300 rounded-full\">\n {logic}\n </span>\n </div>\n )}\n\n {/* Validation errors */}\n {ruleErrors[index].length > 0 && (\n <div className=\"mt-2 px-4 py-2 bg-red-50 border border-red-200 rounded text-sm text-red-700\">\n {ruleErrors[index].map((error, i) => (\n <div key={i}>{error}</div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Add rule button (when rules exist) */}\n {rules.length > 0 && (\n <button\n type=\"button\"\n onClick={handleAddRule}\n className=\"\n w-full\n flex items-center justify-center gap-2\n px-4 py-3\n text-sm font-medium text-blue-600\n bg-white hover:bg-blue-50\n border-2 border-dashed border-blue-300 hover:border-blue-400\n rounded-lg\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\n transition-colors\n \"\n aria-label={`Add rule ${rules.length + 1}`}\n >\n <span className=\"text-xl\">+</span>\n Add Rule\n </button>\n )}\n\n {/* Rule count and summary */}\n {rules.length > 0 && (\n <div className=\"flex items-center justify-between text-xs text-gray-500\">\n <span>\n {rules.length} {rules.length === 1 ? 'rule' : 'rules'}\n </span>\n <span>\n {logic === 'AND' ? 'All rules must match' : 'Any rule can match'}\n </span>\n </div>\n )}\n </div>\n );\n}\n","/**\n * StageActions - Action dropdowns and toggles\n *\n * Features:\n * - Match action dropdown\n * - No match action dropdown\n * - Clear labels and descriptions\n */\n\nimport React from 'react';\nimport { FunnelStage, MatchAction, NoMatchAction } from '../../types';\n\nexport interface StageActionsProps {\n /** The stage being configured */\n stage: FunnelStage;\n\n /** Match action change handler */\n onMatchActionChange: (action: MatchAction) => void;\n\n /** No match action change handler */\n onNoMatchActionChange: (action: NoMatchAction) => void;\n}\n\n/**\n * Match action options with descriptions\n */\nconst MATCH_ACTIONS: Array<{ value: MatchAction; label: string; description: string }> = [\n {\n value: 'continue',\n label: 'Continue',\n description: 'Continue to next stage without tagging',\n },\n {\n value: 'tag',\n label: 'Tag & Stop',\n description: 'Add tags and stop processing',\n },\n {\n value: 'tag_continue',\n label: 'Tag & Continue',\n description: 'Add tags and continue to next stage',\n },\n {\n value: 'output',\n label: 'Output',\n description: 'Add to output and stop processing',\n },\n];\n\n/**\n * No match action options with descriptions\n */\nconst NO_MATCH_ACTIONS: Array<{ value: NoMatchAction; label: string; description: string }> = [\n {\n value: 'continue',\n label: 'Continue',\n description: 'Continue to next stage',\n },\n {\n value: 'exclude',\n label: 'Exclude',\n description: 'Exclude from output and stop processing',\n },\n {\n value: 'tag_exclude',\n label: 'Tag & Exclude',\n description: 'Add tags, exclude from output, and stop',\n },\n];\n\n/**\n * StageActions component\n */\nexport function StageActions({\n stage,\n onMatchActionChange,\n onNoMatchActionChange,\n}: StageActionsProps) {\n return (\n <div className=\"stage-actions\">\n {/* Match action */}\n <div className=\"form-group\">\n <label htmlFor={`match-action-${stage.id}`} className=\"form-label\">\n Action on Match\n </label>\n <select\n id={`match-action-${stage.id}`}\n value={stage.match_action}\n onChange={(e) => onMatchActionChange(e.target.value as MatchAction)}\n className=\"form-select\"\n >\n {MATCH_ACTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <p className=\"form-hint\">\n {MATCH_ACTIONS.find((a) => a.value === stage.match_action)?.description}\n </p>\n </div>\n\n {/* No match action */}\n <div className=\"form-group\">\n <label htmlFor={`no-match-action-${stage.id}`} className=\"form-label\">\n Action on No Match\n </label>\n <select\n id={`no-match-action-${stage.id}`}\n value={stage.no_match_action}\n onChange={(e) => onNoMatchActionChange(e.target.value as NoMatchAction)}\n className=\"form-select\"\n >\n {NO_MATCH_ACTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <p className=\"form-hint\">\n {NO_MATCH_ACTIONS.find((a) => a.value === stage.no_match_action)?.description}\n </p>\n </div>\n </div>\n );\n}\n","/**\n * TagInput - Multi-tag input component\n *\n * Features:\n * - Add tags with Enter or comma\n * - Remove tags with click\n * - Visual tag chips\n * - Duplicate prevention\n */\n\nimport React, { useState, useCallback, KeyboardEvent } from 'react';\n\nexport interface TagInputProps {\n /** Current tags */\n tags: string[];\n\n /** Change handler */\n onChange: (tags: string[]) => void;\n\n /** Input placeholder */\n placeholder?: string;\n\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * TagInput component\n */\nexport function TagInput({\n tags,\n onChange,\n placeholder = 'Add tag...',\n className = '',\n}: TagInputProps) {\n const [inputValue, setInputValue] = useState('');\n\n /**\n * Add tag\n */\n const addTag = useCallback((tag: string) => {\n const trimmed = tag.trim().toLowerCase();\n\n if (!trimmed) {\n return;\n }\n\n // Prevent duplicates\n if (tags.includes(trimmed)) {\n return;\n }\n\n onChange([...tags, trimmed]);\n setInputValue('');\n }, [tags, onChange]);\n\n /**\n * Remove tag\n */\n const removeTag = useCallback((index: number) => {\n onChange(tags.filter((_, i) => i !== index));\n }, [tags, onChange]);\n\n /**\n * Handle input key down\n */\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(inputValue);\n } else if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n // Remove last tag on backspace if input is empty\n removeTag(tags.length - 1);\n }\n }, [inputValue, tags, addTag, removeTag]);\n\n /**\n * Handle input blur\n */\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addTag(inputValue);\n }\n }, [inputValue, addTag]);\n\n return (\n <div className={`tag-input ${className}`}>\n <div className=\"tag-input-container\">\n {/* Tag chips */}\n {tags.map((tag, index) => (\n <div key={index} className=\"tag-chip\">\n <span className=\"tag-text\">{tag}</span>\n <button\n type=\"button\"\n onClick={() => removeTag(index)}\n className=\"tag-remove\"\n aria-label={`Remove tag ${tag}`}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M4 4l6 6M10 4l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n\n {/* Input */}\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n placeholder={tags.length === 0 ? placeholder : ''}\n className=\"tag-input-field\"\n />\n </div>\n\n {/* Hint */}\n <p className=\"tag-input-hint\">\n Press Enter or comma to add tags\n </p>\n </div>\n );\n}\n","/**\n * StageForm - Stage configuration form\n *\n * Features:\n * - Stage name input\n * - Description textarea\n * - Filter logic toggle (AND/OR)\n * - Match/no-match action dropdowns\n * - Tags input\n * - Filter rules editor\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { FunnelStage, FieldDefinition, FilterLogic, MatchAction, NoMatchAction, FilterRule } from '../../types';\nimport { StageActions } from './StageActions';\nimport { TagInput } from './TagInput';\nimport { FilterRuleEditor } from '../FilterRuleEditor/FilterRuleEditor';\n\nexport interface StageFormProps {\n /** The stage being edited */\n stage: FunnelStage;\n\n /** Update stage */\n onUpdate: (stage: FunnelStage) => void;\n\n /** Available fields */\n fieldRegistry: FieldDefinition[];\n}\n\n/**\n * Debounce helper\n */\nfunction useDebounce<T extends (...args: any[]) => void>(\n callback: T,\n delay: number\n): T {\n const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | null>(null);\n\n return useCallback(\n ((...args: any[]) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n const newTimeoutId = setTimeout(() => {\n callback(...args);\n }, delay);\n\n setTimeoutId(newTimeoutId);\n }) as T,\n [callback, delay, timeoutId]\n );\n}\n\n/**\n * StageForm component\n */\nexport function StageForm({\n stage,\n onUpdate,\n fieldRegistry,\n}: StageFormProps) {\n // Local state for inputs (debounced updates)\n const [name, setName] = useState(stage.name);\n const [description, setDescription] = useState(stage.description || '');\n\n // Debounced update handlers\n const debouncedUpdateName = useDebounce((value: string) => {\n onUpdate({ ...stage, name: value });\n }, 300);\n\n const debouncedUpdateDescription = useDebounce((value: string) => {\n onUpdate({ ...stage, description: value });\n }, 500);\n\n /**\n * Handle name change\n */\n const handleNameChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setName(value);\n debouncedUpdateName(value);\n }, [debouncedUpdateName]);\n\n /**\n * Handle description change\n */\n const handleDescriptionChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setDescription(value);\n debouncedUpdateDescription(value);\n }, [debouncedUpdateDescription]);\n\n /**\n * Handle filter logic change\n */\n const handleFilterLogicChange = useCallback((logic: FilterLogic) => {\n onUpdate({ ...stage, filter_logic: logic });\n }, [stage, onUpdate]);\n\n /**\n * Handle match action change\n */\n const handleMatchActionChange = useCallback((action: MatchAction) => {\n onUpdate({ ...stage, match_action: action });\n }, [stage, onUpdate]);\n\n /**\n * Handle no match action change\n */\n const handleNoMatchActionChange = useCallback((action: NoMatchAction) => {\n onUpdate({ ...stage, no_match_action: action });\n }, [stage, onUpdate]);\n\n /**\n * Handle match tags change\n */\n const handleMatchTagsChange = useCallback((tags: string[]) => {\n onUpdate({ ...stage, match_tags: tags });\n }, [stage, onUpdate]);\n\n /**\n * Handle no match tags change\n */\n const handleNoMatchTagsChange = useCallback((tags: string[]) => {\n onUpdate({ ...stage, no_match_tags: tags });\n }, [stage, onUpdate]);\n\n /**\n * Handle filter rules change\n */\n const handleRulesChange = useCallback((rules: FilterRule[]) => {\n onUpdate({ ...stage, rules });\n }, [stage, onUpdate]);\n\n return (\n <div className=\"stage-form\">\n {/* Name input */}\n <div className=\"form-group\">\n <label htmlFor={`stage-name-${stage.id}`} className=\"form-label\">\n Stage Name\n </label>\n <input\n id={`stage-name-${stage.id}`}\n type=\"text\"\n value={name}\n onChange={handleNameChange}\n className=\"form-input\"\n placeholder=\"e.g., High ICP Score\"\n required\n />\n </div>\n\n {/* Description textarea */}\n <div className=\"form-group\">\n <label htmlFor={`stage-desc-${stage.id}`} className=\"form-label\">\n Description\n </label>\n <textarea\n id={`stage-desc-${stage.id}`}\n value={description}\n onChange={handleDescriptionChange}\n className=\"form-textarea\"\n placeholder=\"Describe the purpose of this stage...\"\n rows={3}\n />\n </div>\n\n {/* Filter logic toggle */}\n <div className=\"form-group\">\n <label className=\"form-label\">Filter Logic</label>\n <div className=\"filter-logic-toggle\">\n <button\n type=\"button\"\n onClick={() => handleFilterLogicChange('AND')}\n className={`toggle-button ${stage.filter_logic === 'AND' ? 'active' : ''}`}\n >\n <input\n type=\"radio\"\n name={`filter-logic-${stage.id}`}\n value=\"AND\"\n checked={stage.filter_logic === 'AND'}\n onChange={() => handleFilterLogicChange('AND')}\n className=\"sr-only\"\n />\n AND\n </button>\n <button\n type=\"button\"\n onClick={() => handleFilterLogicChange('OR')}\n className={`toggle-button ${stage.filter_logic === 'OR' ? 'active' : ''}`}\n >\n <input\n type=\"radio\"\n name={`filter-logic-${stage.id}`}\n value=\"OR\"\n checked={stage.filter_logic === 'OR'}\n onChange={() => handleFilterLogicChange('OR')}\n className=\"sr-only\"\n />\n OR\n </button>\n </div>\n <p className=\"form-hint\">\n {stage.filter_logic === 'AND'\n ? 'All rules must match for this stage to pass'\n : 'At least one rule must match for this stage to pass'}\n </p>\n </div>\n\n {/* Stage actions */}\n <StageActions\n stage={stage}\n onMatchActionChange={handleMatchActionChange}\n onNoMatchActionChange={handleNoMatchActionChange}\n />\n\n {/* Match tags */}\n {(stage.match_action === 'tag' || stage.match_action === 'tag_continue') && (\n <div className=\"form-group\">\n <label className=\"form-label\">Tags on Match</label>\n <TagInput\n tags={stage.match_tags || []}\n onChange={handleMatchTagsChange}\n placeholder=\"Add tag...\"\n />\n <p className=\"form-hint\">\n Tags to add when rules match\n </p>\n </div>\n )}\n\n {/* No match tags */}\n {stage.no_match_action === 'tag_exclude' && (\n <div className=\"form-group\">\n <label className=\"form-label\">Tags on No Match</label>\n <TagInput\n tags={stage.no_match_tags || []}\n onChange={handleNoMatchTagsChange}\n placeholder=\"Add tag...\"\n />\n <p className=\"form-hint\">\n Tags to add when rules don't match\n </p>\n </div>\n )}\n\n {/* Filter rules section */}\n <div className=\"form-group\">\n <div className=\"rules-header\">\n <label className=\"form-label\">Filter Rules ({stage.rules.length})</label>\n </div>\n\n <FilterRuleEditor\n rules={stage.rules}\n onChange={handleRulesChange}\n fieldRegistry={fieldRegistry}\n />\n </div>\n </div>\n );\n}\n","/**\n * StageCard - Individual stage card with drag handle\n *\n * Features:\n * - Drag handle for reordering\n * - Expand/collapse\n * - Delete button\n * - Stage configuration form when expanded\n * - Validation errors and warnings\n */\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { FunnelStage, FieldDefinition } from '../../types';\nimport { StageForm } from './StageForm';\n\nexport interface StageCardProps {\n /** The stage to display */\n stage: FunnelStage;\n\n /** Whether stage is expanded */\n expanded: boolean;\n\n /** Toggle expanded state */\n onToggleExpanded: () => void;\n\n /** Update stage */\n onUpdate: (stage: FunnelStage) => void;\n\n /** Remove stage */\n onRemove: () => void;\n\n /** Available fields */\n fieldRegistry: FieldDefinition[];\n\n /** Validation error */\n error?: string;\n\n /** Show warnings */\n showWarnings?: boolean;\n}\n\n/**\n * StageCard component\n */\nexport function StageCard({\n stage,\n expanded,\n onToggleExpanded,\n onUpdate,\n onRemove,\n fieldRegistry,\n error,\n showWarnings = false,\n}: StageCardProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: stage.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`stage-card ${isDragging ? 'dragging' : ''} ${error ? 'error' : ''}`}\n >\n {/* Header */}\n <div className=\"stage-header\">\n {/* Drag handle */}\n <button\n {...attributes}\n {...listeners}\n className=\"drag-handle\"\n aria-label=\"Drag to reorder\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M7 4h6M7 10h6M7 16h6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n\n {/* Stage title (clickable to expand/collapse) */}\n <button\n onClick={onToggleExpanded}\n className=\"stage-title-button\"\n aria-expanded={expanded}\n >\n <span className=\"stage-number\">Stage {stage.order + 1}:</span>\n <span className=\"stage-name\">{stage.name || 'Untitled Stage'}</span>\n\n {/* Expand/collapse icon */}\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n className={`expand-icon ${expanded ? 'expanded' : ''}`}\n >\n <path\n d=\"M6 8l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Delete button */}\n <button\n onClick={onRemove}\n className=\"delete-button\"\n aria-label=\"Delete stage\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M6 6l8 8M14 6l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n {/* Validation error */}\n {error && (\n <div className=\"error-message\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 1l7 13H1L8 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M8 6v3M8 11h.01\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n <span>{error}</span>\n </div>\n )}\n\n {/* Warning (no rules) */}\n {showWarnings && !error && (\n <div className=\"warning-message\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M8 5v3M8 10h.01\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n <span>Stage has no filter rules</span>\n </div>\n )}\n\n {/* Collapsed summary */}\n {!expanded && (\n <div className=\"stage-summary\">\n <div className=\"summary-item\">\n <span className=\"summary-label\">Rules:</span>\n <span className=\"summary-value\">{stage.rules.length}</span>\n </div>\n <div className=\"summary-item\">\n <span className=\"summary-label\">Logic:</span>\n <span className=\"summary-value\">{stage.filter_logic}</span>\n </div>\n <div className=\"summary-item\">\n <span className=\"summary-label\">On Match:</span>\n <span className=\"summary-value\">{stage.match_action}</span>\n </div>\n <div className=\"summary-item\">\n <span className=\"summary-label\">On No Match:</span>\n <span className=\"summary-value\">{stage.no_match_action}</span>\n </div>\n </div>\n )}\n\n {/* Expanded form */}\n {expanded && (\n <div className=\"stage-form-wrapper\">\n <StageForm\n stage={stage}\n onUpdate={onUpdate}\n fieldRegistry={fieldRegistry}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * AddStageButton - Button to add new stages\n *\n * Features:\n * - Different styles for top/bottom/inline positions\n * - Clear visual affordance\n */\n\nimport React from 'react';\n\nexport interface AddStageButtonProps {\n /** Click handler */\n onClick: () => void;\n\n /** Position context */\n position: 'top' | 'bottom' | 'inline';\n\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * AddStageButton component\n */\nexport function AddStageButton({\n onClick,\n position,\n className = '',\n}: AddStageButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`add-stage-button ${position} ${className}`}\n aria-label={`Add stage ${position === 'top' ? 'at top' : position === 'bottom' ? 'at bottom' : 'below'}`}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M10 5v10M5 10h10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span>\n {position === 'top' && 'Add Stage'}\n {position === 'bottom' && 'Add Stage Below'}\n {position === 'inline' && 'Add Stage'}\n </span>\n </button>\n );\n}\n","/**\n * FunnelStageBuilder - Main component for creating/editing funnel stages\n *\n * Features:\n * - Drag-and-drop reordering\n * - Add/remove stages\n * - Stage configuration (name, description, filters, actions)\n * - Visual flow with arrows\n * - Expandable stage cards\n */\n\nimport React, { useState, useCallback } from 'react';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { Funnel, FunnelStage, FieldDefinition } from '../../types';\nimport { StageCard } from './StageCard';\nimport { AddStageButton } from './AddStageButton';\n\nexport interface FunnelStageBuilderProps {\n /** The funnel being edited */\n funnel: Funnel;\n\n /** Callback when funnel is updated */\n onUpdate: (funnel: Funnel) => void;\n\n /** Available fields for filter rules */\n fieldRegistry: FieldDefinition[];\n\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * Generate unique stage ID\n */\nfunction generateStageId(): string {\n return `stage-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Create a new empty stage\n */\nfunction createEmptyStage(order: number): FunnelStage {\n return {\n id: generateStageId(),\n order,\n name: `Stage ${order + 1}`,\n description: '',\n filter_logic: 'AND',\n rules: [],\n match_action: 'continue',\n no_match_action: 'continue',\n match_tags: [],\n no_match_tags: [],\n };\n}\n\n/**\n * Validate stage name uniqueness\n */\nfunction validateStageName(name: string, stages: FunnelStage[], currentStageId?: string): string | null {\n const trimmedName = name.trim();\n\n if (!trimmedName) {\n return 'Stage name is required';\n }\n\n const duplicate = stages.find(\n s => s.id !== currentStageId && s.name.trim().toLowerCase() === trimmedName.toLowerCase()\n );\n\n if (duplicate) {\n return 'Stage name must be unique';\n }\n\n return null;\n}\n\n/**\n * Main FunnelStageBuilder component\n */\nexport function FunnelStageBuilder({\n funnel,\n onUpdate,\n fieldRegistry,\n className = '',\n}: FunnelStageBuilderProps) {\n // Track expanded stages\n const [expandedStages, setExpandedStages] = useState<Set<string>>(\n new Set(funnel.stages.map(s => s.id))\n );\n\n // Validation errors\n const [errors, setErrors] = useState<Map<string, string>>(new Map());\n\n // Configure drag-and-drop sensors\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n /**\n * Toggle stage expanded/collapsed\n */\n const toggleExpanded = useCallback((stageId: string) => {\n setExpandedStages(prev => {\n const next = new Set(prev);\n if (next.has(stageId)) {\n next.delete(stageId);\n } else {\n next.add(stageId);\n }\n return next;\n });\n }, []);\n\n /**\n * Add new stage\n */\n const handleAddStage = useCallback((insertAfterIndex?: number) => {\n const newOrder = insertAfterIndex !== undefined ? insertAfterIndex + 1 : funnel.stages.length;\n const newStage = createEmptyStage(newOrder);\n\n // Update orders for stages after insertion point\n const updatedStages = funnel.stages.map(stage => {\n if (stage.order >= newOrder) {\n return { ...stage, order: stage.order + 1 };\n }\n return stage;\n });\n\n // Insert new stage\n updatedStages.splice(newOrder, 0, newStage);\n\n // Expand new stage\n setExpandedStages(prev => new Set(prev).add(newStage.id));\n\n onUpdate({\n ...funnel,\n stages: updatedStages,\n });\n }, [funnel, onUpdate]);\n\n /**\n * Remove stage\n */\n const handleRemoveStage = useCallback((stageId: string) => {\n const stageIndex = funnel.stages.findIndex(s => s.id === stageId);\n if (stageIndex === -1) return;\n\n // Remove stage\n const updatedStages = funnel.stages.filter(s => s.id !== stageId);\n\n // Reorder remaining stages\n updatedStages.forEach((stage, index) => {\n stage.order = index;\n });\n\n // Remove from expanded set\n setExpandedStages(prev => {\n const next = new Set(prev);\n next.delete(stageId);\n return next;\n });\n\n // Remove validation errors\n setErrors(prev => {\n const next = new Map(prev);\n next.delete(stageId);\n return next;\n });\n\n onUpdate({\n ...funnel,\n stages: updatedStages,\n });\n }, [funnel, onUpdate]);\n\n /**\n * Update stage\n */\n const handleUpdateStage = useCallback((updatedStage: FunnelStage) => {\n // Validate stage name\n const nameError = validateStageName(updatedStage.name, funnel.stages, updatedStage.id);\n\n setErrors(prev => {\n const next = new Map(prev);\n if (nameError) {\n next.set(updatedStage.id, nameError);\n } else {\n next.delete(updatedStage.id);\n }\n return next;\n });\n\n const updatedStages = funnel.stages.map(stage =>\n stage.id === updatedStage.id ? updatedStage : stage\n );\n\n onUpdate({\n ...funnel,\n stages: updatedStages,\n });\n }, [funnel, onUpdate]);\n\n /**\n * Handle drag end\n */\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over || active.id === over.id) {\n return;\n }\n\n const oldIndex = funnel.stages.findIndex(s => s.id === active.id);\n const newIndex = funnel.stages.findIndex(s => s.id === over.id);\n\n if (oldIndex === -1 || newIndex === -1) {\n return;\n }\n\n // Reorder stages\n const reorderedStages = arrayMove(funnel.stages, oldIndex, newIndex);\n\n // Update order values\n reorderedStages.forEach((stage, index) => {\n stage.order = index;\n });\n\n onUpdate({\n ...funnel,\n stages: reorderedStages,\n });\n }, [funnel, onUpdate]);\n\n return (\n <div className={`funnel-stage-builder ${className}`}>\n {/* Add stage at top */}\n <div className=\"mb-4\">\n <AddStageButton onClick={() => handleAddStage()} position=\"top\" />\n </div>\n\n {/* Stage list with drag-and-drop */}\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={funnel.stages.map(s => s.id)}\n strategy={verticalListSortingStrategy}\n >\n {funnel.stages.map((stage, index) => (\n <div key={stage.id} className=\"stage-wrapper\">\n <StageCard\n stage={stage}\n expanded={expandedStages.has(stage.id)}\n onToggleExpanded={() => toggleExpanded(stage.id)}\n onUpdate={handleUpdateStage}\n onRemove={() => handleRemoveStage(stage.id)}\n fieldRegistry={fieldRegistry}\n error={errors.get(stage.id)}\n showWarnings={stage.rules.length === 0}\n />\n\n {/* Flow arrow between stages */}\n {index < funnel.stages.length - 1 && (\n <div className=\"stage-arrow\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 5v14m0 0l-4-4m4 4l4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n ))}\n </SortableContext>\n </DndContext>\n\n {/* Add stage at bottom */}\n {funnel.stages.length > 0 && (\n <div className=\"mt-4\">\n <AddStageButton\n onClick={() => handleAddStage(funnel.stages.length - 1)}\n position=\"bottom\"\n />\n </div>\n )}\n\n {/* Empty state */}\n {funnel.stages.length === 0 && (\n <div className=\"empty-state\">\n <p className=\"text-gray-500 text-center py-8\">\n No stages yet. Add your first stage to get started.\n </p>\n </div>\n )}\n </div>\n );\n}\n","/**\n * RunFilters Component\n *\n * Filter controls for funnel run history.\n *\n * Design Rationale:\n * - Inline filter controls for immediate feedback\n * - Dropdown selects for constrained options\n * - Date range picker for flexible filtering\n * - Clear visual separation from table\n *\n * Interaction Notes:\n * - Filters apply immediately on change (no \"Apply\" button)\n * - Default to \"Last 30 days\" for performance\n * - Clear button resets all filters\n */\n\nimport { FunnelRunStatus, TriggerType } from '../../types';\nimport { RunFilters as RunFiltersType } from './types';\n\ninterface RunFiltersProps {\n filters: RunFiltersType;\n onFiltersChange: (filters: RunFiltersType) => void;\n className?: string;\n}\n\nexport function RunFilters({\n filters,\n onFiltersChange,\n className = '',\n}: RunFiltersProps) {\n const updateFilter = <K extends keyof RunFiltersType>(\n key: K,\n value: RunFiltersType[K]\n ) => {\n onFiltersChange({ ...filters, [key]: value });\n };\n\n const clearFilters = () => {\n onFiltersChange({\n status: 'all',\n trigger_type: 'all',\n date_range: 'month',\n });\n };\n\n const hasActiveFilters =\n filters.status !== 'all' ||\n filters.trigger_type !== 'all' ||\n filters.date_range !== 'month';\n\n return (\n <div\n className={`flex items-center gap-3 p-3 bg-gray-50 border-b border-gray-200 ${className}`}\n >\n {/* Status Filter */}\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"status-filter\" className=\"text-sm font-medium text-gray-700\">\n Status:\n </label>\n <select\n id=\"status-filter\"\n value={filters.status || 'all'}\n onChange={(e) =>\n updateFilter('status', e.target.value as FunnelRunStatus | 'all')\n }\n className=\"px-2 py-1 text-sm border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All</option>\n <option value=\"completed\">Complete</option>\n <option value=\"running\">Running</option>\n <option value=\"failed\">Failed</option>\n <option value=\"pending\">Pending</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n </div>\n\n {/* Trigger Type Filter */}\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"trigger-filter\" className=\"text-sm font-medium text-gray-700\">\n Trigger:\n </label>\n <select\n id=\"trigger-filter\"\n value={filters.trigger_type || 'all'}\n onChange={(e) =>\n updateFilter('trigger_type', e.target.value as TriggerType | 'all')\n }\n className=\"px-2 py-1 text-sm border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All</option>\n <option value=\"manual\">Manual</option>\n <option value=\"scheduled\">Scheduled</option>\n <option value=\"webhook\">Webhook</option>\n <option value=\"api\">API</option>\n </select>\n </div>\n\n {/* Date Range Filter */}\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"date-filter\" className=\"text-sm font-medium text-gray-700\">\n Date:\n </label>\n <select\n id=\"date-filter\"\n value={filters.date_range || 'month'}\n onChange={(e) => updateFilter('date_range', e.target.value as any)}\n className=\"px-2 py-1 text-sm border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All time</option>\n <option value=\"today\">Today</option>\n <option value=\"week\">Last 7 days</option>\n <option value=\"month\">Last 30 days</option>\n </select>\n </div>\n\n {/* Clear Button */}\n {hasActiveFilters && (\n <button\n onClick={clearFilters}\n className=\"ml-auto px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Clear filters\n </button>\n )}\n </div>\n );\n}\n","/**\n * RunStatusBadge Component\n *\n * Displays funnel run status with icon and color coding.\n *\n * Design Rationale:\n * - Icons provide instant visual recognition\n * - Color coding reinforces status meaning\n * - Spinning animation for active states\n * - Accessible with both visual and text indicators\n */\n\nimport { FunnelRunStatus } from '../../types';\n\ninterface RunStatusBadgeProps {\n status: FunnelRunStatus;\n className?: string;\n}\n\ninterface StatusConfig {\n icon: string;\n label: string;\n color: string;\n bgColor: string;\n spinning?: boolean;\n}\n\nconst statusConfig: Record<FunnelRunStatus, StatusConfig> = {\n completed: {\n icon: '✓',\n label: 'Complete',\n color: 'text-green-800',\n bgColor: 'bg-green-100',\n },\n running: {\n icon: '⏸',\n label: 'Running',\n color: 'text-blue-800',\n bgColor: 'bg-blue-100',\n spinning: true,\n },\n failed: {\n icon: '✗',\n label: 'Failed',\n color: 'text-red-800',\n bgColor: 'bg-red-100',\n },\n pending: {\n icon: '○',\n label: 'Pending',\n color: 'text-yellow-800',\n bgColor: 'bg-yellow-100',\n },\n cancelled: {\n icon: '×',\n label: 'Cancelled',\n color: 'text-gray-800',\n bgColor: 'bg-gray-100',\n },\n};\n\nexport function RunStatusBadge({ status, className = '' }: RunStatusBadgeProps) {\n const config = statusConfig[status];\n\n return (\n <span\n className={`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium ${config.bgColor} ${config.color} ${className}`}\n >\n <span className={config.spinning ? 'animate-spin' : ''} aria-hidden=\"true\">\n {config.icon}\n </span>\n <span>{config.label}</span>\n </span>\n );\n}\n","/**\n * RunActions Component\n *\n * Action dropdown menu for individual run rows.\n *\n * Design Rationale:\n * - Dropdown menu keeps UI clean and compact\n * - Icons provide visual cues for actions\n * - Disabled states for invalid actions\n * - Confirmation for destructive actions (cancel)\n *\n * Accessibility:\n * - Keyboard navigation (arrow keys, Enter, Escape)\n * - Focus management\n * - ARIA attributes for screen readers\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { FunnelRun } from '../../types';\n\ninterface RunActionsProps {\n run: FunnelRun;\n onViewDetails: (run: FunnelRun) => void;\n onViewResults: (run: FunnelRun) => void;\n onReRun: (run: FunnelRun) => void;\n onCancel?: (run: FunnelRun) => void;\n className?: string;\n}\n\nexport function RunActions({\n run,\n onViewDetails,\n onViewResults,\n onReRun,\n onCancel,\n className = '',\n}: RunActionsProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const canCancel = run.status === 'pending' || run.status === 'running';\n const canViewResults = run.status === 'completed';\n\n return (\n <div className={`relative ${className}`} ref={dropdownRef}>\n {/* Trigger Button */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"p-1 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Run actions\"\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\"\n />\n </svg>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div\n className=\"absolute right-0 mt-1 w-48 bg-white rounded-md shadow-lg border border-gray-200 z-10\"\n role=\"menu\"\n >\n <div className=\"py-1\">\n {/* View Details */}\n <button\n onClick={() => {\n onViewDetails(run);\n setIsOpen(false);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">👁</span>\n View Details\n </button>\n\n {/* View Results */}\n <button\n onClick={() => {\n onViewResults(run);\n setIsOpen(false);\n }}\n disabled={!canViewResults}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">📊</span>\n View Results\n </button>\n\n {/* Re-run */}\n <button\n onClick={() => {\n onReRun(run);\n setIsOpen(false);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">↻</span>\n Re-run\n </button>\n\n {/* Cancel (if running/pending) */}\n {canCancel && onCancel && (\n <>\n <div className=\"border-t border-gray-200 my-1\" />\n <button\n onClick={() => {\n if (confirm('Are you sure you want to cancel this run?')) {\n onCancel(run);\n setIsOpen(false);\n }\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-red-600 hover:bg-red-50 flex items-center gap-2\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">×</span>\n Cancel Run\n </button>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * FunnelRunHistory Utilities\n *\n * Helper functions for formatting and calculations\n */\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * Examples:\n * - 1234 → \"1.2s\"\n * - 65000 → \"1m 5s\"\n * - 3661000 → \"1h 1m\"\n */\nexport function formatDuration(ms?: number): string {\n if (ms === undefined || ms === null) return '-';\n if (ms === 0) return '0ms';\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;\n }\n\n if (minutes > 0) {\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\n }\n\n if (seconds > 0) {\n return `${seconds}s`;\n }\n\n return `${ms}ms`;\n}\n\n/**\n * Format relative time\n *\n * Examples:\n * - 5 minutes ago → \"5m ago\"\n * - 2 hours ago → \"2h ago\"\n * - Yesterday → \"1d ago\"\n */\nexport function formatRelativeTime(date: Date | string): string {\n const now = new Date();\n const then = new Date(date);\n const diffMs = now.getTime() - then.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) {\n return `${diffDays}d ago`;\n }\n\n if (diffHours > 0) {\n return `${diffHours}h ago`;\n }\n\n if (diffMinutes > 0) {\n return `${diffMinutes}m ago`;\n }\n\n return 'Just now';\n}\n\n/**\n * Calculate match rate percentage\n */\nexport function calculateMatchRate(matched: number, total: number): number {\n if (total === 0) return 0;\n return Math.round((matched / total) * 100);\n}\n\n/**\n * Format number with commas\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString();\n}\n\n/**\n * Format full timestamp for tooltips\n */\nexport function formatFullTimestamp(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n","/**\n * RunRow Component\n *\n * Individual table row for a funnel run.\n *\n * Design Rationale:\n * - Clickable row opens details modal\n * - Hover state provides visual feedback\n * - Action button visible on hover for cleaner UI\n * - Tooltip on date shows full timestamp\n *\n * Interaction Notes:\n * - Click anywhere on row to view details\n * - Action dropdown prevents row click propagation\n * - Keyboard accessible (Enter to open details)\n */\n\nimport { FunnelRun } from '../../types';\nimport { RunStatusBadge } from './RunStatusBadge';\nimport { RunActions } from './RunActions';\nimport {\n formatDuration,\n formatRelativeTime,\n formatFullTimestamp,\n calculateMatchRate,\n formatNumber,\n} from './utils';\n\ninterface RunRowProps {\n run: FunnelRun;\n onViewDetails: (run: FunnelRun) => void;\n onViewResults: (run: FunnelRun) => void;\n onReRun: (run: FunnelRun) => void;\n onCancel?: (run: FunnelRun) => void;\n}\n\nexport function RunRow({\n run,\n onViewDetails,\n onViewResults,\n onReRun,\n onCancel,\n}: RunRowProps) {\n const matchRate =\n run.status === 'completed'\n ? calculateMatchRate(run.total_matched, run.total_input)\n : null;\n\n return (\n <tr\n onClick={() => onViewDetails(run)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onViewDetails(run);\n }\n }}\n tabIndex={0}\n className=\"border-b border-gray-200 hover:bg-gray-50 cursor-pointer transition-colors focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500\"\n >\n {/* Date */}\n <td className=\"px-4 py-3\">\n <span\n className=\"text-sm text-gray-900\"\n title={formatFullTimestamp(run.started_at)}\n >\n {formatRelativeTime(run.started_at)}\n </span>\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-3\">\n <RunStatusBadge status={run.status} />\n </td>\n\n {/* Trigger */}\n <td className=\"px-4 py-3\">\n <span className=\"text-sm text-gray-700 capitalize\">\n {run.trigger_type}\n </span>\n </td>\n\n {/* Duration */}\n <td className=\"px-4 py-3\">\n <span className=\"text-sm text-gray-900\">\n {formatDuration(run.duration_ms)}\n </span>\n </td>\n\n {/* Input */}\n <td className=\"px-4 py-3 text-right\">\n <span className=\"text-sm font-medium text-gray-900\">\n {formatNumber(run.total_input)}\n </span>\n </td>\n\n {/* Matched */}\n <td className=\"px-4 py-3 text-right\">\n <span className=\"text-sm font-medium text-green-600\">\n {run.status === 'completed' ? formatNumber(run.total_matched) : '-'}\n </span>\n </td>\n\n {/* Match Rate % */}\n <td className=\"px-4 py-3 text-right\">\n <span className=\"text-sm font-medium text-gray-900\">\n {matchRate !== null ? `${matchRate}%` : '-'}\n </span>\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-3\" onClick={(e) => e.stopPropagation()}>\n <RunActions\n run={run}\n onViewDetails={onViewDetails}\n onViewResults={onViewResults}\n onReRun={onReRun}\n onCancel={onCancel}\n />\n </td>\n </tr>\n );\n}\n","/**\n * StageBreakdownList Component\n *\n * Displays stage-by-stage execution statistics.\n *\n * Design Rationale:\n * - Sequential numbering shows funnel flow\n * - Input → Matched with delta shows filtering effect\n * - Color coding: green for matched, red for excluded\n * - Arrow symbols reinforce flow direction\n *\n * Visual Hierarchy:\n * - Stage name is prominent\n * - Numbers are large and easy to scan\n * - Delta shows impact at each stage\n */\n\nimport { StageStats } from '../../types';\nimport { formatNumber } from './utils';\n\ninterface StageBreakdownListProps {\n stages: StageStats[];\n className?: string;\n}\n\nexport function StageBreakdownList({\n stages,\n className = '',\n}: StageBreakdownListProps) {\n return (\n <div className={`space-y-3 ${className}`}>\n {stages.map((stage, index) => {\n const delta = stage.matched_count - stage.input_count;\n const matchRate =\n stage.input_count > 0\n ? Math.round((stage.matched_count / stage.input_count) * 100)\n : 0;\n\n return (\n <div\n key={stage.stage_id}\n className=\"p-3 bg-gray-50 rounded-lg border border-gray-200\"\n >\n {/* Stage Header */}\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"flex items-center justify-center w-6 h-6 text-xs font-bold text-white bg-blue-600 rounded-full\">\n {index + 1}\n </span>\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {stage.stage_name}\n </h4>\n </div>\n\n {/* Stage Stats */}\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n {/* Input */}\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Input</div>\n <div className=\"text-lg font-bold text-blue-600\">\n {formatNumber(stage.input_count)}\n </div>\n </div>\n\n {/* Matched */}\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Matched</div>\n <div className=\"text-lg font-bold text-green-600\">\n {formatNumber(stage.matched_count)}\n </div>\n </div>\n\n {/* Match Rate */}\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Rate</div>\n <div className=\"text-lg font-bold text-gray-700\">{matchRate}%</div>\n </div>\n </div>\n\n {/* Delta */}\n {delta !== 0 && (\n <div className=\"mt-2 pt-2 border-t border-gray-200\">\n <div className=\"flex items-center justify-center gap-1 text-sm\">\n <span\n className={`font-medium ${\n delta > 0 ? 'text-green-600' : 'text-red-600'\n }`}\n >\n {delta > 0 ? '▲' : '▼'} {formatNumber(Math.abs(delta))}\n </span>\n <span className=\"text-gray-500\">\n {delta > 0 ? 'added' : 'excluded'}\n </span>\n </div>\n </div>\n )}\n\n {/* Error Count */}\n {stage.error_count && stage.error_count > 0 && (\n <div className=\"mt-2 pt-2 border-t border-gray-200\">\n <div className=\"text-sm text-red-600 text-center\">\n ⚠ {formatNumber(stage.error_count)} errors\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * RunDetailsModal Component\n *\n * Modal dialog showing detailed run information and stage breakdown.\n *\n * Design Rationale:\n * - Modal overlay focuses attention on details\n * - Stage breakdown shows funnel flow clearly\n * - Action buttons provide next steps\n * - Close on overlay click or Escape key\n *\n * Accessibility:\n * - Focus trap within modal\n * - Escape key closes modal\n * - ARIA dialog attributes\n * - Backdrop click closes modal\n */\n\nimport { useEffect, useRef } from 'react';\nimport { FunnelRun } from '../../types';\nimport { RunStatusBadge } from './RunStatusBadge';\nimport { StageBreakdownList } from './StageBreakdownList';\nimport {\n formatDuration,\n formatRelativeTime,\n formatFullTimestamp,\n} from './utils';\n\ninterface RunDetailsModalProps {\n run: FunnelRun | null;\n onClose: () => void;\n onViewResults?: (run: FunnelRun) => void;\n onReRun?: (run: FunnelRun) => void;\n}\n\nexport function RunDetailsModal({\n run,\n onClose,\n onViewResults,\n onReRun,\n}: RunDetailsModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (run) {\n document.addEventListener('keydown', handleEscape);\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }\n }, [run, onClose]);\n\n // Focus trap\n useEffect(() => {\n if (run && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n firstElement?.focus();\n\n const handleTab = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n };\n\n document.addEventListener('keydown', handleTab);\n return () => document.removeEventListener('keydown', handleTab);\n }\n }, [run]);\n\n if (!run) return null;\n\n const stageStatsArray = Object.values(run.stage_stats);\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"modal-title\"\n >\n <div\n ref={modalRef}\n onClick={(e) => e.stopPropagation()}\n className=\"bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden flex flex-col\"\n >\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <h2 id=\"modal-title\" className=\"text-lg font-semibold text-gray-900\">\n Run Details\n </h2>\n <button\n onClick={onClose}\n className=\"p-1 text-gray-400 hover:text-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"px-6 py-4 overflow-y-auto flex-1\">\n {/* Run Summary */}\n <div className=\"mb-6\">\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Status</div>\n <RunStatusBadge status={run.status} />\n </div>\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Duration</div>\n <div className=\"text-sm font-medium text-gray-900\">\n {formatDuration(run.duration_ms)}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Started</div>\n <div className=\"text-sm font-medium text-gray-900\">\n <span title={formatFullTimestamp(run.started_at)}>\n {formatRelativeTime(run.started_at)}\n </span>\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Triggered by</div>\n <div className=\"text-sm font-medium text-gray-900\">\n {run.triggered_by || 'System'} ({run.trigger_type})\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {run.status === 'failed' && run.error && (\n <div className=\"p-3 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"text-sm font-medium text-red-800 mb-1\">\n Error\n </div>\n <div className=\"text-sm text-red-700\">{run.error}</div>\n </div>\n )}\n </div>\n\n {/* Stage Breakdown */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n Stage Breakdown\n </h3>\n {stageStatsArray.length > 0 ? (\n <StageBreakdownList stages={stageStatsArray} />\n ) : (\n <div className=\"text-sm text-gray-500 text-center py-4\">\n No stage data available\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-gray-200 flex items-center justify-end gap-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Close\n </button>\n {onReRun && (\n <button\n onClick={() => {\n onReRun(run);\n onClose();\n }}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n ↻ Re-run\n </button>\n )}\n {onViewResults && run.status === 'completed' && (\n <button\n onClick={() => {\n onViewResults(run);\n onClose();\n }}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n View Results\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * FunnelRunHistory Component\n *\n * Displays execution history for a funnel with filtering, sorting, and pagination.\n *\n * Design Goal:\n * Users should be able to quickly scan run history, filter by status/trigger/date,\n * view detailed breakdowns, and take actions (re-run, view results, cancel).\n *\n * Visual Hierarchy:\n * - Header with title and refresh controls\n * - Filter bar for narrowing results\n * - Table showing run history (sorted by date by default)\n * - Pagination controls\n * - Details modal for deep dive\n *\n * Interaction Notes:\n * - Auto-refresh when active runs exist (every 5 seconds)\n * - Click row to view details\n * - Action dropdown for quick actions\n * - Filters apply immediately\n * - Pagination loads new data\n *\n * Responsive Behavior:\n * - Desktop: Full table with all columns\n * - Tablet: Hide duration and trigger columns\n * - Mobile: Card-based layout (responsive table variant)\n *\n * Accessibility:\n * - Keyboard navigation throughout\n * - ARIA labels for screen readers\n * - Loading states announced\n * - Error states clearly communicated\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { FunnelRun } from '../../types';\nimport { FunnelApiClient } from '../../api/client';\nimport { RunFilters } from './RunFilters';\nimport { RunRow } from './RunRow';\nimport { RunDetailsModal } from './RunDetailsModal';\nimport { RunFilters as RunFiltersType, Pagination } from './types';\n\ninterface FunnelRunHistoryProps {\n funnelId: string;\n apiClient: FunnelApiClient;\n onViewResults?: (run: FunnelRun) => void;\n className?: string;\n}\n\nexport function FunnelRunHistory({\n funnelId,\n apiClient,\n onViewResults,\n className = '',\n}: FunnelRunHistoryProps) {\n // State\n const [runs, setRuns] = useState<FunnelRun[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [selectedRun, setSelectedRun] = useState<FunnelRun | null>(null);\n const [filters, setFilters] = useState<RunFiltersType>({\n status: 'all',\n trigger_type: 'all',\n date_range: 'month',\n });\n const [pagination, setPagination] = useState<Pagination>({\n page: 1,\n page_size: 10,\n total: 0,\n });\n const [isRefreshing, setIsRefreshing] = useState(false);\n\n // Load runs\n const loadRuns = useCallback(async () => {\n try {\n setError(null);\n const params: any = {\n page: pagination.page,\n page_size: pagination.page_size,\n ordering: '-started_at', // Most recent first\n };\n\n // Add filters\n if (filters.status && filters.status !== 'all') {\n params.status = filters.status;\n }\n if (filters.trigger_type && filters.trigger_type !== 'all') {\n params.trigger_type = filters.trigger_type;\n }\n\n const response = await apiClient.getFunnelRuns(funnelId, params);\n\n setRuns(response.results);\n setPagination((prev) => ({\n ...prev,\n total: response.count,\n }));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load runs');\n console.error('Failed to load funnel runs:', err);\n } finally {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }, [funnelId, apiClient, pagination.page, pagination.page_size, filters]);\n\n // Load runs on mount and when dependencies change\n useEffect(() => {\n loadRuns();\n }, [loadRuns]);\n\n // Auto-refresh for active runs\n useEffect(() => {\n const hasActiveRuns = runs.some(\n (r) => r.status === 'pending' || r.status === 'running'\n );\n\n if (hasActiveRuns) {\n const interval = setInterval(() => {\n setIsRefreshing(true);\n loadRuns();\n }, 5000); // Poll every 5 seconds\n\n return () => clearInterval(interval);\n }\n }, [runs, loadRuns]);\n\n // Manual refresh\n const handleRefresh = () => {\n setIsRefreshing(true);\n loadRuns();\n };\n\n // Actions\n const handleReRun = async (run: FunnelRun) => {\n try {\n await apiClient.runFunnel(funnelId, {\n trigger_type: 'manual',\n metadata: { re_run_of: run.id },\n });\n // Refresh to show new run\n loadRuns();\n } catch (err) {\n console.error('Failed to re-run funnel:', err);\n alert('Failed to re-run funnel. Please try again.');\n }\n };\n\n const handleCancel = async (run: FunnelRun) => {\n try {\n await apiClient.cancelFunnelRun(run.id);\n // Refresh to show updated status\n loadRuns();\n } catch (err) {\n console.error('Failed to cancel run:', err);\n alert('Failed to cancel run. Please try again.');\n }\n };\n\n const handleViewResults = (run: FunnelRun) => {\n if (onViewResults) {\n onViewResults(run);\n } else {\n // Default: open details modal\n setSelectedRun(run);\n }\n };\n\n // Pagination\n const totalPages = Math.ceil(pagination.total / pagination.page_size);\n const canGoBack = pagination.page > 1;\n const canGoForward = pagination.page < totalPages;\n\n const handlePreviousPage = () => {\n if (canGoBack) {\n setPagination((prev) => ({ ...prev, page: prev.page - 1 }));\n }\n };\n\n const handleNextPage = () => {\n if (canGoForward) {\n setPagination((prev) => ({ ...prev, page: prev.page + 1 }));\n }\n };\n\n const startIndex = (pagination.page - 1) * pagination.page_size + 1;\n const endIndex = Math.min(\n pagination.page * pagination.page_size,\n pagination.total\n );\n\n return (\n <div className={`bg-white rounded-lg border border-gray-200 ${className}`}>\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-gray-200 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-gray-900\">\n Funnel Run History\n </h2>\n <button\n onClick={handleRefresh}\n disabled={isRefreshing}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Refresh run history\"\n >\n <span className={isRefreshing ? 'animate-spin inline-block' : ''}>\n ↻\n </span>{' '}\n Refresh\n </button>\n </div>\n\n {/* Filters */}\n <RunFilters filters={filters} onFiltersChange={setFilters} />\n\n {/* Table */}\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead className=\"bg-gray-50 border-b border-gray-200\">\n <tr>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Date\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Trigger\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Duration\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Input\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Matched\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n %\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n <span className=\"sr-only\">Actions</span>\n </th>\n </tr>\n </thead>\n <tbody>\n {isLoading && runs.length === 0 ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-gray-500\">Loading runs...</div>\n </td>\n </tr>\n ) : error ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-red-600\">Error: {error}</div>\n <button\n onClick={loadRuns}\n className=\"mt-2 text-sm text-blue-600 hover:text-blue-700 underline\"\n >\n Try again\n </button>\n </td>\n </tr>\n ) : runs.length === 0 ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-gray-500\">\n No runs found. Run this funnel to see history.\n </div>\n </td>\n </tr>\n ) : (\n runs.map((run) => (\n <RunRow\n key={run.id}\n run={run}\n onViewDetails={setSelectedRun}\n onViewResults={handleViewResults}\n onReRun={handleReRun}\n onCancel={handleCancel}\n />\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {runs.length > 0 && (\n <div className=\"px-6 py-3 border-t border-gray-200 flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n Showing {startIndex}-{endIndex} of {pagination.total}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handlePreviousPage}\n disabled={!canGoBack}\n className=\"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Previous page\"\n >\n ‹\n </button>\n <span className=\"text-sm text-gray-600\">\n Page {pagination.page} of {totalPages}\n </span>\n <button\n onClick={handleNextPage}\n disabled={!canGoForward}\n className=\"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Next page\"\n >\n ›\n </button>\n </div>\n </div>\n )}\n\n {/* Details Modal */}\n <RunDetailsModal\n run={selectedRun}\n onClose={() => setSelectedRun(null)}\n onViewResults={onViewResults}\n onReRun={handleReRun}\n />\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/engine.ts","../../src/hooks/useDebouncedValue.ts","../../src/components/FunnelPreview/PreviewStats.tsx","../../src/components/FunnelPreview/StageBreakdown.tsx","../../src/components/FunnelPreview/EntityCard.tsx","../../src/components/FunnelPreview/LoadingPreview.tsx","../../src/components/FunnelPreview/FunnelPreview.tsx","../../src/components/FunnelCard/StatusBadge.tsx","../../src/components/FunnelCard/StageIndicator.tsx","../../src/components/FunnelCard/MatchBar.tsx","../../src/components/FunnelCard/FunnelStats.tsx","../../src/components/FunnelCard/FunnelCard.tsx","../../src/components/FunnelVisualFlow/StageNode.tsx","../../src/components/FunnelVisualFlow/FlowLegend.tsx","../../src/components/FunnelVisualFlow/FunnelVisualFlow.tsx","../../src/components/FilterRuleEditor/LogicToggle.tsx","../../src/components/FilterRuleEditor/FieldSelector.tsx","../../src/components/FilterRuleEditor/constants.ts","../../src/components/FilterRuleEditor/OperatorSelector.tsx","../../src/components/FilterRuleEditor/ValueInputs/TextValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/NumberValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/DateValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/BooleanValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/ChoiceValueInput.tsx","../../src/components/FilterRuleEditor/ValueInputs/MultiChoiceValueInput.tsx","../../src/components/FilterRuleEditor/RuleRow.tsx","../../src/types/index.ts","../../src/components/FilterRuleEditor/FilterRuleEditor.tsx","../../src/components/FunnelStageBuilder/StageActions.tsx","../../src/components/FunnelStageBuilder/TagInput.tsx","../../src/components/FunnelStageBuilder/StageForm.tsx","../../src/components/FunnelStageBuilder/StageCard.tsx","../../src/components/FunnelStageBuilder/AddStageButton.tsx","../../src/components/FunnelStageBuilder/FunnelStageBuilder.tsx","../../src/components/FunnelRunHistory/RunFilters.tsx","../../src/components/FunnelRunHistory/RunStatusBadge.tsx","../../src/components/FunnelRunHistory/RunActions.tsx","../../src/components/FunnelRunHistory/utils.ts","../../src/components/FunnelRunHistory/RunRow.tsx","../../src/components/FunnelRunHistory/StageBreakdownList.tsx","../../src/components/FunnelRunHistory/RunDetailsModal.tsx","../../src/components/FunnelRunHistory/FunnelRunHistory.tsx"],"names":["useState","useEffect","jsxs","jsx","Fragment","Handle","Position","Panel","useMemo","useNodesState","useEdgesState","useCallback","ReactFlow","Background","BackgroundVariant","Controls","useSortable","CSS","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","statusConfig","useRef"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @startsimpli/funnels - Core Funnel Execution Engine\n *\n * BRUTALLY GENERIC - Works for ANY entity type:\n * - Investors, firms, contacts, organizations\n * - Recipes, ingredients, users\n * - Leads, tasks, projects\n * - GitHub repos, pull requests, issues\n *\n * The engine processes entities through stages sequentially,\n * evaluating rules and applying actions based on match results.\n */\n\nimport type {\n Funnel,\n FunnelStage,\n FilterRule,\n MatchAction,\n NoMatchAction,\n FunnelResult,\n StageResult,\n RuleResult,\n StageStats,\n} from '../types';\n\n// ============================================================================\n// Execution Result Types\n// ============================================================================\n\n/**\n * Complete result of funnel execution\n */\nexport interface ExecutionResult<T = any> {\n /** Entities that matched and are in output */\n matched: FunnelResult<T>[];\n\n /** Entities that were excluded */\n excluded: FunnelResult<T>[];\n\n /** Total entities processed */\n total_input: number;\n\n /** Total entities that matched */\n total_matched: number;\n\n /** Total entities excluded */\n total_excluded: number;\n\n /** Total entities tagged */\n total_tagged: number;\n\n /** Per-stage statistics */\n stage_stats: Record<string, StageStats>;\n\n /** Execution duration in milliseconds */\n duration_ms: number;\n\n /** Errors encountered (non-fatal) */\n errors?: string[];\n}\n\n// ============================================================================\n// BEAD: fund-your-startup-a0b8 - Funnel engine evaluateRule is a non-functional stub\n// evaluateRule always returns error='Evaluator not implemented yet' — funnels cannot match anything\n// resolveField should import from /packages/funnels/src/core/field-resolver.ts\n// ============================================================================\n\nfunction evaluateRule<T>(_entity: T, _rule: FilterRule): RuleResult {\n throw new Error('Not implemented - BEAD: fund-your-startup-a0b8. evaluateRule must import from rule evaluator.');\n // return {\n // field_path: _rule.field_path,\n // operator: _rule.operator,\n // value: _rule.value,\n // actual_value: undefined,\n // matched: false,\n // error: 'Evaluator not implemented yet',\n // };\n}\n\nfunction resolveField<T>(_entity: T, _fieldPath: string): any {\n throw new Error('Not implemented - BEAD: fund-your-startup-a0b8. resolveField must import from field-resolver.ts.');\n // const keys = _fieldPath.split('.');\n // let value: any = _entity;\n // for (const key of keys) {\n // if (value === null || value === undefined) return undefined;\n // value = value[key];\n // }\n // return value;\n}\n\n// ============================================================================\n// Funnel Engine\n// ============================================================================\n\n/**\n * Core funnel execution engine\n *\n * Processes entities through stages sequentially, evaluating rules\n * and applying actions based on match results.\n *\n * Generic over entity type T - works with ANY data structure.\n */\nexport class FunnelEngine<T = any> {\n /**\n * Execute a funnel on a set of entities\n *\n * @param funnel - The funnel definition to execute\n * @param entities - Input entities to process\n * @returns ExecutionResult with matched/excluded entities and stats\n */\n execute(funnel: Funnel<T>, entities: T[]): ExecutionResult<T> {\n const startTime = Date.now();\n\n // Initialize results\n const results: FunnelResult<T>[] = entities.map(entity => ({\n entity,\n matched: true, // Start as matched, exclude as needed\n accumulated_tags: [],\n context: {},\n stage_results: [],\n }));\n\n const stageStats: Record<string, StageStats> = {};\n const errors: string[] = [];\n\n // Sort stages by order\n const sortedStages = [...funnel.stages].sort((a, b) => a.order - b.order);\n\n // Process each stage sequentially\n for (const stage of sortedStages) {\n const stageStartTime = Date.now();\n\n // Track entities entering this stage\n const inputEntities = results.filter(r => r.matched && !r.excluded_at_stage);\n\n const stats: StageStats = {\n stage_id: stage.id,\n stage_name: stage.name,\n input_count: inputEntities.length,\n matched_count: 0,\n not_matched_count: 0,\n excluded_count: 0,\n tagged_count: 0,\n continued_count: 0,\n error_count: 0,\n };\n\n // Process each entity through this stage\n for (const result of inputEntities) {\n try {\n const stageResult = this.processStage(stage, result.entity);\n\n // Update entity result\n result.stage_results!.push(stageResult);\n\n // Apply stage result to entity\n if (stageResult.matched) {\n stats.matched_count++;\n } else {\n stats.not_matched_count++;\n }\n\n if (stageResult.tags_added && stageResult.tags_added.length > 0) {\n result.accumulated_tags.push(...stageResult.tags_added);\n stats.tagged_count++;\n }\n\n if (stageResult.context_added) {\n result.context = { ...result.context, ...stageResult.context_added };\n }\n\n if (stageResult.excluded) {\n result.matched = false;\n result.excluded_at_stage = stage.id;\n stats.excluded_count++;\n } else if (stageResult.continued) {\n stats.continued_count++;\n }\n } catch (error) {\n stats.error_count!++;\n errors.push(`Stage ${stage.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n stats.duration_ms = Date.now() - stageStartTime;\n stageStats[stage.id] = stats;\n }\n\n // Apply completion tags to matched entities\n if (funnel.completion_tags && funnel.completion_tags.length > 0) {\n for (const result of results) {\n if (result.matched) {\n result.accumulated_tags.push(...funnel.completion_tags);\n }\n }\n }\n\n // Separate matched and excluded\n const matched = results.filter(r => r.matched);\n const excluded = results.filter(r => !r.matched);\n\n // Count unique tagged entities\n const totalTagged = results.filter(r => r.accumulated_tags.length > 0).length;\n\n return {\n matched,\n excluded,\n total_input: entities.length,\n total_matched: matched.length,\n total_excluded: excluded.length,\n total_tagged: totalTagged,\n stage_stats: stageStats,\n duration_ms: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined,\n };\n }\n\n /**\n * Process a single entity through a stage\n *\n * @param stage - The stage to process\n * @param entity - The entity to evaluate\n * @returns StageResult with match status and actions taken\n */\n private processStage(stage: FunnelStage<T>, entity: T): StageResult {\n // Evaluate all rules\n const ruleResults: RuleResult[] = [];\n let matched = false;\n\n if (stage.custom_evaluator) {\n // Use custom evaluator if provided (highest priority)\n try {\n matched = stage.custom_evaluator(entity);\n } catch (error) {\n matched = false;\n }\n } else if (stage.rules.length === 0) {\n // No rules and no custom evaluator = always match\n matched = true;\n } else {\n // Evaluate rules with filter logic\n for (const rule of stage.rules) {\n const ruleResult = evaluateRule(entity, rule);\n ruleResults.push(ruleResult);\n }\n\n // Apply filter logic (AND/OR)\n if (stage.filter_logic === 'AND') {\n // All rules must match\n matched = ruleResults.every(r => r.matched);\n } else {\n // At least one rule must match\n matched = ruleResults.some(r => r.matched);\n }\n }\n\n // Determine action based on match result\n let action: MatchAction | NoMatchAction;\n let tagsAdded: string[] = [];\n let contextAdded: Record<string, any> | undefined;\n let excluded = false;\n let continued = false;\n\n if (matched) {\n action = stage.match_action;\n\n // Add match tags\n if (stage.match_tags && stage.match_tags.length > 0) {\n tagsAdded = [...stage.match_tags];\n }\n\n // Add match context\n if (stage.match_context) {\n contextAdded = stage.match_context;\n }\n\n // Apply match action\n switch (stage.match_action) {\n case 'continue':\n continued = true;\n break;\n case 'tag':\n // Tags added, stop processing\n excluded = true;\n break;\n case 'tag_continue':\n // Tags added, continue processing\n continued = true;\n break;\n case 'output':\n // Add to output, stop processing (but not excluded)\n continued = false;\n break;\n }\n } else {\n action = stage.no_match_action;\n\n // Add no-match tags\n if (stage.no_match_tags && stage.no_match_tags.length > 0) {\n tagsAdded = [...stage.no_match_tags];\n }\n\n // Apply no-match action\n switch (stage.no_match_action) {\n case 'continue':\n continued = true;\n break;\n case 'exclude':\n excluded = true;\n break;\n case 'tag_exclude':\n excluded = true;\n break;\n }\n }\n\n return {\n stage_id: stage.id,\n stage_name: stage.name,\n matched,\n rule_results: ruleResults.length > 0 ? ruleResults : undefined,\n action,\n tags_added: tagsAdded.length > 0 ? tagsAdded : undefined,\n context_added: contextAdded,\n excluded,\n continued,\n };\n }\n}\n","/**\n * useDebouncedValue Hook\n *\n * Returns a debounced version of the input value that only updates\n * after the specified delay has elapsed without changes.\n *\n * Use for expensive computations that shouldn't run on every keystroke.\n */\n\nimport { useEffect, useState } from 'react';\n\nexport function useDebouncedValue<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Set timeout to update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Cleanup: cancel timeout if value changes before delay elapses\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","/**\n * PreviewStats Component\n *\n * Progress bar showing matched vs excluded entities with percentage.\n *\n * Design Rationale:\n * - Horizontal progress bar shows match rate at a glance\n * - Green (matched) and red (excluded) create clear visual distinction\n * - Percentage provides quick understanding of funnel effectiveness\n * - Counts below bar provide exact numbers\n *\n * Accessibility:\n * - ARIA progressbar role for screen readers\n * - Text labels provide non-visual indication\n * - Sufficient color contrast\n */\n\ninterface PreviewStatsProps {\n totalMatched: number;\n totalExcluded: number;\n matchPercentage: number;\n className?: string;\n}\n\nexport function PreviewStats({\n totalMatched,\n totalExcluded,\n matchPercentage,\n className = '',\n}: PreviewStatsProps) {\n const total = totalMatched + totalExcluded;\n\n return (\n <div className={`space-y-2 ${className}`}>\n {/* Progress bar */}\n <div className=\"relative h-8 bg-gray-200 rounded-lg overflow-hidden\">\n <div\n className=\"absolute inset-y-0 left-0 bg-gradient-to-r from-green-500 to-green-600 transition-all duration-300 flex items-center justify-center\"\n style={{ width: `${matchPercentage}%` }}\n role=\"progressbar\"\n aria-valuenow={matchPercentage}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${totalMatched} of ${total} matched (${matchPercentage}%)`}\n >\n {matchPercentage > 15 && (\n <span className=\"text-xs font-semibold text-white\">\n {totalMatched.toLocaleString()}/{total.toLocaleString()} ({matchPercentage}%)\n </span>\n )}\n </div>\n {matchPercentage <= 15 && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span className=\"text-xs font-semibold text-gray-600\">\n {totalMatched.toLocaleString()}/{total.toLocaleString()} ({matchPercentage}%)\n </span>\n </div>\n )}\n </div>\n\n {/* Match/Exclude counts */}\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-sm bg-green-500\" />\n <span className=\"font-medium text-gray-700\">\n {totalMatched.toLocaleString()} Matched\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-sm bg-gray-300\" />\n <span className=\"font-medium text-gray-700\">\n {totalExcluded.toLocaleString()} Excluded\n </span>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * StageBreakdown Component\n *\n * Shows per-stage statistics in a funnel flow visualization.\n *\n * Design Rationale:\n * - Sequential list shows funnel flow from top to bottom\n * - Stage numbers (①②③) provide clear ordering\n * - Exclusion count (-N) shows entities removed at each stage\n * - Remaining count shows entities continuing to next stage\n * - Color coding: gray for excluded, green for final matched\n *\n * Accessibility:\n * - Semantic list structure\n * - Clear text labels for all metrics\n * - Color is supplementary to text\n */\n\nimport type { StageStats } from '../../types';\n\nexport interface StagePreviewStats {\n stage_id: string;\n stage_name: string;\n input_count: number;\n excluded_count: number;\n remaining_count: number;\n}\n\ninterface StageBreakdownProps {\n stageStats: Record<string, StagePreviewStats>;\n stages: Array<{ id: string; name: string; order: number }>;\n className?: string;\n}\n\nexport function StageBreakdown({\n stageStats,\n stages,\n className = '',\n}: StageBreakdownProps) {\n // Sort stages by order\n const sortedStages = [...stages].sort((a, b) => a.order - b.order);\n\n return (\n <div className={className}>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">\n Stage Breakdown\n </h3>\n\n <ol className=\"space-y-2\">\n {sortedStages.map((stage, index) => {\n const stats = stageStats[stage.id];\n if (!stats) return null;\n\n const isLast = index === sortedStages.length - 1;\n const excludedCount = stats.excluded_count;\n const remainingCount = stats.remaining_count;\n\n return (\n <li\n key={stage.id}\n className=\"flex items-center justify-between py-2 px-3 bg-gray-50 rounded-lg\"\n >\n {/* Stage info */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <span className=\"flex-shrink-0 w-6 h-6 flex items-center justify-center bg-blue-100 text-blue-700 rounded-full text-xs font-bold\">\n {index + 1}\n </span>\n <span className=\"text-sm font-medium text-gray-900 truncate\">\n {stage.name}\n </span>\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center gap-3 text-sm\">\n {excludedCount > 0 && (\n <span className=\"text-red-600 font-medium\">\n -{excludedCount.toLocaleString()}\n </span>\n )}\n <span\n className={`font-semibold ${\n isLast ? 'text-green-600' : 'text-gray-700'\n }`}\n >\n {remainingCount.toLocaleString()} {isLast ? 'final' : 'left'}\n </span>\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n","/**\n * EntityCard Component\n *\n * Displays a single entity in the preview list.\n * Supports custom rendering via render prop for entity-specific display.\n *\n * Design Rationale:\n * - Card design provides visual containment\n * - Border and shadow create depth\n * - Rounded corners match overall design system\n * - Render prop pattern keeps component BRUTALLY GENERIC\n *\n * Accessibility:\n * - Semantic article element for content\n * - Focus states for keyboard navigation\n */\n\nimport type { ReactNode } from 'react';\n\ninterface EntityCardProps {\n entity: any;\n renderEntity?: (entity: any) => ReactNode;\n className?: string;\n}\n\n/**\n * Default entity renderer\n * Shows entity name if available, otherwise shows JSON preview\n */\nfunction defaultEntityRenderer(entity: any): ReactNode {\n if (entity.name) {\n return (\n <div>\n <div className=\"font-medium text-gray-900\">{entity.name}</div>\n <div className=\"text-sm text-gray-600 mt-1\">\n {Object.keys(entity)\n .filter((key) => key !== 'name')\n .slice(0, 3)\n .map((key) => (\n <span key={key} className=\"mr-2\">\n {key}: {String(entity[key]).slice(0, 20)}\n </span>\n ))}\n </div>\n </div>\n );\n }\n\n // Fallback: show JSON preview\n return (\n <div className=\"text-sm text-gray-700 font-mono\">\n <pre className=\"whitespace-pre-wrap break-all\">\n {JSON.stringify(entity, null, 2).slice(0, 150)}\n {JSON.stringify(entity, null, 2).length > 150 ? '...' : ''}\n </pre>\n </div>\n );\n}\n\nexport function EntityCard({\n entity,\n renderEntity = defaultEntityRenderer,\n className = '',\n}: EntityCardProps) {\n return (\n <article\n className={`p-3 bg-white border border-gray-200 rounded-lg shadow-sm hover:border-gray-300 transition-colors ${className}`}\n >\n {renderEntity(entity)}\n </article>\n );\n}\n","/**\n * LoadingPreview Component\n *\n * Skeleton loading state for FunnelPreview.\n *\n * Design Rationale:\n * - Skeleton shapes match actual content layout\n * - Pulse animation indicates loading\n * - Gray placeholders maintain visual hierarchy\n * - Reduces perceived loading time\n *\n * Accessibility:\n * - ARIA live region announces loading state\n * - Screen readers informed of status change\n */\n\nexport function LoadingPreview() {\n return (\n <div className=\"animate-pulse\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">Loading preview...</span>\n\n {/* Stats bar skeleton */}\n <div className=\"space-y-2 mb-6\">\n <div className=\"h-8 bg-gray-200 rounded-lg\" />\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-32 bg-gray-200 rounded\" />\n <div className=\"h-4 w-32 bg-gray-200 rounded\" />\n </div>\n </div>\n\n {/* Stage breakdown skeleton */}\n <div className=\"mb-6\">\n <div className=\"h-5 w-40 bg-gray-200 rounded mb-3\" />\n <div className=\"space-y-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-12 bg-gray-100 rounded-lg flex items-center px-3 gap-3\"\n >\n <div className=\"w-6 h-6 bg-gray-200 rounded-full\" />\n <div className=\"h-4 bg-gray-200 rounded flex-1\" />\n <div className=\"h-4 w-16 bg-gray-200 rounded\" />\n </div>\n ))}\n </div>\n </div>\n\n {/* Entity cards skeleton */}\n <div className=\"space-y-3\">\n <div className=\"h-5 w-48 bg-gray-200 rounded mb-3\" />\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-20 bg-gray-100 border border-gray-200 rounded-lg p-3\">\n <div className=\"h-4 bg-gray-200 rounded w-3/4 mb-2\" />\n <div className=\"h-3 bg-gray-200 rounded w-1/2\" />\n </div>\n ))}\n </div>\n </div>\n );\n}\n","/**\n * FunnelPreview Component\n *\n * Real-time preview of funnel execution on sample entities.\n *\n * Design Goal:\n * Users should immediately see how their funnel configuration affects entities.\n * Preview updates automatically as they edit rules, providing instant feedback\n * on match rates and stage-by-stage filtering results.\n *\n * Visual Hierarchy Rationale:\n * 1. Match stats bar (top) - Most important: overall funnel effectiveness\n * 2. Stage breakdown - Shows filtering flow and where entities drop off\n * 3. Sample entities - Concrete examples of what matched\n *\n * Interaction Notes:\n * - Debounced updates (300ms) prevent excessive computation during editing\n * - Loading skeleton maintains layout and reduces perceived lag\n * - Custom entity renderer via render prop for domain-specific display\n *\n * Responsive Behavior:\n * - Single column layout works on all screen sizes\n * - Entity cards stack vertically\n * - Stage breakdown scrolls horizontally on mobile if needed\n *\n * Accessibility Considerations:\n * - ARIA live region announces when preview updates\n * - Loading state communicated to screen readers\n * - All metrics have text labels (color is supplementary)\n * - Keyboard navigation through entity cards\n *\n * Component Specification:\n * - States: loading, empty (no matches), populated\n * - Behaviors: auto-compute on funnel/entity changes\n * - Variations: with/without custom entity renderer\n */\n\nimport { useEffect, useState, type ReactNode } from 'react';\nimport type { Funnel } from '../../types';\nimport { FunnelEngine, type ExecutionResult } from '../../core/engine';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { PreviewStats } from './PreviewStats';\nimport { StageBreakdown, type StagePreviewStats } from './StageBreakdown';\nimport { EntityCard } from './EntityCard';\nimport { LoadingPreview } from './LoadingPreview';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PreviewResult {\n totalMatched: number;\n totalExcluded: number;\n matchPercentage: number;\n previewEntities: any[];\n stageStats: Record<string, StagePreviewStats>;\n}\n\nexport interface FunnelPreviewProps {\n funnel: Funnel;\n sampleEntities: any[];\n onPreview?: (result: PreviewResult) => void;\n renderEntity?: (entity: any) => ReactNode;\n maxPreviewEntities?: number;\n className?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert ExecutionResult to PreviewResult\n */\nfunction convertToPreviewResult(\n execResult: ExecutionResult,\n maxEntities: number = 10\n): PreviewResult {\n const { matched, total_matched, total_excluded, stage_stats } = execResult;\n\n // Calculate match percentage\n const total = total_matched + total_excluded;\n const matchPercentage =\n total > 0 ? Math.round((total_matched / total) * 100) : 0;\n\n // Get preview entities (first N matched)\n const previewEntities = matched.slice(0, maxEntities).map((r) => r.entity);\n\n // Convert stage stats to preview format\n const previewStageStats: Record<string, StagePreviewStats> = {};\n\n Object.entries(stage_stats).forEach(([stageId, stats]) => {\n previewStageStats[stageId] = {\n stage_id: stats.stage_id,\n stage_name: stats.stage_name,\n input_count: stats.input_count,\n excluded_count: stats.excluded_count,\n remaining_count: stats.input_count - stats.excluded_count,\n };\n });\n\n return {\n totalMatched: total_matched,\n totalExcluded: total_excluded,\n matchPercentage,\n previewEntities,\n stageStats: previewStageStats,\n };\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FunnelPreview({\n funnel,\n sampleEntities,\n onPreview,\n renderEntity,\n maxPreviewEntities = 10,\n className = '',\n}: FunnelPreviewProps) {\n const [result, setResult] = useState<PreviewResult | null>(null);\n const [isComputing, setIsComputing] = useState(false);\n\n // Debounce funnel to avoid excessive computation\n const debouncedFunnel = useDebouncedValue(funnel, 300);\n\n // Compute preview when funnel or entities change\n useEffect(() => {\n async function compute() {\n setIsComputing(true);\n\n try {\n const engine = new FunnelEngine();\n const execResult = engine.execute(debouncedFunnel, sampleEntities);\n const previewResult = convertToPreviewResult(\n execResult,\n maxPreviewEntities\n );\n\n setResult(previewResult);\n\n // Notify parent component\n if (onPreview) {\n onPreview(previewResult);\n }\n } catch (error) {\n console.error('Preview computation failed:', error);\n // Set empty result on error\n setResult({\n totalMatched: 0,\n totalExcluded: sampleEntities.length,\n matchPercentage: 0,\n previewEntities: [],\n stageStats: {},\n });\n } finally {\n setIsComputing(false);\n }\n }\n\n compute();\n }, [debouncedFunnel, sampleEntities, maxPreviewEntities, onPreview]);\n\n // Loading state\n if (isComputing && !result) {\n return (\n <div className={className}>\n <LoadingPreview />\n </div>\n );\n }\n\n // No result yet\n if (!result) {\n return null;\n }\n\n const { totalMatched, totalExcluded, matchPercentage, previewEntities, stageStats } =\n result;\n\n return (\n <div className={className} role=\"region\" aria-label=\"Funnel preview\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Preview Results\n </h2>\n\n {/* Match stats */}\n <PreviewStats\n totalMatched={totalMatched}\n totalExcluded={totalExcluded}\n matchPercentage={matchPercentage}\n className=\"mb-6\"\n />\n\n {/* Stage breakdown */}\n {funnel.stages.length > 0 && (\n <StageBreakdown\n stageStats={stageStats}\n stages={funnel.stages}\n className=\"mb-6\"\n />\n )}\n\n {/* Sample matches */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">\n Sample Matches ({Math.min(previewEntities.length, maxPreviewEntities)} of{' '}\n {totalMatched.toLocaleString()})\n </h3>\n\n {previewEntities.length === 0 ? (\n <div className=\"p-8 text-center bg-gray-50 rounded-lg border-2 border-dashed border-gray-300\">\n <p className=\"text-gray-600\">No entities matched this funnel</p>\n <p className=\"text-sm text-gray-500 mt-1\">\n Try adjusting your filter rules\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {previewEntities.map((entity, index) => (\n <EntityCard\n key={index}\n entity={entity}\n renderEntity={renderEntity}\n />\n ))}\n {totalMatched > maxPreviewEntities && (\n <div className=\"text-center py-2 text-sm text-gray-500\">\n + {(totalMatched - maxPreviewEntities).toLocaleString()} more...\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Loading overlay */}\n {isComputing && (\n <div className=\"absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center rounded-lg\">\n <div className=\"flex items-center gap-2 text-gray-600\">\n <div className=\"w-5 h-5 border-2 border-gray-300 border-t-blue-600 rounded-full animate-spin\" />\n <span className=\"text-sm font-medium\">Updating preview...</span>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * StatusBadge Component\n *\n * Displays funnel status as a color-coded pill badge.\n *\n * Design Rationale:\n * - Pill shape provides soft, approachable aesthetic\n * - Color coding enables instant status recognition\n * - Uppercase text improves scannability\n */\n\nimport { FunnelStatus } from '../../types';\n\ninterface StatusBadgeProps {\n status: FunnelStatus;\n className?: string;\n}\n\nconst statusConfig: Record<FunnelStatus, { color: string; bgColor: string; label: string }> = {\n active: {\n color: 'text-green-800',\n bgColor: 'bg-green-100',\n label: 'ACTIVE',\n },\n draft: {\n color: 'text-yellow-800',\n bgColor: 'bg-yellow-100',\n label: 'DRAFT',\n },\n paused: {\n color: 'text-gray-800',\n bgColor: 'bg-gray-100',\n label: 'PAUSED',\n },\n archived: {\n color: 'text-red-800',\n bgColor: 'bg-red-100',\n label: 'ARCHIVED',\n },\n};\n\nexport function StatusBadge({ status, className = '' }: StatusBadgeProps) {\n const config = statusConfig[status];\n\n return (\n <span\n className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${config.bgColor} ${config.color} ${className}`}\n >\n {config.label}\n </span>\n );\n}\n","/**\n * StageIndicator Component\n *\n * Displays a numbered circle badge for funnel stages with connecting vertical line.\n *\n * Design Rationale:\n * - Numbered circles (①②③) provide clear sequential ordering\n * - Vertical connecting line shows flow/progression\n * - Compact layout conserves vertical space\n * - Gray text for rule count de-emphasizes secondary info\n *\n * Accessibility:\n * - Sufficient color contrast (4.5:1 minimum)\n * - Semantic HTML structure\n */\n\ninterface StageIndicatorProps {\n order: number;\n name: string;\n ruleCount: number;\n isLast?: boolean;\n className?: string;\n}\n\nexport function StageIndicator({\n order,\n name,\n ruleCount,\n isLast = false,\n className = ''\n}: StageIndicatorProps) {\n // Format order as circled number (1-20 supported by Unicode)\n const circledNumber = order < 20\n ? String.fromCharCode(9312 + order) // ① = U+2460\n : `(${order + 1})`;\n\n return (\n <div className={`flex items-start gap-2 ${className}`}>\n {/* Stage number circle with connecting line */}\n <div className=\"flex flex-col items-center\">\n <div className=\"flex-shrink-0 w-6 h-6 rounded-full bg-blue-100 text-blue-800 flex items-center justify-center text-sm font-medium\">\n {circledNumber}\n </div>\n {!isLast && (\n <div className=\"w-0.5 h-6 bg-gray-200 mt-1\" />\n )}\n </div>\n\n {/* Stage name and rule count */}\n <div className=\"flex-1 pt-0.5 min-w-0\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-sm font-medium text-gray-900 truncate\">\n {name}\n </span>\n <span className=\"text-xs text-gray-500 whitespace-nowrap\">\n {ruleCount} {ruleCount === 1 ? 'rule' : 'rules'}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * MatchBar Component\n *\n * Progress bar showing match percentage with count label.\n *\n * Design Rationale:\n * - Green gradient conveys success/completion\n * - Rounded corners match card aesthetic\n * - Label shows absolute count (more actionable than percentage alone)\n * - Gray background shows full scale\n *\n * Accessibility:\n * - Text label provides non-visual indication of value\n * - Sufficient contrast between bar and background\n */\n\ninterface MatchBarProps {\n matched: number;\n total: number;\n className?: string;\n}\n\nexport function MatchBar({ matched, total, className = '' }: MatchBarProps) {\n const percentage = total > 0 ? Math.round((matched / total) * 100) : 0;\n\n return (\n <div className={`space-y-1 ${className}`}>\n {/* Progress bar */}\n <div className=\"relative h-6 bg-gray-200 rounded-md overflow-hidden\">\n <div\n className=\"absolute inset-y-0 left-0 bg-gradient-to-r from-green-500 to-green-600 transition-all duration-300\"\n style={{ width: `${percentage}%` }}\n role=\"progressbar\"\n aria-valuenow={percentage}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${matched} of ${total} matched`}\n />\n </div>\n\n {/* Match count label */}\n <div className=\"text-right\">\n <span className=\"text-sm font-medium text-gray-700\">\n {matched.toLocaleString()} matched\n </span>\n </div>\n </div>\n );\n}\n","/**\n * FunnelStats Component\n *\n * Three-column stats display showing INPUT / MATCHED / EXCLUDED counts.\n *\n * Design Rationale:\n * - Three equal columns for balance\n * - Color coding: Blue (input/neutral), Green (matched/success), Red (excluded/warning)\n * - Large numbers draw attention to key metrics\n * - Labels use uppercase for consistency with status badge\n *\n * Accessibility:\n * - Semantic HTML (dl/dt/dd structure)\n * - Color is supplementary (text labels provide meaning)\n */\n\ninterface FunnelStatsProps {\n input: number;\n matched: number;\n excluded: number;\n className?: string;\n}\n\nexport function FunnelStats({\n input,\n matched,\n excluded,\n className = ''\n}: FunnelStatsProps) {\n const stats = [\n {\n label: 'INPUT',\n value: input,\n color: 'text-blue-600',\n bgColor: 'bg-blue-50'\n },\n {\n label: 'MATCHED',\n value: matched,\n color: 'text-green-600',\n bgColor: 'bg-green-50'\n },\n {\n label: 'EXCLUDED',\n value: excluded,\n color: 'text-red-600',\n bgColor: 'bg-red-50'\n },\n ];\n\n return (\n <dl className={`grid grid-cols-3 gap-2 ${className}`}>\n {stats.map(({ label, value, color, bgColor }) => (\n <div\n key={label}\n className={`${bgColor} rounded-lg px-3 py-2.5 text-center`}\n >\n <dt className=\"text-xs font-medium text-gray-600 mb-1\">\n {label}\n </dt>\n <dd className={`text-lg font-bold ${color}`}>\n {value.toLocaleString()}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n","/**\n * FunnelCard Component\n *\n * Main card component displaying funnel overview with stages, match stats, and actions.\n *\n * Design Goal:\n * Users should be able to quickly assess funnel health, understand its structure,\n * and take action (view details) without cognitive overload.\n *\n * Visual Hierarchy:\n * 1. Funnel name + status (primary identification)\n * 2. Description (context)\n * 3. Stage flow (structure understanding)\n * 4. Match bar (visual performance indicator)\n * 5. Stats (detailed performance metrics)\n * 6. Action button (next step)\n *\n * Layout: Card with white background, shadow, rounded corners (matches Django admin aesthetic)\n *\n * Responsive Behavior:\n * - Mobile (< 640px): Full width, stack all elements\n * - Tablet (640px - 1024px): Constrained width, same vertical layout\n * - Desktop (> 1024px): Max width with horizontal centering possible\n *\n * Accessibility:\n * - Semantic HTML (article, header, section, footer)\n * - ARIA labels for interactive elements\n * - Keyboard navigation support\n * - Color contrast meets WCAG AA (4.5:1)\n * - Focus indicators on interactive elements\n *\n * Interaction Notes:\n * - Card hover: subtle elevation increase (shadow deepens)\n * - Button hover: background darkens, arrow shifts right\n * - Button focus: ring outline for keyboard navigation\n * - Click zones: entire button is clickable, not just text\n *\n * Performance:\n * - No images (icon-free design)\n * - CSS-only animations\n * - Efficient re-renders (React.memo potential)\n */\n\nimport { Funnel, FunnelRun } from '../../types';\nimport { StatusBadge } from './StatusBadge';\nimport { StageIndicator } from './StageIndicator';\nimport { MatchBar } from './MatchBar';\nimport { FunnelStats } from './FunnelStats';\n\nexport interface FunnelCardProps {\n /** Funnel definition (BRUTALLY GENERIC - works for any entity type) */\n funnel: Funnel;\n\n /** Latest run results (optional - shows \"no runs yet\" state if missing) */\n latestRun?: FunnelRun;\n\n /** Callback when \"View Flow\" is clicked */\n onViewFlow?: (funnel: Funnel) => void;\n\n /** Callback when edit action is triggered (future: click on card header) */\n onEdit?: (funnel: Funnel) => void;\n\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function FunnelCard({\n funnel,\n latestRun,\n onViewFlow,\n onEdit,\n className = ''\n}: FunnelCardProps) {\n // Extract stats from latest run or use zeros\n const stats = latestRun ? {\n input: latestRun.total_input,\n matched: latestRun.total_matched,\n excluded: latestRun.total_excluded,\n } : {\n input: 0,\n matched: 0,\n excluded: 0,\n };\n\n const handleViewFlow = () => {\n if (onViewFlow) {\n onViewFlow(funnel);\n }\n };\n\n const hasRun = latestRun && latestRun.status === 'completed';\n\n return (\n <article\n className={`bg-white rounded-lg border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200 ${className}`}\n aria-label={`Funnel: ${funnel.name}`}\n >\n {/* Header: Name + Status Badge */}\n <header className=\"px-6 pt-5 pb-3 border-b border-gray-100\">\n <div className=\"flex items-start justify-between gap-3\">\n <h3 className=\"text-lg font-semibold text-gray-900 flex-1 min-w-0\">\n {funnel.name}\n </h3>\n <StatusBadge status={funnel.status} />\n </div>\n {funnel.description && (\n <p className=\"mt-2 text-sm text-gray-600 line-clamp-2\">\n {funnel.description}\n </p>\n )}\n </header>\n\n {/* Stage List */}\n <section\n className=\"px-6 py-4 space-y-0\"\n aria-label=\"Funnel stages\"\n >\n {funnel.stages.length === 0 ? (\n <div className=\"text-sm text-gray-500 italic py-4 text-center\">\n No stages defined\n </div>\n ) : (\n funnel.stages.map((stage, index) => (\n <StageIndicator\n key={stage.id}\n order={index}\n name={stage.name}\n ruleCount={stage.rules.length}\n isLast={index === funnel.stages.length - 1}\n />\n ))\n )}\n </section>\n\n {/* Match Visualization */}\n {hasRun && (\n <section\n className=\"px-6 py-4 border-t border-gray-100\"\n aria-label=\"Match results\"\n >\n <MatchBar\n matched={stats.matched}\n total={stats.input}\n />\n </section>\n )}\n\n {/* Stats Row */}\n {hasRun && (\n <section\n className=\"px-6 py-4 border-t border-gray-100\"\n aria-label=\"Funnel statistics\"\n >\n <FunnelStats\n input={stats.input}\n matched={stats.matched}\n excluded={stats.excluded}\n />\n </section>\n )}\n\n {/* No Run State */}\n {!hasRun && (\n <section\n className=\"px-6 py-4 border-t border-gray-100 text-center\"\n aria-label=\"Funnel status\"\n >\n <p className=\"text-sm text-gray-500\">\n {latestRun?.status === 'failed'\n ? 'Last run failed'\n : latestRun?.status === 'running'\n ? 'Running...'\n : 'No runs yet'}\n </p>\n </section>\n )}\n\n {/* Footer: Action Button */}\n <footer className=\"px-6 py-4 border-t border-gray-100\">\n <button\n onClick={handleViewFlow}\n className=\"w-full inline-flex items-center justify-center gap-2 px-4 py-2.5 bg-gray-50 hover:bg-gray-100 text-gray-900 text-sm font-medium rounded-md transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n aria-label={`View flow details for ${funnel.name}`}\n >\n <span>View Flow</span>\n <svg\n className=\"w-4 h-4 transition-transform group-hover:translate-x-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\n />\n </svg>\n </button>\n </footer>\n </article>\n );\n}\n","/**\n * StageNode Component\n *\n * Custom React Flow node representing a funnel stage.\n *\n * Visual Design:\n * - Circled number indicator (①②③)\n * - Stage name (truncated if too long)\n * - Rule count\n * - Match/exclude counts (if run data available)\n * - Color-coded border based on action type\n *\n * Color Coding:\n * - Continue: Blue (#3b82f6)\n * - Exclude/Tag+Exclude: Red (#ef4444)\n * - Tag/Tag+Continue: Yellow (#eab308)\n * - Output: Green (#22c55e)\n *\n * Interaction:\n * - Hover: Border darkens, shadow increases\n * - Click: Triggers onStageClick callback\n * - Focus: Keyboard accessible with ring outline\n *\n * Accessibility:\n * - Semantic HTML with proper roles\n * - ARIA labels for screen readers\n * - Keyboard navigation support\n */\n\nimport React from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { FunnelStage, StageStats, MatchAction, NoMatchAction } from '../../types';\nimport { getCircledNumber } from './FunnelVisualFlow';\n\nexport interface StageNodeData {\n stage: FunnelStage;\n stats?: StageStats;\n onStageClick?: (stage: FunnelStage) => void;\n}\n\n/**\n * Get color based on stage actions\n */\nfunction getStageColor(stage: FunnelStage): string {\n // Primary action determines color\n const matchAction = stage.match_action;\n const noMatchAction = stage.no_match_action;\n\n // Output stages are green\n if (matchAction === 'output') {\n return '#22c55e'; // green-500\n }\n\n // Exclude stages are red\n if (noMatchAction === 'exclude' || noMatchAction === 'tag_exclude') {\n return '#ef4444'; // red-500\n }\n\n // Tag stages are yellow\n if (matchAction === 'tag' || matchAction === 'tag_continue') {\n return '#eab308'; // yellow-500\n }\n\n // Default: continue is blue\n return '#3b82f6'; // blue-500\n}\n\n/**\n * Get action label for display\n */\nfunction getActionLabel(stage: FunnelStage): string {\n const matchAction = stage.match_action;\n const noMatchAction = stage.no_match_action;\n\n if (matchAction === 'output') return 'Output';\n if (noMatchAction === 'exclude') return 'Exclude Non-Matches';\n if (noMatchAction === 'tag_exclude') return 'Tag & Exclude';\n if (matchAction === 'tag') return 'Tag Matches';\n if (matchAction === 'tag_continue') return 'Tag & Continue';\n\n return 'Continue';\n}\n\nexport function StageNode({ data }: NodeProps) {\n const { stage, stats, onStageClick } = data as unknown as StageNodeData;\n const color = getStageColor(stage);\n const actionLabel = getActionLabel(stage);\n\n const handleClick = () => {\n if (onStageClick) {\n onStageClick(stage);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n\n return (\n <>\n {/* Input handle (top) - hidden for first stage */}\n <Handle\n type=\"target\"\n position={Position.Top}\n style={{ background: color, opacity: 0 }}\n isConnectable={false}\n />\n\n <div\n className=\"stage-node\"\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={`Stage ${stage.order + 1}: ${stage.name}`}\n style={{\n borderColor: color,\n borderWidth: '2px',\n borderStyle: 'solid',\n }}\n >\n {/* Stage number */}\n <div className=\"stage-number\" style={{ color }}>\n {getCircledNumber(stage.order + 1)}\n </div>\n\n {/* Stage name */}\n <div className=\"stage-name\" title={stage.name}>\n {stage.name}\n </div>\n\n {/* Rule count */}\n <div className=\"stage-rules\">\n {stage.rules.length} {stage.rules.length === 1 ? 'rule' : 'rules'}\n </div>\n\n {/* Action label */}\n <div className=\"stage-action\" style={{ color }}>\n {actionLabel}\n </div>\n\n {/* Stats (if available) */}\n {stats && (\n <div className=\"stage-stats\">\n <div className=\"stat-row\">\n <span className=\"stat-label\">Input:</span>\n <span className=\"stat-value\">{stats.input_count}</span>\n </div>\n <div className=\"stat-row\">\n <span className=\"stat-label\">Matched:</span>\n <span className=\"stat-value text-green-600\">\n {stats.matched_count}\n </span>\n </div>\n {stats.excluded_count > 0 && (\n <div className=\"stat-row\">\n <span className=\"stat-label\">Excluded:</span>\n <span className=\"stat-value text-red-600\">\n {stats.excluded_count}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Description tooltip */}\n {stage.description && (\n <div className=\"stage-description\" title={stage.description}>\n {stage.description.length > 50\n ? `${stage.description.substring(0, 50)}...`\n : stage.description}\n </div>\n )}\n </div>\n\n {/* Output handle (bottom) - hidden for last stage */}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n style={{ background: color, opacity: 0 }}\n isConnectable={false}\n />\n </>\n );\n}\n","/**\n * FlowLegend Component\n *\n * Legend explaining the color coding of funnel stages.\n *\n * Design:\n * - Minimal, non-intrusive panel in bottom-right\n * - Color swatches with labels\n * - Collapsible to save space\n *\n * Colors:\n * - Blue: Continue to next stage\n * - Red: Exclude entities\n * - Yellow: Tag entities\n * - Green: Final output\n */\n\nimport React, { useState } from 'react';\nimport { Panel } from '@xyflow/react';\n\nexport function FlowLegend() {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const legendItems = [\n { color: '#3b82f6', label: 'Continue' },\n { color: '#ef4444', label: 'Exclude' },\n { color: '#eab308', label: 'Tag' },\n { color: '#22c55e', label: 'Output' },\n ];\n\n return (\n <Panel position=\"bottom-right\" className=\"flow-legend-panel\">\n <div className=\"flow-legend\">\n <button\n className=\"legend-toggle\"\n onClick={() => setIsExpanded(!isExpanded)}\n aria-label={isExpanded ? 'Collapse legend' : 'Expand legend'}\n >\n <span className=\"legend-title\">Legend</span>\n <svg\n className={`legend-chevron ${isExpanded ? 'expanded' : ''}`}\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {isExpanded && (\n <div className=\"legend-items\">\n {legendItems.map((item) => (\n <div key={item.label} className=\"legend-item\">\n <div\n className=\"legend-color\"\n style={{\n backgroundColor: item.color,\n border: `2px solid ${item.color}`,\n }}\n />\n <span className=\"legend-label\">{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </Panel>\n );\n}\n","/**\n * FunnelVisualFlow Component\n *\n * Interactive funnel visualization using React Flow.\n * Shows stages as nodes in a vertical flow with edges connecting them.\n *\n * Design Goals:\n * - Clear visual hierarchy of funnel stages\n * - Show entity counts and exclusions between stages\n * - Interactive - click stages for details, edges for excluded entities\n * - Auto-layout with vertical flow\n * - Color-coded by action type\n *\n * Visual Layout:\n * ```\n * ┌──────────────────────┐\n * │ ① High ICP Score │\n * │ 3 rules │\n * │ 500/1000 matched │\n * └──────────────────────┘\n * ↓ -500\n * ┌──────────────────────┐\n * │ ② Frontend Stack │\n * │ 2 rules │\n * │ 350/500 matched │\n * └──────────────────────┘\n * ```\n *\n * Node Colors (based on action):\n * - Continue: Blue\n * - Exclude: Red\n * - Tag: Yellow\n * - Output: Green\n *\n * Accessibility:\n * - Keyboard navigation via React Flow controls\n * - ARIA labels on interactive elements\n * - Color + text indicators (not color alone)\n *\n * Performance:\n * - Memoized node/edge calculations\n * - React Flow's built-in virtualization for large graphs\n * - CSS-only styling (no images)\n */\n\nimport React, { useMemo, useCallback } from 'react';\nimport {\n ReactFlow,\n Node,\n Edge,\n Controls,\n Background,\n BackgroundVariant,\n NodeTypes,\n useNodesState,\n useEdgesState,\n OnNodesChange,\n OnEdgesChange,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\n\nimport { Funnel, FunnelStage, FunnelRun } from '../../types';\nimport { StageNode } from './StageNode';\nimport { FlowLegend } from './FlowLegend';\nimport './FunnelVisualFlow.css';\n\nexport interface FunnelVisualFlowProps {\n /** Funnel definition */\n funnel: Funnel;\n\n /** Optional run data for showing counts */\n runData?: FunnelRun;\n\n /** Callback when stage node is clicked */\n onStageClick?: (stage: FunnelStage) => void;\n\n /** Callback when edge is clicked (fromStageId, toStageId) */\n onEdgeClick?: (fromStage: string, toStage: string) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Height of the flow container (default: 600px) */\n height?: number | string;\n}\n\n/**\n * Get excluded count between two stages\n */\nfunction getExcludedCount(\n runData: FunnelRun,\n fromStageId: string,\n toStageId: string\n): number {\n const fromStats = runData.stage_stats[fromStageId];\n const toStats = runData.stage_stats[toStageId];\n\n if (!fromStats || !toStats) return 0;\n\n // Calculate how many entities didn't continue to next stage\n return fromStats.continued_count - toStats.input_count;\n}\n\n/**\n * Generate circled numbers for stage indicators (①②③)\n */\nexport function getCircledNumber(num: number): string {\n const circledNumbers = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩'];\n return num <= 10 ? circledNumbers[num - 1] : `${num}`;\n}\n\nconst VERTICAL_SPACING = 180;\nconst HORIZONTAL_CENTER = 250;\n\nexport function FunnelVisualFlow({\n funnel,\n runData,\n onStageClick,\n onEdgeClick,\n className = '',\n height = 600,\n}: FunnelVisualFlowProps) {\n // Define custom node types\n const nodeTypes = useMemo(\n () => ({\n stageNode: StageNode,\n }),\n []\n );\n\n // Build nodes from funnel stages\n const initialNodes: Node[] = useMemo(() => {\n return funnel.stages.map((stage, index) => {\n const stats = runData?.stage_stats?.[stage.id];\n\n return {\n id: stage.id,\n type: 'stageNode',\n position: { x: HORIZONTAL_CENTER, y: index * VERTICAL_SPACING },\n data: {\n stage,\n stats,\n onStageClick,\n },\n };\n });\n }, [funnel.stages, runData, onStageClick]);\n\n // Build edges between stages\n const initialEdges: Edge[] = useMemo(() => {\n if (funnel.stages.length < 2) return [];\n\n return funnel.stages.slice(0, -1).map((stage, index) => {\n const nextStage = funnel.stages[index + 1];\n const excludedCount = runData\n ? getExcludedCount(runData, stage.id, nextStage.id)\n : undefined;\n\n return {\n id: `${stage.id}-${nextStage.id}`,\n source: stage.id,\n target: nextStage.id,\n label: excludedCount !== undefined ? `-${excludedCount}` : '',\n animated: true,\n style: { stroke: '#94a3b8', strokeWidth: 2 },\n labelStyle: { fill: '#ef4444', fontWeight: 600 },\n labelBgStyle: { fill: '#fef2f2', fillOpacity: 0.9 },\n };\n });\n }, [funnel.stages, runData]);\n\n const [nodes, , onNodesChange] = useNodesState(initialNodes);\n const [edges, , onEdgesChange] = useEdgesState(initialEdges);\n\n // Handle edge clicks\n const handleEdgeClick = useCallback(\n (event: React.MouseEvent, edge: Edge) => {\n if (onEdgeClick) {\n onEdgeClick(edge.source, edge.target);\n }\n },\n [onEdgeClick]\n );\n\n // Empty state\n if (funnel.stages.length === 0) {\n return (\n <div\n className={`funnel-visual-flow-empty ${className}`}\n style={{ height }}\n >\n <div className=\"empty-state\">\n <p className=\"text-gray-500 text-sm\">No stages to visualize</p>\n <p className=\"text-gray-400 text-xs mt-1\">\n Add stages to see the funnel flow\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`funnel-visual-flow ${className}`} style={{ height }}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onEdgeClick={handleEdgeClick}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{\n padding: 0.2,\n includeHiddenNodes: false,\n }}\n minZoom={0.5}\n maxZoom={1.5}\n defaultViewport={{ x: 0, y: 0, zoom: 1 }}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={true}\n >\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n <Controls showInteractive={false} />\n <FlowLegend />\n </ReactFlow>\n </div>\n );\n}\n","/**\n * LogicToggle Component\n *\n * Toggle between AND/OR filter logic.\n *\n * Design Goal:\n * Users need to switch between requiring all rules to match (AND)\n * or any rule to match (OR).\n *\n * Visual Hierarchy Rationale:\n * - Radio button pattern is familiar and clearly shows mutually exclusive options\n * - Horizontal layout keeps it compact\n * - Blue accent color indicates selected state\n * - Label explains the logic clearly\n *\n * Interaction Notes:\n * - Click either option to change logic\n * - Visual feedback on hover and focus\n * - Keyboard accessible (Tab to focus, Arrow keys to change)\n */\n\nimport { FilterLogic } from '../../types';\n\ninterface LogicToggleProps {\n logic: FilterLogic;\n onChange: (logic: FilterLogic) => void;\n className?: string;\n}\n\nexport function LogicToggle({ logic, onChange, className = '' }: LogicToggleProps) {\n return (\n <div className={`flex items-center gap-4 ${className}`}>\n <span className=\"text-sm font-medium text-gray-700\">Logic:</span>\n\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"filter-logic\"\n value=\"AND\"\n checked={logic === 'AND'}\n onChange={(e) => onChange(e.target.value as FilterLogic)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">\n AND <span className=\"text-xs text-gray-500\">(all must match)</span>\n </span>\n </label>\n\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"filter-logic\"\n value=\"OR\"\n checked={logic === 'OR'}\n onChange={(e) => onChange(e.target.value as FilterLogic)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">\n OR <span className=\"text-xs text-gray-500\">(any can match)</span>\n </span>\n </label>\n </div>\n );\n}\n","/**\n * FieldSelector Component\n *\n * Dropdown for selecting a field from the field registry, grouped by category.\n *\n * Design Goal:\n * Users need to select from potentially dozens of fields. Grouping by category\n * (Profile, Investment, Metrics, etc.) makes fields easier to find.\n *\n * Visual Hierarchy Rationale:\n * - Categories shown with indentation for visual hierarchy\n * - Field names indented under categories\n * - Selected field shown in dropdown button\n * - Full-width for consistency with other inputs\n *\n * Interaction Notes:\n * - Click to open dropdown\n * - Category labels are not selectable (disabled options)\n * - Field selection updates the rule\n * - Keyboard navigation supported\n *\n * Responsive Behavior:\n * - Full width on all screen sizes\n * - Dropdown scrolls if too many options\n *\n * Accessibility Considerations:\n * - Proper label association\n * - Category grouping preserved in select\n * - Focus visible on keyboard navigation\n */\n\nimport { FieldDefinition } from '../../types';\n\ninterface FieldSelectorProps {\n fields: FieldDefinition[];\n value: string;\n onChange: (fieldName: string) => void;\n error?: string;\n className?: string;\n}\n\nexport function FieldSelector({\n fields,\n value,\n onChange,\n error,\n className = '',\n}: FieldSelectorProps) {\n // Group fields by category\n const grouped = fields.reduce((acc, field) => {\n const category = field.category || 'Other';\n if (!acc[category]) {\n acc[category] = [];\n }\n acc[category].push(field);\n return acc;\n }, {} as Record<string, FieldDefinition[]>);\n\n const categories = Object.keys(grouped).sort();\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"field-selector\" className=\"text-xs font-medium text-gray-700\">\n Field\n </label>\n <select\n id=\"field-selector\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">Select a field...</option>\n {categories.map((category) => (\n <optgroup key={category} label={category}>\n {grouped[category].map((field) => (\n <option key={field.name} value={field.name}>\n {field.label}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * FilterRuleEditor Constants\n *\n * Operator labels and field type mappings\n */\n\nimport { Operator } from '../../types';\n\nexport const OPERATOR_LABELS: Record<Operator, string> = {\n // Equality\n eq: 'equals',\n ne: 'not equals',\n\n // Comparison\n gt: 'greater than',\n lt: 'less than',\n gte: 'greater or equal',\n lte: 'less or equal',\n\n // String operations\n contains: 'contains',\n not_contains: 'does not contain',\n startswith: 'starts with',\n endswith: 'ends with',\n matches: 'matches regex',\n\n // Array/Set operations\n in: 'is one of',\n not_in: 'is not one of',\n has_any: 'has any of',\n has_all: 'has all of',\n\n // Null checks\n isnull: 'is empty',\n isnotnull: 'is not empty',\n\n // Tag operations\n has_tag: 'has tag',\n not_has_tag: 'does not have tag',\n\n // Boolean\n is_true: 'is true',\n is_false: 'is false',\n};\n\n/**\n * Operators that don't require a value input\n */\nexport const NULL_VALUE_OPERATORS: Operator[] = [\n 'isnull',\n 'isnotnull',\n 'is_true',\n 'is_false',\n];\n\n/**\n * Operators that require array/multi-value input\n */\nexport const MULTI_VALUE_OPERATORS: Operator[] = [\n 'in',\n 'not_in',\n 'has_any',\n 'has_all',\n];\n","/**\n * OperatorSelector Component\n *\n * Dropdown for selecting an operator, filtered by field type.\n *\n * Design Goal:\n * Show only valid operators for the selected field type. For example,\n * numeric fields show comparison operators (>, <, >=, <=) while string\n * fields show text operators (contains, starts with, etc.).\n *\n * Visual Hierarchy Rationale:\n * - Labeled clearly as \"Operator\"\n * - Human-readable labels (not technical symbols)\n * - Full-width for alignment with other inputs\n *\n * Interaction Notes:\n * - Only enabled when field is selected\n * - Shows operators valid for current field type\n * - Resets to first valid operator when field changes\n *\n * Accessibility Considerations:\n * - Disabled state clearly indicated\n * - Proper label association\n * - Focus visible on keyboard navigation\n */\n\nimport { Operator, FieldDefinition } from '../../types';\nimport { OPERATOR_LABELS } from './constants';\n\ninterface OperatorSelectorProps {\n operators: Operator[];\n value: Operator | '';\n onChange: (operator: Operator) => void;\n disabled?: boolean;\n error?: string;\n className?: string;\n}\n\nexport function OperatorSelector({\n operators,\n value,\n onChange,\n disabled = false,\n error,\n className = '',\n}: OperatorSelectorProps) {\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"operator-selector\" className=\"text-xs font-medium text-gray-700\">\n Operator\n </label>\n <select\n id=\"operator-selector\"\n value={value}\n onChange={(e) => onChange(e.target.value as Operator)}\n disabled={disabled}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n disabled:bg-gray-100 disabled:cursor-not-allowed disabled:text-gray-500\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">Select operator...</option>\n {operators.map((op) => (\n <option key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </option>\n ))}\n </select>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * TextValueInput Component\n *\n * Text input for string values.\n *\n * Design Goal:\n * Simple text entry for string comparisons (contains, equals, etc.).\n *\n * Visual Hierarchy Rationale:\n * - Standard text input styling\n * - Placeholder text provides context\n * - Error state clearly indicated with red border\n */\n\ninterface TextValueInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function TextValueInput({\n value,\n onChange,\n placeholder = 'Enter text...',\n error,\n className = '',\n}: TextValueInputProps) {\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"text-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <input\n id=\"text-value\"\n type=\"text\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n />\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * NumberValueInput Component\n *\n * Numeric input for number comparisons.\n *\n * Design Goal:\n * Precise number entry with validation for numeric fields.\n *\n * Visual Hierarchy Rationale:\n * - Standard number input with browser controls\n * - Constraints (min/max) applied if provided\n * - Error state clearly indicated\n *\n * Interaction Notes:\n * - Arrow keys increment/decrement\n * - Scroll wheel adjusts value (browser default)\n * - Respects min/max constraints\n */\n\ninterface NumberValueInputProps {\n value: number | null;\n onChange: (value: number | null) => void;\n min?: number;\n max?: number;\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function NumberValueInput({\n value,\n onChange,\n min,\n max,\n placeholder = 'Enter number...',\n error,\n className = '',\n}: NumberValueInputProps) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n if (val === '') {\n onChange(null);\n } else {\n const num = parseFloat(val);\n if (!isNaN(num)) {\n onChange(num);\n }\n }\n };\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"number-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <input\n id=\"number-value\"\n type=\"number\"\n value={value ?? ''}\n onChange={handleChange}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n />\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * DateValueInput Component\n *\n * Date input for date comparisons.\n *\n * Design Goal:\n * Intuitive date selection with browser-native date picker.\n *\n * Visual Hierarchy Rationale:\n * - Native date input for familiar UX\n * - Calendar picker on click (browser default)\n * - ISO date format for consistency\n *\n * Interaction Notes:\n * - Click to open calendar picker\n * - Keyboard entry also supported (YYYY-MM-DD)\n * - Respects min/max constraints\n *\n * Accessibility Considerations:\n * - Native date input is screen reader friendly\n * - Keyboard navigation supported\n */\n\ninterface DateValueInputProps {\n value: string | null;\n onChange: (value: string | null) => void;\n min?: string;\n max?: string;\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function DateValueInput({\n value,\n onChange,\n min,\n max,\n placeholder = 'Select date...',\n error,\n className = '',\n}: DateValueInputProps) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n onChange(val || null);\n };\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"date-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <input\n id=\"date-value\"\n type=\"date\"\n value={value || ''}\n onChange={handleChange}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n />\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * BooleanValueInput Component\n *\n * Checkbox input for boolean values.\n *\n * Design Goal:\n * Simple true/false toggle for boolean fields.\n *\n * Visual Hierarchy Rationale:\n * - Checkbox with clear label\n * - Aligned with other value inputs\n * - Checked state visually distinct\n *\n * Interaction Notes:\n * - Click checkbox or label to toggle\n * - Space bar toggles when focused\n *\n * Accessibility Considerations:\n * - Proper label association\n * - Keyboard accessible\n * - Focus visible\n */\n\ninterface BooleanValueInputProps {\n value: boolean;\n onChange: (value: boolean) => void;\n label?: string;\n error?: string;\n className?: string;\n}\n\nexport function BooleanValueInput({\n value,\n onChange,\n label = 'True',\n error,\n className = '',\n}: BooleanValueInputProps) {\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label className=\"text-xs font-medium text-gray-700\">Value</label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => onChange(e.target.checked)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">{label}</span>\n </label>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * ChoiceValueInput Component\n *\n * Single-select dropdown for choice fields.\n *\n * Design Goal:\n * Select a single value from predefined choices (e.g., firm stage, recipe cuisine).\n *\n * Visual Hierarchy Rationale:\n * - Standard select dropdown\n * - Choices provided by field definition\n * - Clear placeholder when nothing selected\n *\n * Interaction Notes:\n * - Click to open dropdown\n * - Keyboard navigation supported\n * - Selected value shown in dropdown\n *\n * Accessibility Considerations:\n * - Proper label association\n * - Keyboard navigation (arrow keys)\n * - Focus visible\n */\n\ninterface ChoiceValueInputProps {\n value: string;\n onChange: (value: string) => void;\n choices: any[];\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function ChoiceValueInput({\n value,\n onChange,\n choices,\n placeholder = 'Select option...',\n error,\n className = '',\n}: ChoiceValueInputProps) {\n // Handle both string arrays and {value, label} arrays\n const getChoiceValue = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.value || choice;\n };\n\n const getChoiceLabel = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.label || choice.value || String(choice);\n };\n\n return (\n <div className={`flex flex-col gap-1 ${className}`}>\n <label htmlFor=\"choice-value\" className=\"text-xs font-medium text-gray-700\">\n Value\n </label>\n <select\n id=\"choice-value\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">{placeholder}</option>\n {choices.map((choice, index) => {\n const val = getChoiceValue(choice);\n const label = getChoiceLabel(choice);\n return (\n <option key={`${val}-${index}`} value={val}>\n {label}\n </option>\n );\n })}\n </select>\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * MultiChoiceValueInput Component\n *\n * Multi-select for choosing multiple values from choices.\n *\n * Design Goal:\n * Select multiple values for 'in', 'has_any', 'has_all' operators.\n * For example: \"Firm stage is one of [Series A, Series B, Series C]\".\n *\n * Visual Hierarchy Rationale:\n * - Tag-based interface shows selected values as pills\n * - Each tag has an X button to remove\n * - Dropdown allows adding more selections\n * - Compact layout for multiple values\n *\n * Interaction Notes:\n * - Select from dropdown to add value\n * - Click X on tag to remove value\n * - Can select multiple values\n * - Already-selected values hidden from dropdown\n *\n * Accessibility Considerations:\n * - Keyboard navigation for dropdown\n * - Focus management for tag removal\n * - Screen reader announces selected items\n */\n\ninterface MultiChoiceValueInputProps {\n value: string[];\n onChange: (value: string[]) => void;\n choices: any[];\n placeholder?: string;\n error?: string;\n className?: string;\n}\n\nexport function MultiChoiceValueInput({\n value = [],\n onChange,\n choices,\n placeholder = 'Select options...',\n error,\n className = '',\n}: MultiChoiceValueInputProps) {\n // Handle both string arrays and {value, label} arrays\n const getChoiceValue = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.value || choice;\n };\n\n const getChoiceLabel = (choice: any): string => {\n if (typeof choice === 'string') return choice;\n return choice.label || choice.value || String(choice);\n };\n\n const handleAdd = (newValue: string) => {\n if (newValue && !value.includes(newValue)) {\n onChange([...value, newValue]);\n }\n };\n\n const handleRemove = (removeValue: string) => {\n onChange(value.filter((v) => v !== removeValue));\n };\n\n // Get label for a selected value\n const getValueLabel = (val: string): string => {\n const choice = choices.find((c) => getChoiceValue(c) === val);\n return choice ? getChoiceLabel(choice) : val;\n };\n\n // Filter out already-selected values from dropdown\n const availableChoices = choices.filter(\n (choice) => !value.includes(getChoiceValue(choice))\n );\n\n return (\n <div className={`flex flex-col gap-2 ${className}`}>\n <label htmlFor=\"multi-choice-value\" className=\"text-xs font-medium text-gray-700\">\n Values\n </label>\n\n {/* Selected tags */}\n {value.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {value.map((val) => (\n <span\n key={val}\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-blue-800 bg-blue-100 rounded\"\n >\n {getValueLabel(val)}\n <button\n type=\"button\"\n onClick={() => handleRemove(val)}\n className=\"hover:text-blue-900 focus:outline-none\"\n aria-label={`Remove ${getValueLabel(val)}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {/* Dropdown to add more */}\n <select\n id=\"multi-choice-value\"\n value=\"\"\n onChange={(e) => handleAdd(e.target.value)}\n className={`\n w-full px-3 py-2 text-sm border rounded-md\n bg-white\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n ${error ? 'border-red-500' : 'border-gray-300'}\n `}\n >\n <option value=\"\">{placeholder}</option>\n {availableChoices.map((choice, index) => {\n const val = getChoiceValue(choice);\n const label = getChoiceLabel(choice);\n return (\n <option key={`${val}-${index}`} value={val}>\n {label}\n </option>\n );\n })}\n </select>\n\n {error && <span className=\"text-xs text-red-600\">{error}</span>}\n </div>\n );\n}\n","/**\n * RuleRow Component\n *\n * A single filter rule row with field, operator, and value inputs.\n *\n * Design Goal:\n * Users need to configure a complete filter rule: which field to check,\n * what comparison to make, and what value to compare against.\n *\n * Visual Hierarchy Rationale:\n * - Horizontal layout on desktop (3 columns + delete button)\n * - Responsive: stacks vertically on mobile\n * - Delete button (X) aligned to right for easy removal\n * - Border and padding create visual grouping\n * - Slight shadow on hover indicates interactivity\n *\n * Component Specification:\n * - Field selector: Full field registry, grouped by category\n * - Operator selector: Filtered by selected field type\n * - Value input: Dynamic based on field type + operator\n * - Delete button: Removes this rule\n *\n * Interaction Notes:\n * - Selecting field updates available operators\n * - Selecting field/operator changes value input type\n * - Operators that don't need values (isnull, is_true) hide value input\n * - Delete button shows on hover (desktop) or always (mobile)\n *\n * Responsive Behavior:\n * - Desktop (lg+): 3-column grid with delete button\n * - Tablet (md): 2-column grid\n * - Mobile: Stacked vertically\n *\n * Accessibility Considerations:\n * - All inputs properly labeled\n * - Delete button has aria-label\n * - Keyboard navigation supported\n * - Focus management when adding/removing rules\n */\n\nimport { FilterRule, FieldDefinition, Operator } from '../../types';\nimport { FieldSelector } from './FieldSelector';\nimport { OperatorSelector } from './OperatorSelector';\nimport { NULL_VALUE_OPERATORS, MULTI_VALUE_OPERATORS } from './constants';\nimport {\n TextValueInput,\n NumberValueInput,\n DateValueInput,\n BooleanValueInput,\n ChoiceValueInput,\n MultiChoiceValueInput,\n} from './ValueInputs';\n\ninterface RuleRowProps {\n rule: FilterRule;\n onChange: (rule: FilterRule) => void;\n onRemove: () => void;\n fieldRegistry: FieldDefinition[];\n className?: string;\n}\n\nexport function RuleRow({\n rule,\n onChange,\n onRemove,\n fieldRegistry,\n className = '',\n}: RuleRowProps) {\n // Find the selected field definition\n const selectedField = fieldRegistry.find((f) => f.name === rule.field_path);\n\n // Get valid operators for the selected field\n const availableOperators = selectedField?.operators || [];\n\n // Determine if value input is needed\n const needsValue = rule.operator && !NULL_VALUE_OPERATORS.includes(rule.operator);\n const needsMultiValue =\n rule.operator && MULTI_VALUE_OPERATORS.includes(rule.operator);\n\n // Handle field change\n const handleFieldChange = (fieldName: string) => {\n const field = fieldRegistry.find((f) => f.name === fieldName);\n onChange({\n ...rule,\n field_path: fieldName,\n operator: field?.operators[0] || ('' as Operator),\n value: null,\n });\n };\n\n // Handle operator change\n const handleOperatorChange = (operator: Operator) => {\n onChange({\n ...rule,\n operator,\n value: MULTI_VALUE_OPERATORS.includes(operator) ? [] : null,\n });\n };\n\n // Handle value change\n const handleValueChange = (value: any) => {\n onChange({\n ...rule,\n value,\n });\n };\n\n // Render the appropriate value input based on field type and operator\n const renderValueInput = () => {\n if (!needsValue) return null;\n if (!selectedField) return null;\n\n const { type, constraints } = selectedField;\n\n // Multi-value operators\n if (needsMultiValue) {\n if (constraints?.choices) {\n return (\n <MultiChoiceValueInput\n value={Array.isArray(rule.value) ? rule.value : []}\n onChange={handleValueChange}\n choices={constraints.choices}\n />\n );\n }\n // Fallback: text input with comma-separated values\n return (\n <TextValueInput\n value={Array.isArray(rule.value) ? rule.value.join(', ') : ''}\n onChange={(val) => handleValueChange(val.split(',').map((v) => v.trim()))}\n placeholder=\"Enter values, comma-separated...\"\n />\n );\n }\n\n // Single-value operators\n switch (type) {\n case 'string':\n if (constraints?.choices && rule.operator === 'eq') {\n return (\n <ChoiceValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n choices={constraints.choices}\n />\n );\n }\n return (\n <TextValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n />\n );\n\n case 'number':\n return (\n <NumberValueInput\n value={rule.value}\n onChange={handleValueChange}\n min={constraints?.min_value as number}\n max={constraints?.max_value as number}\n />\n );\n\n case 'date':\n return (\n <DateValueInput\n value={rule.value || null}\n onChange={handleValueChange}\n min={constraints?.min_value as string}\n max={constraints?.max_value as string}\n />\n );\n\n case 'boolean':\n return (\n <BooleanValueInput\n value={rule.value || false}\n onChange={handleValueChange}\n />\n );\n\n case 'tag':\n return (\n <TextValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n placeholder=\"Enter tag name...\"\n />\n );\n\n default:\n return (\n <TextValueInput\n value={rule.value || ''}\n onChange={handleValueChange}\n />\n );\n }\n };\n\n return (\n <div\n className={`\n relative group\n border border-gray-200 rounded-lg p-4\n bg-white hover:shadow-sm transition-shadow\n ${className}\n `}\n >\n {/* Delete button */}\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"\n absolute top-2 right-2\n w-6 h-6 flex items-center justify-center\n text-gray-400 hover:text-red-600 hover:bg-red-50\n rounded transition-colors\n focus:outline-none focus:ring-2 focus:ring-red-500\n \"\n aria-label=\"Remove rule\"\n >\n ×\n </button>\n\n {/* Grid layout: Field | Operator | Value */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 pr-8\">\n <FieldSelector\n fields={fieldRegistry}\n value={rule.field_path}\n onChange={handleFieldChange}\n />\n\n <OperatorSelector\n operators={availableOperators}\n value={rule.operator || ''}\n onChange={handleOperatorChange}\n disabled={!rule.field_path}\n />\n\n {needsValue && renderValueInput()}\n </div>\n </div>\n );\n}\n","/**\n * @startsimpli/funnels - BRUTALLY GENERIC Funnel Type System\n *\n * This type system works for ANY entity type:\n * - Investors, firms, contacts, organizations\n * - Recipes, ingredients, users\n * - Leads, tasks, projects\n * - GitHub repos, pull requests, issues\n *\n * Zero domain-specific types. All filtering is based on field paths and operators.\n */\n\n// ============================================================================\n// Core Operators\n// ============================================================================\n\n/**\n * Filter operators - works with any data type\n */\nexport type Operator =\n // Equality\n | 'eq' // Equal to\n | 'ne' // Not equal to\n\n // Comparison (numbers, dates, strings)\n | 'gt' // Greater than\n | 'lt' // Less than\n | 'gte' // Greater than or equal\n | 'lte' // Less than or equal\n\n // String operations\n | 'contains' // String contains substring\n | 'not_contains' // String does not contain substring\n | 'startswith' // String starts with\n | 'endswith' // String ends with\n | 'matches' // Regex match\n\n // Array/Set operations\n | 'in' // Value is in array\n | 'not_in' // Value is not in array\n | 'has_any' // Array has any of these values\n | 'has_all' // Array has all of these values\n\n // Null checks\n | 'isnull' // Field is null/undefined\n | 'isnotnull' // Field is not null/undefined\n\n // Tag operations\n | 'has_tag' // Entity has tag\n | 'not_has_tag' // Entity does not have tag\n\n // Boolean\n | 'is_true' // Boolean is true\n | 'is_false'; // Boolean is false\n\n/**\n * Field data types - for operator validation\n */\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'date'\n | 'array'\n | 'object'\n | 'tag'\n | 'any';\n\n// ============================================================================\n// Filter Rules\n// ============================================================================\n\n/**\n * A single filter rule\n *\n * Examples:\n * - { field_path: 'firm.stage', operator: 'eq', value: 'Series A' }\n * - { field_path: 'recipe.cuisine', operator: 'in', value: ['Italian', 'French'] }\n * - { field_path: 'contact.email', operator: 'isnotnull', value: null }\n * - { field_path: 'organization.tags', operator: 'has_tag', value: 'enterprise' }\n */\nexport interface FilterRule {\n /**\n * Dot-notation path to field\n * Examples: 'name', 'firm.stage', 'profile.linkedin_url', 'tags', 'metrics.arr_usd'\n */\n field_path: string;\n\n /** Comparison operator */\n operator: Operator;\n\n /**\n * Value to compare against\n * Type depends on operator:\n * - eq/ne/gt/lt/gte/lte: any primitive\n * - contains/startswith/endswith: string\n * - in/not_in: array\n * - isnull/isnotnull: null (value ignored)\n * - has_tag/not_has_tag: string (tag name)\n */\n value: any;\n\n /**\n * Optional: negate the rule result\n * Default: false\n */\n negate?: boolean;\n}\n\n/**\n * Filter logic for combining rules\n */\nexport type FilterLogic = 'AND' | 'OR';\n\n/**\n * Action to take when stage rules match\n */\nexport type MatchAction =\n | 'continue' // Continue to next stage\n | 'tag' // Add tags and stop processing\n | 'tag_continue' // Add tags and continue to next stage\n | 'output'; // Add to output and stop processing\n\n/**\n * Action to take when stage rules don't match\n */\nexport type NoMatchAction =\n | 'continue' // Continue to next stage\n | 'exclude' // Exclude from output and stop processing\n | 'tag_exclude'; // Add tags, exclude from output, stop processing\n\n// ============================================================================\n// Funnel Stages\n// ============================================================================\n\n/**\n * A single stage in a funnel\n *\n * Generic over entity type TEntity\n */\nexport interface FunnelStage<TEntity = any> {\n /** Unique stage identifier */\n id: string;\n\n /** Stage execution order (0-indexed) */\n order: number;\n\n /** Human-readable stage name */\n name: string;\n\n /** Optional description */\n description?: string;\n\n /**\n * How to combine filter rules\n * - AND: All rules must match\n * - OR: At least one rule must match\n */\n filter_logic: FilterLogic;\n\n /** Filter rules to evaluate */\n rules: FilterRule[];\n\n /** Action when rules match */\n match_action: MatchAction;\n\n /** Action when rules don't match */\n no_match_action: NoMatchAction;\n\n /** Tags to add when rules match */\n match_tags?: string[];\n\n /** Tags to add when rules don't match */\n no_match_tags?: string[];\n\n /**\n * Context to add to entity when rules match\n * Can be used to track why entity matched\n * Examples:\n * - { stage: 'qualified_leads', reason: 'high_fit_score' }\n * - { tier: 'premium', discount: 0.2 }\n */\n match_context?: Record<string, any>;\n\n /**\n * Optional: Custom evaluation function\n * For complex logic that can't be expressed with rules\n */\n custom_evaluator?: (entity: TEntity) => boolean;\n}\n\n// ============================================================================\n// Funnel Definition\n// ============================================================================\n\n/**\n * Funnel status\n */\nexport type FunnelStatus = 'draft' | 'active' | 'paused' | 'archived';\n\n/**\n * Input entity types\n */\nexport type InputType = 'contacts' | 'organizations' | 'both' | 'any';\n\n/**\n * A complete funnel definition\n *\n * Generic over entity type TEntity\n */\nexport interface Funnel<TEntity = any> {\n /** Unique funnel identifier */\n id: string;\n\n /** Human-readable funnel name */\n name: string;\n\n /** Optional description */\n description?: string;\n\n /** Funnel status */\n status: FunnelStatus;\n\n /**\n * Type of entities this funnel processes\n * Used for field registry lookup\n */\n input_type: InputType;\n\n /** Ordered stages */\n stages: FunnelStage<TEntity>[];\n\n /** Created timestamp */\n created_at: Date | string;\n\n /** Last updated timestamp */\n updated_at: Date | string;\n\n /** Owner user ID */\n owner_id?: string;\n\n /** Team/company ID for multi-tenancy */\n team_id?: string;\n\n /**\n * Optional: Tags to automatically add to all entities\n * that complete the funnel\n */\n completion_tags?: string[];\n\n /**\n * Optional: Metadata for custom integrations\n */\n metadata?: Record<string, any>;\n}\n\n// ============================================================================\n// Funnel Execution\n// ============================================================================\n\n/**\n * Funnel run status\n */\nexport type FunnelRunStatus =\n | 'pending' // Queued, not started\n | 'running' // Currently executing\n | 'completed' // Finished successfully\n | 'failed' // Error occurred\n | 'cancelled'; // Manually stopped\n\n/**\n * How the funnel run was triggered\n */\nexport type TriggerType =\n | 'manual' // User initiated\n | 'scheduled' // Cron/scheduled run\n | 'webhook' // External event\n | 'api'; // API call\n\n/**\n * Statistics for a single stage execution\n */\nexport interface StageStats {\n /** Stage ID */\n stage_id: string;\n\n /** Stage name */\n stage_name: string;\n\n /** Entities that entered this stage */\n input_count: number;\n\n /** Entities that matched rules */\n matched_count: number;\n\n /** Entities that didn't match rules */\n not_matched_count: number;\n\n /** Entities excluded at this stage */\n excluded_count: number;\n\n /** Entities tagged at this stage */\n tagged_count: number;\n\n /** Entities that continued to next stage */\n continued_count: number;\n\n /** Execution time in milliseconds */\n duration_ms?: number;\n\n /** Error count */\n error_count?: number;\n}\n\n/**\n * A funnel execution run\n */\nexport interface FunnelRun {\n /** Unique run identifier */\n id: string;\n\n /** Funnel ID */\n funnel_id: string;\n\n /** Funnel snapshot (copy of funnel at run time) */\n funnel?: Funnel;\n\n /** Run status */\n status: FunnelRunStatus;\n\n /** How run was triggered */\n trigger_type: TriggerType;\n\n /** User who triggered (if manual) */\n triggered_by?: string;\n\n /** Started timestamp */\n started_at: Date | string;\n\n /** Completed timestamp */\n completed_at?: Date | string;\n\n /** Duration in milliseconds */\n duration_ms?: number;\n\n /** Total entities input */\n total_input: number;\n\n /** Total entities matched (in output) */\n total_matched: number;\n\n /** Total entities excluded */\n total_excluded: number;\n\n /** Total entities tagged */\n total_tagged: number;\n\n /** Per-stage statistics */\n stage_stats: Record<string, StageStats>;\n\n /** Error message (if failed) */\n error?: string;\n\n /** Stack trace (if failed) */\n stack_trace?: string;\n\n /** Metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Result for a single entity processed through funnel\n */\nexport interface FunnelResult<TEntity = any> {\n /** The entity that was processed */\n entity: TEntity;\n\n /** Whether entity matched and is in output */\n matched: boolean;\n\n /** Stage where entity was excluded (if excluded) */\n excluded_at_stage?: string;\n\n /** Tags accumulated during processing */\n accumulated_tags: string[];\n\n /** Context accumulated during processing */\n context: Record<string, any>;\n\n /** Stage-by-stage results */\n stage_results?: StageResult[];\n}\n\n/**\n * Result for a single stage evaluation\n */\nexport interface StageResult {\n /** Stage ID */\n stage_id: string;\n\n /** Stage name */\n stage_name: string;\n\n /** Whether rules matched */\n matched: boolean;\n\n /** Rule evaluation results */\n rule_results?: RuleResult[];\n\n /** Action taken */\n action: MatchAction | NoMatchAction;\n\n /** Tags added */\n tags_added?: string[];\n\n /** Context added */\n context_added?: Record<string, any>;\n\n /** Whether entity was excluded */\n excluded: boolean;\n\n /** Whether entity continued to next stage */\n continued: boolean;\n}\n\n/**\n * Result for a single rule evaluation\n */\nexport interface RuleResult {\n /** Rule field path */\n field_path: string;\n\n /** Rule operator */\n operator: Operator;\n\n /** Value compared against */\n value: any;\n\n /** Actual value from entity */\n actual_value: any;\n\n /** Whether rule matched */\n matched: boolean;\n\n /** Error (if evaluation failed) */\n error?: string;\n}\n\n// ============================================================================\n// Field Registry\n// ============================================================================\n\n/**\n * Valid operators for a field type\n */\nexport type ValidOperators = Operator[];\n\n/**\n * Field constraints\n */\nexport interface FieldConstraints {\n /** Minimum value (numbers, dates) */\n min_value?: number | string;\n\n /** Maximum value (numbers, dates) */\n max_value?: number | string;\n\n /** Allowed values (enums) */\n choices?: any[];\n\n /** Regex pattern */\n pattern?: string;\n\n /** Required field */\n required?: boolean;\n}\n\n/**\n * Field definition in registry\n *\n * Describes what fields are available for filtering\n * on a given entity type\n */\nexport interface FieldDefinition {\n /** Unique field identifier (dot-notation path) */\n name: string;\n\n /** Human-readable label */\n label: string;\n\n /** Field data type */\n type: FieldType;\n\n /** Valid operators for this field */\n operators: ValidOperators;\n\n /** Field category (for UI grouping) */\n category?: string;\n\n /** Optional description */\n description?: string;\n\n /** Field constraints */\n constraints?: FieldConstraints;\n\n /** Whether field is sortable */\n sortable?: boolean;\n\n /** Whether field is searchable */\n searchable?: boolean;\n\n /** Example values (for UI help) */\n examples?: any[];\n\n /** Related fields (for UI suggestions) */\n related_fields?: string[];\n}\n\n/**\n * Field registry for an entity type\n *\n * Maps field paths to their definitions\n */\nexport interface FieldRegistry {\n /** Entity type this registry is for */\n entity_type: string;\n\n /** Available fields */\n fields: FieldDefinition[];\n\n /** Field lookup by name */\n field_map?: Map<string, FieldDefinition>;\n\n /** Categories (for UI grouping) */\n categories?: string[];\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Filter configuration (rules + logic)\n */\nexport interface FilterConfig {\n logic: FilterLogic;\n rules: FilterRule[];\n}\n\n/**\n * Partial type helper\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Extract field paths from object type\n * Helper for type-safe field path completion\n */\nexport type FieldPath<T, Prefix extends string = ''> = {\n [K in keyof T]: T[K] extends object\n ? K extends string\n ? `${Prefix}${K}` | FieldPath<T[K], `${Prefix}${K}.`>\n : never\n : K extends string\n ? `${Prefix}${K}`\n : never;\n}[keyof T];\n\n/**\n * Funnel creation input (omits auto-generated fields)\n */\nexport type CreateFunnelInput<TEntity = any> = Omit<\n Funnel<TEntity>,\n 'id' | 'created_at' | 'updated_at'\n>;\n\n/**\n * Funnel update input (all fields optional except id)\n */\nexport type UpdateFunnelInput<TEntity = any> = DeepPartial<Funnel<TEntity>> & {\n id: string;\n};\n\n/**\n * Stage creation input\n */\nexport type CreateStageInput<TEntity = any> = Omit<FunnelStage<TEntity>, 'id'>;\n\n/**\n * Stage update input\n */\nexport type UpdateStageInput<TEntity = any> = DeepPartial<FunnelStage<TEntity>> & {\n id: string;\n};\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard: is value a valid Funnel?\n */\nexport function isFunnel<TEntity = any>(value: unknown): value is Funnel<TEntity> {\n const f = value as Funnel<TEntity>;\n return (\n typeof f === 'object' &&\n f !== null &&\n typeof f.id === 'string' &&\n typeof f.name === 'string' &&\n ['draft', 'active', 'paused', 'archived'].includes(f.status) &&\n Array.isArray(f.stages)\n );\n}\n\n/**\n * Type guard: is value a valid FunnelStage?\n */\nexport function isStage<TEntity = any>(value: unknown): value is FunnelStage<TEntity> {\n const s = value as FunnelStage<TEntity>;\n return (\n typeof s === 'object' &&\n s !== null &&\n typeof s.id === 'string' &&\n typeof s.name === 'string' &&\n typeof s.order === 'number' &&\n ['AND', 'OR'].includes(s.filter_logic) &&\n Array.isArray(s.rules)\n );\n}\n\n/**\n * Type guard: is value a valid FilterRule?\n */\nexport function isFilterRule(value: unknown): value is FilterRule {\n const r = value as FilterRule;\n return (\n typeof r === 'object' &&\n r !== null &&\n typeof r.field_path === 'string' &&\n typeof r.operator === 'string' &&\n r.value !== undefined\n );\n}\n\n/**\n * Type guard: is value a valid FunnelRun?\n */\nexport function isFunnelRun(value: unknown): value is FunnelRun {\n const r = value as FunnelRun;\n return (\n typeof r === 'object' &&\n r !== null &&\n typeof r.id === 'string' &&\n typeof r.funnel_id === 'string' &&\n ['pending', 'running', 'completed', 'failed', 'cancelled'].includes(r.status)\n );\n}\n\n/**\n * Type guard: is value a valid FunnelResult?\n */\nexport function isFunnelResult<TEntity = any>(\n value: unknown\n): value is FunnelResult<TEntity> {\n const r = value as FunnelResult<TEntity>;\n return (\n typeof r === 'object' &&\n r !== null &&\n r.entity !== undefined &&\n typeof r.matched === 'boolean' &&\n Array.isArray(r.accumulated_tags)\n );\n}\n\n/**\n * Type guard: is value a valid FieldDefinition?\n */\nexport function isFieldDefinition(value: unknown): value is FieldDefinition {\n const f = value as FieldDefinition;\n return (\n typeof f === 'object' &&\n f !== null &&\n typeof f.name === 'string' &&\n typeof f.label === 'string' &&\n typeof f.type === 'string' &&\n Array.isArray(f.operators)\n );\n}\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Get valid operators for a field type\n */\nexport function getValidOperators(fieldType: FieldType): ValidOperators {\n switch (fieldType) {\n case 'string':\n return [\n 'eq', 'ne', 'contains', 'not_contains', 'startswith', 'endswith',\n 'matches', 'in', 'not_in', 'isnull', 'isnotnull'\n ];\n\n case 'number':\n return [\n 'eq', 'ne', 'gt', 'lt', 'gte', 'lte',\n 'in', 'not_in', 'isnull', 'isnotnull'\n ];\n\n case 'boolean':\n return ['eq', 'ne', 'is_true', 'is_false', 'isnull', 'isnotnull'];\n\n case 'date':\n return [\n 'eq', 'ne', 'gt', 'lt', 'gte', 'lte',\n 'isnull', 'isnotnull'\n ];\n\n case 'array':\n return [\n 'in', 'not_in', 'has_any', 'has_all',\n 'isnull', 'isnotnull'\n ];\n\n case 'tag':\n return ['has_tag', 'not_has_tag'];\n\n case 'object':\n return ['isnull', 'isnotnull'];\n\n case 'any':\n default:\n return [\n 'eq', 'ne', 'gt', 'lt', 'gte', 'lte',\n 'contains', 'not_contains', 'startswith', 'endswith',\n 'in', 'not_in', 'isnull', 'isnotnull'\n ];\n }\n}\n\n/**\n * Validate operator is allowed for field type\n */\nexport function isValidOperator(\n operator: Operator,\n fieldType: FieldType\n): boolean {\n const validOps = getValidOperators(fieldType);\n return validOps.includes(operator);\n}\n\n/**\n * Validate filter rule\n */\nexport function validateFilterRule(rule: FilterRule): string[] {\n const errors: string[] = [];\n\n if (!rule.field_path) {\n errors.push('field_path is required');\n }\n\n if (!rule.operator) {\n errors.push('operator is required');\n }\n\n // Value required for most operators\n const nullOps = ['isnull', 'isnotnull', 'is_true', 'is_false'];\n if (!nullOps.includes(rule.operator) && rule.value === undefined) {\n errors.push(`value is required for operator '${rule.operator}'`);\n }\n\n return errors;\n}\n\n/**\n * Validate funnel stage\n */\nexport function validateStage<TEntity = any>(\n stage: FunnelStage<TEntity>\n): string[] {\n const errors: string[] = [];\n\n if (!stage.name) {\n errors.push('name is required');\n }\n\n if (typeof stage.order !== 'number') {\n errors.push('order must be a number');\n }\n\n if (!['AND', 'OR'].includes(stage.filter_logic)) {\n errors.push('filter_logic must be AND or OR');\n }\n\n if (!Array.isArray(stage.rules)) {\n errors.push('rules must be an array');\n } else {\n stage.rules.forEach((rule, i) => {\n const ruleErrors = validateFilterRule(rule);\n ruleErrors.forEach(err => errors.push(`rules[${i}]: ${err}`));\n });\n }\n\n return errors;\n}\n\n/**\n * Validate funnel\n */\nexport function validateFunnel<TEntity = any>(\n funnel: Funnel<TEntity>\n): string[] {\n const errors: string[] = [];\n\n if (!funnel.name) {\n errors.push('name is required');\n }\n\n if (!['draft', 'active', 'paused', 'archived'].includes(funnel.status)) {\n errors.push('status must be draft, active, paused, or archived');\n }\n\n if (!Array.isArray(funnel.stages)) {\n errors.push('stages must be an array');\n } else {\n funnel.stages.forEach((stage, i) => {\n const stageErrors = validateStage(stage);\n stageErrors.forEach(err => errors.push(`stages[${i}]: ${err}`));\n });\n\n // Check stage order is sequential\n const orders = funnel.stages.map(s => s.order).sort((a, b) => a - b);\n const expectedOrders = Array.from({ length: orders.length }, (_, i) => i);\n if (JSON.stringify(orders) !== JSON.stringify(expectedOrders)) {\n errors.push('stage orders must be sequential starting from 0');\n }\n }\n\n return errors;\n}\n","/**\n * FilterRuleEditor Component\n *\n * Main component for creating and editing filter rules.\n *\n * Design Goal:\n * Users need to build complex filters by combining multiple rules with AND/OR logic.\n * This component provides a visual rule builder that dynamically adapts to any\n * entity type (investors, recipes, contacts, etc.) based on the field registry.\n *\n * Visual Hierarchy Rationale:\n * - Logic toggle at top sets the mode (AND/OR)\n * - Rules stacked vertically for clarity\n * - AND/OR connectors between rules reinforce the logic visually\n * - Add Rule button at bottom for progressive disclosure\n * - Empty state shown when no rules exist\n *\n * Component Specification:\n * - Logic toggle: Switch between AND/OR\n * - Rule rows: Each rule is a self-contained row\n * - Add button: Adds a new empty rule\n * - Remove button: Each rule has a delete button\n * - Validation: Real-time validation with error messages\n *\n * Interaction Notes:\n * - Users can add unlimited rules (within reason)\n * - Removing a rule updates immediately\n * - Logic toggle applies to all rules\n * - Each rule validates independently\n * - Focus management when adding/removing rules\n *\n * Responsive Behavior:\n * - Full width container\n * - Rule rows responsive (see RuleRow component)\n * - Add button full-width on mobile\n *\n * Accessibility Considerations:\n * - ARIA labels for controls\n * - Keyboard navigation throughout\n * - Focus management for add/remove actions\n * - Screen reader announces rule count\n * - Error messages associated with fields\n *\n * Design Handoff Notes:\n * - Uses Tailwind utility classes\n * - Border radius: rounded-lg (8px)\n * - Spacing: 4px units (gap-4, p-4)\n * - Colors: gray-{100-800}, blue-{500-600}, red-{500-600}\n * - Shadows: shadow-sm on hover\n * - Transitions: transition-all, duration-200\n */\n\nimport { FilterRule, FilterLogic, FieldDefinition } from '../../types';\nimport { LogicToggle } from './LogicToggle';\nimport { RuleRow } from './RuleRow';\nimport { validateFilterRule } from '../../types';\n\nexport interface FilterRuleEditorProps {\n /** Current filter rules */\n rules: FilterRule[];\n\n /** Callback when rules change */\n onChange: (rules: FilterRule[]) => void;\n\n /** Field registry for the entity type */\n fieldRegistry: FieldDefinition[];\n\n /** Filter logic (AND/OR) */\n logic?: FilterLogic;\n\n /** Callback when logic changes */\n onLogicChange?: (logic: FilterLogic) => void;\n\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function FilterRuleEditor({\n rules,\n onChange,\n fieldRegistry,\n logic = 'AND',\n onLogicChange,\n className = '',\n}: FilterRuleEditorProps) {\n // Add a new empty rule\n const handleAddRule = () => {\n const newRule: FilterRule = {\n field_path: '',\n operator: 'eq' as any,\n value: null,\n };\n onChange([...rules, newRule]);\n };\n\n // Update a specific rule\n const handleUpdateRule = (index: number, updatedRule: FilterRule) => {\n const newRules = [...rules];\n newRules[index] = updatedRule;\n onChange(newRules);\n };\n\n // Remove a specific rule\n const handleRemoveRule = (index: number) => {\n const newRules = rules.filter((_, i) => i !== index);\n onChange(newRules);\n };\n\n // Validate rules\n const ruleErrors = rules.map((rule) => validateFilterRule(rule));\n\n return (\n <div className={`flex flex-col gap-4 ${className}`}>\n {/* Logic toggle */}\n {onLogicChange && (\n <LogicToggle logic={logic} onChange={onLogicChange} />\n )}\n\n {/* Empty state */}\n {rules.length === 0 && (\n <div className=\"flex flex-col items-center justify-center py-12 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\n <svg\n className=\"w-12 h-12 text-gray-400 mb-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n <p className=\"text-sm text-gray-600 mb-4\">No filter rules yet</p>\n <button\n type=\"button\"\n onClick={handleAddRule}\n className=\"\n inline-flex items-center gap-2\n px-4 py-2\n text-sm font-medium text-white\n bg-blue-600 hover:bg-blue-700\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\n transition-colors\n \"\n >\n <span className=\"text-lg\">+</span>\n Add First Rule\n </button>\n </div>\n )}\n\n {/* Rule list */}\n {rules.length > 0 && (\n <div className=\"flex flex-col gap-3\">\n {rules.map((rule, index) => (\n <div key={index}>\n <RuleRow\n rule={rule}\n onChange={(updatedRule) => handleUpdateRule(index, updatedRule)}\n onRemove={() => handleRemoveRule(index)}\n fieldRegistry={fieldRegistry}\n />\n\n {/* Logic connector between rules */}\n {index < rules.length - 1 && (\n <div className=\"flex items-center justify-center py-2\">\n <span className=\"px-3 py-1 text-xs font-semibold text-gray-700 bg-gray-100 border border-gray-300 rounded-full\">\n {logic}\n </span>\n </div>\n )}\n\n {/* Validation errors */}\n {ruleErrors[index].length > 0 && (\n <div className=\"mt-2 px-4 py-2 bg-red-50 border border-red-200 rounded text-sm text-red-700\">\n {ruleErrors[index].map((error, i) => (\n <div key={i}>{error}</div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Add rule button (when rules exist) */}\n {rules.length > 0 && (\n <button\n type=\"button\"\n onClick={handleAddRule}\n className=\"\n w-full\n flex items-center justify-center gap-2\n px-4 py-3\n text-sm font-medium text-blue-600\n bg-white hover:bg-blue-50\n border-2 border-dashed border-blue-300 hover:border-blue-400\n rounded-lg\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\n transition-colors\n \"\n aria-label={`Add rule ${rules.length + 1}`}\n >\n <span className=\"text-xl\">+</span>\n Add Rule\n </button>\n )}\n\n {/* Rule count and summary */}\n {rules.length > 0 && (\n <div className=\"flex items-center justify-between text-xs text-gray-500\">\n <span>\n {rules.length} {rules.length === 1 ? 'rule' : 'rules'}\n </span>\n <span>\n {logic === 'AND' ? 'All rules must match' : 'Any rule can match'}\n </span>\n </div>\n )}\n </div>\n );\n}\n","/**\n * StageActions - Action dropdowns and toggles\n *\n * Features:\n * - Match action dropdown\n * - No match action dropdown\n * - Clear labels and descriptions\n */\n\nimport React from 'react';\nimport { FunnelStage, MatchAction, NoMatchAction } from '../../types';\n\nexport interface StageActionsProps {\n /** The stage being configured */\n stage: FunnelStage;\n\n /** Match action change handler */\n onMatchActionChange: (action: MatchAction) => void;\n\n /** No match action change handler */\n onNoMatchActionChange: (action: NoMatchAction) => void;\n}\n\n/**\n * Match action options with descriptions\n */\nconst MATCH_ACTIONS: Array<{ value: MatchAction; label: string; description: string }> = [\n {\n value: 'continue',\n label: 'Continue',\n description: 'Continue to next stage without tagging',\n },\n {\n value: 'tag',\n label: 'Tag & Stop',\n description: 'Add tags and stop processing',\n },\n {\n value: 'tag_continue',\n label: 'Tag & Continue',\n description: 'Add tags and continue to next stage',\n },\n {\n value: 'output',\n label: 'Output',\n description: 'Add to output and stop processing',\n },\n];\n\n/**\n * No match action options with descriptions\n */\nconst NO_MATCH_ACTIONS: Array<{ value: NoMatchAction; label: string; description: string }> = [\n {\n value: 'continue',\n label: 'Continue',\n description: 'Continue to next stage',\n },\n {\n value: 'exclude',\n label: 'Exclude',\n description: 'Exclude from output and stop processing',\n },\n {\n value: 'tag_exclude',\n label: 'Tag & Exclude',\n description: 'Add tags, exclude from output, and stop',\n },\n];\n\n/**\n * StageActions component\n */\nexport function StageActions({\n stage,\n onMatchActionChange,\n onNoMatchActionChange,\n}: StageActionsProps) {\n return (\n <div className=\"stage-actions\">\n {/* Match action */}\n <div className=\"form-group\">\n <label htmlFor={`match-action-${stage.id}`} className=\"form-label\">\n Action on Match\n </label>\n <select\n id={`match-action-${stage.id}`}\n value={stage.match_action}\n onChange={(e) => onMatchActionChange(e.target.value as MatchAction)}\n className=\"form-select\"\n >\n {MATCH_ACTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <p className=\"form-hint\">\n {MATCH_ACTIONS.find((a) => a.value === stage.match_action)?.description}\n </p>\n </div>\n\n {/* No match action */}\n <div className=\"form-group\">\n <label htmlFor={`no-match-action-${stage.id}`} className=\"form-label\">\n Action on No Match\n </label>\n <select\n id={`no-match-action-${stage.id}`}\n value={stage.no_match_action}\n onChange={(e) => onNoMatchActionChange(e.target.value as NoMatchAction)}\n className=\"form-select\"\n >\n {NO_MATCH_ACTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <p className=\"form-hint\">\n {NO_MATCH_ACTIONS.find((a) => a.value === stage.no_match_action)?.description}\n </p>\n </div>\n </div>\n );\n}\n","/**\n * TagInput - Multi-tag input component\n *\n * Features:\n * - Add tags with Enter or comma\n * - Remove tags with click\n * - Visual tag chips\n * - Duplicate prevention\n */\n\nimport React, { useState, useCallback, KeyboardEvent } from 'react';\n\nexport interface TagInputProps {\n /** Current tags */\n tags: string[];\n\n /** Change handler */\n onChange: (tags: string[]) => void;\n\n /** Input placeholder */\n placeholder?: string;\n\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * TagInput component\n */\nexport function TagInput({\n tags,\n onChange,\n placeholder = 'Add tag...',\n className = '',\n}: TagInputProps) {\n const [inputValue, setInputValue] = useState('');\n\n /**\n * Add tag\n */\n const addTag = useCallback((tag: string) => {\n const trimmed = tag.trim().toLowerCase();\n\n if (!trimmed) {\n return;\n }\n\n // Prevent duplicates\n if (tags.includes(trimmed)) {\n return;\n }\n\n onChange([...tags, trimmed]);\n setInputValue('');\n }, [tags, onChange]);\n\n /**\n * Remove tag\n */\n const removeTag = useCallback((index: number) => {\n onChange(tags.filter((_, i) => i !== index));\n }, [tags, onChange]);\n\n /**\n * Handle input key down\n */\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(inputValue);\n } else if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n // Remove last tag on backspace if input is empty\n removeTag(tags.length - 1);\n }\n }, [inputValue, tags, addTag, removeTag]);\n\n /**\n * Handle input blur\n */\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addTag(inputValue);\n }\n }, [inputValue, addTag]);\n\n return (\n <div className={`tag-input ${className}`}>\n <div className=\"tag-input-container\">\n {/* Tag chips */}\n {tags.map((tag, index) => (\n <div key={index} className=\"tag-chip\">\n <span className=\"tag-text\">{tag}</span>\n <button\n type=\"button\"\n onClick={() => removeTag(index)}\n className=\"tag-remove\"\n aria-label={`Remove tag ${tag}`}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M4 4l6 6M10 4l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n\n {/* Input */}\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n placeholder={tags.length === 0 ? placeholder : ''}\n className=\"tag-input-field\"\n />\n </div>\n\n {/* Hint */}\n <p className=\"tag-input-hint\">\n Press Enter or comma to add tags\n </p>\n </div>\n );\n}\n","/**\n * StageForm - Stage configuration form\n *\n * Features:\n * - Stage name input\n * - Description textarea\n * - Filter logic toggle (AND/OR)\n * - Match/no-match action dropdowns\n * - Tags input\n * - Filter rules editor\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { FunnelStage, FieldDefinition, FilterLogic, MatchAction, NoMatchAction, FilterRule } from '../../types';\nimport { StageActions } from './StageActions';\nimport { TagInput } from './TagInput';\nimport { FilterRuleEditor } from '../FilterRuleEditor/FilterRuleEditor';\n\nexport interface StageFormProps {\n /** The stage being edited */\n stage: FunnelStage;\n\n /** Update stage */\n onUpdate: (stage: FunnelStage) => void;\n\n /** Available fields */\n fieldRegistry: FieldDefinition[];\n}\n\n/**\n * Debounce helper\n */\nfunction useDebounce<T extends (...args: any[]) => void>(\n callback: T,\n delay: number\n): T {\n const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | null>(null);\n\n return useCallback(\n ((...args: any[]) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n const newTimeoutId = setTimeout(() => {\n callback(...args);\n }, delay);\n\n setTimeoutId(newTimeoutId);\n }) as T,\n [callback, delay, timeoutId]\n );\n}\n\n/**\n * StageForm component\n */\nexport function StageForm({\n stage,\n onUpdate,\n fieldRegistry,\n}: StageFormProps) {\n // Local state for inputs (debounced updates)\n const [name, setName] = useState(stage.name);\n const [description, setDescription] = useState(stage.description || '');\n\n // Debounced update handlers\n const debouncedUpdateName = useDebounce((value: string) => {\n onUpdate({ ...stage, name: value });\n }, 300);\n\n const debouncedUpdateDescription = useDebounce((value: string) => {\n onUpdate({ ...stage, description: value });\n }, 500);\n\n /**\n * Handle name change\n */\n const handleNameChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setName(value);\n debouncedUpdateName(value);\n }, [debouncedUpdateName]);\n\n /**\n * Handle description change\n */\n const handleDescriptionChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setDescription(value);\n debouncedUpdateDescription(value);\n }, [debouncedUpdateDescription]);\n\n /**\n * Handle filter logic change\n */\n const handleFilterLogicChange = useCallback((logic: FilterLogic) => {\n onUpdate({ ...stage, filter_logic: logic });\n }, [stage, onUpdate]);\n\n /**\n * Handle match action change\n */\n const handleMatchActionChange = useCallback((action: MatchAction) => {\n onUpdate({ ...stage, match_action: action });\n }, [stage, onUpdate]);\n\n /**\n * Handle no match action change\n */\n const handleNoMatchActionChange = useCallback((action: NoMatchAction) => {\n onUpdate({ ...stage, no_match_action: action });\n }, [stage, onUpdate]);\n\n /**\n * Handle match tags change\n */\n const handleMatchTagsChange = useCallback((tags: string[]) => {\n onUpdate({ ...stage, match_tags: tags });\n }, [stage, onUpdate]);\n\n /**\n * Handle no match tags change\n */\n const handleNoMatchTagsChange = useCallback((tags: string[]) => {\n onUpdate({ ...stage, no_match_tags: tags });\n }, [stage, onUpdate]);\n\n /**\n * Handle filter rules change\n */\n const handleRulesChange = useCallback((rules: FilterRule[]) => {\n onUpdate({ ...stage, rules });\n }, [stage, onUpdate]);\n\n return (\n <div className=\"stage-form\">\n {/* Name input */}\n <div className=\"form-group\">\n <label htmlFor={`stage-name-${stage.id}`} className=\"form-label\">\n Stage Name\n </label>\n <input\n id={`stage-name-${stage.id}`}\n type=\"text\"\n value={name}\n onChange={handleNameChange}\n className=\"form-input\"\n placeholder=\"e.g., High ICP Score\"\n required\n />\n </div>\n\n {/* Description textarea */}\n <div className=\"form-group\">\n <label htmlFor={`stage-desc-${stage.id}`} className=\"form-label\">\n Description\n </label>\n <textarea\n id={`stage-desc-${stage.id}`}\n value={description}\n onChange={handleDescriptionChange}\n className=\"form-textarea\"\n placeholder=\"Describe the purpose of this stage...\"\n rows={3}\n />\n </div>\n\n {/* Filter logic toggle */}\n <div className=\"form-group\">\n <label className=\"form-label\">Filter Logic</label>\n <div className=\"filter-logic-toggle\">\n <button\n type=\"button\"\n onClick={() => handleFilterLogicChange('AND')}\n className={`toggle-button ${stage.filter_logic === 'AND' ? 'active' : ''}`}\n >\n <input\n type=\"radio\"\n name={`filter-logic-${stage.id}`}\n value=\"AND\"\n checked={stage.filter_logic === 'AND'}\n onChange={() => handleFilterLogicChange('AND')}\n className=\"sr-only\"\n />\n AND\n </button>\n <button\n type=\"button\"\n onClick={() => handleFilterLogicChange('OR')}\n className={`toggle-button ${stage.filter_logic === 'OR' ? 'active' : ''}`}\n >\n <input\n type=\"radio\"\n name={`filter-logic-${stage.id}`}\n value=\"OR\"\n checked={stage.filter_logic === 'OR'}\n onChange={() => handleFilterLogicChange('OR')}\n className=\"sr-only\"\n />\n OR\n </button>\n </div>\n <p className=\"form-hint\">\n {stage.filter_logic === 'AND'\n ? 'All rules must match for this stage to pass'\n : 'At least one rule must match for this stage to pass'}\n </p>\n </div>\n\n {/* Stage actions */}\n <StageActions\n stage={stage}\n onMatchActionChange={handleMatchActionChange}\n onNoMatchActionChange={handleNoMatchActionChange}\n />\n\n {/* Match tags */}\n {(stage.match_action === 'tag' || stage.match_action === 'tag_continue') && (\n <div className=\"form-group\">\n <label className=\"form-label\">Tags on Match</label>\n <TagInput\n tags={stage.match_tags || []}\n onChange={handleMatchTagsChange}\n placeholder=\"Add tag...\"\n />\n <p className=\"form-hint\">\n Tags to add when rules match\n </p>\n </div>\n )}\n\n {/* No match tags */}\n {stage.no_match_action === 'tag_exclude' && (\n <div className=\"form-group\">\n <label className=\"form-label\">Tags on No Match</label>\n <TagInput\n tags={stage.no_match_tags || []}\n onChange={handleNoMatchTagsChange}\n placeholder=\"Add tag...\"\n />\n <p className=\"form-hint\">\n Tags to add when rules don't match\n </p>\n </div>\n )}\n\n {/* Filter rules section */}\n <div className=\"form-group\">\n <div className=\"rules-header\">\n <label className=\"form-label\">Filter Rules ({stage.rules.length})</label>\n </div>\n\n <FilterRuleEditor\n rules={stage.rules}\n onChange={handleRulesChange}\n fieldRegistry={fieldRegistry}\n />\n </div>\n </div>\n );\n}\n","/**\n * StageCard - Individual stage card with drag handle\n *\n * Features:\n * - Drag handle for reordering\n * - Expand/collapse\n * - Delete button\n * - Stage configuration form when expanded\n * - Validation errors and warnings\n */\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { FunnelStage, FieldDefinition } from '../../types';\nimport { StageForm } from './StageForm';\n\nexport interface StageCardProps {\n /** The stage to display */\n stage: FunnelStage;\n\n /** Whether stage is expanded */\n expanded: boolean;\n\n /** Toggle expanded state */\n onToggleExpanded: () => void;\n\n /** Update stage */\n onUpdate: (stage: FunnelStage) => void;\n\n /** Remove stage */\n onRemove: () => void;\n\n /** Available fields */\n fieldRegistry: FieldDefinition[];\n\n /** Validation error */\n error?: string;\n\n /** Show warnings */\n showWarnings?: boolean;\n}\n\n/**\n * StageCard component\n */\nexport function StageCard({\n stage,\n expanded,\n onToggleExpanded,\n onUpdate,\n onRemove,\n fieldRegistry,\n error,\n showWarnings = false,\n}: StageCardProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: stage.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`stage-card ${isDragging ? 'dragging' : ''} ${error ? 'error' : ''}`}\n >\n {/* Header */}\n <div className=\"stage-header\">\n {/* Drag handle */}\n <button\n {...attributes}\n {...listeners}\n className=\"drag-handle\"\n aria-label=\"Drag to reorder\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M7 4h6M7 10h6M7 16h6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n\n {/* Stage title (clickable to expand/collapse) */}\n <button\n onClick={onToggleExpanded}\n className=\"stage-title-button\"\n aria-expanded={expanded}\n >\n <span className=\"stage-number\">Stage {stage.order + 1}:</span>\n <span className=\"stage-name\">{stage.name || 'Untitled Stage'}</span>\n\n {/* Expand/collapse icon */}\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n className={`expand-icon ${expanded ? 'expanded' : ''}`}\n >\n <path\n d=\"M6 8l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Delete button */}\n <button\n onClick={onRemove}\n className=\"delete-button\"\n aria-label=\"Delete stage\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M6 6l8 8M14 6l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n {/* Validation error */}\n {error && (\n <div className=\"error-message\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 1l7 13H1L8 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M8 6v3M8 11h.01\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n <span>{error}</span>\n </div>\n )}\n\n {/* Warning (no rules) */}\n {showWarnings && !error && (\n <div className=\"warning-message\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M8 5v3M8 10h.01\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n <span>Stage has no filter rules</span>\n </div>\n )}\n\n {/* Collapsed summary */}\n {!expanded && (\n <div className=\"stage-summary\">\n <div className=\"summary-item\">\n <span className=\"summary-label\">Rules:</span>\n <span className=\"summary-value\">{stage.rules.length}</span>\n </div>\n <div className=\"summary-item\">\n <span className=\"summary-label\">Logic:</span>\n <span className=\"summary-value\">{stage.filter_logic}</span>\n </div>\n <div className=\"summary-item\">\n <span className=\"summary-label\">On Match:</span>\n <span className=\"summary-value\">{stage.match_action}</span>\n </div>\n <div className=\"summary-item\">\n <span className=\"summary-label\">On No Match:</span>\n <span className=\"summary-value\">{stage.no_match_action}</span>\n </div>\n </div>\n )}\n\n {/* Expanded form */}\n {expanded && (\n <div className=\"stage-form-wrapper\">\n <StageForm\n stage={stage}\n onUpdate={onUpdate}\n fieldRegistry={fieldRegistry}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * AddStageButton - Button to add new stages\n *\n * Features:\n * - Different styles for top/bottom/inline positions\n * - Clear visual affordance\n */\n\nimport React from 'react';\n\nexport interface AddStageButtonProps {\n /** Click handler */\n onClick: () => void;\n\n /** Position context */\n position: 'top' | 'bottom' | 'inline';\n\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * AddStageButton component\n */\nexport function AddStageButton({\n onClick,\n position,\n className = '',\n}: AddStageButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`add-stage-button ${position} ${className}`}\n aria-label={`Add stage ${position === 'top' ? 'at top' : position === 'bottom' ? 'at bottom' : 'below'}`}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M10 5v10M5 10h10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span>\n {position === 'top' && 'Add Stage'}\n {position === 'bottom' && 'Add Stage Below'}\n {position === 'inline' && 'Add Stage'}\n </span>\n </button>\n );\n}\n","/**\n * FunnelStageBuilder - Main component for creating/editing funnel stages\n *\n * Features:\n * - Drag-and-drop reordering\n * - Add/remove stages\n * - Stage configuration (name, description, filters, actions)\n * - Visual flow with arrows\n * - Expandable stage cards\n */\n\nimport React, { useState, useCallback } from 'react';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { Funnel, FunnelStage, FieldDefinition } from '../../types';\nimport { StageCard } from './StageCard';\nimport { AddStageButton } from './AddStageButton';\n\nexport interface FunnelStageBuilderProps {\n /** The funnel being edited */\n funnel: Funnel;\n\n /** Callback when funnel is updated */\n onUpdate: (funnel: Funnel) => void;\n\n /** Available fields for filter rules */\n fieldRegistry: FieldDefinition[];\n\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * Generate unique stage ID\n */\nfunction generateStageId(): string {\n return `stage-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Create a new empty stage\n */\nfunction createEmptyStage(order: number): FunnelStage {\n return {\n id: generateStageId(),\n order,\n name: `Stage ${order + 1}`,\n description: '',\n filter_logic: 'AND',\n rules: [],\n match_action: 'continue',\n no_match_action: 'continue',\n match_tags: [],\n no_match_tags: [],\n };\n}\n\n/**\n * Validate stage name uniqueness\n */\nfunction validateStageName(name: string, stages: FunnelStage[], currentStageId?: string): string | null {\n const trimmedName = name.trim();\n\n if (!trimmedName) {\n return 'Stage name is required';\n }\n\n const duplicate = stages.find(\n s => s.id !== currentStageId && s.name.trim().toLowerCase() === trimmedName.toLowerCase()\n );\n\n if (duplicate) {\n return 'Stage name must be unique';\n }\n\n return null;\n}\n\n/**\n * Main FunnelStageBuilder component\n */\nexport function FunnelStageBuilder({\n funnel,\n onUpdate,\n fieldRegistry,\n className = '',\n}: FunnelStageBuilderProps) {\n // Track expanded stages\n const [expandedStages, setExpandedStages] = useState<Set<string>>(\n new Set(funnel.stages.map(s => s.id))\n );\n\n // Validation errors\n const [errors, setErrors] = useState<Map<string, string>>(new Map());\n\n // Configure drag-and-drop sensors\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n /**\n * Toggle stage expanded/collapsed\n */\n const toggleExpanded = useCallback((stageId: string) => {\n setExpandedStages(prev => {\n const next = new Set(prev);\n if (next.has(stageId)) {\n next.delete(stageId);\n } else {\n next.add(stageId);\n }\n return next;\n });\n }, []);\n\n /**\n * Add new stage\n */\n const handleAddStage = useCallback((insertAfterIndex?: number) => {\n const newOrder = insertAfterIndex !== undefined ? insertAfterIndex + 1 : funnel.stages.length;\n const newStage = createEmptyStage(newOrder);\n\n // Update orders for stages after insertion point\n const updatedStages = funnel.stages.map(stage => {\n if (stage.order >= newOrder) {\n return { ...stage, order: stage.order + 1 };\n }\n return stage;\n });\n\n // Insert new stage\n updatedStages.splice(newOrder, 0, newStage);\n\n // Expand new stage\n setExpandedStages(prev => new Set(prev).add(newStage.id));\n\n onUpdate({\n ...funnel,\n stages: updatedStages,\n });\n }, [funnel, onUpdate]);\n\n /**\n * Remove stage\n */\n const handleRemoveStage = useCallback((stageId: string) => {\n const stageIndex = funnel.stages.findIndex(s => s.id === stageId);\n if (stageIndex === -1) return;\n\n // Remove stage\n const updatedStages = funnel.stages.filter(s => s.id !== stageId);\n\n // Reorder remaining stages\n updatedStages.forEach((stage, index) => {\n stage.order = index;\n });\n\n // Remove from expanded set\n setExpandedStages(prev => {\n const next = new Set(prev);\n next.delete(stageId);\n return next;\n });\n\n // Remove validation errors\n setErrors(prev => {\n const next = new Map(prev);\n next.delete(stageId);\n return next;\n });\n\n onUpdate({\n ...funnel,\n stages: updatedStages,\n });\n }, [funnel, onUpdate]);\n\n /**\n * Update stage\n */\n const handleUpdateStage = useCallback((updatedStage: FunnelStage) => {\n // Validate stage name\n const nameError = validateStageName(updatedStage.name, funnel.stages, updatedStage.id);\n\n setErrors(prev => {\n const next = new Map(prev);\n if (nameError) {\n next.set(updatedStage.id, nameError);\n } else {\n next.delete(updatedStage.id);\n }\n return next;\n });\n\n const updatedStages = funnel.stages.map(stage =>\n stage.id === updatedStage.id ? updatedStage : stage\n );\n\n onUpdate({\n ...funnel,\n stages: updatedStages,\n });\n }, [funnel, onUpdate]);\n\n /**\n * Handle drag end\n */\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over || active.id === over.id) {\n return;\n }\n\n const oldIndex = funnel.stages.findIndex(s => s.id === active.id);\n const newIndex = funnel.stages.findIndex(s => s.id === over.id);\n\n if (oldIndex === -1 || newIndex === -1) {\n return;\n }\n\n // Reorder stages\n const reorderedStages = arrayMove(funnel.stages, oldIndex, newIndex);\n\n // Update order values\n reorderedStages.forEach((stage, index) => {\n stage.order = index;\n });\n\n onUpdate({\n ...funnel,\n stages: reorderedStages,\n });\n }, [funnel, onUpdate]);\n\n return (\n <div className={`funnel-stage-builder ${className}`}>\n {/* Add stage at top */}\n <div className=\"mb-4\">\n <AddStageButton onClick={() => handleAddStage()} position=\"top\" />\n </div>\n\n {/* Stage list with drag-and-drop */}\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={funnel.stages.map(s => s.id)}\n strategy={verticalListSortingStrategy}\n >\n {funnel.stages.map((stage, index) => (\n <div key={stage.id} className=\"stage-wrapper\">\n <StageCard\n stage={stage}\n expanded={expandedStages.has(stage.id)}\n onToggleExpanded={() => toggleExpanded(stage.id)}\n onUpdate={handleUpdateStage}\n onRemove={() => handleRemoveStage(stage.id)}\n fieldRegistry={fieldRegistry}\n error={errors.get(stage.id)}\n showWarnings={stage.rules.length === 0}\n />\n\n {/* Flow arrow between stages */}\n {index < funnel.stages.length - 1 && (\n <div className=\"stage-arrow\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 5v14m0 0l-4-4m4 4l4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n ))}\n </SortableContext>\n </DndContext>\n\n {/* Add stage at bottom */}\n {funnel.stages.length > 0 && (\n <div className=\"mt-4\">\n <AddStageButton\n onClick={() => handleAddStage(funnel.stages.length - 1)}\n position=\"bottom\"\n />\n </div>\n )}\n\n {/* Empty state */}\n {funnel.stages.length === 0 && (\n <div className=\"empty-state\">\n <p className=\"text-gray-500 text-center py-8\">\n No stages yet. Add your first stage to get started.\n </p>\n </div>\n )}\n </div>\n );\n}\n","/**\n * RunFilters Component\n *\n * Filter controls for funnel run history.\n *\n * Design Rationale:\n * - Inline filter controls for immediate feedback\n * - Dropdown selects for constrained options\n * - Date range picker for flexible filtering\n * - Clear visual separation from table\n *\n * Interaction Notes:\n * - Filters apply immediately on change (no \"Apply\" button)\n * - Default to \"Last 30 days\" for performance\n * - Clear button resets all filters\n */\n\nimport { FunnelRunStatus, TriggerType } from '../../types';\nimport { RunFilters as RunFiltersType } from './types';\n\ninterface RunFiltersProps {\n filters: RunFiltersType;\n onFiltersChange: (filters: RunFiltersType) => void;\n className?: string;\n}\n\nexport function RunFilters({\n filters,\n onFiltersChange,\n className = '',\n}: RunFiltersProps) {\n const updateFilter = <K extends keyof RunFiltersType>(\n key: K,\n value: RunFiltersType[K]\n ) => {\n onFiltersChange({ ...filters, [key]: value });\n };\n\n const clearFilters = () => {\n onFiltersChange({\n status: 'all',\n trigger_type: 'all',\n date_range: 'month',\n });\n };\n\n const hasActiveFilters =\n filters.status !== 'all' ||\n filters.trigger_type !== 'all' ||\n filters.date_range !== 'month';\n\n return (\n <div\n className={`flex items-center gap-3 p-3 bg-gray-50 border-b border-gray-200 ${className}`}\n >\n {/* Status Filter */}\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"status-filter\" className=\"text-sm font-medium text-gray-700\">\n Status:\n </label>\n <select\n id=\"status-filter\"\n value={filters.status || 'all'}\n onChange={(e) =>\n updateFilter('status', e.target.value as FunnelRunStatus | 'all')\n }\n className=\"px-2 py-1 text-sm border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All</option>\n <option value=\"completed\">Complete</option>\n <option value=\"running\">Running</option>\n <option value=\"failed\">Failed</option>\n <option value=\"pending\">Pending</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n </div>\n\n {/* Trigger Type Filter */}\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"trigger-filter\" className=\"text-sm font-medium text-gray-700\">\n Trigger:\n </label>\n <select\n id=\"trigger-filter\"\n value={filters.trigger_type || 'all'}\n onChange={(e) =>\n updateFilter('trigger_type', e.target.value as TriggerType | 'all')\n }\n className=\"px-2 py-1 text-sm border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All</option>\n <option value=\"manual\">Manual</option>\n <option value=\"scheduled\">Scheduled</option>\n <option value=\"webhook\">Webhook</option>\n <option value=\"api\">API</option>\n </select>\n </div>\n\n {/* Date Range Filter */}\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"date-filter\" className=\"text-sm font-medium text-gray-700\">\n Date:\n </label>\n <select\n id=\"date-filter\"\n value={filters.date_range || 'month'}\n onChange={(e) => updateFilter('date_range', e.target.value as any)}\n className=\"px-2 py-1 text-sm border border-gray-300 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All time</option>\n <option value=\"today\">Today</option>\n <option value=\"week\">Last 7 days</option>\n <option value=\"month\">Last 30 days</option>\n </select>\n </div>\n\n {/* Clear Button */}\n {hasActiveFilters && (\n <button\n onClick={clearFilters}\n className=\"ml-auto px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Clear filters\n </button>\n )}\n </div>\n );\n}\n","/**\n * RunStatusBadge Component\n *\n * Displays funnel run status with icon and color coding.\n *\n * Design Rationale:\n * - Icons provide instant visual recognition\n * - Color coding reinforces status meaning\n * - Spinning animation for active states\n * - Accessible with both visual and text indicators\n */\n\nimport { FunnelRunStatus } from '../../types';\n\ninterface RunStatusBadgeProps {\n status: FunnelRunStatus;\n className?: string;\n}\n\ninterface StatusConfig {\n icon: string;\n label: string;\n color: string;\n bgColor: string;\n spinning?: boolean;\n}\n\nconst statusConfig: Record<FunnelRunStatus, StatusConfig> = {\n completed: {\n icon: '✓',\n label: 'Complete',\n color: 'text-green-800',\n bgColor: 'bg-green-100',\n },\n running: {\n icon: '⏸',\n label: 'Running',\n color: 'text-blue-800',\n bgColor: 'bg-blue-100',\n spinning: true,\n },\n failed: {\n icon: '✗',\n label: 'Failed',\n color: 'text-red-800',\n bgColor: 'bg-red-100',\n },\n pending: {\n icon: '○',\n label: 'Pending',\n color: 'text-yellow-800',\n bgColor: 'bg-yellow-100',\n },\n cancelled: {\n icon: '×',\n label: 'Cancelled',\n color: 'text-gray-800',\n bgColor: 'bg-gray-100',\n },\n};\n\nexport function RunStatusBadge({ status, className = '' }: RunStatusBadgeProps) {\n const config = statusConfig[status];\n\n return (\n <span\n className={`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium ${config.bgColor} ${config.color} ${className}`}\n >\n <span className={config.spinning ? 'animate-spin' : ''} aria-hidden=\"true\">\n {config.icon}\n </span>\n <span>{config.label}</span>\n </span>\n );\n}\n","/**\n * RunActions Component\n *\n * Action dropdown menu for individual run rows.\n *\n * Design Rationale:\n * - Dropdown menu keeps UI clean and compact\n * - Icons provide visual cues for actions\n * - Disabled states for invalid actions\n * - Confirmation for destructive actions (cancel)\n *\n * Accessibility:\n * - Keyboard navigation (arrow keys, Enter, Escape)\n * - Focus management\n * - ARIA attributes for screen readers\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { FunnelRun } from '../../types';\n\ninterface RunActionsProps {\n run: FunnelRun;\n onViewDetails: (run: FunnelRun) => void;\n onViewResults: (run: FunnelRun) => void;\n onReRun: (run: FunnelRun) => void;\n onCancel?: (run: FunnelRun) => void;\n className?: string;\n}\n\nexport function RunActions({\n run,\n onViewDetails,\n onViewResults,\n onReRun,\n onCancel,\n className = '',\n}: RunActionsProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const canCancel = run.status === 'pending' || run.status === 'running';\n const canViewResults = run.status === 'completed';\n\n return (\n <div className={`relative ${className}`} ref={dropdownRef}>\n {/* Trigger Button */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"p-1 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Run actions\"\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\"\n />\n </svg>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div\n className=\"absolute right-0 mt-1 w-48 bg-white rounded-md shadow-lg border border-gray-200 z-10\"\n role=\"menu\"\n >\n <div className=\"py-1\">\n {/* View Details */}\n <button\n onClick={() => {\n onViewDetails(run);\n setIsOpen(false);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">👁</span>\n View Details\n </button>\n\n {/* View Results */}\n <button\n onClick={() => {\n onViewResults(run);\n setIsOpen(false);\n }}\n disabled={!canViewResults}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">📊</span>\n View Results\n </button>\n\n {/* Re-run */}\n <button\n onClick={() => {\n onReRun(run);\n setIsOpen(false);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">↻</span>\n Re-run\n </button>\n\n {/* Cancel (if running/pending) */}\n {canCancel && onCancel && (\n <>\n <div className=\"border-t border-gray-200 my-1\" />\n <button\n onClick={() => {\n if (confirm('Are you sure you want to cancel this run?')) {\n onCancel(run);\n setIsOpen(false);\n }\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-red-600 hover:bg-red-50 flex items-center gap-2\"\n role=\"menuitem\"\n >\n <span aria-hidden=\"true\">×</span>\n Cancel Run\n </button>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * FunnelRunHistory Utilities\n *\n * Helper functions for formatting and calculations\n */\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * Examples:\n * - 1234 → \"1.2s\"\n * - 65000 → \"1m 5s\"\n * - 3661000 → \"1h 1m\"\n */\nexport function formatDuration(ms?: number): string {\n if (ms === undefined || ms === null) return '-';\n if (ms === 0) return '0ms';\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;\n }\n\n if (minutes > 0) {\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\n }\n\n if (seconds > 0) {\n return `${seconds}s`;\n }\n\n return `${ms}ms`;\n}\n\n/**\n * Format relative time\n *\n * Examples:\n * - 5 minutes ago → \"5m ago\"\n * - 2 hours ago → \"2h ago\"\n * - Yesterday → \"1d ago\"\n */\nexport function formatRelativeTime(date: Date | string): string {\n const now = new Date();\n const then = new Date(date);\n const diffMs = now.getTime() - then.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) {\n return `${diffDays}d ago`;\n }\n\n if (diffHours > 0) {\n return `${diffHours}h ago`;\n }\n\n if (diffMinutes > 0) {\n return `${diffMinutes}m ago`;\n }\n\n return 'Just now';\n}\n\n/**\n * Calculate match rate percentage\n */\nexport function calculateMatchRate(matched: number, total: number): number {\n if (total === 0) return 0;\n return Math.round((matched / total) * 100);\n}\n\n/**\n * Format number with commas\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString();\n}\n\n/**\n * Format full timestamp for tooltips\n */\nexport function formatFullTimestamp(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n","/**\n * RunRow Component\n *\n * Individual table row for a funnel run.\n *\n * Design Rationale:\n * - Clickable row opens details modal\n * - Hover state provides visual feedback\n * - Action button visible on hover for cleaner UI\n * - Tooltip on date shows full timestamp\n *\n * Interaction Notes:\n * - Click anywhere on row to view details\n * - Action dropdown prevents row click propagation\n * - Keyboard accessible (Enter to open details)\n */\n\nimport { FunnelRun } from '../../types';\nimport { RunStatusBadge } from './RunStatusBadge';\nimport { RunActions } from './RunActions';\nimport {\n formatDuration,\n formatRelativeTime,\n formatFullTimestamp,\n calculateMatchRate,\n formatNumber,\n} from './utils';\n\ninterface RunRowProps {\n run: FunnelRun;\n onViewDetails: (run: FunnelRun) => void;\n onViewResults: (run: FunnelRun) => void;\n onReRun: (run: FunnelRun) => void;\n onCancel?: (run: FunnelRun) => void;\n}\n\nexport function RunRow({\n run,\n onViewDetails,\n onViewResults,\n onReRun,\n onCancel,\n}: RunRowProps) {\n const matchRate =\n run.status === 'completed'\n ? calculateMatchRate(run.total_matched, run.total_input)\n : null;\n\n return (\n <tr\n onClick={() => onViewDetails(run)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onViewDetails(run);\n }\n }}\n tabIndex={0}\n className=\"border-b border-gray-200 hover:bg-gray-50 cursor-pointer transition-colors focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500\"\n >\n {/* Date */}\n <td className=\"px-4 py-3\">\n <span\n className=\"text-sm text-gray-900\"\n title={formatFullTimestamp(run.started_at)}\n >\n {formatRelativeTime(run.started_at)}\n </span>\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-3\">\n <RunStatusBadge status={run.status} />\n </td>\n\n {/* Trigger */}\n <td className=\"px-4 py-3\">\n <span className=\"text-sm text-gray-700 capitalize\">\n {run.trigger_type}\n </span>\n </td>\n\n {/* Duration */}\n <td className=\"px-4 py-3\">\n <span className=\"text-sm text-gray-900\">\n {formatDuration(run.duration_ms)}\n </span>\n </td>\n\n {/* Input */}\n <td className=\"px-4 py-3 text-right\">\n <span className=\"text-sm font-medium text-gray-900\">\n {formatNumber(run.total_input)}\n </span>\n </td>\n\n {/* Matched */}\n <td className=\"px-4 py-3 text-right\">\n <span className=\"text-sm font-medium text-green-600\">\n {run.status === 'completed' ? formatNumber(run.total_matched) : '-'}\n </span>\n </td>\n\n {/* Match Rate % */}\n <td className=\"px-4 py-3 text-right\">\n <span className=\"text-sm font-medium text-gray-900\">\n {matchRate !== null ? `${matchRate}%` : '-'}\n </span>\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-3\" onClick={(e) => e.stopPropagation()}>\n <RunActions\n run={run}\n onViewDetails={onViewDetails}\n onViewResults={onViewResults}\n onReRun={onReRun}\n onCancel={onCancel}\n />\n </td>\n </tr>\n );\n}\n","/**\n * StageBreakdownList Component\n *\n * Displays stage-by-stage execution statistics.\n *\n * Design Rationale:\n * - Sequential numbering shows funnel flow\n * - Input → Matched with delta shows filtering effect\n * - Color coding: green for matched, red for excluded\n * - Arrow symbols reinforce flow direction\n *\n * Visual Hierarchy:\n * - Stage name is prominent\n * - Numbers are large and easy to scan\n * - Delta shows impact at each stage\n */\n\nimport { StageStats } from '../../types';\nimport { formatNumber } from './utils';\n\ninterface StageBreakdownListProps {\n stages: StageStats[];\n className?: string;\n}\n\nexport function StageBreakdownList({\n stages,\n className = '',\n}: StageBreakdownListProps) {\n return (\n <div className={`space-y-3 ${className}`}>\n {stages.map((stage, index) => {\n const delta = stage.matched_count - stage.input_count;\n const matchRate =\n stage.input_count > 0\n ? Math.round((stage.matched_count / stage.input_count) * 100)\n : 0;\n\n return (\n <div\n key={stage.stage_id}\n className=\"p-3 bg-gray-50 rounded-lg border border-gray-200\"\n >\n {/* Stage Header */}\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"flex items-center justify-center w-6 h-6 text-xs font-bold text-white bg-blue-600 rounded-full\">\n {index + 1}\n </span>\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {stage.stage_name}\n </h4>\n </div>\n\n {/* Stage Stats */}\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n {/* Input */}\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Input</div>\n <div className=\"text-lg font-bold text-blue-600\">\n {formatNumber(stage.input_count)}\n </div>\n </div>\n\n {/* Matched */}\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Matched</div>\n <div className=\"text-lg font-bold text-green-600\">\n {formatNumber(stage.matched_count)}\n </div>\n </div>\n\n {/* Match Rate */}\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Rate</div>\n <div className=\"text-lg font-bold text-gray-700\">{matchRate}%</div>\n </div>\n </div>\n\n {/* Delta */}\n {delta !== 0 && (\n <div className=\"mt-2 pt-2 border-t border-gray-200\">\n <div className=\"flex items-center justify-center gap-1 text-sm\">\n <span\n className={`font-medium ${\n delta > 0 ? 'text-green-600' : 'text-red-600'\n }`}\n >\n {delta > 0 ? '▲' : '▼'} {formatNumber(Math.abs(delta))}\n </span>\n <span className=\"text-gray-500\">\n {delta > 0 ? 'added' : 'excluded'}\n </span>\n </div>\n </div>\n )}\n\n {/* Error Count */}\n {stage.error_count && stage.error_count > 0 && (\n <div className=\"mt-2 pt-2 border-t border-gray-200\">\n <div className=\"text-sm text-red-600 text-center\">\n ⚠ {formatNumber(stage.error_count)} errors\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * RunDetailsModal Component\n *\n * Modal dialog showing detailed run information and stage breakdown.\n *\n * Design Rationale:\n * - Modal overlay focuses attention on details\n * - Stage breakdown shows funnel flow clearly\n * - Action buttons provide next steps\n * - Close on overlay click or Escape key\n *\n * Accessibility:\n * - Focus trap within modal\n * - Escape key closes modal\n * - ARIA dialog attributes\n * - Backdrop click closes modal\n */\n\nimport { useEffect, useRef } from 'react';\nimport { FunnelRun } from '../../types';\nimport { RunStatusBadge } from './RunStatusBadge';\nimport { StageBreakdownList } from './StageBreakdownList';\nimport {\n formatDuration,\n formatRelativeTime,\n formatFullTimestamp,\n} from './utils';\n\ninterface RunDetailsModalProps {\n run: FunnelRun | null;\n onClose: () => void;\n onViewResults?: (run: FunnelRun) => void;\n onReRun?: (run: FunnelRun) => void;\n}\n\nexport function RunDetailsModal({\n run,\n onClose,\n onViewResults,\n onReRun,\n}: RunDetailsModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (run) {\n document.addEventListener('keydown', handleEscape);\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }\n }, [run, onClose]);\n\n // Focus trap\n useEffect(() => {\n if (run && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n firstElement?.focus();\n\n const handleTab = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n };\n\n document.addEventListener('keydown', handleTab);\n return () => document.removeEventListener('keydown', handleTab);\n }\n }, [run]);\n\n if (!run) return null;\n\n const stageStatsArray = Object.values(run.stage_stats);\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"modal-title\"\n >\n <div\n ref={modalRef}\n onClick={(e) => e.stopPropagation()}\n className=\"bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden flex flex-col\"\n >\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <h2 id=\"modal-title\" className=\"text-lg font-semibold text-gray-900\">\n Run Details\n </h2>\n <button\n onClick={onClose}\n className=\"p-1 text-gray-400 hover:text-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"px-6 py-4 overflow-y-auto flex-1\">\n {/* Run Summary */}\n <div className=\"mb-6\">\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Status</div>\n <RunStatusBadge status={run.status} />\n </div>\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Duration</div>\n <div className=\"text-sm font-medium text-gray-900\">\n {formatDuration(run.duration_ms)}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Started</div>\n <div className=\"text-sm font-medium text-gray-900\">\n <span title={formatFullTimestamp(run.started_at)}>\n {formatRelativeTime(run.started_at)}\n </span>\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Triggered by</div>\n <div className=\"text-sm font-medium text-gray-900\">\n {run.triggered_by || 'System'} ({run.trigger_type})\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {run.status === 'failed' && run.error && (\n <div className=\"p-3 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"text-sm font-medium text-red-800 mb-1\">\n Error\n </div>\n <div className=\"text-sm text-red-700\">{run.error}</div>\n </div>\n )}\n </div>\n\n {/* Stage Breakdown */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n Stage Breakdown\n </h3>\n {stageStatsArray.length > 0 ? (\n <StageBreakdownList stages={stageStatsArray} />\n ) : (\n <div className=\"text-sm text-gray-500 text-center py-4\">\n No stage data available\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-gray-200 flex items-center justify-end gap-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Close\n </button>\n {onReRun && (\n <button\n onClick={() => {\n onReRun(run);\n onClose();\n }}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n ↻ Re-run\n </button>\n )}\n {onViewResults && run.status === 'completed' && (\n <button\n onClick={() => {\n onViewResults(run);\n onClose();\n }}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n View Results\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * FunnelRunHistory Component\n *\n * Displays execution history for a funnel with filtering, sorting, and pagination.\n *\n * Design Goal:\n * Users should be able to quickly scan run history, filter by status/trigger/date,\n * view detailed breakdowns, and take actions (re-run, view results, cancel).\n *\n * Visual Hierarchy:\n * - Header with title and refresh controls\n * - Filter bar for narrowing results\n * - Table showing run history (sorted by date by default)\n * - Pagination controls\n * - Details modal for deep dive\n *\n * Interaction Notes:\n * - Auto-refresh when active runs exist (every 5 seconds)\n * - Click row to view details\n * - Action dropdown for quick actions\n * - Filters apply immediately\n * - Pagination loads new data\n *\n * Responsive Behavior:\n * - Desktop: Full table with all columns\n * - Tablet: Hide duration and trigger columns\n * - Mobile: Card-based layout (responsive table variant)\n *\n * Accessibility:\n * - Keyboard navigation throughout\n * - ARIA labels for screen readers\n * - Loading states announced\n * - Error states clearly communicated\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { FunnelRun } from '../../types';\nimport { FunnelApiClient } from '../../api/client';\nimport { RunFilters } from './RunFilters';\nimport { RunRow } from './RunRow';\nimport { RunDetailsModal } from './RunDetailsModal';\nimport { RunFilters as RunFiltersType, Pagination } from './types';\n\ninterface FunnelRunHistoryProps {\n funnelId: string;\n apiClient: FunnelApiClient;\n onViewResults?: (run: FunnelRun) => void;\n className?: string;\n}\n\nexport function FunnelRunHistory({\n funnelId,\n apiClient,\n onViewResults,\n className = '',\n}: FunnelRunHistoryProps) {\n // State\n const [runs, setRuns] = useState<FunnelRun[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [selectedRun, setSelectedRun] = useState<FunnelRun | null>(null);\n const [filters, setFilters] = useState<RunFiltersType>({\n status: 'all',\n trigger_type: 'all',\n date_range: 'month',\n });\n const [pagination, setPagination] = useState<Pagination>({\n page: 1,\n page_size: 10,\n total: 0,\n });\n const [isRefreshing, setIsRefreshing] = useState(false);\n\n // Load runs\n const loadRuns = useCallback(async () => {\n try {\n setError(null);\n const params: any = {\n page: pagination.page,\n page_size: pagination.page_size,\n ordering: '-started_at', // Most recent first\n };\n\n // Add filters\n if (filters.status && filters.status !== 'all') {\n params.status = filters.status;\n }\n if (filters.trigger_type && filters.trigger_type !== 'all') {\n params.trigger_type = filters.trigger_type;\n }\n\n const response = await apiClient.getFunnelRuns(funnelId, params);\n\n setRuns(response.results);\n setPagination((prev) => ({\n ...prev,\n total: response.count,\n }));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load runs');\n console.error('Failed to load funnel runs:', err);\n } finally {\n setIsLoading(false);\n setIsRefreshing(false);\n }\n }, [funnelId, apiClient, pagination.page, pagination.page_size, filters]);\n\n // Load runs on mount and when dependencies change\n useEffect(() => {\n loadRuns();\n }, [loadRuns]);\n\n // Auto-refresh for active runs\n useEffect(() => {\n const hasActiveRuns = runs.some(\n (r) => r.status === 'pending' || r.status === 'running'\n );\n\n if (hasActiveRuns) {\n const interval = setInterval(() => {\n setIsRefreshing(true);\n loadRuns();\n }, 5000); // Poll every 5 seconds\n\n return () => clearInterval(interval);\n }\n }, [runs, loadRuns]);\n\n // Manual refresh\n const handleRefresh = () => {\n setIsRefreshing(true);\n loadRuns();\n };\n\n // Actions\n const handleReRun = async (run: FunnelRun) => {\n try {\n await apiClient.runFunnel(funnelId, {\n trigger_type: 'manual',\n metadata: { re_run_of: run.id },\n });\n // Refresh to show new run\n loadRuns();\n } catch (err) {\n console.error('Failed to re-run funnel:', err);\n alert('Failed to re-run funnel. Please try again.');\n }\n };\n\n const handleCancel = async (run: FunnelRun) => {\n try {\n await apiClient.cancelFunnelRun(run.id);\n // Refresh to show updated status\n loadRuns();\n } catch (err) {\n console.error('Failed to cancel run:', err);\n alert('Failed to cancel run. Please try again.');\n }\n };\n\n const handleViewResults = (run: FunnelRun) => {\n if (onViewResults) {\n onViewResults(run);\n } else {\n // Default: open details modal\n setSelectedRun(run);\n }\n };\n\n // Pagination\n const totalPages = Math.ceil(pagination.total / pagination.page_size);\n const canGoBack = pagination.page > 1;\n const canGoForward = pagination.page < totalPages;\n\n const handlePreviousPage = () => {\n if (canGoBack) {\n setPagination((prev) => ({ ...prev, page: prev.page - 1 }));\n }\n };\n\n const handleNextPage = () => {\n if (canGoForward) {\n setPagination((prev) => ({ ...prev, page: prev.page + 1 }));\n }\n };\n\n const startIndex = (pagination.page - 1) * pagination.page_size + 1;\n const endIndex = Math.min(\n pagination.page * pagination.page_size,\n pagination.total\n );\n\n return (\n <div className={`bg-white rounded-lg border border-gray-200 ${className}`}>\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-gray-200 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-gray-900\">\n Funnel Run History\n </h2>\n <button\n onClick={handleRefresh}\n disabled={isRefreshing}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Refresh run history\"\n >\n <span className={isRefreshing ? 'animate-spin inline-block' : ''}>\n ↻\n </span>{' '}\n Refresh\n </button>\n </div>\n\n {/* Filters */}\n <RunFilters filters={filters} onFiltersChange={setFilters} />\n\n {/* Table */}\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead className=\"bg-gray-50 border-b border-gray-200\">\n <tr>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Date\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Trigger\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Duration\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Input\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n Matched\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n %\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-gray-600 uppercase tracking-wider\">\n <span className=\"sr-only\">Actions</span>\n </th>\n </tr>\n </thead>\n <tbody>\n {isLoading && runs.length === 0 ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-gray-500\">Loading runs...</div>\n </td>\n </tr>\n ) : error ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-red-600\">Error: {error}</div>\n <button\n onClick={loadRuns}\n className=\"mt-2 text-sm text-blue-600 hover:text-blue-700 underline\"\n >\n Try again\n </button>\n </td>\n </tr>\n ) : runs.length === 0 ? (\n <tr>\n <td colSpan={8} className=\"px-4 py-12 text-center\">\n <div className=\"text-gray-500\">\n No runs found. Run this funnel to see history.\n </div>\n </td>\n </tr>\n ) : (\n runs.map((run) => (\n <RunRow\n key={run.id}\n run={run}\n onViewDetails={setSelectedRun}\n onViewResults={handleViewResults}\n onReRun={handleReRun}\n onCancel={handleCancel}\n />\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {runs.length > 0 && (\n <div className=\"px-6 py-3 border-t border-gray-200 flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n Showing {startIndex}-{endIndex} of {pagination.total}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handlePreviousPage}\n disabled={!canGoBack}\n className=\"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Previous page\"\n >\n ‹\n </button>\n <span className=\"text-sm text-gray-600\">\n Page {pagination.page} of {totalPages}\n </span>\n <button\n onClick={handleNextPage}\n disabled={!canGoForward}\n className=\"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n aria-label=\"Next page\"\n >\n ›\n </button>\n </div>\n </div>\n )}\n\n {/* Details Modal */}\n <RunDetailsModal\n run={selectedRun}\n onClose={() => setSelectedRun(null)}\n onViewResults={onViewResults}\n onReRun={handleReRun}\n />\n </div>\n );\n}\n"]}