{"version":3,"file":"praxisui-visual-builder.mjs","sources":["../../../projects/praxis-visual-builder/src/lib/models/rule-builder.model.ts","../../../projects/praxis-visual-builder/src/lib/models/field-schema.model.ts","../../../projects/praxis-visual-builder/src/lib/components/field-condition-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/conditional-validator-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/collection-validator-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-node.component.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-canvas.component.ts","../../../projects/praxis-visual-builder/src/lib/components/metadata-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/dsl-viewer.component.ts","../../../projects/praxis-visual-builder/src/lib/components/json-viewer.component.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-node-registry.service.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/conversion-context.interface.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/rule-converter.interface.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/field-condition.converter.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/boolean-group.converter.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/cardinality.converter.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/converter-factory.service.ts","../../../projects/praxis-visual-builder/src/lib/services/specification-bridge.service.ts","../../../projects/praxis-visual-builder/src/lib/services/round-trip-validator.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-builder.service.ts","../../../projects/praxis-visual-builder/src/lib/components/round-trip-tester.component.ts","../../../projects/praxis-visual-builder/src/lib/services/export-integration.service.ts","../../../projects/praxis-visual-builder/src/lib/components/export-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/dsl-linter.component.ts","../../../projects/praxis-visual-builder/src/lib/services/field-schema.service.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/praxis-visual-builder.ts","../../../projects/praxis-visual-builder/src/lib/models/array-field-schema.model.ts","../../../projects/praxis-visual-builder/src/lib/services/webhook-integration.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-template.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-validation.service.ts","../../../projects/praxis-visual-builder/src/lib/errors/visual-builder-errors.ts","../../../projects/praxis-visual-builder/src/lib/services/dsl/dsl-parsing.service.ts","../../../projects/praxis-visual-builder/src/lib/services/context/context-management.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-conversion.service.ts","../../../projects/praxis-visual-builder/src/lib/components/visual-rule-builder.component.ts","../../../projects/praxis-visual-builder/src/lib/components/template-editor-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/template-preview-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/template-gallery.component.ts","../../../projects/praxis-visual-builder/src/public-api.ts","../../../projects/praxis-visual-builder/src/praxisui-visual-builder.ts"],"sourcesContent":["/**\n * Models for the Visual Rule Builder\n */\n\nimport {\n  ContextProvider,\n  type FunctionRegistry,\n} from '@praxisui/specification';\nimport { type SpecificationMetadata } from '@praxisui/specification-core';\nexport type { SpecificationMetadata };\n\n/**\n * Value types for rule configuration\n */\nexport type ValueType = 'literal' | 'field' | 'context' | 'function';\n\n/**\n * Valid comparison operators (aligned with @praxisui/specification)\n */\nexport type ValidComparisonOperator =\n  | 'eq'\n  | 'neq'\n  | 'lt'\n  | 'lte'\n  | 'gt'\n  | 'gte'\n  | 'contains'\n  | 'startsWith'\n  | 'endsWith'\n  | 'in';\n\nexport interface RuleNode {\n  /** Unique identifier for this rule node */\n  id: string;\n\n  /** Type of rule node */\n  type: RuleNodeType | RuleNodeTypeString;\n\n  /** Human-readable label for this rule */\n  label?: string;\n\n  /** Rule metadata */\n  metadata?: SpecificationMetadata;\n\n  /** Whether this node is currently selected */\n  selected?: boolean;\n\n  /** Whether this node is expanded (for groups) */\n  expanded?: boolean;\n\n  /** Parent node ID */\n  parentId?: string;\n\n  /** Child node IDs (for groups) */\n  children?: string[];\n\n  /** Rule-specific configuration */\n  config?: RuleNodeConfig;\n}\n\nexport enum RuleNodeType {\n  // Basic field comparisons\n  FIELD_CONDITION = 'fieldCondition',\n\n  // Boolean compositions\n  AND_GROUP = 'andGroup',\n  OR_GROUP = 'orGroup',\n  NOT_GROUP = 'notGroup',\n  XOR_GROUP = 'xorGroup',\n  IMPLIES_GROUP = 'impliesGroup',\n\n  // Conditional validators (Phase 1 Implementation)\n  REQUIRED_IF = 'requiredIf',\n  VISIBLE_IF = 'visibleIf',\n  DISABLED_IF = 'disabledIf',\n  READONLY_IF = 'readonlyIf',\n\n  // Collection validations\n  FOR_EACH = 'forEach',\n  UNIQUE_BY = 'uniqueBy',\n  MIN_LENGTH = 'minLength',\n  MAX_LENGTH = 'maxLength',\n\n  // Optional field handling\n  IF_DEFINED = 'ifDefined',\n  IF_NOT_NULL = 'ifNotNull',\n  IF_EXISTS = 'ifExists',\n  WITH_DEFAULT = 'withDefault',\n\n  // Advanced types\n  FUNCTION_CALL = 'functionCall',\n  FIELD_TO_FIELD = 'fieldToField',\n  CONTEXTUAL = 'contextual',\n  AT_LEAST = 'atLeast',\n  EXACTLY = 'exactly',\n\n  // Phase 4: Expression and Contextual Support\n  EXPRESSION = 'expression',\n  CONTEXTUAL_TEMPLATE = 'contextualTemplate',\n\n  // Custom/extensible\n  CUSTOM = 'custom',\n}\n\n/**\n * String literal type for rule node types (for flexibility)\n */\nexport type RuleNodeTypeString =\n  | 'fieldCondition'\n  | 'andGroup'\n  | 'orGroup'\n  | 'notGroup'\n  | 'xorGroup'\n  | 'impliesGroup'\n  | 'requiredIf'\n  | 'visibleIf'\n  | 'disabledIf'\n  | 'readonlyIf'\n  | 'forEach'\n  | 'uniqueBy'\n  | 'minLength'\n  | 'maxLength'\n  | 'ifDefined'\n  | 'ifNotNull'\n  | 'ifExists'\n  | 'withDefault'\n  | 'functionCall'\n  | 'fieldToField'\n  | 'contextual'\n  | 'atLeast'\n  | 'exactly'\n  | 'expression'\n  | 'contextualTemplate'\n  | 'custom';\n\nexport type RuleNodeConfig =\n  | FieldConditionConfig\n  | BooleanGroupConfig\n  | ConditionalValidatorConfig\n  | CollectionValidationConfig\n  | CollectionValidatorConfig\n  | OptionalFieldConfig\n  | FunctionCallConfig\n  | FieldToFieldConfig\n  | ContextualConfig\n  | CardinalityConfig\n  | ExpressionConfig\n  | ContextualTemplateConfig\n  | CustomConfig;\n\nexport interface FieldConditionConfig {\n  type: 'fieldCondition';\n  /** Primary field name */\n  fieldName: string;\n  /** Comparison operator aligned with @praxisui/specification */\n  operator: ValidComparisonOperator | string;\n  /** Comparison value */\n  value: unknown;\n  /** Type of value for proper handling */\n  valueType?: ValueType;\n  /** Field to compare against (for field-to-field comparisons) */\n  compareToField?: string;\n  /** Context variable to use as value */\n  contextVariable?: string;\n  /** Optional metadata for error messages and UI hints */\n  metadata?: SpecificationMetadata;\n  /** Legacy field alias for backward compatibility */\n  field?: string;\n}\n\nexport interface BooleanGroupConfig {\n  type: 'booleanGroup' | 'andGroup' | 'orGroup' | 'notGroup' | 'xorGroup' | 'impliesGroup';\n  /** Boolean operator type */\n  operator: 'and' | 'or' | 'not' | 'xor' | 'implies';\n  /** Minimum required true conditions (for atLeast scenarios) */\n  minimumRequired?: number;\n  /** Exact required true conditions (for exactly scenarios) */\n  exactRequired?: number;\n  /** Optional metadata for group validation */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface ConditionalValidatorConfig {\n  type: 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf';\n  /** Specific validator type (mirrors type for backward compatibility) */\n  validatorType: 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf';\n  /** Target field to apply conditional logic */\n  targetField: string;\n  /** Optional single condition (legacy support) */\n  condition?: RuleNode;\n  /** Multiple conditions for advanced mode */\n  conditions?: RuleNode[];\n  /** Reference to condition rule node ID (for backward compatibility) */\n  conditionNodeId?: string;\n  /** Whether to invert the condition result */\n  inverse?: boolean;\n  /** Logic operator to combine multiple conditions */\n  logicOperator?: 'and' | 'or';\n  /** Custom error message */\n  errorMessage?: string;\n  /** Validate on value change */\n  validateOnChange?: boolean;\n  /** Validate on blur */\n  validateOnBlur?: boolean;\n  /** Show error immediately */\n  showErrorImmediately?: boolean;\n  /** Animation type */\n  animation?: string;\n  /** Hide field label */\n  hideLabel?: boolean;\n  /** Preserve space when hidden */\n  preserveSpace?: boolean;\n  /** Style when disabled */\n  disabledStyle?: string;\n  /** Clear value when disabled */\n  clearOnDisable?: boolean;\n  /** Show disabled message */\n  showDisabledMessage?: boolean;\n  /** Custom disabled message */\n  disabledMessage?: string;\n  /** Readonly style */\n  readonlyStyle?: string;\n  /** Show readonly indicator */\n  showReadonlyIndicator?: boolean;\n  /** Metadata aligned with @praxisui/specification */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface CollectionValidationConfig {\n  type: 'collectionValidation';\n  /** Type of collection validation */\n  validationType: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n  /** Array field to validate */\n  arrayField: string;\n  /** Reference to rule node ID for forEach validation */\n  itemCondition?: string;\n  /** Property name for uniqueBy validation */\n  uniqueKey?: string;\n  /** Length value for min/max length validation */\n  lengthValue?: number;\n  /** Optional metadata for validation */\n  metadata?: SpecificationMetadata;\n}\n\n/**\n * Enhanced collection validator configuration (Phase 2 Implementation)\n * Aligned with @praxisui/specification collection validation patterns\n */\nexport interface CollectionValidatorConfig {\n  type: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n  /** Target collection field name */\n  targetCollection: string;\n\n  // For Each specific\n  /** Variable name for current item in forEach */\n  itemVariable?: string;\n  /** Variable name for current index in forEach */\n  indexVariable?: string;\n  /** Validation rules applied to each item */\n  itemValidationRules?: {\n    ruleType: string;\n    fieldPath: string;\n    errorMessage?: string;\n  }[];\n\n  // Unique By specific\n  /** Fields to check uniqueness by */\n  uniqueByFields?: string[];\n  /** Case-sensitive uniqueness check */\n  caseSensitive?: boolean;\n  /** Ignore empty values in uniqueness check */\n  ignoreEmpty?: boolean;\n  /** Custom error message for duplicates */\n  duplicateErrorMessage?: string;\n\n  // Length specific\n  /** Minimum number of items */\n  minItems?: number;\n  /** Maximum number of items */\n  maxItems?: number;\n  /** Custom error message for length validation */\n  lengthErrorMessage?: string;\n  /** Show current item count in UI */\n  showItemCount?: boolean;\n  /** Prevent adding items beyond maxItems */\n  preventExcess?: boolean;\n\n  // Advanced options\n  /** Validate when items are added */\n  validateOnAdd?: boolean;\n  /** Validate when items are removed */\n  validateOnRemove?: boolean;\n  /** Validate when items are changed */\n  validateOnChange?: boolean;\n  /** Validate on form submit */\n  validateOnSubmit?: boolean;\n  /** Error display strategy */\n  errorStrategy?: 'summary' | 'inline' | 'both';\n  /** Stop validation on first error */\n  stopOnFirstError?: boolean;\n  /** Highlight items with errors */\n  highlightErrorItems?: boolean;\n  /** Batch size for large collections */\n  batchSize?: number;\n  /** Debounce validation for performance */\n  debounceValidation?: boolean;\n  /** Debounce delay in milliseconds */\n  debounceDelay?: number;\n  /** Optional metadata for validation messages */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface FunctionCallConfig {\n  type: 'functionCall';\n  /** Name of the function to call */\n  functionName: string;\n  /** Function parameters with type information */\n  parameters: FunctionParameter[];\n  /** Optional metadata for validation */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface FunctionParameter {\n  /** Parameter name */\n  name: string;\n  /** Parameter value */\n  value: unknown;\n  /** Type of parameter value */\n  valueType: ValueType;\n  /** Field name if valueType is 'field' */\n  fieldName?: string;\n  /** Context variable name if valueType is 'context' */\n  contextVariable?: string;\n}\n\nexport interface FieldToFieldConfig {\n  type: 'fieldToField';\n  /** Left side field name */\n  leftField: string;\n  /** Comparison operator */\n  operator: ValidComparisonOperator | string;\n  /** Right side field name */\n  rightField: string;\n  /** Transform functions applied to left field */\n  leftTransforms?: string[];\n  /** Transform functions applied to right field */\n  rightTransforms?: string[];\n  /** Optional metadata for validation */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface ContextualConfig {\n  type: 'contextual';\n  /** Template string with context placeholders */\n  template: string;\n  /** Available context variables */\n  contextVariables: Record<string, unknown>;\n  /** Optional context provider for dynamic values */\n  contextProvider?: ContextProvider;\n  /** Strict validation of context tokens */\n  strictContextValidation?: boolean;\n  /** Optional metadata */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface CardinalityConfig {\n  type: 'cardinality';\n  /** Type of cardinality check */\n  cardinalityType: 'atLeast' | 'exactly';\n  /** Required count of true conditions */\n  count: number;\n  /** References to rule node IDs to evaluate */\n  conditions: string[];\n  /** Optional metadata for validation */\n  metadata?: SpecificationMetadata;\n}\n\nexport interface CustomConfig {\n  type: 'custom';\n  /** Custom configuration type identifier */\n  customType: string;\n  /** Custom properties specific to the type */\n  properties: Record<string, unknown>;\n  /** Optional metadata for validation */\n  metadata?: SpecificationMetadata;\n}\n\n/**\n * Validator types for conditional validation\n */\nexport enum ConditionalValidatorType {\n  REQUIRED_IF = 'requiredIf',\n  VISIBLE_IF = 'visibleIf',\n  DISABLED_IF = 'disabledIf',\n  READONLY_IF = 'readonlyIf',\n}\n\n/**\n * Preview data for conditional validator simulation\n */\nexport interface ConditionalValidatorPreview {\n  targetField: string;\n  currentValue: unknown;\n  conditionResult: boolean;\n  validatorType: ConditionalValidatorType;\n  resultingState: {\n    isRequired?: boolean;\n    isVisible?: boolean;\n    isDisabled?: boolean;\n    isReadonly?: boolean;\n  };\n  example: string;\n}\n\n/**\n * Rule building session state\n */\nexport interface RuleBuilderState {\n  /** All rule nodes in the current session */\n  nodes: Record<string, RuleNode>;\n\n  /** Root node IDs (top-level rules) */\n  rootNodes: string[];\n\n  /** Currently selected node ID */\n  selectedNodeId?: string;\n\n  /** Current DSL representation */\n  currentDSL?: string;\n\n  /** Current JSON representation */\n  currentJSON?: unknown;\n\n  /** Validation errors */\n  validationErrors: ValidationError[];\n\n  /** Build mode */\n  mode: 'visual' | 'dsl' | 'json';\n\n  /** Whether the rule is dirty (has unsaved changes) */\n  isDirty: boolean;\n\n  /** Undo/redo history */\n  history: RuleBuilderSnapshot[];\n\n  /** Current history position */\n  historyPosition: number;\n}\n\nexport interface ValidationError {\n  /** Error ID */\n  id: string;\n\n  /** Error message */\n  message: string;\n\n  /** Error severity */\n  severity: 'error' | 'warning' | 'info';\n\n  /** Associated node ID */\n  nodeId?: string;\n\n  /** Error code for programmatic handling */\n  code?: string;\n\n  /** Suggested fix */\n  suggestion?: string;\n}\n\nexport interface RuleBuilderSnapshot {\n  /** Timestamp of this snapshot */\n  timestamp: number;\n\n  /** Description of the change */\n  description: string;\n\n  /** Complete state at this point */\n  state: {\n    nodes: Record<string, RuleNode>;\n    rootNodes: string[];\n    selectedNodeId?: string;\n  };\n}\n\n/**\n * Rule template for common scenarios\n */\nexport interface RuleTemplate {\n  /** Template ID */\n  id: string;\n\n  /** Template name */\n  name: string;\n\n  /** Template description */\n  description: string;\n\n  /** Template category */\n  category: string;\n\n  /** Template tags for search */\n  tags: string[];\n\n  /** Rule nodes that make up this template */\n  nodes: RuleNode[];\n\n  /** Root node IDs */\n  rootNodes: string[];\n\n  /** Required field schemas for this template */\n  requiredFields?: string[];\n\n  /** Example usage */\n  example?: string;\n\n  /** Template preview image/icon */\n  icon?: string;\n\n  /** Template metadata */\n  metadata?: TemplateMetadata;\n}\n\n/**\n * Template metadata for tracking and management\n */\nexport interface TemplateMetadata {\n  /** Creation date */\n  createdAt?: Date;\n\n  /** Last update date */\n  updatedAt?: Date;\n\n  /** Last used date */\n  lastUsed?: Date;\n\n  /** Import date (if imported) */\n  importedAt?: Date;\n\n  /** Template version */\n  version?: string;\n\n  /** Usage count */\n  usageCount?: number;\n\n  /** Template complexity */\n  complexity?: 'simple' | 'medium' | 'complex';\n\n  /** Original template ID (for imports/copies) */\n  originalId?: string;\n\n  /** Author information */\n  author?: {\n    name?: string;\n    email?: string;\n    organization?: string;\n  };\n\n  /** Template size metrics */\n  metrics?: {\n    nodeCount?: number;\n    maxDepth?: number;\n    fieldCount?: number;\n  };\n}\n\n/**\n * Export options for rules\n */\nexport interface ExportOptions {\n  /** Export format */\n  format: 'json' | 'dsl' | 'typescript' | 'form-config';\n\n  /** Include metadata in export */\n  includeMetadata?: boolean;\n\n  /** Pretty print JSON/DSL */\n  prettyPrint?: boolean;\n\n  /** Include comments in DSL */\n  includeComments?: boolean;\n\n  /** Metadata position in DSL */\n  metadataPosition?: 'before' | 'after' | 'inline';\n\n  /** TypeScript interface name (for TS export) */\n  interfaceName?: string;\n\n  /** Additional export configuration */\n  config?: Record<string, unknown>;\n}\n\n/**\n * Import options for rules\n */\nexport interface ImportOptions {\n  /** Source format */\n  format: 'json' | 'dsl' | 'form-config';\n\n  /** Whether to merge with existing rules */\n  merge?: boolean;\n\n  /** Whether to preserve existing metadata */\n  preserveMetadata?: boolean;\n\n  /** Field schema mapping for validation */\n  fieldSchemas?: Record<string, unknown>;\n}\n\n/**\n * Rule builder configuration\n */\nexport interface RuleBuilderConfig {\n  /** Available field schemas */\n  fieldSchemas: Record<string, unknown>;\n\n  /** Context variables */\n  contextVariables?: unknown[];\n\n  /** Custom functions */\n  customFunctions?: unknown[];\n\n  /** Available rule templates */\n  templates?: RuleTemplate[];\n\n  /** UI configuration */\n  ui?: {\n    /** Theme */\n    theme?: 'light' | 'dark' | 'auto';\n\n    /** Show advanced features */\n    showAdvanced?: boolean;\n\n    /** Enable drag and drop */\n    enableDragDrop?: boolean;\n\n    /** Show DSL preview */\n    showDSLPreview?: boolean;\n\n    /** Show validation errors inline */\n    showInlineErrors?: boolean;\n\n    /** Auto-save interval (ms) */\n    autoSaveInterval?: number;\n  };\n\n  /** Validation configuration */\n  validation?: {\n    /** Enable real-time validation */\n    realTime?: boolean;\n\n    /** Validation strictness */\n    strictness?: 'strict' | 'normal' | 'loose';\n\n    /** Custom validation rules */\n    customRules?: unknown[];\n  };\n\n  /** Export/import configuration */\n  exportImport?: {\n    /** Default export format */\n    defaultExportFormat?: 'json' | 'dsl' | 'typescript';\n\n    /** Supported formats */\n    supportedFormats?: string[];\n\n    /** Include metadata by default */\n    includeMetadataByDefault?: boolean;\n  };\n}\n\n// ===== Enhanced Configuration Interfaces =====\n\n/**\n * Configuration for optional field handling\n */\nexport interface OptionalFieldConfig {\n  type: 'optionalField';\n  /** Type of optional field validation */\n  validationType: 'ifDefined' | 'ifNotNull' | 'ifExists' | 'withDefault';\n  /** Target field name */\n  fieldName: string;\n  /** Default value when field is undefined/null */\n  defaultValue?: unknown;\n  /** Reference to condition rule node ID */\n  conditionNodeId?: string;\n  /** Optional metadata for validation */\n  metadata?: SpecificationMetadata;\n}\n\n// ===== Phase 4: Expression and Contextual Configuration Interfaces =====\n\n/**\n * Configuration for expression specifications (aligned with @praxisui/specification)\n */\nexport interface ExpressionConfig {\n  type: 'expression';\n\n  /** DSL expression string */\n  expression: string;\n\n  /** Function registry for validation */\n  functionRegistry?: FunctionRegistry<unknown>;\n\n  /** Context provider for variable resolution */\n  contextProvider?: ContextProvider;\n\n  /** Known field names for validation */\n  knownFields?: string[];\n\n  /** Enable performance warnings */\n  enablePerformanceWarnings?: boolean;\n\n  /** Maximum expression complexity */\n  maxComplexity?: number;\n\n  /** Metadata aligned with @praxisui/specification */\n  metadata?: SpecificationMetadata;\n}\n\n/**\n * Configuration for contextual template specifications (aligned with @praxisui/specification)\n */\nexport interface ContextualTemplateConfig {\n  type: 'contextualTemplate';\n\n  /** Template string with context tokens */\n  template: string;\n\n  /** Available context variables */\n  contextVariables?: Record<string, unknown>;\n\n  /** Context provider instance */\n  contextProvider?: ContextProvider;\n\n  /** Enable strict validation of context tokens */\n  strictContextValidation?: boolean;\n\n  /** Metadata aligned with @praxisui/specification */\n  metadata?: SpecificationMetadata;\n}\n","/**\n * Field schema model for dynamic field configuration in the Visual Builder\n */\n\nexport interface FieldSchema {\n  /** Unique field identifier */\n  name: string;\n  \n  /** Human-readable field label */\n  label: string;\n  \n  /** Field data type */\n  type: FieldType;\n  \n  /** Optional description or help text */\n  description?: string;\n  \n  /** Whether this field is required */\n  required?: boolean;\n  \n  /** Allowed values for enum/select fields */\n  allowedValues?: FieldOption[];\n  \n  /** Format constraints for the field */\n  format?: FieldFormat;\n  \n  /** UI configuration for field display */\n  uiConfig?: FieldUIConfig;\n  \n  /** Nested fields for object types */\n  properties?: Record<string, FieldSchema>;\n  \n  /** Item schema for array types */\n  items?: FieldSchema;\n}\n\nexport interface FieldOption {\n  /** Option value */\n  value: any;\n  \n  /** Option display label */\n  label: string;\n  \n  /** Optional description */\n  description?: string;\n  \n  /** Whether this option is disabled */\n  disabled?: boolean;\n}\n\nexport interface FieldFormat {\n  /** Minimum value (for numbers) or length (for strings/arrays) */\n  minimum?: number;\n  \n  /** Maximum value (for numbers) or length (for strings/arrays) */\n  maximum?: number;\n  \n  /** Regular expression pattern for string validation */\n  pattern?: string;\n  \n  /** Date format for date fields */\n  dateFormat?: string;\n  \n  /** Number format options */\n  numberFormat?: {\n    decimals?: number;\n    currency?: string;\n    percentage?: boolean;\n  };\n}\n\nexport interface FieldUIConfig {\n  /** Icon to display with the field */\n  icon?: string;\n  \n  /** Color theme for the field */\n  color?: string;\n  \n  /** Field category for grouping */\n  category?: string;\n  \n  /** Field priority for sorting */\n  priority?: number;\n  \n  /** Whether to show this field in simple mode */\n  showInSimpleMode?: boolean;\n  \n  /** Custom CSS classes */\n  cssClass?: string;\n}\n\nexport enum FieldType {\n  STRING = 'string',\n  NUMBER = 'number',\n  INTEGER = 'integer',\n  BOOLEAN = 'boolean',\n  DATE = 'date',\n  DATETIME = 'datetime',\n  TIME = 'time',\n  EMAIL = 'email',\n  URL = 'url',\n  PHONE = 'phone',\n  ARRAY = 'array',\n  OBJECT = 'object',\n  ENUM = 'enum',\n  UUID = 'uuid',\n  JSON = 'json'\n}\n\n/**\n * Available comparison operators for each field type\n */\nexport const FIELD_TYPE_OPERATORS: Record<FieldType, string[]> = {\n  [FieldType.STRING]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'isEmpty', 'isNotEmpty', 'in', 'notIn'],\n  [FieldType.NUMBER]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'in', 'notIn', 'between'],\n  [FieldType.INTEGER]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'in', 'notIn', 'between'],\n  [FieldType.BOOLEAN]: ['equals', 'notEquals', 'isTrue', 'isFalse'],\n  [FieldType.DATE]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull'],\n  [FieldType.DATETIME]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull'],\n  [FieldType.TIME]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between'],\n  [FieldType.EMAIL]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'isEmpty', 'isNotEmpty'],\n  [FieldType.URL]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'isEmpty', 'isNotEmpty'],\n  [FieldType.PHONE]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'matches', 'isEmpty', 'isNotEmpty'],\n  [FieldType.ARRAY]: ['isEmpty', 'isNotEmpty', 'minLength', 'maxLength', 'contains', 'notContains'],\n  [FieldType.OBJECT]: ['isNull', 'isNotNull', 'hasProperty', 'notHasProperty'],\n  [FieldType.ENUM]: ['equals', 'notEquals', 'in', 'notIn'],\n  [FieldType.UUID]: ['equals', 'notEquals', 'matches', 'isEmpty', 'isNotEmpty'],\n  [FieldType.JSON]: ['isNull', 'isNotNull', 'isEmpty', 'isNotEmpty', 'hasProperty', 'notHasProperty']\n};\n\n/**\n * Operator display labels for UI\n */\nexport const OPERATOR_LABELS: Record<string, string> = {\n  equals: 'equals',\n  notEquals: 'not equals',\n  greaterThan: 'greater than',\n  greaterThanOrEqual: 'greater than or equal',\n  lessThan: 'less than',\n  lessThanOrEqual: 'less than or equal',\n  contains: 'contains',\n  notContains: 'does not contain',\n  startsWith: 'starts with',\n  endsWith: 'ends with',\n  matches: 'matches pattern',\n  isEmpty: 'is empty',\n  isNotEmpty: 'is not empty',\n  isNull: 'is null',\n  isNotNull: 'is not null',\n  isTrue: 'is true',\n  isFalse: 'is false',\n  in: 'is in',\n  notIn: 'is not in',\n  between: 'is between',\n  minLength: 'minimum length',\n  maxLength: 'maximum length',\n  hasProperty: 'has property',\n  notHasProperty: 'does not have property'\n};\n\n/**\n * Context for field schema interpretation\n */\nexport interface FieldSchemaContext {\n  /** Available context variables (e.g., ${user.role}, ${now}) */\n  contextVariables?: ContextVariable[];\n  \n  /** Available custom functions */\n  customFunctions?: CustomFunction[];\n  \n  /** Global configuration */\n  config?: {\n    /** Whether to show advanced features */\n    showAdvanced?: boolean;\n    \n    /** Default locale for formatting */\n    locale?: string;\n    \n    /** Theme configuration */\n    theme?: 'light' | 'dark' | 'auto';\n  };\n}\n\nexport interface ContextVariable {\n  /** Variable name (without ${} wrapper) */\n  name: string;\n  \n  /** Display label */\n  label: string;\n  \n  /** Variable type */\n  type: FieldType;\n  \n  /** Example value for preview */\n  example?: any;\n  \n  /** Description */\n  description?: string;\n}\n\nexport interface CustomFunction {\n  /** Function name */\n  name: string;\n  \n  /** Display label */\n  label: string;\n  \n  /** Function description */\n  description?: string;\n  \n  /** Expected parameter types */\n  parameters: {\n    name: string;\n    type: FieldType;\n    required?: boolean;\n    description?: string;\n  }[];\n  \n  /** Return type */\n  returnType: FieldType;\n  \n  /** Example usage */\n  example?: string;\n}","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  ReactiveFormsModule,\n  FormBuilder,\n  FormGroup,\n  Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport { FieldConditionConfig } from '../models/rule-builder.model';\nimport {\n  FieldSchema,\n  FieldType,\n  FIELD_TYPE_OPERATORS,\n  OPERATOR_LABELS,\n} from '../models/field-schema.model';\n\n@Component({\n  selector: 'praxis-field-condition-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatInputModule,\n    MatButtonModule,\n    MatIconModule,\n    MatCheckboxModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    MatChipsModule,\n    MatAutocompleteModule,\n    MatTooltipModule,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <form [formGroup]=\"conditionForm\" class=\"field-condition-form\">\n      <!-- Field Selection -->\n      <div class=\"form-row\">\n        <mat-form-field appearance=\"outline\" class=\"field-select\">\n          <mat-label>Field</mat-label>\n          <mat-select\n            formControlName=\"fieldName\"\n            (selectionChange)=\"onFieldChanged($event)\"\n          >\n            <mat-optgroup\n              *ngFor=\"let category of fieldCategories\"\n              [label]=\"category.name\"\n            >\n              <mat-option\n                *ngFor=\"let field of category.fields\"\n                [value]=\"field.name\"\n              >\n                <div class=\"field-option\">\n                  <mat-icon class=\"field-icon\">{{\n                    getFieldIcon(field.type)\n                  }}</mat-icon>\n                  <span class=\"field-label\">{{ field.label }}</span>\n                  <span class=\"field-type\">{{ field.type }}</span>\n                </div>\n              </mat-option>\n            </mat-optgroup>\n          </mat-select>\n          <mat-hint *ngIf=\"selectedField?.description\">\n            {{ selectedField?.description }}\n          </mat-hint>\n        </mat-form-field>\n      </div>\n\n      <!-- Operator Selection -->\n      <div class=\"form-row\" *ngIf=\"selectedField\">\n        <mat-form-field appearance=\"outline\" class=\"operator-select\">\n          <mat-label>Operator</mat-label>\n          <mat-select\n            formControlName=\"operator\"\n            (selectionChange)=\"onOperatorChanged($event)\"\n          >\n            <mat-option *ngFor=\"let op of availableOperators\" [value]=\"op\">\n              {{ getOperatorLabel(op) }}\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n      </div>\n\n      <!-- Value Input -->\n      <div\n        class=\"form-row\"\n        *ngIf=\"selectedField && selectedOperator && needsValue()\"\n      >\n        <div class=\"value-input-container\">\n          <!-- Value Type Selector -->\n          <mat-form-field appearance=\"outline\" class=\"value-type-select\">\n            <mat-label>Value Type</mat-label>\n            <mat-select\n              formControlName=\"valueType\"\n              (selectionChange)=\"onValueTypeChanged($event)\"\n            >\n              <mat-option value=\"literal\">Literal Value</mat-option>\n              <mat-option value=\"field\">Field Reference</mat-option>\n              <mat-option value=\"context\">Context Variable</mat-option>\n              <mat-option value=\"function\">Function Call</mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <!-- Literal Value Input -->\n          <div *ngIf=\"valueType === 'literal'\" class=\"literal-value-input\">\n            <!-- String Input -->\n            <mat-form-field\n              *ngIf=\"isStringField()\"\n              appearance=\"outline\"\n              class=\"value-input\"\n            >\n              <mat-label>Value</mat-label>\n              <input\n                matInput\n                formControlName=\"value\"\n                [placeholder]=\"getValuePlaceholder()\"\n              />\n              <mat-hint>{{ getValueHint() }}</mat-hint>\n            </mat-form-field>\n\n            <!-- Number Input -->\n            <mat-form-field\n              *ngIf=\"isNumberField()\"\n              appearance=\"outline\"\n              class=\"value-input\"\n            >\n              <mat-label>Value</mat-label>\n              <input\n                matInput\n                type=\"number\"\n                formControlName=\"value\"\n                [placeholder]=\"getValuePlaceholder()\"\n              />\n              <mat-hint>{{ getValueHint() }}</mat-hint>\n            </mat-form-field>\n\n            <!-- Boolean Input -->\n            <div *ngIf=\"isBooleanField()\" class=\"boolean-input\">\n              <mat-checkbox formControlName=\"value\">\n                {{ getBooleanLabel() }}\n              </mat-checkbox>\n            </div>\n\n            <!-- Date Input -->\n            <mat-form-field\n              *ngIf=\"isDateField()\"\n              appearance=\"outline\"\n              class=\"value-input\"\n            >\n              <mat-label>Date</mat-label>\n              <input\n                matInput\n                [matDatepicker]=\"datePicker\"\n                formControlName=\"value\"\n              />\n              <mat-datepicker-toggle\n                matIconSuffix\n                [for]=\"datePicker\"\n              ></mat-datepicker-toggle>\n              <mat-datepicker #datePicker></mat-datepicker>\n            </mat-form-field>\n\n            <!-- Enum/Select Input -->\n            <mat-form-field\n              *ngIf=\"isEnumField()\"\n              appearance=\"outline\"\n              class=\"value-input\"\n            >\n              <mat-label>Value</mat-label>\n              <mat-select formControlName=\"value\">\n                <mat-option\n                  *ngFor=\"let option of selectedField.allowedValues\"\n                  [value]=\"option.value\"\n                >\n                  {{ option.label }}\n                </mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <!-- Array Input (for 'in' operators) -->\n            <div *ngIf=\"isArrayOperator()\" class=\"array-input\">\n              <mat-form-field appearance=\"outline\" class=\"value-input\">\n                <mat-label>Values (comma separated)</mat-label>\n                <input\n                  matInput\n                  formControlName=\"value\"\n                  placeholder=\"value1, value2, value3\"\n                />\n                <mat-hint>Enter multiple values separated by commas</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n\n          <!-- Field Reference Input -->\n          <mat-form-field\n            *ngIf=\"valueType === 'field'\"\n            appearance=\"outline\"\n            class=\"value-input\"\n          >\n            <mat-label>Compare to Field</mat-label>\n            <mat-select formControlName=\"compareToField\">\n              <mat-option\n                *ngFor=\"let field of getCompatibleFields()\"\n                [value]=\"field.name\"\n              >\n                <div class=\"field-option\">\n                  <mat-icon class=\"field-icon\">{{\n                    getFieldIcon(field.type)\n                  }}</mat-icon>\n                  <span class=\"field-label\">{{ field.label }}</span>\n                </div>\n              </mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <!-- Context Variable Input -->\n          <mat-form-field\n            *ngIf=\"valueType === 'context'\"\n            appearance=\"outline\"\n            class=\"value-input\"\n          >\n            <mat-label>Context Variable</mat-label>\n            <mat-select formControlName=\"contextVariable\">\n              <mat-option\n                *ngFor=\"let variable of contextVariables\"\n                [value]=\"variable.name\"\n              >\n                <div class=\"context-option\">\n                  <span class=\"variable-name\">\\${{ variable.name }}</span>\n                  <span class=\"variable-type\">{{ variable.type }}</span>\n                </div>\n              </mat-option>\n            </mat-select>\n            <mat-hint>Select a dynamic context variable</mat-hint>\n          </mat-form-field>\n\n          <!-- Function Call Input -->\n          <div *ngIf=\"valueType === 'function'\" class=\"function-input\">\n            <mat-form-field appearance=\"outline\" class=\"function-select\">\n              <mat-label>Function</mat-label>\n              <mat-select formControlName=\"functionName\">\n                <mat-option\n                  *ngFor=\"let func of customFunctions\"\n                  [value]=\"func.name\"\n                >\n                  <div class=\"function-option\">\n                    <span class=\"function-name\">{{ func.label }}</span>\n                    <span class=\"function-desc\">{{ func.description }}</span>\n                  </div>\n                </mat-option>\n              </mat-select>\n            </mat-form-field>\n            <!-- Function parameters would be added here -->\n          </div>\n        </div>\n      </div>\n\n      <!-- Validation Messages -->\n      <div class=\"validation-messages\" *ngIf=\"hasValidationErrors()\">\n        <div\n          *ngFor=\"let error of getValidationErrors()\"\n          class=\"validation-error\"\n        >\n          <mat-icon>error</mat-icon>\n          <span>{{ error }}</span>\n        </div>\n      </div>\n\n      <!-- Preview -->\n      <div class=\"condition-preview\" *ngIf=\"isValid()\">\n        <div class=\"preview-label\">Preview:</div>\n        <div class=\"preview-text\">{{ getPreviewText() }}</div>\n      </div>\n    </form>\n  `,\n  styles: [\n    `\n      .field-condition-form {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        min-width: 300px;\n      }\n\n      .form-row {\n        display: flex;\n        gap: 12px;\n        align-items: flex-start;\n      }\n\n      .field-select,\n      .operator-select,\n      .value-type-select {\n        flex: 1;\n        min-width: 150px;\n      }\n\n      .value-input-container {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n        flex: 2;\n      }\n\n      .value-input {\n        width: 100%;\n      }\n\n      .field-option,\n      .context-option,\n      .function-option {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        width: 100%;\n      }\n\n      .field-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n        color: var(--md-sys-color-primary);\n      }\n\n      .field-label {\n        flex: 1;\n        font-weight: 500;\n      }\n\n      .field-type {\n        font-size: 11px;\n        color: var(--md-sys-color-on-surface-variant);\n        background: var(--md-sys-color-surface-container);\n        padding: 2px 6px;\n        border-radius: 4px;\n      }\n\n      .variable-name {\n        font-family: monospace;\n        font-weight: 500;\n        color: var(--md-sys-color-secondary);\n      }\n\n      .variable-type {\n        font-size: 11px;\n        color: var(--md-sys-color-on-surface-variant);\n        background: var(--md-sys-color-surface-container);\n        padding: 2px 6px;\n        border-radius: 4px;\n      }\n\n      .function-name {\n        font-weight: 500;\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .function-desc {\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n        font-style: italic;\n      }\n\n      .boolean-input {\n        display: flex;\n        align-items: center;\n        padding: 12px 0;\n      }\n\n      .array-input {\n        width: 100%;\n      }\n\n      .function-input {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .function-select {\n        width: 100%;\n      }\n\n      .validation-messages {\n        background: var(--md-sys-color-error-container);\n        border-radius: 4px;\n        padding: 8px 12px;\n      }\n\n      .validation-error {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        color: var(--md-sys-color-on-error-container);\n        font-size: 12px;\n        margin-bottom: 4px;\n      }\n\n      .validation-error:last-child {\n        margin-bottom: 0;\n      }\n\n      .validation-error mat-icon {\n        font-size: 14px;\n        width: 14px;\n        height: 14px;\n      }\n\n      .condition-preview {\n        background: var(--md-sys-color-surface-container);\n        border-radius: 8px;\n        padding: 12px;\n        border-left: 4px solid var(--md-sys-color-primary);\n      }\n\n      .preview-label {\n        font-size: 12px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface-variant);\n        margin-bottom: 4px;\n      }\n\n      .preview-text {\n        font-family: monospace;\n        font-size: 14px;\n        color: var(--md-sys-color-on-surface);\n        background: var(--md-sys-color-surface);\n        padding: 8px;\n        border-radius: 4px;\n        border: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      /* Responsive adjustments */\n      @media (max-width: 768px) {\n        .form-row {\n          flex-direction: column;\n        }\n\n        .field-select,\n        .operator-select,\n        .value-type-select {\n          width: 100%;\n        }\n      }\n    `,\n  ],\n})\nexport class FieldConditionEditorComponent implements OnInit, OnChanges {\n  @Input() config: FieldConditionConfig | null = null;\n  @Input() fieldSchemas: Record<string, FieldSchema> = {};\n\n  @Output() configChanged = new EventEmitter<FieldConditionConfig>();\n\n  private destroy$ = new Subject<void>();\n\n  conditionForm: FormGroup;\n  fieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n  contextVariables: any[] = [];\n  customFunctions: any[] = [];\n\n  selectedField: FieldSchema | null = null;\n  selectedOperator: string | null = null;\n  valueType: string = 'literal';\n  availableOperators: string[] = [];\n\n  constructor(private fb: FormBuilder) {\n    this.conditionForm = this.createForm();\n  }\n\n  ngOnInit(): void {\n    this.setupFieldCategories();\n    this.setupFormSubscriptions();\n    this.loadInitialConfig();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['config'] && !changes['config'].firstChange) {\n      this.loadInitialConfig();\n    }\n\n    if (changes['fieldSchemas'] && !changes['fieldSchemas'].firstChange) {\n      this.setupFieldCategories();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private createForm(): FormGroup {\n    return this.fb.group({\n      fieldName: ['', Validators.required],\n      operator: ['', Validators.required],\n      value: [''],\n      valueType: ['literal'],\n      compareToField: [''],\n      contextVariable: [''],\n      functionName: [''],\n    });\n  }\n\n  private setupFormSubscriptions(): void {\n    this.conditionForm.valueChanges\n      .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))\n      .subscribe(() => {\n        this.emitConfigChange();\n      });\n  }\n\n  private setupFieldCategories(): void {\n    const fieldsByCategory: Record<string, FieldSchema[]> = {};\n\n    Object.values(this.fieldSchemas).forEach((field) => {\n      const category = field.uiConfig?.category || 'Other';\n      if (!fieldsByCategory[category]) {\n        fieldsByCategory[category] = [];\n      }\n      fieldsByCategory[category].push(field);\n    });\n\n    this.fieldCategories = Object.entries(fieldsByCategory)\n      .map(([name, fields]) => ({\n        name,\n        fields: fields.sort((a, b) => a.label.localeCompare(b.label)),\n      }))\n      .sort((a, b) => a.name.localeCompare(b.name));\n  }\n\n  private loadInitialConfig(): void {\n    if (!this.config) return;\n\n    this.conditionForm.patchValue({\n      fieldName: this.config.fieldName || '',\n      operator: this.config.operator || '',\n      value: this.config.value || '',\n      valueType: this.config.valueType || 'literal',\n      compareToField: this.config.compareToField || '',\n      contextVariable: this.config.contextVariable || '',\n    });\n\n    if (this.config.fieldName) {\n      this.onFieldChanged(this.config.fieldName);\n    }\n    const opCtrl = this.conditionForm.get('operator');\n    if (opCtrl) {\n      this.selectedOperator = opCtrl.value;\n    }\n  }\n\n  private emitConfigChange(): void {\n    if (!this.conditionForm.valid) return;\n\n    const formValue = this.conditionForm.value;\n    const config: FieldConditionConfig = {\n      type: 'fieldCondition',\n      fieldName: formValue.fieldName,\n      operator: formValue.operator,\n      value: this.processValue(formValue.value),\n      valueType: formValue.valueType,\n      compareToField: formValue.compareToField,\n      contextVariable: formValue.contextVariable,\n    };\n\n    this.configChanged.emit(config);\n  }\n\n  private processValue(value: any): any {\n    if (!value) return null;\n\n    // Handle array operators (in, notIn)\n    if (this.isArrayOperator() && typeof value === 'string') {\n      return value\n        .split(',')\n        .map((v) => v.trim())\n        .filter((v) => v.length > 0);\n    }\n\n    // Handle number conversion\n    if (this.isNumberField() && typeof value === 'string') {\n      const num = parseFloat(value);\n      return isNaN(num) ? null : num;\n    }\n\n    return value;\n  }\n\n  // Template methods\n  getFieldIcon(type: string): string {\n    const icons: Record<string, string> = {\n      string: 'text_fields',\n      number: 'pin',\n      integer: 'pin',\n      boolean: 'toggle_on',\n      date: 'event',\n      datetime: 'schedule',\n      time: 'access_time',\n      email: 'email',\n      url: 'link',\n      phone: 'phone',\n      array: 'list',\n      object: 'data_object',\n      enum: 'list',\n      uuid: 'fingerprint',\n      json: 'data_object',\n    };\n\n    return icons[type] || 'text_fields';\n  }\n\n  getOperatorLabel(operator: string): string {\n    return OPERATOR_LABELS[operator] || operator;\n  }\n\n  getValuePlaceholder(): string {\n    if (!this.selectedField) return 'Enter value';\n\n    switch (this.selectedField.type) {\n      case FieldType.STRING:\n      case FieldType.EMAIL:\n      case FieldType.URL:\n        return 'Enter text value';\n      case FieldType.NUMBER:\n      case FieldType.INTEGER:\n        return 'Enter number';\n      case FieldType.PHONE:\n        return '+1234567890';\n      default:\n        return 'Enter value';\n    }\n  }\n\n  getValueHint(): string {\n    if (!this.selectedField || !this.selectedOperator) return '';\n\n    if (this.selectedOperator === 'matches') {\n      return 'Enter a regular expression pattern';\n    }\n\n    if (this.selectedField.format) {\n      if (this.selectedField.format.minimum !== undefined) {\n        return `Minimum: ${this.selectedField.format.minimum}`;\n      }\n    }\n\n    return '';\n  }\n\n  getBooleanLabel(): string {\n    return this.selectedOperator === 'isTrue' ? 'True' : 'Value';\n  }\n\n  getCompatibleFields(): FieldSchema[] {\n    if (!this.selectedField) return [];\n\n    return Object.values(this.fieldSchemas).filter(\n      (field) =>\n        field.type === this.selectedField?.type &&\n        field.name !== this.selectedField?.name,\n    );\n  }\n\n  getPreviewText(): string {\n    const formValue = this.conditionForm.value;\n\n    if (!formValue.fieldName || !formValue.operator) {\n      return 'Incomplete condition';\n    }\n\n    let valueText = '';\n\n    if (this.needsValue()) {\n      switch (formValue.valueType) {\n        case 'literal':\n          valueText = this.formatValueForPreview(formValue.value);\n          break;\n        case 'field':\n          valueText = formValue.compareToField || '<field>';\n          break;\n        case 'context':\n          valueText = `\\$${formValue.contextVariable || '<variable>'}`;\n          break;\n        case 'function':\n          valueText = `${formValue.functionName || '<function>'}()`;\n          break;\n      }\n    }\n\n    const operatorText = this.getOperatorLabel(formValue.operator);\n\n    if (valueText) {\n      return `${formValue.fieldName} ${operatorText} ${valueText}`;\n    } else {\n      return `${formValue.fieldName} ${operatorText}`;\n    }\n  }\n\n  private formatValueForPreview(value: any): string {\n    if (value === null || value === undefined) return '<value>';\n    if (Array.isArray(value)) return `[${value.join(', ')}]`;\n    if (typeof value === 'string') return `\"${value}\"`;\n    return String(value);\n  }\n\n  // Type checking methods\n  isStringField(): boolean {\n    return (\n      this.selectedField?.type === FieldType.STRING ||\n      this.selectedField?.type === FieldType.EMAIL ||\n      this.selectedField?.type === FieldType.URL ||\n      this.selectedField?.type === FieldType.PHONE ||\n      this.selectedField?.type === FieldType.UUID\n    );\n  }\n\n  isNumberField(): boolean {\n    return (\n      this.selectedField?.type === FieldType.NUMBER ||\n      this.selectedField?.type === FieldType.INTEGER\n    );\n  }\n\n  isBooleanField(): boolean {\n    return this.selectedField?.type === FieldType.BOOLEAN;\n  }\n\n  isDateField(): boolean {\n    return (\n      this.selectedField?.type === FieldType.DATE ||\n      this.selectedField?.type === FieldType.DATETIME ||\n      this.selectedField?.type === FieldType.TIME\n    );\n  }\n\n  isEnumField(): boolean {\n    return (\n      this.selectedField?.type === FieldType.ENUM ||\n      (this.selectedField?.allowedValues?.length ?? 0) > 0\n    );\n  }\n\n  isArrayOperator(): boolean {\n    return this.selectedOperator === 'in' || this.selectedOperator === 'notIn';\n  }\n\n  needsValue(): boolean {\n    const noValueOperators = [\n      'isEmpty',\n      'isNotEmpty',\n      'isNull',\n      'isNotNull',\n      'isTrue',\n      'isFalse',\n    ];\n    return this.selectedOperator\n      ? !noValueOperators.includes(this.selectedOperator)\n      : true;\n  }\n\n  // Event handlers\n  onFieldChanged(event: string | MatSelectChange): void {\n    const fieldName = typeof event === 'string' ? event : event.value;\n    this.selectedField = this.fieldSchemas[fieldName] || null;\n\n    if (this.selectedField) {\n      this.availableOperators =\n        FIELD_TYPE_OPERATORS[this.selectedField.type] || [];\n\n      // Reset operator if not compatible\n      const currentOperator = this.conditionForm.get('operator')?.value;\n      if (\n        currentOperator &&\n        !this.availableOperators.includes(currentOperator)\n      ) {\n        this.conditionForm.patchValue({ operator: '', value: '' });\n        this.selectedOperator = null;\n      }\n    } else {\n      this.availableOperators = [];\n    }\n  }\n\n  onOperatorChanged(event: MatSelectChange): void {\n    this.selectedOperator = event.value;\n\n    // Reset value when operator changes\n    this.conditionForm.patchValue({ value: '' });\n  }\n\n  onValueTypeChanged(event: MatSelectChange): void {\n    this.valueType = event.value;\n\n    // Reset related fields\n    this.conditionForm.patchValue({\n      value: '',\n      compareToField: '',\n      contextVariable: '',\n      functionName: '',\n    });\n  }\n\n  // Validation methods\n  hasValidationErrors(): boolean {\n    return this.getValidationErrors().length > 0;\n  }\n\n  getValidationErrors(): string[] {\n    const errors: string[] = [];\n\n    if (!this.conditionForm.get('fieldName')?.value) {\n      errors.push('Field is required');\n    }\n\n    if (!this.conditionForm.get('operator')?.value) {\n      errors.push('Operator is required');\n    }\n\n    if (this.needsValue()) {\n      const valueType = this.conditionForm.get('valueType')?.value;\n\n      switch (valueType) {\n        case 'literal':\n          if (!this.conditionForm.get('value')?.value) {\n            errors.push('Value is required');\n          }\n          break;\n        case 'field':\n          if (!this.conditionForm.get('compareToField')?.value) {\n            errors.push('Comparison field is required');\n          }\n          break;\n        case 'context':\n          if (!this.conditionForm.get('contextVariable')?.value) {\n            errors.push('Context variable is required');\n          }\n          break;\n        case 'function':\n          if (!this.conditionForm.get('functionName')?.value) {\n            errors.push('Function is required');\n          }\n          break;\n      }\n    }\n\n    return errors;\n  }\n\n  isValid(): boolean {\n    return this.conditionForm.valid && !this.hasValidationErrors();\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  ReactiveFormsModule,\n  FormBuilder,\n  FormGroup,\n  Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n  MatButtonToggleModule,\n  MatButtonToggleChange,\n} from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport {\n  ConditionalValidatorConfig,\n  ConditionalValidatorType,\n  ConditionalValidatorPreview,\n  RuleNode,\n  RuleNodeType,\n} from '../models/rule-builder.model';\nimport { FieldSchema } from '../models/field-schema.model';\nimport { FieldConditionEditorComponent } from './field-condition-editor.component';\n\n@Component({\n  selector: 'praxis-conditional-validator-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatInputModule,\n    MatButtonModule,\n    MatButtonToggleModule,\n    MatIconModule,\n    MatCheckboxModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatTabsModule,\n    MatDividerModule,\n    FieldConditionEditorComponent,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <form [formGroup]=\"validatorForm\" class=\"conditional-validator-form\">\n      <!-- Validator Type Selection -->\n      <div class=\"form-row\">\n        <mat-form-field appearance=\"outline\" class=\"validator-type-select\">\n          <mat-label>Validator Type</mat-label>\n          <mat-select\n            formControlName=\"validatorType\"\n            (selectionChange)=\"onValidatorTypeChanged($event)\"\n          >\n            <mat-option value=\"requiredIf\">\n              <div class=\"validator-option\">\n                <mat-icon>star</mat-icon>\n                <span>Required If</span>\n                <small>Field is required when condition is met</small>\n              </div>\n            </mat-option>\n            <mat-option value=\"visibleIf\">\n              <div class=\"validator-option\">\n                <mat-icon>visibility</mat-icon>\n                <span>Visible If</span>\n                <small>Field is visible when condition is met</small>\n              </div>\n            </mat-option>\n            <mat-option value=\"disabledIf\">\n              <div class=\"validator-option\">\n                <mat-icon>block</mat-icon>\n                <span>Disabled If</span>\n                <small>Field is disabled when condition is met</small>\n              </div>\n            </mat-option>\n            <mat-option value=\"readonlyIf\">\n              <div class=\"validator-option\">\n                <mat-icon>lock</mat-icon>\n                <span>Readonly If</span>\n                <small>Field is readonly when condition is met</small>\n              </div>\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n      </div>\n\n      <!-- Target Field Selection -->\n      <div class=\"form-row\" *ngIf=\"validatorType\">\n        <mat-form-field appearance=\"outline\" class=\"target-field-select\">\n          <mat-label>Target Field</mat-label>\n          <mat-select\n            formControlName=\"targetField\"\n            (selectionChange)=\"onTargetFieldChanged($event)\"\n          >\n            <mat-optgroup\n              *ngFor=\"let category of fieldCategories\"\n              [label]=\"category.name\"\n            >\n              <mat-option\n                *ngFor=\"let field of category.fields\"\n                [value]=\"field.name\"\n              >\n                <div class=\"field-option\">\n                  <mat-icon class=\"field-icon\">{{\n                    getFieldIcon(field.type)\n                  }}</mat-icon>\n                  <span class=\"field-label\">{{ field.label }}</span>\n                  <span class=\"field-type\">{{ field.type }}</span>\n                </div>\n              </mat-option>\n            </mat-optgroup>\n          </mat-select>\n          <mat-hint>Select the field this validator applies to</mat-hint>\n        </mat-form-field>\n      </div>\n\n      <!-- Condition Configuration -->\n      <div class=\"form-section\" *ngIf=\"validatorType && targetField\">\n        <h4 class=\"section-title\">\n          <mat-icon>settings</mat-icon>\n          Condition Configuration\n        </h4>\n\n        <div class=\"condition-mode-selector\">\n          <mat-button-toggle-group\n            formControlName=\"conditionMode\"\n            (change)=\"onConditionModeChanged($event)\"\n          >\n            <mat-button-toggle value=\"simple\">\n              <mat-icon>compare_arrows</mat-icon>\n              Simple Condition\n            </mat-button-toggle>\n            <mat-button-toggle value=\"advanced\">\n              <mat-icon>account_tree</mat-icon>\n              Advanced Logic\n            </mat-button-toggle>\n          </mat-button-toggle-group>\n        </div>\n\n        <!-- Simple Condition -->\n        <div *ngIf=\"conditionMode === 'simple'\" class=\"simple-condition\">\n          <praxis-field-condition-editor\n            [config]=\"getSimpleConditionConfig()\"\n            [fieldSchemas]=\"fieldSchemas\"\n            (configChanged)=\"onSimpleConditionChanged($event)\"\n          >\n          </praxis-field-condition-editor>\n        </div>\n\n        <!-- Advanced Logic -->\n        <div *ngIf=\"conditionMode === 'advanced'\" class=\"advanced-condition\">\n          <div class=\"logic-builder\">\n            <mat-form-field appearance=\"outline\" class=\"logic-operator\">\n              <mat-label>Logic Operator</mat-label>\n              <mat-select formControlName=\"logicOperator\">\n                <mat-option value=\"and\"\n                  >AND - All conditions must be true</mat-option\n                >\n                <mat-option value=\"or\"\n                  >OR - Any condition can be true</mat-option\n                >\n                <mat-option value=\"not\"\n                  >NOT - Condition must be false</mat-option\n                >\n                <mat-option value=\"xor\"\n                  >XOR - Only one condition can be true</mat-option\n                >\n              </mat-select>\n            </mat-form-field>\n\n            <div class=\"conditions-list\">\n              <div\n                *ngFor=\"\n                  let condition of advancedConditions;\n                  let i = index;\n                  trackBy: trackByIndex\n                \"\n                class=\"condition-item\"\n              >\n                <div class=\"condition-header\">\n                  <span class=\"condition-number\">{{ i + 1 }}</span>\n                  <button\n                    mat-icon-button\n                    color=\"warn\"\n                    (click)=\"removeCondition(i)\"\n                    [disabled]=\"advancedConditions.length <= 1\"\n                  >\n                    <mat-icon>delete</mat-icon>\n                  </button>\n                </div>\n\n                <praxis-field-condition-editor\n                  [config]=\"condition\"\n                  [fieldSchemas]=\"fieldSchemas\"\n                  (configChanged)=\"updateAdvancedCondition(i, $event)\"\n                >\n                </praxis-field-condition-editor>\n              </div>\n\n              <button\n                mat-stroked-button\n                color=\"primary\"\n                (click)=\"addCondition()\"\n                class=\"add-condition-button\"\n              >\n                <mat-icon>add</mat-icon>\n                Add Condition\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Validation Settings -->\n      <div class=\"form-section\" *ngIf=\"validatorType === 'requiredIf'\">\n        <h4 class=\"section-title\">\n          <mat-icon>tune</mat-icon>\n          Validation Settings\n        </h4>\n\n        <div class=\"validation-settings\">\n          <mat-form-field appearance=\"outline\" class=\"error-message-input\">\n            <mat-label>Custom Error Message</mat-label>\n            <input\n              matInput\n              formControlName=\"errorMessage\"\n              placeholder=\"This field is required\"\n            />\n            <mat-hint>Override the default validation message</mat-hint>\n          </mat-form-field>\n\n          <div class=\"validation-options\">\n            <mat-checkbox formControlName=\"validateOnChange\">\n              Validate on field change\n            </mat-checkbox>\n\n            <mat-checkbox formControlName=\"validateOnBlur\">\n              Validate on field blur\n            </mat-checkbox>\n\n            <mat-checkbox formControlName=\"showErrorImmediately\">\n              Show error immediately when condition is met\n            </mat-checkbox>\n          </div>\n        </div>\n      </div>\n\n      <!-- UI Behavior Settings -->\n      <div\n        class=\"form-section\"\n        *ngIf=\"validatorType && validatorType !== 'requiredIf'\"\n      >\n        <h4 class=\"section-title\">\n          <mat-icon>visibility</mat-icon>\n          UI Behavior Settings\n        </h4>\n\n        <div class=\"ui-settings\">\n          <div\n            *ngIf=\"validatorType === 'visibleIf'\"\n            class=\"visibility-settings\"\n          >\n            <mat-form-field appearance=\"outline\" class=\"animation-select\">\n              <mat-label>Hide/Show Animation</mat-label>\n              <mat-select formControlName=\"animation\">\n                <mat-option value=\"none\">No animation</mat-option>\n                <mat-option value=\"fade\">Fade in/out</mat-option>\n                <mat-option value=\"slide\">Slide up/down</mat-option>\n                <mat-option value=\"scale\">Scale in/out</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-checkbox formControlName=\"hideLabel\">\n              Hide field label when hidden\n            </mat-checkbox>\n\n            <mat-checkbox formControlName=\"preserveSpace\">\n              Preserve space when hidden\n            </mat-checkbox>\n          </div>\n\n          <div *ngIf=\"validatorType === 'disabledIf'\" class=\"disabled-settings\">\n            <mat-form-field appearance=\"outline\" class=\"disabled-style-select\">\n              <mat-label>Disabled Style</mat-label>\n              <mat-select formControlName=\"disabledStyle\">\n                <mat-option value=\"default\">Default (grayed out)</mat-option>\n                <mat-option value=\"faded\">Faded appearance</mat-option>\n                <mat-option value=\"hidden\">Hide completely</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-checkbox formControlName=\"clearOnDisable\">\n              Clear field value when disabled\n            </mat-checkbox>\n\n            <mat-checkbox formControlName=\"showDisabledMessage\">\n              Show custom disabled message\n            </mat-checkbox>\n\n            <mat-form-field\n              *ngIf=\"showDisabledMessage\"\n              appearance=\"outline\"\n              class=\"disabled-message-input\"\n            >\n              <mat-label>Disabled Message</mat-label>\n              <input\n                matInput\n                formControlName=\"disabledMessage\"\n                placeholder=\"This field is currently disabled\"\n              />\n            </mat-form-field>\n          </div>\n\n          <div *ngIf=\"validatorType === 'readonlyIf'\" class=\"readonly-settings\">\n            <mat-form-field appearance=\"outline\" class=\"readonly-style-select\">\n              <mat-label>Readonly Style</mat-label>\n              <mat-select formControlName=\"readonlyStyle\">\n                <mat-option value=\"default\">Default (non-editable)</mat-option>\n                <mat-option value=\"display\">Display value only</mat-option>\n                <mat-option value=\"bordered\">Bordered display</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-checkbox formControlName=\"showReadonlyIndicator\">\n              Show readonly indicator icon\n            </mat-checkbox>\n          </div>\n        </div>\n      </div>\n\n      <!-- Preview Section -->\n      <div class=\"form-section preview-section\" *ngIf=\"isValid()\">\n        <h4 class=\"section-title\">\n          <mat-icon>preview</mat-icon>\n          Preview\n        </h4>\n\n        <div class=\"preview-content\">\n          <div class=\"preview-text\">{{ getPreviewText() }}</div>\n\n          <div class=\"preview-logic\" *ngIf=\"conditionMode === 'advanced'\">\n            <strong>Logic:</strong> {{ getLogicPreview() }}\n          </div>\n        </div>\n      </div>\n\n      <!-- Validation Messages -->\n      <div class=\"validation-messages\" *ngIf=\"hasValidationErrors()\">\n        <div\n          *ngFor=\"let error of getValidationErrors()\"\n          class=\"validation-error\"\n        >\n          <mat-icon>error</mat-icon>\n          <span>{{ error }}</span>\n        </div>\n      </div>\n    </form>\n  `,\n  styles: [\n    `\n      .conditional-validator-form {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        max-width: 800px;\n      }\n\n      .form-row {\n        display: flex;\n        gap: 12px;\n        align-items: flex-start;\n      }\n\n      .validator-type-select,\n      .target-field-select {\n        flex: 1;\n        min-width: 200px;\n      }\n\n      .validator-option {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .validator-option mat-icon {\n        align-self: flex-start;\n        color: var(--md-sys-color-primary);\n      }\n\n      .validator-option small {\n        color: var(--md-sys-color-on-surface-variant);\n        font-size: 11px;\n      }\n\n      .field-option {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        width: 100%;\n      }\n\n      .field-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n        color: var(--md-sys-color-primary);\n      }\n\n      .field-label {\n        flex: 1;\n        font-weight: 500;\n      }\n\n      .field-type {\n        font-size: 11px;\n        color: var(--md-sys-color-on-surface-variant);\n        background: var(--md-sys-color-surface-variant);\n        padding: 2px 6px;\n        border-radius: 4px;\n      }\n\n      .form-section {\n        border: 1px solid var(--md-sys-color-outline);\n        border-radius: 8px;\n        padding: 16px;\n        background: var(--md-sys-color-surface-variant);\n      }\n\n      .section-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin: 0 0 16px 0;\n        font-size: 14px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      .condition-mode-selector {\n        margin-bottom: 16px;\n      }\n\n      .simple-condition {\n        background: var(--md-sys-color-surface);\n        border-radius: 8px;\n        padding: 16px;\n      }\n\n      .advanced-condition {\n        background: var(--md-sys-color-surface);\n        border-radius: 8px;\n        padding: 16px;\n      }\n\n      .logic-operator {\n        width: 100%;\n        margin-bottom: 16px;\n      }\n\n      .conditions-list {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n      }\n\n      .condition-item {\n        border: 1px solid var(--md-sys-color-outline);\n        border-radius: 8px;\n        padding: 12px;\n        background: var(--md-sys-color-surface-variant);\n      }\n\n      .condition-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 8px;\n      }\n\n      .condition-number {\n        background: var(--md-sys-color-primary);\n        color: var(--md-sys-color-on-primary);\n        border-radius: 50%;\n        width: 24px;\n        height: 24px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 12px;\n        font-weight: 600;\n      }\n\n      .add-condition-button {\n        align-self: flex-start;\n      }\n\n      .validation-settings,\n      .ui-settings {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n      }\n\n      .validation-options {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .error-message-input,\n      .animation-select,\n      .disabled-style-select,\n      .readonly-style-select,\n      .disabled-message-input {\n        width: 100%;\n      }\n\n      .preview-section {\n        background: var(--md-sys-color-primary-container);\n        border-color: var(--md-sys-color-primary);\n      }\n\n      .preview-content {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .preview-text {\n        font-family: monospace;\n        font-size: 14px;\n        background: var(--md-sys-color-surface);\n        padding: 12px;\n        border-radius: 4px;\n        border: 1px solid var(--md-sys-color-outline);\n      }\n\n      .preview-logic {\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .validation-messages {\n        background: var(--md-sys-color-error-container);\n        border-radius: 4px;\n        padding: 8px 12px;\n      }\n\n      .validation-error {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        color: var(--md-sys-color-on-error-container);\n        font-size: 12px;\n        margin-bottom: 4px;\n      }\n\n      .validation-error:last-child {\n        margin-bottom: 0;\n      }\n\n      .validation-error mat-icon {\n        font-size: 14px;\n        width: 14px;\n        height: 14px;\n      }\n\n      /* Responsive adjustments */\n      @media (max-width: 768px) {\n        .form-row {\n          flex-direction: column;\n        }\n\n        .validator-type-select,\n        .target-field-select {\n          width: 100%;\n        }\n      }\n    `,\n  ],\n})\nexport class ConditionalValidatorEditorComponent implements OnInit, OnChanges {\n  @Input() config: ConditionalValidatorConfig | null = null;\n  @Input() fieldSchemas: Record<string, FieldSchema> = {};\n\n  @Output() configChanged = new EventEmitter<ConditionalValidatorConfig>();\n\n  private destroy$ = new Subject<void>();\n\n  validatorForm: FormGroup;\n  fieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n  advancedConditions: any[] = [];\n\n  validatorType: string = '';\n  targetField: string = '';\n  conditionMode: string = 'simple';\n\n  get showDisabledMessage(): boolean {\n    return this.validatorForm.get('showDisabledMessage')?.value || false;\n  }\n\n  constructor(private fb: FormBuilder) {\n    this.validatorForm = this.createForm();\n  }\n\n  ngOnInit(): void {\n    this.setupFieldCategories();\n    this.setupFormSubscriptions();\n    this.loadInitialConfig();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['config'] && !changes['config'].firstChange) {\n      this.loadInitialConfig();\n    }\n\n    if (changes['fieldSchemas'] && !changes['fieldSchemas'].firstChange) {\n      this.setupFieldCategories();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private createForm(): FormGroup {\n    return this.fb.group({\n      validatorType: ['', Validators.required],\n      targetField: ['', Validators.required],\n      conditionMode: ['simple'],\n      logicOperator: ['and'],\n      errorMessage: [''],\n      validateOnChange: [true],\n      validateOnBlur: [true],\n      showErrorImmediately: [false],\n      animation: ['fade'],\n      hideLabel: [false],\n      preserveSpace: [false],\n      disabledStyle: ['default'],\n      clearOnDisable: [false],\n      showDisabledMessage: [false],\n      disabledMessage: [''],\n      readonlyStyle: ['default'],\n      showReadonlyIndicator: [true],\n    });\n  }\n\n  private setupFormSubscriptions(): void {\n    this.validatorForm.valueChanges\n      .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))\n      .subscribe(() => {\n        this.emitConfigChange();\n      });\n  }\n\n  private setupFieldCategories(): void {\n    const fieldsByCategory: Record<string, FieldSchema[]> = {};\n\n    Object.values(this.fieldSchemas).forEach((field) => {\n      const category = field.uiConfig?.category || 'Other';\n      if (!fieldsByCategory[category]) {\n        fieldsByCategory[category] = [];\n      }\n      fieldsByCategory[category].push(field);\n    });\n\n    this.fieldCategories = Object.entries(fieldsByCategory)\n      .map(([name, fields]) => ({\n        name,\n        fields: fields.sort((a, b) => a.label.localeCompare(b.label)),\n      }))\n      .sort((a, b) => a.name.localeCompare(b.name));\n  }\n\n  private loadInitialConfig(): void {\n    if (!this.config) return;\n\n    this.validatorType = this.mapRuleTypeToValidatorType(this.config.type);\n    this.targetField = this.config.targetField || '';\n    this.conditionMode =\n      this.config.conditions && this.config.conditions.length > 1\n        ? 'advanced'\n        : 'simple';\n\n    this.validatorForm.patchValue({\n      validatorType: this.validatorType,\n      targetField: this.targetField,\n      conditionMode: this.conditionMode,\n      logicOperator: this.config.logicOperator || 'and',\n      errorMessage: this.config.errorMessage || '',\n      validateOnChange: this.config.validateOnChange !== false,\n      validateOnBlur: this.config.validateOnBlur !== false,\n      showErrorImmediately: this.config.showErrorImmediately || false,\n      animation: this.config.animation || 'fade',\n      hideLabel: this.config.hideLabel || false,\n      preserveSpace: this.config.preserveSpace || false,\n      disabledStyle: this.config.disabledStyle || 'default',\n      clearOnDisable: this.config.clearOnDisable || false,\n      showDisabledMessage: this.config.showDisabledMessage || false,\n      disabledMessage: this.config.disabledMessage || '',\n      readonlyStyle: this.config.readonlyStyle || 'default',\n      showReadonlyIndicator: this.config.showReadonlyIndicator !== false,\n    });\n\n    if (this.config.conditions && this.config.conditions.length > 0) {\n      this.advancedConditions = [...this.config.conditions];\n    } else {\n      this.advancedConditions = [this.createEmptyCondition()];\n    }\n  }\n\n  private emitConfigChange(): void {\n    if (!this.validatorForm.valid) return;\n\n    const formValue = this.validatorForm.value;\n    const config: ConditionalValidatorConfig = {\n      type: this.mapValidatorTypeToRuleType(formValue.validatorType),\n      validatorType: this.mapValidatorTypeToRuleType(formValue.validatorType),\n      targetField: formValue.targetField,\n      conditions:\n        this.conditionMode === 'simple'\n          ? [this.getSimpleConditionConfig()]\n          : this.advancedConditions,\n      logicOperator: formValue.logicOperator,\n      errorMessage: formValue.errorMessage || undefined,\n      validateOnChange: formValue.validateOnChange,\n      validateOnBlur: formValue.validateOnBlur,\n      showErrorImmediately: formValue.showErrorImmediately,\n      animation: formValue.animation || undefined,\n      hideLabel: formValue.hideLabel || undefined,\n      preserveSpace: formValue.preserveSpace || undefined,\n      disabledStyle: formValue.disabledStyle || undefined,\n      clearOnDisable: formValue.clearOnDisable || undefined,\n      showDisabledMessage: formValue.showDisabledMessage || undefined,\n      disabledMessage: formValue.disabledMessage || undefined,\n      readonlyStyle: formValue.readonlyStyle || undefined,\n      showReadonlyIndicator: formValue.showReadonlyIndicator,\n    };\n\n    this.configChanged.emit(config);\n  }\n\n  // Template methods\n  getFieldIcon(type: string): string {\n    const icons: Record<string, string> = {\n      string: 'text_fields',\n      number: 'pin',\n      integer: 'pin',\n      boolean: 'toggle_on',\n      date: 'event',\n      datetime: 'schedule',\n      time: 'access_time',\n      email: 'email',\n      url: 'link',\n      phone: 'phone',\n      array: 'list',\n      object: 'data_object',\n      enum: 'list',\n      uuid: 'fingerprint',\n      json: 'data_object',\n    };\n\n    return icons[type] || 'text_fields';\n  }\n\n  trackByIndex(index: number): number {\n    return index;\n  }\n\n  getSimpleConditionConfig(): any {\n    return this.advancedConditions[0] || this.createEmptyCondition();\n  }\n\n  getPreviewText(): string {\n    const formValue = this.validatorForm.value;\n\n    if (!formValue.validatorType || !formValue.targetField) {\n      return 'Incomplete validator configuration';\n    }\n\n    const targetFieldSchema = this.fieldSchemas[formValue.targetField];\n    const targetFieldLabel = targetFieldSchema?.label || formValue.targetField;\n\n    let actionText = '';\n    switch (formValue.validatorType) {\n      case 'requiredIf':\n        actionText = 'is required';\n        break;\n      case 'visibleIf':\n        actionText = 'is visible';\n        break;\n      case 'disabledIf':\n        actionText = 'is disabled';\n        break;\n      case 'readonlyIf':\n        actionText = 'is readonly';\n        break;\n    }\n\n    const conditionText =\n      this.conditionMode === 'simple'\n        ? 'when condition is met'\n        : `when ${formValue.logicOperator.toUpperCase()} conditions are met`;\n\n    return `${targetFieldLabel} ${actionText} ${conditionText}`;\n  }\n\n  getLogicPreview(): string {\n    const formValue = this.validatorForm.value;\n    const operator = formValue.logicOperator?.toUpperCase() || 'AND';\n    const conditionCount = this.advancedConditions.length;\n\n    return `${operator} logic with ${conditionCount} condition${conditionCount !== 1 ? 's' : ''}`;\n  }\n\n  // Event handlers\n  onValidatorTypeChanged(event: MatSelectChange): void {\n    this.validatorType = event.value;\n  }\n\n  onTargetFieldChanged(event: MatSelectChange): void {\n    this.targetField = event.value;\n  }\n\n  onConditionModeChanged(event: MatButtonToggleChange): void {\n    const mode = event.value as 'simple' | 'advanced';\n    this.conditionMode = mode;\n\n    if (mode === 'simple' && this.advancedConditions.length === 0) {\n      this.advancedConditions = [this.createEmptyCondition()];\n    }\n  }\n\n  onSimpleConditionChanged(condition: any): void {\n    this.advancedConditions[0] = condition;\n    this.emitConfigChange();\n  }\n\n  updateAdvancedCondition(index: number, condition: any): void {\n    this.advancedConditions[index] = condition;\n    this.emitConfigChange();\n  }\n\n  addCondition(): void {\n    this.advancedConditions.push(this.createEmptyCondition());\n  }\n\n  removeCondition(index: number): void {\n    if (this.advancedConditions.length > 1) {\n      this.advancedConditions.splice(index, 1);\n      this.emitConfigChange();\n    }\n  }\n\n  // Validation methods\n  hasValidationErrors(): boolean {\n    return this.getValidationErrors().length > 0;\n  }\n\n  getValidationErrors(): string[] {\n    const errors: string[] = [];\n\n    if (!this.validatorForm.get('validatorType')?.value) {\n      errors.push('Validator type is required');\n    }\n\n    if (!this.validatorForm.get('targetField')?.value) {\n      errors.push('Target field is required');\n    }\n\n    if (this.advancedConditions.length === 0) {\n      errors.push('At least one condition is required');\n    }\n\n    return errors;\n  }\n\n  isValid(): boolean {\n    return this.validatorForm.valid && !this.hasValidationErrors();\n  }\n\n  // Helper methods\n  private createEmptyCondition(): any {\n    return {\n      type: 'fieldCondition',\n      fieldName: '',\n      operator: 'equals',\n      value: null,\n    };\n  }\n\n  private mapRuleTypeToValidatorType(ruleType: string): string {\n    const mapping: Record<string, string> = {\n      'requiredIf': 'requiredIf',\n      'visibleIf': 'visibleIf',\n      'disabledIf': 'disabledIf',\n      'readonlyIf': 'readonlyIf',\n    };\n\n    return mapping[ruleType] || 'requiredIf';\n  }\n\n  private mapValidatorTypeToRuleType(validatorType: string): 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf' {\n    const mapping: Record<string, 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf'> = {\n      'requiredIf': 'requiredIf',\n      'visibleIf': 'visibleIf',\n      'disabledIf': 'disabledIf',\n      'readonlyIf': 'readonlyIf',\n    };\n\n    return mapping[validatorType] || 'requiredIf';\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormArray } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSliderModule } from '@angular/material/slider';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport { CollectionValidatorConfig, RuleNodeType } from '../models/rule-builder.model';\nimport { FieldSchema, FieldType } from '../models/field-schema.model';\nimport { FieldConditionEditorComponent } from './field-condition-editor.component';\n\n@Component({\n  selector: 'praxis-collection-validator-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatInputModule,\n    MatButtonModule,\n    MatIconModule,\n    MatCheckboxModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatTabsModule,\n    MatDividerModule,\n    MatSliderModule\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <form [formGroup]=\"collectionForm\" class=\"collection-validator-form\">\n      <!-- Validator Type Selection -->\n      <div class=\"form-row\">\n        <mat-form-field appearance=\"outline\" class=\"validator-type-select\">\n          <mat-label>Collection Validator Type</mat-label>\n          <mat-select formControlName=\"validatorType\"\n                     (selectionChange)=\"onValidatorTypeChanged($event)\">\n            <mat-option value=\"forEach\">\n              <div class=\"validator-option\">\n                <mat-icon>repeat</mat-icon>\n                <span>For Each</span>\n                <small>Apply validation to each item in collection</small>\n              </div>\n            </mat-option>\n            <mat-option value=\"uniqueBy\">\n              <div class=\"validator-option\">\n                <mat-icon>fingerprint</mat-icon>\n                <span>Unique By</span>\n                <small>Ensure items are unique by specified field(s)</small>\n              </div>\n            </mat-option>\n            <mat-option value=\"minLength\">\n              <div class=\"validator-option\">\n                <mat-icon>height</mat-icon>\n                <span>Minimum Length</span>\n                <small>Collection must have minimum number of items</small>\n              </div>\n            </mat-option>\n            <mat-option value=\"maxLength\">\n              <div class=\"validator-option\">\n                <mat-icon>height</mat-icon>\n                <span>Maximum Length</span>\n                <small>Collection must not exceed maximum number of items</small>\n              </div>\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n      </div>\n\n      <!-- Target Collection Selection -->\n      <div class=\"form-row\" *ngIf=\"validatorType\">\n        <mat-form-field appearance=\"outline\" class=\"target-collection-select\">\n          <mat-label>Target Collection</mat-label>\n          <mat-select formControlName=\"targetCollection\"\n                     (selectionChange)=\"onTargetCollectionChanged($event)\">\n            <mat-optgroup *ngFor=\"let category of collectionFieldCategories\" [label]=\"category.name\">\n              <mat-option *ngFor=\"let field of category.fields\" \n                         [value]=\"field.name\">\n                <div class=\"field-option\">\n                  <mat-icon class=\"field-icon\">{{ getFieldIcon(field.type) }}</mat-icon>\n                  <span class=\"field-label\">{{ field.label }}</span>\n                  <span class=\"field-type\">{{ field.type }}</span>\n                </div>\n              </mat-option>\n            </mat-optgroup>\n          </mat-select>\n          <mat-hint>Select the array/collection field this validator applies to</mat-hint>\n        </mat-form-field>\n      </div>\n\n      <!-- For Each Configuration -->\n      <div class=\"form-section\" *ngIf=\"validatorType === 'forEach' && targetCollection\">\n        <h4 class=\"section-title\">\n          <mat-icon>repeat</mat-icon>\n          For Each Item Validation\n        </h4>\n        \n        <div class=\"foreach-config\">\n          <div class=\"item-schema-info\">\n            <mat-form-field appearance=\"outline\" class=\"item-variable-input\">\n              <mat-label>Item Variable Name</mat-label>\n              <input matInput \n                     formControlName=\"itemVariable\"\n                     placeholder=\"item\">\n              <mat-hint>Variable name to reference each item (e.g., 'item', 'record')</mat-hint>\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\" class=\"index-variable-input\">\n              <mat-label>Index Variable Name</mat-label>\n              <input matInput \n                     formControlName=\"indexVariable\"\n                     placeholder=\"index\">\n              <mat-hint>Variable name to reference item index (optional)</mat-hint>\n            </mat-form-field>\n          </div>\n\n          <div class=\"validation-rules\">\n            <h5>Item Validation Rules</h5>\n            \n            <div formArrayName=\"itemValidationRules\">\n              <div *ngFor=\"let rule of itemValidationRules.controls; let i = index\"\n                   class=\"validation-rule-item\"\n                   [formGroupName]=\"i\">\n                \n                <div class=\"rule-header\">\n                  <span class=\"rule-number\">{{ i + 1 }}</span>\n                  <button mat-icon-button \n                          color=\"warn\"\n                          (click)=\"removeItemValidationRule(i)\"\n                          [disabled]=\"itemValidationRules.length <= 1\">\n                    <mat-icon>delete</mat-icon>\n                  </button>\n                </div>\n\n                <div class=\"rule-config\">\n                  <mat-form-field appearance=\"outline\" class=\"rule-type-select\">\n                    <mat-label>Rule Type</mat-label>\n                    <mat-select formControlName=\"ruleType\">\n                      <mat-option value=\"required\">Required Field</mat-option>\n                      <mat-option value=\"condition\">Custom Condition</mat-option>\n                      <mat-option value=\"format\">Format Validation</mat-option>\n                      <mat-option value=\"cross-item\">Cross-Item Validation</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\" class=\"field-path-input\">\n                    <mat-label>Field Path</mat-label>\n                    <input matInput \n                           formControlName=\"fieldPath\"\n                           placeholder=\"item.propertyName\">\n                    <mat-hint>Path to the field within each item</mat-hint>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\" class=\"rule-message-input\">\n                    <mat-label>Error Message</mat-label>\n                    <input matInput \n                           formControlName=\"errorMessage\"\n                           placeholder=\"Custom validation message\">\n                  </mat-form-field>\n                </div>\n              </div>\n            </div>\n\n            <button mat-stroked-button \n                    color=\"primary\"\n                    (click)=\"addItemValidationRule()\"\n                    class=\"add-rule-button\">\n              <mat-icon>add</mat-icon>\n              Add Validation Rule\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Unique By Configuration -->\n      <div class=\"form-section\" *ngIf=\"validatorType === 'uniqueBy' && targetCollection\">\n        <h4 class=\"section-title\">\n          <mat-icon>fingerprint</mat-icon>\n          Uniqueness Configuration\n        </h4>\n        \n        <div class=\"unique-config\">\n          <div class=\"unique-fields\">\n            <h5>Unique By Fields</h5>\n            \n            <div formArrayName=\"uniqueByFields\">\n              <div *ngFor=\"let field of uniqueByFields.controls; let i = index\"\n                   class=\"unique-field-item\">\n                \n                <mat-form-field appearance=\"outline\" class=\"field-path-input\">\n                  <mat-label>Field Path {{ i + 1 }}</mat-label>\n                  <input matInput \n                         [formControlName]=\"i\"\n                         placeholder=\"item.propertyName\">\n                </mat-form-field>\n\n                <button mat-icon-button \n                        color=\"warn\"\n                        (click)=\"removeUniqueField(i)\"\n                        [disabled]=\"uniqueByFields.length <= 1\">\n                  <mat-icon>delete</mat-icon>\n                </button>\n              </div>\n            </div>\n\n            <button mat-stroked-button \n                    color=\"primary\"\n                    (click)=\"addUniqueField()\"\n                    class=\"add-field-button\">\n              <mat-icon>add</mat-icon>\n              Add Field\n            </button>\n          </div>\n\n          <div class=\"unique-options\">\n            <mat-checkbox formControlName=\"caseSensitive\">\n              Case-sensitive comparison\n            </mat-checkbox>\n            \n            <mat-checkbox formControlName=\"ignoreEmpty\">\n              Ignore empty values\n            </mat-checkbox>\n            \n            <mat-form-field appearance=\"outline\" class=\"unique-error-message\">\n              <mat-label>Duplicate Error Message</mat-label>\n              <input matInput \n                     formControlName=\"duplicateErrorMessage\"\n                     placeholder=\"Duplicate items are not allowed\">\n            </mat-form-field>\n          </div>\n        </div>\n      </div>\n\n      <!-- Length Configuration -->\n      <div class=\"form-section\" *ngIf=\"(validatorType === 'minLength' || validatorType === 'maxLength') && targetCollection\">\n        <h4 class=\"section-title\">\n          <mat-icon>height</mat-icon>\n          Length Constraints\n        </h4>\n        \n        <div class=\"length-config\">\n          <div class=\"length-inputs\">\n            <mat-form-field *ngIf=\"validatorType === 'minLength'\" appearance=\"outline\" class=\"length-input\">\n              <mat-label>Minimum Items</mat-label>\n              <input matInput \n                     type=\"number\"\n                     formControlName=\"minItems\"\n                     min=\"0\"\n                     placeholder=\"0\">\n              <mat-hint>Minimum number of items required</mat-hint>\n            </mat-form-field>\n\n            <mat-form-field *ngIf=\"validatorType === 'maxLength'\" appearance=\"outline\" class=\"length-input\">\n              <mat-label>Maximum Items</mat-label>\n              <input matInput \n                     type=\"number\"\n                     formControlName=\"maxItems\"\n                     min=\"1\"\n                     placeholder=\"100\">\n              <mat-hint>Maximum number of items allowed</mat-hint>\n            </mat-form-field>\n          </div>\n\n          <div class=\"length-slider\" *ngIf=\"validatorType === 'minLength'\">\n            <label>Minimum Items: {{ minItems }}</label>\n            <mat-slider \n              [min]=\"0\" \n              [max]=\"100\" \n              [step]=\"1\">\n              <input matSliderThumb formControlName=\"minItems\">\n            </mat-slider>\n          </div>\n\n          <div class=\"length-slider\" *ngIf=\"validatorType === 'maxLength'\">\n            <label>Maximum Items: {{ maxItems }}</label>\n            <mat-slider \n              [min]=\"1\" \n              [max]=\"1000\" \n              [step]=\"1\">\n              <input matSliderThumb formControlName=\"maxItems\">\n            </mat-slider>\n          </div>\n\n          <div class=\"length-options\">\n            <mat-form-field appearance=\"outline\" class=\"length-error-message\">\n              <mat-label>Length Error Message</mat-label>\n              <input matInput \n                     formControlName=\"lengthErrorMessage\"\n                     [placeholder]=\"getLengthErrorPlaceholder()\">\n            </mat-form-field>\n\n            <mat-checkbox formControlName=\"showItemCount\">\n              Show current item count to user\n            </mat-checkbox>\n            \n            <mat-checkbox formControlName=\"preventExcess\">\n              Prevent adding items beyond limit\n            </mat-checkbox>\n          </div>\n        </div>\n      </div>\n\n      <!-- Advanced Options -->\n      <div class=\"form-section advanced-options\" *ngIf=\"validatorType && targetCollection\">\n        <h4 class=\"section-title\">\n          <mat-icon>tune</mat-icon>\n          Advanced Options\n        </h4>\n        \n        <div class=\"advanced-config\">\n          <div class=\"validation-timing\">\n            <h5>Validation Timing</h5>\n            \n            <mat-checkbox formControlName=\"validateOnAdd\">\n              Validate when items are added\n            </mat-checkbox>\n            \n            <mat-checkbox formControlName=\"validateOnRemove\">\n              Validate when items are removed\n            </mat-checkbox>\n            \n            <mat-checkbox formControlName=\"validateOnChange\">\n              Validate when items are modified\n            </mat-checkbox>\n            \n            <mat-checkbox formControlName=\"validateOnSubmit\">\n              Validate on form submission\n            </mat-checkbox>\n          </div>\n\n          <div class=\"error-handling\">\n            <h5>Error Handling</h5>\n            \n            <mat-form-field appearance=\"outline\" class=\"error-strategy-select\">\n              <mat-label>Error Display Strategy</mat-label>\n              <mat-select formControlName=\"errorStrategy\">\n                <mat-option value=\"summary\">Show summary at collection level</mat-option>\n                <mat-option value=\"inline\">Show errors inline with items</mat-option>\n                <mat-option value=\"both\">Show both summary and inline errors</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-checkbox formControlName=\"stopOnFirstError\">\n              Stop validation on first error\n            </mat-checkbox>\n            \n            <mat-checkbox formControlName=\"highlightErrorItems\">\n              Highlight items with errors\n            </mat-checkbox>\n          </div>\n\n          <div class=\"performance-options\">\n            <h5>Performance</h5>\n            \n            <mat-form-field appearance=\"outline\" class=\"batch-size-input\">\n              <mat-label>Validation Batch Size</mat-label>\n              <input matInput \n                     type=\"number\"\n                     formControlName=\"batchSize\"\n                     min=\"1\"\n                     max=\"1000\"\n                     placeholder=\"50\">\n              <mat-hint>Number of items to validate at once</mat-hint>\n            </mat-form-field>\n\n            <mat-checkbox formControlName=\"debounceValidation\">\n              Debounce validation (reduce frequency)\n            </mat-checkbox>\n            \n            <mat-form-field *ngIf=\"debounceValidation\" appearance=\"outline\" class=\"debounce-delay-input\">\n              <mat-label>Debounce Delay (ms)</mat-label>\n              <input matInput \n                     type=\"number\"\n                     formControlName=\"debounceDelay\"\n                     min=\"100\"\n                     max=\"5000\"\n                     placeholder=\"300\">\n            </mat-form-field>\n          </div>\n        </div>\n      </div>\n\n      <!-- Preview Section -->\n      <div class=\"form-section preview-section\" *ngIf=\"isValid()\">\n        <h4 class=\"section-title\">\n          <mat-icon>preview</mat-icon>\n          Preview\n        </h4>\n        \n        <div class=\"preview-content\">\n          <div class=\"preview-text\">{{ getPreviewText() }}</div>\n          \n          <div class=\"preview-details\">\n            <div *ngIf=\"validatorType === 'forEach'\" class=\"foreach-preview\">\n              <strong>Rules:</strong> {{ getForEachRulesPreview() }}\n            </div>\n            \n            <div *ngIf=\"validatorType === 'uniqueBy'\" class=\"unique-preview\">\n              <strong>Unique Fields:</strong> {{ getUniqueFieldsPreview() }}\n            </div>\n            \n            <div *ngIf=\"validatorType === 'minLength' || validatorType === 'maxLength'\" class=\"length-preview\">\n              <strong>Constraints:</strong> {{ getLengthConstraintsPreview() }}\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Validation Messages -->\n      <div class=\"validation-messages\" *ngIf=\"hasValidationErrors()\">\n        <div *ngFor=\"let error of getValidationErrors()\" \n             class=\"validation-error\">\n          <mat-icon>error</mat-icon>\n          <span>{{ error }}</span>\n        </div>\n      </div>\n    </form>\n  `,\n  styles: [`\n    .collection-validator-form {\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n      max-width: 900px;\n    }\n\n    .form-row {\n      display: flex;\n      gap: 12px;\n      align-items: flex-start;\n    }\n\n    .validator-type-select,\n    .target-collection-select {\n      flex: 1;\n      min-width: 250px;\n    }\n\n    .validator-option {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n\n    .validator-option mat-icon {\n      align-self: flex-start;\n      color: var(--md-sys-color-primary);\n    }\n\n    .validator-option small {\n      color: var(--md-sys-color-on-surface-variant);\n      font-size: 11px;\n    }\n\n    .field-option {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      width: 100%;\n    }\n\n    .field-icon {\n      font-size: 16px;\n      width: 16px;\n      height: 16px;\n      color: var(--md-sys-color-primary);\n    }\n\n    .field-label {\n      flex: 1;\n      font-weight: 500;\n    }\n\n    .field-type {\n      font-size: 11px;\n      color: var(--md-sys-color-on-surface-variant);\n      background: var(--md-sys-color-surface-container);\n      padding: 2px 6px;\n      border-radius: 4px;\n    }\n\n    .form-section {\n      border: 1px solid var(--md-sys-color-outline-variant);\n      border-radius: 8px;\n      padding: 16px;\n      background: var(--md-sys-color-surface-container);\n    }\n\n    .section-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin: 0 0 16px 0;\n      font-size: 14px;\n      font-weight: 500;\n      color: var(--md-sys-color-on-surface);\n    }\n\n    .section-title h5 {\n      margin: 16px 0 8px 0;\n      font-size: 13px;\n      font-weight: 500;\n      color: var(--md-sys-color-primary);\n    }\n\n    .foreach-config,\n    .unique-config,\n    .length-config {\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n    }\n\n    .item-schema-info {\n      display: flex;\n      gap: 12px;\n    }\n\n    .item-variable-input,\n    .index-variable-input {\n      flex: 1;\n    }\n\n    .validation-rules {\n      background: var(--md-sys-color-surface);\n      border-radius: 8px;\n      padding: 16px;\n    }\n\n    .validation-rule-item,\n    .unique-field-item {\n      border: 1px solid var(--md-sys-color-outline-variant);\n      border-radius: 8px;\n      padding: 12px;\n      margin-bottom: 12px;\n      background: var(--md-sys-color-surface-container);\n    }\n\n    .rule-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 8px;\n    }\n\n    .rule-number {\n      background: var(--md-sys-color-primary);\n      color: var(--md-sys-color-on-primary);\n      border-radius: 50%;\n      width: 24px;\n      height: 24px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 12px;\n      font-weight: 600;\n    }\n\n    .rule-config {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .unique-field-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .field-path-input {\n      flex: 1;\n    }\n\n    .length-inputs {\n      display: flex;\n      gap: 12px;\n    }\n\n    .length-input {\n      flex: 1;\n    }\n\n    .length-slider {\n      margin: 16px 0;\n    }\n\n    .length-slider label {\n      display: block;\n      margin-bottom: 8px;\n      font-size: 13px;\n      font-weight: 500;\n    }\n\n    .length-options,\n    .unique-options {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n    }\n\n    .advanced-options {\n      background: var(--md-sys-color-secondary-container);\n      border-color: var(--md-sys-color-secondary);\n    }\n\n    .advanced-config {\n      display: grid;\n      grid-template-columns: 1fr 1fr 1fr;\n      gap: 16px;\n    }\n\n    .validation-timing,\n    .error-handling,\n    .performance-options {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .validation-timing h5,\n    .error-handling h5,\n    .performance-options h5 {\n      margin: 0 0 8px 0;\n      font-size: 12px;\n      font-weight: 600;\n      color: var(--md-sys-color-secondary);\n      text-transform: uppercase;\n    }\n\n    .add-rule-button,\n    .add-field-button {\n      align-self: flex-start;\n    }\n\n    .preview-section {\n      background: var(--md-sys-color-primary-container);\n      border-color: var(--md-sys-color-primary);\n    }\n\n    .preview-content {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .preview-text {\n      font-family: monospace;\n      font-size: 14px;\n      background: var(--md-sys-color-surface);\n      padding: 12px;\n      border-radius: 4px;\n      border: 1px solid var(--md-sys-color-outline-variant);\n    }\n\n    .preview-details {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n    }\n\n    .validation-messages {\n      background: var(--md-sys-color-error-container);\n      border-radius: 4px;\n      padding: 8px 12px;\n    }\n\n    .validation-error {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      color: var(--md-sys-color-on-error-container);\n      font-size: 12px;\n      margin-bottom: 4px;\n    }\n\n    .validation-error:last-child {\n      margin-bottom: 0;\n    }\n\n    .validation-error mat-icon {\n      font-size: 14px;\n      width: 14px;\n      height: 14px;\n    }\n\n    /* Responsive adjustments */\n    @media (max-width: 1024px) {\n      .advanced-config {\n        grid-template-columns: 1fr 1fr;\n      }\n    }\n\n    @media (max-width: 768px) {\n      .form-row {\n        flex-direction: column;\n      }\n      \n      .validator-type-select,\n      .target-collection-select {\n        width: 100%;\n      }\n      \n      .item-schema-info {\n        flex-direction: column;\n      }\n      \n      .length-inputs {\n        flex-direction: column;\n      }\n      \n      .advanced-config {\n        grid-template-columns: 1fr;\n      }\n    }\n  `]\n})\nexport class CollectionValidatorEditorComponent implements OnInit, OnChanges {\n  @Input() config: CollectionValidatorConfig | null = null;\n  @Input() fieldSchemas: Record<string, FieldSchema> = {};\n  \n  @Output() configChanged = new EventEmitter<CollectionValidatorConfig>();\n\n  private destroy$ = new Subject<void>();\n\n  collectionForm: FormGroup;\n  collectionFieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n\n  validatorType: string = '';\n  targetCollection: string = '';\n\n  get itemValidationRules(): FormArray {\n    return this.collectionForm.get('itemValidationRules') as FormArray;\n  }\n\n  get uniqueByFields(): FormArray {\n    return this.collectionForm.get('uniqueByFields') as FormArray;\n  }\n\n  get minItems(): number {\n    return this.collectionForm.get('minItems')?.value || 0;\n  }\n\n  get maxItems(): number {\n    return this.collectionForm.get('maxItems')?.value || 100;\n  }\n\n  get debounceValidation(): boolean {\n    return this.collectionForm.get('debounceValidation')?.value || false;\n  }\n\n  constructor(private fb: FormBuilder) {\n    this.collectionForm = this.createForm();\n  }\n\n  ngOnInit(): void {\n    this.setupFieldCategories();\n    this.setupFormSubscriptions();\n    this.loadInitialConfig();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['config'] && !changes['config'].firstChange) {\n      this.loadInitialConfig();\n    }\n    \n    if (changes['fieldSchemas'] && !changes['fieldSchemas'].firstChange) {\n      this.setupFieldCategories();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private createForm(): FormGroup {\n    return this.fb.group({\n      validatorType: ['', Validators.required],\n      targetCollection: ['', Validators.required],\n      \n      // For Each\n      itemVariable: ['item'],\n      indexVariable: ['index'],\n      itemValidationRules: this.fb.array([]),\n      \n      // Unique By\n      uniqueByFields: this.fb.array([]),\n      caseSensitive: [true],\n      ignoreEmpty: [true],\n      duplicateErrorMessage: [''],\n      \n      // Length\n      minItems: [0, [Validators.min(0)]],\n      maxItems: [100, [Validators.min(1)]],\n      lengthErrorMessage: [''],\n      showItemCount: [true],\n      preventExcess: [true],\n      \n      // Advanced\n      validateOnAdd: [true],\n      validateOnRemove: [true],\n      validateOnChange: [true],\n      validateOnSubmit: [true],\n      errorStrategy: ['both'],\n      stopOnFirstError: [false],\n      highlightErrorItems: [true],\n      batchSize: [50, [Validators.min(1), Validators.max(1000)]],\n      debounceValidation: [true],\n      debounceDelay: [300, [Validators.min(100), Validators.max(5000)]]\n    });\n  }\n\n  private setupFormSubscriptions(): void {\n    this.collectionForm.valueChanges\n      .pipe(\n        debounceTime(300),\n        distinctUntilChanged(),\n        takeUntil(this.destroy$)\n      )\n      .subscribe(() => {\n        this.emitConfigChange();\n      });\n  }\n\n  private setupFieldCategories(): void {\n    const collectionFields = Object.values(this.fieldSchemas)\n      .filter(field => field.type === FieldType.ARRAY || field.type === FieldType.OBJECT);\n\n    const fieldsByCategory: Record<string, FieldSchema[]> = {};\n    \n    collectionFields.forEach(field => {\n      const category = field.uiConfig?.category || 'Collections';\n      if (!fieldsByCategory[category]) {\n        fieldsByCategory[category] = [];\n      }\n      fieldsByCategory[category].push(field);\n    });\n\n    this.collectionFieldCategories = Object.entries(fieldsByCategory)\n      .map(([name, fields]) => ({\n        name,\n        fields: fields.sort((a, b) => a.label.localeCompare(b.label))\n      }))\n      .sort((a, b) => a.name.localeCompare(b.name));\n  }\n\n  private loadInitialConfig(): void {\n    if (!this.config) return;\n\n    this.validatorType = this.mapRuleTypeToValidatorType(this.config.type);\n    this.targetCollection = this.config.targetCollection || '';\n\n    // Load form values\n    this.collectionForm.patchValue({\n      validatorType: this.validatorType,\n      targetCollection: this.targetCollection,\n      itemVariable: this.config.itemVariable || 'item',\n      indexVariable: this.config.indexVariable || 'index',\n      caseSensitive: this.config.caseSensitive !== false,\n      ignoreEmpty: this.config.ignoreEmpty !== false,\n      duplicateErrorMessage: this.config.duplicateErrorMessage || '',\n      minItems: this.config.minItems || 0,\n      maxItems: this.config.maxItems || 100,\n      lengthErrorMessage: this.config.lengthErrorMessage || '',\n      showItemCount: this.config.showItemCount !== false,\n      preventExcess: this.config.preventExcess !== false,\n      validateOnAdd: this.config.validateOnAdd !== false,\n      validateOnRemove: this.config.validateOnRemove !== false,\n      validateOnChange: this.config.validateOnChange !== false,\n      validateOnSubmit: this.config.validateOnSubmit !== false,\n      errorStrategy: this.config.errorStrategy || 'both',\n      stopOnFirstError: this.config.stopOnFirstError || false,\n      highlightErrorItems: this.config.highlightErrorItems !== false,\n      batchSize: this.config.batchSize || 50,\n      debounceValidation: this.config.debounceValidation !== false,\n      debounceDelay: this.config.debounceDelay || 300\n    });\n\n    // Load arrays\n    this.loadItemValidationRules(this.config.itemValidationRules || []);\n    this.loadUniqueByFields(this.config.uniqueByFields || []);\n  }\n\n  private loadItemValidationRules(rules: any[]): void {\n    this.itemValidationRules.clear();\n    rules.forEach(rule => {\n      this.itemValidationRules.push(this.fb.group({\n        ruleType: [rule.ruleType || 'required'],\n        fieldPath: [rule.fieldPath || ''],\n        errorMessage: [rule.errorMessage || '']\n      }));\n    });\n    \n    if (this.itemValidationRules.length === 0) {\n      this.addItemValidationRule();\n    }\n  }\n\n  private loadUniqueByFields(fields: string[]): void {\n    this.uniqueByFields.clear();\n    fields.forEach(field => {\n      this.uniqueByFields.push(this.fb.control(field));\n    });\n    \n    if (this.uniqueByFields.length === 0) {\n      this.addUniqueField();\n    }\n  }\n\n  private emitConfigChange(): void {\n    if (!this.collectionForm.valid) return;\n\n    const formValue = this.collectionForm.value;\n    const config: CollectionValidatorConfig = {\n      type: this.mapValidatorTypeToRuleType(formValue.validatorType),\n      targetCollection: formValue.targetCollection,\n      itemVariable: formValue.itemVariable || undefined,\n      indexVariable: formValue.indexVariable || undefined,\n      itemValidationRules: this.getItemValidationRulesValue(),\n      uniqueByFields: this.getUniqueByFieldsValue(),\n      caseSensitive: formValue.caseSensitive,\n      ignoreEmpty: formValue.ignoreEmpty,\n      duplicateErrorMessage: formValue.duplicateErrorMessage || undefined,\n      minItems: formValue.minItems || undefined,\n      maxItems: formValue.maxItems || undefined,\n      lengthErrorMessage: formValue.lengthErrorMessage || undefined,\n      showItemCount: formValue.showItemCount,\n      preventExcess: formValue.preventExcess,\n      validateOnAdd: formValue.validateOnAdd,\n      validateOnRemove: formValue.validateOnRemove,\n      validateOnChange: formValue.validateOnChange,\n      validateOnSubmit: formValue.validateOnSubmit,\n      errorStrategy: formValue.errorStrategy,\n      stopOnFirstError: formValue.stopOnFirstError,\n      highlightErrorItems: formValue.highlightErrorItems,\n      batchSize: formValue.batchSize,\n      debounceValidation: formValue.debounceValidation,\n      debounceDelay: formValue.debounceDelay\n    };\n\n    this.configChanged.emit(config);\n  }\n\n  private getItemValidationRulesValue(): any[] {\n    return this.itemValidationRules.controls.map(control => control.value);\n  }\n\n  private getUniqueByFieldsValue(): string[] {\n    return this.uniqueByFields.controls.map(control => control.value).filter(Boolean);\n  }\n\n  // Template methods\n  getFieldIcon(type: string): string {\n    const icons: Record<string, string> = {\n      'array': 'list',\n      'object': 'data_object',\n      'string': 'text_fields',\n      'number': 'pin',\n      'boolean': 'toggle_on'\n    };\n    \n    return icons[type] || 'list';\n  }\n\n  getLengthErrorPlaceholder(): string {\n    if (this.validatorType === 'minLength') {\n      return 'At least {min} items are required';\n    } else if (this.validatorType === 'maxLength') {\n      return 'Maximum {max} items allowed';\n    }\n    return 'Invalid length';\n  }\n\n  getPreviewText(): string {\n    const formValue = this.collectionForm.value;\n    \n    if (!formValue.validatorType || !formValue.targetCollection) {\n      return 'Incomplete collection validator configuration';\n    }\n\n    const targetSchema = this.fieldSchemas[formValue.targetCollection];\n    const targetLabel = targetSchema?.label || formValue.targetCollection;\n    \n    switch (formValue.validatorType) {\n      case 'forEach':\n        return `Validate each item in ${targetLabel} using ${this.itemValidationRules.length} rule(s)`;\n      case 'uniqueBy':\n        const uniqueFields = this.getUniqueByFieldsValue();\n        return `Ensure items in ${targetLabel} are unique by: ${uniqueFields.join(', ')}`;\n      case 'minLength':\n        return `${targetLabel} must have at least ${formValue.minItems} item(s)`;\n      case 'maxLength':\n        return `${targetLabel} must have at most ${formValue.maxItems} item(s)`;\n      default:\n        return 'Collection validation rule';\n    }\n  }\n\n  getForEachRulesPreview(): string {\n    const rules = this.getItemValidationRulesValue();\n    return rules.map(rule => `${rule.ruleType} on ${rule.fieldPath}`).join(', ');\n  }\n\n  getUniqueFieldsPreview(): string {\n    const fields = this.getUniqueByFieldsValue();\n    return fields.length > 0 ? fields.join(', ') : 'None specified';\n  }\n\n  getLengthConstraintsPreview(): string {\n    const formValue = this.collectionForm.value;\n    if (this.validatorType === 'minLength') {\n      return `Minimum: ${formValue.minItems} items`;\n    } else if (this.validatorType === 'maxLength') {\n      return `Maximum: ${formValue.maxItems} items`;\n    }\n    return '';\n  }\n\n  // Event handlers\n  onValidatorTypeChanged(event: MatSelectChange): void {\n    const type = event.value as 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n    this.validatorType = type;\n    \n    // Initialize arrays based on type\n    if (type === 'forEach' && this.itemValidationRules.length === 0) {\n      this.addItemValidationRule();\n    } else if (type === 'uniqueBy' && this.uniqueByFields.length === 0) {\n      this.addUniqueField();\n    }\n  }\n\n  onTargetCollectionChanged(event: MatSelectChange): void {\n    this.targetCollection = event.value;\n  }\n\n  addItemValidationRule(): void {\n    const rule = this.fb.group({\n      ruleType: ['required'],\n      fieldPath: [''],\n      errorMessage: ['']\n    });\n    this.itemValidationRules.push(rule);\n  }\n\n  removeItemValidationRule(index: number): void {\n    if (this.itemValidationRules.length > 1) {\n      this.itemValidationRules.removeAt(index);\n    }\n  }\n\n  addUniqueField(): void {\n    this.uniqueByFields.push(this.fb.control(''));\n  }\n\n  removeUniqueField(index: number): void {\n    if (this.uniqueByFields.length > 1) {\n      this.uniqueByFields.removeAt(index);\n    }\n  }\n\n  // Validation methods\n  hasValidationErrors(): boolean {\n    return this.getValidationErrors().length > 0;\n  }\n\n  getValidationErrors(): string[] {\n    const errors: string[] = [];\n    \n    if (!this.collectionForm.get('validatorType')?.value) {\n      errors.push('Validator type is required');\n    }\n    \n    if (!this.collectionForm.get('targetCollection')?.value) {\n      errors.push('Target collection is required');\n    }\n    \n    if (this.validatorType === 'forEach' && this.itemValidationRules.length === 0) {\n      errors.push('At least one validation rule is required for forEach');\n    }\n    \n    if (this.validatorType === 'uniqueBy' && this.getUniqueByFieldsValue().length === 0) {\n      errors.push('At least one unique field is required');\n    }\n    \n    return errors;\n  }\n\n  isValid(): boolean {\n    return this.collectionForm.valid && !this.hasValidationErrors();\n  }\n\n  // Helper methods\n  private mapRuleTypeToValidatorType(ruleType: string): string {\n    const mapping: Record<string, string> = {\n      'forEach': 'forEach',\n      'uniqueBy': 'uniqueBy',\n      'minLength': 'minLength',\n      'maxLength': 'maxLength'\n    };\n    \n    return mapping[ruleType] || 'forEach';\n  }\n\n  private mapValidatorTypeToRuleType(validatorType: string): 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength' {\n    const mapping: Record<string, 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength'> = {\n      'forEach': 'forEach',\n      'uniqueBy': 'uniqueBy',\n      'minLength': 'minLength',\n      'maxLength': 'maxLength'\n    };\n    \n    return mapping[validatorType] || 'forEach';\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\n\nimport {\n  RuleNode,\n  RuleNodeType,\n  RuleNodeTypeString,\n  RuleNodeConfig,\n  FieldConditionConfig,\n  BooleanGroupConfig,\n  ConditionalValidatorConfig,\n  CollectionValidatorConfig,\n  ValidationError,\n} from '../models/rule-builder.model';\nimport {\n  FieldSchema,\n  FIELD_TYPE_OPERATORS,\n  OPERATOR_LABELS,\n} from '../models/field-schema.model';\nimport { FieldConditionEditorComponent } from './field-condition-editor.component';\nimport { ConditionalValidatorEditorComponent } from './conditional-validator-editor.component';\nimport { CollectionValidatorEditorComponent } from './collection-validator-editor.component';\n\n@Component({\n  selector: 'praxis-rule-node',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatCardModule,\n    MatButtonModule,\n    MatIconModule,\n    MatSelectModule,\n    MatInputModule,\n    MatFormFieldModule,\n    MatMenuModule,\n    MatTooltipModule,\n    MatChipsModule,\n    MatBadgeModule,\n    MatDividerModule,\n    DragDropModule,\n    FieldConditionEditorComponent,\n    ConditionalValidatorEditorComponent,\n    CollectionValidatorEditorComponent,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"rule-node-container\"\n      [class.selected]=\"isSelected\"\n      [class.has-errors]=\"hasValidationErrors\"\n      [class]=\"'level-' + level\"\n    >\n      <!-- Main Rule Node -->\n      <mat-card\n        class=\"rule-node\"\n        [class.selected]=\"isSelected\"\n        (click)=\"selectNode()\"\n      >\n        <!-- Node Header -->\n        <div class=\"node-header\">\n          <div class=\"node-type\">\n            <mat-icon class=\"type-icon\" [class]=\"getNodeTypeClass()\">\n              {{ getNodeIcon() }}\n            </mat-icon>\n            <span class=\"type-label\">{{ getNodeLabel() }}</span>\n          </div>\n\n          <div class=\"node-actions\">\n            <!-- Validation Errors Badge -->\n            <mat-icon\n              *ngIf=\"hasValidationErrors\"\n              class=\"error-badge\"\n              [matBadge]=\"validationErrors.length\"\n              matBadgeColor=\"warn\"\n              matBadgeSize=\"small\"\n              matTooltip=\"Has validation errors\"\n            >\n              error\n            </mat-icon>\n\n            <!-- Node Menu -->\n            <button\n              mat-icon-button\n              [matMenuTriggerFor]=\"nodeMenu\"\n              (click)=\"$event.stopPropagation()\"\n            >\n              <mat-icon>more_vert</mat-icon>\n            </button>\n\n            <mat-menu #nodeMenu=\"matMenu\">\n              <button mat-menu-item (click)=\"editNode()\">\n                <mat-icon>edit</mat-icon>\n                <span>Edit</span>\n              </button>\n\n              <button mat-menu-item (click)=\"duplicateNode()\">\n                <mat-icon>content_copy</mat-icon>\n                <span>Duplicate</span>\n              </button>\n\n              <mat-divider></mat-divider>\n\n              <button\n                mat-menu-item\n                *ngIf=\"canHaveChildren()\"\n                [matMenuTriggerFor]=\"addChildMenu\"\n              >\n                <mat-icon>add</mat-icon>\n                <span>Add Child</span>\n              </button>\n\n              <mat-divider></mat-divider>\n\n              <button\n                mat-menu-item\n                (click)=\"deleteNode()\"\n                class=\"delete-action\"\n              >\n                <mat-icon>delete</mat-icon>\n                <span>Delete</span>\n              </button>\n            </mat-menu>\n\n            <mat-menu #addChildMenu=\"matMenu\">\n              <button\n                mat-menu-item\n                *ngFor=\"let option of getChildOptions()\"\n                (click)=\"addChild(option.type)\"\n              >\n                <mat-icon>{{ option.icon }}</mat-icon>\n                <span>{{ option.label }}</span>\n              </button>\n            </mat-menu>\n          </div>\n        </div>\n\n        <!-- Node Content -->\n        <div class=\"node-content\">\n          <!-- Field Condition Content -->\n          <div *ngIf=\"isFieldCondition()\" class=\"field-condition-content\">\n            <praxis-field-condition-editor\n              [config]=\"getFieldConditionConfig()\"\n              [fieldSchemas]=\"fieldSchemas\"\n              (configChanged)=\"onFieldConditionChanged($event)\"\n            >\n            </praxis-field-condition-editor>\n          </div>\n\n          <!-- Boolean Group Content -->\n          <div *ngIf=\"isBooleanGroup()\" class=\"boolean-group-content\">\n            <div class=\"group-operator\">\n              <mat-form-field appearance=\"outline\" class=\"operator-select\">\n                <mat-select\n                  [value]=\"getBooleanOperator()\"\n                  (selectionChange)=\"onBooleanOperatorChanged($event)\"\n                >\n                  <mat-option value=\"and\">AND</mat-option>\n                  <mat-option value=\"or\">OR</mat-option>\n                  <mat-option value=\"not\">NOT</mat-option>\n                  <mat-option value=\"xor\">XOR</mat-option>\n                  <mat-option value=\"implies\">IMPLIES</mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n          </div>\n\n          <!-- Conditional Validator Content -->\n          <div\n            *ngIf=\"isConditionalValidator()\"\n            class=\"conditional-validator-content\"\n          >\n            <praxis-conditional-validator-editor\n              [config]=\"getConditionalValidatorConfig()\"\n              [fieldSchemas]=\"fieldSchemas\"\n              (configChanged)=\"onConditionalValidatorChanged($event)\"\n            >\n            </praxis-conditional-validator-editor>\n          </div>\n\n          <!-- Collection Validation Content -->\n          <div\n            *ngIf=\"isCollectionValidation()\"\n            class=\"collection-validation-content\"\n          >\n            <praxis-collection-validator-editor\n              [config]=\"getCollectionValidationConfig()\"\n              [fieldSchemas]=\"fieldSchemas\"\n              (configChanged)=\"onCollectionValidationChanged($event)\"\n            >\n            </praxis-collection-validator-editor>\n          </div>\n\n          <!-- Metadata Preview -->\n          <div *ngIf=\"node?.metadata\" class=\"metadata-preview\">\n            <mat-chip-set class=\"metadata-chips\">\n              <mat-chip\n                *ngIf=\"node!.metadata?.code\"\n                class=\"metadata-chip code-chip\"\n              >\n                {{ node!.metadata!.code }}\n              </mat-chip>\n\n              <mat-chip\n                *ngIf=\"node!.metadata?.tag\"\n                class=\"metadata-chip tag-chip\"\n              >\n                {{ node!.metadata!.tag }}\n              </mat-chip>\n            </mat-chip-set>\n\n            <div\n              *ngIf=\"node!.metadata?.message\"\n              class=\"metadata-message\"\n              [title]=\"node!.metadata?.message\"\n            >\n              {{ node!.metadata!.message }}\n            </div>\n          </div>\n        </div>\n\n        <!-- Validation Errors -->\n        <div *ngIf=\"hasValidationErrors\" class=\"validation-errors\">\n          <div\n            *ngFor=\"let error of validationErrors\"\n            class=\"validation-error\"\n            [class]=\"error.severity\"\n          >\n            <mat-icon class=\"error-icon\">{{\n              getErrorIcon(error.severity)\n            }}</mat-icon>\n            <span class=\"error-message\">{{ error.message }}</span>\n          </div>\n        </div>\n      </mat-card>\n\n      <!-- Children Container -->\n      <div *ngIf=\"hasChildren()\" class=\"children-container\">\n        <div class=\"children-connector\">\n          <div class=\"connector-line\"></div>\n        </div>\n\n        <div\n          class=\"children-list\"\n          cdkDropList\n          [cdkDropListData]=\"node?.children || []\"\n          (cdkDropListDropped)=\"onChildDrop($event)\"\n        >\n          <div\n            *ngFor=\"let childId of node?.children; trackBy: trackByChildId\"\n            class=\"child-wrapper\"\n            cdkDrag\n          >\n            <praxis-rule-node\n              [node]=\"getChildNode(childId)\"\n              [fieldSchemas]=\"fieldSchemas\"\n              [level]=\"level + 1\"\n              [isSelected]=\"isChildSelected(childId)\"\n              [validationErrors]=\"getChildValidationErrors(childId)\"\n              (nodeClicked)=\"onChildClicked(childId)\"\n              (nodeUpdated)=\"onChildUpdated($event)\"\n              (nodeDeleted)=\"onChildDeleted(childId)\"\n              (childAdded)=\"onChildAdded($event)\"\n              (childMoved)=\"onChildMoved($event)\"\n            >\n            </praxis-rule-node>\n\n            <!-- Child Connector -->\n            <div *ngIf=\"!isLastChild(childId)\" class=\"child-connector\">\n              <div class=\"connector-line\"></div>\n              <div class=\"connector-operator\">\n                {{ getBooleanOperator().toUpperCase() }}\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Add Child Button -->\n        <div *ngIf=\"canHaveChildren()\" class=\"add-child-area\">\n          <button\n            mat-icon-button\n            color=\"primary\"\n            (click)=\"showAddChildMenu()\"\n            class=\"add-child-button\"\n          >\n            <mat-icon>add_circle</mat-icon>\n          </button>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        --vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,0.08));\n        --vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,0.18));\n        --vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,0.32));\n      }\n      .rule-node-container {\n        position: relative;\n        margin-bottom: 16px;\n      }\n\n      .rule-node {\n        min-width: 300px;\n        border: 2px solid transparent;\n        cursor: pointer;\n        transition: all 0.2s ease;\n        position: relative;\n      }\n\n      .rule-node:hover { border-color: var(--md-sys-color-primary); box-shadow: 0 4px 8px var(--vb-shadow-low-color); }\n\n      .rule-node.selected { border-color: var(--md-sys-color-primary); background: var(--md-sys-color-primary-container); box-shadow: 0 4px 12px var(--vb-shadow-medium-color); }\n\n      .rule-node-container.has-errors .rule-node { border-color: var(--md-sys-color-error); }\n\n      .node-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 12px 16px;\n        border-bottom: 1px solid var(--md-sys-color-outline);\n        background: var(--md-sys-color-surface-variant);\n      }\n\n      .node-type {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .type-icon {\n        font-size: 20px;\n        width: 20px;\n        height: 20px;\n      }\n\n      .type-icon.field-condition { color: var(--md-sys-color-primary); }\n      .type-icon.boolean-group { color: var(--md-sys-color-secondary); }\n      .type-icon.conditional-validator { color: var(--md-sys-color-tertiary); }\n      .type-icon.collection-validation { color: var(--md-sys-color-error); }\n\n      .type-label {\n        font-weight: 500;\n        font-size: 14px;\n      }\n\n      .node-actions {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n      }\n\n      .error-badge {\n        color: var(--md-sys-color-error);\n        font-size: 18px;\n      }\n\n      .node-content {\n        padding: 16px;\n      }\n\n      .field-condition-content,\n      .boolean-group-content,\n      .conditional-validator-content,\n      .collection-validation-content {\n        min-height: 60px;\n      }\n\n      .group-operator {\n        display: flex;\n        justify-content: center;\n      }\n\n      .operator-select {\n        width: 120px;\n      }\n\n      .metadata-preview {\n        margin-top: 12px;\n        padding-top: 12px;\n        border-top: 1px solid var(--md-sys-color-outline);\n      }\n\n      .metadata-chips {\n        margin-bottom: 8px;\n      }\n\n      .metadata-chip {\n        font-size: 11px;\n        height: 20px;\n      }\n\n      .code-chip {\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n      }\n\n      .tag-chip {\n        background: var(--md-sys-color-secondary-container);\n        color: var(--md-sys-color-on-secondary-container);\n      }\n\n      .metadata-message {\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n        font-style: italic;\n        max-width: 100%;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n\n      .validation-errors {\n        border-top: 1px solid var(--md-sys-color-error);\n        background: var(--md-sys-color-error-container);\n        padding: 8px 12px;\n      }\n\n      .validation-error {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        margin-bottom: 4px;\n        font-size: 12px;\n      }\n\n      .validation-error:last-child {\n        margin-bottom: 0;\n      }\n\n      .validation-error.error {\n        color: var(--md-sys-color-on-error-container);\n      }\n\n      .validation-error.warning {\n        color: var(--md-sys-color-secondary);\n      }\n\n      .error-icon {\n        font-size: 14px;\n        width: 14px;\n        height: 14px;\n      }\n\n      .children-container {\n        margin-left: 24px;\n        position: relative;\n      }\n\n      .children-connector {\n        position: absolute;\n        left: -12px;\n        top: 0;\n        width: 12px;\n        height: 24px;\n      }\n\n      .connector-line {\n        width: 2px;\n        height: 100%;\n        background: var(--md-sys-color-outline);\n        margin-left: 10px;\n      }\n\n      .children-list {\n        padding-left: 12px;\n        border-left: 2px solid var(--md-sys-color-outline);\n      }\n\n      .child-wrapper {\n        position: relative;\n      }\n\n      .child-connector {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        margin: 8px 0;\n      }\n\n      .child-connector .connector-line {\n        width: 2px;\n        height: 12px;\n        background: var(--md-sys-color-outline);\n      }\n\n      .connector-operator {\n        background: var(--md-sys-color-secondary);\n        color: var(--md-sys-color-on-secondary);\n        padding: 2px 6px;\n        border-radius: 8px;\n        font-size: 10px;\n        font-weight: 600;\n        margin-top: -1px;\n      }\n\n      .add-child-area {\n        display: flex;\n        justify-content: center;\n        margin-top: 16px;\n        padding: 8px;\n        border: 1px dashed var(--md-sys-color-outline);\n        border-radius: 8px;\n        background: var(--md-sys-color-surface-variant);\n      }\n\n      .add-child-button {\n        color: var(--md-sys-color-primary);\n      }\n\n      /* Level-based indentation */\n      .level-1 {\n        margin-left: 20px;\n      }\n      .level-2 {\n        margin-left: 40px;\n      }\n      .level-3 {\n        margin-left: 60px;\n      }\n\n      /* Drag and drop styles */\n      .cdk-drag-preview {\n        box-sizing: border-box;\n        border-radius: 4px;\n        box-shadow:\n          0 5px 5px -3px rgba(0, 0, 0, 0.2),\n          0 8px 10px 1px rgba(0, 0, 0, 0.14),\n          0 3px 14px 2px rgba(0, 0, 0, 0.12);\n      }\n\n      .cdk-drag-placeholder {\n        opacity: 0;\n      }\n\n      .cdk-drag-animating {\n        transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n      }\n\n      .children-list.cdk-drop-list-dragging\n        .child-wrapper:not(.cdk-drag-placeholder) {\n        transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n      }\n\n      /* Menu styles */\n      .delete-action {\n        color: var(--md-sys-color-error);\n      }\n    `,\n  ],\n})\nexport class RuleNodeComponent {\n  @Input() node: RuleNode | null = null;\n  @Input() fieldSchemas: Record<string, FieldSchema> = {};\n  @Input() level: number = 0;\n  @Input() isSelected: boolean = false;\n  @Input() validationErrors: ValidationError[] = [];\n\n  @Output() nodeClicked = new EventEmitter<void>();\n  @Output() nodeUpdated = new EventEmitter<{\n    nodeId: string;\n    updates: Partial<RuleNode>;\n  }>();\n  @Output() nodeDeleted = new EventEmitter<void>();\n  @Output() childAdded = new EventEmitter<RuleNodeType>();\n  @Output() childMoved = new EventEmitter<CdkDragDrop<string[]>>();\n\n  get hasValidationErrors(): boolean {\n    return this.validationErrors && this.validationErrors.length > 0;\n  }\n\n  constructor(private fb: FormBuilder) {}\n\n  // Template methods\n  selectNode(): void {\n    this.nodeClicked.emit();\n  }\n\n  getNodeIcon(): string {\n    if (!this.node) return 'help';\n\n    const icons: Record<RuleNodeType, string> = {\n      [RuleNodeType.FIELD_CONDITION]: 'compare_arrows',\n      [RuleNodeType.AND_GROUP]: 'join_inner',\n      [RuleNodeType.OR_GROUP]: 'join_full',\n      [RuleNodeType.NOT_GROUP]: 'block',\n      [RuleNodeType.XOR_GROUP]: 'join_left',\n      [RuleNodeType.IMPLIES_GROUP]: 'arrow_forward',\n      [RuleNodeType.REQUIRED_IF]: 'star',\n      [RuleNodeType.VISIBLE_IF]: 'visibility',\n      [RuleNodeType.DISABLED_IF]: 'block',\n      [RuleNodeType.READONLY_IF]: 'lock',\n      [RuleNodeType.FOR_EACH]: 'repeat',\n      [RuleNodeType.UNIQUE_BY]: 'fingerprint',\n      [RuleNodeType.MIN_LENGTH]: 'height',\n      [RuleNodeType.MAX_LENGTH]: 'height',\n      [RuleNodeType.IF_DEFINED]: 'help',\n      [RuleNodeType.IF_NOT_NULL]: 'help_outline',\n      [RuleNodeType.IF_EXISTS]: 'search',\n      [RuleNodeType.WITH_DEFAULT]: 'settings_backup_restore',\n      [RuleNodeType.FUNCTION_CALL]: 'functions',\n      [RuleNodeType.FIELD_TO_FIELD]: 'compare_arrows',\n      [RuleNodeType.CONTEXTUAL]: 'dynamic_form',\n      [RuleNodeType.AT_LEAST]: 'filter_list',\n      [RuleNodeType.EXACTLY]: 'looks_one',\n      [RuleNodeType.EXPRESSION]: 'code',\n      [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'view_module',\n      [RuleNodeType.CUSTOM]: 'extension',\n    };\n\n    return icons[this.node.type] || 'help';\n  }\n\n  getNodeLabel(): string {\n    if (!this.node) return 'Unknown';\n    return this.node.label || this.formatNodeType(this.node.type);\n  }\n\n  getNodeTypeClass(): string {\n    if (!this.node) return '';\n\n    if (this.isFieldCondition()) return 'field-condition';\n    if (this.isBooleanGroup()) return 'boolean-group';\n    if (this.isConditionalValidator()) return 'conditional-validator';\n    if (this.isCollectionValidation()) return 'collection-validation';\n\n    return '';\n  }\n\n  getErrorIcon(severity: string): string {\n    const icons: Record<string, string> = {\n      error: 'error',\n      warning: 'warning',\n      info: 'info',\n    };\n    return icons[severity] || 'info';\n  }\n\n  // Node type checks\n  isFieldCondition(): boolean {\n    return this.node?.type === RuleNodeType.FIELD_CONDITION;\n  }\n\n  isBooleanGroup(): boolean {\n    return [\n      RuleNodeType.AND_GROUP,\n      RuleNodeType.OR_GROUP,\n      RuleNodeType.NOT_GROUP,\n      RuleNodeType.XOR_GROUP,\n      RuleNodeType.IMPLIES_GROUP,\n    ].includes(this.node?.type as RuleNodeType);\n  }\n\n  isConditionalValidator(): boolean {\n    return [\n      RuleNodeType.REQUIRED_IF,\n      RuleNodeType.VISIBLE_IF,\n      RuleNodeType.DISABLED_IF,\n      RuleNodeType.READONLY_IF,\n    ].includes(this.node?.type as RuleNodeType);\n  }\n\n  isCollectionValidation(): boolean {\n    return [\n      RuleNodeType.FOR_EACH,\n      RuleNodeType.UNIQUE_BY,\n      RuleNodeType.MIN_LENGTH,\n      RuleNodeType.MAX_LENGTH,\n    ].includes(this.node?.type as RuleNodeType);\n  }\n\n  // Configuration getters\n  getFieldConditionConfig(): FieldConditionConfig | null {\n    if (!this.isFieldCondition()) return null;\n    return (this.node?.config as FieldConditionConfig) || null;\n  }\n\n  getBooleanGroupConfig(): BooleanGroupConfig | null {\n    if (!this.isBooleanGroup()) return null;\n    return (this.node?.config as BooleanGroupConfig) || null;\n  }\n\n  getConditionalValidatorConfig(): ConditionalValidatorConfig | null {\n    if (!this.isConditionalValidator()) return null;\n    return (this.node?.config as ConditionalValidatorConfig) || null;\n  }\n\n  getCollectionValidationConfig(): CollectionValidatorConfig | null {\n    if (!this.isCollectionValidation()) return null;\n    return (this.node?.config as CollectionValidatorConfig) || null;\n  }\n\n  getBooleanOperator(): string {\n    const config = this.getBooleanGroupConfig();\n    return config?.operator || 'and';\n  }\n\n  // Children management\n  hasChildren(): boolean {\n    return !!(this.node?.children && this.node.children.length > 0);\n  }\n\n  canHaveChildren(): boolean {\n    return this.isBooleanGroup() || this.isConditionalValidator();\n  }\n\n  getChildOptions(): { type: RuleNodeType; icon: string; label: string }[] {\n    return [\n      {\n        type: RuleNodeType.FIELD_CONDITION,\n        icon: 'compare_arrows',\n        label: 'Field Condition',\n      },\n      { type: RuleNodeType.AND_GROUP, icon: 'join_inner', label: 'AND Group' },\n      { type: RuleNodeType.OR_GROUP, icon: 'join_full', label: 'OR Group' },\n      { type: RuleNodeType.REQUIRED_IF, icon: 'star', label: 'Required If' },\n    ];\n  }\n\n  trackByChildId(index: number, childId: string): string {\n    return childId;\n  }\n\n  getChildNode(childId: string): RuleNode | null {\n    // This would typically come from a service or parent component\n    return null;\n  }\n\n  isChildSelected(childId: string): boolean {\n    // This would typically come from a service or parent component\n    return false;\n  }\n\n  getChildValidationErrors(childId: string): ValidationError[] {\n    // This would typically come from a service or parent component\n    return [];\n  }\n\n  isLastChild(childId: string): boolean {\n    if (!this.node?.children) return true;\n    return this.node.children[this.node.children.length - 1] === childId;\n  }\n\n  // Event handlers\n  editNode(): void {\n    // Open edit dialog or emit edit event\n  }\n\n  duplicateNode(): void {\n    // Duplicate the current node\n  }\n\n  deleteNode(): void {\n    this.nodeDeleted.emit();\n  }\n\n  addChild(type: RuleNodeType): void {\n    this.childAdded.emit(type);\n  }\n\n  showAddChildMenu(): void {\n    // Show add child menu\n  }\n\n  onBooleanOperatorChanged(event: MatSelectChange): void {\n    if (!this.node) return;\n\n    const operator = event.value as 'and' | 'or' | 'not' | 'xor' | 'implies';\n    const config: BooleanGroupConfig = {\n      ...this.getBooleanGroupConfig(),\n      type: 'booleanGroup',\n      operator,\n    };\n\n    this.nodeUpdated.emit({\n      nodeId: this.node.id,\n      updates: { config },\n    });\n  }\n\n  onFieldConditionChanged(config: FieldConditionConfig): void {\n    if (!this.node) return;\n\n    this.nodeUpdated.emit({\n      nodeId: this.node.id,\n      updates: { config },\n    });\n  }\n\n  onConditionalValidatorChanged(config: ConditionalValidatorConfig): void {\n    if (!this.node) return;\n\n    this.nodeUpdated.emit({\n      nodeId: this.node.id,\n      updates: { config },\n    });\n  }\n\n  onCollectionValidationChanged(config: CollectionValidatorConfig): void {\n    if (!this.node) return;\n\n    this.nodeUpdated.emit({\n      nodeId: this.node.id,\n      updates: { config },\n    });\n  }\n\n  onChildClicked(childId: string): void {\n    // Bubble up child selection\n  }\n\n  onChildUpdated(event: { nodeId: string; updates: Partial<RuleNode> }): void {\n    // Bubble up child updates\n  }\n\n  onChildDeleted(childId: string): void {\n    // Handle child deletion\n  }\n\n  onChildAdded(event: RuleNodeType): void {\n    // Handle child addition\n  }\n\n  onChildMoved(event: CdkDragDrop<string[]>): void {\n    this.childMoved.emit(event);\n  }\n\n  onChildDrop(event: CdkDragDrop<string[]>): void {\n    if (event.previousIndex !== event.currentIndex) {\n      this.childMoved.emit(event);\n    }\n  }\n\n  // Helper methods\n  private formatNodeType(type: RuleNodeType | RuleNodeTypeString): string {\n    return type\n      .split(/(?=[A-Z])/)\n      .join(' ')\n      .toLowerCase()\n      .replace(/^\\w/, (c: string) => c.toUpperCase());\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\n\nimport { Subject, takeUntil } from 'rxjs';\n\nimport {\n  RuleBuilderState,\n  RuleNode,\n  RuleNodeType,\n  RuleNodeConfig\n} from '../models/rule-builder.model';\nimport { FieldSchema } from '../models/field-schema.model';\nimport { RuleNodeComponent } from './rule-node.component';\n\n@Component({\n  selector: 'praxis-rule-canvas',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatCardModule,\n    MatButtonModule,\n    MatIconModule,\n    MatMenuModule,\n    MatTooltipModule,\n    DragDropModule,\n    RuleNodeComponent\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"rule-canvas\"\n         (drop)=\"onDrop($event)\"\n         (dragover)=\"onDragOver($event)\"\n         (dragenter)=\"onDragEnter($event)\"\n         (dragleave)=\"onDragLeave($event)\">\n\n      <!-- Empty State -->\n      <div *ngIf=\"isEmpty\" class=\"empty-state\">\n        <div class=\"empty-state-content\">\n          <mat-icon class=\"empty-icon\">rule</mat-icon>\n          <h3>Start Building Rules</h3>\n          <p>Drag fields from the sidebar or click the button below to create your first rule</p>\n\n          <button mat-raised-button\n                  color=\"primary\"\n                  (click)=\"addFirstRule()\">\n            <mat-icon>add</mat-icon>\n            Add First Rule\n          </button>\n        </div>\n      </div>\n\n      <!-- Rule Tree -->\n      <div *ngIf=\"!isEmpty\" class=\"rule-tree\">\n        <div *ngFor=\"let nodeId of state?.rootNodes; trackBy: trackByNodeId\"\n             class=\"root-rule-container\">\n          <praxis-rule-node\n            [node]=\"getNode(nodeId)\"\n            [fieldSchemas]=\"fieldSchemas\"\n            [level]=\"0\"\n            [isSelected]=\"isNodeSelected(nodeId)\"\n            [validationErrors]=\"getNodeValidationErrors(nodeId)\"\n            (nodeClicked)=\"selectNode(nodeId)\"\n            (nodeUpdated)=\"updateNode($event)\"\n            (nodeDeleted)=\"deleteNode(nodeId)\"\n            (childAdded)=\"addChildNode(nodeId, $event)\"\n            (childMoved)=\"moveChildNode($event)\">\n          </praxis-rule-node>\n\n          <!-- Connector for multiple root rules -->\n          <div *ngIf=\"!isLastRootNode(nodeId)\" class=\"root-connector\">\n            <div class=\"connector-line\"></div>\n            <div class=\"connector-operator\">AND</div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Drop Zone Overlay -->\n      <div *ngIf=\"isDragOver\" class=\"drop-zone-overlay\">\n        <div class=\"drop-zone-content\">\n          <mat-icon>add_circle</mat-icon>\n          <span>Drop here to create a new rule</span>\n        </div>\n      </div>\n\n      <!-- Floating Add Menu -->\n      <div class=\"floating-add-menu\"\n           [class.expanded]=\"showAddMenu\">\n        <button mat-fab\n                color=\"primary\"\n                (click)=\"toggleAddMenu()\"\n                class=\"main-add-button\">\n          <mat-icon>{{ showAddMenu ? 'close' : 'add' }}</mat-icon>\n        </button>\n\n        <div *ngIf=\"showAddMenu\" class=\"add-menu-options\">\n          <button *ngFor=\"let option of addMenuOptions\"\n                  mat-mini-fab\n                  [color]=\"option.color\"\n                  (click)=\"addRule(option.type)\"\n                  [matTooltip]=\"option.label\"\n                  class=\"add-option-button\">\n            <mat-icon>{{ option.icon }}</mat-icon>\n          </button>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n      /* Inherit md-sys tokens from global theme */\n    .rule-canvas {\n      position: relative;\n      min-height: 500px;\n      width: 100%;\n      background: var(--md-sys-color-surface);\n      border: 2px dashed var(--md-sys-color-outline);\n      border-radius: 12px;\n      padding: 24px;\n      transition: all 0.3s ease;\n    }\n\n    .rule-canvas.drag-over {\n      border-color: var(--md-sys-color-primary);\n      background: var(--md-sys-color-primary-container);\n      border-style: solid;\n    }\n\n    .empty-state {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 400px;\n      text-align: center;\n    }\n\n    .empty-state-content {\n      max-width: 400px;\n    }\n\n    .empty-icon {\n      font-size: 64px;\n      width: 64px;\n      height: 64px;\n      color: var(--md-sys-color-on-surface-variant);\n      margin-bottom: 16px;\n    }\n\n    .empty-state h3 {\n      margin: 0 0 8px 0;\n      color: var(--md-sys-color-on-surface);\n      font-weight: 500;\n    }\n\n    .empty-state p {\n      margin: 0 0 24px 0;\n      color: var(--md-sys-color-on-surface-variant);\n      line-height: 1.4;\n    }\n\n    .rule-tree {\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n    }\n\n    .root-rule-container {\n      position: relative;\n    }\n\n    .root-connector {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      margin: 8px 0;\n    }\n\n    .connector-line {\n      width: 2px;\n      height: 16px;\n      background: var(--md-sys-color-outline);\n    }\n\n    .connector-operator {\n      background: var(--md-sys-color-primary);\n      color: var(--md-sys-color-on-primary);\n      padding: 4px 8px;\n      border-radius: 12px;\n      font-size: 11px;\n      font-weight: 600;\n      margin-top: -1px;\n    }\n\n    .drop-zone-overlay {\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      background: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);\n      border: 3px dashed var(--md-sys-color-primary);\n      border-radius: 12px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      z-index: 1000;\n      animation: pulse 1s infinite;\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 0.6; }\n      50% { opacity: 1; }\n    }\n\n    .drop-zone-content {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      gap: 8px;\n      color: var(--md-sys-color-primary);\n      font-weight: 500;\n    }\n\n    .drop-zone-content mat-icon {\n      font-size: 48px;\n      width: 48px;\n      height: 48px;\n    }\n\n    .floating-add-menu {\n      position: fixed;\n      bottom: 24px;\n      right: 24px;\n      z-index: 1000;\n    }\n\n    .main-add-button {\n      transition: transform 0.3s ease;\n    }\n\n    .floating-add-menu.expanded .main-add-button {\n      transform: rotate(45deg);\n    }\n\n    .add-menu-options {\n      position: absolute;\n      bottom: 64px;\n      right: 0;\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n      animation: slideUp 0.3s ease;\n    }\n\n    @keyframes slideUp {\n      from {\n        opacity: 0;\n        transform: translateY(20px);\n      }\n      to {\n        opacity: 1;\n        transform: translateY(0);\n      }\n    }\n\n    .add-option-button {\n      animation: fadeIn 0.3s ease;\n      animation-fill-mode: both;\n    }\n\n    .add-option-button:nth-child(1) { animation-delay: 0.1s; }\n    .add-option-button:nth-child(2) { animation-delay: 0.15s; }\n    .add-option-button:nth-child(3) { animation-delay: 0.2s; }\n    .add-option-button:nth-child(4) { animation-delay: 0.25s; }\n    .add-option-button:nth-child(5) { animation-delay: 0.3s; }\n\n    @keyframes fadeIn {\n      from {\n        opacity: 0;\n        transform: scale(0.5);\n      }\n      to {\n        opacity: 1;\n        transform: scale(1);\n      }\n    }\n\n    /* Responsive adjustments */\n    @media (max-width: 768px) {\n      .rule-canvas {\n        padding: 16px;\n      }\n\n      .floating-add-menu {\n        bottom: 16px;\n        right: 16px;\n      }\n    }\n  `]\n})\nexport class RuleCanvasComponent implements OnInit, OnDestroy {\n  @Input() state: RuleBuilderState | null = null;\n  @Input() fieldSchemas: Record<string, FieldSchema> = {};\n\n  @Output() nodeSelected = new EventEmitter<string>();\n  @Output() nodeAdded = new EventEmitter<{ type: RuleNodeType; parentId?: string; config?: RuleNodeConfig }>();\n  @Output() nodeUpdated = new EventEmitter<{ nodeId: string; updates: Partial<RuleNode> }>();\n  @Output() nodeRemoved = new EventEmitter<string>();\n\n  private destroy$ = new Subject<void>();\n\n  isDragOver = false;\n  showAddMenu = false;\n\n  addMenuOptions = [\n    { type: RuleNodeType.FIELD_CONDITION, icon: 'compare_arrows', label: 'Field Condition', color: 'primary' },\n    { type: RuleNodeType.AND_GROUP, icon: 'join_inner', label: 'AND Group', color: 'accent' },\n    { type: RuleNodeType.OR_GROUP, icon: 'join_full', label: 'OR Group', color: 'warn' },\n    { type: RuleNodeType.REQUIRED_IF, icon: 'star', label: 'Required If', color: 'primary' },\n    { type: RuleNodeType.VISIBLE_IF, icon: 'visibility', label: 'Visible If', color: 'accent' },\n    { type: RuleNodeType.FOR_EACH, icon: 'repeat', label: 'For Each', color: 'accent' }\n  ];\n\n  get isEmpty(): boolean {\n    return !this.state?.rootNodes || this.state.rootNodes.length === 0;\n  }\n\n  constructor() {}\n\n  ngOnInit(): void {\n    // Setup any initialization logic\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  // Template methods\n  trackByNodeId(index: number, nodeId: string): string {\n    return nodeId;\n  }\n\n  getNode(nodeId: string): RuleNode | null {\n    return this.state?.nodes[nodeId] || null;\n  }\n\n  isNodeSelected(nodeId: string): boolean {\n    return this.state?.selectedNodeId === nodeId;\n  }\n\n  isLastRootNode(nodeId: string): boolean {\n    if (!this.state?.rootNodes) return true;\n    return this.state.rootNodes[this.state.rootNodes.length - 1] === nodeId;\n  }\n\n  getNodeValidationErrors(nodeId: string): any[] {\n    // Return validation errors for this specific node\n    return [];\n  }\n\n  // Event handlers\n  selectNode(nodeId: string): void {\n    this.nodeSelected.emit(nodeId);\n  }\n\n  updateNode(event: { nodeId: string; updates: Partial<RuleNode> }): void {\n    this.nodeUpdated.emit(event);\n  }\n\n  deleteNode(nodeId: string): void {\n    this.nodeRemoved.emit(nodeId);\n  }\n\n  addChildNode(parentId: string, childType: RuleNodeType): void {\n    this.nodeAdded.emit({\n      type: childType,\n      parentId\n    });\n    this.showAddMenu = false;\n  }\n\n  moveChildNode(event: any): void {\n    // Handle child node movement\n  }\n\n  // Drag and drop handlers\n  onDragOver(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragOver = true;\n  }\n\n  onDragEnter(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragOver = true;\n  }\n\n  onDragLeave(event: DragEvent): void {\n    // Only hide if leaving the canvas completely\n    if (!event.currentTarget || !event.relatedTarget) {\n      this.isDragOver = false;\n      return;\n    }\n\n    const canvas = event.currentTarget as Element;\n    const related = event.relatedTarget as Element;\n\n    if (!canvas.contains(related)) {\n      this.isDragOver = false;\n    }\n  }\n\n  onDrop(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragOver = false;\n\n    try {\n      const fieldData = event.dataTransfer?.getData('field');\n      if (fieldData) {\n        const field = JSON.parse(fieldData) as FieldSchema;\n        this.createFieldConditionFromDrop(field);\n        return;\n      }\n\n      const ruleData = event.dataTransfer?.getData('rule');\n      if (ruleData) {\n        const ruleType = ruleData as RuleNodeType;\n        this.addRule(ruleType);\n        return;\n      }\n    } catch (error) {\n      console.error('Failed to handle drop:', error);\n    }\n  }\n\n  private createFieldConditionFromDrop(field: FieldSchema): void {\n    const config: RuleNodeConfig = {\n      type: 'fieldCondition',\n      fieldName: field.name,\n      operator: 'equals',\n      value: null\n    };\n\n    this.nodeAdded.emit({\n      type: RuleNodeType.FIELD_CONDITION,\n      config\n    });\n  }\n\n  // Add menu handlers\n  toggleAddMenu(): void {\n    this.showAddMenu = !this.showAddMenu;\n  }\n\n  addFirstRule(): void {\n    this.addRule(RuleNodeType.FIELD_CONDITION);\n  }\n\n  addRule(type: RuleNodeType): void {\n    this.nodeAdded.emit({ type });\n    this.showAddMenu = false;\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\n\nimport { debounceTime, distinctUntilChanged, takeUntil, startWith, map } from 'rxjs/operators';\nimport { Subject, Observable } from 'rxjs';\n\nimport { RuleNode, SpecificationMetadata } from '../models/rule-builder.model';\n\n@Component({\n  selector: 'praxis-metadata-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatInputModule,\n    MatButtonModule,\n    MatIconModule,\n    PraxisIconDirective,\n    MatCheckboxModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatTabsModule,\n    MatDividerModule,\n    MatExpansionModule,\n    MatSlideToggleModule,\n    MatAutocompleteModule\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"metadata-editor-container\" *ngIf=\"selectedNode\">\n      <!-- Header -->\n      <div class=\"editor-header\">\n        <div class=\"node-info\">\n          <mat-icon class=\"node-icon\" [praxisIcon]=\"getNodeIcon()\"></mat-icon>\n          <div class=\"node-details\">\n            <h3 class=\"node-title\">{{ getNodeTitle() }}</h3>\n            <p class=\"node-subtitle\">{{ getNodeSubtitle() }}</p>\n          </div>\n        </div>\n        \n        <div class=\"header-actions\">\n          <button mat-icon-button \n                  [color]=\"hasUnsavedChanges ? 'warn' : 'primary'\"\n                  [matTooltip]=\"hasUnsavedChanges ? 'You have unsaved changes' : 'All changes saved'\"\n                  [disabled]=\"!hasUnsavedChanges\">\n            <mat-icon [praxisIcon]=\"hasUnsavedChanges ? 'edit' : 'check_circle'\"></mat-icon>\n          </button>\n        </div>\n      </div>\n\n      <form [formGroup]=\"metadataForm\" class=\"metadata-form\">\n        <!-- Basic Metadata Tab -->\n        <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n          <mat-tab label=\"Basic Info\">\n            <div class=\"tab-content\">\n              <!-- Code -->\n              <mat-form-field appearance=\"outline\" class=\"full-width\">\n                <mat-label>Rule Code</mat-label>\n                <input matInput \n                       formControlName=\"code\"\n                       placeholder=\"RULE_001\">\n                <mat-hint>Unique identifier for this rule</mat-hint>\n              </mat-form-field>\n\n              <!-- Message -->\n              <mat-form-field appearance=\"outline\" class=\"full-width\">\n                <mat-label>Message</mat-label>\n                <textarea matInput \n                          formControlName=\"message\"\n                          rows=\"3\"\n                          placeholder=\"Validation or information message\">\n                </textarea>\n                <mat-hint>Message shown to users when this rule is triggered</mat-hint>\n              </mat-form-field>\n\n              <!-- Tag -->\n              <mat-form-field appearance=\"outline\" class=\"full-width\">\n                <mat-label>Tag</mat-label>\n                <input matInput \n                       formControlName=\"tag\"\n                       [matAutocomplete]=\"tagAutocomplete\"\n                       placeholder=\"validation, ui, business\">\n                <mat-autocomplete #tagAutocomplete=\"matAutocomplete\">\n                  <mat-option *ngFor=\"let tag of filteredTags | async\" [value]=\"tag\">\n                    {{ tag }}\n                  </mat-option>\n                </mat-autocomplete>\n                <mat-hint>Categorization tag for grouping related rules</mat-hint>\n              </mat-form-field>\n\n              <!-- Description -->\n              <mat-form-field appearance=\"outline\" class=\"full-width\">\n                <mat-label>Description</mat-label>\n                <textarea matInput \n                          formControlName=\"description\"\n                          rows=\"3\"\n                          placeholder=\"Detailed description of this rule's purpose and behavior\">\n                </textarea>\n                <mat-hint>Internal documentation for developers</mat-hint>\n              </mat-form-field>\n\n              <!-- Priority -->\n              <mat-form-field appearance=\"outline\" class=\"full-width\">\n                <mat-label>Priority</mat-label>\n                <mat-select formControlName=\"priority\">\n                  <mat-option value=\"low\">\n                    <div class=\"priority-option\">\n                      <mat-icon>low_priority</mat-icon>\n                      <span>Low Priority</span>\n                      <small>Optional validation</small>\n                    </div>\n                  </mat-option>\n                  <mat-option value=\"medium\">\n                    <div class=\"priority-option\">\n                      <mat-icon>priority_high</mat-icon>\n                      <span>Medium Priority</span>\n                      <small>Standard validation</small>\n                    </div>\n                  </mat-option>\n                  <mat-option value=\"high\">\n                    <div class=\"priority-option\">\n                      <mat-icon>report_problem</mat-icon>\n                      <span>High Priority</span>\n                      <small>Critical validation</small>\n                    </div>\n                  </mat-option>\n                  <mat-option value=\"critical\">\n                    <div class=\"priority-option\">\n                      <mat-icon>error</mat-icon>\n                      <span>Critical Priority</span>\n                      <small>Blocking validation</small>\n                    </div>\n                  </mat-option>\n                </mat-select>\n                <mat-hint>Determines validation order and user experience</mat-hint>\n              </mat-form-field>\n            </div>\n          </mat-tab>\n\n          <!-- UI Configuration Tab -->\n          <mat-tab label=\"UI Config\">\n            <div class=\"tab-content\">\n              <div formGroupName=\"uiConfig\">\n                <!-- Icon Configuration -->\n                <mat-expansion-panel class=\"config-panel\">\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      <mat-icon>palette</mat-icon>\n                      Icon & Visual\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      Configure visual appearance\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"panel-content\">\n                    <div class=\"form-row\">\n                      <mat-form-field appearance=\"outline\" class=\"icon-select\">\n                        <mat-label>Icon</mat-label>\n                        <mat-select formControlName=\"icon\">\n                          <mat-option *ngFor=\"let icon of availableIcons\" [value]=\"icon.value\">\n                            <div class=\"icon-option\">\n                              <mat-icon>{{ icon.value }}</mat-icon>\n                              <span>{{ icon.label }}</span>\n                            </div>\n                          </mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\" class=\"color-select\">\n                        <mat-label>Color Theme</mat-label>\n                        <mat-select formControlName=\"color\">\n                          <mat-option value=\"primary\">Primary</mat-option>\n                          <mat-option value=\"accent\">Accent</mat-option>\n                          <mat-option value=\"warn\">Warning</mat-option>\n                          <mat-option value=\"success\">Success</mat-option>\n                          <mat-option value=\"info\">Info</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                    </div>\n\n                    <div class=\"form-row\">\n                      <mat-form-field appearance=\"outline\" class=\"size-select\">\n                        <mat-label>Size</mat-label>\n                        <mat-select formControlName=\"size\">\n                          <mat-option value=\"small\">Small</mat-option>\n                          <mat-option value=\"medium\">Medium</mat-option>\n                          <mat-option value=\"large\">Large</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <div class=\"toggle-options\">\n                        <mat-slide-toggle formControlName=\"showIcon\">\n                          Show Icon\n                        </mat-slide-toggle>\n                        \n                        <mat-slide-toggle formControlName=\"showLabel\">\n                          Show Label\n                        </mat-slide-toggle>\n                      </div>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n\n                <!-- Display Configuration -->\n                <mat-expansion-panel class=\"config-panel\">\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      <mat-icon>visibility</mat-icon>\n                      Display Settings\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      Control when and how to display\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"panel-content\">\n                    <div class=\"form-row\">\n                      <mat-form-field appearance=\"outline\" class=\"position-select\">\n                        <mat-label>Position</mat-label>\n                        <mat-select formControlName=\"position\">\n                          <mat-option value=\"top\">Top</mat-option>\n                          <mat-option value=\"bottom\">Bottom</mat-option>\n                          <mat-option value=\"left\">Left</mat-option>\n                          <mat-option value=\"right\">Right</mat-option>\n                          <mat-option value=\"inline\">Inline</mat-option>\n                          <mat-option value=\"floating\">Floating</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\" class=\"alignment-select\">\n                        <mat-label>Alignment</mat-label>\n                        <mat-select formControlName=\"alignment\">\n                          <mat-option value=\"start\">Start</mat-option>\n                          <mat-option value=\"center\">Center</mat-option>\n                          <mat-option value=\"end\">End</mat-option>\n                          <mat-option value=\"stretch\">Stretch</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n                    </div>\n\n                    <div class=\"display-options\">\n                      <mat-slide-toggle formControlName=\"hidden\">\n                        Hidden by Default\n                      </mat-slide-toggle>\n                      \n                      <mat-slide-toggle formControlName=\"disabled\">\n                        Disabled by Default\n                      </mat-slide-toggle>\n                      \n                      <mat-slide-toggle formControlName=\"readonly\">\n                        Readonly by Default\n                      </mat-slide-toggle>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n\n                <!-- Animation Configuration -->\n                <mat-expansion-panel class=\"config-panel\">\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      <mat-icon>animation</mat-icon>\n                      Animation & Effects\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      Configure transitions and animations\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"panel-content\">\n                    <div class=\"form-row\">\n                      <mat-form-field appearance=\"outline\" class=\"animation-select\">\n                        <mat-label>Animation Type</mat-label>\n                        <mat-select formControlName=\"animation\">\n                          <mat-option value=\"none\">None</mat-option>\n                          <mat-option value=\"fade\">Fade</mat-option>\n                          <mat-option value=\"slide\">Slide</mat-option>\n                          <mat-option value=\"scale\">Scale</mat-option>\n                          <mat-option value=\"bounce\">Bounce</mat-option>\n                          <mat-option value=\"flip\">Flip</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\" class=\"duration-input\">\n                        <mat-label>Duration (ms)</mat-label>\n                        <input matInput \n                               type=\"number\"\n                               formControlName=\"animationDuration\"\n                               min=\"0\"\n                               max=\"5000\"\n                               placeholder=\"300\">\n                      </mat-form-field>\n                    </div>\n\n                    <div class=\"animation-options\">\n                      <mat-slide-toggle formControlName=\"animateOnChange\">\n                        Animate on Value Change\n                      </mat-slide-toggle>\n                      \n                      <mat-slide-toggle formControlName=\"animateOnValidation\">\n                        Animate on Validation\n                      </mat-slide-toggle>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n              </div>\n            </div>\n          </mat-tab>\n\n          <!-- Advanced Tab -->\n          <mat-tab label=\"Advanced\">\n            <div class=\"tab-content\">\n              <!-- Custom Properties -->\n              <mat-expansion-panel class=\"config-panel\">\n                <mat-expansion-panel-header>\n                  <mat-panel-title>\n                    <mat-icon>settings</mat-icon>\n                    Custom Properties\n                  </mat-panel-title>\n                  <mat-panel-description>\n                    Add custom metadata properties\n                  </mat-panel-description>\n                </mat-expansion-panel-header>\n\n                <div class=\"panel-content\">\n                  <div class=\"custom-properties\">\n                    <div formArrayName=\"customProperties\">\n                      <div *ngFor=\"let prop of customProperties.controls; let i = index\"\n                           class=\"custom-property-item\"\n                           [formGroupName]=\"i\">\n                        \n                        <div class=\"property-header\">\n                          <span class=\"property-number\">{{ i + 1 }}</span>\n                          <button mat-icon-button \n                                  color=\"warn\"\n                                  (click)=\"removeCustomProperty(i)\"\n                                  [disabled]=\"customProperties.length <= 0\">\n                            <mat-icon>delete</mat-icon>\n                          </button>\n                        </div>\n\n                        <div class=\"property-form\">\n                          <mat-form-field appearance=\"outline\" class=\"property-key\">\n                            <mat-label>Property Key</mat-label>\n                            <input matInput \n                                   formControlName=\"key\"\n                                   placeholder=\"customProperty\">\n                          </mat-form-field>\n\n                          <mat-form-field appearance=\"outline\" class=\"property-value\">\n                            <mat-label>Property Value</mat-label>\n                            <input matInput \n                                   formControlName=\"value\"\n                                   placeholder=\"value\">\n                          </mat-form-field>\n\n                          <mat-form-field appearance=\"outline\" class=\"property-type\">\n                            <mat-label>Type</mat-label>\n                            <mat-select formControlName=\"type\">\n                              <mat-option value=\"string\">String</mat-option>\n                              <mat-option value=\"number\">Number</mat-option>\n                              <mat-option value=\"boolean\">Boolean</mat-option>\n                              <mat-option value=\"object\">Object</mat-option>\n                              <mat-option value=\"array\">Array</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                        </div>\n                      </div>\n                    </div>\n\n                    <button mat-stroked-button \n                            color=\"primary\"\n                            (click)=\"addCustomProperty()\"\n                            class=\"add-property-button\">\n                      <mat-icon>add</mat-icon>\n                      Add Custom Property\n                    </button>\n                  </div>\n                </div>\n              </mat-expansion-panel>\n\n              <!-- Conditions -->\n              <mat-expansion-panel class=\"config-panel\">\n                <mat-expansion-panel-header>\n                  <mat-panel-title>\n                    <mat-icon>rule</mat-icon>\n                    Conditional Metadata\n                  </mat-panel-title>\n                  <mat-panel-description>\n                    Apply metadata based on conditions\n                  </mat-panel-description>\n                </mat-expansion-panel-header>\n\n                <div class=\"panel-content\">\n                  <div class=\"conditional-config\">\n                    <mat-slide-toggle formControlName=\"enableConditionalMetadata\">\n                      Enable Conditional Metadata\n                    </mat-slide-toggle>\n\n                    <div *ngIf=\"enableConditionalMetadata\" class=\"conditional-rules\">\n                      <mat-form-field appearance=\"outline\" class=\"condition-input\">\n                        <mat-label>Condition Expression</mat-label>\n                        <input matInput \n                               formControlName=\"conditionExpression\"\n                               placeholder=\"field.value === 'specific_value'\">\n                        <mat-hint>JavaScript expression that determines when this metadata applies</mat-hint>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\" class=\"fallback-input\">\n                        <mat-label>Fallback Metadata</mat-label>\n                        <textarea matInput \n                                  formControlName=\"fallbackMetadata\"\n                                  rows=\"3\"\n                                  placeholder=\"Default metadata when condition is not met\">\n                        </textarea>\n                      </mat-form-field>\n                    </div>\n                  </div>\n                </div>\n              </mat-expansion-panel>\n\n              <!-- Documentation -->\n              <mat-expansion-panel class=\"config-panel\">\n                <mat-expansion-panel-header>\n                  <mat-panel-title>\n                    <mat-icon>description</mat-icon>\n                    Documentation & Notes\n                  </mat-panel-title>\n                  <mat-panel-description>\n                    Internal documentation and comments\n                  </mat-panel-description>\n                </mat-expansion-panel-header>\n\n                <div class=\"panel-content\">\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Internal Notes</mat-label>\n                    <textarea matInput \n                              formControlName=\"internalNotes\"\n                              rows=\"4\"\n                              placeholder=\"Internal notes for developers and documentation\">\n                    </textarea>\n                  </mat-form-field>\n\n                  <div class=\"documentation-links\">\n                    <h5>Documentation Links</h5>\n                    <div formArrayName=\"documentationLinks\">\n                      <div *ngFor=\"let link of documentationLinks.controls; let i = index\"\n                           class=\"doc-link-item\">\n                        \n                        <mat-form-field appearance=\"outline\" class=\"link-title\">\n                          <mat-label>Title</mat-label>\n                          <input matInput \n                                 [formControlName]=\"i\"\n                                 placeholder=\"Documentation title\">\n                        </mat-form-field>\n\n                        <mat-form-field appearance=\"outline\" class=\"link-url\">\n                          <mat-label>URL</mat-label>\n                          <input matInput \n                                 [formControlName]=\"i\"\n                                 placeholder=\"https://docs.example.com\">\n                        </mat-form-field>\n\n                        <button mat-icon-button \n                                color=\"warn\"\n                                (click)=\"removeDocumentationLink(i)\">\n                          <mat-icon>delete</mat-icon>\n                        </button>\n                      </div>\n                    </div>\n\n                    <button mat-stroked-button \n                            color=\"primary\"\n                            (click)=\"addDocumentationLink()\"\n                            class=\"add-link-button\">\n                      <mat-icon>add</mat-icon>\n                      Add Documentation Link\n                    </button>\n                  </div>\n                </div>\n              </mat-expansion-panel>\n            </div>\n          </mat-tab>\n        </mat-tab-group>\n\n        <!-- Preview Section -->\n        <div class=\"preview-section\">\n          <h4 class=\"preview-title\">\n            <mat-icon>preview</mat-icon>\n            Metadata Preview\n          </h4>\n          \n          <div class=\"preview-content\">\n            <pre class=\"preview-json\">{{ getMetadataPreview() }}</pre>\n          </div>\n        </div>\n      </form>\n    </div>\n\n    <!-- Empty State -->\n    <div class=\"empty-state\" *ngIf=\"!selectedNode\">\n      <div class=\"empty-state-content\">\n        <mat-icon class=\"empty-icon\">rule</mat-icon>\n        <h3>No Rule Selected</h3>\n        <p>Select a rule from the canvas or sidebar to edit its metadata</p>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .metadata-editor-container {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    .editor-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 16px;\n      background: var(--md-sys-color-surface-container);\n      border-bottom: 1px solid var(--md-sys-color-outline-variant);\n    }\n\n    .node-info {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n\n    .node-icon {\n      font-size: 24px;\n      width: 24px;\n      height: 24px;\n      color: var(--md-sys-color-primary);\n    }\n\n    .node-details {\n      display: flex;\n      flex-direction: column;\n    }\n\n    .node-title {\n      margin: 0;\n      font-size: 16px;\n      font-weight: 500;\n      color: var(--md-sys-color-on-surface);\n    }\n\n    .node-subtitle {\n      margin: 0;\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n    }\n\n    .header-actions {\n      display: flex;\n      gap: 8px;\n    }\n\n    .metadata-form {\n      flex: 1;\n      overflow: auto;\n      padding: 16px;\n    }\n\n    .tab-content {\n      padding: 16px 0;\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n    }\n\n    .full-width {\n      width: 100%;\n    }\n\n    .form-row {\n      display: flex;\n      gap: 12px;\n      align-items: flex-start;\n    }\n\n    .form-row > * {\n      flex: 1;\n    }\n\n    .config-panel {\n      margin-bottom: 16px;\n    }\n\n    .panel-content {\n      padding: 16px;\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n    }\n\n    .priority-option,\n    .icon-option {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .priority-option small,\n    .icon-option small {\n      color: var(--md-sys-color-on-surface-variant);\n      font-size: 11px;\n    }\n\n    .toggle-options,\n    .display-options,\n    .animation-options {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .custom-properties {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n    }\n\n    .custom-property-item {\n      border: 1px solid var(--md-sys-color-outline-variant);\n      border-radius: 8px;\n      padding: 12px;\n      background: var(--md-sys-color-surface);\n    }\n\n    .property-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 8px;\n    }\n\n    .property-number {\n      background: var(--md-sys-color-primary);\n      color: var(--md-sys-color-on-primary);\n      border-radius: 50%;\n      width: 24px;\n      height: 24px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 12px;\n      font-weight: 600;\n    }\n\n    .property-form {\n      display: flex;\n      gap: 8px;\n    }\n\n    .property-key,\n    .property-value {\n      flex: 2;\n    }\n\n    .property-type {\n      flex: 1;\n    }\n\n    .conditional-config {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n    }\n\n    .conditional-rules {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n      padding: 12px;\n      background: var(--md-sys-color-surface);\n      border-radius: 8px;\n      border: 1px solid var(--md-sys-color-outline-variant);\n    }\n\n    .documentation-links {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .documentation-links h5 {\n      margin: 0;\n      font-size: 13px;\n      font-weight: 500;\n      color: var(--md-sys-color-primary);\n    }\n\n    .doc-link-item {\n      display: flex;\n      gap: 8px;\n      align-items: center;\n    }\n\n    .link-title,\n    .link-url {\n      flex: 1;\n    }\n\n    .add-property-button,\n    .add-link-button {\n      align-self: flex-start;\n    }\n\n    .preview-section {\n      margin-top: 24px;\n      border: 1px solid var(--md-sys-color-outline-variant);\n      border-radius: 8px;\n      overflow: hidden;\n    }\n\n    .preview-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin: 0;\n      padding: 12px 16px;\n      background: var(--md-sys-color-primary-container);\n      border-bottom: 1px solid var(--md-sys-color-outline-variant);\n      font-size: 14px;\n      font-weight: 500;\n    }\n\n    .preview-content {\n      padding: 16px;\n      background: var(--md-sys-color-surface);\n    }\n\n    .preview-json {\n      font-family: 'Courier New', monospace;\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface);\n      margin: 0;\n      white-space: pre-wrap;\n      background: var(--md-sys-color-surface-container);\n      padding: 12px;\n      border-radius: 4px;\n      border: 1px solid var(--md-sys-color-outline-variant);\n      max-height: 200px;\n      overflow-y: auto;\n    }\n\n    .empty-state {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 100%;\n      text-align: center;\n    }\n\n    .empty-state-content {\n      max-width: 300px;\n    }\n\n    .empty-icon {\n      font-size: 64px;\n      width: 64px;\n      height: 64px;\n      color: var(--md-sys-color-on-surface-variant);\n      margin-bottom: 16px;\n    }\n\n    .empty-state h3 {\n      margin: 0 0 8px 0;\n      color: var(--md-sys-color-on-surface);\n      font-weight: 500;\n    }\n\n    .empty-state p {\n      margin: 0;\n      color: var(--md-sys-color-on-surface-variant);\n      line-height: 1.4;\n    }\n\n    /* Responsive adjustments */\n    @media (max-width: 768px) {\n      .form-row {\n        flex-direction: column;\n      }\n      \n      .property-form {\n        flex-direction: column;\n      }\n      \n      .doc-link-item {\n        flex-direction: column;\n        align-items: stretch;\n      }\n    }\n  `]\n})\nexport class MetadataEditorComponent implements OnInit, OnChanges {\n  @Input() selectedNode: RuleNode | null = null;\n  \n  @Output() metadataUpdated = new EventEmitter<SpecificationMetadata>();\n\n  private destroy$ = new Subject<void>();\n\n  metadataForm: FormGroup;\n  activeTabIndex = 0;\n  hasUnsavedChanges = false;\n\n  // Autocomplete data\n  availableTags = ['validation', 'ui', 'business', 'security', 'performance', 'accessibility'];\n  filteredTags!: Observable<string[]>;\n\n  availableIcons = [\n    { value: 'rule', label: 'Rule' },\n    { value: 'star', label: 'Star' },\n    { value: 'warning', label: 'Warning' },\n    { value: 'error', label: 'Error' },\n    { value: 'info', label: 'Info' },\n    { value: 'check_circle', label: 'Check' },\n    { value: 'cancel', label: 'Cancel' },\n    { value: 'help', label: 'Help' },\n    { value: 'settings', label: 'Settings' },\n    { value: 'visibility', label: 'Visibility' },\n    { value: 'lock', label: 'Lock' },\n    { value: 'security', label: 'Security' }\n  ];\n\n  get customProperties(): FormArray {\n    return this.metadataForm.get('customProperties') as FormArray;\n  }\n\n  get documentationLinks(): FormArray {\n    return this.metadataForm.get('documentationLinks') as FormArray;\n  }\n\n  get enableConditionalMetadata(): boolean {\n    return this.metadataForm.get('enableConditionalMetadata')?.value || false;\n  }\n\n  constructor(private fb: FormBuilder) {\n    this.metadataForm = this.createForm();\n    this.setupTagAutocomplete();\n  }\n\n  ngOnInit(): void {\n    this.setupFormSubscriptions();\n    this.loadMetadata();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['selectedNode']) {\n      this.loadMetadata();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private createForm(): FormGroup {\n    return this.fb.group({\n      code: [''],\n      message: [''],\n      tag: [''],\n      description: [''],\n      priority: ['medium'],\n      uiConfig: this.fb.group({\n        icon: ['rule'],\n        color: ['primary'],\n        size: ['medium'],\n        showIcon: [true],\n        showLabel: [true],\n        position: ['top'],\n        alignment: ['start'],\n        hidden: [false],\n        disabled: [false],\n        readonly: [false],\n        animation: ['fade'],\n        animationDuration: [300],\n        animateOnChange: [false],\n        animateOnValidation: [true]\n      }),\n      customProperties: this.fb.array([]),\n      enableConditionalMetadata: [false],\n      conditionExpression: [''],\n      fallbackMetadata: [''],\n      internalNotes: [''],\n      documentationLinks: this.fb.array([])\n    });\n  }\n\n  private setupFormSubscriptions(): void {\n    this.metadataForm.valueChanges\n      .pipe(\n        debounceTime(300),\n        distinctUntilChanged(),\n        takeUntil(this.destroy$)\n      )\n      .subscribe(() => {\n        this.hasUnsavedChanges = true;\n        this.emitMetadataUpdate();\n      });\n  }\n\n  private setupTagAutocomplete(): void {\n    const tagControl = this.metadataForm.get('tag');\n    if (tagControl) {\n      this.filteredTags = tagControl.valueChanges.pipe(\n        startWith(''),\n        map(value => this.filterTags(value || ''))\n      );\n    } else {\n      this.filteredTags = new Observable(observer => observer.next(this.availableTags));\n    }\n  }\n\n  private filterTags(value: string): string[] {\n    const filterValue = value.toLowerCase();\n    return this.availableTags.filter(tag => \n      tag.toLowerCase().includes(filterValue)\n    );\n  }\n\n  private loadMetadata(): void {\n    if (!this.selectedNode?.metadata) {\n      this.resetForm();\n      return;\n    }\n\n    const metadata = this.selectedNode.metadata;\n    \n    this.metadataForm.patchValue({\n      code: metadata.code || '',\n      message: metadata.message || '',\n      tag: metadata.tag || '',\n      description: metadata.description || '',\n      priority: metadata.priority || 'medium',\n      uiConfig: {\n        icon: metadata.uiConfig?.icon || 'rule',\n        color: metadata.uiConfig?.color || 'primary',\n        size: metadata.uiConfig?.size || 'medium',\n        showIcon: metadata.uiConfig?.showIcon !== false,\n        showLabel: metadata.uiConfig?.showLabel !== false,\n        position: metadata.uiConfig?.position || 'top',\n        alignment: metadata.uiConfig?.alignment || 'start',\n        hidden: metadata.uiConfig?.hidden || false,\n        disabled: metadata.uiConfig?.disabled || false,\n        readonly: metadata.uiConfig?.readonly || false,\n        animation: metadata.uiConfig?.animation || 'fade',\n        animationDuration: metadata.uiConfig?.animationDuration || 300,\n        animateOnChange: metadata.uiConfig?.animateOnChange || false,\n        animateOnValidation: metadata.uiConfig?.animateOnValidation !== false\n      },\n      enableConditionalMetadata: !!metadata.conditionExpression,\n      conditionExpression: metadata.conditionExpression || '',\n      fallbackMetadata: metadata.fallbackMetadata || '',\n      internalNotes: metadata.internalNotes || ''\n    });\n\n    // Load custom properties\n    this.loadCustomProperties(metadata.customProperties || {});\n    \n    // Load documentation links\n    this.loadDocumentationLinks(metadata.documentationLinks || []);\n\n    this.hasUnsavedChanges = false;\n  }\n\n  private resetForm(): void {\n    this.metadataForm.reset();\n    this.customProperties.clear();\n    this.documentationLinks.clear();\n    this.hasUnsavedChanges = false;\n  }\n\n  private loadCustomProperties(properties: Record<string, any>): void {\n    this.customProperties.clear();\n    \n    Object.entries(properties).forEach(([key, value]) => {\n      this.customProperties.push(this.fb.group({\n        key: [key],\n        value: [value],\n        type: [this.inferType(value)]\n      }));\n    });\n  }\n\n  private loadDocumentationLinks(links: any[]): void {\n    this.documentationLinks.clear();\n    \n    links.forEach(link => {\n      this.documentationLinks.push(this.fb.group({\n        title: [link.title || ''],\n        url: [link.url || '']\n      }));\n    });\n  }\n\n  private emitMetadataUpdate(): void {\n    if (!this.selectedNode) return;\n\n    const formValue = this.metadataForm.value;\n    const metadata: SpecificationMetadata = {\n      code: formValue.code || undefined,\n      message: formValue.message || undefined,\n      tag: formValue.tag || undefined,\n      description: formValue.description || undefined,\n      priority: formValue.priority || undefined,\n      uiConfig: this.cleanUiConfig(formValue.uiConfig),\n      customProperties: this.getCustomPropertiesValue(),\n      conditionExpression: formValue.enableConditionalMetadata ? formValue.conditionExpression : undefined,\n      fallbackMetadata: formValue.enableConditionalMetadata ? formValue.fallbackMetadata : undefined,\n      internalNotes: formValue.internalNotes || undefined,\n      documentationLinks: this.getDocumentationLinksValue()\n    };\n\n    // Remove undefined values\n    Object.keys(metadata).forEach(key => {\n      if (metadata[key as keyof SpecificationMetadata] === undefined) {\n        delete metadata[key as keyof SpecificationMetadata];\n      }\n    });\n\n    this.metadataUpdated.emit(metadata);\n  }\n\n  private cleanUiConfig(uiConfig: any): any {\n    const cleaned: any = {};\n    \n    Object.entries(uiConfig).forEach(([key, value]) => {\n      if (value !== null && value !== undefined && value !== '') {\n        cleaned[key] = value;\n      }\n    });\n\n    return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n  }\n\n  private getCustomPropertiesValue(): Record<string, any> | undefined {\n    const properties: Record<string, any> = {};\n    \n    this.customProperties.controls.forEach(control => {\n      const prop = control.value;\n      if (prop.key && prop.value) {\n        properties[prop.key] = this.convertValueByType(prop.value, prop.type);\n      }\n    });\n\n    return Object.keys(properties).length > 0 ? properties : undefined;\n  }\n\n  private getDocumentationLinksValue(): any[] | undefined {\n    const links = this.documentationLinks.controls\n      .map(control => control.value)\n      .filter(link => link.title && link.url);\n\n    return links.length > 0 ? links : undefined;\n  }\n\n  private inferType(value: any): string {\n    if (typeof value === 'boolean') return 'boolean';\n    if (typeof value === 'number') return 'number';\n    if (Array.isArray(value)) return 'array';\n    if (typeof value === 'object' && value !== null) return 'object';\n    return 'string';\n  }\n\n  private convertValueByType(value: any, type: string): any {\n    switch (type) {\n      case 'number':\n        return Number(value);\n      case 'boolean':\n        return value === 'true' || value === true;\n      case 'array':\n        try {\n          return Array.isArray(value) ? value : JSON.parse(value);\n        } catch {\n          return [value];\n        }\n      case 'object':\n        try {\n          return typeof value === 'object' ? value : JSON.parse(value);\n        } catch {\n          return { value };\n        }\n      default:\n        return String(value);\n    }\n  }\n\n  // Template methods\n  getNodeIcon(): string {\n    return this.selectedNode?.type ? this.getNodeTypeIcon(this.selectedNode.type) : 'rule';\n  }\n\n  getNodeTitle(): string {\n    return this.selectedNode?.label || this.selectedNode?.type || 'Unknown Rule';\n  }\n\n  getNodeSubtitle(): string {\n    return this.selectedNode?.metadata?.description || this.selectedNode?.id || '';\n  }\n\n  getNodeTypeIcon(type: string): string {\n    const icons: Record<string, string> = {\n      'fieldCondition': 'compare_arrows',\n      'andGroup': 'join_inner',\n      'orGroup': 'join_full',\n      'requiredIf': 'star',\n      'visibleIf': 'visibility',\n      'disabledIf': 'block',\n      'readonlyIf': 'lock'\n    };\n    \n    return icons[type] || 'rule';\n  }\n\n  getMetadataPreview(): string {\n    const formValue = this.metadataForm.value;\n    \n    const metadata: any = {\n      code: formValue.code || undefined,\n      message: formValue.message || undefined,\n      tag: formValue.tag || undefined,\n      description: formValue.description || undefined,\n      priority: formValue.priority || undefined,\n      uiConfig: this.cleanUiConfig(formValue.uiConfig),\n      customProperties: this.getCustomPropertiesValue()\n    };\n\n    // Remove undefined values for cleaner preview\n    Object.keys(metadata).forEach(key => {\n      if (metadata[key] === undefined) {\n        delete metadata[key];\n      }\n    });\n\n    return JSON.stringify(metadata, null, 2);\n  }\n\n  // Event handlers\n  addCustomProperty(): void {\n    this.customProperties.push(this.fb.group({\n      key: [''],\n      value: [''],\n      type: ['string']\n    }));\n  }\n\n  removeCustomProperty(index: number): void {\n    this.customProperties.removeAt(index);\n  }\n\n  addDocumentationLink(): void {\n    this.documentationLinks.push(this.fb.group({\n      title: [''],\n      url: ['']\n    }));\n  }\n\n  removeDocumentationLink(index: number): void {\n    this.documentationLinks.removeAt(index);\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatChipsModule } from '@angular/material/chips';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\n@Component({\n  selector: 'praxis-dsl-viewer',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatButtonModule,\n    MatIconModule,\n    MatTooltipModule,\n    MatToolbarModule,\n    MatMenuModule,\n    MatDividerModule,\n    MatSnackBarModule,\n    MatProgressBarModule,\n    MatChipsModule\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"dsl-viewer-container\">\n      <!-- Toolbar -->\n      <mat-toolbar class=\"dsl-toolbar\" color=\"primary\">\n        <span class=\"toolbar-title\">\n          <mat-icon>code</mat-icon>\n          DSL Editor\n        </span>\n        \n        <span class=\"toolbar-spacer\"></span>\n        \n        <div class=\"toolbar-actions\">\n          <!-- Validation Status -->\n          <div class=\"validation-status\" [class]=\"getValidationStatusClass()\">\n            <mat-icon>{{ getValidationIcon() }}</mat-icon>\n            <span>{{ getValidationText() }}</span>\n          </div>\n          \n          <mat-divider vertical></mat-divider>\n          \n          <!-- Editor Actions -->\n          <button mat-icon-button \n                  [disabled]=\"!editable\"\n                  (click)=\"formatCode()\"\n                  matTooltip=\"Format Code\">\n            <mat-icon>auto_fix_high</mat-icon>\n          </button>\n          \n          <button mat-icon-button \n                  [disabled]=\"!editable\"\n                  (click)=\"validateSyntax()\"\n                  matTooltip=\"Validate Syntax\">\n            <mat-icon>check_circle</mat-icon>\n          </button>\n          \n          <button mat-icon-button \n                  [disabled]=\"!editable || !hasChanges\"\n                  (click)=\"applyChanges()\"\n                  matTooltip=\"Apply Changes\">\n            <mat-icon>save</mat-icon>\n          </button>\n          \n          <button mat-icon-button \n                  [disabled]=\"!editable || !hasChanges\"\n                  (click)=\"discardChanges()\"\n                  matTooltip=\"Discard Changes\">\n            <mat-icon>undo</mat-icon>\n          </button>\n          \n          <!-- More Actions Menu -->\n          <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\">\n            <mat-icon>more_vert</mat-icon>\n          </button>\n          \n          <mat-menu #moreMenu=\"matMenu\">\n            <button mat-menu-item (click)=\"copyToClipboard()\">\n              <mat-icon>content_copy</mat-icon>\n              <span>Copy to Clipboard</span>\n            </button>\n            \n            <button mat-menu-item (click)=\"downloadDsl()\" [disabled]=\"!dsl\">\n              <mat-icon>download</mat-icon>\n              <span>Download DSL</span>\n            </button>\n            \n            <mat-divider></mat-divider>\n            \n            <button mat-menu-item (click)=\"toggleLineNumbers()\">\n              <mat-icon>format_list_numbered</mat-icon>\n              <span>{{ showLineNumbers ? 'Hide' : 'Show' }} Line Numbers</span>\n            </button>\n            \n            <button mat-menu-item (click)=\"toggleWordWrap()\">\n              <mat-icon>wrap_text</mat-icon>\n              <span>{{ wordWrap ? 'Disable' : 'Enable' }} Word Wrap</span>\n            </button>\n            \n            <button mat-menu-item (click)=\"toggleMinimap()\">\n              <mat-icon>map</mat-icon>\n              <span>{{ showMinimap ? 'Hide' : 'Show' }} Minimap</span>\n            </button>\n          </mat-menu>\n        </div>\n      </mat-toolbar>\n\n      <!-- Editor Container -->\n      <div class=\"editor-container\" [class.readonly]=\"!editable\">\n        <!-- Monaco Editor Placeholder -->\n        <div #editorContainer \n             class=\"monaco-editor-container\"\n             [class.loading]=\"isLoading\">\n        </div>\n        \n        <!-- Loading Overlay -->\n        <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n          <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n          <span class=\"loading-text\">Loading editor...</span>\n        </div>\n        \n        <!-- Readonly Overlay -->\n        <div *ngIf=\"!editable\" class=\"readonly-overlay\">\n          <div class=\"readonly-message\">\n            <mat-icon>visibility</mat-icon>\n            <span>Read-only mode</span>\n          </div>\n        </div>\n      </div>\n\n      <!-- Status Bar -->\n      <div class=\"status-bar\">\n        <div class=\"status-left\">\n          <span class=\"editor-info\">{{ getEditorInfo() }}</span>\n          <span *ngIf=\"cursorPosition\" class=\"cursor-position\">\n            Line {{ cursorPosition.line }}, Column {{ cursorPosition.column }}\n          </span>\n        </div>\n        \n        <div class=\"status-center\">\n          <!-- Syntax Errors -->\n          <div *ngIf=\"syntaxErrors.length > 0\" class=\"syntax-errors\">\n            <mat-icon color=\"warn\">error</mat-icon>\n            <span>{{ syntaxErrors.length }} error(s)</span>\n            <button mat-button \n                    size=\"small\" \n                    color=\"warn\"\n                    (click)=\"showErrorDetails()\">\n              Details\n            </button>\n          </div>\n          \n          <!-- Warnings -->\n          <div *ngIf=\"warnings.length > 0\" class=\"warnings\">\n            <mat-icon color=\"accent\">warning</mat-icon>\n            <span>{{ warnings.length }} warning(s)</span>\n          </div>\n        </div>\n        \n        <div class=\"status-right\">\n          <span class=\"language-mode\">DSL</span>\n          <span *ngIf=\"hasChanges\" class=\"unsaved-indicator\">•</span>\n        </div>\n      </div>\n\n      <!-- Error Panel -->\n      <div *ngIf=\"showErrors && (syntaxErrors.length > 0 || warnings.length > 0)\" \n           class=\"error-panel\">\n        <div class=\"error-panel-header\">\n          <h4>Issues</h4>\n          <button mat-icon-button (click)=\"hideErrorDetails()\">\n            <mat-icon>close</mat-icon>\n          </button>\n        </div>\n        \n        <div class=\"error-list\">\n          <!-- Syntax Errors -->\n          <div *ngFor=\"let error of syntaxErrors\" \n               class=\"error-item severity-error\"\n               (click)=\"goToError(error)\">\n            <mat-icon>error</mat-icon>\n            <div class=\"error-content\">\n              <div class=\"error-message\">{{ error.message }}</div>\n              <div class=\"error-location\">Line {{ error.line }}, Column {{ error.column }}</div>\n            </div>\n          </div>\n          \n          <!-- Warnings -->\n          <div *ngFor=\"let warning of warnings\" \n               class=\"error-item severity-warning\"\n               (click)=\"goToError(warning)\">\n            <mat-icon>warning</mat-icon>\n            <div class=\"error-content\">\n              <div class=\"error-message\">{{ warning.message }}</div>\n              <div class=\"error-location\">Line {{ warning.line }}, Column {{ warning.column }}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .dsl-viewer-container {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    .dsl-toolbar {\n      flex-shrink: 0;\n      padding: 0 16px;\n    }\n\n    .toolbar-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-weight: 500;\n    }\n\n    .toolbar-spacer {\n      flex: 1;\n    }\n\n    .toolbar-actions {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .validation-status {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      padding: 4px 8px;\n      border-radius: 4px;\n      font-size: 12px;\n      font-weight: 500;\n    }\n\n    .validation-status.valid {\n      background: var(--md-sys-color-tertiary-container);\n      color: var(--md-sys-color-on-tertiary-container);\n    }\n\n    .validation-status.invalid {\n      background: var(--md-sys-color-error-container);\n      color: var(--md-sys-color-on-error-container);\n    }\n\n    .validation-status.warning {\n      background: var(--md-sys-color-secondary-container);\n      color: var(--md-sys-color-on-secondary-container);\n    }\n\n    .validation-status mat-icon {\n      font-size: 16px;\n      width: 16px;\n      height: 16px;\n    }\n\n    .editor-container {\n      flex: 1;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .monaco-editor-container {\n      width: 100%;\n      height: 100%;\n      position: relative;\n    }\n\n    .monaco-editor-container.loading {\n      opacity: 0.5;\n    }\n\n    .loading-overlay {\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      background: var(--md-sys-color-surface);\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      gap: 16px;\n      z-index: 1000;\n    }\n\n    .loading-text {\n      color: var(--md-sys-color-on-surface-variant);\n      font-size: 14px;\n    }\n\n    .readonly-overlay {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n      z-index: 100;\n    }\n\n    .readonly-message {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      background: var(--md-sys-color-surface-container);\n      padding: 4px 8px;\n      border-radius: 4px;\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n      box-shadow: 0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n    }\n\n    .readonly-message mat-icon {\n      font-size: 14px;\n      width: 14px;\n      height: 14px;\n    }\n\n    .status-bar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 4px 16px;\n      background: var(--md-sys-color-surface-container);\n      border-top: 1px solid var(--md-sys-color-outline-variant);\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n      flex-shrink: 0;\n    }\n\n    .status-left,\n    .status-center,\n    .status-right {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n\n    .cursor-position {\n      font-family: monospace;\n    }\n\n    .syntax-errors,\n    .warnings {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n    }\n\n    .syntax-errors mat-icon,\n    .warnings mat-icon {\n      font-size: 14px;\n      width: 14px;\n      height: 14px;\n    }\n\n    .language-mode {\n      font-family: monospace;\n      font-weight: 600;\n    }\n\n    .unsaved-indicator {\n      color: var(--md-sys-color-primary);\n      font-weight: bold;\n      font-size: 16px;\n    }\n\n    .error-panel {\n      background: var(--md-sys-color-surface);\n      border-top: 1px solid var(--md-sys-color-outline-variant);\n      max-height: 200px;\n      overflow-y: auto;\n      flex-shrink: 0;\n    }\n\n    .error-panel-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 8px 16px;\n      background: var(--md-sys-color-surface-container);\n      border-bottom: 1px solid var(--md-sys-color-outline-variant);\n    }\n\n    .error-panel-header h4 {\n      margin: 0;\n      font-size: 14px;\n      font-weight: 500;\n    }\n\n    .error-list {\n      padding: 8px;\n    }\n\n    .error-item {\n      display: flex;\n      align-items: flex-start;\n      gap: 8px;\n      padding: 8px;\n      border-radius: 4px;\n      margin-bottom: 4px;\n      cursor: pointer;\n      transition: background 0.2s ease;\n    }\n\n    .error-item:hover {\n      background: var(--md-sys-color-surface-container);\n    }\n\n    .error-item.severity-error {\n      border-left: 3px solid var(--md-sys-color-error);\n    }\n\n    .error-item.severity-warning {\n      border-left: 3px solid var(--md-sys-color-secondary);\n    }\n\n    .error-item mat-icon {\n      font-size: 16px;\n      width: 16px;\n      height: 16px;\n      margin-top: 2px;\n    }\n\n    .error-item.severity-error mat-icon {\n      color: var(--md-sys-color-error);\n    }\n\n    .error-item.severity-warning mat-icon {\n      color: var(--md-sys-color-secondary);\n    }\n\n    .error-content {\n      flex: 1;\n    }\n\n    .error-message {\n      font-weight: 500;\n      margin-bottom: 2px;\n    }\n\n    .error-location {\n      font-size: 11px;\n      color: var(--md-sys-color-on-surface-variant);\n      font-family: monospace;\n    }\n\n    /* Responsive adjustments */\n    @media (max-width: 768px) {\n      .toolbar-actions {\n        gap: 4px;\n      }\n      \n      .status-bar {\n        flex-direction: column;\n        gap: 4px;\n        align-items: stretch;\n      }\n      \n      .status-left,\n      .status-center,\n      .status-right {\n        justify-content: center;\n      }\n    }\n  `]\n})\nexport class DslViewerComponent implements OnInit, OnChanges {\n  @Input() dsl: string = '';\n  @Input() editable: boolean = true;\n  @Input() language: string = 'dsl';\n  @Input() theme: string = 'vs';\n  \n  @Output() dslChanged = new EventEmitter<string>();\n  @Output() validationChanged = new EventEmitter<{valid: boolean; errors: any[]; warnings: any[]}>();\n\n  @ViewChild('editorContainer', { static: true }) editorContainer!: ElementRef;\n\n  private destroy$ = new Subject<void>();\n  private monacoEditor: any = null;\n  private originalDsl: string = '';\n\n  // Component state\n  isLoading = true;\n  hasChanges = false;\n  showErrors = false;\n  syntaxErrors: any[] = [];\n  warnings: any[] = [];\n  cursorPosition: {line: number; column: number} | null = null;\n  \n  // Editor settings\n  showLineNumbers = true;\n  wordWrap = false;\n  showMinimap = true;\n\n  constructor(private snackBar: MatSnackBar, private cdr: ChangeDetectorRef) {}\n\n  ngOnInit(): void {\n    this.initializeMonacoEditor();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['dsl'] && this.monacoEditor) {\n      this.updateEditorContent();\n    }\n    \n    if (changes['editable'] && this.monacoEditor) {\n      this.updateEditorOptions();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n    \n    if (this.monacoEditor) {\n      this.monacoEditor.dispose();\n    }\n  }\n\n  private async initializeMonacoEditor(): Promise<void> {\n    try {\n      this.isLoading = true;\n      \n      // In a real implementation, you would load Monaco Editor here\n      // For now, we'll simulate the loading and create a simple textarea fallback\n      await this.loadMonacoEditor();\n      \n      this.createEditor();\n      this.setupEditorEvents();\n      this.updateEditorContent();\n      this.updateEditorOptions();\n      \n      this.isLoading = false;\n      this.cdr.markForCheck();\n    } catch (error) {\n      console.error('Failed to initialize Monaco Editor:', error);\n      this.createFallbackEditor();\n      this.isLoading = false;\n      this.cdr.markForCheck();\n    }\n  }\n\n  private async loadMonacoEditor(): Promise<void> {\n    // Simulate loading Monaco Editor\n    return new Promise(resolve => setTimeout(resolve, 1000));\n  }\n\n  private createEditor(): void {\n    // In a real implementation, this would create a Monaco Editor instance\n    // For now, we'll create a simple textarea fallback\n    this.createFallbackEditor();\n  }\n\n  private createFallbackEditor(): void {\n    const textarea = document.createElement('textarea');\n    textarea.className = 'fallback-editor';\n    textarea.style.width = '100%';\n    textarea.style.height = '100%';\n    textarea.style.border = 'none';\n    textarea.style.outline = 'none';\n    textarea.style.resize = 'none';\n    textarea.style.fontFamily = 'monospace';\n    textarea.style.fontSize = '14px';\n    textarea.style.padding = '16px';\n    textarea.style.background = 'var(--md-sys-color-surface)';\n    textarea.style.color = 'var(--md-sys-color-on-surface)';\n    \n    this.editorContainer.nativeElement.appendChild(textarea);\n    \n    // Mock Monaco Editor interface\n    this.monacoEditor = {\n      setValue: (value: string) => {\n        textarea.value = value;\n      },\n      getValue: () => textarea.value,\n      updateOptions: (options: any) => {\n        textarea.readOnly = !this.editable;\n      },\n      onDidChangeModelContent: (callback: Function) => {\n        textarea.addEventListener('input', () => {\n          this.onContentChanged();\n          callback();\n        });\n      },\n      onDidChangeCursorPosition: (callback: Function) => {\n        textarea.addEventListener('click', () => {\n          this.updateCursorPosition();\n          callback();\n        });\n        textarea.addEventListener('keyup', () => {\n          this.updateCursorPosition();\n          callback();\n        });\n      },\n      setPosition: (position: any) => {\n        // Mock cursor positioning\n      },\n      focus: () => textarea.focus(),\n      dispose: () => {\n        if (textarea.parentNode) {\n          textarea.parentNode.removeChild(textarea);\n        }\n      }\n    };\n  }\n\n  private setupEditorEvents(): void {\n    if (!this.monacoEditor) return;\n\n    // Content change events\n    this.monacoEditor.onDidChangeModelContent(() => {\n      this.onContentChanged();\n    });\n\n    // Cursor position events\n    this.monacoEditor.onDidChangeCursorPosition(() => {\n      this.updateCursorPosition();\n    });\n  }\n\n  private updateEditorContent(): void {\n    if (!this.monacoEditor) return;\n    \n    this.originalDsl = this.dsl || '';\n    this.monacoEditor.setValue(this.originalDsl);\n    try { (console.debug || console.log)(\n      '[DslViewer] updateEditorContent',\n      { chars: (this.originalDsl || '').length, preview: (this.originalDsl || '').slice(0, 200) }\n    ); } catch {}\n    this.hasChanges = false;\n    this.validateSyntax();\n  }\n\n  private updateEditorOptions(): void {\n    if (!this.monacoEditor) return;\n    \n    this.monacoEditor.updateOptions({\n      readOnly: !this.editable,\n      lineNumbers: this.showLineNumbers ? 'on' : 'off',\n      wordWrap: this.wordWrap ? 'on' : 'off',\n      minimap: { enabled: this.showMinimap }\n    });\n  }\n\n  private onContentChanged(): void {\n    if (!this.monacoEditor) return;\n    \n    const currentValue = this.monacoEditor.getValue();\n    this.hasChanges = currentValue !== this.originalDsl;\n    \n    // Debounced validation\n    this.validateSyntaxDebounced();\n  }\n\n  private updateCursorPosition(): void {\n    // Mock cursor position for fallback editor\n    this.cursorPosition = { line: 1, column: 1 };\n  }\n\n  private validateSyntaxDebounced = this.debounce(() => {\n    this.validateSyntax();\n  }, 500);\n\n  private debounce(func: Function, wait: number): Function {\n    let timeout: any;\n    return function(this: any, ...args: any[]) {\n      clearTimeout(timeout);\n      timeout = setTimeout(() => func.apply(this, args), wait);\n    };\n  }\n\n  // Template methods\n  getValidationStatusClass(): string {\n    if (this.syntaxErrors.length > 0) return 'invalid';\n    if (this.warnings.length > 0) return 'warning';\n    return 'valid';\n  }\n\n  getValidationIcon(): string {\n    if (this.syntaxErrors.length > 0) return 'error';\n    if (this.warnings.length > 0) return 'warning';\n    return 'check_circle';\n  }\n\n  getValidationText(): string {\n    if (this.syntaxErrors.length > 0) return 'Invalid';\n    if (this.warnings.length > 0) return 'Warnings';\n    return 'Valid';\n  }\n\n  getEditorInfo(): string {\n    const lines = this.dsl ? this.dsl.split('\\n').length : 0;\n    const chars = this.dsl ? this.dsl.length : 0;\n    return `${lines} lines, ${chars} characters`;\n  }\n\n  // Action methods\n  formatCode(): void {\n    if (!this.editable || !this.monacoEditor) return;\n    \n    try {\n      const currentValue = this.monacoEditor.getValue();\n      const formatted = this.formatDslCode(currentValue);\n      this.monacoEditor.setValue(formatted);\n      this.snackBar.open('Code formatted', 'Close', { duration: 2000 });\n    } catch (error) {\n      this.snackBar.open('Failed to format code', 'Close', { duration: 3000 });\n    }\n  }\n\n  validateSyntax(): void {\n    if (!this.monacoEditor) return;\n    \n    const currentValue = this.monacoEditor.getValue();\n    const validation = this.validateDslSyntax(currentValue);\n    \n    this.syntaxErrors = validation.errors;\n    this.warnings = validation.warnings;\n    \n    this.validationChanged.emit({\n      valid: this.syntaxErrors.length === 0,\n      errors: this.syntaxErrors,\n      warnings: this.warnings\n    });\n  }\n\n  applyChanges(): void {\n    if (!this.hasChanges || !this.monacoEditor) return;\n    \n    const currentValue = this.monacoEditor.getValue();\n    this.originalDsl = currentValue;\n    this.hasChanges = false;\n    \n    this.dslChanged.emit(currentValue);\n    this.snackBar.open('Changes applied', 'Close', { duration: 2000 });\n  }\n\n  discardChanges(): void {\n    if (!this.hasChanges || !this.monacoEditor) return;\n    \n    this.monacoEditor.setValue(this.originalDsl);\n    this.hasChanges = false;\n    this.snackBar.open('Changes discarded', 'Close', { duration: 2000 });\n  }\n\n  copyToClipboard(): void {\n    if (!this.monacoEditor) return;\n    \n    const content = this.monacoEditor.getValue();\n    navigator.clipboard.writeText(content).then(() => {\n      this.snackBar.open('Copied to clipboard', 'Close', { duration: 2000 });\n    }).catch(() => {\n      this.snackBar.open('Failed to copy to clipboard', 'Close', { duration: 3000 });\n    });\n  }\n\n  downloadDsl(): void {\n    if (!this.dsl) return;\n    \n    const blob = new Blob([this.dsl], { type: 'text/plain' });\n    const url = window.URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'specification.dsl';\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    window.URL.revokeObjectURL(url);\n  }\n\n  toggleLineNumbers(): void {\n    this.showLineNumbers = !this.showLineNumbers;\n    this.updateEditorOptions();\n  }\n\n  toggleWordWrap(): void {\n    this.wordWrap = !this.wordWrap;\n    this.updateEditorOptions();\n  }\n\n  toggleMinimap(): void {\n    this.showMinimap = !this.showMinimap;\n    this.updateEditorOptions();\n  }\n\n  showErrorDetails(): void {\n    this.showErrors = true;\n  }\n\n  hideErrorDetails(): void {\n    this.showErrors = false;\n  }\n\n  goToError(error: any): void {\n    if (!this.monacoEditor) return;\n    \n    this.monacoEditor.setPosition({\n      lineNumber: error.line,\n      column: error.column\n    });\n    this.monacoEditor.focus();\n  }\n\n  // DSL-specific methods\n  private formatDslCode(code: string): string {\n    // Simple DSL formatting - in a real implementation, this would use a proper parser\n    return code\n      .split('\\n')\n      .map(line => line.trim())\n      .filter(line => line.length > 0)\n      .map(line => {\n        // Add proper indentation based on nesting level\n        const depth = this.calculateIndentationDepth(line);\n        return '  '.repeat(depth) + line;\n      })\n      .join('\\n');\n  }\n\n  private calculateIndentationDepth(line: string): number {\n    // Mock indentation calculation\n    if (line.includes('{')) return 1;\n    if (line.includes('}')) return 0;\n    return 0;\n  }\n\n  private validateDslSyntax(code: string): {errors: any[]; warnings: any[]} {\n    const errors: any[] = [];\n    const warnings: any[] = [];\n    \n    // Simple DSL validation - in a real implementation, this would use a proper parser\n    const lines = code.split('\\n');\n    \n    lines.forEach((line, index) => {\n      const lineNumber = index + 1;\n      \n      // Check for basic syntax errors\n      if (line.trim() && !line.trim().endsWith(';') && !line.includes('{') && !line.includes('}')) {\n        warnings.push({\n          line: lineNumber,\n          column: line.length,\n          message: 'Line should end with semicolon',\n          severity: 'warning'\n        });\n      }\n      \n      // Check for unmatched braces\n      const openBraces = (line.match(/\\{/g) || []).length;\n      const closeBraces = (line.match(/\\}/g) || []).length;\n      \n      if (openBraces !== closeBraces) {\n        errors.push({\n          line: lineNumber,\n          column: 1,\n          message: 'Unmatched braces',\n          severity: 'error'\n        });\n      }\n    });\n    \n    return { errors, warnings };\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n  selector: 'praxis-json-viewer',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatButtonModule,\n    MatIconModule,\n    PraxisIconDirective,\n    MatTooltipModule,\n    MatToolbarModule,\n    MatMenuModule,\n    MatDividerModule,\n    MatSnackBarModule\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"json-viewer-container\">\n      <!-- Toolbar -->\n      <mat-toolbar class=\"json-toolbar\" color=\"primary\">\n        <span class=\"toolbar-title\">\n          <mat-icon [praxisIcon]=\"'data_object'\"></mat-icon>\n          JSON Viewer\n        </span>\n        \n        <span class=\"toolbar-spacer\"></span>\n        \n        <div class=\"toolbar-actions\">\n          <!-- Validation Status -->\n          <div class=\"validation-status\" [class]=\"getValidationStatusClass()\">\n            <mat-icon [praxisIcon]=\"getValidationIcon()\"></mat-icon>\n            <span>{{ getValidationText() }}</span>\n          </div>\n          \n          <mat-divider vertical></mat-divider>\n          \n          <!-- Actions -->\n          <button mat-icon-button \n                  [disabled]=\"!editable\"\n                  (click)=\"formatJson()\"\n                  matTooltip=\"Format JSON\">\n            <mat-icon [praxisIcon]=\"'auto_fix_high'\"></mat-icon>\n          </button>\n          \n          <button mat-icon-button \n                  [disabled]=\"!editable\"\n                  (click)=\"validateJson()\"\n                  matTooltip=\"Validate JSON\">\n            <mat-icon [praxisIcon]=\"'check_circle'\"></mat-icon>\n          </button>\n          \n          <button mat-icon-button \n                  [disabled]=\"!editable || !hasChanges\"\n                  (click)=\"applyChanges()\"\n                  matTooltip=\"Apply Changes\">\n            <mat-icon [praxisIcon]=\"'save'\"></mat-icon>\n          </button>\n          \n          <button mat-icon-button \n                  [disabled]=\"!editable || !hasChanges\"\n                  (click)=\"discardChanges()\"\n                  matTooltip=\"Discard Changes\">\n            <mat-icon [praxisIcon]=\"'undo'\"></mat-icon>\n          </button>\n          \n          <!-- More Actions Menu -->\n          <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\">\n            <mat-icon [praxisIcon]=\"'more_vert'\"></mat-icon>\n          </button>\n          \n          <mat-menu #moreMenu=\"matMenu\">\n            <button mat-menu-item (click)=\"copyToClipboard()\">\n              <mat-icon [praxisIcon]=\"'content_copy'\"></mat-icon>\n              <span>Copy to Clipboard</span>\n            </button>\n            \n            <button mat-menu-item (click)=\"downloadJson()\" [disabled]=\"!json\">\n              <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n              <span>Download JSON</span>\n            </button>\n            \n            <mat-divider></mat-divider>\n            \n            <button mat-menu-item (click)=\"toggleLineNumbers()\">\n              <mat-icon [praxisIcon]=\"'format_list_numbered'\"></mat-icon>\n              <span>{{ showLineNumbers ? 'Hide' : 'Show' }} Line Numbers</span>\n            </button>\n            \n            <button mat-menu-item (click)=\"toggleWordWrap()\">\n              <mat-icon [praxisIcon]=\"'wrap_text'\"></mat-icon>\n              <span>{{ wordWrap ? 'Disable' : 'Enable' }} Word Wrap</span>\n            </button>\n          </mat-menu>\n        </div>\n      </mat-toolbar>\n\n      <!-- Editor Container -->\n      <div class=\"editor-container\" [class.readonly]=\"!editable\">\n        <div class=\"json-editor\">\n          <textarea \n            #jsonTextarea\n            class=\"json-textarea\"\n            [value]=\"formattedJson\"\n            [readonly]=\"!editable\"\n            (input)=\"onJsonInput($event)\"\n            [class.line-numbers]=\"showLineNumbers\"\n            [class.word-wrap]=\"wordWrap\"\n            placeholder=\"Enter JSON here...\">\n          </textarea>\n          \n          <!-- Line Numbers -->\n          <div *ngIf=\"showLineNumbers\" class=\"line-numbers\">\n            <div *ngFor=\"let lineNum of getLineNumbers()\" class=\"line-number\">\n              {{ lineNum }}\n            </div>\n          </div>\n        </div>\n        \n        <!-- Readonly Overlay -->\n        <div *ngIf=\"!editable\" class=\"readonly-overlay\">\n          <div class=\"readonly-message\">\n            <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n            <span>Read-only mode</span>\n          </div>\n        </div>\n      </div>\n\n      <!-- Status Bar -->\n      <div class=\"status-bar\">\n        <div class=\"status-left\">\n          <span class=\"editor-info\">{{ getEditorInfo() }}</span>\n        </div>\n        \n        <div class=\"status-center\">\n          <!-- Validation Errors -->\n          <div *ngIf=\"validationError\" class=\"validation-error\">\n            <mat-icon color=\"warn\">error</mat-icon>\n            <span>{{ validationError }}</span>\n          </div>\n        </div>\n        \n        <div class=\"status-right\">\n          <span class=\"language-mode\">JSON</span>\n          <span *ngIf=\"hasChanges\" class=\"unsaved-indicator\">•</span>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .json-viewer-container {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    .json-toolbar {\n      flex-shrink: 0;\n      padding: 0 16px;\n    }\n\n    .toolbar-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-weight: 500;\n    }\n\n    .toolbar-spacer {\n      flex: 1;\n    }\n\n    .toolbar-actions {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .validation-status {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      padding: 4px 8px;\n      border-radius: 4px;\n      font-size: 12px;\n      font-weight: 500;\n    }\n\n    .validation-status.valid {\n      background: var(--md-sys-color-tertiary-container);\n      color: var(--md-sys-color-on-tertiary-container);\n    }\n\n    .validation-status.invalid {\n      background: var(--md-sys-color-error-container);\n      color: var(--md-sys-color-on-error-container);\n    }\n\n    .validation-status mat-icon {\n      font-size: 16px;\n      width: 16px;\n      height: 16px;\n    }\n\n    .editor-container {\n      flex: 1;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .json-editor {\n      position: relative;\n      height: 100%;\n      display: flex;\n    }\n\n    .json-textarea {\n      flex: 1;\n      border: none;\n      outline: none;\n      resize: none;\n      font-family: 'Courier New', monospace;\n      font-size: 14px;\n      line-height: 1.5;\n      padding: 16px;\n      background: var(--md-sys-color-surface);\n      color: var(--md-sys-color-on-surface);\n      white-space: pre;\n      overflow-wrap: normal;\n      overflow: auto;\n    }\n\n    .json-textarea.line-numbers {\n      padding-left: 60px;\n    }\n\n    .json-textarea.word-wrap {\n      white-space: pre-wrap;\n      overflow-wrap: break-word;\n    }\n\n    .json-textarea:read-only {\n      background: var(--md-sys-color-surface-container);\n      color: var(--md-sys-color-on-surface-variant);\n    }\n\n    .line-numbers {\n      position: absolute;\n      left: 0;\n      top: 0;\n      width: 50px;\n      height: 100%;\n      background: var(--md-sys-color-surface-container);\n      border-right: 1px solid var(--md-sys-color-outline-variant);\n      padding: 16px 8px;\n      font-family: 'Courier New', monospace;\n      font-size: 14px;\n      line-height: 1.5;\n      color: var(--md-sys-color-on-surface-variant);\n      text-align: right;\n      overflow: hidden;\n      user-select: none;\n    }\n\n    .line-number {\n      height: 21px; /* Match line height */\n    }\n\n    .readonly-overlay {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n      z-index: 100;\n    }\n\n    .readonly-message {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      background: var(--md-sys-color-surface-container);\n      padding: 4px 8px;\n      border-radius: 4px;\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n      box-shadow: 0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n    }\n\n    .readonly-message mat-icon {\n      font-size: 14px;\n      width: 14px;\n      height: 14px;\n    }\n\n    .status-bar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 4px 16px;\n      background: var(--md-sys-color-surface-container);\n      border-top: 1px solid var(--md-sys-color-outline-variant);\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n      flex-shrink: 0;\n    }\n\n    .status-left,\n    .status-center,\n    .status-right {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n\n    .validation-error {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      color: var(--md-sys-color-error);\n    }\n\n    .validation-error mat-icon {\n      font-size: 14px;\n      width: 14px;\n      height: 14px;\n    }\n\n    .language-mode {\n      font-family: monospace;\n      font-weight: 600;\n    }\n\n    .unsaved-indicator {\n      color: var(--md-sys-color-primary);\n      font-weight: bold;\n      font-size: 16px;\n    }\n  `]\n})\nexport class JsonViewerComponent implements OnInit, OnChanges {\n  @Input() json: any = null;\n  @Input() editable: boolean = true;\n  \n  @Output() jsonChanged = new EventEmitter<any>();\n\n  // Component state\n  formattedJson: string = '';\n  originalJson: string = '';\n  hasChanges = false;\n  validationError: string = '';\n  \n  // Editor settings\n  showLineNumbers = true;\n  wordWrap = false;\n\n  constructor(private snackBar: MatSnackBar) {}\n\n  ngOnInit(): void {\n    this.updateJsonContent();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['json']) {\n      this.updateJsonContent();\n    }\n  }\n\n  private updateJsonContent(): void {\n    try {\n      if (this.json !== null && this.json !== undefined) {\n        this.formattedJson = typeof this.json === 'string' \n          ? this.json \n          : JSON.stringify(this.json, null, 2);\n      } else {\n        this.formattedJson = '';\n      }\n      \n      this.originalJson = this.formattedJson;\n      this.hasChanges = false;\n      this.validationError = '';\n    } catch (error) {\n      this.validationError = 'Invalid JSON format';\n      this.formattedJson = '';\n    }\n  }\n\n  onJsonInput(event: any): void {\n    this.formattedJson = event.target.value;\n    this.hasChanges = this.formattedJson !== this.originalJson;\n    this.validateJson();\n  }\n\n  getValidationStatusClass(): string {\n    return this.validationError ? 'invalid' : 'valid';\n  }\n\n  getValidationIcon(): string {\n    return this.validationError ? 'error' : 'check_circle';\n  }\n\n  getValidationText(): string {\n    return this.validationError ? 'Invalid' : 'Valid';\n  }\n\n  getEditorInfo(): string {\n    const lines = this.formattedJson ? this.formattedJson.split('\\n').length : 0;\n    const chars = this.formattedJson ? this.formattedJson.length : 0;\n    return `${lines} lines, ${chars} characters`;\n  }\n\n  getLineNumbers(): number[] {\n    const lineCount = this.formattedJson ? this.formattedJson.split('\\n').length : 1;\n    return Array.from({ length: lineCount }, (_, i) => i + 1);\n  }\n\n  formatJson(): void {\n    if (!this.editable) return;\n    \n    try {\n      const parsed = JSON.parse(this.formattedJson);\n      this.formattedJson = JSON.stringify(parsed, null, 2);\n      this.validationError = '';\n      this.snackBar.open('JSON formatted', 'Close', { duration: 2000 });\n    } catch (error) {\n      this.snackBar.open('Invalid JSON format', 'Close', { duration: 3000 });\n    }\n  }\n\n  validateJson(): void {\n    try {\n      if (this.formattedJson.trim()) {\n        JSON.parse(this.formattedJson);\n      }\n      this.validationError = '';\n    } catch (error) {\n      this.validationError = 'Invalid JSON syntax';\n    }\n  }\n\n  applyChanges(): void {\n    if (!this.hasChanges || this.validationError) return;\n    \n    try {\n      const parsed = this.formattedJson.trim() ? JSON.parse(this.formattedJson) : null;\n      this.originalJson = this.formattedJson;\n      this.hasChanges = false;\n      \n      this.jsonChanged.emit(parsed);\n      this.snackBar.open('Changes applied', 'Close', { duration: 2000 });\n    } catch (error) {\n      this.snackBar.open('Invalid JSON format', 'Close', { duration: 3000 });\n    }\n  }\n\n  discardChanges(): void {\n    if (!this.hasChanges) return;\n    \n    this.formattedJson = this.originalJson;\n    this.hasChanges = false;\n    this.validateJson();\n    this.snackBar.open('Changes discarded', 'Close', { duration: 2000 });\n  }\n\n  copyToClipboard(): void {\n    navigator.clipboard.writeText(this.formattedJson).then(() => {\n      this.snackBar.open('Copied to clipboard', 'Close', { duration: 2000 });\n    }).catch(() => {\n      this.snackBar.open('Failed to copy to clipboard', 'Close', { duration: 3000 });\n    });\n  }\n\n  downloadJson(): void {\n    if (!this.formattedJson) return;\n    \n    const blob = new Blob([this.formattedJson], { type: 'application/json' });\n    const url = window.URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'specification.json';\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    window.URL.revokeObjectURL(url);\n  }\n\n  toggleLineNumbers(): void {\n    this.showLineNumbers = !this.showLineNumbers;\n  }\n\n  toggleWordWrap(): void {\n    this.wordWrap = !this.wordWrap;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RuleNode } from '../models/rule-builder.model';\nimport {\n  RegistryError,\n  createError,\n  globalErrorHandler,\n} from '../errors/visual-builder-errors';\n\n/**\n * Registry service for managing RuleNode instances and their relationships.\n * Solves the core problem of resolving string IDs to actual RuleNode objects.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class RuleNodeRegistryService {\n  private nodes = new Map<string, RuleNode>();\n  private nodesSubject = new BehaviorSubject<Map<string, RuleNode>>(new Map());\n\n  /**\n   * Observable stream of all registered nodes\n   */\n  nodes$ = this.nodesSubject.asObservable();\n\n  /**\n   * Register a node in the registry\n   */\n  register(node: RuleNode): void {\n    this.nodes.set(node.id, node);\n    this.notifyChange();\n  }\n\n  /**\n   * Register multiple nodes at once\n   */\n  registerAll(nodes: RuleNode[]): void {\n    nodes.forEach((node) => this.nodes.set(node.id, node));\n    this.notifyChange();\n  }\n\n  /**\n   * Unregister a node from the registry\n   */\n  unregister(nodeId: string): boolean {\n    const result = this.nodes.delete(nodeId);\n    if (result) {\n      this.notifyChange();\n    }\n    return result;\n  }\n\n  /**\n   * Resolve a node by its ID\n   */\n  resolve(nodeId: string): RuleNode | null {\n    return this.nodes.get(nodeId) || null;\n  }\n\n  /**\n   * Retrieve a node synchronously by its ID.\n   *\n   * Provided for backwards compatibility with code that expected a\n   * synchronous `getNode` API. Internally this simply delegates to\n   * {@link resolve}.\n   */\n  getNode(nodeId: string): RuleNode | null {\n    return this.resolve(nodeId);\n  }\n\n  /**\n   * Resolve multiple nodes by their IDs\n   */\n  resolveMultiple(nodeIds: string[]): RuleNode[] {\n    return nodeIds\n      .map((id) => this.resolve(id))\n      .filter((node) => node !== null) as RuleNode[];\n  }\n\n  /**\n   * Resolve children nodes for a given node\n   */\n  resolveChildren(node: RuleNode): RuleNode[] {\n    if (!node.children || node.children.length === 0) {\n      return [];\n    }\n    return this.resolveMultiple(node.children);\n  }\n\n  /**\n   * Get all nodes that have the specified parent ID\n   */\n  getChildrenOf(parentId: string): RuleNode[] {\n    return Array.from(this.nodes.values()).filter(\n      (node) => node.parentId === parentId,\n    );\n  }\n\n  /**\n   * Get the parent node of a given node\n   */\n  getParent(node: RuleNode): RuleNode | null {\n    if (!node.parentId) {\n      return null;\n    }\n    return this.resolve(node.parentId);\n  }\n\n  /**\n   * Get all root nodes (nodes without parents)\n   */\n  getRootNodes(): RuleNode[] {\n    return Array.from(this.nodes.values()).filter((node) => !node.parentId);\n  }\n\n  /**\n   * Check if a node exists in the registry\n   */\n  exists(nodeId: string): boolean {\n    return this.nodes.has(nodeId);\n  }\n\n  /**\n   * Get all registered node IDs\n   */\n  getAllIds(): string[] {\n    return Array.from(this.nodes.keys());\n  }\n\n  /**\n   * Get all registered nodes\n   */\n  getAllNodes(): RuleNode[] {\n    return Array.from(this.nodes.values());\n  }\n\n  /**\n   * Clear all nodes from the registry\n   */\n  clear(): void {\n    this.nodes.clear();\n    this.notifyChange();\n  }\n\n  /**\n   * Get the size of the registry\n   */\n  size(): number {\n    return this.nodes.size;\n  }\n\n  /**\n   * Remove orphaned nodes (nodes without parents and not referenced by others)\n   */\n  cleanupOrphanedNodes(): string[] {\n    const orphanedIds: string[] = [];\n    const referencedIds = new Set<string>();\n\n    // Collect all referenced node IDs\n    for (const node of this.nodes.values()) {\n      if (node.children) {\n        node.children.forEach((childId) => referencedIds.add(childId));\n      }\n    }\n\n    // Find orphaned nodes (no parent and not referenced as children)\n    for (const [id, node] of this.nodes.entries()) {\n      const hasParent = node.parentId && this.nodes.has(node.parentId);\n      const isReferenced = referencedIds.has(id);\n\n      if (!hasParent && !isReferenced) {\n        // Check if it's a root node (has children but no parent)\n        const hasChildren = node.children && node.children.length > 0;\n\n        if (!hasChildren) {\n          orphanedIds.push(id);\n        }\n      }\n    }\n\n    // Remove orphaned nodes\n    for (const id of orphanedIds) {\n      this.unregister(id);\n    }\n\n    return orphanedIds;\n  }\n\n  /**\n   * Detect circular references in the registry\n   */\n  detectCircularReferences(): CircularReference[] {\n    const circularRefs: CircularReference[] = [];\n    const visiting = new Set<string>();\n    const visited = new Set<string>();\n\n    const detectCycle = (nodeId: string, path: string[]): void => {\n      if (visiting.has(nodeId)) {\n        // Found a cycle\n        const cycleStart = path.indexOf(nodeId);\n        const cycle = path.slice(cycleStart).concat(nodeId);\n\n        circularRefs.push({\n          cycle,\n          affectedNodes: cycle.slice(0, -1), // Remove duplicate last node\n        });\n        return;\n      }\n\n      if (visited.has(nodeId)) {\n        return;\n      }\n\n      const node = this.nodes.get(nodeId);\n      if (!node) return;\n\n      visiting.add(nodeId);\n      path.push(nodeId);\n\n      // Check children\n      if (node.children) {\n        for (const childId of node.children) {\n          detectCycle(childId, [...path]);\n        }\n      }\n\n      visiting.delete(nodeId);\n      visited.add(nodeId);\n    };\n\n    // Check all nodes\n    for (const nodeId of this.nodes.keys()) {\n      if (!visited.has(nodeId)) {\n        detectCycle(nodeId, []);\n      }\n    }\n\n    return circularRefs;\n  }\n\n  /**\n   * Get memory usage statistics\n   */\n  getMemoryStats(): MemoryStats {\n    let totalSize = 0;\n    let configSize = 0;\n    let childrenSize = 0;\n    let metadataSize = 0;\n\n    for (const node of this.nodes.values()) {\n      // Estimate node size\n      const nodeStr = JSON.stringify(node);\n      totalSize += nodeStr.length * 2; // Rough estimate (2 bytes per char)\n\n      // Break down by components\n      if (node.config) {\n        configSize += JSON.stringify(node.config).length * 2;\n      }\n\n      if (node.children) {\n        childrenSize += JSON.stringify(node.children).length * 2;\n      }\n\n      if (node.metadata) {\n        metadataSize += JSON.stringify(node.metadata).length * 2;\n      }\n    }\n\n    return {\n      totalNodes: this.nodes.size,\n      estimatedSizeBytes: totalSize,\n      breakdown: {\n        config: configSize,\n        children: childrenSize,\n        metadata: metadataSize,\n        other: totalSize - configSize - childrenSize - metadataSize,\n      },\n    };\n  }\n\n  /**\n   * Validate registry integrity\n   */\n  validateIntegrity(): RegistryIntegrityResult {\n    const issues: string[] = [];\n    const warnings: string[] = [];\n\n    // Check for broken references\n    for (const [id, node] of this.nodes.entries()) {\n      // Check parent reference\n      if (node.parentId) {\n        const parent = this.nodes.get(node.parentId);\n        if (!parent) {\n          issues.push(\n            `Node ${id} references non-existent parent ${node.parentId}`,\n          );\n        } else if (!parent.children?.includes(id)) {\n          warnings.push(\n            `Node ${id} references parent ${node.parentId}, but parent doesn't reference back`,\n          );\n        }\n      }\n\n      // Check children references\n      if (node.children) {\n        for (const childId of node.children) {\n          const child = this.nodes.get(childId);\n          if (!child) {\n            issues.push(`Node ${id} references non-existent child ${childId}`);\n          } else if (child.parentId !== id) {\n            warnings.push(\n              `Node ${id} references child ${childId}, but child doesn't reference back`,\n            );\n          }\n        }\n      }\n    }\n\n    // Check for circular references\n    const circularRefs = this.detectCircularReferences();\n    if (circularRefs.length > 0) {\n      issues.push(`Found ${circularRefs.length} circular reference(s)`);\n    }\n\n    return {\n      isValid: issues.length === 0,\n      issues,\n      warnings,\n      circularReferences: circularRefs,\n      memoryStats: this.getMemoryStats(),\n    };\n  }\n\n  /**\n   * Perform automatic cleanup operations\n   */\n  performCleanup(): CleanupResult {\n    const result: CleanupResult = {\n      orphanedNodesRemoved: [],\n      circularReferencesDetected: [],\n      memoryFreed: 0,\n    };\n\n    const initialSize = this.getMemoryStats().estimatedSizeBytes;\n\n    // Remove orphaned nodes\n    result.orphanedNodesRemoved = this.cleanupOrphanedNodes();\n\n    // Detect (but don't automatically fix) circular references\n    result.circularReferencesDetected = this.detectCircularReferences();\n\n    const finalSize = this.getMemoryStats().estimatedSizeBytes;\n    result.memoryFreed = initialSize - finalSize;\n\n    if (result.orphanedNodesRemoved.length > 0 || result.memoryFreed > 0) {\n      this.notifyChange();\n    }\n\n    return result;\n  }\n\n  /**\n   * Build a tree structure starting from root nodes\n   */\n  buildTree(): RuleNodeTree[] {\n    const rootNodes = this.getRootNodes();\n    return rootNodes.map((root) => this.buildNodeTree(root));\n  }\n\n  /**\n   * Build tree structure for a specific node\n   */\n  buildNodeTree(node: RuleNode): RuleNodeTree {\n    const children = this.resolveChildren(node);\n    return {\n      node,\n      children: children.map((child) => this.buildNodeTree(child)),\n    };\n  }\n\n  /**\n   * Find nodes by a predicate function\n   */\n  findNodes(predicate: (node: RuleNode) => boolean): RuleNode[] {\n    return Array.from(this.nodes.values()).filter(predicate);\n  }\n\n  /**\n   * Find nodes by type\n   */\n  findNodesByType(type: string): RuleNode[] {\n    return this.findNodes((node) => node.type === type);\n  }\n\n  /**\n   * Validate the graph structure integrity (legacy method for backward compatibility)\n   */\n  validateGraphIntegrity(): RegistryValidationResult {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    for (const node of this.nodes.values()) {\n      // Check if parent exists\n      if (node.parentId && !this.exists(node.parentId)) {\n        errors.push(\n          `Node ${node.id} references non-existent parent ${node.parentId}`,\n        );\n      }\n\n      // Check if children exist\n      if (node.children) {\n        for (const childId of node.children) {\n          if (!this.exists(childId)) {\n            errors.push(\n              `Node ${node.id} references non-existent child ${childId}`,\n            );\n          }\n        }\n      }\n\n      // Check for circular references\n      if (this.hasCircularReference(node)) {\n        errors.push(`Circular reference detected in node ${node.id}`);\n      }\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n      warnings,\n    };\n  }\n\n  /**\n   * Check if a node has circular references\n   */\n  private hasCircularReference(\n    node: RuleNode,\n    visited: Set<string> = new Set(),\n  ): boolean {\n    if (visited.has(node.id)) {\n      return true;\n    }\n\n    visited.add(node.id);\n\n    if (node.children) {\n      for (const childId of node.children) {\n        const child = this.resolve(childId);\n        if (child && this.hasCircularReference(child, new Set(visited))) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Get observable for a specific node\n   */\n  getNode$(nodeId: string): Observable<RuleNode | null> {\n    return this.nodes$.pipe(map((nodes) => nodes.get(nodeId) || null));\n  }\n\n  /**\n   * Get observable for children of a node\n   */\n  getChildren$(nodeId: string): Observable<RuleNode[]> {\n    return this.nodes$.pipe(\n      map(() => {\n        const node = this.resolve(nodeId);\n        return node ? this.resolveChildren(node) : [];\n      }),\n    );\n  }\n\n  private notifyChange(): void {\n    this.nodesSubject.next(new Map(this.nodes));\n  }\n}\n\n/**\n * Tree structure for representing node hierarchies\n */\nexport interface RuleNodeTree {\n  node: RuleNode;\n  children: RuleNodeTree[];\n}\n\n/**\n * Result of registry integrity validation\n */\nexport interface RegistryValidationResult {\n  isValid: boolean;\n  errors: string[];\n  warnings: string[];\n}\n\n/**\n * Circular reference information\n */\nexport interface CircularReference {\n  cycle: string[];\n  affectedNodes: string[];\n}\n\n/**\n * Memory usage statistics\n */\nexport interface MemoryStats {\n  totalNodes: number;\n  estimatedSizeBytes: number;\n  breakdown: {\n    config: number;\n    children: number;\n    metadata: number;\n    other: number;\n  };\n}\n\n/**\n * Registry integrity validation result\n */\nexport interface RegistryIntegrityResult {\n  isValid: boolean;\n  issues: string[];\n  warnings: string[];\n  circularReferences: CircularReference[];\n  memoryStats: MemoryStats;\n}\n\n/**\n * Cleanup operation result\n */\nexport interface CleanupResult {\n  orphanedNodesRemoved: string[];\n  circularReferencesDetected: CircularReference[];\n  memoryFreed: number;\n}\n","import { Specification } from '@praxisui/specification-core';\nimport { RuleNode } from '../../models/rule-builder.model';\n\n/**\n * Context interface for rule conversion operations\n * Eliminates circular dependencies between converters and factory\n */\nexport interface ConversionContext {\n  /**\n   * Convert a child node to a specification\n   * This method is provided by the factory to avoid circular dependencies\n   */\n  convertChild<T extends object = any>(node: RuleNode): Specification<T>;\n\n  /**\n   * Convert multiple child nodes to specifications\n   */\n  convertChildren<T extends object = any>(nodes: RuleNode[]): Specification<T>[];\n\n  /**\n   * Check if a node type is supported\n   */\n  isSupported(nodeType: string): boolean;\n\n  /**\n   * Validate that a node can be converted\n   */\n  validateNode(node: RuleNode): { isValid: boolean; errors: string[] };\n}\n\n/**\n * Context provider that implements the conversion context\n * Used by the factory to provide conversion capabilities to converters\n */\nexport class ConverterContextProvider implements ConversionContext {\n  constructor(\n    private convertFn: <T extends object = any>(node: RuleNode) => Specification<T>,\n    private isSupportedFn: (nodeType: string) => boolean,\n    private validateFn: (node: RuleNode) => { isValid: boolean; errors: string[] }\n  ) {}\n\n  convertChild<T extends object = any>(node: RuleNode): Specification<T> {\n    return this.convertFn<T>(node);\n  }\n\n  convertChildren<T extends object = any>(nodes: RuleNode[]): Specification<T>[] {\n    return nodes.map(node => this.convertChild<T>(node));\n  }\n\n  isSupported(nodeType: string): boolean {\n    return this.isSupportedFn(nodeType);\n  }\n\n  validateNode(node: RuleNode): { isValid: boolean; errors: string[] } {\n    return this.validateFn(node);\n  }\n}\n","import { Specification } from '@praxisui/specification-core';\nimport { RuleNode } from '../../models/rule-builder.model';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Interface for rule converters that transform RuleNodes to Specifications\n */\nexport interface RuleConverter {\n  /**\n   * Convert a RuleNode to a Specification\n   * @param node The node to convert\n   * @param context Context providing access to child conversion capabilities\n   */\n  convert<T extends object = any>(node: RuleNode, context?: ConversionContext): Specification<T>;\n\n  /**\n   * Check if this converter can handle the given node type\n   */\n  canConvert(nodeType: string): boolean;\n\n  /**\n   * Get the supported node types\n   */\n  getSupportedTypes(): string[];\n\n  /**\n   * Set the conversion context (called by factory during initialization)\n   */\n  setContext?(context: ConversionContext): void;\n}\n\n/**\n * Base abstract class for rule converters\n */\nexport abstract class BaseRuleConverter implements RuleConverter {\n  protected abstract supportedTypes: string[];\n  protected context?: ConversionContext;\n\n  abstract convert<T extends object = any>(node: RuleNode, context?: ConversionContext): Specification<T>;\n\n  /**\n   * Set the conversion context\n   */\n  setContext(context: ConversionContext): void {\n    this.context = context;\n  }\n\n  canConvert(nodeType: string): boolean {\n    return this.supportedTypes.includes(nodeType);\n  }\n\n  getSupportedTypes(): string[] {\n    return [...this.supportedTypes];\n  }\n\n  protected validateNode(node: RuleNode, expectedType?: string): void {\n    if (!node) {\n      throw new Error('Node cannot be null or undefined');\n    }\n\n    if (!node.config) {\n      throw new Error(`Node ${node.id} is missing configuration`);\n    }\n\n    if (expectedType && node.config.type !== expectedType) {\n      throw new Error(`Expected node type ${expectedType}, but got ${node.config.type}`);\n    }\n\n    if (!this.canConvert(node.config.type)) {\n      throw new Error(`Converter cannot handle node type: ${node.config.type}`);\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationFactory, ComparisonOperator } from '@praxisui/specification';\nimport { BaseRuleConverter } from './rule-converter.interface';\nimport { RuleNode, FieldConditionConfig } from '../../models/rule-builder.model';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Converter for field condition rules to field specifications\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class FieldConditionConverter extends BaseRuleConverter {\n  protected supportedTypes = ['fieldCondition'];\n\n  convert<T extends object>(node: RuleNode, context?: ConversionContext): Specification<T> {\n    this.validateNode(node, 'fieldCondition');\n\n    const config = node.config as FieldConditionConfig;\n\n    // Validate required properties\n    if (!config.fieldName) {\n      throw new Error(`Field condition node ${node.id} is missing fieldName`);\n    }\n\n    if (!config.operator) {\n      throw new Error(`Field condition node ${node.id} is missing operator`);\n    }\n\n    if (config.value === undefined) {\n      throw new Error(`Field condition node ${node.id} is missing value`);\n    }\n\n    // Convert operator string to ComparisonOperator enum\n    const operator = this.mapOperator(config.operator);\n\n    // Convert value based on valueType\n    const value = this.convertValue(config.value, config.valueType);\n\n    // Create field specification\n    const fieldKey = config.fieldName as keyof T;\n\n    if (config.metadata) {\n      return SpecificationFactory.fieldWithMetadata(fieldKey, operator, value, config.metadata);\n    } else {\n      return SpecificationFactory.field(fieldKey, operator, value);\n    }\n  }\n\n  private mapOperator(operatorString: string): ComparisonOperator {\n    // Normalize: remove underscores/spaces and lowercase\n    const norm = (operatorString || '').replace(/[_\\s]/g, '').toLowerCase();\n    switch (norm) {\n      case 'eq':\n      case 'equals':\n      case '==':\n      case '=':\n      case 'istrue': // treat as equals true\n      case 'isfalse': // equals false\n        return ComparisonOperator.EQUALS;\n\n      case 'neq':\n      case 'notequals':\n      case '!=':\n      case '<>':\n        return ComparisonOperator.NOT_EQUALS;\n\n      case 'lt':\n      case 'lessthan':\n      case '<':\n        return ComparisonOperator.LESS_THAN;\n\n      case 'lte':\n      case 'lessthanorequal':\n      case '<=':\n        return ComparisonOperator.LESS_THAN_OR_EQUAL;\n\n      case 'gt':\n      case 'greaterthan':\n      case '>':\n        return ComparisonOperator.GREATER_THAN;\n\n      case 'gte':\n      case 'greaterthanorequal':\n      case '>=':\n        return ComparisonOperator.GREATER_THAN_OR_EQUAL;\n\n      case 'contains':\n        return ComparisonOperator.CONTAINS;\n\n      case 'startswith':\n        return ComparisonOperator.STARTS_WITH;\n\n      case 'endswith':\n        return ComparisonOperator.ENDS_WITH;\n\n      case 'in':\n        return ComparisonOperator.IN;\n\n      default:\n        throw new Error(`Unsupported operator: ${operatorString}`);\n    }\n  }\n\n  private convertValue(value: any, valueType?: string): any {\n    if (value === null || value === undefined) {\n      return value;\n    }\n\n    switch (valueType) {\n      case 'literal':\n        return value;\n\n      case 'field':\n        // Field references should be handled differently in context\n        return value;\n\n      case 'context':\n        // Context variables should be resolved by context provider\n        return value;\n\n      case 'function':\n        // Function calls should be handled by function registry\n        return value;\n\n      default:\n        // Try to infer type and convert if needed\n        return this.inferAndConvertValue(value);\n    }\n  }\n\n  private inferAndConvertValue(value: any): any {\n    if (typeof value === 'string') {\n      // Try to parse as number\n      const numValue = Number(value);\n      if (!isNaN(numValue) && isFinite(numValue)) {\n        return numValue;\n      }\n\n      // Try to parse as boolean\n      if (value.toLowerCase() === 'true') return true;\n      if (value.toLowerCase() === 'false') return false;\n\n      // Try to parse as date\n      const dateValue = new Date(value);\n      if (!isNaN(dateValue.getTime()) && value.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n        return dateValue;\n      }\n    }\n\n    return value;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationFactory } from '@praxisui/specification';\nimport { BaseRuleConverter } from './rule-converter.interface';\nimport { RuleNode, BooleanGroupConfig } from '../../models/rule-builder.model';\nimport { RuleNodeRegistryService } from '../rule-node-registry.service';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Converter for boolean group rules (AND, OR, NOT, XOR, IMPLIES)\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class BooleanGroupConverter extends BaseRuleConverter {\n  protected supportedTypes = ['booleanGroup', 'andGroup', 'orGroup', 'notGroup', 'xorGroup', 'impliesGroup'];\n\n  constructor(\n    private nodeRegistry: RuleNodeRegistryService\n  ) {\n    super();\n  }\n\n  convert<T extends object>(node: RuleNode, context?: ConversionContext): Specification<T> {\n    this.validateNode(node);\n\n    const config = node.config as BooleanGroupConfig;\n\n    if (!config.operator) {\n      throw new Error(`Boolean group node ${node.id} is missing operator`);\n    }\n\n    // Resolve child nodes\n    const childNodes = this.nodeRegistry.resolveChildren(node);\n\n    if (config.operator !== 'not' && childNodes.length === 0) {\n      throw new Error(`Boolean group node ${node.id} requires at least one child`);\n    }\n\n    if (config.operator === 'not' && childNodes.length !== 1) {\n      throw new Error(`NOT operation requires exactly one child, but got ${childNodes.length}`);\n    }\n\n    // Convert children to specifications using context\n    const conversionContext = context || this.context;\n    if (!conversionContext) {\n      throw new Error('Conversion context is required for boolean group conversion');\n    }\n\n    const childSpecs = conversionContext.convertChildren<T>(childNodes);\n\n    // Apply boolean operator\n    switch (config.operator.toLowerCase()) {\n      case 'and':\n        return SpecificationFactory.and(...childSpecs);\n\n      case 'or':\n        return SpecificationFactory.or(...childSpecs);\n\n      case 'not':\n        return SpecificationFactory.not(childSpecs[0]);\n\n      case 'xor':\n        return SpecificationFactory.xor(...childSpecs);\n\n      case 'implies':\n        if (childSpecs.length !== 2) {\n          throw new Error(`IMPLIES operation requires exactly 2 children, but got ${childSpecs.length}`);\n        }\n        return SpecificationFactory.implies(childSpecs[0], childSpecs[1]);\n\n      default:\n        throw new Error(`Unsupported boolean operator: ${config.operator}`);\n    }\n  }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationFactory } from '@praxisui/specification';\nimport { BaseRuleConverter } from './rule-converter.interface';\nimport { RuleNode, CardinalityConfig } from '../../models/rule-builder.model';\nimport { RuleNodeRegistryService } from '../rule-node-registry.service';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Converter for cardinality rules (atLeast, exactly)\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class CardinalityConverter extends BaseRuleConverter {\n  protected supportedTypes = ['cardinality', 'atLeast', 'exactly'];\n\n  constructor(\n    private nodeRegistry: RuleNodeRegistryService\n  ) {\n    super();\n  }\n\n  convert<T extends object>(node: RuleNode, context?: ConversionContext): Specification<T> {\n    this.validateNode(node);\n\n    const config = node.config as CardinalityConfig;\n\n    if (!config.cardinalityType) {\n      throw new Error(`Cardinality node ${node.id} is missing cardinalityType`);\n    }\n\n    if (typeof config.count !== 'number' || config.count < 0) {\n      throw new Error(`Cardinality node ${node.id} has invalid count: ${config.count}`);\n    }\n\n    // Resolve child nodes\n    const childNodes = this.nodeRegistry.resolveChildren(node);\n\n    if (childNodes.length === 0) {\n      throw new Error(`Cardinality node ${node.id} requires at least one child`);\n    }\n\n    if (config.count > childNodes.length) {\n      throw new Error(`Cardinality count (${config.count}) cannot be greater than number of children (${childNodes.length})`);\n    }\n\n    // Convert children to specifications using context\n    const conversionContext = context || this.context;\n    if (!conversionContext) {\n      throw new Error('Conversion context is required for cardinality conversion');\n    }\n\n    const childSpecs = conversionContext.convertChildren<T>(childNodes);\n\n    // Apply cardinality operator\n    switch (config.cardinalityType) {\n      case 'atLeast':\n        return SpecificationFactory.atLeast(config.count, childSpecs);\n\n      case 'exactly':\n        return SpecificationFactory.exactly(config.count, childSpecs);\n\n      default:\n        throw new Error(`Unsupported cardinality type: ${config.cardinalityType}`);\n    }\n  }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { RuleConverter } from './rule-converter.interface';\nimport { RuleNode } from '../../models/rule-builder.model';\nimport { FieldConditionConverter } from './field-condition.converter';\nimport { BooleanGroupConverter } from './boolean-group.converter';\nimport { CardinalityConverter } from './cardinality.converter';\nimport { ConversionContext, ConverterContextProvider } from './conversion-context.interface';\n\n/**\n * Factory service for converting RuleNodes to Specifications\n * Uses Strategy pattern to delegate to appropriate converters\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ConverterFactoryService {\n  private converters = new Map<string, RuleConverter>();\n  private context!: ConversionContext;\n\n  constructor(\n    private fieldConditionConverter: FieldConditionConverter,\n    private booleanGroupConverter: BooleanGroupConverter,\n    private cardinalityConverter: CardinalityConverter\n  ) {\n    this.initializeContext();\n    this.initializeConverters();\n  }\n\n  /**\n   * Convert a RuleNode to a Specification\n   */\n  convert<T extends object = any>(node: RuleNode): Specification<T> {\n    if (!node) {\n      throw new Error('Node cannot be null or undefined');\n    }\n\n    if (!node.config || !node.config.type) {\n      throw new Error(`Node ${node.id} is missing configuration or type`);\n    }\n\n    const converter = this.getConverter(node.config.type);\n    if (!converter) {\n      throw new Error(`No converter found for node type: ${node.config.type}`);\n    }\n\n    try {\n      return converter.convert<T>(node, this.context);\n    } catch (error) {\n      throw new Error(`Failed to convert node ${node.id}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n  }\n\n  /**\n   * Get converter for a specific node type\n   */\n  getConverter(nodeType: string): RuleConverter | undefined {\n    for (const [, converter] of this.converters) {\n      if (converter.canConvert(nodeType)) {\n        return converter;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Register a new converter\n   */\n  registerConverter(name: string, converter: RuleConverter): void {\n    this.converters.set(name, converter);\n  }\n\n  /**\n   * Unregister a converter\n   */\n  unregisterConverter(name: string): boolean {\n    return this.converters.delete(name);\n  }\n\n  /**\n   * Get all supported node types\n   */\n  getSupportedTypes(): string[] {\n    const types = new Set<string>();\n    for (const converter of this.converters.values()) {\n      converter.getSupportedTypes().forEach(type => types.add(type));\n    }\n    return Array.from(types);\n  }\n\n  /**\n   * Check if a node type is supported\n   */\n  isSupported(nodeType: string): boolean {\n    return this.getSupportedTypes().includes(nodeType);\n  }\n\n  private initializeContext(): void {\n    // Create conversion context that provides access to this factory's convert method\n    this.context = new ConverterContextProvider(\n      <T extends object = any>(node: RuleNode) => this.convertInternal<T>(node),\n      (nodeType: string) => this.isSupported(nodeType),\n      (node: RuleNode) => this.validateNode(node)\n    );\n  }\n\n  /**\n   * Internal convert method that bypasses context to avoid recursion\n   */\n  private convertInternal<T extends object = any>(node: RuleNode): Specification<T> {\n    if (!node) {\n      throw new Error('Node cannot be null or undefined');\n    }\n\n    if (!node.config || !node.config.type) {\n      throw new Error(`Node ${node.id} is missing configuration or type`);\n    }\n\n    const converter = this.getConverter(node.config.type);\n    if (!converter) {\n      throw new Error(`No converter found for node type: ${node.config.type}`);\n    }\n\n    try {\n      // Call converter without context to avoid recursion\n      return converter.convert<T>(node);\n    } catch (error) {\n      throw new Error(`Failed to convert node ${node.id}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n  }\n\n  private initializeConverters(): void {\n    // Register core converters\n    this.registerConverter('fieldCondition', this.fieldConditionConverter);\n    this.registerConverter('booleanGroup', this.booleanGroupConverter);\n    this.registerConverter('cardinality', this.cardinalityConverter);\n\n    // Set context in converters that need it\n    this.booleanGroupConverter.setContext(this.context);\n    this.cardinalityConverter.setContext(this.context);\n    this.fieldConditionConverter.setContext(this.context);\n  }\n\n  /**\n   * Convert multiple nodes to specifications\n   */\n  convertMultiple<T extends object = any>(nodes: RuleNode[]): Specification<T>[] {\n    return nodes.map(node => this.convert<T>(node));\n  }\n\n  /**\n   * Validate that a node can be converted\n   */\n  validateNode(node: RuleNode): { isValid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (!node) {\n      errors.push('Node cannot be null or undefined');\n      return { isValid: false, errors };\n    }\n\n    if (!node.config) {\n      errors.push(`Node ${node.id} is missing configuration`);\n    } else if (!node.config.type) {\n      errors.push(`Node ${node.id} is missing type in configuration`);\n    } else if (!this.isSupported(node.config.type)) {\n      errors.push(`Node type ${node.config.type} is not supported`);\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors\n    };\n  }\n\n  /**\n   * Get statistics about converter usage\n   */\n  getStatistics(): ConverterStatistics {\n    const supportedTypes = this.getSupportedTypes();\n    const converterCount = this.converters.size;\n\n    return {\n      converterCount,\n      supportedTypeCount: supportedTypes.length,\n      supportedTypes,\n      converterNames: Array.from(this.converters.keys())\n    };\n  }\n}\n\n/**\n * Statistics about the converter factory\n */\nexport interface ConverterStatistics {\n  converterCount: number;\n  supportedTypeCount: number;\n  supportedTypes: string[];\n  converterNames: string[];\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { type SpecificationMetadata, Specification as _SpecForTypeOnly } from '@praxisui/specification-core';\nimport { ComparisonOperator } from '@praxisui/specification';\nimport { SpecificationFactory } from '@praxisui/specification';\nimport { DslExporter, ExportOptions } from '@praxisui/specification';\nimport {\n  DslParser,\n  DslValidator,\n  ValidationIssue,\n} from '@praxisui/specification';\nimport { ContextualSpecification } from '@praxisui/specification';\nimport { ContextProvider } from '@praxisui/specification';\nimport { FunctionRegistry } from '@praxisui/specification';\nimport {\n  RuleNode,\n  RuleNodeType,\n  ValueType,\n  CardinalityConfig,\n  FunctionParameter,\n  ConditionalValidatorConfig,\n  CollectionValidatorConfig,\n  FieldConditionConfig,\n  BooleanGroupConfig,\n  FunctionCallConfig,\n  FieldToFieldConfig,\n  ContextualConfig,\n} from '../models/rule-builder.model';\nimport { DslContextVariable as ContextVariable } from '../models/context-variable.model';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\nimport { ConverterFactoryService } from './converters/converter-factory.service';\n\n/**\n * Configuration for parsing DSL expressions\n */\nexport interface DslParsingConfig {\n  /** Available function registry */\n  functionRegistry?: FunctionRegistry<any>;\n  /** Context provider for variable resolution */\n  contextProvider?: ContextProvider;\n  /** Known field names for validation */\n  knownFields?: string[];\n  /** Enable performance warnings */\n  enablePerformanceWarnings?: boolean;\n  /** Maximum expression complexity */\n  maxComplexity?: number;\n}\n\n/**\n * Result of parsing a DSL expression\n */\nexport interface DslParsingResult<T extends object = any> {\n  /** Whether parsing was successful */\n  success: boolean;\n  /** Parsed specification (if successful) */\n  specification?: Specification<T>;\n  /** Validation issues found */\n  issues: ValidationIssue[];\n  /** Performance metrics */\n  metrics?: {\n    parseTime: number;\n    complexity: number;\n  };\n}\n\n/**\n * Configuration for contextual specification support\n */\nexport interface SpecificationContextualConfig {\n  /** Context variables available for token resolution */\n  contextVariables?: ContextVariable[];\n  /** Context provider instance */\n  contextProvider?: ContextProvider;\n  /** Enable strict validation of context tokens */\n  strictContextValidation?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SpecificationBridgeService {\n  private dslExporter: DslExporter;\n  private dslParser: DslParser<any>;\n  private dslValidator: DslValidator;\n  private contextProvider?: ContextProvider;\n\n  constructor(\n    private nodeRegistry: RuleNodeRegistryService,\n    private converterFactory: ConverterFactoryService,\n  ) {\n    this.dslExporter = new DslExporter({\n      prettyPrint: true,\n      indentSize: 2,\n      maxLineLength: 80,\n      useParentheses: 'auto',\n      includeMetadata: true,\n      metadataPosition: 'before',\n    });\n\n    this.dslParser = new DslParser();\n    this.dslValidator = new DslValidator();\n  }\n\n  /**\n   * Converts a RuleNode tree to a Specification instance\n   */\n  ruleNodeToSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    try {\n      // Use the config type for converter lookup (more reliable than node.type)\n      const nodeType = node.config?.type || node.type;\n\n      // Check if we have a converter for this node type\n      if (this.converterFactory.isSupported(nodeType)) {\n        return this.converterFactory.convert<T>(node);\n      }\n\n      // Fall back to legacy methods for unsupported types\n      switch (nodeType) {\n        case 'functionCall':\n          return this.createFunctionSpecification<T>(node);\n\n        case 'fieldToField':\n          return this.createFieldToFieldSpecification<T>(node);\n\n        // Phase 1: Conditional Validators\n        case 'requiredIf':\n        case 'visibleIf':\n        case 'disabledIf':\n        case 'readonlyIf':\n          return this.createConditionalValidatorSpecification<T>(node);\n\n        // Phase 2: Collection Validators\n        case 'forEach':\n        case 'uniqueBy':\n        case 'minLength':\n        case 'maxLength':\n          return this.createCollectionValidatorSpecification<T>(node);\n\n        // Phase 4: Expression and Contextual Support\n        case 'expression':\n          return this.createExpressionSpecification<T>(node);\n\n        case 'contextual':\n          return this.createContextualSpecificationFromNode<T>(node);\n\n        default:\n          throw new Error(`Unsupported rule node type: ${nodeType}`);\n      }\n    } catch (error) {\n      throw new Error(`Failed to convert rule node to specification: ${error}`);\n    }\n  }\n\n  /**\n   * Converts a Specification instance to a RuleNode tree\n   */\n  specificationToRuleNode<T extends object = any>(\n    spec: Specification<T>,\n  ): RuleNode {\n    const specJson = spec.toJSON();\n    return this.jsonToRuleNode(specJson);\n  }\n\n  /**\n   * Exports a RuleNode tree to DSL format\n   */\n  exportToDsl<T extends object = any>(\n    node: RuleNode,\n    options?: Partial<ExportOptions>,\n  ): string {\n    if (options) {\n      this.dslExporter = new DslExporter(options);\n    }\n\n    const specification = this.ruleNodeToSpecification<T>(node);\n    return this.dslExporter.export(specification);\n  }\n\n  /**\n   * Exports a RuleNode tree to DSL format with metadata\n   */\n  exportToDslWithMetadata<T extends object = any>(node: RuleNode): string {\n    const specification = this.ruleNodeToSpecification<T>(node);\n    return this.dslExporter.exportWithMetadata(specification);\n  }\n\n  /**\n   * Validates that a RuleNode can be successfully round-tripped\n   */\n  validateRoundTrip<T extends object = any>(\n    node: RuleNode,\n  ): {\n    success: boolean;\n    errors: string[];\n    warnings: string[];\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      // Convert to specification\n      const specification = this.ruleNodeToSpecification<T>(node);\n\n      // Export to DSL and re-parse\n      const dsl = this.exportToDsl<T>(node);\n\n      // Convert back to rule node via specification\n      const reconstructedNode = this.specificationToRuleNode(specification);\n\n      // Deep validation\n      const deepValidation = this.deepValidateRoundTrip(\n        node,\n        reconstructedNode,\n      );\n      errors.push(...deepValidation.errors);\n      warnings.push(...deepValidation.warnings);\n\n      // DSL round-trip validation\n      try {\n        const dslValidation = this.validateDslRoundTrip(dsl, node);\n        warnings.push(...dslValidation.warnings);\n      } catch (dslError) {\n        warnings.push(`DSL round-trip validation failed: ${dslError}`);\n      }\n\n      return {\n        success: errors.length === 0,\n        errors,\n        warnings,\n      };\n    } catch (error) {\n      errors.push(`Round-trip validation failed: ${error}`);\n      return {\n        success: false,\n        errors,\n        warnings,\n      };\n    }\n  }\n\n  /**\n   * Performs deep validation between original and reconstructed nodes\n   */\n  private deepValidateRoundTrip(\n    original: RuleNode,\n    reconstructed: RuleNode,\n  ): {\n    errors: string[];\n    warnings: string[];\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    // Type validation\n    if (original.type !== reconstructed.type) {\n      errors.push(\n        `Node type mismatch: ${original.type} vs ${reconstructed.type}`,\n      );\n    }\n\n    // Label validation\n    if (original.label !== reconstructed.label) {\n      warnings.push(\n        `Label changed: \"${original.label}\" vs \"${reconstructed.label}\"`,\n      );\n    }\n\n    // Config validation\n    if (original.config && reconstructed.config) {\n      const configComparison = this.compareConfigs(\n        original.config,\n        reconstructed.config,\n      );\n      errors.push(...configComparison.errors);\n      warnings.push(...configComparison.warnings);\n    } else if (original.config !== reconstructed.config) {\n      warnings.push('Configuration presence mismatch');\n    }\n\n    // Metadata validation\n    if (original.metadata && reconstructed.metadata) {\n      if (original.metadata.code !== reconstructed.metadata.code) {\n        warnings.push('Metadata code changed during round-trip');\n      }\n      if (original.metadata.message !== reconstructed.metadata.message) {\n        warnings.push('Metadata message changed during round-trip');\n      }\n      if (\n        original.metadata['severity'] !== reconstructed.metadata['severity']\n      ) {\n        warnings.push('Metadata severity changed during round-trip');\n      }\n    } else if (!!original.metadata !== !!reconstructed.metadata) {\n      warnings.push('Metadata presence changed during round-trip');\n    }\n\n    // Children validation\n    const originalChildCount = original.children?.length || 0;\n    const reconstructedChildCount = reconstructed.children?.length || 0;\n\n    if (originalChildCount !== reconstructedChildCount) {\n      errors.push(\n        `Child count mismatch: ${originalChildCount} vs ${reconstructedChildCount}`,\n      );\n    } else if (original.children && reconstructed.children) {\n      // Recursively validate children\n      for (let i = 0; i < original.children.length; i++) {\n        const originalChild = original.children[i];\n        const reconstructedChild = reconstructed.children[i];\n\n        if (\n          typeof originalChild === 'object' &&\n          typeof reconstructedChild === 'object'\n        ) {\n          const childValidation = this.deepValidateRoundTrip(\n            originalChild as RuleNode,\n            reconstructedChild as RuleNode,\n          );\n          errors.push(...childValidation.errors.map((e) => `Child ${i}: ${e}`));\n          warnings.push(\n            ...childValidation.warnings.map((w) => `Child ${i}: ${w}`),\n          );\n        }\n      }\n    }\n\n    return { errors, warnings };\n  }\n\n  /**\n   * Compares two configuration objects\n   */\n  private compareConfigs(\n    config1: any,\n    config2: any,\n  ): {\n    errors: string[];\n    warnings: string[];\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      const config1Json = JSON.stringify(config1, Object.keys(config1).sort());\n      const config2Json = JSON.stringify(config2, Object.keys(config2).sort());\n\n      if (config1Json !== config2Json) {\n        warnings.push('Configuration values changed during round-trip');\n      }\n    } catch (error) {\n      warnings.push(`Failed to compare configurations: ${error}`);\n    }\n\n    return { errors, warnings };\n  }\n\n  /**\n   * Validates DSL round-trip conversion\n   */\n  private validateDslRoundTrip(\n    dsl: string,\n    originalNode: RuleNode,\n  ): {\n    warnings: string[];\n  } {\n    const warnings: string[] = [];\n\n    // Basic DSL validation\n    if (!dsl || dsl.trim().length === 0) {\n      warnings.push('DSL export resulted in empty string');\n      return { warnings };\n    }\n\n    // Check for expected keywords based on node type\n    const expectedKeywords = this.getExpectedDslKeywords(originalNode);\n    for (const keyword of expectedKeywords) {\n      if (!dsl.includes(keyword)) {\n        warnings.push(`Expected DSL keyword '${keyword}' not found in output`);\n      }\n    }\n\n    return { warnings };\n  }\n\n  // ===== Phase 4: Expression and Contextual Specification Support =====\n\n  /**\n   * Parses a DSL expression string into a Specification\n   */\n  parseDslExpression<T extends object = any>(\n    expression: string,\n    config?: DslParsingConfig,\n  ): DslParsingResult<T> {\n    const startTime = performance.now();\n    const issues: ValidationIssue[] = [];\n\n    try {\n      // Configure parser and validator\n      if (config?.functionRegistry) {\n        this.dslParser = new DslParser<T>(config.functionRegistry);\n      }\n\n      if (\n        config?.knownFields ||\n        config?.enablePerformanceWarnings !== undefined ||\n        config?.maxComplexity\n      ) {\n        this.dslValidator = new DslValidator({\n          knownFields: config?.knownFields || [],\n          enablePerformanceWarnings: config?.enablePerformanceWarnings ?? true,\n          maxComplexity: config?.maxComplexity || 50,\n          functionRegistry: config?.functionRegistry,\n        });\n      }\n\n      // Validate the expression first\n      const validationIssues = this.dslValidator.validate(expression);\n      issues.push(...validationIssues);\n\n      // Check for errors that would prevent parsing\n      const hasErrors = validationIssues.some(\n        (issue: ValidationIssue) => issue.severity === 'error',\n      );\n      if (hasErrors) {\n        return {\n          success: false,\n          issues,\n          metrics: {\n            parseTime: performance.now() - startTime,\n            complexity: this.calculateComplexity(expression),\n          },\n        };\n      }\n\n      // Parse the expression\n      const specification = this.dslParser.parse(expression);\n      const parseTime = performance.now() - startTime;\n\n      return {\n        success: true,\n        specification,\n        issues,\n        metrics: {\n          parseTime,\n          complexity: this.calculateComplexity(expression),\n        },\n      };\n    } catch (error) {\n      issues.push({\n        type: 'SyntaxError' as any,\n        severity: 'error' as any,\n        message: `Parse error: ${error}`,\n        position: { start: 0, end: expression.length, line: 1, column: 1 },\n      });\n\n      return {\n        success: false,\n        issues,\n        metrics: {\n          parseTime: performance.now() - startTime,\n          complexity: this.calculateComplexity(expression),\n        },\n      };\n    }\n  }\n\n  /**\n   * Creates a ContextualSpecification with token resolution\n   */\n  createContextualSpecification<T extends object = any>(\n    template: string,\n    config?: SpecificationContextualConfig,\n  ): ContextualSpecification<T> {\n    const contextProvider =\n      config?.contextProvider ||\n      this.createContextProviderFromVariables(config?.contextVariables || []);\n\n    if (config?.strictContextValidation) {\n      this.validateContextTokens(template, config.contextVariables || []);\n    }\n\n    return SpecificationFactory.contextual<T>(template, contextProvider);\n  }\n\n  /**\n   * Resolves context tokens in a template using provided variables\n   */\n  resolveContextTokens(\n    template: string,\n    contextVariables: ContextVariable[],\n  ): string {\n    const contextProvider =\n      this.createContextProviderFromVariables(contextVariables);\n    const contextualSpec = new ContextualSpecification(\n      template,\n      contextProvider,\n    );\n\n    // Create a dummy object to resolve tokens against\n    const dummyObj = {};\n    return contextualSpec.resolveTokens(template, dummyObj);\n  }\n\n  /**\n   * Extracts all context tokens from a template\n   */\n  extractContextTokens(template: string): string[] {\n    const contextualSpec = new ContextualSpecification(template);\n    return contextualSpec.getTokens();\n  }\n\n  /**\n   * Validates that all context tokens in a template have corresponding variables\n   */\n  validateContextTokens(\n    template: string,\n    contextVariables: ContextVariable[],\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const tokens = this.extractContextTokens(template);\n    const variableNames = contextVariables.map((v) => v.name);\n\n    for (const token of tokens) {\n      if (!variableNames.includes(token)) {\n        issues.push({\n          type: 'InvalidFieldReference' as any,\n          severity: 'warning' as any,\n          message: `Unknown context variable: ${token}`,\n          position: this.findTokenPosition(template, token),\n          suggestion: this.suggestSimilarVariable(token, variableNames),\n          help: `Available variables: ${variableNames.join(', ')}`,\n        });\n      }\n    }\n\n    return issues;\n  }\n\n  /**\n   * Converts a DSL expression to a ContextualSpecification\n   */\n  dslToContextualSpecification<T extends object = any>(\n    dslExpression: string,\n    config?: SpecificationContextualConfig,\n  ): ContextualSpecification<T> {\n    // Validate that the DSL contains context tokens\n    const tokens = this.extractContextTokens(dslExpression);\n    if (tokens.length === 0) {\n      throw new Error(\n        'DSL expression does not contain context tokens (${...})',\n      );\n    }\n\n    return this.createContextualSpecification<T>(dslExpression, config);\n  }\n\n  /**\n   * Converts a ContextualSpecification back to DSL template\n   */\n  contextualSpecificationToDsl<T extends object = any>(\n    spec: ContextualSpecification<T>,\n  ): string {\n    return spec.toDSL();\n  }\n\n  /**\n   * Performs round-trip validation for expression specifications\n   */\n  validateExpressionRoundTrip<T extends object = any>(\n    originalExpression: string,\n    config?: DslParsingConfig,\n  ): {\n    success: boolean;\n    errors: string[];\n    warnings: string[];\n    reconstructedExpression?: string;\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      // Parse the original expression\n      const parseResult = this.parseDslExpression<T>(\n        originalExpression,\n        config,\n      );\n\n      if (!parseResult.success || !parseResult.specification) {\n        errors.push('Failed to parse original expression');\n        parseResult.issues.forEach((issue) => {\n          if (issue.severity === 'error') {\n            errors.push(issue.message);\n          } else {\n            warnings.push(issue.message);\n          }\n        });\n\n        return { success: false, errors, warnings };\n      }\n\n      // Export back to DSL\n      const reconstructedExpression = parseResult.specification.toDSL();\n\n      // Parse the reconstructed expression\n      const reconstructedParseResult = this.parseDslExpression<T>(\n        reconstructedExpression,\n        config,\n      );\n\n      if (!reconstructedParseResult.success) {\n        errors.push('Failed to parse reconstructed expression');\n        return { success: false, errors, warnings, reconstructedExpression };\n      }\n\n      // Compare the specifications\n      const originalJson = JSON.stringify(parseResult.specification.toJSON());\n      const reconstructedJson = JSON.stringify(\n        reconstructedParseResult.specification!.toJSON(),\n      );\n\n      if (originalJson !== reconstructedJson) {\n        warnings.push('Specification structure changed during round-trip');\n      }\n\n      return {\n        success: errors.length === 0,\n        errors,\n        warnings,\n        reconstructedExpression,\n      };\n    } catch (error) {\n      errors.push(`Round-trip validation failed: ${error}`);\n      return { success: false, errors, warnings };\n    }\n  }\n\n  /**\n   * Updates the context provider for contextual specifications\n   */\n  updateContextProvider(contextProvider: ContextProvider): void {\n    this.contextProvider = contextProvider;\n  }\n\n  /**\n   * Gets the current context provider\n   */\n  getContextProvider(): ContextProvider | undefined {\n    return this.contextProvider;\n  }\n\n  /**\n   * Gets expected DSL keywords for a given node type\n   */\n  private getExpectedDslKeywords(node: RuleNode): string[] {\n    const keywords: string[] = [];\n\n    switch (node.type) {\n      case 'fieldCondition':\n        const config = node.config as any;\n        const fieldName = config?.field || config?.fieldName;\n        if (fieldName) {\n          keywords.push(fieldName as string);\n        }\n        if (config?.operator) {\n          keywords.push(config.operator as string);\n        }\n        break;\n\n      case 'andGroup':\n      case 'orGroup':\n      case 'notGroup':\n        const boolConfig = node.config as any;\n        if (boolConfig?.operator) {\n          keywords.push((boolConfig.operator as string).toUpperCase());\n        }\n        break;\n\n      case 'functionCall':\n        const funcConfig = node.config as any;\n        if (funcConfig?.functionName) {\n          keywords.push(funcConfig.functionName as string);\n        }\n        break;\n    }\n\n    return keywords;\n  }\n\n  private createFieldSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    const config = node.config as any;\n    const fieldName = config?.field || config?.fieldName;\n\n    if (!fieldName || !config?.operator) {\n      throw new Error('Field specification requires field and operator');\n    }\n\n    // Handle unary operators commonly produced by the visual builder\n    // by coercing them to EQUALS with an implied value\n    let op = String(config.operator);\n    let impliedValue: any = undefined;\n    switch (op.toLowerCase()) {\n      case 'istrue':\n        impliedValue = true;\n        op = 'equals';\n        break;\n      case 'isfalse':\n        impliedValue = false;\n        op = 'equals';\n        break;\n      case 'isempty':\n        impliedValue = '';\n        op = 'equals';\n        break;\n      case 'isnotempty':\n        impliedValue = '';\n        op = 'notequals';\n        break;\n    }\n\n    // After normalization, require either an explicit value or impliedValue\n    if (config.value === undefined && impliedValue === undefined) {\n      throw new Error('Field specification requires a value for the operator');\n    }\n\n    const field = fieldName as keyof T;\n    const operator = this.convertToComparisonOperator(op);\n    const baseValue = impliedValue !== undefined ? impliedValue : config.value;\n    const value = this.convertValue(baseValue, config.valueType);\n\n    let spec: Specification<T>;\n    if (node.metadata) {\n      spec = SpecificationFactory.fieldWithMetadata<T>(\n        field,\n        operator,\n        value,\n        node.metadata,\n      );\n    } else {\n      spec = SpecificationFactory.field<T>(field, operator, value);\n    }\n\n    return spec;\n  }\n\n  private createBooleanGroupSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node.children || node.children.length === 0) {\n      throw new Error('Boolean group requires children');\n    }\n\n    // Resolve children nodes using the registry\n    const childNodes = this.nodeRegistry.resolveChildren(node);\n    const childSpecs = childNodes.map((child) =>\n      this.ruleNodeToSpecification<T>(child),\n    );\n    const booleanConfig = node.config as any;\n    const operator = booleanConfig?.operator || 'and';\n\n    switch (operator.toLowerCase()) {\n      case 'and':\n        return SpecificationFactory.and<T>(...childSpecs);\n\n      case 'or':\n        return SpecificationFactory.or<T>(...childSpecs);\n\n      case 'not':\n        if (childSpecs.length !== 1) {\n          throw new Error('NOT operator requires exactly one child');\n        }\n        return SpecificationFactory.not<T>(childSpecs[0]);\n\n      case 'xor':\n        return SpecificationFactory.xor<T>(...childSpecs);\n\n      case 'implies':\n        if (childSpecs.length !== 2) {\n          throw new Error('IMPLIES operator requires exactly two children');\n        }\n        return SpecificationFactory.implies<T>(childSpecs[0], childSpecs[1]);\n\n      default:\n        throw new Error(`Unsupported boolean operator: ${operator}`);\n    }\n  }\n\n  private createFunctionSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    const functionConfig = node.config as any;\n    if (!functionConfig?.functionName) {\n      throw new Error('Function specification requires functionName');\n    }\n\n    const functionName = functionConfig.functionName;\n    const parameters = functionConfig.parameters || [];\n\n    // Convert parameters to function arguments\n    const args = parameters.map((param: FunctionParameter) => {\n      return this.convertValue(param.value, param.valueType);\n    });\n\n    return SpecificationFactory.func<T>(functionName, args);\n  }\n\n  private createFieldToFieldSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    const fieldConfig = node.config as any;\n    if (\n      !fieldConfig?.fieldA ||\n      !fieldConfig?.fieldB ||\n      !fieldConfig?.operator\n    ) {\n      throw new Error(\n        'Field-to-field specification requires fieldA, fieldB, and operator',\n      );\n    }\n\n    const fieldA = fieldConfig.fieldA as keyof T;\n    const fieldB = fieldConfig.fieldB as keyof T;\n    const operator = this.convertToComparisonOperator(fieldConfig.operator);\n    const transformA = fieldConfig.transformA;\n    const transformB = fieldConfig.transformB;\n\n    return SpecificationFactory.fieldToField<T>(\n      fieldA,\n      operator,\n      fieldB,\n      transformA,\n      transformB,\n    );\n  }\n\n  private createCardinalitySpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node.children || node.children.length === 0 || !node.config) {\n      throw new Error('Cardinality specification requires children and config');\n    }\n\n    // Resolve children nodes using the registry\n    const childNodes = this.nodeRegistry.resolveChildren(node);\n    const childSpecs = childNodes.map((child) =>\n      this.ruleNodeToSpecification<T>(child),\n    );\n    const config = node.config as CardinalityConfig;\n\n    switch (config.cardinalityType) {\n      case 'atLeast':\n        return SpecificationFactory.atLeast<T>(config.count, childSpecs);\n\n      case 'exactly':\n        return SpecificationFactory.exactly<T>(config.count, childSpecs);\n\n      default:\n        throw new Error(\n          `Unsupported cardinality type: ${config.cardinalityType}`,\n        );\n    }\n  }\n\n  /**\n   * Creates conditional validator specifications (Phase 1 implementation)\n   */\n  private createConditionalValidatorSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node.config || !['requiredIf', 'visibleIf', 'disabledIf', 'readonlyIf'].includes(node.config.type)) {\n      throw new Error(\n        'Conditional validator specification requires conditional validator config',\n      );\n    }\n\n    const config = node.config as ConditionalValidatorConfig;\n\n    if (!config.targetField) {\n      throw new Error('Conditional validator requires targetField');\n    }\n\n    // Aceita tanto 'condition' única quanto 'conditions' (lista)\n    let conditionSpec: Specification<T> | null = null;\n\n    // Helper para transformar uma condição simples em Specification\n    const toSpecFromCondition = (c: any): Specification<T> => {\n      // Se já vier como RuleNode, converte via bridge\n      if (c && typeof c === 'object' && 'type' in c && 'id' in c) {\n        return this.ruleNodeToSpecification<T>(c as RuleNode);\n      }\n      // Se for um config simples de fieldCondition, embrulha em RuleNode temporário\n      if (c && typeof c === 'object' && c.type === 'fieldCondition') {\n        const tempNode: RuleNode = {\n          id: this.generateNodeId(),\n          type: 'fieldCondition' as any,\n          config: c,\n        } as any;\n        return this.createFieldSpecification<T>(tempNode);\n      }\n      // Caso não reconhecido\n      throw new Error('Unsupported condition format');\n    };\n\n    if ((config as any).condition) {\n      try {\n        conditionSpec = toSpecFromCondition((config as any).condition);\n      } catch {\n        conditionSpec = null;\n      }\n    } else if (config.conditions && config.conditions.length > 0) {\n      const specs = config.conditions.map((c: any) => toSpecFromCondition(c));\n      const op = (config.logicOperator || 'and').toLowerCase();\n      switch (op) {\n        case 'and':\n          conditionSpec = SpecificationFactory.and<T>(...specs);\n          break;\n        case 'or':\n          conditionSpec = SpecificationFactory.or<T>(...specs);\n          break;\n        case 'not':\n          conditionSpec = specs.length === 1 ? SpecificationFactory.not<T>(specs[0]) : SpecificationFactory.and<T>(...specs);\n          break;\n        case 'xor':\n          conditionSpec = SpecificationFactory.xor<T>(...specs);\n          break;\n        default:\n          conditionSpec = SpecificationFactory.and<T>(...specs);\n      }\n    }\n\n    // Aplicar inversão, se solicitado\n    const finalConditionSpec = config.inverse && conditionSpec\n      ? SpecificationFactory.not<T>(conditionSpec)\n      : conditionSpec;\n\n    const targetField = config.targetField as keyof T;\n    const metadata = config.metadata;\n\n    // Placeholder genérico até haver suporte nativo no @praxisui/specification\n    let spec: Specification<T>;\n    switch (config.validatorType) {\n      case 'requiredIf':\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.EQUALS,\n          true,\n        );\n        break;\n\n      case 'visibleIf':\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.EQUALS,\n          true,\n        );\n        break;\n\n      case 'disabledIf':\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.EQUALS,\n          true,\n        );\n        break;\n\n      case 'readonlyIf':\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.EQUALS,\n          true,\n        );\n        break;\n\n      default:\n        throw new Error(\n          `Unsupported conditional validator type: ${config.validatorType}`,\n        );\n    }\n\n    return spec;\n  }\n\n  /**\n   * Creates collection validator specifications (Phase 2 implementation)\n   */\n  private createCollectionValidatorSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node.config || !('type' in node.config)) {\n      throw new Error('Collection validator specification requires config');\n    }\n\n    const config = node.config as CollectionValidatorConfig;\n\n    if (!config.targetCollection) {\n      throw new Error('Collection validator requires targetCollection');\n    }\n\n    const targetField = config.targetCollection as keyof T;\n\n    // Create the appropriate collection validator specification\n    // Note: Using placeholder implementations until @praxisui/specification adds native support\n    let spec: Specification<T>;\n\n    switch (node.type) {\n      case 'forEach':\n        // ForEach implementation placeholder\n        // Would iterate through array items and apply validation rules\n        if (\n          !config.itemValidationRules ||\n          config.itemValidationRules.length === 0\n        ) {\n          throw new Error(\n            'ForEach validator requires at least one validation rule',\n          );\n        }\n\n        // Create a placeholder that checks array exists\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.NOT_EQUALS,\n          null,\n        );\n        break;\n\n      case 'uniqueBy':\n        // UniqueBy implementation placeholder\n        // Would check uniqueness based on specified fields\n        if (!config.uniqueByFields || config.uniqueByFields.length === 0) {\n          throw new Error('UniqueBy validator requires at least one field');\n        }\n\n        // Create a placeholder that checks array exists\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.NOT_EQUALS,\n          null,\n        );\n        break;\n\n      case 'minLength':\n        // MinLength implementation placeholder\n        // Would check array has minimum number of items\n        if (config.minItems === undefined) {\n          throw new Error('MinLength validator requires minItems value');\n        }\n\n        // Create a placeholder that checks array exists\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.NOT_EQUALS,\n          null,\n        );\n        break;\n\n      case 'maxLength':\n        // MaxLength implementation placeholder\n        // Would check array doesn't exceed maximum items\n        if (config.maxItems === undefined) {\n          throw new Error('MaxLength validator requires maxItems value');\n        }\n\n        // Create a placeholder that checks array exists\n        spec = SpecificationFactory.field<T>(\n          targetField,\n          ComparisonOperator.NOT_EQUALS,\n          null,\n        );\n        break;\n\n      default:\n        throw new Error(`Unsupported collection validator type: ${node.type}`);\n    }\n\n    return spec;\n  }\n\n  /**\n   * Creates expression specification from DSL (Phase 4 implementation)\n   */\n  private createExpressionSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node.config || !('expression' in node.config)) {\n      throw new Error('Expression specification requires expression in config');\n    }\n\n    const config = node.config as any;\n    const expression = config.expression as string;\n\n    if (!expression || expression.trim().length === 0) {\n      throw new Error('Expression specification requires non-empty expression');\n    }\n\n    // Parse the DSL expression using the bridge service\n    const parseConfig: DslParsingConfig = {\n      functionRegistry: config.functionRegistry,\n      contextProvider: config.contextProvider,\n      knownFields: config.knownFields || [],\n      enablePerformanceWarnings: config.enablePerformanceWarnings ?? true,\n      maxComplexity: config.maxComplexity || 50,\n    };\n\n    const parseResult = this.parseDslExpression<T>(expression, parseConfig);\n\n    if (!parseResult.success || !parseResult.specification) {\n      const errorMessages = parseResult.issues\n        .filter((issue) => issue.severity === 'error')\n        .map((issue) => issue.message)\n        .join('; ');\n\n      throw new Error(\n        `Failed to parse DSL expression: ${errorMessages || 'Unknown parsing error'}`,\n      );\n    }\n\n    return parseResult.specification;\n  }\n\n  /**\n   * Creates contextual specification (Phase 4 implementation)\n   */\n  private createContextualSpecificationFromNode<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node.config || !('template' in node.config)) {\n      throw new Error('Contextual specification requires template in config');\n    }\n\n    const config = node.config as any;\n    const template = config.template as string;\n\n    if (!template || template.trim().length === 0) {\n      throw new Error('Contextual specification requires non-empty template');\n    }\n\n    // Validate that the template contains context tokens\n    const tokens = this.extractContextTokens(template);\n    if (tokens.length === 0) {\n      throw new Error(\n        'Contextual specification template must contain at least one context token (${...})',\n      );\n    }\n\n    const contextualConfig: SpecificationContextualConfig = {\n      contextVariables: config.contextVariables || [],\n      contextProvider: config.contextProvider,\n      strictContextValidation: config.strictContextValidation ?? false,\n    };\n\n    return this.createContextualSpecification<T>(template, contextualConfig);\n  }\n\n  private convertToComparisonOperator(operator: string): ComparisonOperator {\n    switch (operator.toLowerCase()) {\n      case 'istrue':\n        return ComparisonOperator.EQUALS;\n      case 'isfalse':\n        return ComparisonOperator.EQUALS;\n      case 'equals':\n      case '==':\n      case '=':\n        return ComparisonOperator.EQUALS;\n\n      case 'notequals':\n      case '!=':\n      case '<>':\n        return ComparisonOperator.NOT_EQUALS;\n\n      case 'greaterthan':\n      case '>':\n        return ComparisonOperator.GREATER_THAN;\n\n      case 'greaterthanorequal':\n      case '>=':\n        return ComparisonOperator.GREATER_THAN_OR_EQUAL;\n\n      case 'lessthan':\n      case '<':\n        return ComparisonOperator.LESS_THAN;\n\n      case 'lessthanorequal':\n      case '<=':\n        return ComparisonOperator.LESS_THAN_OR_EQUAL;\n\n      case 'contains':\n        return ComparisonOperator.CONTAINS;\n\n      case 'startswith':\n        return ComparisonOperator.STARTS_WITH;\n\n      case 'endswith':\n        return ComparisonOperator.ENDS_WITH;\n\n      case 'in':\n        return ComparisonOperator.IN;\n\n      case 'notin':\n        return ComparisonOperator.NOT_EQUALS; // Using NOT_EQUALS as fallback for NOT_IN\n\n      case 'isnull':\n        return ComparisonOperator.EQUALS; // Using EQUALS for IS_NULL check\n\n      case 'isnotnull':\n        return ComparisonOperator.NOT_EQUALS; // Using NOT_EQUALS for IS_NOT_NULL check\n\n      case 'isempty':\n        return ComparisonOperator.EQUALS;\n      case 'isnotempty':\n        return ComparisonOperator.NOT_EQUALS;\n\n      default:\n        throw new Error(`Unsupported comparison operator: ${operator}`);\n    }\n  }\n\n  private convertValue(value: any, valueType?: ValueType): any {\n    if (!valueType) {\n      return value;\n    }\n\n    switch (valueType) {\n      case 'literal':\n        return value;\n\n      case 'field':\n        return `@${value}`; // Field reference prefix\n\n      case 'context':\n        return `$${value}`; // Context reference prefix\n\n      case 'function':\n        return value; // Function calls are handled separately\n\n      default:\n        return value;\n    }\n  }\n\n  private jsonToRuleNode(json: any): RuleNode {\n    const baseNode: RuleNode = {\n      id: this.generateNodeId(),\n      type: this.mapSpecificationTypeToNodeType(json.type),\n      label: this.generateNodeLabel(json),\n      config: undefined,\n      metadata: json.metadata,\n      children: [],\n    };\n\n    switch (json.type) {\n      case 'field':\n        baseNode.config = {\n          type: 'fieldCondition',\n          field: json.field,\n          fieldName: json.field,\n          operator: this.mapComparisonOperator(json.operator),\n          value: json.value,\n          valueType: this.inferValueType(json.value),\n        } as FieldConditionConfig;\n        break;\n\n      case 'and':\n      case 'or':\n      case 'xor':\n        baseNode.config = {\n          type: 'booleanGroup',\n          operator: json.type,\n        } as BooleanGroupConfig;\n        const childNodes = json.specs.map((spec: any) =>\n          this.jsonToRuleNode(spec),\n        );\n        baseNode.children = childNodes.map((child: RuleNode) => child.id);\n        break;\n\n      case 'not':\n        baseNode.config = {\n          type: 'booleanGroup',\n          operator: 'not',\n        } as BooleanGroupConfig;\n        const childNode = this.jsonToRuleNode(json.spec);\n        baseNode.children = [childNode.id];\n        break;\n\n      case 'implies':\n        baseNode.config = {\n          type: 'booleanGroup',\n          operator: 'implies',\n        } as BooleanGroupConfig;\n        const antecedent = this.jsonToRuleNode(json.antecedent);\n        const consequent = this.jsonToRuleNode(json.consequent);\n        baseNode.children = [antecedent.id, consequent.id];\n        break;\n\n      case 'function':\n        baseNode.config = {\n          type: 'functionCall',\n          functionName: json.name,\n          parameters: json.args.map((arg: any, index: number) => ({\n            name: `param${index}`,\n            value: arg,\n            valueType: this.inferValueType(arg),\n          })),\n        } as FunctionCallConfig;\n        break;\n\n      case 'fieldToField':\n        baseNode.config = {\n          type: 'fieldToField',\n          leftField: json.fieldA,\n          rightField: json.fieldB,\n          operator: this.mapComparisonOperator(json.operator),\n          leftTransforms: json.transformA ? [json.transformA] : [],\n          rightTransforms: json.transformB ? [json.transformB] : [],\n        } as FieldToFieldConfig;\n        break;\n\n      case 'atLeast':\n        baseNode.config = {\n          type: 'cardinality',\n          cardinalityType: 'atLeast',\n          count: json.minimum || json.count,\n          conditions: [],\n        };\n        baseNode.children = json.specs.map((spec: any) =>\n          this.jsonToRuleNode(spec),\n        );\n        break;\n\n      case 'exactly':\n        baseNode.config = {\n          type: 'cardinality',\n          cardinalityType: 'exactly',\n          count: json.exact || json.count,\n          conditions: [],\n        };\n        baseNode.children = json.specs.map((spec: any) =>\n          this.jsonToRuleNode(spec),\n        );\n        break;\n\n      // Phase 1: Conditional Validators\n      case 'requiredIf':\n      case 'visibleIf':\n      case 'disabledIf':\n      case 'readonlyIf':\n        baseNode.config = {\n          type: json.type as 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf',\n          validatorType: json.type,\n          targetField: json.targetField,\n          condition: this.jsonToRuleNode(json.condition),\n          inverse: json.inverse || false,\n        };\n        break;\n\n      // Phase 2: Collection Validators\n      case 'forEach':\n        baseNode.config = {\n          type: 'forEach',\n          targetCollection: json.targetCollection,\n          itemVariable: json.itemVariable || 'item',\n          indexVariable: json.indexVariable || 'index',\n          itemValidationRules: json.itemValidationRules || [],\n        };\n        break;\n\n      case 'uniqueBy':\n        baseNode.config = {\n          type: 'uniqueBy',\n          targetCollection: json.targetCollection,\n          uniqueByFields: json.uniqueByFields || [],\n          caseSensitive: json.caseSensitive !== false,\n          ignoreEmpty: json.ignoreEmpty !== false,\n          duplicateErrorMessage: json.duplicateErrorMessage,\n        };\n        break;\n\n      case 'minLength':\n        baseNode.config = {\n          type: 'minLength',\n          targetCollection: json.targetCollection,\n          minItems: json.minItems,\n          lengthErrorMessage: json.lengthErrorMessage,\n          showItemCount: json.showItemCount !== false,\n        };\n        break;\n\n      case 'maxLength':\n        baseNode.config = {\n          type: 'maxLength',\n          targetCollection: json.targetCollection,\n          maxItems: json.maxItems,\n          lengthErrorMessage: json.lengthErrorMessage,\n          preventExcess: json.preventExcess !== false,\n        };\n        break;\n\n      // Phase 4: Expression and Contextual Specifications\n      case 'expression':\n        baseNode.config = {\n          type: 'expression',\n          expression: json.expression || json.dsl || '',\n          functionRegistry: json.functionRegistry,\n          contextProvider: json.contextProvider,\n          knownFields: json.knownFields || [],\n          enablePerformanceWarnings: json.enablePerformanceWarnings ?? true,\n          maxComplexity: json.maxComplexity || 50,\n        };\n        break;\n\n      case 'contextual':\n        baseNode.config = {\n          type: 'contextual',\n          template: json.template,\n          contextVariables: json.contextVariables || [],\n          contextProvider: json.contextProvider,\n          strictContextValidation: json.strictContextValidation ?? false,\n        };\n        break;\n    }\n\n    return baseNode;\n  }\n\n  private mapSpecificationTypeToNodeType(specType: string): RuleNodeType {\n    switch (specType) {\n      case 'field':\n        return RuleNodeType.FIELD_CONDITION;\n      case 'and':\n        return RuleNodeType.AND_GROUP;\n      case 'or':\n        return RuleNodeType.OR_GROUP;\n      case 'not':\n        return RuleNodeType.NOT_GROUP;\n      case 'xor':\n        return RuleNodeType.XOR_GROUP;\n      case 'implies':\n        return RuleNodeType.IMPLIES_GROUP;\n      case 'function':\n        return RuleNodeType.FUNCTION_CALL;\n      case 'fieldToField':\n        return RuleNodeType.FIELD_TO_FIELD;\n      case 'atLeast':\n        return RuleNodeType.AT_LEAST;\n      case 'exactly':\n        return RuleNodeType.EXACTLY;\n      // Phase 1: Conditional Validators\n      case 'requiredIf':\n        return RuleNodeType.REQUIRED_IF;\n      case 'visibleIf':\n        return RuleNodeType.VISIBLE_IF;\n      case 'disabledIf':\n        return RuleNodeType.DISABLED_IF;\n      case 'readonlyIf':\n        return RuleNodeType.READONLY_IF;\n      // Phase 2: Collection Validators\n      case 'forEach':\n        return RuleNodeType.FOR_EACH;\n      case 'uniqueBy':\n        return RuleNodeType.UNIQUE_BY;\n      case 'minLength':\n        return RuleNodeType.MIN_LENGTH;\n      case 'maxLength':\n        return RuleNodeType.MAX_LENGTH;\n      // Phase 4: Expression and Contextual Specifications\n      case 'expression':\n        return RuleNodeType.EXPRESSION;\n      case 'contextual':\n        return RuleNodeType.CONTEXTUAL;\n      default:\n        return RuleNodeType.FIELD_CONDITION; // fallback\n    }\n  }\n\n  private mapComparisonOperator(operator: ComparisonOperator): string {\n    switch (operator) {\n      case ComparisonOperator.EQUALS:\n        return 'equals';\n      case ComparisonOperator.NOT_EQUALS:\n        return 'notEquals';\n      case ComparisonOperator.GREATER_THAN:\n        return 'greaterThan';\n      case ComparisonOperator.GREATER_THAN_OR_EQUAL:\n        return 'greaterThanOrEqual';\n      case ComparisonOperator.LESS_THAN:\n        return 'lessThan';\n      case ComparisonOperator.LESS_THAN_OR_EQUAL:\n        return 'lessThanOrEqual';\n      case ComparisonOperator.CONTAINS:\n        return 'contains';\n      case ComparisonOperator.STARTS_WITH:\n        return 'startsWith';\n      case ComparisonOperator.ENDS_WITH:\n        return 'endsWith';\n      case ComparisonOperator.IN:\n        return 'in';\n      // Note: NOT_IN, IS_NULL, IS_NOT_NULL are not available in @praxisui/specification ComparisonOperator enum\n      // These would need to be handled as custom functions or additional operators\n      default:\n        return 'equals';\n    }\n  }\n\n  private inferValueType(value: any): ValueType {\n    if (typeof value === 'string') {\n      if (value.startsWith('@')) {\n        return 'field';\n      }\n      if (value.startsWith('$')) {\n        return 'context';\n      }\n    }\n    return 'literal';\n  }\n\n  private generateNodeId(): string {\n    return `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  private generateNodeLabel(json: any): string {\n    switch (json.type) {\n      case 'field':\n        return `${json.field} ${this.mapComparisonOperator(json.operator)} ${json.value}`;\n      case 'and':\n        return 'AND Group';\n      case 'or':\n        return 'OR Group';\n      case 'not':\n        return 'NOT';\n      case 'xor':\n        return 'XOR Group';\n      case 'implies':\n        return 'IMPLIES';\n      case 'function':\n        return `${json.name}()`;\n      case 'fieldToField':\n        return `${json.fieldA} ${this.mapComparisonOperator(json.operator)} ${json.fieldB}`;\n      case 'atLeast':\n        return `At Least ${json.minimum}`;\n      case 'exactly':\n        return `Exactly ${json.exact}`;\n      // Phase 1: Conditional Validators\n      case 'requiredIf':\n        return `Required If: ${json.targetField}`;\n      case 'visibleIf':\n        return `Visible If: ${json.targetField}`;\n      case 'disabledIf':\n        return `Disabled If: ${json.targetField}`;\n      case 'readonlyIf':\n        return `Readonly If: ${json.targetField}`;\n      // Phase 2: Collection Validators\n      case 'forEach':\n        return `For Each: ${json.targetCollection}`;\n      case 'uniqueBy':\n        const uniqueFields = json.uniqueByFields\n          ? json.uniqueByFields.join(', ')\n          : '';\n        return `Unique By: ${uniqueFields}`;\n      case 'minLength':\n        return `Min Length: ${json.minItems} items`;\n      case 'maxLength':\n        return `Max Length: ${json.maxItems} items`;\n      // Phase 4: Expression and Contextual\n      case 'expression':\n        return `Expression: ${json.expression || 'DSL'}`;\n      case 'contextual':\n        return `Contextual: ${json.template || 'Template'}`;\n      default:\n        return 'Rule';\n    }\n  }\n\n  // ===== Phase 4: Helper Methods =====\n\n  /**\n   * Creates a context provider from context variables\n   */\n  private createContextProviderFromVariables(\n    variables: ContextVariable[],\n  ): ContextProvider {\n    const variableMap = new Map<string, any>();\n\n    for (const variable of variables) {\n      let value: any = variable.example;\n\n      // Convert example to appropriate type\n      if (value !== undefined && value !== null) {\n        switch (variable.type) {\n          case 'number':\n            value = typeof value === 'string' ? parseFloat(value) : value;\n            break;\n          case 'boolean':\n            value =\n              typeof value === 'string'\n                ? value.toLowerCase() === 'true'\n                : Boolean(value);\n            break;\n          case 'date':\n            value = typeof value === 'string' ? new Date(value) : value;\n            break;\n          case 'object':\n          case 'array':\n            value = typeof value === 'string' ? JSON.parse(value) : value;\n            break;\n          case 'string':\n          default:\n            value = String(value);\n            break;\n        }\n      }\n\n      variableMap.set(variable.name, value);\n    }\n\n    // Create a context provider implementation aligned with @praxisui/specification ContextProvider interface\n    return {\n      hasValue: (path: string) => variableMap.has(path),\n      getValue: (path: string) => variableMap.get(path),\n    };\n  }\n\n  /**\n   * Calculates complexity of a DSL expression\n   */\n  private calculateComplexity(expression: string): number {\n    // Simple complexity calculation based on operators and function calls\n    const operators = ['&&', '||', '!', '==', '!=', '>', '<', '>=', '<=', 'in'];\n    const functions = [\n      'contains',\n      'startsWith',\n      'endsWith',\n      'atLeast',\n      'exactly',\n    ];\n\n    let complexity = 1; // Base complexity\n\n    // Count operators\n    for (const operator of operators) {\n      const matches = expression.split(operator).length - 1;\n      complexity += matches;\n    }\n\n    // Count function calls\n    for (const func of functions) {\n      const regex = new RegExp(`\\\\b${func}\\\\s*\\\\(`, 'g');\n      const matches = expression.match(regex);\n      if (matches) {\n        complexity += matches.length * 2; // Functions are more complex\n      }\n    }\n\n    // Count parentheses nesting\n    let depth = 0;\n    let maxDepth = 0;\n    for (const char of expression) {\n      if (char === '(') {\n        depth++;\n        maxDepth = Math.max(maxDepth, depth);\n      } else if (char === ')') {\n        depth--;\n      }\n    }\n    complexity += maxDepth;\n\n    return complexity;\n  }\n\n  /**\n   * Finds the position of a token in a template\n   */\n  private findTokenPosition(\n    template: string,\n    token: string,\n  ): { start: number; end: number; line: number; column: number } {\n    const tokenPattern = `\\${${token}}`;\n    const index = template.indexOf(tokenPattern);\n\n    if (index === -1) {\n      return { start: 0, end: 0, line: 1, column: 1 };\n    }\n\n    // Calculate line and column\n    let line = 1;\n    let column = 1;\n\n    for (let i = 0; i < index; i++) {\n      if (template[i] === '\\n') {\n        line++;\n        column = 1;\n      } else {\n        column++;\n      }\n    }\n\n    return {\n      start: index,\n      end: index + tokenPattern.length,\n      line,\n      column,\n    };\n  }\n\n  /**\n   * Suggests similar variable names using Levenshtein distance\n   */\n  private suggestSimilarVariable(\n    target: string,\n    availableVariables: string[],\n  ): string | undefined {\n    if (availableVariables.length === 0) return undefined;\n\n    const similarities = availableVariables.map((variable) => ({\n      variable,\n      distance: this.levenshteinDistance(\n        target.toLowerCase(),\n        variable.toLowerCase(),\n      ),\n    }));\n\n    similarities.sort((a, b) => a.distance - b.distance);\n\n    // Only suggest if the distance is reasonable\n    if (similarities[0].distance <= Math.max(2, target.length * 0.4)) {\n      return `Did you mean \"${similarities[0].variable}\"?`;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Calculates Levenshtein distance between two strings\n   */\n  private levenshteinDistance(a: string, b: string): number {\n    const matrix: number[][] = [];\n\n    for (let i = 0; i <= b.length; i++) {\n      matrix[i] = [i];\n    }\n\n    for (let j = 0; j <= a.length; j++) {\n      matrix[0][j] = j;\n    }\n\n    for (let i = 1; i <= b.length; i++) {\n      for (let j = 1; j <= a.length; j++) {\n        if (b.charAt(i - 1) === a.charAt(j - 1)) {\n          matrix[i][j] = matrix[i - 1][j - 1];\n        } else {\n          matrix[i][j] = Math.min(\n            matrix[i - 1][j - 1] + 1,\n            matrix[i][j - 1] + 1,\n            matrix[i - 1][j] + 1,\n          );\n        }\n      }\n    }\n\n    return matrix[b.length][a.length];\n  }\n\n  // ==============================================\n  // Phase 1: Value Expressions (safe-ish shim)\n  // ==============================================\n  /**\n   * Parses a value expression. Phase 1 shim: accepts strings starting with '=' or { expr } objects.\n   * Returns success when the shape is acceptable; full DSL parsing will be integrated in Phase 2.\n   */\n  parseDslExpressionValue(\n    expression: string | { expr: string } | null | undefined,\n    _config?: DslParsingConfig,\n  ): { success: boolean; issues: string[] } {\n    const issues: string[] = [];\n    if (expression == null) return { success: false, issues: ['Empty expression'] };\n    const raw = typeof expression === 'object' ? expression.expr : String(expression);\n    if (typeof raw !== 'string' || !raw.trim()) return { success: false, issues: ['Empty expression'] };\n    // Accept shorthand starting with '=' or plain literal values ('icon'|'image'|'badge'|'text'/'none')\n    const short = raw.trim();\n    if (short.startsWith('=')) return { success: true, issues };\n    const allowed = new Set(['icon', 'image', 'badge', 'text', 'none']);\n    if (allowed.has(short)) return { success: true, issues };\n    return { success: false, issues: ['Unsupported value expression format'] };\n  }\n\n  /**\n   * Evaluates a value expression with a row context. Phase 1 shim: executes simple '=' expressions in a sandboxed Function.\n   * In Phase 2, this will use the real DSL evaluator from @praxisui/specification.\n   */\n  evaluateValue(\n    expression: string | { expr: string },\n    ctx: { row: any },\n  ): any {\n    const raw = typeof expression === 'object' ? expression.expr : String(expression);\n    if (!raw || !raw.trim()) return null;\n    const short = raw.trim();\n    if (!short.startsWith('=')) {\n      // literal fallback\n      return short;\n    }\n    try {\n      const body = short.slice(1); // strip '='\n      // eslint-disable-next-line no-new-func\n      const fn = new Function('row', `\"use strict\"; return (${body});`);\n      return fn(ctx?.row);\n    } catch {\n      return null;\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport { DslParser, SpecificationFactory } from '@praxisui/specification';\nimport { RuleNode, ValidationError } from '../models/rule-builder.model';\n\nexport interface RoundTripValidationResult {\n  success: boolean;\n  errors: ValidationError[];\n  warnings: ValidationError[];\n  stages: {\n    visualToSpecification: { success: boolean; error?: string };\n    specificationToDsl: { success: boolean; error?: string; dsl?: string };\n    dslToSpecification: { success: boolean; error?: string };\n    specificationToVisual: { success: boolean; error?: string };\n  };\n  dataIntegrity: {\n    nodeCountMatch: boolean;\n    structureMatch: boolean;\n    metadataPreserved: boolean;\n    logicPreserved: boolean;\n  };\n  performance: {\n    totalTime: number;\n    stageTimings: Record<string, number>;\n  };\n}\n\nexport interface RoundTripTestCase {\n  id: string;\n  name: string;\n  description: string;\n  visualRule: RuleNode;\n  expectedDsl?: string;\n  expectedValidation?: {\n    shouldSucceed: boolean;\n    expectedErrors?: string[];\n    expectedWarnings?: string[];\n  };\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RoundTripValidatorService {\n  private dslParser = new DslParser();\n\n  constructor(\n    private specificationBridge: SpecificationBridgeService\n  ) {}\n\n  /**\n   * Validates complete round-trip conversion: Visual → DSL → Visual\n   */\n  validateRoundTrip(visualRule: RuleNode): RoundTripValidationResult {\n    const startTime = performance.now();\n    const result: RoundTripValidationResult = {\n      success: false,\n      errors: [],\n      warnings: [],\n      stages: {\n        visualToSpecification: { success: false },\n        specificationToDsl: { success: false },\n        dslToSpecification: { success: false },\n        specificationToVisual: { success: false }\n      },\n      dataIntegrity: {\n        nodeCountMatch: false,\n        structureMatch: false,\n        metadataPreserved: false,\n        logicPreserved: false\n      },\n      performance: {\n        totalTime: 0,\n        stageTimings: {}\n      }\n    };\n\n    try {\n      // Stage 1: Visual → Specification\n      const stage1Start = performance.now();\n      let specification;\n      try {\n        specification = this.specificationBridge.ruleNodeToSpecification(visualRule);\n        result.stages.visualToSpecification.success = true;\n      } catch (error) {\n        result.stages.visualToSpecification.error = `Failed to convert visual to specification: ${error}`;\n        result.errors.push({\n          id: this.generateErrorId(),\n          message: result.stages.visualToSpecification.error,\n          severity: 'error',\n          code: 'VISUAL_TO_SPEC_ERROR'\n        });\n      }\n      result.performance.stageTimings['visualToSpecification'] = performance.now() - stage1Start;\n\n      if (!specification) {\n        result.performance.totalTime = performance.now() - startTime;\n        return result;\n      }\n\n      // Stage 2: Specification → DSL\n      const stage2Start = performance.now();\n      let dsl: string;\n      try {\n        dsl = this.specificationBridge.exportToDsl(visualRule);\n        result.stages.specificationToDsl.success = true;\n        result.stages.specificationToDsl.dsl = dsl;\n      } catch (error) {\n        result.stages.specificationToDsl.error = `Failed to convert specification to DSL: ${error}`;\n        result.errors.push({\n          id: this.generateErrorId(),\n          message: result.stages.specificationToDsl.error,\n          severity: 'error',\n          code: 'SPEC_TO_DSL_ERROR'\n        });\n        result.performance.totalTime = performance.now() - startTime;\n        return result;\n      }\n      result.performance.stageTimings['specificationToDsl'] = performance.now() - stage2Start;\n\n      // Stage 3: DSL → Specification\n      const stage3Start = performance.now();\n      let parsedSpecification;\n      try {\n        parsedSpecification = this.dslParser.parse(dsl);\n        result.stages.dslToSpecification.success = true;\n      } catch (error) {\n        result.stages.dslToSpecification.error = `Failed to parse DSL back to specification: ${error}`;\n        result.errors.push({\n          id: this.generateErrorId(),\n          message: result.stages.dslToSpecification.error,\n          severity: 'error',\n          code: 'DSL_TO_SPEC_ERROR'\n        });\n        result.performance.totalTime = performance.now() - startTime;\n        return result;\n      }\n      result.performance.stageTimings['dslToSpecification'] = performance.now() - stage3Start;\n\n      // Stage 4: Specification → Visual\n      const stage4Start = performance.now();\n      let reconstructedVisual: RuleNode;\n      try {\n        reconstructedVisual = this.specificationBridge.specificationToRuleNode(parsedSpecification);\n        result.stages.specificationToVisual.success = true;\n      } catch (error) {\n        result.stages.specificationToVisual.error = `Failed to convert specification back to visual: ${error}`;\n        result.errors.push({\n          id: this.generateErrorId(),\n          message: result.stages.specificationToVisual.error,\n          severity: 'error',\n          code: 'SPEC_TO_VISUAL_ERROR'\n        });\n        result.performance.totalTime = performance.now() - startTime;\n        return result;\n      }\n      result.performance.stageTimings['specificationToVisual'] = performance.now() - stage4Start;\n\n      // Data Integrity Validation\n      const integrityStart = performance.now();\n      result.dataIntegrity = this.validateDataIntegrity(visualRule, reconstructedVisual, result);\n      result.performance.stageTimings['dataIntegrityValidation'] = performance.now() - integrityStart;\n\n      // Overall success determination\n      result.success = Object.values(result.stages).every(stage => stage.success) && \n                      result.errors.length === 0;\n\n      result.performance.totalTime = performance.now() - startTime;\n      return result;\n\n    } catch (error) {\n      result.errors.push({\n        id: this.generateErrorId(),\n        message: `Unexpected error during round-trip validation: ${error}`,\n        severity: 'error',\n        code: 'ROUND_TRIP_UNEXPECTED_ERROR'\n      });\n      result.performance.totalTime = performance.now() - startTime;\n      return result;\n    }\n  }\n\n  /**\n   * Validates data integrity between original and reconstructed visual rules\n   */\n  private validateDataIntegrity(\n    original: RuleNode, \n    reconstructed: RuleNode, \n    result: RoundTripValidationResult\n  ): RoundTripValidationResult['dataIntegrity'] {\n    const integrity = {\n      nodeCountMatch: false,\n      structureMatch: false,\n      metadataPreserved: false,\n      logicPreserved: false\n    };\n\n    // Count nodes\n    const originalNodeCount = this.countNodes(original);\n    const reconstructedNodeCount = this.countNodes(reconstructed);\n    integrity.nodeCountMatch = originalNodeCount === reconstructedNodeCount;\n\n    if (!integrity.nodeCountMatch) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: `Node count mismatch: original=${originalNodeCount}, reconstructed=${reconstructedNodeCount}`,\n        severity: 'warning',\n        code: 'NODE_COUNT_MISMATCH'\n      });\n    }\n\n    // Validate structure\n    integrity.structureMatch = this.validateStructureMatch(original, reconstructed, result);\n\n    // Validate metadata preservation\n    integrity.metadataPreserved = this.validateMetadataPreservation(original, reconstructed, result);\n\n    // Validate logic preservation\n    integrity.logicPreserved = this.validateLogicPreservation(original, reconstructed, result);\n\n    return integrity;\n  }\n\n  /**\n   * Validates that the logical structure is preserved\n   */\n  private validateStructureMatch(\n    original: RuleNode, \n    reconstructed: RuleNode, \n    result: RoundTripValidationResult\n  ): boolean {\n    // Basic type and structure validation\n    if (original.type !== reconstructed.type) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: `Node type mismatch: original=${original.type}, reconstructed=${reconstructed.type}`,\n        severity: 'warning',\n        code: 'NODE_TYPE_MISMATCH'\n      });\n      return false;\n    }\n\n    // Validate children structure\n    const originalChildCount = original.children?.length || 0;\n    const reconstructedChildCount = reconstructed.children?.length || 0;\n\n    if (originalChildCount !== reconstructedChildCount) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: `Child count mismatch: original=${originalChildCount}, reconstructed=${reconstructedChildCount}`,\n        severity: 'warning',\n        code: 'CHILD_COUNT_MISMATCH'\n      });\n      return false;\n    }\n\n    // Recursively validate children\n    if (original.children && reconstructed.children) {\n      for (let i = 0; i < original.children.length; i++) {\n        const originalChild = Array.isArray(original.children[i]) ? original.children[i] : original.children[i];\n        const reconstructedChild = Array.isArray(reconstructed.children[i]) ? reconstructed.children[i] : reconstructed.children[i];\n        \n        if (typeof originalChild === 'object' && typeof reconstructedChild === 'object') {\n          if (!this.validateStructureMatch(originalChild as RuleNode, reconstructedChild as RuleNode, result)) {\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Validates that metadata is preserved through the round-trip\n   */\n  private validateMetadataPreservation(\n    original: RuleNode, \n    reconstructed: RuleNode, \n    result: RoundTripValidationResult\n  ): boolean {\n    const originalMeta = original.metadata;\n    const reconstructedMeta = reconstructed.metadata;\n\n    // Both null/undefined\n    if (!originalMeta && !reconstructedMeta) {\n      return true;\n    }\n\n    // One null, one not\n    if (!originalMeta || !reconstructedMeta) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: `Metadata presence mismatch: original=${!!originalMeta}, reconstructed=${!!reconstructedMeta}`,\n        severity: 'warning',\n        code: 'METADATA_PRESENCE_MISMATCH'\n      });\n      return false;\n    }\n\n    // Compare metadata fields\n    const metadataMatches = originalMeta.code === reconstructedMeta.code &&\n                           originalMeta.message === reconstructedMeta.message &&\n                           originalMeta['severity'] === reconstructedMeta['severity'];\n\n    if (!metadataMatches) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: 'Metadata values changed during round-trip',\n        severity: 'warning',\n        code: 'METADATA_VALUES_CHANGED'\n      });\n      return false;\n    }\n\n    // Recursively check children metadata\n    if (original.children && reconstructed.children) {\n      for (let i = 0; i < original.children.length; i++) {\n        const originalChild = original.children[i];\n        const reconstructedChild = reconstructed.children[i];\n        \n        if (typeof originalChild === 'object' && typeof reconstructedChild === 'object') {\n          if (!this.validateMetadataPreservation(originalChild as RuleNode, reconstructedChild as RuleNode, result)) {\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Validates that the logical meaning is preserved\n   */\n  private validateLogicPreservation(\n    original: RuleNode, \n    reconstructed: RuleNode, \n    result: RoundTripValidationResult\n  ): boolean {\n    // Compare configuration objects for logical equivalence\n    const originalConfig = original.config;\n    const reconstructedConfig = reconstructed.config;\n\n    if (!originalConfig && !reconstructedConfig) {\n      return true;\n    }\n\n    if (!originalConfig || !reconstructedConfig) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: `Configuration presence mismatch: original=${!!originalConfig}, reconstructed=${!!reconstructedConfig}`,\n        severity: 'warning',\n        code: 'CONFIG_PRESENCE_MISMATCH'\n      });\n      return false;\n    }\n\n    // Deep comparison of configuration\n    try {\n      const originalConfigJson = JSON.stringify(originalConfig, null, 2);\n      const reconstructedConfigJson = JSON.stringify(reconstructedConfig, null, 2);\n\n      if (originalConfigJson !== reconstructedConfigJson) {\n        result.warnings.push({\n          id: this.generateErrorId(),\n          message: 'Configuration values changed during round-trip',\n          severity: 'warning',\n          code: 'CONFIG_VALUES_CHANGED'\n        });\n        return false;\n      }\n    } catch (error) {\n      result.warnings.push({\n        id: this.generateErrorId(),\n        message: `Failed to compare configurations: ${error}`,\n        severity: 'warning',\n        code: 'CONFIG_COMPARISON_ERROR'\n      });\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Counts total number of nodes in a rule tree\n   */\n  private countNodes(node: RuleNode): number {\n    let count = 1;\n    if (node.children) {\n      for (const child of node.children) {\n        if (typeof child === 'object') {\n          count += this.countNodes(child as RuleNode);\n        }\n      }\n    }\n    return count;\n  }\n\n  /**\n   * Runs a comprehensive test suite for round-trip validation\n   */\n  runTestSuite(testCases: RoundTripTestCase[]): {\n    totalTests: number;\n    passed: number;\n    failed: number;\n    results: Array<{ testCase: RoundTripTestCase; result: RoundTripValidationResult }>;\n  } {\n    const results: Array<{ testCase: RoundTripTestCase; result: RoundTripValidationResult }> = [];\n    let passed = 0;\n    let failed = 0;\n\n    for (const testCase of testCases) {\n      const result = this.validateRoundTrip(testCase.visualRule);\n      \n      // Apply expected validation if provided\n      if (testCase.expectedValidation) {\n        const meetsExpectations = this.validateExpectations(result, testCase.expectedValidation);\n        if (meetsExpectations) {\n          passed++;\n        } else {\n          failed++;\n          result.errors.push({\n            id: this.generateErrorId(),\n            message: 'Test case did not meet expected validation criteria',\n            severity: 'error',\n            code: 'TEST_EXPECTATIONS_NOT_MET'\n          });\n        }\n      } else {\n        if (result.success) {\n          passed++;\n        } else {\n          failed++;\n        }\n      }\n\n      results.push({ testCase, result });\n    }\n\n    return {\n      totalTests: testCases.length,\n      passed,\n      failed,\n      results\n    };\n  }\n\n  /**\n   * Validates test expectations against results\n   */\n  private validateExpectations(\n    result: RoundTripValidationResult, \n    expectations: RoundTripTestCase['expectedValidation']\n  ): boolean {\n    if (!expectations) return result.success;\n\n    // Check if success matches expectation\n    if (result.success !== expectations.shouldSucceed) {\n      return false;\n    }\n\n    // Check expected errors\n    if (expectations.expectedErrors) {\n      const errorMessages = result.errors.map(e => e.message);\n      for (const expectedError of expectations.expectedErrors) {\n        if (!errorMessages.some(msg => msg.includes(expectedError))) {\n          return false;\n        }\n      }\n    }\n\n    // Check expected warnings\n    if (expectations.expectedWarnings) {\n      const warningMessages = result.warnings.map(w => w.message);\n      for (const expectedWarning of expectations.expectedWarnings) {\n        if (!warningMessages.some(msg => msg.includes(expectedWarning))) {\n          return false;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Creates default test cases for common rule patterns\n   */\n  createDefaultTestCases(): RoundTripTestCase[] {\n    return [\n      {\n        id: 'simple-field-condition',\n        name: 'Simple Field Condition',\n        description: 'Tests a basic field equals condition',\n        visualRule: {\n          id: 'test-1',\n          type: 'fieldCondition',\n          label: 'Name equals \"Test\"',\n          config: {\n            type: 'fieldCondition',\n            fieldName: 'name',\n            operator: 'equals',\n            value: 'Test',\n            valueType: 'literal'\n          } as any\n        },\n        expectedValidation: {\n          shouldSucceed: true\n        }\n      },\n      {\n        id: 'and-group',\n        name: 'AND Group',\n        description: 'Tests an AND group with multiple conditions',\n        visualRule: {\n          id: 'test-2',\n          type: 'andGroup',\n          label: 'AND Group',\n          config: {\n            type: 'booleanGroup',\n            operator: 'and'\n          } as any,\n          children: [\n            {\n              id: 'test-2-1',\n              type: 'fieldCondition',\n              label: 'Age > 18',\n              config: {\n                type: 'fieldCondition',\n                fieldName: 'age',\n                operator: 'greaterThan',\n                value: 18,\n                valueType: 'literal'\n              } as any\n            },\n            {\n              id: 'test-2-2',\n              type: 'fieldCondition',\n              label: 'Active = true',\n              config: {\n                type: 'fieldCondition',\n                fieldName: 'active',\n                operator: 'equals',\n                value: true,\n                valueType: 'literal'\n              } as any\n            }\n          ] as any\n        },\n        expectedValidation: {\n          shouldSucceed: true\n        }\n      },\n      {\n        id: 'function-condition',\n        name: 'Function Condition',\n        description: 'Tests a function call condition',\n        visualRule: {\n          id: 'test-3',\n          type: 'functionCall',\n          label: 'contains(name, \"test\")',\n          config: {\n            type: 'functionCall',\n            functionName: 'contains',\n            parameters: [\n              { name: 'field', value: 'name', valueType: 'field' },\n              { name: 'value', value: 'test', valueType: 'literal' }\n            ]\n          } as any\n        },\n        expectedValidation: {\n          shouldSucceed: true\n        }\n      }\n    ];\n  }\n\n  private generateErrorId(): string {\n    return `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n  RuleBuilderState,\n  RuleNode,\n  RuleNodeType,\n  ValidationError,\n  RuleBuilderSnapshot,\n  ExportOptions,\n  ImportOptions,\n  RuleBuilderConfig,\n} from '../models/rule-builder.model';\n\nimport {\n  SpecificationFactory,\n  DslExporter,\n  DslValidator,\n  DslParser,\n  ValidationIssue,\n} from '@praxisui/specification';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport { RoundTripValidatorService } from './round-trip-validator.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class RuleBuilderService {\n  private readonly _state = new BehaviorSubject<RuleBuilderState>(\n    this.getInitialState(),\n  );\n  private readonly _validationErrors = new BehaviorSubject<ValidationError[]>(\n    [],\n  );\n  private readonly _nodeSelected = new Subject<string>();\n  private readonly _stateChanged = new Subject<void>();\n\n  private config: RuleBuilderConfig | null = null;\n  private dslExporter = new DslExporter();\n  private dslValidator = new DslValidator();\n  private dslParser = new DslParser();\n\n  public readonly state$ = this._state.asObservable();\n  public readonly validationErrors$ = this._validationErrors.asObservable();\n  public readonly nodeSelected$ = this._nodeSelected.asObservable();\n  public readonly stateChanged$ = this._stateChanged.asObservable();\n\n  constructor(\n    private specificationBridge: SpecificationBridgeService,\n    private roundTripValidator: RoundTripValidatorService,\n  ) {\n    // Auto-save functionality\n    this.state$.subscribe((state) => {\n      if (state.isDirty && this.config?.ui?.autoSaveInterval) {\n        // Implement auto-save logic here\n      }\n    });\n  }\n\n  /**\n   * Initialize the rule builder with configuration\n   */\n  initialize(config: RuleBuilderConfig): void {\n    this.config = config;\n    this.dslValidator = new DslValidator({\n      knownFields: Object.keys(config.fieldSchemas || {}),\n      knownFunctions:\n        config.customFunctions?.map((f) => (f as any)?.name).filter(Boolean) ||\n        [],\n      enablePerformanceWarnings: true,\n    });\n\n    // Reset state\n    this.updateState({\n      ...this.getInitialState(),\n      isDirty: false,\n    });\n  }\n\n  /**\n   * Get current state\n   */\n  getCurrentState(): RuleBuilderState {\n    return this._state.value;\n  }\n\n  /**\n   * Add a new rule node\n   */\n  addNode(node: Partial<RuleNode>, parentId?: string): string {\n    const nodeId = node.id || uuidv4();\n    const currentState = this.getCurrentState();\n\n    const newNode: RuleNode = {\n      id: nodeId,\n      type: node.type || RuleNodeType.FIELD_CONDITION,\n      label:\n        node.label ||\n        this.generateNodeLabel(\n          (node.type as RuleNodeType) || RuleNodeType.FIELD_CONDITION,\n        ),\n      metadata: node.metadata,\n      selected: false,\n      expanded: true,\n      parentId,\n      children: [],\n      config: node.config,\n    };\n\n    const updatedNodes = {\n      ...currentState.nodes,\n      [nodeId]: newNode,\n    };\n\n    let updatedRootNodes = [...currentState.rootNodes];\n\n    if (parentId) {\n      // Add to parent's children\n      const parent = updatedNodes[parentId];\n      if (parent) {\n        updatedNodes[parentId] = {\n          ...parent,\n          children: [...(parent.children || []), nodeId],\n        };\n      }\n    } else {\n      // Add as root node\n      updatedRootNodes.push(nodeId);\n    }\n\n    this.updateState({\n      ...currentState,\n      nodes: updatedNodes,\n      rootNodes: updatedRootNodes,\n      isDirty: true,\n    });\n\n    this.saveSnapshot(`Added ${newNode.label || newNode.type} node`);\n    this.validateRules();\n\n    return nodeId;\n  }\n\n  /**\n   * Update an existing rule node\n   */\n  updateNode(nodeId: string, updates: Partial<RuleNode>): void {\n    const currentState = this.getCurrentState();\n    const existingNode = currentState.nodes[nodeId];\n\n    if (!existingNode) {\n      return;\n    }\n\n    const updatedNode = {\n      ...existingNode,\n      ...updates,\n      id: nodeId, // Ensure ID doesn't change\n    };\n\n    this.updateState({\n      ...currentState,\n      nodes: {\n        ...currentState.nodes,\n        [nodeId]: updatedNode,\n      },\n      isDirty: true,\n    });\n\n    this.saveSnapshot(`Updated ${updatedNode.label || updatedNode.type} node`);\n    this.validateRules();\n  }\n\n  /**\n   * Remove a rule node\n   */\n  removeNode(nodeId: string): void {\n    const currentState = this.getCurrentState();\n    const node = currentState.nodes[nodeId];\n\n    if (!node) {\n      return;\n    }\n\n    const updatedNodes = { ...currentState.nodes };\n    const updatedRootNodes = [...currentState.rootNodes];\n\n    // Remove from parent's children or root nodes\n    if (node.parentId) {\n      const parent = updatedNodes[node.parentId];\n      if (parent) {\n        updatedNodes[node.parentId] = {\n          ...parent,\n          children: (parent.children || []).filter((id) => id !== nodeId),\n        };\n      }\n    } else {\n      const rootIndex = updatedRootNodes.indexOf(nodeId);\n      if (rootIndex >= 0) {\n        updatedRootNodes.splice(rootIndex, 1);\n      }\n    }\n\n    // Recursively remove children\n    const removeNodeRecursive = (id: string) => {\n      const nodeToRemove = updatedNodes[id];\n      if (nodeToRemove?.children) {\n        nodeToRemove.children.forEach(removeNodeRecursive);\n      }\n      delete updatedNodes[id];\n    };\n\n    removeNodeRecursive(nodeId);\n\n    this.updateState({\n      ...currentState,\n      nodes: updatedNodes,\n      rootNodes: updatedRootNodes,\n      selectedNodeId:\n        currentState.selectedNodeId === nodeId\n          ? undefined\n          : currentState.selectedNodeId,\n      isDirty: true,\n    });\n\n    this.saveSnapshot(`Removed ${node.label || node.type} node`);\n    this.validateRules();\n  }\n\n  /**\n   * Select a rule node\n   */\n  selectNode(nodeId?: string): void {\n    const currentState = this.getCurrentState();\n\n    // Update selection\n    const updatedNodes = Object.keys(currentState.nodes).reduce(\n      (acc, id) => {\n        acc[id] = {\n          ...currentState.nodes[id],\n          selected: id === nodeId,\n        };\n        return acc;\n      },\n      {} as Record<string, RuleNode>,\n    );\n\n    this.updateState({\n      ...currentState,\n      nodes: updatedNodes,\n      selectedNodeId: nodeId,\n    });\n\n    if (nodeId) {\n      this._nodeSelected.next(nodeId);\n    }\n  }\n\n  /**\n   * Move a node to a new parent\n   */\n  moveNode(nodeId: string, newParentId?: string, index?: number): void {\n    const currentState = this.getCurrentState();\n    const node = currentState.nodes[nodeId];\n\n    if (!node || node.parentId === newParentId) {\n      return;\n    }\n\n    const updatedNodes = { ...currentState.nodes };\n    let updatedRootNodes = [...currentState.rootNodes];\n\n    // Remove from current parent\n    if (node.parentId) {\n      const currentParent = updatedNodes[node.parentId];\n      if (currentParent) {\n        updatedNodes[node.parentId] = {\n          ...currentParent,\n          children: (currentParent.children || []).filter(\n            (id) => id !== nodeId,\n          ),\n        };\n      }\n    } else {\n      updatedRootNodes = updatedRootNodes.filter((id) => id !== nodeId);\n    }\n\n    // Add to new parent\n    updatedNodes[nodeId] = {\n      ...node,\n      parentId: newParentId,\n    };\n\n    if (newParentId) {\n      const newParent = updatedNodes[newParentId];\n      if (newParent) {\n        const children = [...(newParent.children || [])];\n        if (typeof index === 'number') {\n          children.splice(index, 0, nodeId);\n        } else {\n          children.push(nodeId);\n        }\n\n        updatedNodes[newParentId] = {\n          ...newParent,\n          children,\n        };\n      }\n    } else {\n      if (typeof index === 'number') {\n        updatedRootNodes.splice(index, 0, nodeId);\n      } else {\n        updatedRootNodes.push(nodeId);\n      }\n    }\n\n    this.updateState({\n      ...currentState,\n      nodes: updatedNodes,\n      rootNodes: updatedRootNodes,\n      isDirty: true,\n    });\n\n    this.saveSnapshot(`Moved ${node.label || node.type} node`);\n  }\n\n  /**\n   * Convert current rules to Specification\n   */\n  toSpecification(): Specification<any> | null {\n    const currentState = this.getCurrentState();\n\n    if (currentState.rootNodes.length === 0) {\n      return null;\n    }\n\n    // If single root node, convert directly\n    if (currentState.rootNodes.length === 1) {\n      const rootNode = this.buildRuleNodeTree(currentState.rootNodes[0]);\n      return rootNode\n        ? this.specificationBridge.ruleNodeToSpecification(rootNode)\n        : null;\n    }\n\n    // Multiple root nodes - combine with AND\n    const specifications = currentState.rootNodes\n      .map((nodeId) => {\n        const rootNode = this.buildRuleNodeTree(nodeId);\n        return rootNode\n          ? this.specificationBridge.ruleNodeToSpecification(rootNode)\n          : null;\n      })\n      .filter((spec) => spec !== null) as Specification<any>[];\n\n    if (specifications.length === 0) {\n      return null;\n    }\n\n    if (specifications.length === 1) {\n      return specifications[0];\n    }\n\n    return SpecificationFactory.and(...specifications);\n  }\n\n  /**\n   * Export current rules\n   */\n  export(options: ExportOptions): string {\n    const currentState = this.getCurrentState();\n\n    if (currentState.rootNodes.length === 0) {\n      return '';\n    }\n\n    switch (options.format) {\n      case 'json':\n        const specification = this.toSpecification();\n        if (!specification) return '';\n        const json = specification.toJSON();\n        return options.prettyPrint\n          ? JSON.stringify(json, null, 2)\n          : JSON.stringify(json);\n\n      case 'dsl':\n        if (currentState.rootNodes.length === 1) {\n          const rootNode = this.buildRuleNodeTree(currentState.rootNodes[0]);\n          if (!rootNode) return '';\n          return this.specificationBridge.exportToDsl(rootNode, {\n            includeMetadata: options.includeMetadata,\n            metadataPosition: options.metadataPosition || 'before',\n            prettyPrint: options.prettyPrint || false,\n          });\n        } else {\n          // Multiple root nodes - export each and combine\n          const dslParts = currentState.rootNodes\n            .map((nodeId) => {\n              const rootNode = this.buildRuleNodeTree(nodeId);\n              return rootNode\n                ? this.specificationBridge.exportToDsl(rootNode)\n                : '';\n            })\n            .filter((dsl) => dsl.length > 0);\n\n          return dslParts.length > 1\n            ? dslParts.join(' AND ')\n            : dslParts[0] || '';\n        }\n\n      case 'typescript':\n        const spec = this.toSpecification();\n        return spec ? this.exportToTypeScript(spec, options) : '';\n\n      case 'form-config':\n        const formSpec = this.toSpecification();\n        return formSpec ? this.exportToFormConfig(formSpec, options) : '';\n\n      default:\n        throw new Error(`Unsupported export format: ${options.format}`);\n    }\n  }\n\n  /**\n   * Import rules from external source.\n   *\n   * Empty strings or structures with no data are ignored to preserve the\n   * current state. When parsing JSON, the specification type must be\n   * present otherwise an error is thrown, ensuring business rules are\n   * explicit and valid.\n   *\n   * @throws Error when the specification type is missing or the format is\n   * unsupported.\n   */\n  import(content: string, options: ImportOptions): void {\n    try {\n      let specification: Specification<any> | null = null;\n\n      switch (options.format) {\n        case 'json': {\n          if (!content || content.trim().length === 0) {\n            return;\n          }\n          const json = JSON.parse(content);\n          if (\n            json == null ||\n            (Array.isArray(json) && json.length === 0) ||\n            (typeof json === 'object' &&\n              !Array.isArray(json) &&\n              Object.keys(json).length === 0)\n          ) {\n            return;\n          }\n\n          // Se for o estado do builder (nodes/rootNodes), aplica diretamente\n          if (this.isBuilderState(json)) {\n            const state = this.getInitialState();\n            this.updateState({\n              ...state,\n              nodes: json.nodes,\n              rootNodes: json.rootNodes,\n              isDirty: true,\n            });\n            try {\n              const count = Object.keys(json.nodes || {}).length;\n              const firstKey = Object.keys(json.nodes || {})[0];\n              const firstNode = firstKey ? (json.nodes as any)[firstKey] : undefined;\n              (console.debug || console.log)('[RuleBuilderService] import(builder-state)', { nodesCount: count, rootNodes: (json.rootNodes || []).length, firstNode });\n            } catch {}\n            this.saveSnapshot('Imported rules');\n            this.validateRules();\n            return;\n          }\n\n          // Se for um array de especificações, combina com AND\n          if (Array.isArray(json)) {\n            const specs = json\n              .map((item) => this.normalizeSpecJson(item))\n              .filter((j): j is any => !!j)\n              .map((j) => SpecificationFactory.fromJSON(j));\n\n            if (specs.length === 0) return;\n            specification = specs.length === 1 ? specs[0] : SpecificationFactory.and(...specs);\n            break;\n          }\n\n          // Objeto único: tenta normalizar ou usar dsl embutido\n          if (typeof json === 'object' && json) {\n            if (typeof (json as any).dsl === 'string' && (json as any).dsl.trim()) {\n              specification = this.dslParser.parse((json as any).dsl);\n              break;\n            }\n\n            const normalized = this.normalizeSpecJson(json);\n            if (!normalized) {\n              throw new Error('Missing specification type');\n            }\n            specification = SpecificationFactory.fromJSON(normalized);\n            break;\n          }\n\n          // Tipo inesperado\n          throw new Error('Unsupported JSON structure for import');\n        }\n\n        case 'dsl':\n          if (!content || content.trim().length === 0) {\n            return;\n          }\n          specification = this.dslParser.parse(content);\n          break;\n\n        default:\n          throw new Error(`Unsupported import format: ${options.format}`);\n      }\n\n      if (specification) {\n        const ruleNode =\n          this.specificationBridge.specificationToRuleNode(specification);\n        const ruleNodes = this.flattenRuleNodeTree(ruleNode);\n\n        if (options.merge) {\n          // Merge with existing rules\n          const currentState = this.getCurrentState();\n          const mergedNodes = { ...currentState.nodes, ...ruleNodes.nodes };\n          const mergedRootNodes = [\n            ...currentState.rootNodes,\n            ...ruleNodes.rootNodes,\n          ];\n\n          this.updateState({\n            ...currentState,\n            nodes: mergedNodes,\n            rootNodes: mergedRootNodes,\n            isDirty: true,\n          });\n        } else {\n          // Replace all rules\n          this.updateState({\n            ...this.getInitialState(),\n            nodes: ruleNodes.nodes,\n            rootNodes: ruleNodes.rootNodes,\n            isDirty: true,\n          });\n        }\n\n        try {\n          const count = Object.keys(ruleNodes.nodes || {}).length;\n          const firstKey = Object.keys(ruleNodes.nodes || {})[0];\n          const firstNode = firstKey ? (ruleNodes.nodes as any)[firstKey] : undefined;\n          (console.debug || console.log)('[RuleBuilderService] import(spec)', { nodesCount: count, rootNodes: (ruleNodes.rootNodes || []).length, firstNode });\n        } catch {}\n        this.saveSnapshot('Imported rules');\n        this.validateRules();\n      }\n    } catch (error) {\n      console.error('Failed to import rules:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Undo last action\n   */\n  undo(): void {\n    const currentState = this.getCurrentState();\n\n    if (currentState.historyPosition > 0) {\n      const snapshot = currentState.history[currentState.historyPosition - 1];\n\n      this.updateState({\n        ...currentState,\n        ...snapshot.state,\n        historyPosition: currentState.historyPosition - 1,\n        isDirty: true,\n      });\n    }\n  }\n\n  /**\n   * Redo last undone action\n   */\n  redo(): void {\n    const currentState = this.getCurrentState();\n\n    if (currentState.historyPosition < currentState.history.length - 1) {\n      const snapshot = currentState.history[currentState.historyPosition + 1];\n\n      this.updateState({\n        ...currentState,\n        ...snapshot.state,\n        historyPosition: currentState.historyPosition + 1,\n        isDirty: true,\n      });\n    }\n  }\n\n  /**\n   * Clear all rules\n   */\n  clear(): void {\n    this.updateState({\n      ...this.getInitialState(),\n      isDirty: false,\n    });\n\n    this.saveSnapshot('Cleared all rules');\n  }\n\n  /**\n   * Validate current rules\n   */\n  validateRules(): void {\n    const currentState = this.getCurrentState();\n    const errors: ValidationError[] = [];\n\n    // Validate each node\n    Object.values(currentState.nodes).forEach((node) => {\n      const nodeErrors = this.validateNode(node);\n      errors.push(...nodeErrors);\n    });\n\n    // Validate overall structure\n    const structureErrors = this.validateStructure(currentState);\n    errors.push(...structureErrors);\n\n    // Update DSL and validate\n    try {\n      const specification = this.toSpecification();\n      if (specification) {\n        const dsl = specification.toDSL();\n        const dslErrors = this.dslValidator.validate(dsl);\n\n        errors.push(\n          ...dslErrors.map((issue: ValidationIssue) => ({\n            id: uuidv4(),\n            message: issue.message,\n            severity: issue.severity as 'error' | 'warning' | 'info',\n            code: issue.type,\n          })),\n        );\n\n        this.updateState({\n          ...currentState,\n          currentDSL: dsl,\n          currentJSON: specification.toJSON(),\n        });\n      }\n    } catch (error) {\n      errors.push({\n        id: uuidv4(),\n        message: `Failed to generate specification: ${error}`,\n        severity: 'error',\n        code: 'SPECIFICATION_GENERATION_ERROR',\n      });\n    }\n\n    // Perform round-trip validation for root nodes (if enabled)\n    if (this.config?.validation?.realTime) {\n      const roundTripErrors = this.validateRoundTrip(currentState);\n      errors.push(...roundTripErrors);\n    }\n\n    this._validationErrors.next(errors);\n  }\n\n  /**\n   * Validates round-trip conversion for all root nodes\n   */\n  private validateRoundTrip(state: RuleBuilderState): ValidationError[] {\n    const errors: ValidationError[] = [];\n\n    for (const rootNodeId of state.rootNodes) {\n      try {\n        const rootNode = this.buildRuleNodeTree(rootNodeId);\n        if (rootNode) {\n          const result = this.roundTripValidator.validateRoundTrip(rootNode);\n\n          if (!result.success) {\n            // Add round-trip specific errors\n            errors.push(\n              ...result.errors.map((error) => ({\n                ...error,\n                nodeId: rootNodeId,\n                code: `ROUND_TRIP_${error.code}`,\n              })),\n            );\n          }\n\n          // Add round-trip warnings as info-level validation errors\n          errors.push(\n            ...result.warnings.map((warning) => ({\n              ...warning,\n              severity: 'info' as const,\n              nodeId: rootNodeId,\n              code: `ROUND_TRIP_${warning.code}`,\n            })),\n          );\n        }\n      } catch (error) {\n        errors.push({\n          id: uuidv4(),\n          message: `Round-trip validation failed for node ${rootNodeId}: ${error}`,\n          severity: 'warning',\n          code: 'ROUND_TRIP_VALIDATION_ERROR',\n          nodeId: rootNodeId,\n        });\n      }\n    }\n\n    return errors;\n  }\n\n  /**\n   * Runs comprehensive round-trip validation for current state\n   */\n  runRoundTripValidation(): {\n    success: boolean;\n    results: Array<{\n      nodeId: string;\n      result: any; // RoundTripValidationResult\n    }>;\n    summary: {\n      totalNodes: number;\n      successfulNodes: number;\n      failedNodes: number;\n      totalErrors: number;\n      totalWarnings: number;\n    };\n  } {\n    const currentState = this.getCurrentState();\n    const results: Array<{ nodeId: string; result: any }> = [];\n    let totalErrors = 0;\n    let totalWarnings = 0;\n    let successfulNodes = 0;\n    let failedNodes = 0;\n\n    for (const rootNodeId of currentState.rootNodes) {\n      try {\n        const rootNode = this.buildRuleNodeTree(rootNodeId);\n        if (rootNode) {\n          const result = this.roundTripValidator.validateRoundTrip(rootNode);\n          results.push({ nodeId: rootNodeId, result });\n\n          if (result.success) {\n            successfulNodes++;\n          } else {\n            failedNodes++;\n          }\n\n          totalErrors += result.errors.length;\n          totalWarnings += result.warnings.length;\n        }\n      } catch (error) {\n        failedNodes++;\n        totalErrors++;\n        results.push({\n          nodeId: rootNodeId,\n          result: {\n            success: false,\n            errors: [{ message: `Validation failed: ${error}` }],\n            warnings: [],\n          },\n        });\n      }\n    }\n\n    return {\n      success: failedNodes === 0,\n      results,\n      summary: {\n        totalNodes: currentState.rootNodes.length,\n        successfulNodes,\n        failedNodes,\n        totalErrors,\n        totalWarnings,\n      },\n    };\n  }\n\n  // Private methods\n\n  private getInitialState(): RuleBuilderState {\n    return {\n      nodes: {},\n      rootNodes: [],\n      selectedNodeId: undefined,\n      currentDSL: undefined,\n      currentJSON: undefined,\n      validationErrors: [],\n      mode: 'visual',\n      isDirty: false,\n      history: [],\n      historyPosition: -1,\n    };\n  }\n\n  private updateState(newState: RuleBuilderState): void {\n    this._state.next(newState);\n    this._stateChanged.next();\n  }\n\n  private saveSnapshot(description: string): void {\n    const currentState = this.getCurrentState();\n\n    const snapshot: RuleBuilderSnapshot = {\n      timestamp: Date.now(),\n      description,\n      state: {\n        nodes: { ...currentState.nodes },\n        rootNodes: [...currentState.rootNodes],\n        selectedNodeId: currentState.selectedNodeId,\n      },\n    };\n\n    const newHistory = currentState.history.slice(\n      0,\n      currentState.historyPosition + 1,\n    );\n    newHistory.push(snapshot);\n\n    // Limit history size\n    const maxHistorySize = 50;\n    if (newHistory.length > maxHistorySize) {\n      newHistory.shift();\n    }\n\n    this.updateState({\n      ...currentState,\n      history: newHistory,\n      historyPosition: newHistory.length - 1,\n    });\n  }\n\n  private generateNodeLabel(type: RuleNodeType): string {\n    const labels: Record<RuleNodeType, string> = {\n      [RuleNodeType.FIELD_CONDITION]: 'Field Condition',\n      [RuleNodeType.AND_GROUP]: 'AND Group',\n      [RuleNodeType.OR_GROUP]: 'OR Group',\n      [RuleNodeType.NOT_GROUP]: 'NOT Group',\n      [RuleNodeType.XOR_GROUP]: 'XOR Group',\n      [RuleNodeType.IMPLIES_GROUP]: 'IMPLIES Group',\n      [RuleNodeType.REQUIRED_IF]: 'Required If',\n      [RuleNodeType.VISIBLE_IF]: 'Visible If',\n      [RuleNodeType.DISABLED_IF]: 'Disabled If',\n      [RuleNodeType.READONLY_IF]: 'Readonly If',\n      [RuleNodeType.FOR_EACH]: 'For Each',\n      [RuleNodeType.UNIQUE_BY]: 'Unique By',\n      [RuleNodeType.MIN_LENGTH]: 'Min Length',\n      [RuleNodeType.MAX_LENGTH]: 'Max Length',\n      [RuleNodeType.IF_DEFINED]: 'If Defined',\n      [RuleNodeType.IF_NOT_NULL]: 'If Not Null',\n      [RuleNodeType.IF_EXISTS]: 'If Exists',\n      [RuleNodeType.WITH_DEFAULT]: 'With Default',\n      [RuleNodeType.FUNCTION_CALL]: 'Function Call',\n      [RuleNodeType.FIELD_TO_FIELD]: 'Field to Field',\n      [RuleNodeType.CONTEXTUAL]: 'Contextual',\n      [RuleNodeType.AT_LEAST]: 'At Least',\n      [RuleNodeType.EXACTLY]: 'Exactly',\n      [RuleNodeType.EXPRESSION]: 'Expression',\n      [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'Contextual Template',\n      [RuleNodeType.CUSTOM]: 'Custom',\n    };\n\n    return labels[type] || type;\n  }\n\n  private buildRuleNodeTree(nodeId: string): RuleNode | null {\n    const currentState = this.getCurrentState();\n    const node = currentState.nodes[nodeId];\n\n    if (!node) {\n      return null;\n    }\n\n    return {\n      ...node,\n      children: node.children || [],\n    };\n  }\n\n  private flattenRuleNodeTree(rootNode: RuleNode): {\n    nodes: Record<string, RuleNode>;\n    rootNodes: string[];\n  } {\n    const nodes: Record<string, RuleNode> = {};\n    const rootNodes: string[] = [rootNode.id];\n\n    const flattenNode = (node: RuleNode): void => {\n      // Store the node in the flat structure\n      nodes[node.id] = {\n        ...node,\n        children: node.children || [],\n      };\n\n      // Recursively flatten children if they exist and are RuleNode objects (not just IDs)\n      if (node.children && node.children.length > 0) {\n        // Check if children are RuleNode objects or string IDs\n        const firstChild = node.children[0] as any;\n        if (\n          typeof firstChild === 'object' &&\n          firstChild &&\n          'id' in firstChild\n        ) {\n          // Children are RuleNode objects, need to flatten them\n          (node.children as any[]).forEach((child: any) => {\n            if (child && typeof child === 'object' && child.id) {\n              child.parentId = node.id;\n              flattenNode(child);\n            }\n          });\n        }\n      }\n    };\n\n    flattenNode(rootNode);\n    return { nodes, rootNodes };\n  }\n\n  private validateNode(node: RuleNode): ValidationError[] {\n    const errors: ValidationError[] = [];\n\n    // Node-specific validation logic\n    switch (node.type) {\n      case RuleNodeType.FIELD_CONDITION:\n        // Validate field condition\n        break;\n      // Add more cases...\n    }\n\n    return errors;\n  }\n\n  private validateStructure(state: RuleBuilderState): ValidationError[] {\n    const errors: ValidationError[] = [];\n\n    // Check for orphaned nodes\n    // Check for circular references\n    // Check for invalid parent-child relationships\n\n    return errors;\n  }\n\n  private exportToTypeScript(\n    specification: Specification<any>,\n    options: ExportOptions,\n  ): string {\n    // Implementation for TypeScript export\n    return `// TypeScript export not yet implemented`;\n  }\n\n  private exportToFormConfig(\n    specification: Specification<any>,\n    options: ExportOptions,\n  ): string {\n    // Implementation for form config export\n    return `// Form config export not yet implemented`;\n  }\n\n  private normalizeSpecJson(input: any): any | null {\n    if (!input || typeof input !== 'object') return null;\n    if ((input as any).type) return input;\n\n    // Inferência básica de tipos de especificação comuns\n    // Campo simples: { field, operator, value }\n    if ((input as any).field && (input as any).operator !== undefined) {\n      return { type: 'field', ...input };\n    }\n\n    // Grupo booleano: { operator: 'and' | 'or' | 'xor', specs: [...] }\n    if (\n      Array.isArray((input as any).specs) &&\n      typeof (input as any).operator === 'string'\n    ) {\n      return { type: (input as any).operator, ...input };\n    }\n\n    // NOT: { spec: {...} }\n    if ((input as any).spec && !(input as any).specs) {\n      return { type: 'not', ...input };\n    }\n\n    // IMPLIES: { antecedent, consequent }\n    if ((input as any).antecedent && (input as any).consequent) {\n      return { type: 'implies', ...input };\n    }\n\n    // fieldToField: { fieldA, fieldB, operator }\n    if ((input as any).fieldA && (input as any).fieldB && (input as any).operator) {\n      return { type: 'fieldToField', ...input };\n    }\n\n    // Cardinalidade: { minimum, specs } => atLeast; { exact, specs } => exactly\n    if (Array.isArray((input as any).specs)) {\n      if ((input as any).minimum != null) return { type: 'atLeast', ...input };\n      if ((input as any).exact != null) return { type: 'exactly', ...input };\n    }\n\n    return null;\n  }\n\n  private isBuilderState(json: any): json is { nodes: Record<string, RuleNode>; rootNodes: string[] } {\n    return (\n      json &&\n      typeof json === 'object' &&\n      !Array.isArray(json) &&\n      typeof (json as any).nodes === 'object' &&\n      Array.isArray((json as any).rootNodes)\n    );\n  }\n}\n","import {\n  Component,\n  OnInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSelectModule } from '@angular/material/select';\n\nimport {\n  RoundTripValidatorService,\n  RoundTripValidationResult,\n  RoundTripTestCase,\n} from '../services/round-trip-validator.service';\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { RuleNode, RuleNodeType } from '../models/rule-builder.model';\n\n@Component({\n  selector: 'praxis-round-trip-tester',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatCardModule,\n    MatButtonModule,\n    MatIconModule,\n    MatTabsModule,\n    MatToolbarModule,\n    MatProgressBarModule,\n    MatSnackBarModule,\n    MatExpansionModule,\n    MatChipsModule,\n    MatBadgeModule,\n    MatTooltipModule,\n    MatDividerModule,\n    MatSelectModule,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"round-trip-tester-container\">\n      <!-- Header -->\n      <mat-toolbar color=\"primary\">\n        <span class=\"toolbar-title\">\n          <mat-icon>sync_alt</mat-icon>\n          Round-Trip Validation Tester\n        </span>\n\n        <span class=\"toolbar-spacer\"></span>\n\n        <div class=\"toolbar-actions\">\n          <button\n            mat-button\n            (click)=\"runCurrentRuleTest()\"\n            [disabled]=\"isRunning || !hasCurrentRule\"\n            matTooltip=\"Test current rule from builder\"\n          >\n            <mat-icon>play_arrow</mat-icon>\n            Test Current Rule\n          </button>\n\n          <button\n            mat-button\n            (click)=\"runTestSuite()\"\n            [disabled]=\"isRunning\"\n            matTooltip=\"Run full test suite\"\n          >\n            <mat-icon>playlist_play</mat-icon>\n            Run Test Suite\n          </button>\n\n          <button\n            mat-button\n            (click)=\"clearResults()\"\n            [disabled]=\"isRunning\"\n            matTooltip=\"Clear all results\"\n          >\n            <mat-icon>clear</mat-icon>\n            Clear\n          </button>\n        </div>\n      </mat-toolbar>\n\n      <!-- Main Content -->\n      <div class=\"tester-content\">\n        <div class=\"tester-grid\">\n          <!-- Test Selection Panel -->\n          <mat-card class=\"test-selection-panel\">\n            <mat-card-header>\n              <mat-card-title>Test Selection</mat-card-title>\n              <mat-card-subtitle>Choose what to test</mat-card-subtitle>\n            </mat-card-header>\n\n            <mat-card-content>\n              <div class=\"test-options\">\n                <!-- Current Rule Test -->\n                <div class=\"test-option\">\n                  <h4>Current Rule</h4>\n                  <p class=\"test-description\">\n                    Test the rule currently loaded in the visual builder\n                  </p>\n                  <div class=\"current-rule-info\" *ngIf=\"hasCurrentRule\">\n                    <span class=\"rule-type\">{{ getCurrentRuleType() }}</span>\n                    <span class=\"rule-label\">{{ getCurrentRuleLabel() }}</span>\n                  </div>\n                  <div class=\"no-rule-info\" *ngIf=\"!hasCurrentRule\">\n                    <span class=\"no-rule-message\"\n                      >No rule loaded in builder</span\n                    >\n                  </div>\n                </div>\n\n                <mat-divider></mat-divider>\n\n                <!-- Test Suite -->\n                <div class=\"test-option\">\n                  <h4>Test Suite</h4>\n                  <p class=\"test-description\">\n                    Run predefined test cases covering common scenarios\n                  </p>\n                  <div class=\"test-suite-info\">\n                    <span class=\"test-count\"\n                      >{{ defaultTestCases.length }} test cases</span\n                    >\n                    <button\n                      mat-button\n                      size=\"small\"\n                      (click)=\"showTestCases = !showTestCases\"\n                    >\n                      {{ showTestCases ? 'Hide' : 'Show' }} Details\n                    </button>\n                  </div>\n\n                  <!-- Test Cases List -->\n                  <div *ngIf=\"showTestCases\" class=\"test-cases-list\">\n                    <div\n                      *ngFor=\"let testCase of defaultTestCases\"\n                      class=\"test-case-item\"\n                    >\n                      <div class=\"test-case-header\">\n                        <span class=\"test-case-name\">{{ testCase.name }}</span>\n                        <mat-chip\n                          [color]=\"getTestCaseColor(testCase)\"\n                          size=\"small\"\n                        >\n                          {{ testCase.visualRule.type }}\n                        </mat-chip>\n                      </div>\n                      <p class=\"test-case-description\">\n                        {{ testCase.description }}\n                      </p>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </mat-card-content>\n          </mat-card>\n\n          <!-- Results Panel -->\n          <mat-card class=\"results-panel\">\n            <mat-card-header>\n              <mat-card-title>\n                Test Results\n                <mat-icon *ngIf=\"isRunning\" class=\"running-icon\"\n                  >hourglass_empty</mat-icon\n                >\n              </mat-card-title>\n              <mat-card-subtitle *ngIf=\"lastTestResult\">\n                {{ getResultSummary() }}\n              </mat-card-subtitle>\n            </mat-card-header>\n\n            <mat-card-content>\n              <!-- Progress Bar -->\n              <mat-progress-bar\n                *ngIf=\"isRunning\"\n                mode=\"indeterminate\"\n                class=\"progress-bar\"\n              >\n              </mat-progress-bar>\n\n              <!-- No Results Message -->\n              <div\n                *ngIf=\"!lastTestResult && !testSuiteResults && !isRunning\"\n                class=\"no-results\"\n              >\n                <mat-icon>science</mat-icon>\n                <h3>No Tests Run</h3>\n                <p>Run a test to see validation results here</p>\n              </div>\n\n              <!-- Single Test Result -->\n              <div\n                *ngIf=\"lastTestResult && !testSuiteResults\"\n                class=\"single-test-result\"\n              >\n                <div class=\"result-header\">\n                  <div\n                    class=\"result-status\"\n                    [class]=\"getStatusClass(lastTestResult)\"\n                  >\n                    <mat-icon>{{ getStatusIcon(lastTestResult) }}</mat-icon>\n                    <span>{{\n                      lastTestResult.success ? 'PASSED' : 'FAILED'\n                    }}</span>\n                  </div>\n                  <div class=\"result-timing\">\n                    {{ lastTestResult.performance.totalTime.toFixed(2) }}ms\n                  </div>\n                </div>\n\n                <!-- Stage Results -->\n                <mat-expansion-panel class=\"stages-panel\">\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>Conversion Stages</mat-panel-title>\n                    <mat-panel-description>\n                      Step-by-step validation results\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"stages-list\">\n                    <div\n                      *ngFor=\"let stage of getStages(lastTestResult)\"\n                      class=\"stage-item\"\n                      [class]=\"stage.success ? 'stage-success' : 'stage-error'\"\n                    >\n                      <div class=\"stage-header\">\n                        <mat-icon>{{\n                          stage.success ? 'check_circle' : 'error'\n                        }}</mat-icon>\n                        <span class=\"stage-name\">{{ stage.name }}</span>\n                        <span class=\"stage-timing\"\n                          >{{ stage.timing?.toFixed(2) }}ms</span\n                        >\n                      </div>\n                      <div *ngIf=\"stage.error\" class=\"stage-error-message\">\n                        {{ stage.error }}\n                      </div>\n                      <div *ngIf=\"stage.dsl\" class=\"stage-dsl-output\">\n                        <strong>Generated DSL:</strong>\n                        <pre>{{ stage.dsl }}</pre>\n                      </div>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n\n                <!-- Data Integrity Results -->\n                <mat-expansion-panel class=\"integrity-panel\">\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>Data Integrity</mat-panel-title>\n                    <mat-panel-description>\n                      Validation of data preservation\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"integrity-checks\">\n                    <div\n                      *ngFor=\"let check of getIntegrityChecks(lastTestResult)\"\n                      class=\"integrity-check\"\n                      [class]=\"check.passed ? 'check-passed' : 'check-failed'\"\n                    >\n                      <mat-icon>{{\n                        check.passed ? 'check' : 'close'\n                      }}</mat-icon>\n                      <span>{{ check.name }}</span>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n\n                <!-- Errors and Warnings -->\n                <div\n                  *ngIf=\"\n                    lastTestResult.errors.length > 0 ||\n                    lastTestResult.warnings.length > 0\n                  \"\n                  class=\"issues-section\"\n                >\n                  <!-- Errors -->\n                  <div\n                    *ngIf=\"lastTestResult.errors.length > 0\"\n                    class=\"errors-section\"\n                  >\n                    <h4 class=\"section-title error-title\">\n                      <mat-icon>error</mat-icon>\n                      Errors ({{ lastTestResult.errors.length }})\n                    </h4>\n                    <div\n                      *ngFor=\"let error of lastTestResult.errors\"\n                      class=\"issue-item error-item\"\n                    >\n                      <div class=\"issue-header\">\n                        <span class=\"issue-code\">{{ error.code }}</span>\n                        <span class=\"issue-severity\">{{ error.severity }}</span>\n                      </div>\n                      <div class=\"issue-message\">{{ error.message }}</div>\n                    </div>\n                  </div>\n\n                  <!-- Warnings -->\n                  <div\n                    *ngIf=\"lastTestResult.warnings.length > 0\"\n                    class=\"warnings-section\"\n                  >\n                    <h4 class=\"section-title warning-title\">\n                      <mat-icon>warning</mat-icon>\n                      Warnings ({{ lastTestResult.warnings.length }})\n                    </h4>\n                    <div\n                      *ngFor=\"let warning of lastTestResult.warnings\"\n                      class=\"issue-item warning-item\"\n                    >\n                      <div class=\"issue-header\">\n                        <span class=\"issue-code\">{{ warning.code }}</span>\n                        <span class=\"issue-severity\">{{\n                          warning.severity\n                        }}</span>\n                      </div>\n                      <div class=\"issue-message\">{{ warning.message }}</div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Test Suite Results -->\n              <div *ngIf=\"testSuiteResults\" class=\"test-suite-results\">\n                <div class=\"suite-summary\">\n                  <div class=\"summary-stats\">\n                    <div class=\"stat-item\">\n                      <span class=\"stat-label\">Total Tests</span>\n                      <span class=\"stat-value\">{{\n                        testSuiteResults.totalTests\n                      }}</span>\n                    </div>\n                    <div class=\"stat-item passed\">\n                      <span class=\"stat-label\">Passed</span>\n                      <span class=\"stat-value\">{{\n                        testSuiteResults.passed\n                      }}</span>\n                    </div>\n                    <div class=\"stat-item failed\">\n                      <span class=\"stat-label\">Failed</span>\n                      <span class=\"stat-value\">{{\n                        testSuiteResults.failed\n                      }}</span>\n                    </div>\n                  </div>\n\n                  <div class=\"success-rate\">\n                    <span class=\"rate-label\">Success Rate:</span>\n                    <span class=\"rate-value\" [class]=\"getSuccessRateClass()\">\n                      {{ getSuccessRate() }}%\n                    </span>\n                  </div>\n                </div>\n\n                <!-- Individual Test Results -->\n                <mat-expansion-panel\n                  *ngFor=\"let result of testSuiteResults.results; let i = index\"\n                  class=\"test-result-panel\"\n                >\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      <mat-icon\n                        [class]=\"\n                          result.result.success ? 'success-icon' : 'error-icon'\n                        \"\n                      >\n                        {{ result.result.success ? 'check_circle' : 'error' }}\n                      </mat-icon>\n                      {{ result.testCase.name }}\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      {{ result.testCase.description }}\n                      <span class=\"test-timing\"\n                        >{{\n                          result.result.performance.totalTime.toFixed(2)\n                        }}ms</span\n                      >\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"test-details\">\n                    <!-- Test Case Info -->\n                    <div class=\"test-case-info\">\n                      <h5>Test Case</h5>\n                      <div class=\"test-case-details\">\n                        <span class=\"detail-item\">\n                          <strong>Type:</strong>\n                          {{ result.testCase.visualRule.type }}\n                        </span>\n                        <span class=\"detail-item\">\n                          <strong>ID:</strong> {{ result.testCase.id }}\n                        </span>\n                      </div>\n                    </div>\n\n                    <!-- Quick Result Summary -->\n                    <div class=\"quick-summary\">\n                      <h5>Result Summary</h5>\n                      <div class=\"summary-items\">\n                        <span\n                          class=\"summary-item\"\n                          [class]=\"\n                            result.result.success ? 'success' : 'failure'\n                          \"\n                        >\n                          <mat-icon>{{\n                            result.result.success ? 'check' : 'close'\n                          }}</mat-icon>\n                          {{ result.result.success ? 'Success' : 'Failed' }}\n                        </span>\n                        <span class=\"summary-item\">\n                          <mat-icon>error</mat-icon>\n                          {{ result.result.errors.length }} errors\n                        </span>\n                        <span class=\"summary-item\">\n                          <mat-icon>warning</mat-icon>\n                          {{ result.result.warnings.length }} warnings\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n              </div>\n            </mat-card-content>\n          </mat-card>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .round-trip-tester-container {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        overflow: hidden;\n      }\n\n      .toolbar-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-weight: 500;\n      }\n\n      .toolbar-spacer {\n        flex: 1;\n      }\n\n      .toolbar-actions {\n        display: flex;\n        gap: 8px;\n      }\n\n      .tester-content {\n        flex: 1;\n        padding: 16px;\n        overflow: auto;\n      }\n\n      .tester-grid {\n        display: grid;\n        grid-template-columns: 1fr 2fr;\n        gap: 16px;\n        height: 100%;\n      }\n\n      .test-selection-panel,\n      .results-panel {\n        height: fit-content;\n        max-height: 100%;\n        overflow: auto;\n      }\n\n      .test-options {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .test-option h4 {\n        margin: 0 0 8px 0;\n        color: var(--md-sys-color-primary);\n      }\n\n      .test-description {\n        margin: 0 0 12px 0;\n        color: var(--md-sys-color-on-surface-variant);\n        font-size: 14px;\n      }\n\n      .current-rule-info,\n      .test-suite-info {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        flex-wrap: wrap;\n      }\n\n      .rule-type,\n      .test-count {\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n        padding: 4px 8px;\n        border-radius: 4px;\n        font-size: 12px;\n        font-weight: 500;\n      }\n\n      .rule-label {\n        font-size: 13px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .no-rule-message {\n        color: var(--md-sys-color-error);\n        font-style: italic;\n        font-size: 13px;\n      }\n\n      .test-cases-list {\n        margin-top: 12px;\n        border: 1px solid var(--md-sys-color-outline-variant);\n        border-radius: 4px;\n        padding: 8px;\n      }\n\n      .test-case-item {\n        margin-bottom: 12px;\n        padding-bottom: 12px;\n        border-bottom: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      .test-case-item:last-child {\n        margin-bottom: 0;\n        padding-bottom: 0;\n        border-bottom: none;\n      }\n\n      .test-case-header {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        margin-bottom: 4px;\n      }\n\n      .test-case-name {\n        font-weight: 500;\n        font-size: 14px;\n      }\n\n      .test-case-description {\n        margin: 0;\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .progress-bar {\n        margin-bottom: 16px;\n      }\n\n      .running-icon {\n        animation: spin 2s linear infinite;\n        margin-left: 8px;\n      }\n\n      @keyframes spin {\n        from {\n          transform: rotate(0deg);\n        }\n        to {\n          transform: rotate(360deg);\n        }\n      }\n\n      .no-results {\n        text-align: center;\n        padding: 40px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .no-results mat-icon {\n        font-size: 48px;\n        width: 48px;\n        height: 48px;\n        margin-bottom: 16px;\n      }\n\n      .no-results h3 {\n        margin: 0 0 8px 0;\n      }\n\n      .single-test-result {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .result-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 16px;\n        border-radius: 8px;\n        background: var(--md-sys-color-surface-container);\n      }\n\n      .result-status {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-weight: 600;\n      }\n\n      .result-status.success {\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .result-status.failure {\n        color: var(--md-sys-color-error);\n      }\n\n      .result-timing {\n        font-family: monospace;\n        font-size: 14px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .stages-list,\n      .integrity-checks {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .stage-item {\n        padding: 12px;\n        border-radius: 4px;\n        border-left: 4px solid var(--md-sys-color-outline-variant);\n      }\n\n      .stage-item.stage-success {\n        border-left-color: var(--md-sys-color-tertiary);\n        background: var(--md-sys-color-tertiary-container);\n      }\n\n      .stage-item.stage-error {\n        border-left-color: var(--md-sys-color-error);\n        background: var(--md-sys-color-error-container);\n      }\n\n      .stage-header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 4px;\n      }\n\n      .stage-name {\n        flex: 1;\n        font-weight: 500;\n      }\n\n      .stage-timing {\n        font-family: monospace;\n        font-size: 12px;\n      }\n\n      .stage-error-message {\n        color: var(--md-sys-color-error);\n        font-size: 13px;\n        margin-top: 4px;\n      }\n\n      .stage-dsl-output {\n        margin-top: 8px;\n      }\n\n      .stage-dsl-output pre {\n        background: var(--md-sys-color-surface);\n        padding: 8px;\n        border-radius: 4px;\n        font-size: 12px;\n        margin: 4px 0 0 0;\n        overflow-x: auto;\n      }\n\n      .integrity-check {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px;\n        border-radius: 4px;\n      }\n\n      .integrity-check.check-passed {\n        background: var(--md-sys-color-tertiary-container);\n        color: var(--md-sys-color-on-tertiary-container);\n      }\n\n      .integrity-check.check-failed {\n        background: var(--md-sys-color-error-container);\n        color: var(--md-sys-color-on-error-container);\n      }\n\n      .issues-section {\n        margin-top: 16px;\n      }\n\n      .section-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin: 0 0 12px 0;\n        font-size: 16px;\n      }\n\n      .error-title {\n        color: var(--md-sys-color-error);\n      }\n\n      .warning-title { color: var(--md-sys-color-secondary); }\n\n      .issue-item {\n        padding: 12px;\n        border-radius: 4px;\n        margin-bottom: 8px;\n      }\n\n      .error-item {\n        background: var(--md-sys-color-error-container);\n        color: var(--md-sys-color-on-error-container);\n        border-left: 4px solid var(--md-sys-color-error);\n      }\n\n      .warning-item { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); border-left: 4px solid var(--md-sys-color-secondary); }\n\n      .issue-header {\n        display: flex;\n        gap: 8px;\n        margin-bottom: 4px;\n      }\n\n      .issue-code {\n        font-family: monospace;\n        font-size: 12px;\n        background: rgba(0, 0, 0, 0.1);\n        padding: 2px 6px;\n        border-radius: 3px;\n      }\n\n      .issue-severity {\n        font-size: 11px;\n        text-transform: uppercase;\n        font-weight: 600;\n      }\n\n      .issue-message {\n        font-size: 14px;\n      }\n\n      .test-suite-results {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .suite-summary {\n        background: var(--md-sys-color-surface-container);\n        padding: 16px;\n        border-radius: 8px;\n      }\n\n      .summary-stats {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 16px;\n        margin-bottom: 16px;\n      }\n\n      .stat-item {\n        text-align: center;\n        padding: 12px;\n        border-radius: 4px;\n        background: var(--md-sys-color-surface);\n      }\n\n      .stat-item.passed {\n        border-left: 4px solid var(--md-sys-color-tertiary);\n      }\n\n      .stat-item.failed {\n        border-left: 4px solid var(--md-sys-color-error);\n      }\n\n      .stat-label {\n        display: block;\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n        margin-bottom: 4px;\n      }\n\n      .stat-value {\n        display: block;\n        font-size: 20px;\n        font-weight: 600;\n      }\n\n      .success-rate {\n        text-align: center;\n      }\n\n      .rate-label {\n        font-size: 14px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .rate-value {\n        font-size: 18px;\n        font-weight: 600;\n        margin-left: 8px;\n      }\n\n      .rate-value.excellent {\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .rate-value.good { color: var(--md-sys-color-secondary); }\n\n      .rate-value.poor {\n        color: var(--md-sys-color-error);\n      }\n\n      .test-result-panel {\n        margin-bottom: 8px;\n      }\n\n      .success-icon {\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .error-icon {\n        color: var(--md-sys-color-error);\n      }\n\n      .test-timing {\n        margin-left: auto;\n        font-family: monospace;\n        font-size: 12px;\n      }\n\n      .test-details {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        padding: 16px;\n      }\n\n      .test-case-info h5,\n      .quick-summary h5 {\n        margin: 0 0 8px 0;\n        color: var(--md-sys-color-primary);\n      }\n\n      .test-case-details {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .detail-item {\n        font-size: 13px;\n      }\n\n      .summary-items {\n        display: flex;\n        gap: 16px;\n        flex-wrap: wrap;\n      }\n\n      .summary-item {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 13px;\n      }\n\n      .summary-item.success {\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .summary-item.failure {\n        color: var(--md-sys-color-error);\n      }\n\n      /* Responsive adjustments */\n      @media (max-width: 1024px) {\n        .tester-grid {\n          grid-template-columns: 1fr;\n          gap: 16px;\n        }\n\n        .test-selection-panel {\n          order: 2;\n        }\n\n        .results-panel {\n          order: 1;\n        }\n      }\n    `,\n  ],\n})\nexport class RoundTripTesterComponent implements OnInit {\n  isRunning = false;\n  showTestCases = false;\n  lastTestResult: RoundTripValidationResult | null = null;\n  testSuiteResults: any = null;\n  defaultTestCases: RoundTripTestCase[] = [];\n  hasCurrentRule = false;\n\n  constructor(\n    private roundTripValidator: RoundTripValidatorService,\n    private ruleBuilderService: RuleBuilderService,\n    private snackBar: MatSnackBar,\n    private cdr: ChangeDetectorRef,\n  ) {}\n\n  ngOnInit(): void {\n    this.loadDefaultTestCases();\n    this.checkCurrentRule();\n  }\n\n  private loadDefaultTestCases(): void {\n    this.defaultTestCases = this.roundTripValidator.createDefaultTestCases();\n  }\n\n  private checkCurrentRule(): void {\n    const state = this.ruleBuilderService.getCurrentState();\n    this.hasCurrentRule = state.rootNodes.length > 0;\n  }\n\n  runCurrentRuleTest(): void {\n    if (!this.hasCurrentRule) {\n      this.snackBar.open('No rule loaded in builder', 'Close', {\n        duration: 3000,\n      });\n      return;\n    }\n\n    this.isRunning = true;\n    this.testSuiteResults = null;\n    this.cdr.detectChanges();\n\n    setTimeout(() => {\n      try {\n        const state = this.ruleBuilderService.getCurrentState();\n        if (state.rootNodes.length > 0) {\n          // Get the first root node for testing\n          const rootNodeId = state.rootNodes[0];\n          const rootNode = state.nodes[rootNodeId];\n\n          if (rootNode) {\n            // Build the complete rule tree\n            const completeRule = this.buildCompleteRuleTree(\n              rootNode,\n              state.nodes,\n            );\n            this.lastTestResult =\n              this.roundTripValidator.validateRoundTrip(completeRule);\n\n            const message = this.lastTestResult.success\n              ? 'Round-trip test passed!'\n              : 'Round-trip test failed';\n            const duration = this.lastTestResult.success ? 2000 : 4000;\n\n            this.snackBar.open(message, 'Close', { duration });\n          }\n        }\n      } catch (error) {\n        this.snackBar.open(`Test failed: ${error}`, 'Close', {\n          duration: 4000,\n        });\n      } finally {\n        this.isRunning = false;\n        this.cdr.detectChanges();\n      }\n    }, 100);\n  }\n\n  runTestSuite(): void {\n    this.isRunning = true;\n    this.lastTestResult = null;\n    this.cdr.detectChanges();\n\n    setTimeout(() => {\n      try {\n        this.testSuiteResults = this.roundTripValidator.runTestSuite(\n          this.defaultTestCases,\n        );\n\n        const message = `Test suite completed: ${this.testSuiteResults.passed}/${this.testSuiteResults.totalTests} passed`;\n        this.snackBar.open(message, 'Close', { duration: 3000 });\n      } catch (error) {\n        this.snackBar.open(`Test suite failed: ${error}`, 'Close', {\n          duration: 4000,\n        });\n      } finally {\n        this.isRunning = false;\n        this.cdr.detectChanges();\n      }\n    }, 100);\n  }\n\n  clearResults(): void {\n    this.lastTestResult = null;\n    this.testSuiteResults = null;\n    this.cdr.detectChanges();\n  }\n\n  private buildCompleteRuleTree(\n    node: RuleNode,\n    allNodes: Record<string, RuleNode>,\n  ): RuleNode {\n    return {\n      ...node,\n      children: node.children?.map((childId) => {\n        if (typeof childId === 'string') {\n          const childNode = allNodes[childId];\n          if (childNode) {\n            // Recursively build child tree but only return the ID for the children array\n            this.buildCompleteRuleTree(childNode, allNodes);\n          }\n          return childId;\n        }\n        return childId;\n      }),\n    };\n  }\n\n  getCurrentRuleType(): string {\n    const state = this.ruleBuilderService.getCurrentState();\n    if (state.rootNodes.length > 0) {\n      const rootNode = state.nodes[state.rootNodes[0]];\n      if (!rootNode) return 'Unknown';\n\n      // rootNode.type is always a string (RuleNodeType | RuleNodeTypeString)\n      return String(rootNode.type);\n    }\n    return 'None';\n  }\n\n  getCurrentRuleLabel(): string {\n    const state = this.ruleBuilderService.getCurrentState();\n    if (state.rootNodes.length > 0) {\n      const rootNode = state.nodes[state.rootNodes[0]];\n      return rootNode?.label || 'Untitled Rule';\n    }\n    return '';\n  }\n\n  getTestCaseColor(testCase: RoundTripTestCase): 'primary' | 'accent' | 'warn' {\n    const ruleType = testCase.visualRule.type;\n\n    // Handle field conditions\n    if (ruleType === 'fieldCondition') {\n      return 'primary';\n    }\n\n    // Handle boolean groups\n    if (ruleType === 'andGroup') {\n      return 'accent';\n    }\n    if (ruleType === 'orGroup') {\n      return 'accent';\n    }\n    if (ruleType === 'notGroup') {\n      return 'accent';\n    }\n    if (ruleType === 'xorGroup') {\n      return 'accent';\n    }\n    if (ruleType === 'impliesGroup') {\n      return 'accent';\n    }\n\n    // Handle function calls\n    if (ruleType === 'functionCall') {\n      return 'warn';\n    }\n\n    return 'primary';\n  }\n\n  getResultSummary(): string {\n    if (this.lastTestResult) {\n      const timing = this.lastTestResult.performance.totalTime.toFixed(2);\n      return `Single test • ${timing}ms • ${this.lastTestResult.success ? 'Passed' : 'Failed'}`;\n    }\n    if (this.testSuiteResults) {\n      return `Test suite • ${this.testSuiteResults.passed}/${this.testSuiteResults.totalTests} passed`;\n    }\n    return '';\n  }\n\n  getStatusClass(result: RoundTripValidationResult): string {\n    return result.success ? 'success' : 'failure';\n  }\n\n  getStatusIcon(result: RoundTripValidationResult): string {\n    return result.success ? 'check_circle' : 'error';\n  }\n\n  getStages(result: RoundTripValidationResult): any[] {\n    return [\n      {\n        name: 'Visual → Specification',\n        success: result.stages.visualToSpecification.success,\n        error: result.stages.visualToSpecification.error,\n        timing: result.performance.stageTimings.visualToSpecification,\n      },\n      {\n        name: 'Specification → DSL',\n        success: result.stages.specificationToDsl.success,\n        error: result.stages.specificationToDsl.error,\n        dsl: result.stages.specificationToDsl.dsl,\n        timing: result.performance.stageTimings.specificationToDsl,\n      },\n      {\n        name: 'DSL → Specification',\n        success: result.stages.dslToSpecification.success,\n        error: result.stages.dslToSpecification.error,\n        timing: result.performance.stageTimings.dslToSpecification,\n      },\n      {\n        name: 'Specification → Visual',\n        success: result.stages.specificationToVisual.success,\n        error: result.stages.specificationToVisual.error,\n        timing: result.performance.stageTimings.specificationToVisual,\n      },\n    ];\n  }\n\n  getIntegrityChecks(result: RoundTripValidationResult): any[] {\n    return [\n      {\n        name: 'Node Count Match',\n        passed: result.dataIntegrity.nodeCountMatch,\n      },\n      {\n        name: 'Structure Match',\n        passed: result.dataIntegrity.structureMatch,\n      },\n      {\n        name: 'Metadata Preserved',\n        passed: result.dataIntegrity.metadataPreserved,\n      },\n      {\n        name: 'Logic Preserved',\n        passed: result.dataIntegrity.logicPreserved,\n      },\n    ];\n  }\n\n  getSuccessRate(): number {\n    if (!this.testSuiteResults) return 0;\n    return Math.round(\n      (this.testSuiteResults.passed / this.testSuiteResults.totalTests) * 100,\n    );\n  }\n\n  getSuccessRateClass(): string {\n    const rate = this.getSuccessRate();\n    if (rate >= 90) return 'excellent';\n    if (rate >= 70) return 'good';\n    return 'poor';\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, from, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { RuleBuilderService } from './rule-builder.service';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport {\n  RuleNode,\n  RuleBuilderState,\n  ExportOptions,\n  FieldConditionConfig,\n} from '../models/rule-builder.model';\n\ninterface CompleteRuleNode extends Omit<RuleNode, 'children'> {\n  children?: CompleteRuleNode[];\n}\n\nexport interface ExportFormat {\n  id: string;\n  name: string;\n  description: string;\n  fileExtension: string;\n  mimeType: string;\n  supportsMetadata: boolean;\n  supportsComments: boolean;\n}\n\nexport interface ExportResult {\n  success: boolean;\n  content: string;\n  format: ExportFormat;\n  filename: string;\n  size: number;\n  metadata?: {\n    rulesCount: number;\n    complexity: 'low' | 'medium' | 'high';\n    exportedAt: string;\n    version: string;\n  };\n  errors?: string[];\n  warnings?: string[];\n}\n\nexport interface IntegrationEndpoint {\n  id: string;\n  name: string;\n  description: string;\n  url?: string;\n  method: 'GET' | 'POST' | 'PUT' | 'PATCH';\n  headers?: Record<string, string>;\n  authentication?: {\n    type: 'none' | 'basic' | 'bearer' | 'apikey';\n    credentials?: any;\n  };\n  supportedFormats: string[];\n  responseFormat?: 'json' | 'xml' | 'text';\n}\n\nexport interface IntegrationResult {\n  success: boolean;\n  endpoint: IntegrationEndpoint;\n  response?: any;\n  statusCode?: number;\n  error?: string;\n  timestamp: string;\n}\n\nexport interface ExternalSystemConfig {\n  id: string;\n  name: string;\n  type: 'rest-api' | 'webhook' | 'file-system' | 'database' | 'cloud-storage';\n  config: any;\n  endpoints: IntegrationEndpoint[];\n  enabled: boolean;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ExportIntegrationService {\n  private readonly SUPPORTED_FORMATS: ExportFormat[] = [\n    {\n      id: 'json',\n      name: 'JSON',\n      description:\n        'JavaScript Object Notation - Standard data interchange format',\n      fileExtension: 'json',\n      mimeType: 'application/json',\n      supportsMetadata: true,\n      supportsComments: false,\n    },\n    {\n      id: 'json-schema',\n      name: 'JSON Schema',\n      description: 'JSON Schema for validation and documentation',\n      fileExtension: 'schema.json',\n      mimeType: 'application/schema+json',\n      supportsMetadata: true,\n      supportsComments: true,\n    },\n    {\n      id: 'dsl',\n      name: 'Domain Specific Language',\n      description: 'Human-readable rule specification language',\n      fileExtension: 'dsl',\n      mimeType: 'text/plain',\n      supportsMetadata: true,\n      supportsComments: true,\n    },\n    {\n      id: 'yaml',\n      name: 'YAML',\n      description:\n        \"YAML Ain't Markup Language - Human-readable data serialization\",\n      fileExtension: 'yaml',\n      mimeType: 'application/x-yaml',\n      supportsMetadata: true,\n      supportsComments: true,\n    },\n    {\n      id: 'xml',\n      name: 'XML',\n      description: 'Extensible Markup Language',\n      fileExtension: 'xml',\n      mimeType: 'application/xml',\n      supportsMetadata: true,\n      supportsComments: true,\n    },\n    {\n      id: 'typescript',\n      name: 'TypeScript',\n      description: 'TypeScript interface definitions',\n      fileExtension: 'ts',\n      mimeType: 'text/typescript',\n      supportsMetadata: true,\n      supportsComments: true,\n    },\n    {\n      id: 'openapi',\n      name: 'OpenAPI Specification',\n      description: 'OpenAPI 3.0 specification with validation rules',\n      fileExtension: 'openapi.json',\n      mimeType: 'application/vnd.oai.openapi+json',\n      supportsMetadata: true,\n      supportsComments: false,\n    },\n    {\n      id: 'csv',\n      name: 'CSV',\n      description: 'Comma-separated values for tabular rule data',\n      fileExtension: 'csv',\n      mimeType: 'text/csv',\n      supportsMetadata: false,\n      supportsComments: false,\n    },\n  ];\n\n  private externalSystems: ExternalSystemConfig[] = [];\n\n  constructor(\n    private ruleBuilderService: RuleBuilderService,\n    private specificationBridge: SpecificationBridgeService,\n  ) {}\n\n  /**\n   * Gets all supported export formats\n   */\n  getSupportedFormats(): ExportFormat[] {\n    return [...this.SUPPORTED_FORMATS];\n  }\n\n  /**\n   * Gets a specific export format by ID\n   */\n  getFormat(formatId: string): ExportFormat | null {\n    return this.SUPPORTED_FORMATS.find((f) => f.id === formatId) || null;\n  }\n\n  /**\n   * Exports current rules in the specified format\n   */\n  exportRules(options: {\n    format: string;\n    includeMetadata?: boolean;\n    prettyPrint?: boolean;\n    includeComments?: boolean;\n    customFilename?: string;\n    downloadFile?: boolean;\n  }): Observable<ExportResult> {\n    return from(this.performExport(options));\n  }\n\n  /**\n   * Exports rules to multiple formats simultaneously\n   */\n  exportToMultipleFormats(\n    formats: string[],\n    options: any = {},\n  ): Observable<ExportResult[]> {\n    const exportPromises = formats.map((format) =>\n      this.performExport({ ...options, format }),\n    );\n\n    return from(Promise.all(exportPromises));\n  }\n\n  /**\n   * Integrates with external system\n   */\n  integrateWithSystem(\n    systemId: string,\n    endpointId: string,\n    exportFormat: string,\n    options: any = {},\n  ): Observable<IntegrationResult> {\n    return from(\n      this.performIntegration(systemId, endpointId, exportFormat, options),\n    );\n  }\n\n  /**\n   * Registers a new external system configuration\n   */\n  registerExternalSystem(config: ExternalSystemConfig): void {\n    const existingIndex = this.externalSystems.findIndex(\n      (s) => s.id === config.id,\n    );\n    if (existingIndex >= 0) {\n      this.externalSystems[existingIndex] = config;\n    } else {\n      this.externalSystems.push(config);\n    }\n  }\n\n  /**\n   * Gets all registered external systems\n   */\n  getExternalSystems(): ExternalSystemConfig[] {\n    return [...this.externalSystems];\n  }\n\n  /**\n   * Tests connectivity to an external system\n   */\n  testSystemConnectivity(\n    systemId: string,\n  ): Observable<{ success: boolean; message: string }> {\n    return from(this.performConnectivityTest(systemId));\n  }\n\n  /**\n   * Creates a shareable link for rules\n   */\n  createShareableLink(options: {\n    format: string;\n    expiration?: Date;\n    accessLevel?: 'public' | 'protected' | 'private';\n    password?: string;\n  }): Observable<{ url: string; token: string; expiresAt?: Date }> {\n    return from(this.generateShareableLink(options));\n  }\n\n  /**\n   * Imports rules from external source\n   */\n  importFromExternal(source: {\n    type: 'url' | 'file' | 'system';\n    location: string;\n    format: string;\n    authentication?: any;\n  }): Observable<{ success: boolean; imported: any; errors?: string[] }> {\n    return from(this.performExternalImport(source));\n  }\n\n  /**\n   * Private implementation methods\n   */\n  private async performExport(options: any): Promise<ExportResult> {\n    try {\n      const format = this.getFormat(options.format);\n      if (!format) {\n        throw new Error(`Unsupported export format: ${options.format}`);\n      }\n\n      const state = this.ruleBuilderService.getCurrentState();\n      const content = await this.generateContent(format, state, options);\n      const filename = options.customFilename || this.generateFilename(format);\n\n      const result: ExportResult = {\n        success: true,\n        content,\n        format,\n        filename,\n        size: new Blob([content]).size,\n        metadata: this.generateExportMetadata(state) ?? undefined,\n      };\n\n      if (options.downloadFile) {\n        this.downloadFile(content, filename, format.mimeType);\n      }\n\n      return result;\n    } catch (error) {\n      return {\n        success: false,\n        content: '',\n        format: this.getFormat(options.format)!,\n        filename: '',\n        size: 0,\n        errors: [String(error)],\n      };\n    }\n  }\n\n  private async generateContent(\n    format: ExportFormat,\n    state: RuleBuilderState,\n    options: any,\n  ): Promise<string> {\n    switch (format.id) {\n      case 'json':\n        return this.generateJson(state, options);\n\n      case 'json-schema':\n        return this.generateJsonSchema(state, options);\n\n      case 'dsl':\n        return this.generateDsl(state, options);\n\n      case 'yaml':\n        return this.generateYaml(state, options);\n\n      case 'xml':\n        return this.generateXml(state, options);\n\n      case 'typescript':\n        return this.generateTypeScript(state, options);\n\n      case 'openapi':\n        return this.generateOpenApi(state, options);\n\n      case 'csv':\n        return this.generateCsv(state, options);\n\n      default:\n        throw new Error(\n          `Content generation not implemented for format: ${format.id}`,\n        );\n    }\n  }\n\n  private generateJson(state: RuleBuilderState, options: any): string {\n    const specification = this.ruleBuilderService.toSpecification();\n    if (!specification) {\n      return '{}';\n    }\n\n    const jsonData = {\n      version: '1.0',\n      exportedAt: new Date().toISOString(),\n      metadata: options.includeMetadata\n        ? this.generateExportMetadata(state)\n        : undefined,\n      specification: specification.toJSON(),\n      visualRules: options.includeVisualRules\n        ? {\n            nodes: state.nodes,\n            rootNodes: state.rootNodes,\n          }\n        : undefined,\n    };\n\n    return options.prettyPrint\n      ? JSON.stringify(jsonData, null, 2)\n      : JSON.stringify(jsonData);\n  }\n\n  private generateJsonSchema(state: RuleBuilderState, options: any): string {\n    const schema = {\n      $schema: 'https://json-schema.org/draft/2020-12/schema',\n      $id: 'https://praxis-platform.org/schemas/rules',\n      title: 'Praxis Rules Schema',\n      description: 'Schema for Praxis rule specifications',\n      type: 'object',\n      properties: this.generateSchemaProperties(state),\n      required: this.generateSchemaRequired(state),\n      additionalProperties: false,\n    };\n\n    return options.prettyPrint\n      ? JSON.stringify(schema, null, 2)\n      : JSON.stringify(schema);\n  }\n\n  private generateDsl(state: RuleBuilderState, options: any): string {\n    const parts: string[] = [];\n\n    if (options.includeComments) {\n      parts.push('# Praxis Rules DSL Export');\n      parts.push(`# Generated at: ${new Date().toISOString()}`);\n      parts.push(`# Rules count: ${Object.keys(state.nodes).length}`);\n      parts.push('');\n    }\n\n    for (const rootNodeId of state.rootNodes) {\n      const rootNode = this.buildCompleteRuleNode(rootNodeId, state.nodes);\n      if (rootNode) {\n        try {\n          const flatNode = this.flattenCompleteRuleNode(rootNode);\n          const dsl = this.specificationBridge.exportToDsl(flatNode, {\n            includeMetadata: options.includeMetadata,\n            prettyPrint: options.prettyPrint,\n          });\n          parts.push(dsl);\n          parts.push('');\n        } catch (error) {\n          if (options.includeComments) {\n            parts.push(`# Error exporting rule ${rootNodeId}: ${error}`);\n          }\n        }\n      }\n    }\n\n    return parts.join('\\n');\n  }\n\n  private generateYaml(state: RuleBuilderState, options: any): string {\n    const data = {\n      version: '1.0',\n      exportedAt: new Date().toISOString(),\n      metadata: options.includeMetadata\n        ? this.generateExportMetadata(state)\n        : undefined,\n      rules: state.rootNodes\n        .map((nodeId) => {\n          const node = this.buildCompleteRuleNode(nodeId, state.nodes);\n          return this.convertNodeToYamlObject(node);\n        })\n        .filter(Boolean),\n    };\n\n    // Simple YAML generation (in production, use a proper YAML library)\n    return this.objectToYaml(data, 0);\n  }\n\n  private generateXml(state: RuleBuilderState, options: any): string {\n    const lines = ['<?xml version=\"1.0\" encoding=\"UTF-8\"?>'];\n\n    if (options.includeComments) {\n      lines.push('<!-- Praxis Rules XML Export -->');\n      lines.push(`<!-- Generated at: ${new Date().toISOString()} -->`);\n    }\n\n    lines.push('<praxis-rules version=\"1.0\">');\n\n    if (options.includeMetadata) {\n      const metadata = this.generateExportMetadata(state);\n      if (metadata) {\n        lines.push('  <metadata>');\n        lines.push(`    <rulesCount>${metadata.rulesCount ?? 0}</rulesCount>`);\n        lines.push(\n          `    <complexity>${metadata.complexity ?? 'unknown'}</complexity>`,\n        );\n        lines.push(`    <exportedAt>${metadata.exportedAt ?? ''}</exportedAt>`);\n        lines.push(`    <version>${metadata.version ?? ''}</version>`);\n        lines.push('  </metadata>');\n      }\n    }\n\n    lines.push('  <rules>');\n    for (const rootNodeId of state.rootNodes) {\n      const node = this.buildCompleteRuleNode(rootNodeId, state.nodes);\n      if (node) {\n        lines.push(this.nodeToXml(node, 4));\n      }\n    }\n    lines.push('  </rules>');\n    lines.push('</praxis-rules>');\n\n    return lines.join('\\n');\n  }\n\n  private generateTypeScript(state: RuleBuilderState, options: any): string {\n    const lines: string[] = [];\n\n    if (options.includeComments) {\n      lines.push('/**');\n      lines.push(' * Praxis Rules TypeScript Export');\n      lines.push(` * Generated at: ${new Date().toISOString()}`);\n      lines.push(` * Rules count: ${Object.keys(state.nodes).length}`);\n      lines.push(' */');\n      lines.push('');\n    }\n\n    lines.push('export interface PraxisRules {');\n    lines.push('  version: string;');\n    lines.push('  rules: Rule[];');\n    if (options.includeMetadata) {\n      lines.push('  metadata?: RuleMetadata;');\n    }\n    lines.push('}');\n    lines.push('');\n\n    lines.push('export interface Rule {');\n    lines.push('  id: string;');\n    lines.push('  type: RuleType;');\n    lines.push('  label?: string;');\n    lines.push('  config: RuleConfig;');\n    lines.push('  children?: Rule[];');\n    lines.push('  metadata?: ValidationMetadata;');\n    lines.push('}');\n    lines.push('');\n\n    lines.push('export type RuleType =');\n    const uniqueTypes = new Set(\n      Object.values(state.nodes).map((node) => node.type),\n    );\n    const typeArray = Array.from(uniqueTypes).map((type) => `  | '${type}'`);\n    lines.push(typeArray.join('\\n'));\n    lines.push(';');\n\n    return lines.join('\\n');\n  }\n\n  private generateOpenApi(state: RuleBuilderState, options: any): string {\n    const spec = {\n      openapi: '3.0.3',\n      info: {\n        title: 'Praxis Rules API',\n        description: 'API specification with embedded rule validations',\n        version: '1.0.0',\n      },\n      paths: {},\n      components: {\n        schemas: this.generateOpenApiSchemas(state),\n      },\n    };\n\n    return options.prettyPrint\n      ? JSON.stringify(spec, null, 2)\n      : JSON.stringify(spec);\n  }\n\n  private generateCsv(state: RuleBuilderState, options: any): string {\n    const headers = [\n      'ID',\n      'Type',\n      'Label',\n      'Field',\n      'Operator',\n      'Value',\n      'Parent ID',\n    ];\n    const rows: string[][] = [headers];\n\n    const processNode = (node: CompleteRuleNode, parentId?: string) => {\n      let field = '';\n      let operator = '';\n      let value = '';\n\n      if (\n        node.type === 'fieldCondition' &&\n        node.config &&\n        'fieldName' in node.config\n      ) {\n        const cfg = node.config as FieldConditionConfig;\n        field = cfg.fieldName || cfg.field || '';\n        operator = String(cfg.operator ?? '');\n        value = cfg.value !== undefined ? String(cfg.value) : '';\n      }\n\n      const row = [\n        node.id,\n        node.type,\n        node.label || '',\n        field,\n        operator,\n        value,\n        parentId || '',\n      ];\n      rows.push(row);\n\n      node.children?.forEach((child) => {\n        processNode(child, node.id);\n      });\n    };\n\n    for (const rootNodeId of state.rootNodes) {\n      const node = this.buildCompleteRuleNode(rootNodeId, state.nodes);\n      if (node) {\n        processNode(node);\n      }\n    }\n\n    return rows\n      .map((row) =>\n        row.map((cell) => `\"${cell.replace(/\"/g, '\"\"')}\"`).join(','),\n      )\n      .join('\\n');\n  }\n\n  private async performIntegration(\n    systemId: string,\n    endpointId: string,\n    exportFormat: string,\n    options: any,\n  ): Promise<IntegrationResult> {\n    try {\n      const system = this.externalSystems.find((s) => s.id === systemId);\n      if (!system) {\n        throw new Error(`External system not found: ${systemId}`);\n      }\n\n      const endpoint = system.endpoints.find((e) => e.id === endpointId);\n      if (!endpoint) {\n        throw new Error(`Endpoint not found: ${endpointId}`);\n      }\n\n      const exportResult = await this.performExport({\n        format: exportFormat,\n        ...options,\n      });\n      if (!exportResult.success) {\n        throw new Error(`Export failed: ${exportResult.errors?.join(', ')}`);\n      }\n\n      const response = await this.sendToEndpoint(\n        endpoint,\n        exportResult.content,\n        exportFormat,\n      );\n\n      return {\n        success: true,\n        endpoint,\n        response,\n        statusCode: response.status,\n        timestamp: new Date().toISOString(),\n      };\n    } catch (error) {\n      return {\n        success: false,\n        endpoint: {} as IntegrationEndpoint,\n        error: String(error),\n        timestamp: new Date().toISOString(),\n      };\n    }\n  }\n\n  private async sendToEndpoint(\n    endpoint: IntegrationEndpoint,\n    content: string,\n    format: string,\n  ): Promise<any> {\n    if (!endpoint.url) {\n      throw new Error('Endpoint URL is required');\n    }\n\n    const headers: Record<string, string> = {\n      'Content-Type': this.getFormat(format)?.mimeType || 'application/json',\n      ...endpoint.headers,\n    };\n\n    // Add authentication headers if configured\n    if (endpoint.authentication) {\n      switch (endpoint.authentication.type) {\n        case 'bearer':\n          headers['Authorization'] =\n            `Bearer ${endpoint.authentication.credentials.token}`;\n          break;\n        case 'basic':\n          const encoded = btoa(\n            `${endpoint.authentication.credentials.username}:${endpoint.authentication.credentials.password}`,\n          );\n          headers['Authorization'] = `Basic ${encoded}`;\n          break;\n        case 'apikey':\n          headers[endpoint.authentication.credentials.headerName] =\n            endpoint.authentication.credentials.apiKey;\n          break;\n      }\n    }\n\n    const response = await fetch(endpoint.url, {\n      method: endpoint.method,\n      headers,\n      body: endpoint.method !== 'GET' ? content : undefined,\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    return {\n      status: response.status,\n      data: await response.text(),\n    };\n  }\n\n  private async performConnectivityTest(\n    systemId: string,\n  ): Promise<{ success: boolean; message: string }> {\n    try {\n      const system = this.externalSystems.find((s) => s.id === systemId);\n      if (!system) {\n        return { success: false, message: `System not found: ${systemId}` };\n      }\n\n      // Test first available endpoint\n      if (system.endpoints.length === 0) {\n        return { success: false, message: 'No endpoints configured' };\n      }\n\n      const endpoint = system.endpoints[0];\n      if (!endpoint.url) {\n        return { success: false, message: 'No URL configured for endpoint' };\n      }\n\n      const response = await fetch(endpoint.url, { method: 'HEAD' });\n      return {\n        success: response.ok,\n        message: response.ok\n          ? 'Connection successful'\n          : `HTTP ${response.status}`,\n      };\n    } catch (error) {\n      return { success: false, message: String(error) };\n    }\n  }\n\n  private async generateShareableLink(\n    options: any,\n  ): Promise<{ url: string; token: string; expiresAt?: Date }> {\n    // Mock implementation - in production, this would integrate with a sharing service\n    const token = this.generateToken();\n    const baseUrl = window.location.origin;\n    const url = `${baseUrl}/shared/${token}`;\n\n    return {\n      url,\n      token,\n      expiresAt: options.expiration,\n    };\n  }\n\n  private async performExternalImport(\n    source: any,\n  ): Promise<{ success: boolean; imported: any; errors?: string[] }> {\n    try {\n      let content: string;\n\n      switch (source.type) {\n        case 'url':\n          const response = await fetch(source.location);\n          content = await response.text();\n          break;\n\n        case 'file':\n          // Would be handled by file input in the UI\n          content = source.location;\n          break;\n\n        default:\n          throw new Error(`Unsupported import source type: ${source.type}`);\n      }\n\n      this.ruleBuilderService.import(content, { format: source.format });\n\n      return {\n        success: true,\n        imported: { contentLength: content.length, format: source.format },\n      };\n    } catch (error) {\n      return {\n        success: false,\n        imported: null,\n        errors: [String(error)],\n      };\n    }\n  }\n\n  // Utility methods\n\n  private buildCompleteRuleNode(\n    nodeId: string,\n    allNodes: Record<string, RuleNode>,\n  ): CompleteRuleNode | null {\n    const node = allNodes[nodeId];\n    if (!node) return null;\n\n    const childNodes = node.children\n      ?.map((childId) => this.buildCompleteRuleNode(childId, allNodes))\n      .filter((c): c is CompleteRuleNode => !!c);\n\n    return {\n      ...node,\n      children: childNodes && childNodes.length > 0 ? childNodes : undefined,\n    };\n  }\n\n  private flattenCompleteRuleNode(completeNode: CompleteRuleNode): RuleNode {\n    return {\n      ...completeNode,\n      children: completeNode.children?.map(child => child.id),\n    };\n  }\n\n  private generateExportMetadata(state: RuleBuilderState | undefined): {\n    rulesCount: number;\n    complexity: 'low' | 'medium' | 'high';\n    exportedAt: string;\n    version: string;\n  } | null {\n    if (!state || !state.nodes) {\n      return null;\n    }\n\n    const rulesCount = Object.keys(state.nodes).length;\n    const complexity =\n      rulesCount > 20 ? 'high' : rulesCount > 10 ? 'medium' : 'low';\n\n    return {\n      rulesCount,\n      complexity: complexity as 'low' | 'medium' | 'high',\n      exportedAt: new Date().toISOString(),\n      version: '1.0.0',\n    };\n  }\n\n  private generateFilename(format: ExportFormat): string {\n    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n    return `praxis-rules-${timestamp}.${format.fileExtension}`;\n  }\n\n  private downloadFile(\n    content: string,\n    filename: string,\n    mimeType: string,\n  ): void {\n    const blob = new Blob([content], { type: mimeType });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = filename;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n  }\n\n  private generateToken(): string {\n    return Array.from(crypto.getRandomValues(new Uint8Array(16)))\n      .map((b) => b.toString(16).padStart(2, '0'))\n      .join('');\n  }\n\n  // Additional helper methods for specific format generation...\n  private generateSchemaProperties(state: RuleBuilderState): any {\n    // Implementation for JSON Schema properties\n    return {};\n  }\n\n  private generateSchemaRequired(state: RuleBuilderState): string[] {\n    // Implementation for JSON Schema required fields\n    return [];\n  }\n\n  private convertNodeToYamlObject(node: CompleteRuleNode | null): any {\n    if (!node) return null;\n    return {\n      id: node.id,\n      type: node.type,\n      label: node.label,\n      config: node.config,\n      children: node.children\n        ?.map((child) => this.convertNodeToYamlObject(child))\n        .filter(Boolean),\n      metadata: node.metadata,\n    };\n  }\n\n  private objectToYaml(obj: any, indent: number): string {\n    // Simple YAML serialization - use proper YAML library in production\n    const spaces = '  '.repeat(indent);\n    let result = '';\n\n    for (const [key, value] of Object.entries(obj)) {\n      if (value === undefined) continue;\n\n      result += `${spaces}${key}:`;\n\n      if (typeof value === 'object' && value !== null) {\n        if (Array.isArray(value)) {\n          result += '\\n';\n          value.forEach((item) => {\n            result += `${spaces}  - `;\n            if (typeof item === 'object') {\n              result += '\\n' + this.objectToYaml(item, indent + 2);\n            } else {\n              result += `${item}\\n`;\n            }\n          });\n        } else {\n          result += '\\n' + this.objectToYaml(value, indent + 1);\n        }\n      } else {\n        result += ` ${value}\\n`;\n      }\n    }\n\n    return result;\n  }\n\n  private nodeToXml(node: CompleteRuleNode, indent: number): string {\n    const spaces = ' '.repeat(indent);\n    let xml = `${spaces}<rule id=\"${node.id}\" type=\"${node.type}\">`;\n\n    if (node.label) {\n      xml += `\\n${spaces}  <label>${this.escapeXml(node.label)}</label>`;\n    }\n\n    if (node.config) {\n      xml += `\\n${spaces}  <config>${this.escapeXml(JSON.stringify(node.config))}</config>`;\n    }\n\n    if (node.children && node.children.length > 0) {\n      xml += `\\n${spaces}  <children>`;\n      node.children.forEach((child) => {\n        xml += '\\n' + this.nodeToXml(child, indent + 4);\n      });\n      xml += `\\n${spaces}  </children>`;\n    }\n\n    xml += `\\n${spaces}</rule>`;\n    return xml;\n  }\n\n  private escapeXml(text: string): string {\n    return text\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  private generateOpenApiSchemas(state: RuleBuilderState): any {\n    // Implementation for OpenAPI schema generation\n    return {\n      Rule: {\n        type: 'object',\n        properties: {\n          id: { type: 'string' },\n          type: { type: 'string' },\n          label: { type: 'string' },\n          config: { type: 'object' },\n        },\n      },\n    };\n  }\n}\n","import {\n  Component,\n  Inject,\n  OnInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  ReactiveFormsModule,\n  FormBuilder,\n  FormGroup,\n  Validators,\n  FormsModule,\n} from '@angular/forms';\nimport {\n  MatDialogModule,\n  MatDialogRef,\n  MAT_DIALOG_DATA,\n} from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\n\nimport {\n  ExportIntegrationService,\n  ExportFormat,\n  ExportResult,\n  ExternalSystemConfig,\n  IntegrationEndpoint,\n} from '../services/export-integration.service';\n\nexport interface ExportDialogData {\n  title?: string;\n  allowMultipleFormats?: boolean;\n  preselectedFormat?: string;\n  showIntegrationTab?: boolean;\n  showSharingTab?: boolean;\n}\n\n@Component({\n  selector: 'praxis-export-dialog',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    MatDialogModule,\n    MatButtonModule,\n    MatIconModule,\n    MatTabsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatSlideToggleModule,\n    MatProgressBarModule,\n    MatSnackBarModule,\n    MatListModule,\n    MatDividerModule,\n    MatCardModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatExpansionModule,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"export-dialog\">\n      <div mat-dialog-title class=\"dialog-header\">\n        <mat-icon>download</mat-icon>\n        <span>{{ data.title || 'Export Rules' }}</span>\n      </div>\n\n      <div mat-dialog-content class=\"dialog-content\">\n        <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n          <!-- Export Tab -->\n          <mat-tab label=\"Export\">\n            <div class=\"tab-content\">\n              <form [formGroup]=\"exportForm\" class=\"export-form\">\n                <!-- Format Selection -->\n                <div class=\"section\">\n                  <h3 class=\"section-title\">Export Format</h3>\n\n                  <div class=\"format-grid\">\n                    <mat-card\n                      *ngFor=\"let format of supportedFormats\"\n                      class=\"format-card\"\n                      [class.selected]=\"isFormatSelected(format.id)\"\n                      (click)=\"selectFormat(format.id)\"\n                    >\n                      <mat-card-header>\n                        <mat-card-title>{{ format.name }}</mat-card-title>\n                        <mat-card-subtitle>{{\n                          format.fileExtension\n                        }}</mat-card-subtitle>\n                      </mat-card-header>\n\n                      <mat-card-content>\n                        <p class=\"format-description\">\n                          {{ format.description }}\n                        </p>\n\n                        <div class=\"format-features\">\n                          <mat-chip\n                            *ngIf=\"format.supportsMetadata\"\n                            color=\"primary\"\n                            size=\"small\"\n                          >\n                            Metadata\n                          </mat-chip>\n                          <mat-chip\n                            *ngIf=\"format.supportsComments\"\n                            color=\"accent\"\n                            size=\"small\"\n                          >\n                            Comments\n                          </mat-chip>\n                        </div>\n                      </mat-card-content>\n                    </mat-card>\n                  </div>\n                </div>\n\n                <mat-divider></mat-divider>\n\n                <!-- Export Options -->\n                <div class=\"section\">\n                  <h3 class=\"section-title\">Options</h3>\n\n                  <div class=\"options-grid\">\n                    <mat-slide-toggle formControlName=\"includeMetadata\">\n                      Include Metadata\n                    </mat-slide-toggle>\n\n                    <mat-slide-toggle formControlName=\"prettyPrint\">\n                      Pretty Print\n                    </mat-slide-toggle>\n\n                    <mat-slide-toggle\n                      formControlName=\"includeComments\"\n                      [disabled]=\"!selectedFormat?.supportsComments\"\n                    >\n                      Include Comments\n                    </mat-slide-toggle>\n\n                    <mat-slide-toggle formControlName=\"includeVisualRules\">\n                      Include Visual Rules\n                    </mat-slide-toggle>\n                  </div>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Custom Filename</mat-label>\n                    <input\n                      matInput\n                      formControlName=\"customFilename\"\n                      placeholder=\"Leave empty for auto-generated\"\n                    />\n                    <mat-hint>Will be auto-generated if not specified</mat-hint>\n                  </mat-form-field>\n                </div>\n\n                <mat-divider></mat-divider>\n\n                <!-- Multiple Format Export -->\n                <div class=\"section\" *ngIf=\"data.allowMultipleFormats\">\n                  <h3 class=\"section-title\">Batch Export</h3>\n\n                  <mat-slide-toggle\n                    [(ngModel)]=\"enableBatchExport\"\n                    [ngModelOptions]=\"{ standalone: true }\"\n                  >\n                    Export to Multiple Formats\n                  </mat-slide-toggle>\n\n                  <div *ngIf=\"enableBatchExport\" class=\"batch-formats\">\n                    <mat-form-field appearance=\"outline\" class=\"full-width\">\n                      <mat-label>Additional Formats</mat-label>\n                      <mat-select multiple formControlName=\"additionalFormats\">\n                        <mat-option\n                          *ngFor=\"let format of supportedFormats\"\n                          [value]=\"format.id\"\n                          [disabled]=\"format.id === selectedFormat?.id\"\n                        >\n                          {{ format.name }}\n                        </mat-option>\n                      </mat-select>\n                    </mat-form-field>\n                  </div>\n                </div>\n              </form>\n\n              <!-- Export Results -->\n              <div *ngIf=\"exportResults.length > 0\" class=\"export-results\">\n                <h3 class=\"section-title\">Export Results</h3>\n\n                <mat-expansion-panel\n                  *ngFor=\"let result of exportResults\"\n                  class=\"result-panel\"\n                >\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      <mat-icon\n                        [class]=\"result.success ? 'success-icon' : 'error-icon'\"\n                      >\n                        {{ result.success ? 'check_circle' : 'error' }}\n                      </mat-icon>\n                      {{ result.format.name }}\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      {{ result.filename }} ({{ formatFileSize(result.size) }})\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"result-details\">\n                    <div *ngIf=\"result.success\" class=\"success-details\">\n                      <div class=\"detail-row\">\n                        <strong>File Size:</strong>\n                        {{ formatFileSize(result.size) }}\n                      </div>\n                      <div class=\"detail-row\" *ngIf=\"result.metadata\">\n                        <strong>Rules Count:</strong>\n                        {{ result.metadata.rulesCount }}\n                      </div>\n                      <div class=\"detail-row\" *ngIf=\"result.metadata\">\n                        <strong>Complexity:</strong>\n                        {{ result.metadata.complexity }}\n                      </div>\n\n                      <div class=\"action-buttons\">\n                        <button mat-button (click)=\"downloadResult(result)\">\n                          <mat-icon>download</mat-icon>\n                          Download\n                        </button>\n                        <button mat-button (click)=\"previewResult(result)\">\n                          <mat-icon>preview</mat-icon>\n                          Preview\n                        </button>\n                        <button\n                          mat-button\n                          (click)=\"copyToClipboard(result.content)\"\n                        >\n                          <mat-icon>content_copy</mat-icon>\n                          Copy\n                        </button>\n                      </div>\n                    </div>\n\n                    <div *ngIf=\"!result.success\" class=\"error-details\">\n                      <div class=\"error-list\">\n                        <div\n                          *ngFor=\"let error of result.errors\"\n                          class=\"error-item\"\n                        >\n                          {{ error }}\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n              </div>\n            </div>\n          </mat-tab>\n\n          <!-- Integration Tab -->\n          <mat-tab label=\"Integration\" *ngIf=\"data.showIntegrationTab\">\n            <div class=\"tab-content\">\n              <form [formGroup]=\"integrationForm\" class=\"integration-form\">\n                <!-- System Selection -->\n                <div class=\"section\">\n                  <h3 class=\"section-title\">External System</h3>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Select System</mat-label>\n                    <mat-select\n                      formControlName=\"systemId\"\n                      (selectionChange)=\"onSystemChange($event)\"\n                    >\n                      <mat-option\n                        *ngFor=\"let system of externalSystems\"\n                        [value]=\"system.id\"\n                      >\n                        {{ system.name }}\n                      </mat-option>\n                    </mat-select>\n                  </mat-form-field>\n\n                  <div *ngIf=\"selectedSystem\" class=\"system-info\">\n                    <mat-card class=\"info-card\">\n                      <mat-card-content>\n                        <div class=\"system-details\">\n                          <div class=\"detail-row\">\n                            <strong>Type:</strong> {{ selectedSystem.type }}\n                          </div>\n                          <div class=\"detail-row\">\n                            <strong>Status:</strong>\n                            <mat-chip\n                              [color]=\"\n                                selectedSystem.enabled ? 'primary' : 'warn'\n                              \"\n                              size=\"small\"\n                            >\n                              {{\n                                selectedSystem.enabled ? 'Enabled' : 'Disabled'\n                              }}\n                            </mat-chip>\n                          </div>\n                          <div class=\"detail-row\">\n                            <strong>Endpoints:</strong>\n                            {{ selectedSystem.endpoints.length }}\n                          </div>\n                        </div>\n\n                        <button\n                          mat-button\n                          color=\"primary\"\n                          (click)=\"testConnectivity()\"\n                          [disabled]=\"isTestingConnectivity\"\n                        >\n                          <mat-icon>wifi</mat-icon>\n                          {{\n                            isTestingConnectivity\n                              ? 'Testing...'\n                              : 'Test Connection'\n                          }}\n                        </button>\n                      </mat-card-content>\n                    </mat-card>\n                  </div>\n                </div>\n\n                <!-- Endpoint Selection -->\n                <div class=\"section\" *ngIf=\"selectedSystem\">\n                  <h3 class=\"section-title\">Endpoint</h3>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Select Endpoint</mat-label>\n                    <mat-select formControlName=\"endpointId\">\n                      <mat-option\n                        *ngFor=\"let endpoint of selectedSystem.endpoints\"\n                        [value]=\"endpoint.id\"\n                      >\n                        {{ endpoint.name }} ({{ endpoint.method }})\n                      </mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                </div>\n\n                <!-- Format for Integration -->\n                <div class=\"section\">\n                  <h3 class=\"section-title\">Export Format for Integration</h3>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Format</mat-label>\n                    <mat-select formControlName=\"integrationFormat\">\n                      <mat-option\n                        *ngFor=\"let format of supportedFormats\"\n                        [value]=\"format.id\"\n                      >\n                        {{ format.name }}\n                      </mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                </div>\n              </form>\n\n              <!-- Integration Results -->\n              <div\n                *ngIf=\"integrationResults.length > 0\"\n                class=\"integration-results\"\n              >\n                <h3 class=\"section-title\">Integration Results</h3>\n\n                <div\n                  *ngFor=\"let result of integrationResults\"\n                  class=\"integration-result\"\n                >\n                  <mat-card\n                    [class]=\"result.success ? 'success-card' : 'error-card'\"\n                  >\n                    <mat-card-header>\n                      <mat-card-title>\n                        <mat-icon>{{\n                          result.success ? 'check_circle' : 'error'\n                        }}</mat-icon>\n                        {{ result.endpoint.name }}\n                      </mat-card-title>\n                      <mat-card-subtitle>\n                        {{ result.timestamp | date: 'medium' }}\n                      </mat-card-subtitle>\n                    </mat-card-header>\n\n                    <mat-card-content>\n                      <div *ngIf=\"result.success\" class=\"success-content\">\n                        <div class=\"detail-row\">\n                          <strong>Status Code:</strong> {{ result.statusCode }}\n                        </div>\n                        <div class=\"detail-row\" *ngIf=\"result.response\">\n                          <strong>Response:</strong> {{ result.response.data }}\n                        </div>\n                      </div>\n\n                      <div *ngIf=\"!result.success\" class=\"error-content\">\n                        <div class=\"error-message\">{{ result.error }}</div>\n                      </div>\n                    </mat-card-content>\n                  </mat-card>\n                </div>\n              </div>\n            </div>\n          </mat-tab>\n\n          <!-- Sharing Tab -->\n          <mat-tab label=\"Sharing\" *ngIf=\"data.showSharingTab\">\n            <div class=\"tab-content\">\n              <form [formGroup]=\"sharingForm\" class=\"sharing-form\">\n                <div class=\"section\">\n                  <h3 class=\"section-title\">Create Shareable Link</h3>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Share Format</mat-label>\n                    <mat-select formControlName=\"shareFormat\">\n                      <mat-option\n                        *ngFor=\"let format of supportedFormats\"\n                        [value]=\"format.id\"\n                      >\n                        {{ format.name }}\n                      </mat-option>\n                    </mat-select>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Access Level</mat-label>\n                    <mat-select formControlName=\"accessLevel\">\n                      <mat-option value=\"public\">Public</mat-option>\n                      <mat-option value=\"protected\">Protected</mat-option>\n                      <mat-option value=\"private\">Private</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\" class=\"full-width\">\n                    <mat-label>Expiration Date</mat-label>\n                    <input\n                      matInput\n                      type=\"datetime-local\"\n                      formControlName=\"expirationDate\"\n                    />\n                  </mat-form-field>\n\n                  <mat-form-field\n                    appearance=\"outline\"\n                    class=\"full-width\"\n                    *ngIf=\"\n                      sharingForm.get('accessLevel')?.value === 'protected'\n                    \"\n                  >\n                    <mat-label>Password</mat-label>\n                    <input\n                      matInput\n                      type=\"password\"\n                      formControlName=\"password\"\n                    />\n                  </mat-form-field>\n                </div>\n              </form>\n\n              <!-- Share Results -->\n              <div *ngIf=\"shareResult\" class=\"share-result\">\n                <mat-card class=\"share-card\">\n                  <mat-card-header>\n                    <mat-card-title>Shareable Link Created</mat-card-title>\n                  </mat-card-header>\n\n                  <mat-card-content>\n                    <div class=\"share-url\">\n                      <mat-form-field appearance=\"outline\" class=\"full-width\">\n                        <mat-label>Share URL</mat-label>\n                        <input matInput [value]=\"shareResult.url\" readonly />\n                        <button\n                          matSuffix\n                          mat-icon-button\n                          (click)=\"copyShareUrl()\"\n                        >\n                          <mat-icon>content_copy</mat-icon>\n                        </button>\n                      </mat-form-field>\n                    </div>\n\n                    <div class=\"share-details\">\n                      <div class=\"detail-row\">\n                        <strong>Token:</strong> {{ shareResult.token }}\n                      </div>\n                      <div class=\"detail-row\" *ngIf=\"shareResult.expiresAt\">\n                        <strong>Expires:</strong>\n                        {{ shareResult.expiresAt | date: 'medium' }}\n                      </div>\n                    </div>\n                  </mat-card-content>\n                </mat-card>\n              </div>\n            </div>\n          </mat-tab>\n        </mat-tab-group>\n      </div>\n\n      <div mat-dialog-actions class=\"dialog-actions\">\n        <button mat-button (click)=\"onCancel()\">Cancel</button>\n\n        <div class=\"action-buttons\">\n          <button\n            mat-button\n            color=\"primary\"\n            [disabled]=\"!canExport()\"\n            (click)=\"onExport()\"\n            *ngIf=\"activeTabIndex === 0\"\n          >\n            <mat-icon>download</mat-icon>\n            Export\n          </button>\n\n          <button\n            mat-button\n            color=\"primary\"\n            [disabled]=\"!canIntegrate()\"\n            (click)=\"onIntegrate()\"\n            *ngIf=\"activeTabIndex === 1\"\n          >\n            <mat-icon>send</mat-icon>\n            Integrate\n          </button>\n\n          <button\n            mat-button\n            color=\"primary\"\n            [disabled]=\"!canShare()\"\n            (click)=\"onCreateShare()\"\n            *ngIf=\"activeTabIndex === 2\"\n          >\n            <mat-icon>share</mat-icon>\n            Create Link\n          </button>\n        </div>\n      </div>\n\n      <!-- Progress Bar -->\n      <mat-progress-bar\n        *ngIf=\"isProcessing\"\n        mode=\"indeterminate\"\n        class=\"progress-bar\"\n      >\n      </mat-progress-bar>\n    </div>\n  `,\n  styles: [\n    `\n      .export-dialog {\n        width: 800px;\n        max-width: 90vw;\n        max-height: 90vh;\n        display: flex;\n        flex-direction: column;\n      }\n\n      .dialog-header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-weight: 500;\n      }\n\n      .dialog-content {\n        flex: 1;\n        overflow: hidden;\n      }\n\n      .tab-content {\n        padding: 16px 0;\n        height: 60vh;\n        overflow-y: auto;\n      }\n\n      .section {\n        margin-bottom: 24px;\n      }\n\n      .section-title {\n        margin: 0 0 16px 0;\n        color: var(--md-sys-color-primary);\n        font-size: 16px;\n        font-weight: 500;\n      }\n\n      .format-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n        gap: 16px;\n        margin-bottom: 16px;\n      }\n\n      .format-card {\n        cursor: pointer;\n        transition: all 0.2s ease;\n        border: 2px solid transparent;\n      }\n\n      .format-card:hover {\n        border-color: var(--md-sys-color-primary-container);\n        box-shadow: 0 4px 8px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n      }\n\n      .format-card.selected { border-color: var(--md-sys-color-primary); background: var(--md-sys-color-primary-container); }\n\n      .format-description {\n        font-size: 13px;\n        color: var(--md-sys-color-on-surface-variant);\n        margin: 8px 0;\n        min-height: 40px;\n      }\n\n      .format-features {\n        display: flex;\n        gap: 4px;\n        flex-wrap: wrap;\n      }\n\n      .options-grid {\n        display: grid;\n        grid-template-columns: repeat(2, 1fr);\n        gap: 16px;\n        margin-bottom: 16px;\n      }\n\n      .full-width {\n        width: 100%;\n      }\n\n      .batch-formats {\n        margin-top: 16px;\n      }\n\n      .export-results,\n      .integration-results {\n        margin-top: 24px;\n      }\n\n      .result-panel {\n        margin-bottom: 8px;\n      }\n\n      .success-icon { color: var(--md-sys-color-tertiary); }\n\n      .error-icon { color: var(--md-sys-color-error); }\n\n      .result-details {\n        padding: 16px 0;\n      }\n\n      .detail-row {\n        margin-bottom: 8px;\n        font-size: 14px;\n      }\n\n      .action-buttons {\n        display: flex;\n        gap: 8px;\n        margin-top: 16px;\n      }\n\n      .error-details { color: var(--md-sys-color-error); }\n\n      .error-item { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); padding: 8px; border-radius: 4px; margin-bottom: 4px; }\n\n      .system-info {\n        margin-top: 16px;\n      }\n\n      .info-card { background: var(--md-sys-color-surface-variant); }\n\n      .system-details {\n        margin-bottom: 16px;\n      }\n\n      .integration-result {\n        margin-bottom: 16px;\n      }\n\n      .success-card { border-left: 4px solid var(--md-sys-color-tertiary); }\n\n      .error-card { border-left: 4px solid var(--md-sys-color-error); }\n\n      .sharing-form {\n        max-width: 400px;\n      }\n\n      .share-card { margin-top: 16px; border-left: 4px solid var(--md-sys-color-primary); }\n\n      .share-url {\n        margin-bottom: 16px;\n      }\n\n      .dialog-actions {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 16px 24px;\n      }\n\n      .dialog-actions .action-buttons {\n        display: flex;\n        gap: 8px;\n      }\n\n      .progress-bar {\n        position: absolute;\n        bottom: 0;\n        left: 0;\n        right: 0;\n      }\n\n      /* Responsive adjustments */\n      @media (max-width: 768px) {\n        .export-dialog {\n          width: 100vw;\n          height: 100vh;\n          max-width: none;\n          max-height: none;\n        }\n\n        .format-grid {\n          grid-template-columns: 1fr;\n        }\n\n        .options-grid {\n          grid-template-columns: 1fr;\n        }\n      }\n    `,\n  ],\n})\nexport class ExportDialogComponent implements OnInit {\n  exportForm: FormGroup;\n  integrationForm: FormGroup;\n  sharingForm: FormGroup;\n\n  activeTabIndex = 0;\n  isProcessing = false;\n  enableBatchExport = false;\n  isTestingConnectivity = false;\n\n  supportedFormats: ExportFormat[] = [];\n  selectedFormat: ExportFormat | null = null;\n  externalSystems: ExternalSystemConfig[] = [];\n  selectedSystem: ExternalSystemConfig | null = null;\n\n  exportResults: ExportResult[] = [];\n  integrationResults: any[] = [];\n  shareResult: any = null;\n\n  constructor(\n    public dialogRef: MatDialogRef<ExportDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: ExportDialogData,\n    private fb: FormBuilder,\n    private exportService: ExportIntegrationService,\n    private snackBar: MatSnackBar,\n    private cdr: ChangeDetectorRef,\n  ) {\n    this.exportForm = this.createExportForm();\n    this.integrationForm = this.createIntegrationForm();\n    this.sharingForm = this.createSharingForm();\n  }\n\n  ngOnInit(): void {\n    this.loadSupportedFormats();\n    this.loadExternalSystems();\n\n    if (this.data.preselectedFormat) {\n      this.selectFormat(this.data.preselectedFormat);\n    }\n  }\n\n  private createExportForm(): FormGroup {\n    return this.fb.group({\n      includeMetadata: [true],\n      prettyPrint: [true],\n      includeComments: [false],\n      includeVisualRules: [false],\n      customFilename: [''],\n      additionalFormats: [[]],\n    });\n  }\n\n  private createIntegrationForm(): FormGroup {\n    return this.fb.group({\n      systemId: ['', Validators.required],\n      endpointId: ['', Validators.required],\n      integrationFormat: ['json', Validators.required],\n    });\n  }\n\n  private createSharingForm(): FormGroup {\n    return this.fb.group({\n      shareFormat: ['json', Validators.required],\n      accessLevel: ['public', Validators.required],\n      expirationDate: [''],\n      password: [''],\n    });\n  }\n\n  private loadSupportedFormats(): void {\n    this.supportedFormats = this.exportService.getSupportedFormats();\n  }\n\n  private loadExternalSystems(): void {\n    this.externalSystems = this.exportService.getExternalSystems();\n  }\n\n  selectFormat(formatId: string): void {\n    this.selectedFormat = this.exportService.getFormat(formatId);\n\n    // Update form controls based on format capabilities\n    if (this.selectedFormat) {\n      if (!this.selectedFormat.supportsComments) {\n        this.exportForm.patchValue({ includeComments: false });\n      }\n    }\n  }\n\n  isFormatSelected(formatId: string): boolean {\n    return this.selectedFormat?.id === formatId;\n  }\n\n  onSystemChange(event: MatSelectChange): void {\n    const systemId = event.value;\n    this.selectedSystem =\n      this.externalSystems.find((s) => s.id === systemId) || null;\n    this.integrationForm.patchValue({ endpointId: '' });\n  }\n\n  async testConnectivity(): Promise<void> {\n    if (!this.selectedSystem) return;\n\n    this.isTestingConnectivity = true;\n    this.cdr.detectChanges();\n\n    try {\n      const result = await this.exportService\n        .testSystemConnectivity(this.selectedSystem.id)\n        .toPromise();\n      const message = result?.success\n        ? 'Connection successful!'\n        : `Connection failed: ${result?.message}`;\n      const duration = result?.success ? 2000 : 4000;\n\n      this.snackBar.open(message, 'Close', { duration });\n    } catch (error) {\n      this.snackBar.open(`Connection test failed: ${error}`, 'Close', {\n        duration: 4000,\n      });\n    } finally {\n      this.isTestingConnectivity = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  async onExport(): Promise<void> {\n    if (!this.canExport()) return;\n\n    this.isProcessing = true;\n    this.exportResults = [];\n    this.cdr.detectChanges();\n\n    try {\n      const formValue = this.exportForm.value;\n      const formats = this.enableBatchExport\n        ? [this.selectedFormat!.id, ...formValue.additionalFormats]\n        : [this.selectedFormat!.id];\n\n      const results = await this.exportService\n        .exportToMultipleFormats(formats, {\n          includeMetadata: formValue.includeMetadata,\n          prettyPrint: formValue.prettyPrint,\n          includeComments: formValue.includeComments,\n          includeVisualRules: formValue.includeVisualRules,\n          customFilename: formValue.customFilename,\n          downloadFile: true,\n        })\n        .toPromise();\n\n      this.exportResults = results || [];\n\n      const successCount = this.exportResults.filter((r) => r.success).length;\n      this.snackBar.open(\n        `Successfully exported ${successCount}/${this.exportResults.length} files`,\n        'Close',\n        { duration: 3000 },\n      );\n    } catch (error) {\n      this.snackBar.open(`Export failed: ${error}`, 'Close', {\n        duration: 4000,\n      });\n    } finally {\n      this.isProcessing = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  async onIntegrate(): Promise<void> {\n    if (!this.canIntegrate()) return;\n\n    this.isProcessing = true;\n    this.cdr.detectChanges();\n\n    try {\n      const formValue = this.integrationForm.value;\n      const result = await this.exportService\n        .integrateWithSystem(\n          formValue.systemId,\n          formValue.endpointId,\n          formValue.integrationFormat,\n        )\n        .toPromise();\n\n      if (result) {\n        this.integrationResults.push(result);\n        const message = result.success\n          ? 'Integration successful!'\n          : `Integration failed: ${result.error}`;\n        this.snackBar.open(message, 'Close', { duration: 3000 });\n      }\n    } catch (error) {\n      this.snackBar.open(`Integration failed: ${error}`, 'Close', {\n        duration: 4000,\n      });\n    } finally {\n      this.isProcessing = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  async onCreateShare(): Promise<void> {\n    if (!this.canShare()) return;\n\n    this.isProcessing = true;\n    this.cdr.detectChanges();\n\n    try {\n      const formValue = this.sharingForm.value;\n      const options = {\n        format: formValue.shareFormat,\n        accessLevel: formValue.accessLevel,\n        expiration: formValue.expirationDate\n          ? new Date(formValue.expirationDate)\n          : undefined,\n        password: formValue.password,\n      };\n\n      const result = await this.exportService\n        .createShareableLink(options)\n        .toPromise();\n      this.shareResult = result;\n\n      this.snackBar.open('Shareable link created!', 'Close', {\n        duration: 2000,\n      });\n    } catch (error) {\n      this.snackBar.open(`Failed to create share link: ${error}`, 'Close', {\n        duration: 4000,\n      });\n    } finally {\n      this.isProcessing = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  canExport(): boolean {\n    return !!this.selectedFormat && !this.isProcessing;\n  }\n\n  canIntegrate(): boolean {\n    return this.integrationForm.valid && !this.isProcessing;\n  }\n\n  canShare(): boolean {\n    return this.sharingForm.valid && !this.isProcessing;\n  }\n\n  downloadResult(result: ExportResult): void {\n    const blob = new Blob([result.content], { type: result.format.mimeType });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = result.filename;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n  }\n\n  previewResult(result: ExportResult): void {\n    // Open preview dialog or new window\n    const blob = new Blob([result.content], { type: result.format.mimeType });\n    const url = URL.createObjectURL(blob);\n    window.open(url, '_blank');\n  }\n\n  copyToClipboard(content: string): void {\n    navigator.clipboard\n      .writeText(content)\n      .then(() => {\n        this.snackBar.open('Copied to clipboard!', 'Close', { duration: 2000 });\n      })\n      .catch(() => {\n        this.snackBar.open('Failed to copy to clipboard', 'Close', {\n          duration: 3000,\n        });\n      });\n  }\n\n  copyShareUrl(): void {\n    if (this.shareResult?.url) {\n      this.copyToClipboard(this.shareResult.url);\n    }\n  }\n\n  formatFileSize(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n  }\n\n  onCancel(): void {\n    this.dialogRef.close();\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport {\n  MatSlideToggleModule,\n  MatSlideToggleChange,\n} from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\n\nimport {\n  Subject,\n  takeUntil,\n  debounceTime,\n  distinctUntilChanged,\n  BehaviorSubject,\n} from 'rxjs';\n\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { SpecificationBridgeService } from '../services/specification-bridge.service';\n\nexport interface DslLintError {\n  id: string;\n  line: number;\n  column: number;\n  length: number;\n  severity: 'error' | 'warning' | 'info' | 'hint';\n  code: string;\n  message: string;\n  suggestion?: string;\n  quickFix?: DslQuickFix;\n  category: 'syntax' | 'semantic' | 'style' | 'performance' | 'best-practice';\n  tags?: string[];\n}\n\nexport interface DslQuickFix {\n  title: string;\n  description: string;\n  edits: DslEdit[];\n}\n\nexport interface DslEdit {\n  range: {\n    startLine: number;\n    startColumn: number;\n    endLine: number;\n    endColumn: number;\n  };\n  newText: string;\n}\n\nexport interface DslLintStats {\n  totalErrors: number;\n  totalWarnings: number;\n  totalInfos: number;\n  totalHints: number;\n  complexity: number;\n  maintainabilityIndex: number;\n  lastLintTime: Date;\n  lintDuration: number;\n}\n\nexport interface DslLintRule {\n  id: string;\n  name: string;\n  description: string;\n  category: string;\n  severity: 'error' | 'warning' | 'info' | 'hint';\n  enabled: boolean;\n  configurable: boolean;\n  config?: any;\n}\n\n@Component({\n  selector: 'praxis-dsl-linter',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatCardModule,\n    MatButtonModule,\n    MatIconModule,\n    MatToolbarModule,\n    MatListModule,\n    MatDividerModule,\n    MatChipsModule,\n    MatBadgeModule,\n    MatTooltipModule,\n    MatExpansionModule,\n    MatProgressSpinnerModule,\n    MatSelectModule,\n    MatSlideToggleModule,\n    MatTabsModule,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"dsl-linter-container\">\n      <!-- Header Toolbar -->\n      <mat-toolbar class=\"linter-toolbar\">\n        <mat-toolbar-row>\n          <span class=\"toolbar-title\">\n            <mat-icon>rule</mat-icon>\n            DSL Linter\n          </span>\n\n          <span class=\"toolbar-spacer\"></span>\n\n          <!-- Stats Summary -->\n          <div class=\"stats-summary\">\n            <mat-chip\n              [class]=\"stats.totalErrors > 0 ? 'error-chip' : 'success-chip'\"\n              [matBadge]=\"stats.totalErrors\"\n              [matBadgeHidden]=\"stats.totalErrors === 0\"\n              matBadgeColor=\"warn\"\n              matTooltip=\"Errors\"\n            >\n              <mat-icon>error</mat-icon>\n              {{ stats.totalErrors }}\n            </mat-chip>\n\n            <mat-chip\n              [class]=\"\n                stats.totalWarnings > 0 ? 'warning-chip' : 'neutral-chip'\n              \"\n              [matBadge]=\"stats.totalWarnings\"\n              [matBadgeHidden]=\"stats.totalWarnings === 0\"\n              matBadgeColor=\"accent\"\n              matTooltip=\"Warnings\"\n            >\n              <mat-icon>warning</mat-icon>\n              {{ stats.totalWarnings }}\n            </mat-chip>\n\n            <mat-chip\n              class=\"info-chip\"\n              [matBadge]=\"stats.totalInfos + stats.totalHints\"\n              [matBadgeHidden]=\"stats.totalInfos + stats.totalHints === 0\"\n              matBadgeColor=\"primary\"\n              matTooltip=\"Info & Hints\"\n            >\n              <mat-icon>info</mat-icon>\n              {{ stats.totalInfos + stats.totalHints }}\n            </mat-chip>\n          </div>\n\n          <!-- Action Buttons -->\n          <button\n            mat-icon-button\n            (click)=\"runLinting()\"\n            [disabled]=\"isLinting\"\n            matTooltip=\"Run Lint Check\"\n          >\n            <mat-icon *ngIf=\"!isLinting\">refresh</mat-icon>\n            <mat-progress-spinner\n              *ngIf=\"isLinting\"\n              diameter=\"20\"\n              mode=\"indeterminate\"\n            >\n            </mat-progress-spinner>\n          </button>\n\n          <button\n            mat-icon-button\n            [color]=\"autoLint ? 'primary' : ''\"\n            (click)=\"toggleAutoLint()\"\n            matTooltip=\"Toggle Auto-Lint\"\n          >\n            <mat-icon>auto_fix_high</mat-icon>\n          </button>\n\n          <button\n            mat-icon-button\n            (click)=\"openLinterSettings()\"\n            matTooltip=\"Linter Settings\"\n          >\n            <mat-icon>settings</mat-icon>\n          </button>\n        </mat-toolbar-row>\n      </mat-toolbar>\n\n      <!-- Main Content -->\n      <div class=\"linter-content\">\n        <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n          <!-- Issues Tab -->\n          <mat-tab label=\"Issues\">\n            <div class=\"tab-content\">\n              <!-- Filter Controls -->\n              <div class=\"filter-controls\">\n                <mat-form-field appearance=\"outline\" class=\"filter-field\">\n                  <mat-label>Filter by Severity</mat-label>\n                  <mat-select\n                    [value]=\"selectedSeverities\"\n                    (selectionChange)=\"onSeverityFilterChange($event)\"\n                    multiple\n                  >\n                    <mat-option value=\"error\">\n                      <mat-icon class=\"severity-icon error\">error</mat-icon>\n                      Errors\n                    </mat-option>\n                    <mat-option value=\"warning\">\n                      <mat-icon class=\"severity-icon warning\">warning</mat-icon>\n                      Warnings\n                    </mat-option>\n                    <mat-option value=\"info\">\n                      <mat-icon class=\"severity-icon info\">info</mat-icon>\n                      Info\n                    </mat-option>\n                    <mat-option value=\"hint\">\n                      <mat-icon class=\"severity-icon hint\">lightbulb</mat-icon>\n                      Hints\n                    </mat-option>\n                  </mat-select>\n                </mat-form-field>\n\n                <mat-form-field appearance=\"outline\" class=\"filter-field\">\n                  <mat-label>Filter by Category</mat-label>\n                  <mat-select\n                    [value]=\"selectedCategories\"\n                    (selectionChange)=\"onCategoryFilterChange($event)\"\n                    multiple\n                  >\n                    <mat-option value=\"syntax\">Syntax</mat-option>\n                    <mat-option value=\"semantic\">Semantic</mat-option>\n                    <mat-option value=\"style\">Style</mat-option>\n                    <mat-option value=\"performance\">Performance</mat-option>\n                    <mat-option value=\"best-practice\">Best Practice</mat-option>\n                  </mat-select>\n                </mat-form-field>\n              </div>\n\n              <!-- Issues List -->\n              <div class=\"issues-list\" *ngIf=\"filteredErrors.length > 0\">\n                <mat-expansion-panel\n                  *ngFor=\"let error of filteredErrors; trackBy: trackByErrorId\"\n                  class=\"issue-panel\"\n                  [class]=\"'severity-' + error.severity\"\n                >\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      <mat-icon [class]=\"'severity-icon ' + error.severity\">\n                        {{ getSeverityIcon(error.severity) }}\n                      </mat-icon>\n                      <span class=\"error-message\">{{ error.message }}</span>\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      <mat-chip size=\"small\" class=\"category-chip\">{{\n                        error.category\n                      }}</mat-chip>\n                      <span class=\"location\"\n                        >Line {{ error.line }}:{{ error.column }}</span\n                      >\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"issue-details\">\n                    <div class=\"issue-info\">\n                      <div class=\"info-row\">\n                        <strong>Code:</strong> {{ error.code }}\n                      </div>\n                      <div class=\"info-row\">\n                        <strong>Location:</strong> Line {{ error.line }}, Column\n                        {{ error.column }}\n                      </div>\n                      <div\n                        class=\"info-row\"\n                        *ngIf=\"error.tags && error.tags.length > 0\"\n                      >\n                        <strong>Tags:</strong>\n                        <mat-chip\n                          *ngFor=\"let tag of error.tags\"\n                          size=\"small\"\n                          class=\"tag-chip\"\n                        >\n                          {{ tag }}\n                        </mat-chip>\n                      </div>\n                      <div class=\"info-row\" *ngIf=\"error.suggestion\">\n                        <strong>Suggestion:</strong> {{ error.suggestion }}\n                      </div>\n                    </div>\n\n                    <div class=\"issue-actions\">\n                      <button\n                        mat-button\n                        (click)=\"navigateToError(error)\"\n                        color=\"primary\"\n                      >\n                        <mat-icon>my_location</mat-icon>\n                        Go to Location\n                      </button>\n\n                      <button\n                        mat-button\n                        *ngIf=\"error.quickFix\"\n                        (click)=\"applyQuickFix(error)\"\n                        color=\"accent\"\n                      >\n                        <mat-icon>build</mat-icon>\n                        {{ error.quickFix.title }}\n                      </button>\n\n                      <button mat-button (click)=\"ignoreError(error)\">\n                        <mat-icon>visibility_off</mat-icon>\n                        Ignore\n                      </button>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n              </div>\n\n              <!-- No Issues Message -->\n              <div *ngIf=\"filteredErrors.length === 0\" class=\"no-issues\">\n                <mat-icon class=\"no-issues-icon\">check_circle</mat-icon>\n                <h3>No Issues Found</h3>\n                <p *ngIf=\"allErrors.length === 0\">\n                  Your DSL is clean! No linting issues detected.\n                </p>\n                <p *ngIf=\"allErrors.length > 0\">\n                  All issues are filtered out. Adjust your filters to see hidden\n                  issues.\n                </p>\n              </div>\n            </div>\n          </mat-tab>\n\n          <!-- Analytics Tab -->\n          <mat-tab label=\"Analytics\">\n            <div class=\"tab-content\">\n              <div class=\"analytics-grid\">\n                <!-- Quality Metrics -->\n                <mat-card class=\"analytics-card\">\n                  <mat-card-header>\n                    <mat-card-title>Code Quality</mat-card-title>\n                  </mat-card-header>\n                  <mat-card-content>\n                    <div class=\"metric-item\">\n                      <span class=\"metric-label\">Complexity Score:</span>\n                      <span\n                        class=\"metric-value\"\n                        [class]=\"getComplexityClass(stats.complexity)\"\n                      >\n                        {{ stats.complexity }}/100\n                      </span>\n                    </div>\n                    <div class=\"metric-item\">\n                      <span class=\"metric-label\">Maintainability:</span>\n                      <span\n                        class=\"metric-value\"\n                        [class]=\"\n                          getMaintainabilityClass(stats.maintainabilityIndex)\n                        \"\n                      >\n                        {{ stats.maintainabilityIndex }}/100\n                      </span>\n                    </div>\n                    <div class=\"metric-item\">\n                      <span class=\"metric-label\">Last Lint:</span>\n                      <span class=\"metric-value\">{{\n                        stats.lastLintTime | date: 'medium'\n                      }}</span>\n                    </div>\n                    <div class=\"metric-item\">\n                      <span class=\"metric-label\">Duration:</span>\n                      <span class=\"metric-value\"\n                        >{{ stats.lintDuration }}ms</span\n                      >\n                    </div>\n                  </mat-card-content>\n                </mat-card>\n\n                <!-- Issue Distribution -->\n                <mat-card class=\"analytics-card\">\n                  <mat-card-header>\n                    <mat-card-title>Issue Distribution</mat-card-title>\n                  </mat-card-header>\n                  <mat-card-content>\n                    <div class=\"distribution-chart\">\n                      <div\n                        class=\"chart-bar\"\n                        *ngFor=\"let category of getIssueDistribution()\"\n                      >\n                        <div class=\"bar-label\">{{ category.name }}</div>\n                        <div class=\"bar-container\">\n                          <div\n                            class=\"bar-fill\"\n                            [style.width.%]=\"category.percentage\"\n                            [class]=\"'bar-' + category.severity\"\n                          ></div>\n                          <span class=\"bar-value\">{{ category.count }}</span>\n                        </div>\n                      </div>\n                    </div>\n                  </mat-card-content>\n                </mat-card>\n\n                <!-- Rule Usage -->\n                <mat-card class=\"analytics-card\">\n                  <mat-card-header>\n                    <mat-card-title>Most Common Issues</mat-card-title>\n                  </mat-card-header>\n                  <mat-card-content>\n                    <div class=\"common-issues\">\n                      <div\n                        *ngFor=\"let issue of getMostCommonIssues()\"\n                        class=\"common-issue-item\"\n                      >\n                        <div class=\"issue-code\">{{ issue.code }}</div>\n                        <div class=\"issue-count\">\n                          {{ issue.count }} occurrences\n                        </div>\n                      </div>\n                    </div>\n                  </mat-card-content>\n                </mat-card>\n              </div>\n            </div>\n          </mat-tab>\n\n          <!-- Rules Tab -->\n          <mat-tab label=\"Rules\">\n            <div class=\"tab-content\">\n              <!-- Rule Categories -->\n              <div class=\"rules-content\">\n                <mat-expansion-panel\n                  *ngFor=\"let category of getRuleCategories()\"\n                  class=\"rule-category-panel\"\n                >\n                  <mat-expansion-panel-header>\n                    <mat-panel-title>\n                      {{ category.name }} ({{ category.rules.length }})\n                    </mat-panel-title>\n                    <mat-panel-description>\n                      {{ category.enabledCount }}/{{\n                        category.rules.length\n                      }}\n                      enabled\n                    </mat-panel-description>\n                  </mat-expansion-panel-header>\n\n                  <div class=\"category-rules\">\n                    <div *ngFor=\"let rule of category.rules\" class=\"rule-item\">\n                      <div class=\"rule-header\">\n                        <mat-slide-toggle\n                          [checked]=\"rule.enabled\"\n                          (change)=\"toggleRule(rule, $event)\"\n                        >\n                        </mat-slide-toggle>\n\n                        <div class=\"rule-info\">\n                          <div class=\"rule-name\">{{ rule.name }}</div>\n                          <div class=\"rule-description\">\n                            {{ rule.description }}\n                          </div>\n                        </div>\n\n                        <mat-chip\n                          size=\"small\"\n                          [class]=\"'severity-chip ' + rule.severity\"\n                        >\n                          {{ rule.severity }}\n                        </mat-chip>\n                      </div>\n\n                      <div *ngIf=\"rule.configurable\" class=\"rule-config\">\n                        <button\n                          mat-button\n                          size=\"small\"\n                          (click)=\"configureRule(rule)\"\n                        >\n                          <mat-icon>settings</mat-icon>\n                          Configure\n                        </button>\n                      </div>\n                    </div>\n                  </div>\n                </mat-expansion-panel>\n              </div>\n            </div>\n          </mat-tab>\n        </mat-tab-group>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .dsl-linter-container {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        overflow: hidden;\n      }\n\n      .linter-toolbar {\n        background: var(--md-sys-color-surface-container);\n        color: var(--md-sys-color-on-surface-variant);\n        flex-shrink: 0;\n      }\n\n      .toolbar-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-weight: 500;\n      }\n\n      .toolbar-spacer {\n        flex: 1;\n      }\n\n      .stats-summary {\n        display: flex;\n        gap: 8px;\n        margin-right: 16px;\n      }\n\n      .stats-summary mat-chip {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-weight: 500;\n      }\n\n      .error-chip {\n        background: var(--md-sys-color-error-container);\n        color: var(--md-sys-color-on-error-container);\n      }\n\n      .warning-chip {\n        background: var(--md-sys-color-secondary-container);\n        color: var(--md-sys-color-on-secondary-container);\n      }\n\n      .info-chip {\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n      }\n\n      .success-chip {\n        background: var(--md-sys-color-tertiary-container);\n        color: var(--md-sys-color-on-tertiary-container);\n      }\n\n      .neutral-chip {\n        background: var(--md-sys-color-surface-container);\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .linter-content {\n        flex: 1;\n        min-height: 0;\n      }\n\n      .tab-content {\n        padding: 16px;\n        height: 100%;\n        overflow-y: auto;\n      }\n\n      .filter-controls {\n        display: flex;\n        gap: 16px;\n        margin-bottom: 16px;\n        flex-wrap: wrap;\n      }\n\n      .filter-field {\n        min-width: 200px;\n      }\n\n      .severity-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n        margin-right: 8px;\n      }\n\n      .severity-icon.error {\n        color: var(--md-sys-color-error);\n      }\n\n      .severity-icon.warning {\n        color: var(--md-sys-color-secondary);\n      }\n\n      .severity-icon.info {\n        color: var(--md-sys-color-primary);\n      }\n\n      .severity-icon.hint {\n        color: var(--md-sys-color-primary);\n      }\n\n      .issues-list {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .issue-panel {\n        border-left: 4px solid transparent;\n      }\n\n      .issue-panel.severity-error {\n        border-left-color: var(--md-sys-color-error);\n      }\n\n      .issue-panel.severity-warning {\n        border-left-color: var(--md-sys-color-secondary);\n      }\n\n      .issue-panel.severity-info {\n        border-left-color: var(--md-sys-color-primary);\n      }\n\n      .issue-panel.severity-hint {\n        border-left-color: var(--md-sys-color-primary);\n      }\n\n      .error-message {\n        font-weight: 500;\n        margin-left: 8px;\n      }\n\n      .category-chip {\n        background: var(--md-sys-color-secondary-container);\n        color: var(--md-sys-color-on-secondary-container);\n        margin-right: 8px;\n      }\n\n      .location {\n        font-family: 'Courier New', monospace;\n        font-size: 12px;\n        opacity: 0.7;\n      }\n\n      .issue-details {\n        padding: 16px 0;\n        border-top: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      .issue-info {\n        margin-bottom: 16px;\n      }\n\n      .info-row {\n        margin-bottom: 8px;\n        font-size: 14px;\n      }\n\n      .tag-chip {\n        background: var(--md-sys-color-surface-container);\n        color: var(--md-sys-color-on-surface-variant);\n        margin-left: 4px;\n      }\n\n      .issue-actions {\n        display: flex;\n        gap: 8px;\n        flex-wrap: wrap;\n      }\n\n      .no-issues {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        padding: 48px;\n        text-align: center;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .no-issues-icon {\n        font-size: 64px;\n        width: 64px;\n        height: 64px;\n        color: var(--md-sys-color-tertiary);\n        margin-bottom: 16px;\n      }\n\n      .analytics-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n        gap: 16px;\n      }\n\n      .analytics-card {\n        height: fit-content;\n      }\n\n      .metric-item {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 8px 0;\n        border-bottom: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      .metric-item:last-child {\n        border-bottom: none;\n      }\n\n      .metric-label {\n        font-weight: 500;\n      }\n\n      .metric-value {\n        font-weight: 600;\n      }\n\n      .metric-value.excellent {\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .metric-value.good {\n        color: var(--md-sys-color-primary);\n      }\n\n      .metric-value.fair {\n        color: var(--md-sys-color-secondary);\n      }\n\n      .metric-value.poor {\n        color: var(--md-sys-color-error);\n      }\n\n      .distribution-chart {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n      }\n\n      .chart-bar {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .bar-label {\n        font-size: 12px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .bar-container {\n        position: relative;\n        height: 24px;\n        background: var(--md-sys-color-surface-container);\n        border-radius: 4px;\n        overflow: hidden;\n      }\n\n      .bar-fill {\n        height: 100%;\n        transition: width 0.3s ease;\n      }\n\n      .bar-fill.bar-error {\n        background: var(--md-sys-color-error);\n      }\n\n      .bar-fill.bar-warning {\n        background: var(--md-sys-color-secondary);\n      }\n\n      .bar-fill.bar-info {\n        background: var(--md-sys-color-primary);\n      }\n\n      .bar-fill.bar-hint {\n        background: var(--md-sys-color-primary);\n      }\n\n      .bar-value {\n        position: absolute;\n        right: 8px;\n        top: 50%;\n        transform: translateY(-50%);\n        font-size: 12px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      .common-issues {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .common-issue-item {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 8px 12px;\n        background: var(--md-sys-color-surface-container);\n        border-radius: 4px;\n      }\n\n      .issue-code {\n        font-family: 'Courier New', monospace;\n        font-weight: 500;\n      }\n\n      .issue-count {\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .rules-content {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .rule-category-panel {\n        border: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      .category-rules {\n        padding: 16px;\n      }\n\n      .rule-item {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n        padding: 12px;\n        border: 1px solid var(--md-sys-color-outline-variant);\n        border-radius: 4px;\n        margin-bottom: 8px;\n      }\n\n      .rule-header {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n      }\n\n      .rule-info {\n        flex: 1;\n      }\n\n      .rule-name {\n        font-weight: 500;\n        margin-bottom: 4px;\n      }\n\n      .rule-description {\n        font-size: 13px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .severity-chip {\n        font-size: 11px;\n        min-height: 20px;\n      }\n\n      .severity-chip.error {\n        background: var(--md-sys-color-error-container);\n        color: var(--md-sys-color-on-error-container);\n      }\n\n      .severity-chip.warning {\n        background: var(--md-sys-color-secondary-container);\n        color: var(--md-sys-color-on-secondary-container);\n      }\n\n      .severity-chip.info {\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n      }\n\n      .severity-chip.hint {\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n      }\n\n      .rule-config {\n        padding-left: 44px;\n      }\n    `,\n  ],\n})\nexport class DslLinterComponent implements OnInit, OnDestroy {\n  @Input() dsl: string = '';\n  @Input() autoLint: boolean = true;\n  @Input() lintDelay: number = 1000;\n\n  @Output() errorSelected = new EventEmitter<DslLintError>();\n  @Output() quickFixApplied = new EventEmitter<{\n    error: DslLintError;\n    fix: DslQuickFix;\n  }>();\n  @Output() ruleToggled = new EventEmitter<{\n    rule: DslLintRule;\n    enabled: boolean;\n  }>();\n\n  private destroy$ = new Subject<void>();\n  private lintSubject = new BehaviorSubject<string>('');\n\n  // Component state\n  isLinting = false;\n  activeTabIndex = 0;\n\n  allErrors: DslLintError[] = [];\n  filteredErrors: DslLintError[] = [];\n  selectedSeverities: string[] = ['error', 'warning', 'info', 'hint'];\n  selectedCategories: string[] = [\n    'syntax',\n    'semantic',\n    'style',\n    'performance',\n    'best-practice',\n  ];\n\n  stats: DslLintStats = {\n    totalErrors: 0,\n    totalWarnings: 0,\n    totalInfos: 0,\n    totalHints: 0,\n    complexity: 0,\n    maintainabilityIndex: 100,\n    lastLintTime: new Date(),\n    lintDuration: 0,\n  };\n\n  lintRules: DslLintRule[] = [\n    // Syntax Rules\n    {\n      id: 'syntax-001',\n      name: 'Missing Semicolon',\n      description: 'Statements should end with semicolons',\n      category: 'syntax',\n      severity: 'error',\n      enabled: true,\n      configurable: false,\n    },\n    {\n      id: 'syntax-002',\n      name: 'Unmatched Parentheses',\n      description: 'Opening parentheses must have matching closing parentheses',\n      category: 'syntax',\n      severity: 'error',\n      enabled: true,\n      configurable: false,\n    },\n    {\n      id: 'syntax-003',\n      name: 'Invalid Field Reference',\n      description: 'Field references must be valid and properly formatted',\n      category: 'syntax',\n      severity: 'error',\n      enabled: true,\n      configurable: false,\n    },\n\n    // Semantic Rules\n    {\n      id: 'semantic-001',\n      name: 'Undefined Field',\n      description: 'Referenced fields must be defined in the schema',\n      category: 'semantic',\n      severity: 'error',\n      enabled: true,\n      configurable: false,\n    },\n    {\n      id: 'semantic-002',\n      name: 'Type Mismatch',\n      description: 'Operations must be compatible with field types',\n      category: 'semantic',\n      severity: 'warning',\n      enabled: true,\n      configurable: true,\n    },\n    {\n      id: 'semantic-003',\n      name: 'Unreachable Code',\n      description: 'Code that can never be executed',\n      category: 'semantic',\n      severity: 'warning',\n      enabled: true,\n      configurable: false,\n    },\n\n    // Style Rules\n    {\n      id: 'style-001',\n      name: 'Inconsistent Indentation',\n      description: 'Use consistent indentation throughout the DSL',\n      category: 'style',\n      severity: 'info',\n      enabled: true,\n      configurable: true,\n    },\n    {\n      id: 'style-002',\n      name: 'Long Line',\n      description: 'Lines should not exceed maximum length',\n      category: 'style',\n      severity: 'info',\n      enabled: false,\n      configurable: true,\n      config: { maxLength: 120 },\n    },\n    {\n      id: 'style-003',\n      name: 'Trailing Whitespace',\n      description: 'Remove trailing whitespace from lines',\n      category: 'style',\n      severity: 'hint',\n      enabled: true,\n      configurable: false,\n    },\n\n    // Performance Rules\n    {\n      id: 'performance-001',\n      name: 'Complex Expression',\n      description: 'Expression complexity exceeds recommended threshold',\n      category: 'performance',\n      severity: 'warning',\n      enabled: true,\n      configurable: true,\n      config: { maxComplexity: 10 },\n    },\n    {\n      id: 'performance-002',\n      name: 'Redundant Condition',\n      description: 'Condition can be simplified or is redundant',\n      category: 'performance',\n      severity: 'info',\n      enabled: true,\n      configurable: false,\n    },\n\n    // Best Practice Rules\n    {\n      id: 'best-practice-001',\n      name: 'Magic Number',\n      description: 'Consider using named constants instead of magic numbers',\n      category: 'best-practice',\n      severity: 'hint',\n      enabled: true,\n      configurable: true,\n    },\n    {\n      id: 'best-practice-002',\n      name: 'Deep Nesting',\n      description: 'Avoid deep nesting to improve readability',\n      category: 'best-practice',\n      severity: 'info',\n      enabled: true,\n      configurable: true,\n      config: { maxDepth: 5 },\n    },\n    {\n      id: 'best-practice-003',\n      name: 'Missing Documentation',\n      description: 'Complex rules should include documentation comments',\n      category: 'best-practice',\n      severity: 'hint',\n      enabled: false,\n      configurable: false,\n    },\n  ];\n\n  constructor(\n    private ruleBuilderService: RuleBuilderService,\n    private specificationBridge: SpecificationBridgeService,\n    private cdr: ChangeDetectorRef,\n  ) {}\n\n  ngOnInit(): void {\n    this.setupSubscriptions();\n    this.initializeLinting();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private setupSubscriptions(): void {\n    // Subscribe to DSL changes for auto-linting\n    this.lintSubject\n      .pipe(\n        debounceTime(this.lintDelay),\n        distinctUntilChanged(),\n        takeUntil(this.destroy$),\n      )\n      .subscribe((dsl) => {\n        if (this.autoLint && dsl) {\n          this.performLinting(dsl);\n        }\n      });\n\n    // Subscribe to rule builder state changes\n    this.ruleBuilderService.state$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((state) => {\n        if (state.currentDSL && state.currentDSL !== this.dsl) {\n          this.dsl = state.currentDSL;\n          this.triggerLinting();\n        }\n      });\n  }\n\n  private initializeLinting(): void {\n    if (this.dsl) {\n      this.triggerLinting();\n    }\n  }\n\n  private triggerLinting(): void {\n    this.lintSubject.next(this.dsl);\n  }\n\n  runLinting(): void {\n    if (this.dsl) {\n      this.performLinting(this.dsl);\n    }\n  }\n\n  private async performLinting(dsl: string): Promise<void> {\n    if (this.isLinting) return;\n\n    this.isLinting = true;\n    const startTime = performance.now();\n    this.cdr.detectChanges();\n\n    try {\n      // Simulate linting process with actual DSL analysis\n      const errors = await this.analyzeDsl(dsl);\n\n      this.allErrors = errors;\n      this.applyFilters();\n      this.updateStats(errors, performance.now() - startTime);\n    } catch (error) {\n      console.error('Linting failed:', error);\n    } finally {\n      this.isLinting = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  private async analyzeDsl(dsl: string): Promise<DslLintError[]> {\n    const errors: DslLintError[] = [];\n    const lines = dsl.split('\\n');\n\n    // Simulate comprehensive DSL analysis\n    for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n      const line = lines[lineIndex];\n      const lineNumber = lineIndex + 1;\n\n      // Check syntax rules\n      errors.push(...this.checkSyntaxRules(line, lineNumber));\n\n      // Check semantic rules\n      errors.push(...this.checkSemanticRules(line, lineNumber, lines));\n\n      // Check style rules\n      errors.push(...this.checkStyleRules(line, lineNumber));\n\n      // Check performance rules\n      errors.push(...this.checkPerformanceRules(line, lineNumber));\n\n      // Check best practice rules\n      errors.push(...this.checkBestPracticeRules(line, lineNumber));\n    }\n\n    return errors.filter((error) => this.isRuleEnabled(error.code));\n  }\n\n  private checkSyntaxRules(line: string, lineNumber: number): DslLintError[] {\n    const errors: DslLintError[] = [];\n\n    // Check for unmatched parentheses\n    const openParens = (line.match(/\\(/g) || []).length;\n    const closeParens = (line.match(/\\)/g) || []).length;\n    if (openParens !== closeParens) {\n      errors.push({\n        id: `syntax-${lineNumber}-1`,\n        line: lineNumber,\n        column: line.length,\n        length: 1,\n        severity: 'error',\n        code: 'syntax-002',\n        message: 'Unmatched parentheses in expression',\n        category: 'syntax',\n        suggestion:\n          'Ensure all opening parentheses have matching closing parentheses',\n        quickFix: {\n          title: 'Add missing parenthesis',\n          description: 'Automatically add the missing closing parenthesis',\n          edits: [\n            {\n              range: {\n                startLine: lineNumber,\n                startColumn: line.length,\n                endLine: lineNumber,\n                endColumn: line.length,\n              },\n              newText: ')',\n            },\n          ],\n        },\n      });\n    }\n\n    // Check for invalid field references\n    const fieldRefPattern = /\\$\\{([^}]*)\\}/g;\n    let match;\n    while ((match = fieldRefPattern.exec(line)) !== null) {\n      const fieldRef = match[1];\n      if (!fieldRef || fieldRef.includes(' ')) {\n        errors.push({\n          id: `syntax-${lineNumber}-2`,\n          line: lineNumber,\n          column: match.index + 1,\n          length: match[0].length,\n          severity: 'error',\n          code: 'syntax-003',\n          message: 'Invalid field reference syntax',\n          category: 'syntax',\n          suggestion:\n            'Field references should contain valid field names without spaces',\n        });\n      }\n    }\n\n    return errors;\n  }\n\n  private checkSemanticRules(\n    line: string,\n    lineNumber: number,\n    allLines: string[],\n  ): DslLintError[] {\n    const errors: DslLintError[] = [];\n\n    // Check for undefined fields (simplified)\n    const fieldRefPattern = /\\$\\{([^}]+)\\}/g;\n    let match;\n    while ((match = fieldRefPattern.exec(line)) !== null) {\n      const fieldName = match[1];\n      // This would normally check against actual field schema\n      if (fieldName.startsWith('unknown_')) {\n        errors.push({\n          id: `semantic-${lineNumber}-1`,\n          line: lineNumber,\n          column: match.index + 1,\n          length: match[0].length,\n          severity: 'error',\n          code: 'semantic-001',\n          message: `Undefined field: ${fieldName}`,\n          category: 'semantic',\n          suggestion:\n            'Ensure the field is defined in your schema or fix the field name',\n        });\n      }\n    }\n\n    return errors;\n  }\n\n  private checkStyleRules(line: string, lineNumber: number): DslLintError[] {\n    const errors: DslLintError[] = [];\n\n    // Check trailing whitespace\n    if (line.endsWith(' ') || line.endsWith('\\t')) {\n      errors.push({\n        id: `style-${lineNumber}-1`,\n        line: lineNumber,\n        column: line.trimEnd().length + 1,\n        length: line.length - line.trimEnd().length,\n        severity: 'hint',\n        code: 'style-003',\n        message: 'Trailing whitespace detected',\n        category: 'style',\n        suggestion: 'Remove trailing whitespace',\n        quickFix: {\n          title: 'Remove trailing whitespace',\n          description: 'Automatically remove trailing spaces and tabs',\n          edits: [\n            {\n              range: {\n                startLine: lineNumber,\n                startColumn: line.trimEnd().length + 1,\n                endLine: lineNumber,\n                endColumn: line.length + 1,\n              },\n              newText: '',\n            },\n          ],\n        },\n      });\n    }\n\n    // Check line length\n    const maxLength = this.getRuleConfig('style-002')?.maxLength || 120;\n    if (this.isRuleEnabled('style-002') && line.length > maxLength) {\n      errors.push({\n        id: `style-${lineNumber}-2`,\n        line: lineNumber,\n        column: maxLength + 1,\n        length: line.length - maxLength,\n        severity: 'info',\n        code: 'style-002',\n        message: `Line exceeds maximum length of ${maxLength} characters`,\n        category: 'style',\n        suggestion: 'Consider breaking long lines for better readability',\n      });\n    }\n\n    return errors;\n  }\n\n  private checkPerformanceRules(\n    line: string,\n    lineNumber: number,\n  ): DslLintError[] {\n    const errors: DslLintError[] = [];\n\n    // Check expression complexity (simplified)\n    const operators = (line.match(/&&|\\|\\||==|!=|>=|<=|>|</g) || []).length;\n    const maxComplexity =\n      this.getRuleConfig('performance-001')?.maxComplexity || 10;\n\n    if (operators > maxComplexity) {\n      errors.push({\n        id: `performance-${lineNumber}-1`,\n        line: lineNumber,\n        column: 1,\n        length: line.length,\n        severity: 'warning',\n        code: 'performance-001',\n        message: `Expression complexity (${operators}) exceeds threshold (${maxComplexity})`,\n        category: 'performance',\n        suggestion:\n          'Consider breaking complex expressions into smaller, more readable parts',\n      });\n    }\n\n    return errors;\n  }\n\n  private checkBestPracticeRules(\n    line: string,\n    lineNumber: number,\n  ): DslLintError[] {\n    const errors: DslLintError[] = [];\n\n    // Check for magic numbers\n    const numberPattern = /\\b\\d+\\b/g;\n    let match;\n    while ((match = numberPattern.exec(line)) !== null) {\n      const number = parseInt(match[0]);\n      if (number > 10 && number !== 100 && number !== 1000) {\n        errors.push({\n          id: `best-practice-${lineNumber}-1`,\n          line: lineNumber,\n          column: match.index + 1,\n          length: match[0].length,\n          severity: 'hint',\n          code: 'best-practice-001',\n          message: `Consider using a named constant instead of magic number: ${number}`,\n          category: 'best-practice',\n          suggestion: 'Define meaningful constants for numeric values',\n        });\n      }\n    }\n\n    return errors;\n  }\n\n  private isRuleEnabled(ruleCode: string): boolean {\n    const rule = this.lintRules.find((r) => r.id === ruleCode);\n    return rule?.enabled ?? false;\n  }\n\n  private getRuleConfig(ruleCode: string): any {\n    const rule = this.lintRules.find((r) => r.id === ruleCode);\n    return rule?.config;\n  }\n\n  private updateStats(errors: DslLintError[], duration: number): void {\n    this.stats = {\n      totalErrors: errors.filter((e) => e.severity === 'error').length,\n      totalWarnings: errors.filter((e) => e.severity === 'warning').length,\n      totalInfos: errors.filter((e) => e.severity === 'info').length,\n      totalHints: errors.filter((e) => e.severity === 'hint').length,\n      complexity: this.calculateComplexity(errors),\n      maintainabilityIndex: this.calculateMaintainabilityIndex(errors),\n      lastLintTime: new Date(),\n      lintDuration: Math.round(duration),\n    };\n  }\n\n  private calculateComplexity(errors: DslLintError[]): number {\n    const complexityFactors = {\n      error: 10,\n      warning: 5,\n      info: 2,\n      hint: 1,\n    };\n\n    const totalPenalty = errors.reduce((sum, error) => {\n      return sum + (complexityFactors[error.severity] || 1);\n    }, 0);\n\n    return Math.min(100, Math.max(0, 100 - totalPenalty));\n  }\n\n  private calculateMaintainabilityIndex(errors: DslLintError[]): number {\n    const criticalErrors = errors.filter((e) => e.severity === 'error').length;\n    const warnings = errors.filter((e) => e.severity === 'warning').length;\n\n    const penalty = criticalErrors * 15 + warnings * 5;\n    return Math.min(100, Math.max(0, 100 - penalty));\n  }\n\n  toggleAutoLint(): void {\n    this.autoLint = !this.autoLint;\n    if (this.autoLint && this.dsl) {\n      this.triggerLinting();\n    }\n  }\n\n  onSeverityFilterChange(event: MatSelectChange): void {\n    this.selectedSeverities = event.value as string[];\n    this.applyFilters();\n  }\n\n  onCategoryFilterChange(event: MatSelectChange): void {\n    this.selectedCategories = event.value as string[];\n    this.applyFilters();\n  }\n\n  private applyFilters(): void {\n    this.filteredErrors = this.allErrors.filter(\n      (error) =>\n        this.selectedSeverities.includes(error.severity) &&\n        this.selectedCategories.includes(error.category),\n    );\n    this.cdr.detectChanges();\n  }\n\n  trackByErrorId(index: number, error: DslLintError): string {\n    return error.id;\n  }\n\n  getSeverityIcon(severity: string): string {\n    const icons: Record<string, string> = {\n      error: 'error',\n      warning: 'warning',\n      info: 'info',\n      hint: 'lightbulb',\n    };\n    return icons[severity] || 'help';\n  }\n\n  getComplexityClass(complexity: number): string {\n    if (complexity >= 80) return 'excellent';\n    if (complexity >= 60) return 'good';\n    if (complexity >= 40) return 'fair';\n    return 'poor';\n  }\n\n  getMaintainabilityClass(maintainability: number): string {\n    if (maintainability >= 80) return 'excellent';\n    if (maintainability >= 60) return 'good';\n    if (maintainability >= 40) return 'fair';\n    return 'poor';\n  }\n\n  getIssueDistribution(): any[] {\n    const distribution = [\n      { name: 'Errors', severity: 'error', count: this.stats.totalErrors },\n      {\n        name: 'Warnings',\n        severity: 'warning',\n        count: this.stats.totalWarnings,\n      },\n      { name: 'Info', severity: 'info', count: this.stats.totalInfos },\n      { name: 'Hints', severity: 'hint', count: this.stats.totalHints },\n    ];\n\n    const total = distribution.reduce((sum, item) => sum + item.count, 0);\n\n    return distribution.map((item) => ({\n      ...item,\n      percentage: total > 0 ? (item.count / total) * 100 : 0,\n    }));\n  }\n\n  getMostCommonIssues(): any[] {\n    const codeCount = new Map<string, number>();\n\n    this.allErrors.forEach((error) => {\n      codeCount.set(error.code, (codeCount.get(error.code) || 0) + 1);\n    });\n\n    return Array.from(codeCount.entries())\n      .map(([code, count]) => ({ code, count }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, 5);\n  }\n\n  getRuleCategories(): any[] {\n    const categories = new Map<string, DslLintRule[]>();\n\n    this.lintRules.forEach((rule) => {\n      const categoryName =\n        rule.category.charAt(0).toUpperCase() + rule.category.slice(1);\n      if (!categories.has(categoryName)) {\n        categories.set(categoryName, []);\n      }\n      categories.get(categoryName)!.push(rule);\n    });\n\n    return Array.from(categories.entries()).map(([name, rules]) => ({\n      name,\n      rules,\n      enabledCount: rules.filter((rule) => rule.enabled).length,\n    }));\n  }\n\n  navigateToError(error: DslLintError): void {\n    this.errorSelected.emit(error);\n  }\n\n  applyQuickFix(error: DslLintError): void {\n    if (error.quickFix) {\n      this.quickFixApplied.emit({ error, fix: error.quickFix });\n      // Remove the error after applying the fix\n      this.allErrors = this.allErrors.filter((e) => e.id !== error.id);\n      this.applyFilters();\n    }\n  }\n\n  ignoreError(error: DslLintError): void {\n    this.allErrors = this.allErrors.filter((e) => e.id !== error.id);\n    this.applyFilters();\n  }\n\n  toggleRule(rule: DslLintRule, change: MatSlideToggleChange): void {\n    const enabled = change.checked;\n    rule.enabled = enabled;\n    this.ruleToggled.emit({ rule, enabled });\n    // Re-run linting to apply the rule change\n    this.runLinting();\n  }\n\n  configureRule(rule: DslLintRule): void {\n    // Open rule configuration dialog\n    console.log('Configure rule:', rule);\n  }\n\n  openLinterSettings(): void {\n    // Open linter settings dialog\n    console.log('Open linter settings');\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { \n  FieldSchema, \n  FieldType, \n  FIELD_TYPE_OPERATORS, \n  OPERATOR_LABELS,\n  FieldSchemaContext,\n  ContextVariable,\n  CustomFunction\n} from '../models/field-schema.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class FieldSchemaService {\n  private readonly _fieldSchemas = new BehaviorSubject<Record<string, FieldSchema>>({});\n  private readonly _context = new BehaviorSubject<FieldSchemaContext>({});\n\n  public readonly fieldSchemas$ = this._fieldSchemas.asObservable();\n  public readonly context$ = this._context.asObservable();\n\n  constructor() {}\n\n  /**\n   * Set field schemas for the visual builder\n   */\n  setFieldSchemas(schemas: Record<string, FieldSchema>): void {\n    this._fieldSchemas.next(schemas);\n  }\n\n  /**\n   * Add a single field schema\n   */\n  addFieldSchema(name: string, schema: FieldSchema): void {\n    const current = this._fieldSchemas.value;\n    this._fieldSchemas.next({\n      ...current,\n      [name]: schema\n    });\n  }\n\n  /**\n   * Remove a field schema\n   */\n  removeFieldSchema(name: string): void {\n    const current = this._fieldSchemas.value;\n    const updated = { ...current };\n    delete updated[name];\n    this._fieldSchemas.next(updated);\n  }\n\n  /**\n   * Get field schema by name\n   */\n  getFieldSchema(name: string): FieldSchema | undefined {\n    return this._fieldSchemas.value[name];\n  }\n\n  /**\n   * Get all field schemas\n   */\n  getAllFieldSchemas(): Record<string, FieldSchema> {\n    return this._fieldSchemas.value;\n  }\n\n  /**\n   * Get field schemas as array with enhanced info\n   */\n  getFieldSchemasArray(): Observable<EnhancedFieldSchema[]> {\n    return this.fieldSchemas$.pipe(\n      map(schemas => \n        Object.entries(schemas).map(([name, schema]) => ({\n          ...schema,\n          name,\n          operators: this.getAvailableOperators(schema.type),\n          operatorLabels: this.getOperatorLabels(schema.type)\n        }))\n      )\n    );\n  }\n\n  /**\n   * Set context for field schemas\n   */\n  setContext(context: FieldSchemaContext): void {\n    this._context.next(context);\n  }\n\n  /**\n   * Get available operators for a field type\n   */\n  getAvailableOperators(fieldType: FieldType): string[] {\n    return FIELD_TYPE_OPERATORS[fieldType] || [];\n  }\n\n  /**\n   * Get operator labels for a field type\n   */\n  getOperatorLabels(fieldType: FieldType): Record<string, string> {\n    const operators = this.getAvailableOperators(fieldType);\n    const labels: Record<string, string> = {};\n    \n    operators.forEach(op => {\n      labels[op] = OPERATOR_LABELS[op] || op;\n    });\n    \n    return labels;\n  }\n\n  /**\n   * Validate field value against schema\n   */\n  validateFieldValue(fieldName: string, value: any): ValidationResult {\n    const schema = this.getFieldSchema(fieldName);\n    \n    if (!schema) {\n      return {\n        valid: false,\n        errors: [`Field '${fieldName}' not found in schema`]\n      };\n    }\n\n    const errors: string[] = [];\n\n    // Type validation\n    if (!this.isValidType(value, schema.type)) {\n      errors.push(`Value must be of type ${schema.type}`);\n    }\n\n    // Required validation\n    if (schema.required && (value === null || value === undefined || value === '')) {\n      errors.push('Field is required');\n    }\n\n    // Format validation\n    if (value !== null && value !== undefined && schema.format) {\n      const formatErrors = this.validateFormat(value, schema.format, schema.type);\n      errors.push(...formatErrors);\n    }\n\n    // Enum validation\n    if (schema.allowedValues && schema.allowedValues.length > 0) {\n      const allowedValues = schema.allowedValues.map(opt => opt.value);\n      if (!allowedValues.includes(value)) {\n        errors.push(`Value must be one of: ${allowedValues.join(', ')}`);\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors\n    };\n  }\n\n  /**\n   * Get field suggestions based on partial input\n   */\n  getFieldSuggestions(partial: string, category?: string): FieldSchema[] {\n    const schemas = this.getAllFieldSchemas();\n    const lowerPartial = partial.toLowerCase();\n    \n    return Object.values(schemas)\n      .filter(schema => {\n        const matchesName = schema.name.toLowerCase().includes(lowerPartial);\n        const matchesLabel = schema.label.toLowerCase().includes(lowerPartial);\n        const matchesCategory = !category || schema.uiConfig?.category === category;\n        \n        return (matchesName || matchesLabel) && matchesCategory;\n      })\n      .sort((a, b) => {\n        // Prioritize exact matches, then starts with, then contains\n        const aExact = a.name.toLowerCase() === lowerPartial;\n        const bExact = b.name.toLowerCase() === lowerPartial;\n        if (aExact && !bExact) return -1;\n        if (!aExact && bExact) return 1;\n        \n        const aStarts = a.name.toLowerCase().startsWith(lowerPartial);\n        const bStarts = b.name.toLowerCase().startsWith(lowerPartial);\n        if (aStarts && !bStarts) return -1;\n        if (!aStarts && bStarts) return 1;\n        \n        return a.label.localeCompare(b.label);\n      });\n  }\n\n  /**\n   * Create field schema from JSON Schema\n   */\n  createFromJsonSchema(jsonSchema: any): Record<string, FieldSchema> {\n    const schemas: Record<string, FieldSchema> = {};\n    \n    if (jsonSchema.properties) {\n      Object.entries(jsonSchema.properties).forEach(([name, prop]: [string, any]) => {\n        schemas[name] = this.convertJsonSchemaProperty(name, prop, jsonSchema.required?.includes(name));\n      });\n    }\n    \n    return schemas;\n  }\n\n  /**\n   * Create field schema from form metadata\n   */\n  createFromFormMetadata(formFields: any[]): Record<string, FieldSchema> {\n    const schemas: Record<string, FieldSchema> = {};\n    \n    formFields.forEach(field => {\n      schemas[field.name] = {\n        name: field.name,\n        label: field.label || field.name,\n        type: this.mapFormFieldType(field.type),\n        description: field.description,\n        required: field.required,\n        allowedValues: field.options?.map((opt: any) => ({\n          value: opt.value,\n          label: opt.label || opt.value\n        })),\n        format: this.extractFormatFromField(field),\n        uiConfig: {\n          icon: field.icon,\n          category: field.category,\n          priority: field.priority\n        }\n      };\n    });\n    \n    return schemas;\n  }\n\n  /**\n   * Get context variables\n   */\n  getContextVariables(): Observable<ContextVariable[]> {\n    return this.context$.pipe(\n      map(context => context.contextVariables || [])\n    );\n  }\n\n  /**\n   * Get custom functions\n   */\n  getCustomFunctions(): Observable<CustomFunction[]> {\n    return this.context$.pipe(\n      map(context => context.customFunctions || [])\n    );\n  }\n\n  /**\n   * Group field schemas by category\n   */\n  getFieldSchemasByCategory(): Observable<Record<string, FieldSchema[]>> {\n    return this.getFieldSchemasArray().pipe(\n      map(schemas => {\n        const grouped: Record<string, FieldSchema[]> = {};\n        \n        schemas.forEach(schema => {\n          const category = schema.uiConfig?.category || 'Other';\n          if (!grouped[category]) {\n            grouped[category] = [];\n          }\n          grouped[category].push(schema);\n        });\n        \n        // Sort within each category\n        Object.values(grouped).forEach(categorySchemas => {\n          categorySchemas.sort((a, b) => {\n            const aPriority = a.uiConfig?.priority || 0;\n            const bPriority = b.uiConfig?.priority || 0;\n            \n            if (aPriority !== bPriority) {\n              return bPriority - aPriority; // Higher priority first\n            }\n            \n            return a.label.localeCompare(b.label);\n          });\n        });\n        \n        return grouped;\n      })\n    );\n  }\n\n  // Private helper methods\n\n  private isValidType(value: any, type: FieldType): boolean {\n    if (value === null || value === undefined) {\n      return true; // Let required validation handle this\n    }\n\n    switch (type) {\n      case FieldType.STRING:\n      case FieldType.EMAIL:\n      case FieldType.URL:\n      case FieldType.PHONE:\n      case FieldType.UUID:\n        return typeof value === 'string';\n      \n      case FieldType.NUMBER:\n        return typeof value === 'number' && !isNaN(value);\n      \n      case FieldType.INTEGER:\n        return typeof value === 'number' && Number.isInteger(value);\n      \n      case FieldType.BOOLEAN:\n        return typeof value === 'boolean';\n      \n      case FieldType.DATE:\n      case FieldType.DATETIME:\n      case FieldType.TIME:\n        return value instanceof Date || (typeof value === 'string' && !isNaN(Date.parse(value)));\n      \n      case FieldType.ARRAY:\n        return Array.isArray(value);\n      \n      case FieldType.OBJECT:\n      case FieldType.JSON:\n        return typeof value === 'object' && !Array.isArray(value);\n      \n      case FieldType.ENUM:\n        return true; // Type depends on enum values\n      \n      default:\n        return true;\n    }\n  }\n\n  private validateFormat(value: any, format: any, type: FieldType): string[] {\n    const errors: string[] = [];\n\n    if (format.minimum !== undefined) {\n      if (type === FieldType.STRING || type === FieldType.ARRAY) {\n        if (value.length < format.minimum) {\n          errors.push(`Minimum length is ${format.minimum}`);\n        }\n      } else if (type === FieldType.NUMBER || type === FieldType.INTEGER) {\n        if (value < format.minimum) {\n          errors.push(`Minimum value is ${format.minimum}`);\n        }\n      }\n    }\n\n    if (format.maximum !== undefined) {\n      if (type === FieldType.STRING || type === FieldType.ARRAY) {\n        if (value.length > format.maximum) {\n          errors.push(`Maximum length is ${format.maximum}`);\n        }\n      } else if (type === FieldType.NUMBER || type === FieldType.INTEGER) {\n        if (value > format.maximum) {\n          errors.push(`Maximum value is ${format.maximum}`);\n        }\n      }\n    }\n\n    if (format.pattern && typeof value === 'string') {\n      const regex = new RegExp(format.pattern);\n      if (!regex.test(value)) {\n        errors.push('Value does not match required pattern');\n      }\n    }\n\n    return errors;\n  }\n\n  private convertJsonSchemaProperty(name: string, prop: any, required: boolean = false): FieldSchema {\n    return {\n      name,\n      label: prop.title || name,\n      type: this.mapJsonSchemaType(prop.type, prop.format),\n      description: prop.description,\n      required,\n      allowedValues: prop.enum?.map((value: any) => ({\n        value,\n        label: value.toString()\n      })),\n      format: {\n        minimum: prop.minimum || prop.minLength,\n        maximum: prop.maximum || prop.maxLength,\n        pattern: prop.pattern\n      }\n    };\n  }\n\n  private mapJsonSchemaType(type: string, format?: string): FieldType {\n    if (format) {\n      switch (format) {\n        case 'email': return FieldType.EMAIL;\n        case 'uri': return FieldType.URL;\n        case 'date': return FieldType.DATE;\n        case 'date-time': return FieldType.DATETIME;\n        case 'time': return FieldType.TIME;\n        case 'uuid': return FieldType.UUID;\n      }\n    }\n\n    switch (type) {\n      case 'string': return FieldType.STRING;\n      case 'number': return FieldType.NUMBER;\n      case 'integer': return FieldType.INTEGER;\n      case 'boolean': return FieldType.BOOLEAN;\n      case 'array': return FieldType.ARRAY;\n      case 'object': return FieldType.OBJECT;\n      default: return FieldType.STRING;\n    }\n  }\n\n  private mapFormFieldType(type: string): FieldType {\n    const typeMap: Record<string, FieldType> = {\n      'text': FieldType.STRING,\n      'email': FieldType.EMAIL,\n      'url': FieldType.URL,\n      'tel': FieldType.PHONE,\n      'number': FieldType.NUMBER,\n      'checkbox': FieldType.BOOLEAN,\n      'date': FieldType.DATE,\n      'datetime-local': FieldType.DATETIME,\n      'time': FieldType.TIME,\n      'select': FieldType.ENUM,\n      'textarea': FieldType.STRING\n    };\n\n    return typeMap[type] || FieldType.STRING;\n  }\n\n  private extractFormatFromField(field: any): any {\n    const format: any = {};\n\n    if (field.minLength !== undefined) format.minimum = field.minLength;\n    if (field.maxLength !== undefined) format.maximum = field.maxLength;\n    if (field.min !== undefined) format.minimum = field.min;\n    if (field.max !== undefined) format.maximum = field.max;\n    if (field.pattern) format.pattern = field.pattern;\n\n    return Object.keys(format).length > 0 ? format : undefined;\n  }\n}\n\n// Helper interfaces\nexport interface EnhancedFieldSchema extends FieldSchema {\n  operators: string[];\n  operatorLabels: Record<string, string>;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport {\n  MatButtonToggleModule,\n  MatButtonToggleChange,\n} from '@angular/material/button-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\n\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\n\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { FieldSchemaService } from '../services/field-schema.service';\nimport { RuleCanvasComponent } from './rule-canvas.component';\nimport { MetadataEditorComponent } from './metadata-editor.component';\nimport { DslViewerComponent } from './dsl-viewer.component';\nimport { JsonViewerComponent } from './json-viewer.component';\nimport { RoundTripTesterComponent } from './round-trip-tester.component';\nimport { ExportDialogComponent } from './export-dialog.component';\nimport { DslLinterComponent } from './dsl-linter.component';\nimport {\n  RuleBuilderState,\n  RuleNode,\n  RuleNodeType,\n  ValidationError,\n  ExportOptions,\n  ImportOptions,\n  RuleBuilderConfig,\n  RuleNodeConfig,\n} from '../models/rule-builder.model';\nimport {\n  FieldSchema,\n  CustomFunction,\n  ContextVariable,\n} from '../models/field-schema.model';\n\n@Component({\n  selector: 'praxis-rule-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatCardModule,\n    MatButtonModule,\n    MatIconModule,\n    MatTabsModule,\n    MatToolbarModule,\n    MatSidenavModule,\n    MatListModule,\n    MatDividerModule,\n    MatProgressBarModule,\n    MatSnackBarModule,\n    MatButtonToggleModule,\n    MatTooltipModule,\n    MatDialogModule,\n    DragDropModule,\n    RuleCanvasComponent,\n    MetadataEditorComponent,\n    DslViewerComponent,\n    JsonViewerComponent,\n    RoundTripTesterComponent,\n    DslLinterComponent,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"rule-editor-container\" [class.embedded]=\"embedded\">\n      <!-- Header Toolbar -->\n      <mat-toolbar class=\"rule-editor-toolbar\">\n        <mat-toolbar-row>\n          <span class=\"toolbar-title\">\n            <mat-icon>rule</mat-icon>\n            Visual Rule Builder\n          </span>\n\n          <span class=\"toolbar-spacer\"></span>\n\n          <!-- Mode Selector -->\n          <mat-button-toggle-group\n            [value]=\"currentState?.mode\"\n            (change)=\"onModeChange($event)\"\n          >\n            <mat-button-toggle value=\"visual\">\n              <mat-icon>view_module</mat-icon>\n              Visual\n            </mat-button-toggle>\n            <mat-button-toggle value=\"dsl\">\n              <mat-icon>code</mat-icon>\n              DSL\n            </mat-button-toggle>\n            <mat-button-toggle value=\"json\">\n              <mat-icon>data_object</mat-icon>\n              JSON\n            </mat-button-toggle>\n          </mat-button-toggle-group>\n\n          <!-- Action Buttons -->\n          <button\n            mat-icon-button\n            [disabled]=\"!canUndo\"\n            (click)=\"undo()\"\n            matTooltip=\"Undo\"\n          >\n            <mat-icon>undo</mat-icon>\n          </button>\n\n          <button\n            mat-icon-button\n            [disabled]=\"!canRedo\"\n            (click)=\"redo()\"\n            matTooltip=\"Redo\"\n          >\n            <mat-icon>redo</mat-icon>\n          </button>\n\n          <button\n            mat-icon-button\n            (click)=\"clearRules()\"\n            matTooltip=\"Clear All Rules\"\n          >\n            <mat-icon>clear_all</mat-icon>\n          </button>\n\n          <button mat-button (click)=\"openExportDialog()\" color=\"primary\">\n            <mat-icon>download</mat-icon>\n            Export\n          </button>\n\n          <button mat-button (click)=\"importRules()\" color=\"accent\">\n            <mat-icon>upload</mat-icon>\n            Import\n          </button>\n        </mat-toolbar-row>\n      </mat-toolbar>\n\n      <!-- Main Content Area -->\n      <div class=\"rule-editor-content\">\n        <!-- Sidebar -->\n        <mat-sidenav-container class=\"sidenav-container\">\n          <mat-sidenav mode=\"side\" opened=\"true\" class=\"rule-editor-sidebar\">\n            <!-- Rules List -->\n            <div class=\"sidebar-section\">\n              <h3 class=\"sidebar-title\">\n                <mat-icon>list</mat-icon>\n                Rules\n              </h3>\n\n              <div\n                class=\"rules-list\"\n                cdkDropList\n                (cdkDropListDropped)=\"onRuleDrop($event)\"\n              >\n                <div\n                  *ngFor=\"\n                    let nodeId of currentState?.rootNodes;\n                    trackBy: trackByNodeId\n                  \"\n                  class=\"rule-item\"\n                  [class.selected]=\"isNodeSelected(nodeId)\"\n                  cdkDrag\n                  (click)=\"selectNode(nodeId)\"\n                >\n                  <div class=\"rule-item-content\">\n                    <mat-icon class=\"rule-type-icon\">{{\n                      getNodeIcon(getNode(nodeId))\n                    }}</mat-icon>\n                    <span class=\"rule-label\">{{ getNodeLabel(nodeId) }}</span>\n\n                    <div class=\"rule-actions\">\n                      <button\n                        mat-icon-button\n                        size=\"small\"\n                        (click)=\"editNode(nodeId); $event.stopPropagation()\"\n                      >\n                        <mat-icon>edit</mat-icon>\n                      </button>\n\n                      <button\n                        mat-icon-button\n                        size=\"small\"\n                        color=\"warn\"\n                        (click)=\"removeNode(nodeId); $event.stopPropagation()\"\n                      >\n                        <mat-icon>delete</mat-icon>\n                      </button>\n                    </div>\n                  </div>\n\n                  <!-- Nested Rules -->\n                  <div *ngIf=\"hasChildren(nodeId)\" class=\"nested-rules\">\n                    <div\n                      *ngFor=\"let childId of getChildren(nodeId)\"\n                      class=\"nested-rule-item\"\n                      [class.selected]=\"isNodeSelected(childId)\"\n                      (click)=\"selectNode(childId); $event.stopPropagation()\"\n                    >\n                      <mat-icon class=\"rule-type-icon\">{{\n                        getNodeIcon(getNode(childId))\n                      }}</mat-icon>\n                      <span class=\"rule-label\">{{\n                        getNodeLabel(childId)\n                      }}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Add Rule Button -->\n              <button\n                mat-fab\n                color=\"primary\"\n                class=\"add-rule-fab\"\n                (click)=\"showAddRuleDialog()\"\n              >\n                <mat-icon>add</mat-icon>\n              </button>\n            </div>\n\n            <mat-divider></mat-divider>\n\n            <!-- Field Palette -->\n            <div class=\"sidebar-section\">\n              <h3 class=\"sidebar-title\">\n                <mat-icon>view_list</mat-icon>\n                Fields\n              </h3>\n\n              <div class=\"field-palette\">\n                <div\n                  *ngFor=\"let category of fieldCategories\"\n                  class=\"field-category\"\n                >\n                  <h4 class=\"category-title\">{{ category.name }}</h4>\n\n                  <div\n                    *ngFor=\"let field of category.fields\"\n                    class=\"field-item\"\n                    draggable=\"true\"\n                    (dragstart)=\"onFieldDragStart(field, $event)\"\n                  >\n                    <mat-icon class=\"field-icon\">{{\n                      getFieldIcon(field.type)\n                    }}</mat-icon>\n                    <span class=\"field-label\">{{ field.label }}</span>\n                    <span class=\"field-type\">{{ field.type }}</span>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </mat-sidenav>\n\n          <!-- Main Editor Area -->\n          <mat-sidenav-content class=\"editor-content\">\n            <div class=\"editor-tabs\">\n              <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n                <!-- Visual Builder Tab -->\n                <mat-tab label=\"Visual Builder\">\n                  <div class=\"visual-builder\">\n                    <praxis-rule-canvas\n                      [state]=\"currentState\"\n                      [fieldSchemas]=\"fieldSchemas\"\n                      (nodeSelected)=\"selectNode($event)\"\n                      (nodeAdded)=\"onNodeAdded($event)\"\n                      (nodeUpdated)=\"onNodeUpdated($event)\"\n                      (nodeRemoved)=\"removeNode($event)\"\n                    >\n                    </praxis-rule-canvas>\n                  </div>\n                </mat-tab>\n\n                <!-- Metadata Editor Tab -->\n                <mat-tab label=\"Metadata\">\n                  <div class=\"metadata-editor\">\n                    <praxis-metadata-editor\n                      [selectedNode]=\"selectedNode\"\n                      (metadataUpdated)=\"onMetadataUpdated($event)\"\n                    >\n                    </praxis-metadata-editor>\n                  </div>\n                </mat-tab>\n\n                <!-- DSL Viewer Tab -->\n                <mat-tab label=\"DSL Preview\">\n                  <div class=\"dsl-viewer\">\n                    <praxis-dsl-viewer\n                      [dsl]=\"currentState?.currentDSL || ''\"\n                      [editable]=\"currentState?.mode === 'dsl'\"\n                      (dslChanged)=\"onDslChanged($event)\"\n                    >\n                    </praxis-dsl-viewer>\n                  </div>\n                </mat-tab>\n\n                <!-- JSON Viewer Tab -->\n                <mat-tab label=\"JSON Preview\">\n                  <div class=\"json-viewer\">\n                    <praxis-json-viewer\n                      [json]=\"builderStateJson\"\n                      [editable]=\"currentState?.mode === 'json'\"\n                      (jsonChanged)=\"onJsonChanged($event)\"\n                    >\n                    </praxis-json-viewer>\n                  </div>\n                </mat-tab>\n\n                <!-- Round-Trip Tester Tab -->\n                <mat-tab label=\"Round-Trip Validation\">\n                  <div class=\"round-trip-tester\">\n                    <praxis-round-trip-tester></praxis-round-trip-tester>\n                  </div>\n                </mat-tab>\n\n                <!-- DSL Linter Tab -->\n                <mat-tab label=\"DSL Linter\">\n                  <div class=\"dsl-linter\">\n                    <praxis-dsl-linter\n                      [dsl]=\"currentState?.currentDSL || ''\"\n                      [autoLint]=\"true\"\n                      (errorSelected)=\"onLinterErrorSelected($event)\"\n                      (quickFixApplied)=\"onQuickFixApplied($event)\"\n                      (ruleToggled)=\"onLinterRuleToggled($event)\"\n                    >\n                    </praxis-dsl-linter>\n                  </div>\n                </mat-tab>\n              </mat-tab-group>\n            </div>\n          </mat-sidenav-content>\n        </mat-sidenav-container>\n      </div>\n\n      <!-- Status Bar -->\n      <div class=\"status-bar\">\n        <div class=\"status-left\">\n          <span class=\"node-count\">{{ getRuleCount() }} rules</span>\n          <span *ngIf=\"currentState?.isDirty\" class=\"dirty-indicator\">•</span>\n        </div>\n\n        <div class=\"status-center\">\n          <div\n            *ngIf=\"validationErrors && validationErrors.length > 0\"\n            class=\"validation-status error\"\n          >\n            <mat-icon>error</mat-icon>\n            {{ validationErrors.length }} error(s)\n          </div>\n          <div\n            *ngIf=\"validationErrors?.length === 0\"\n            class=\"validation-status success\"\n          >\n            <mat-icon>check_circle</mat-icon>\n            Valid\n          </div>\n        </div>\n\n        <div class=\"status-right\">\n          <span class=\"mode-indicator\">{{\n            currentState?.mode?.toUpperCase()\n          }}</span>\n        </div>\n      </div>\n\n      <!-- Validation Errors Panel -->\n      <div\n        *ngIf=\"\n          showValidationErrors &&\n          validationErrors &&\n          validationErrors.length > 0\n        \"\n        class=\"validation-panel\"\n      >\n        <div class=\"validation-header\">\n          <h3>Validation Errors</h3>\n          <button mat-icon-button (click)=\"hideValidationErrors()\">\n            <mat-icon>close</mat-icon>\n          </button>\n        </div>\n\n        <div class=\"validation-list\">\n          <div\n            *ngFor=\"let error of validationErrors\"\n            class=\"validation-error\"\n            [class]=\"error.severity\"\n          >\n            <mat-icon>{{ getErrorIcon(error.severity) }}</mat-icon>\n            <div class=\"error-content\">\n              <div class=\"error-message\">{{ error.message }}</div>\n              <div *ngIf=\"error.suggestion\" class=\"error-suggestion\">\n                Suggestion: {{ error.suggestion }}\n              </div>\n            </div>\n            <button\n              *ngIf=\"error.nodeId\"\n              mat-icon-button\n              (click)=\"selectNode(error.nodeId)\"\n            >\n              <mat-icon>my_location</mat-icon>\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      /* Component theme inherits from global md-sys tokens */\n      .rule-editor-container {\n        display: flex;\n        flex-direction: column;\n        height: 100vh;\n        overflow: hidden;\n      }\n\n      .rule-editor-container.embedded {\n        /* Em modo embutido, deixe o container crescer com o conteúdo */\n        height: auto;\n        overflow: visible;\n      }\n\n      .rule-editor-toolbar {\n        background: var(--md-sys-color-primary);\n        color: white;\n        flex-shrink: 0;\n      }\n\n      .toolbar-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        font-weight: 500;\n      }\n\n      .toolbar-spacer {\n        flex: 1;\n      }\n\n      .rule-editor-content {\n        flex: 1;\n        min-height: 0;\n      }\n\n      .sidenav-container {\n        height: 100%;\n        min-height: 0;\n      }\n\n      .rule-editor-sidebar {\n        width: 300px;\n        padding: 16px;\n        background: var(--md-sys-color-surface);\n        border-right: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      .sidebar-section {\n        margin-bottom: 24px;\n      }\n\n      .sidebar-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin: 0 0 16px 0;\n        font-size: 14px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .rules-list {\n        min-height: 200px;\n      }\n\n      .rule-item {\n        margin-bottom: 8px;\n        padding: 12px;\n        border: 1px solid var(--md-sys-color-outline-variant);\n        border-radius: 8px;\n        cursor: pointer;\n        transition: all 0.2s ease;\n      }\n\n      .rule-item:hover { border-color: var(--md-sys-color-primary); box-shadow: 0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,0.1)); }\n\n      .rule-item.selected {\n        border-color: var(--md-sys-color-primary);\n        background: var(--md-sys-color-primary-container);\n      }\n\n      .rule-item-content {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .rule-type-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n        color: var(--md-sys-color-primary);\n      }\n\n      .rule-label {\n        flex: 1;\n        font-size: 14px;\n        font-weight: 500;\n      }\n\n      .rule-actions {\n        display: flex;\n        gap: 4px;\n        opacity: 0;\n        transition: opacity 0.2s ease;\n      }\n\n      .rule-item:hover .rule-actions {\n        opacity: 1;\n      }\n\n      .nested-rules {\n        margin-top: 8px;\n        margin-left: 24px;\n        border-left: 2px solid var(--md-sys-color-outline-variant);\n        padding-left: 12px;\n      }\n\n      .nested-rule-item {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 6px;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 13px;\n      }\n\n      .nested-rule-item:hover {\n        background: var(--md-sys-color-surface-container);\n      }\n\n      .nested-rule-item.selected {\n        background: var(--md-sys-color-primary-container);\n      }\n\n      .add-rule-fab {\n        position: absolute;\n        bottom: 16px;\n        right: 16px;\n        scale: 0.8;\n      }\n\n      .field-palette {\n        max-height: 300px;\n        overflow-y: auto;\n      }\n\n      .field-category {\n        margin-bottom: 16px;\n      }\n\n      .category-title {\n        font-size: 12px;\n        font-weight: 600;\n        color: var(--md-sys-color-primary);\n        margin: 0 0 8px 0;\n        text-transform: uppercase;\n        letter-spacing: 0.5px;\n      }\n\n      .field-item {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px;\n        border-radius: 4px;\n        cursor: grab;\n        font-size: 13px;\n        transition: background 0.2s ease;\n      }\n\n      .field-item:hover {\n        background: var(--md-sys-color-surface-container);\n      }\n\n      .field-item:active {\n        cursor: grabbing;\n      }\n\n      .field-icon {\n        font-size: 14px;\n        width: 14px;\n        height: 14px;\n        color: var(--md-sys-color-secondary);\n      }\n\n      .field-label {\n        flex: 1;\n        font-weight: 500;\n      }\n\n      .field-type {\n        font-size: 11px;\n        color: var(--md-sys-color-on-surface-variant);\n        background: var(--md-sys-color-surface-container);\n        padding: 2px 6px;\n        border-radius: 4px;\n      }\n\n      .editor-content {\n        background: var(--md-sys-color-background);\n      }\n\n      .editor-tabs {\n        height: 100%;\n      }\n\n      .visual-builder,\n      .metadata-editor,\n      .dsl-viewer,\n      .json-viewer,\n      .round-trip-tester,\n      .dsl-linter {\n        height: 100%;\n        padding: 16px;\n        box-sizing: border-box;\n      }\n\n      .round-trip-tester,\n      .dsl-linter {\n        padding: 0; /* Let the component handle its own padding */\n      }\n\n      .status-bar {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 8px 16px;\n        background: var(--md-sys-color-surface-container);\n        border-top: 1px solid var(--md-sys-color-outline-variant);\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .status-left,\n      .status-center,\n      .status-right {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .dirty-indicator {\n        color: var(--md-sys-color-primary);\n        font-weight: bold;\n      }\n\n      .validation-status {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-weight: 500;\n      }\n\n      .validation-status.error {\n        color: var(--md-sys-color-error);\n      }\n\n      .validation-status.success {\n        color: var(--md-sys-color-tertiary);\n      }\n\n      .validation-status mat-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n      }\n\n      .mode-indicator {\n        font-weight: 600;\n        color: var(--md-sys-color-primary);\n      }\n\n      .validation-panel {\n        position: fixed;\n        bottom: 0;\n        left: 0;\n        right: 0;\n        max-height: 200px;\n        background: var(--md-sys-color-surface);\n        border-top: 1px solid var(--md-sys-color-outline-variant);\n        box-shadow: 0 -2px 8px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n        z-index: 1000;\n      }\n\n      .validation-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 12px 16px;\n        border-bottom: 1px solid var(--md-sys-color-outline-variant);\n      }\n\n      .validation-header h3 {\n        margin: 0;\n        font-size: 14px;\n        font-weight: 500;\n      }\n\n      .validation-list {\n        max-height: 150px;\n        overflow-y: auto;\n        padding: 8px;\n      }\n\n      .validation-error {\n        display: flex;\n        align-items: flex-start;\n        gap: 8px;\n        padding: 8px;\n        border-radius: 4px;\n        margin-bottom: 4px;\n      }\n\n      .validation-error.error {\n        background: var(--md-sys-color-error-container);\n        color: var(--md-sys-color-on-error-container);\n      }\n\n      .validation-error.warning {\n        background: var(--md-sys-color-secondary-container);\n        color: var(--md-sys-color-on-secondary-container);\n      }\n\n      .validation-error.info {\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n      }\n\n      .error-content {\n        flex: 1;\n      }\n\n      .error-message {\n        font-weight: 500;\n        margin-bottom: 2px;\n      }\n\n      .error-suggestion {\n        font-size: 12px;\n        opacity: 0.8;\n      }\n\n      /* Drag and drop styles */\n      .cdk-drag-preview {\n        box-sizing: border-box;\n        border-radius: 4px;\n        box-shadow: 0 6px 16px var(--vb-shadow-medium-color, rgba(0,0,0,0.18));\n      }\n\n      .cdk-drag-placeholder {\n        opacity: 0;\n      }\n\n      .cdk-drag-animating {\n        transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n      }\n\n      .cdk-drop-list-dragging .rule-item:not(.cdk-drag-placeholder) {\n        transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n      }\n    `,\n  ],\n})\nexport class RuleEditorComponent implements OnInit, OnDestroy, OnChanges {\n  @Input() config: RuleBuilderConfig | null = null;\n  @Input() initialRules: any = null;\n  @Input() embedded = false;\n\n  @Output() rulesChanged = new EventEmitter<any>();\n  @Output() exportRequested = new EventEmitter<ExportOptions>();\n  @Output() importRequested = new EventEmitter<ImportOptions>();\n\n  private destroy$ = new Subject<void>();\n\n  // Component state\n  currentState: RuleBuilderState | null = null;\n  // Derived: JSON representation of the builder state (nodes/rootNodes[/selectedNodeId])\n  builderStateJson: any = null;\n  validationErrors: ValidationError[] = [];\n  selectedNode: RuleNode | null = null;\n  fieldSchemas: Record<string, FieldSchema> = {};\n  fieldCategories: any[] = [];\n\n  activeTabIndex = 0;\n  showValidationErrors = false;\n\n  // Computed properties\n  get canUndo(): boolean {\n    return (this.currentState?.historyPosition || 0) > 0;\n  }\n\n  get canRedo(): boolean {\n    return (\n      (this.currentState?.historyPosition || 0) <\n      (this.currentState?.history.length || 0) - 1\n    );\n  }\n\n  constructor(\n    private ruleBuilderService: RuleBuilderService,\n    private fieldSchemaService: FieldSchemaService,\n    private snackBar: MatSnackBar,\n    private fb: FormBuilder,\n    private dialog: MatDialog,\n  ) {}\n\n  ngOnInit(): void {\n    this.setupSubscriptions();\n    this.initializeBuilder();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['initialRules'] && !changes['initialRules'].firstChange) {\n      try {\n        this.importInitialRules();\n      } catch (error) {\n        console.error('Failed to re-import rules:', error);\n      }\n    }\n  }\n\n  private setupSubscriptions(): void {\n    // Subscribe to rule builder state changes\n    this.ruleBuilderService.state$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((state) => {\n        this.currentState = state;\n        this.updateBuilderStateJson();\n        this.updateSelectedNode();\n        this.rulesChanged.emit(state);\n      });\n\n    // Subscribe to validation errors\n    this.ruleBuilderService.validationErrors$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((errors) => {\n        this.validationErrors = errors;\n        this.showValidationErrors = errors.length > 0;\n      });\n\n    // Subscribe to node selection\n    this.ruleBuilderService.nodeSelected$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((nodeId) => {\n        this.updateSelectedNode();\n      });\n\n    // Subscribe to field schemas\n    combineLatest([\n      this.fieldSchemaService.fieldSchemas$,\n      this.fieldSchemaService.getFieldSchemasByCategory(),\n    ])\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(([schemas, categories]) => {\n        this.fieldSchemas = schemas;\n        this.fieldCategories = Object.entries(categories).map(\n          ([name, fields]) => ({\n            name,\n            fields,\n          }),\n        );\n      });\n  }\n\n  private initializeBuilder(): void {\n    if (this.config) {\n      this.ruleBuilderService.initialize(this.config);\n      this.fieldSchemaService.setFieldSchemas(\n        this.config.fieldSchemas as Record<string, FieldSchema>,\n      );\n\n      if (this.config.contextVariables) {\n        this.fieldSchemaService.setContext({\n          contextVariables: this.config.contextVariables as ContextVariable[],\n          customFunctions: this.config.customFunctions as CustomFunction[],\n        });\n      }\n    }\n\n    if (this.initialRules) {\n      this.importInitialRules();\n    }\n  }\n\n  private updateBuilderStateJson(): void {\n    const state = this.currentState;\n    if (state && Array.isArray(state.rootNodes) && state.rootNodes.length > 0) {\n      // Build minimal, stable view of the builder state for JSON preview\n      const json: any = {\n        nodes: state.nodes,\n        rootNodes: state.rootNodes,\n      };\n      if (state.selectedNodeId) {\n        json.selectedNodeId = state.selectedNodeId;\n      }\n      this.builderStateJson = json;\n    } else {\n      this.builderStateJson = null;\n    }\n  }\n\n  private importInitialRules(): void {\n    try {\n      let content: string;\n      let format: 'json' | 'dsl' = 'json';\n\n      if (typeof this.initialRules === 'string') {\n        content = this.initialRules;\n        const trimmed = content.trim();\n        // Heurística simples para detectar JSON vs DSL\n        if (!(trimmed.startsWith('{') || trimmed.startsWith('['))) {\n          format = 'dsl';\n        }\n      } else {\n        content = JSON.stringify(this.initialRules);\n      }\n      try { (console.debug || console.log)(\n        '[RuleEditor] importInitialRules',\n        { format, contentPreview: (content || '').slice(0, 200) }\n      ); } catch {}\n      this.ruleBuilderService.import(content, { format });\n    } catch (error) {\n      console.error('Failed to import initial rules:', error);\n      this.snackBar.open('Failed to import initial rules', 'Close', {\n        duration: 3000,\n      });\n    }\n  }\n\n  private updateSelectedNode(): void {\n    if (this.currentState?.selectedNodeId) {\n      this.selectedNode =\n        this.currentState.nodes[this.currentState.selectedNodeId] || null;\n    } else {\n      this.selectedNode = null;\n    }\n  }\n\n  // Template methods\n  trackByNodeId(index: number, nodeId: string): string {\n    return nodeId;\n  }\n\n  getNode(nodeId: string): RuleNode | null {\n    return this.currentState?.nodes[nodeId] || null;\n  }\n\n  getNodeLabel(nodeId: string): string {\n    const node = this.getNode(nodeId);\n    return node?.label || node?.type || 'Unknown';\n  }\n\n  getNodeIcon(node: RuleNode | null): string {\n    if (!node) return 'help';\n\n    const icons: Record<RuleNodeType, string> = {\n      [RuleNodeType.FIELD_CONDITION]: 'compare_arrows',\n      [RuleNodeType.AND_GROUP]: 'join_inner',\n      [RuleNodeType.OR_GROUP]: 'join_full',\n      [RuleNodeType.NOT_GROUP]: 'block',\n      [RuleNodeType.XOR_GROUP]: 'join_left',\n      [RuleNodeType.IMPLIES_GROUP]: 'arrow_forward',\n      // Phase 1: Conditional Validators (Enhanced Icons)\n      [RuleNodeType.REQUIRED_IF]: 'star_border',\n      [RuleNodeType.VISIBLE_IF]: 'visibility',\n      [RuleNodeType.DISABLED_IF]: 'block',\n      [RuleNodeType.READONLY_IF]: 'lock_outline',\n      [RuleNodeType.FOR_EACH]: 'repeat',\n      [RuleNodeType.UNIQUE_BY]: 'fingerprint',\n      [RuleNodeType.MIN_LENGTH]: 'height',\n      [RuleNodeType.MAX_LENGTH]: 'height',\n      [RuleNodeType.IF_DEFINED]: 'help',\n      [RuleNodeType.IF_NOT_NULL]: 'help_outline',\n      [RuleNodeType.IF_EXISTS]: 'search',\n      [RuleNodeType.WITH_DEFAULT]: 'settings_backup_restore',\n      [RuleNodeType.FUNCTION_CALL]: 'functions',\n      [RuleNodeType.FIELD_TO_FIELD]: 'compare_arrows',\n      [RuleNodeType.CONTEXTUAL]: 'dynamic_form',\n      [RuleNodeType.AT_LEAST]: 'filter_list',\n      [RuleNodeType.EXACTLY]: 'looks_one',\n      [RuleNodeType.EXPRESSION]: 'code',\n      [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'view_module',\n      [RuleNodeType.CUSTOM]: 'extension',\n    };\n\n    return icons[node.type] || 'help';\n  }\n\n  getFieldIcon(type: string): string {\n    const icons: Record<string, string> = {\n      string: 'text_fields',\n      number: 'pin',\n      integer: 'pin',\n      boolean: 'toggle_on',\n      date: 'event',\n      datetime: 'schedule',\n      time: 'access_time',\n      email: 'email',\n      url: 'link',\n      phone: 'phone',\n      array: 'list',\n      object: 'data_object',\n      enum: 'list',\n      uuid: 'fingerprint',\n      json: 'data_object',\n    };\n\n    return icons[type] || 'text_fields';\n  }\n\n  isNodeSelected(nodeId: string): boolean {\n    return this.currentState?.selectedNodeId === nodeId;\n  }\n\n  hasChildren(nodeId: string): boolean {\n    const node = this.getNode(nodeId);\n    return !!(node?.children && node.children.length > 0);\n  }\n\n  getChildren(nodeId: string): string[] {\n    const node = this.getNode(nodeId);\n    return node?.children || [];\n  }\n\n  getRuleCount(): number {\n    return Object.keys(this.currentState?.nodes || {}).length;\n  }\n\n  getErrorIcon(severity: string): string {\n    const icons: Record<string, string> = {\n      error: 'error',\n      warning: 'warning',\n      info: 'info',\n    };\n\n    return icons[severity] || 'info';\n  }\n\n  // Event handlers\n  onModeChange(event: MatButtonToggleChange): void {\n    const mode = event.value as any;\n    // Handle mode change\n  }\n\n  selectNode(nodeId?: string): void {\n    this.ruleBuilderService.selectNode(nodeId);\n  }\n\n  editNode(nodeId: string): void {\n    // Open edit dialog or navigate to metadata tab\n    this.selectNode(nodeId);\n    this.activeTabIndex = 1; // Metadata tab\n  }\n\n  removeNode(nodeId: string): void {\n    this.ruleBuilderService.removeNode(nodeId);\n    this.snackBar\n      .open('Rule removed', 'Undo', { duration: 3000 })\n      .onAction()\n      .subscribe(() => {\n        this.undo();\n      });\n  }\n\n  onRuleDrop(event: CdkDragDrop<string[]>): void {\n    if (event.previousIndex !== event.currentIndex) {\n      // Handle rule reordering\n    }\n  }\n\n  onFieldDragStart(field: FieldSchema, event: DragEvent): void {\n    if (event.dataTransfer) {\n      event.dataTransfer.setData('field', JSON.stringify(field));\n    }\n  }\n\n  showAddRuleDialog(): void {\n    // Open add rule dialog\n  }\n\n  onNodeAdded(event: {\n    type: RuleNodeType;\n    parentId?: string;\n    config?: RuleNodeConfig;\n  }): void {\n    const nodeId = this.ruleBuilderService.addNode(\n      { type: event.type, config: event.config },\n      event.parentId,\n    );\n    this.ruleBuilderService.selectNode(nodeId);\n    this.snackBar.open('Rule added', 'Close', { duration: 2000 });\n  }\n\n  onNodeUpdated(event: { nodeId: string; updates: Partial<RuleNode> }): void {\n    this.ruleBuilderService.updateNode(event.nodeId, event.updates);\n  }\n\n  onMetadataUpdated(event: any): void {\n    if (this.selectedNode) {\n      this.ruleBuilderService.updateNode(this.selectedNode.id, {\n        metadata: event,\n      });\n    }\n  }\n\n  onDslChanged(dsl: string): void {\n    try {\n      this.ruleBuilderService.import(dsl, { format: 'dsl', merge: false });\n      this.snackBar.open('DSL imported successfully', 'Close', {\n        duration: 2000,\n      });\n    } catch (error) {\n      console.error('Failed to import DSL:', error);\n      this.snackBar.open('Failed to import DSL: Invalid syntax', 'Close', {\n        duration: 3000,\n      });\n    }\n  }\n\n  onJsonChanged(json: any): void {\n    try {\n      const jsonString = typeof json === 'string' ? json : JSON.stringify(json);\n      this.ruleBuilderService.import(jsonString, {\n        format: 'json',\n        merge: false,\n      });\n      this.snackBar.open('JSON imported successfully', 'Close', {\n        duration: 2000,\n      });\n    } catch (error) {\n      console.error('Failed to import JSON:', error);\n      this.snackBar.open('Failed to import JSON: Invalid format', 'Close', {\n        duration: 3000,\n      });\n    }\n  }\n\n  undo(): void {\n    this.ruleBuilderService.undo();\n  }\n\n  redo(): void {\n    this.ruleBuilderService.redo();\n  }\n\n  clearRules(): void {\n    this.ruleBuilderService.clear();\n    this.snackBar.open('All rules cleared', 'Close', { duration: 2000 });\n  }\n\n  openExportDialog(): void {\n    const dialogRef = this.dialog.open(ExportDialogComponent, {\n      width: '800px',\n      maxWidth: '90vw',\n      data: {\n        title: 'Export Rules',\n        allowMultipleFormats: true,\n        preselectedFormat: this.currentState?.mode === 'dsl' ? 'dsl' : 'json',\n        showIntegrationTab: true,\n        showSharingTab: true,\n      },\n    });\n\n    dialogRef.afterClosed().subscribe((result) => {\n      if (result) {\n        // Handle any post-export actions if needed\n        this.snackBar.open('Export completed', 'Close', { duration: 2000 });\n      }\n    });\n  }\n\n  importRules(): void {\n    // Create file input element\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = '.json,.dsl,.txt';\n    input.multiple = false;\n\n    input.onchange = (event: any) => {\n      const file = event.target.files[0];\n      if (!file) return;\n\n      const reader = new FileReader();\n      reader.onload = (e) => {\n        try {\n          const content = e.target?.result as string;\n          const format =\n            file.name.endsWith('.dsl') || file.name.endsWith('.txt')\n              ? 'dsl'\n              : 'json';\n\n          this.ruleBuilderService.import(content, { format, merge: false });\n          this.snackBar.open(`Rules imported from ${file.name}`, 'Close', {\n            duration: 2000,\n          });\n        } catch (error) {\n          console.error('Import failed:', error);\n          this.snackBar.open(\n            'Failed to import rules: Invalid format',\n            'Close',\n            { duration: 3000 },\n          );\n        }\n      };\n\n      reader.readAsText(file);\n    };\n\n    input.click();\n  }\n\n  hideValidationErrors(): void {\n    this.showValidationErrors = false;\n  }\n\n  onLinterErrorSelected(error: any): void {\n    // Navigate to the error location in DSL viewer\n    this.activeTabIndex = 2; // DSL Preview tab\n    // Additional logic to highlight the specific line/column could be added here\n    console.log('Navigate to linter error:', error);\n  }\n\n  onQuickFixApplied(event: any): void {\n    // Apply the quick fix to the DSL\n    const { error, fix } = event;\n\n    try {\n      // Get current DSL\n      let currentDsl = this.currentState?.currentDSL || '';\n\n      // Apply edits from the quick fix\n      if (fix.edits && fix.edits.length > 0) {\n        const lines = currentDsl.split('\\n');\n\n        // Apply edits in reverse order to maintain line/column positions\n        fix.edits\n          .sort((a: any, b: any) => b.range.startLine - a.range.startLine)\n          .forEach((edit: any) => {\n            const lineIndex = edit.range.startLine - 1;\n            if (lineIndex >= 0 && lineIndex < lines.length) {\n              const line = lines[lineIndex];\n              const before = line.substring(0, edit.range.startColumn - 1);\n              const after = line.substring(edit.range.endColumn - 1);\n              lines[lineIndex] = before + edit.newText + after;\n            }\n          });\n\n        const fixedDsl = lines.join('\\n');\n\n        // Import the fixed DSL\n        this.ruleBuilderService.import(fixedDsl, {\n          format: 'dsl',\n          merge: false,\n        });\n        this.snackBar.open(`Quick fix applied: ${fix.title}`, 'Close', {\n          duration: 3000,\n        });\n      }\n    } catch (error) {\n      console.error('Failed to apply quick fix:', error);\n      this.snackBar.open('Failed to apply quick fix', 'Close', {\n        duration: 3000,\n      });\n    }\n  }\n\n  onLinterRuleToggled(event: any): void {\n    const { rule, enabled } = event;\n    console.log(`Linter rule ${rule.id} ${enabled ? 'enabled' : 'disabled'}`);\n\n    // Save linter rule preferences (could be stored in local storage or user preferences)\n    const preferences = JSON.parse(\n      localStorage.getItem('dsl-linter-rules') || '{}',\n    );\n    preferences[rule.id] = enabled;\n    localStorage.setItem('dsl-linter-rules', JSON.stringify(preferences));\n\n    this.snackBar.open(\n      `Rule \"${rule.name}\" ${enabled ? 'enabled' : 'disabled'}`,\n      'Close',\n      { duration: 2000 },\n    );\n  }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { RuleEditorComponent } from './components/rule-editor.component';\nimport { RuleBuilderConfig, ExportOptions, ImportOptions } from './models/rule-builder.model';\n\n@Component({\n  selector: 'praxis-visual-builder',\n  standalone: true,\n  imports: [RuleEditorComponent],\n  template: `\n    <div class=\"praxis-visual-builder mat-app-background\">\n      <praxis-rule-editor\n        [config]=\"config\"\n        [initialRules]=\"initialRules\"\n        [embedded]=\"true\"\n        (rulesChanged)=\"onRulesChanged($event)\"\n        (exportRequested)=\"onExportRequested($event)\"\n        (importRequested)=\"onImportRequested($event)\">\n      </praxis-rule-editor>\n    </div>\n  `,\n  styleUrls: ['./styles/visual-builder-theme.scss'],\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: auto; /* permitir que o host cresça conforme o conteúdo quando embutido */\n    }\n    \n    .praxis-visual-builder {\n      width: 100%;\n      height: auto; /* evitar prender a altura (causa corte do rodapé) */\n      overflow: visible; /* permitir que menus e FABs não sejam cortados */\n    }\n  `]\n})\nexport class PraxisVisualBuilder {\n  @Input() config: RuleBuilderConfig | null = null;\n  @Input() initialRules: any = null;\n  \n  @Output() rulesChanged = new EventEmitter<any>();\n  @Output() exportRequested = new EventEmitter<ExportOptions>();\n  @Output() importRequested = new EventEmitter<ImportOptions>();\n\n  onRulesChanged(rules: any): void {\n    this.rulesChanged.emit(rules);\n  }\n\n  onExportRequested(options: ExportOptions): void {\n    this.exportRequested.emit(options);\n  }\n\n  onImportRequested(options: ImportOptions): void {\n    this.importRequested.emit(options);\n  }\n}\n","/**\n * Array Field Schema Support for Collection Validators\n * Phase 2 Implementation\n */\n\nimport { FieldSchema, FieldType } from './field-schema.model';\nimport { CollectionValidatorConfig } from './rule-builder.model';\n\n/**\n * Extended field schema for array types\n */\nexport interface ArrayFieldSchema extends FieldSchema {\n  type: FieldType.ARRAY;\n  \n  /** Schema for individual items in the array */\n  itemSchema?: FieldSchema;\n  \n  /** Minimum number of items */\n  minItems?: number;\n  \n  /** Maximum number of items */\n  maxItems?: number;\n  \n  /** Whether items must be unique */\n  uniqueItems?: boolean;\n  \n  /** Fields to check for uniqueness */\n  uniqueBy?: string[];\n  \n  /** Default value for new items */\n  defaultItem?: any;\n  \n  /** Whether to allow adding items */\n  allowAdd?: boolean;\n  \n  /** Whether to allow removing items */\n  allowRemove?: boolean;\n  \n  /** Whether to allow reordering items */\n  allowReorder?: boolean;\n  \n  /** Custom validation rules for the array */\n  arrayValidation?: {\n    forEach?: {\n      rules: any[];\n      stopOnFirstError?: boolean;\n    };\n    uniqueBy?: {\n      fields: string[];\n      caseSensitive?: boolean;\n      ignoreEmpty?: boolean;\n    };\n    length?: {\n      min?: number;\n      max?: number;\n      errorMessage?: string;\n    };\n  };\n  \n  /** UI configuration specific to arrays */\n  arrayUiConfig?: {\n    /** How to display the array */\n    displayMode?: 'table' | 'cards' | 'list' | 'accordion';\n    \n    /** Whether to show item count */\n    showCount?: boolean;\n    \n    /** Custom add button text */\n    addButtonText?: string;\n    \n    /** Custom remove button text */\n    removeButtonText?: string;\n    \n    /** Whether to confirm before removing */\n    confirmRemove?: boolean;\n    \n    /** Message to show when array is empty */\n    emptyMessage?: string;\n    \n    /** Whether to collapse items by default */\n    collapsedByDefault?: boolean;\n    \n    /** Maximum items to show before pagination */\n    pageSize?: number;\n  };\n}\n\n/**\n * Utility to check if a field schema is an array\n */\nexport function isArrayFieldSchema(schema: FieldSchema): schema is ArrayFieldSchema {\n  return schema.type === FieldType.ARRAY;\n}\n\n/**\n * Utility to get nested field paths from an array schema\n */\nexport function getArrayItemFieldPaths(schema: ArrayFieldSchema, prefix: string = ''): string[] {\n  const paths: string[] = [];\n  \n  if (!schema.itemSchema) {\n    return paths;\n  }\n  \n  const itemPrefix = prefix ? `${prefix}.` : '';\n  \n  if (schema.itemSchema.type === FieldType.OBJECT && 'properties' in schema.itemSchema) {\n    // Handle object items\n    const objectSchema = schema.itemSchema as any;\n    Object.entries(objectSchema.properties || {}).forEach(([key, prop]: [string, any]) => {\n      const fieldPath = `${itemPrefix}${key}`;\n      paths.push(fieldPath);\n      \n      // Recursively handle nested arrays\n      if (prop.type === FieldType.ARRAY) {\n        paths.push(...getArrayItemFieldPaths(prop as ArrayFieldSchema, fieldPath));\n      }\n    });\n  } else {\n    // Handle primitive items\n    paths.push(itemPrefix);\n  }\n  \n  return paths;\n}\n\n/**\n * Array validation context for runtime validation\n */\nexport interface ArrayValidationContext {\n  /** The array being validated */\n  array: any[];\n  \n  /** Current item being validated (for forEach) */\n  currentItem?: any;\n  \n  /** Current item index (for forEach) */\n  currentIndex?: number;\n  \n  /** Parent context */\n  parentContext?: any;\n  \n  /** Field schema */\n  schema: ArrayFieldSchema;\n  \n  /** Accumulated errors */\n  errors: ArrayValidationError[];\n}\n\n/**\n * Array validation error\n */\nexport interface ArrayValidationError {\n  /** Error type */\n  type: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength' | 'other';\n  \n  /** Error message */\n  message: string;\n  \n  /** Item index (if applicable) */\n  itemIndex?: number;\n  \n  /** Field path within item (if applicable) */\n  fieldPath?: string;\n  \n  /** Duplicate indices (for uniqueBy) */\n  duplicateIndices?: number[];\n  \n  /** Expected value */\n  expected?: any;\n  \n  /** Actual value */\n  actual?: any;\n}\n\n/**\n * Array field analyzer for detecting array fields in schemas\n */\nexport class ArrayFieldAnalyzer {\n  /**\n   * Analyze a schema tree and find all array fields\n   */\n  static findArrayFields(schemas: Record<string, FieldSchema>): Record<string, ArrayFieldSchema> {\n    const arrayFields: Record<string, ArrayFieldSchema> = {};\n    \n    Object.entries(schemas).forEach(([key, schema]) => {\n      if (isArrayFieldSchema(schema)) {\n        arrayFields[key] = schema;\n      }\n      \n      // Check nested fields in objects\n      if (schema.type === FieldType.OBJECT && 'properties' in schema) {\n        const objectSchema = schema as any;\n        const nestedArrays = this.findArrayFields(objectSchema.properties || {});\n        \n        Object.entries(nestedArrays).forEach(([nestedKey, nestedSchema]) => {\n          arrayFields[`${key}.${nestedKey}`] = nestedSchema;\n        });\n      }\n    });\n    \n    return arrayFields;\n  }\n  \n  /**\n   * Get validation rules for an array field\n   */\n  static getValidationRules(schema: ArrayFieldSchema): ArrayCollectionValidationRule[] {\n    const rules: ArrayCollectionValidationRule[] = [];\n    \n    // Length constraints\n    if (schema.minItems !== undefined) {\n      rules.push({\n        type: 'minLength',\n        value: schema.minItems,\n        message: `Must have at least ${schema.minItems} items`\n      });\n    }\n    \n    if (schema.maxItems !== undefined) {\n      rules.push({\n        type: 'maxLength',\n        value: schema.maxItems,\n        message: `Must have at most ${schema.maxItems} items`\n      });\n    }\n    \n    // Uniqueness constraints\n    if (schema.uniqueItems || schema.uniqueBy) {\n      rules.push({\n        type: 'uniqueBy',\n        fields: schema.uniqueBy || [],\n        message: 'Items must be unique'\n      });\n    }\n    \n    // Custom validation rules\n    if (schema.arrayValidation) {\n      if (schema.arrayValidation.forEach) {\n        rules.push({\n          type: 'forEach',\n          rules: schema.arrayValidation.forEach.rules,\n          message: 'Each item must be valid'\n        });\n      }\n    }\n    \n    return rules;\n  }\n}\n\n/**\n * Array collection validation rule\n */\nexport interface ArrayCollectionValidationRule {\n  type: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n  value?: any;\n  fields?: string[];\n  rules?: any[];\n  message: string;\n}","import { Injectable } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject, interval } from 'rxjs';\nimport { filter, switchMap, catchError, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RuleBuilderService } from './rule-builder.service';\nimport { ExportIntegrationService } from './export-integration.service';\n\nexport interface WebhookConfig {\n  id: string;\n  name: string;\n  url: string;\n  method: 'POST' | 'PUT' | 'PATCH';\n  headers?: Record<string, string>;\n  authentication?: {\n    type: 'none' | 'basic' | 'bearer' | 'apikey';\n    credentials: any;\n  };\n  format: string;\n  events: WebhookEvent[];\n  enabled: boolean;\n  retryConfig?: {\n    maxRetries: number;\n    retryDelay: number;\n    backoffMultiplier: number;\n  };\n  filtering?: {\n    includeMetadata: boolean;\n    minRuleCount?: number;\n    maxRuleCount?: number;\n    ruleTypes?: string[];\n  };\n}\n\nexport interface WebhookEvent {\n  type: 'rule-added' | 'rule-updated' | 'rule-deleted' | 'rules-imported' | 'rules-exported' | 'validation-changed';\n  description: string;\n  enabled: boolean;\n}\n\nexport interface WebhookDelivery {\n  id: string;\n  webhookId: string;\n  event: string;\n  url: string;\n  payload: any;\n  status: 'pending' | 'delivered' | 'failed' | 'retrying';\n  attempts: number;\n  lastAttempt?: Date;\n  nextRetry?: Date;\n  response?: {\n    statusCode: number;\n    headers: Record<string, string>;\n    body: string;\n  };\n  error?: string;\n  createdAt: Date;\n  deliveredAt?: Date;\n}\n\nexport interface WebhookStats {\n  totalDeliveries: number;\n  successfulDeliveries: number;\n  failedDeliveries: number;\n  pendingDeliveries: number;\n  successRate: number;\n  lastDelivery?: Date;\n  averageResponseTime?: number;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class WebhookIntegrationService {\n  private webhooks: WebhookConfig[] = [];\n  private deliveries: WebhookDelivery[] = [];\n  private deliveryQueue = new Subject<WebhookDelivery>();\n  private statusUpdates = new BehaviorSubject<Record<string, WebhookStats>>({});\n\n  private readonly SUPPORTED_EVENTS: WebhookEvent[] = [\n    {\n      type: 'rule-added',\n      description: 'Triggered when a new rule is added',\n      enabled: true\n    },\n    {\n      type: 'rule-updated',\n      description: 'Triggered when an existing rule is modified',\n      enabled: true\n    },\n    {\n      type: 'rule-deleted',\n      description: 'Triggered when a rule is removed',\n      enabled: true\n    },\n    {\n      type: 'rules-imported',\n      description: 'Triggered when rules are imported from external source',\n      enabled: false\n    },\n    {\n      type: 'rules-exported',\n      description: 'Triggered when rules are exported',\n      enabled: false\n    },\n    {\n      type: 'validation-changed',\n      description: 'Triggered when validation status changes',\n      enabled: false\n    }\n  ];\n\n  public readonly webhookStats$ = this.statusUpdates.asObservable();\n\n  constructor(\n    private ruleBuilderService: RuleBuilderService,\n    private exportService: ExportIntegrationService\n  ) {\n    this.initializeWebhookProcessing();\n    this.subscribeToRuleChanges();\n  }\n\n  /**\n   * Registers a new webhook configuration\n   */\n  registerWebhook(config: WebhookConfig): void {\n    const existingIndex = this.webhooks.findIndex(w => w.id === config.id);\n    if (existingIndex >= 0) {\n      this.webhooks[existingIndex] = config;\n    } else {\n      this.webhooks.push(config);\n    }\n    this.updateStats();\n  }\n\n  /**\n   * Removes a webhook configuration\n   */\n  unregisterWebhook(webhookId: string): void {\n    this.webhooks = this.webhooks.filter(w => w.id !== webhookId);\n    this.updateStats();\n  }\n\n  /**\n   * Gets all registered webhooks\n   */\n  getWebhooks(): WebhookConfig[] {\n    return [...this.webhooks];\n  }\n\n  /**\n   * Gets a specific webhook by ID\n   */\n  getWebhook(webhookId: string): WebhookConfig | null {\n    return this.webhooks.find(w => w.id === webhookId) || null;\n  }\n\n  /**\n   * Updates webhook configuration\n   */\n  updateWebhook(webhookId: string, updates: Partial<WebhookConfig>): void {\n    const webhook = this.webhooks.find(w => w.id === webhookId);\n    if (webhook) {\n      Object.assign(webhook, updates);\n      this.updateStats();\n    }\n  }\n\n  /**\n   * Enables or disables a webhook\n   */\n  toggleWebhook(webhookId: string, enabled: boolean): void {\n    this.updateWebhook(webhookId, { enabled });\n  }\n\n  /**\n   * Tests a webhook by sending a test payload\n   */\n  testWebhook(webhookId: string): Observable<WebhookDelivery> {\n    const webhook = this.getWebhook(webhookId);\n    if (!webhook) {\n      throw new Error(`Webhook not found: ${webhookId}`);\n    }\n\n    const testDelivery: WebhookDelivery = {\n      id: this.generateDeliveryId(),\n      webhookId,\n      event: 'test',\n      url: webhook.url,\n      payload: {\n        event: 'test',\n        timestamp: new Date().toISOString(),\n        data: {\n          message: 'This is a test webhook delivery',\n          webhook: {\n            id: webhook.id,\n            name: webhook.name\n          }\n        }\n      },\n      status: 'pending',\n      attempts: 0,\n      createdAt: new Date()\n    };\n\n    return this.deliverWebhook(testDelivery);\n  }\n\n  /**\n   * Gets delivery history for a webhook\n   */\n  getDeliveryHistory(webhookId: string, limit = 50): WebhookDelivery[] {\n    return this.deliveries\n      .filter(d => d.webhookId === webhookId)\n      .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n      .slice(0, limit);\n  }\n\n  /**\n   * Gets overall delivery statistics\n   */\n  getDeliveryStats(webhookId?: string): WebhookStats {\n    const relevantDeliveries = webhookId \n      ? this.deliveries.filter(d => d.webhookId === webhookId)\n      : this.deliveries;\n\n    const totalDeliveries = relevantDeliveries.length;\n    const successfulDeliveries = relevantDeliveries.filter(d => d.status === 'delivered').length;\n    const failedDeliveries = relevantDeliveries.filter(d => d.status === 'failed').length;\n    const pendingDeliveries = relevantDeliveries.filter(d => d.status === 'pending' || d.status === 'retrying').length;\n\n    const successRate = totalDeliveries > 0 ? (successfulDeliveries / totalDeliveries) * 100 : 0;\n    \n    const lastDelivery = relevantDeliveries\n      .filter(d => d.deliveredAt)\n      .sort((a, b) => (b.deliveredAt?.getTime() || 0) - (a.deliveredAt?.getTime() || 0))[0]?.deliveredAt;\n\n    return {\n      totalDeliveries,\n      successfulDeliveries,\n      failedDeliveries,\n      pendingDeliveries,\n      successRate,\n      lastDelivery\n    };\n  }\n\n  /**\n   * Retries failed deliveries\n   */\n  retryFailedDeliveries(webhookId?: string): void {\n    const failedDeliveries = this.deliveries.filter(d => \n      d.status === 'failed' && \n      (!webhookId || d.webhookId === webhookId)\n    );\n\n    failedDeliveries.forEach(delivery => {\n      delivery.status = 'pending';\n      delivery.nextRetry = undefined;\n      this.deliveryQueue.next(delivery);\n    });\n  }\n\n  /**\n   * Clears delivery history\n   */\n  clearDeliveryHistory(webhookId?: string): void {\n    if (webhookId) {\n      this.deliveries = this.deliveries.filter(d => d.webhookId !== webhookId);\n    } else {\n      this.deliveries = [];\n    }\n    this.updateStats();\n  }\n\n  /**\n   * Gets supported webhook events\n   */\n  getSupportedEvents(): WebhookEvent[] {\n    return [...this.SUPPORTED_EVENTS];\n  }\n\n  /**\n   * Manually triggers a webhook for testing\n   */\n  triggerWebhook(webhookId: string, eventType: string, payload: any): Observable<WebhookDelivery> {\n    const webhook = this.getWebhook(webhookId);\n    if (!webhook) {\n      throw new Error(`Webhook not found: ${webhookId}`);\n    }\n\n    const delivery: WebhookDelivery = {\n      id: this.generateDeliveryId(),\n      webhookId,\n      event: eventType,\n      url: webhook.url,\n      payload: this.preparePayload(webhook, eventType, payload),\n      status: 'pending',\n      attempts: 0,\n      createdAt: new Date()\n    };\n\n    return this.deliverWebhook(delivery);\n  }\n\n  /**\n   * Private implementation methods\n   */\n  private initializeWebhookProcessing(): void {\n    // Process delivery queue\n    this.deliveryQueue.pipe(\n      debounceTime(100), // Batch deliveries\n      switchMap(delivery => this.deliverWebhook(delivery)),\n      catchError((error, caught) => {\n        console.error('Webhook delivery error:', error);\n        return caught;\n      })\n    ).subscribe();\n\n    // Retry failed deliveries periodically\n    interval(60000).pipe( // Check every minute\n      switchMap(() => this.processRetries())\n    ).subscribe();\n  }\n\n  private subscribeToRuleChanges(): void {\n    // Subscribe to rule builder state changes\n    this.ruleBuilderService.stateChanged$.pipe(\n      debounceTime(1000), // Debounce rapid changes\n      distinctUntilChanged()\n    ).subscribe(() => {\n      this.handleRuleChange('rule-updated');\n    });\n\n    // Subscribe to validation errors\n    this.ruleBuilderService.validationErrors$.pipe(\n      debounceTime(500),\n      distinctUntilChanged((prev, curr) => \n        JSON.stringify(prev) === JSON.stringify(curr)\n      )\n    ).subscribe(errors => {\n      this.handleValidationChange(errors);\n    });\n  }\n\n  private handleRuleChange(eventType: string): void {\n    const activeWebhooks = this.webhooks.filter(w => \n      w.enabled && \n      w.events.some(e => e.type === eventType && e.enabled)\n    );\n\n    for (const webhook of activeWebhooks) {\n      if (this.shouldTriggerWebhook(webhook, eventType)) {\n        const payload = this.generateEventPayload(eventType);\n        this.queueDelivery(webhook, eventType, payload);\n      }\n    }\n  }\n\n  private handleValidationChange(errors: any[]): void {\n    this.handleRuleChange('validation-changed');\n  }\n\n  private shouldTriggerWebhook(webhook: WebhookConfig, eventType: string): boolean {\n    // Apply filtering rules\n    if (webhook.filtering) {\n      const state = this.ruleBuilderService.getCurrentState();\n      const ruleCount = Object.keys(state.nodes).length;\n\n      if (webhook.filtering.minRuleCount && ruleCount < webhook.filtering.minRuleCount) {\n        return false;\n      }\n\n      if (webhook.filtering.maxRuleCount && ruleCount > webhook.filtering.maxRuleCount) {\n        return false;\n      }\n\n      if (webhook.filtering.ruleTypes && webhook.filtering.ruleTypes.length > 0) {\n        const hasMatchingType = Object.values(state.nodes).some(node => \n          webhook.filtering!.ruleTypes!.includes(node.type)\n        );\n        if (!hasMatchingType) {\n          return false;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  private generateEventPayload(eventType: string): any {\n    const state = this.ruleBuilderService.getCurrentState();\n    \n    return {\n      event: eventType,\n      timestamp: new Date().toISOString(),\n      data: {\n        rulesCount: Object.keys(state.nodes).length,\n        rootNodes: state.rootNodes.length,\n        isDirty: state.isDirty,\n        mode: state.mode,\n        validationErrors: state.validationErrors?.length || 0\n      }\n    };\n  }\n\n  private queueDelivery(webhook: WebhookConfig, eventType: string, payload: any): void {\n    const delivery: WebhookDelivery = {\n      id: this.generateDeliveryId(),\n      webhookId: webhook.id,\n      event: eventType,\n      url: webhook.url,\n      payload: this.preparePayload(webhook, eventType, payload),\n      status: 'pending',\n      attempts: 0,\n      createdAt: new Date()\n    };\n\n    this.deliveries.push(delivery);\n    this.deliveryQueue.next(delivery);\n  }\n\n  private preparePayload(webhook: WebhookConfig, eventType: string, data: any): any {\n    const basePayload = {\n      webhook: {\n        id: webhook.id,\n        name: webhook.name\n      },\n      event: eventType,\n      timestamp: new Date().toISOString(),\n      data\n    };\n\n    // Add rules data if requested\n    if (webhook.filtering?.includeMetadata) {\n      try {\n        const exportResult = this.exportService.exportRules({\n          format: webhook.format,\n          includeMetadata: true,\n          prettyPrint: false\n        });\n\n        // Note: This is simplified - in practice you'd want to handle the Observable properly\n        basePayload.data.rules = JSON.parse('{}'); // Placeholder\n      } catch (error) {\n        console.warn('Failed to include rules in webhook payload:', error);\n      }\n    }\n\n    return basePayload;\n  }\n\n  private deliverWebhook(delivery: WebhookDelivery): Observable<WebhookDelivery> {\n    return new Observable(observer => {\n      this.sendWebhookRequest(delivery).then(result => {\n        const updatedDelivery = { ...delivery, ...result };\n        this.updateDelivery(updatedDelivery);\n        observer.next(updatedDelivery);\n        observer.complete();\n      }).catch(error => {\n        const failedDelivery: WebhookDelivery = {\n          ...delivery,\n          status: 'failed',\n          error: String(error),\n          lastAttempt: new Date(),\n          attempts: delivery.attempts + 1\n        };\n\n        // Schedule retry if configured\n        const webhook = this.getWebhook(delivery.webhookId);\n        if (webhook?.retryConfig && failedDelivery.attempts < webhook.retryConfig.maxRetries) {\n          failedDelivery.status = 'retrying';\n          failedDelivery.nextRetry = new Date(\n            Date.now() + webhook.retryConfig.retryDelay * Math.pow(webhook.retryConfig.backoffMultiplier, failedDelivery.attempts - 1)\n          );\n        }\n\n        this.updateDelivery(failedDelivery);\n        observer.next(failedDelivery);\n        observer.complete();\n      });\n    });\n  }\n\n  private async sendWebhookRequest(delivery: WebhookDelivery): Promise<Partial<WebhookDelivery>> {\n    const webhook = this.getWebhook(delivery.webhookId);\n    if (!webhook) {\n      throw new Error(`Webhook configuration not found: ${delivery.webhookId}`);\n    }\n\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      'User-Agent': 'Praxis-VisualBuilder-Webhook/1.0',\n      ...webhook.headers\n    };\n\n    // Add authentication headers\n    if (webhook.authentication) {\n      switch (webhook.authentication.type) {\n        case 'bearer':\n          headers['Authorization'] = `Bearer ${webhook.authentication.credentials.token}`;\n          break;\n        case 'basic':\n          const encoded = btoa(`${webhook.authentication.credentials.username}:${webhook.authentication.credentials.password}`);\n          headers['Authorization'] = `Basic ${encoded}`;\n          break;\n        case 'apikey':\n          headers[webhook.authentication.credentials.headerName] = webhook.authentication.credentials.apiKey;\n          break;\n      }\n    }\n\n    const startTime = Date.now();\n    \n    const response = await fetch(delivery.url, {\n      method: webhook.method,\n      headers,\n      body: JSON.stringify(delivery.payload)\n    });\n\n    const responseTime = Date.now() - startTime;\n    const responseBody = await response.text();\n\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n    }\n\n    return {\n      status: 'delivered',\n      attempts: delivery.attempts + 1,\n      lastAttempt: new Date(),\n      deliveredAt: new Date(),\n      response: {\n        statusCode: response.status,\n        headers: Object.fromEntries(response.headers.entries()),\n        body: responseBody\n      }\n    };\n  }\n\n  private updateDelivery(delivery: WebhookDelivery): void {\n    const index = this.deliveries.findIndex(d => d.id === delivery.id);\n    if (index >= 0) {\n      this.deliveries[index] = delivery;\n    }\n    this.updateStats();\n  }\n\n  private processRetries(): Observable<any> {\n    const now = new Date();\n    const retriesToProcess = this.deliveries.filter(d => \n      d.status === 'retrying' && \n      d.nextRetry && \n      d.nextRetry <= now\n    );\n\n    retriesToProcess.forEach(delivery => {\n      delivery.status = 'pending';\n      delivery.nextRetry = undefined;\n      this.deliveryQueue.next(delivery);\n    });\n\n    return new Observable(observer => observer.complete());\n  }\n\n  private updateStats(): void {\n    const stats: Record<string, WebhookStats> = {};\n    \n    for (const webhook of this.webhooks) {\n      stats[webhook.id] = this.getDeliveryStats(webhook.id);\n    }\n\n    this.statusUpdates.next(stats);\n  }\n\n  private generateDeliveryId(): string {\n    return `delivery_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nimport { \n  RuleTemplate, \n  RuleNode, \n  RuleBuilderState,\n  ExportOptions,\n  ImportOptions \n} from '../models/rule-builder.model';\nimport { SpecificationBridgeService } from './specification-bridge.service';\n\n/**\n * Template category for organization\n */\nexport interface TemplateCategory {\n  id: string;\n  name: string;\n  description?: string;\n  icon?: string;\n  color?: string;\n  templates: RuleTemplate[];\n}\n\n/**\n * Template search criteria\n */\nexport interface TemplateSearchCriteria {\n  query?: string;\n  category?: string;\n  tags?: string[];\n  nodeTypes?: string[];\n  complexity?: 'simple' | 'medium' | 'complex';\n  dateRange?: {\n    from?: Date;\n    to?: Date;\n  };\n}\n\n/**\n * Template validation result\n */\nexport interface TemplateValidationResult {\n  isValid: boolean;\n  errors: string[];\n  warnings: string[];\n  missingFields?: string[];\n  incompatibleFeatures?: string[];\n}\n\n/**\n * Template application result\n */\nexport interface TemplateApplicationResult {\n  success: boolean;\n  appliedNodes: RuleNode[];\n  errors: string[];\n  warnings: string[];\n  modifiedNodeIds: string[];\n}\n\n/**\n * Template statistics\n */\nexport interface TemplateStats {\n  totalTemplates: number;\n  categoriesCount: number;\n  mostUsedTemplate?: RuleTemplate;\n  recentlyUsed: RuleTemplate[];\n  popularTags: string[];\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RuleTemplateService {\n  private readonly STORAGE_KEY = 'praxis-rule-templates';\n  private readonly VERSION_KEY = 'praxis-template-version';\n  private readonly CURRENT_VERSION = '1.0.0';\n\n  private templatesSubject = new BehaviorSubject<RuleTemplate[]>([]);\n  private categoriesSubject = new BehaviorSubject<TemplateCategory[]>([]);\n  private recentlyUsedSubject = new BehaviorSubject<RuleTemplate[]>([]);\n\n  templates$ = this.templatesSubject.asObservable();\n  categories$ = this.categoriesSubject.asObservable();\n  recentlyUsed$ = this.recentlyUsedSubject.asObservable();\n\n  constructor(private bridgeService: SpecificationBridgeService) {\n    this.loadTemplatesFromStorage();\n    this.initializeDefaultTemplates();\n  }\n\n  /**\n   * Get all templates\n   */\n  getTemplates(): Observable<RuleTemplate[]> {\n    return this.templates$;\n  }\n\n  /**\n   * Get templates by category\n   */\n  getTemplatesByCategory(categoryId: string): Observable<RuleTemplate[]> {\n    return this.templates$.pipe(\n      map(templates => templates.filter(t => t.category === categoryId))\n    );\n  }\n\n  /**\n   * Search templates\n   */\n  searchTemplates(criteria: TemplateSearchCriteria): Observable<RuleTemplate[]> {\n    return this.templates$.pipe(\n      map(templates => {\n        let filtered = templates;\n\n        // Text search\n        if (criteria.query) {\n          const query = criteria.query.toLowerCase();\n          filtered = filtered.filter(t => \n            t.name.toLowerCase().includes(query) ||\n            t.description.toLowerCase().includes(query) ||\n            t.tags.some(tag => tag.toLowerCase().includes(query))\n          );\n        }\n\n        // Category filter\n        if (criteria.category) {\n          filtered = filtered.filter(t => t.category === criteria.category);\n        }\n\n        // Tags filter\n        if (criteria.tags && criteria.tags.length > 0) {\n          filtered = filtered.filter(t => \n            criteria.tags!.some(tag => t.tags.includes(tag))\n          );\n        }\n\n        // Node types filter\n        if (criteria.nodeTypes && criteria.nodeTypes.length > 0) {\n          filtered = filtered.filter(t => \n            t.nodes.some(node => criteria.nodeTypes!.includes(node.type))\n          );\n        }\n\n        // Complexity filter\n        if (criteria.complexity) {\n          filtered = filtered.filter(t => \n            this.getTemplateComplexity(t) === criteria.complexity\n          );\n        }\n\n        return filtered;\n      })\n    );\n  }\n\n  /**\n   * Get template by ID\n   */\n  getTemplate(id: string): Observable<RuleTemplate | null> {\n    return this.templates$.pipe(\n      map(templates => templates.find(t => t.id === id) || null)\n    );\n  }\n\n  /**\n   * Create new template\n   */\n  createTemplate(\n    name: string, \n    description: string, \n    category: string,\n    nodes: RuleNode[],\n    rootNodes: string[],\n    tags: string[] = [],\n    requiredFields: string[] = []\n  ): Observable<RuleTemplate> {\n    const template: RuleTemplate = {\n      id: this.generateTemplateId(),\n      name,\n      description,\n      category,\n      tags,\n      nodes,\n      rootNodes,\n      requiredFields,\n      icon: this.getDefaultIconForCategory(category),\n      metadata: {\n        createdAt: new Date(),\n        updatedAt: new Date(),\n        version: '1.0.0',\n        usageCount: 0,\n        complexity: this.calculateComplexity(nodes)\n      }\n    };\n\n    const templates = [...this.templatesSubject.value, template];\n    this.templatesSubject.next(templates);\n    this.saveTemplatesToStorage();\n    this.updateCategories();\n\n    return of(template);\n  }\n\n  /**\n   * Update template\n   */\n  updateTemplate(id: string, updates: Partial<RuleTemplate>): Observable<RuleTemplate> {\n    const templates = this.templatesSubject.value;\n    const index = templates.findIndex(t => t.id === id);\n    \n    if (index === -1) {\n      return throwError(() => new Error(`Template with id ${id} not found`));\n    }\n\n    const updatedTemplate = {\n      ...templates[index],\n      ...updates,\n      metadata: {\n        ...templates[index].metadata,\n        updatedAt: new Date(),\n        version: this.incrementVersion(templates[index].metadata?.version || '1.0.0')\n      }\n    };\n\n    templates[index] = updatedTemplate;\n    this.templatesSubject.next([...templates]);\n    this.saveTemplatesToStorage();\n\n    return of(updatedTemplate);\n  }\n\n  /**\n   * Delete template\n   */\n  deleteTemplate(id: string): Observable<boolean> {\n    const templates = this.templatesSubject.value;\n    const filteredTemplates = templates.filter(t => t.id !== id);\n    \n    if (filteredTemplates.length === templates.length) {\n      return throwError(() => new Error(`Template with id ${id} not found`));\n    }\n\n    this.templatesSubject.next(filteredTemplates);\n    this.saveTemplatesToStorage();\n    this.updateCategories();\n\n    return of(true);\n  }\n\n  /**\n   * Duplicate template\n   */\n  duplicateTemplate(id: string, newName?: string): Observable<RuleTemplate> {\n    return this.getTemplate(id).pipe(\n      map(template => {\n        if (!template) {\n          throw new Error(`Template with id ${id} not found`);\n        }\n\n        const duplicated: RuleTemplate = {\n          ...template,\n          id: this.generateTemplateId(),\n          name: newName || `${template.name} (Copy)`,\n          metadata: {\n            ...template.metadata,\n            createdAt: new Date(),\n            updatedAt: new Date(),\n            version: '1.0.0',\n            usageCount: 0\n          }\n        };\n\n        const templates = [...this.templatesSubject.value, duplicated];\n        this.templatesSubject.next(templates);\n        this.saveTemplatesToStorage();\n\n        return duplicated;\n      })\n    );\n  }\n\n  /**\n   * Apply template to current builder state\n   */\n  applyTemplate(templateId: string, targetBuilderState?: RuleBuilderState): Observable<TemplateApplicationResult> {\n    return this.getTemplate(templateId).pipe(\n      map(template => {\n        if (!template) {\n          throw new Error(`Template with id ${templateId} not found`);\n        }\n\n        try {\n          // Clone template nodes with new IDs\n          const appliedNodes = this.cloneTemplateNodes(template.nodes);\n          const modifiedNodeIds = appliedNodes.map(n => n.id);\n\n          // Track usage\n          this.incrementTemplateUsage(templateId);\n          this.addToRecentlyUsed(template);\n\n          return {\n            success: true,\n            appliedNodes,\n            errors: [],\n            warnings: [],\n            modifiedNodeIds\n          };\n        } catch (error) {\n          return {\n            success: false,\n            appliedNodes: [],\n            errors: [error instanceof Error ? error.message : 'Unknown error'],\n            warnings: [],\n            modifiedNodeIds: []\n          };\n        }\n      }),\n      catchError(error => of({\n        success: false,\n        appliedNodes: [],\n        errors: [error.message],\n        warnings: [],\n        modifiedNodeIds: []\n      }))\n    );\n  }\n\n  /**\n   * Validate template compatibility\n   */\n  validateTemplate(template: RuleTemplate, availableFields?: string[]): TemplateValidationResult {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n    const missingFields: string[] = [];\n\n    // Check required structure\n    if (!template.nodes || template.nodes.length === 0) {\n      errors.push('Template must contain at least one rule node');\n    }\n\n    if (!template.rootNodes || template.rootNodes.length === 0) {\n      errors.push('Template must specify root nodes');\n    }\n\n    // Check node references\n    if (template.nodes && template.rootNodes) {\n      const nodeIds = new Set(template.nodes.map(n => n.id));\n      const invalidRootNodes = template.rootNodes.filter(id => !nodeIds.has(id));\n      \n      if (invalidRootNodes.length > 0) {\n        errors.push(`Invalid root node references: ${invalidRootNodes.join(', ')}`);\n      }\n    }\n\n    // Check field availability\n    if (availableFields && template.requiredFields) {\n      const missing = template.requiredFields.filter(field => !availableFields.includes(field));\n      missingFields.push(...missing);\n      \n      if (missing.length > 0) {\n        warnings.push(`Missing required fields: ${missing.join(', ')}`);\n      }\n    }\n\n    // Check for complex features\n    const complexFeatures = this.detectComplexFeatures(template);\n    if (complexFeatures.length > 0) {\n      warnings.push(`Template uses advanced features: ${complexFeatures.join(', ')}`);\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n      warnings,\n      missingFields,\n      incompatibleFeatures: complexFeatures\n    };\n  }\n\n  /**\n   * Export template to JSON\n   */\n  exportTemplate(id: string, options?: ExportOptions): Observable<string> {\n    return this.getTemplate(id).pipe(\n      map(template => {\n        if (!template) {\n          throw new Error(`Template with id ${id} not found`);\n        }\n\n        const exportData = {\n          template,\n          exportedAt: new Date().toISOString(),\n          exportedBy: 'praxis-visual-builder',\n          version: this.CURRENT_VERSION,\n          metadata: {\n            includeMetadata: options?.includeMetadata !== false,\n            format: options?.format || 'json'\n          }\n        };\n\n        return options?.prettyPrint !== false \n          ? JSON.stringify(exportData, null, 2)\n          : JSON.stringify(exportData);\n      })\n    );\n  }\n\n  /**\n   * Import template from JSON\n   */\n  importTemplate(jsonData: string, options?: ImportOptions): Observable<RuleTemplate> {\n    try {\n      const importData = JSON.parse(jsonData);\n      \n      if (!importData.template) {\n        throw new Error('Invalid template format: missing template data');\n      }\n\n      const template = importData.template as RuleTemplate;\n      \n      // Validate template\n      const validation = this.validateTemplate(template);\n      if (!validation.isValid) {\n        throw new Error(`Template validation failed: ${validation.errors.join(', ')}`);\n      }\n\n      // Generate new ID to avoid conflicts\n      const importedTemplate: RuleTemplate = {\n        ...template,\n        id: this.generateTemplateId(),\n        metadata: {\n          ...template.metadata,\n          importedAt: new Date(),\n          originalId: template.id\n        }\n      };\n\n      // Add to templates\n      const templates = [...this.templatesSubject.value, importedTemplate];\n      this.templatesSubject.next(templates);\n      this.saveTemplatesToStorage();\n      this.updateCategories();\n\n      return of(importedTemplate);\n    } catch (error) {\n      return throwError(() => new Error(`Import failed: ${error instanceof Error ? error.message : 'Unknown error'}`));\n    }\n  }\n\n  /**\n   * Get template statistics\n   */\n  getTemplateStats(): Observable<TemplateStats> {\n    return this.templates$.pipe(\n      map(templates => {\n        const categories = new Set(templates.map(t => t.category));\n        const allTags = templates.flatMap(t => t.tags);\n        const tagCounts = allTags.reduce((acc, tag) => {\n          acc[tag] = (acc[tag] || 0) + 1;\n          return acc;\n        }, {} as Record<string, number>);\n\n        const popularTags = Object.entries(tagCounts)\n          .sort(([, a], [, b]) => b - a)\n          .slice(0, 10)\n          .map(([tag]) => tag);\n\n        const mostUsed = templates\n          .sort((a, b) => (b.metadata?.usageCount || 0) - (a.metadata?.usageCount || 0))[0];\n\n        return {\n          totalTemplates: templates.length,\n          categoriesCount: categories.size,\n          mostUsedTemplate: mostUsed,\n          recentlyUsed: this.recentlyUsedSubject.value,\n          popularTags\n        };\n      })\n    );\n  }\n\n  /**\n   * Get categories with template counts\n   */\n  getCategories(): Observable<TemplateCategory[]> {\n    return this.categories$;\n  }\n\n  // Private methods\n\n  private loadTemplatesFromStorage(): void {\n    try {\n      const stored = localStorage.getItem(this.STORAGE_KEY);\n      if (stored) {\n        const templates = JSON.parse(stored) as RuleTemplate[];\n        this.templatesSubject.next(templates);\n        this.updateCategories();\n      }\n\n      const recentlyUsed = localStorage.getItem(`${this.STORAGE_KEY}-recent`);\n      if (recentlyUsed) {\n        this.recentlyUsedSubject.next(JSON.parse(recentlyUsed));\n      }\n    } catch (error) {\n      console.warn('Failed to load templates from storage:', error);\n    }\n  }\n\n  private saveTemplatesToStorage(): void {\n    try {\n      localStorage.setItem(this.STORAGE_KEY, JSON.stringify(this.templatesSubject.value));\n      localStorage.setItem(this.VERSION_KEY, this.CURRENT_VERSION);\n    } catch (error) {\n      console.warn('Failed to save templates to storage:', error);\n    }\n  }\n\n  private updateCategories(): void {\n    const templates = this.templatesSubject.value;\n    const categoryMap = new Map<string, TemplateCategory>();\n\n    templates.forEach(template => {\n      if (!categoryMap.has(template.category)) {\n        categoryMap.set(template.category, {\n          id: template.category,\n          name: this.getCategoryDisplayName(template.category),\n          description: this.getCategoryDescription(template.category),\n          icon: this.getDefaultIconForCategory(template.category),\n          templates: []\n        });\n      }\n      categoryMap.get(template.category)!.templates.push(template);\n    });\n\n    this.categoriesSubject.next(Array.from(categoryMap.values()));\n  }\n\n  private initializeDefaultTemplates(): void {\n    if (this.templatesSubject.value.length === 0) {\n      this.createDefaultTemplates();\n    }\n  }\n\n  private createDefaultTemplates(): void {\n    // Basic Field Validation Template\n    this.createTemplate(\n      'Basic Field Validation',\n      'Simple field validation with required and format checks',\n      'validation',\n      [\n        {\n          id: 'field_required',\n          type: 'fieldCondition',\n          label: 'Field is required',\n          config: {\n            type: 'fieldCondition',\n            fieldName: '{{fieldName}}',\n            operator: 'isNotEmpty',\n            value: null,\n            valueType: 'literal'\n          }\n        }\n      ],\n      ['field_required'],\n      ['required', 'validation', 'basic'],\n      ['{{fieldName}}']\n    ).subscribe();\n\n    // Email Validation Template\n    this.createTemplate(\n      'Email Validation',\n      'Complete email field validation with format and required checks',\n      'validation',\n      [\n        {\n          id: 'email_required',\n          type: 'fieldCondition',\n          label: 'Email is required',\n          config: {\n            type: 'fieldCondition',\n            fieldName: 'email',\n            operator: 'isNotEmpty',\n            value: null,\n            valueType: 'literal'\n          }\n        },\n        {\n          id: 'email_format',\n          type: 'fieldCondition',\n          label: 'Email format validation',\n          config: {\n            type: 'fieldCondition',\n            fieldName: 'email',\n            operator: 'matches',\n            value: '^[\\\\w\\\\.-]+@[\\\\w\\\\.-]+\\\\.[a-zA-Z]{2,}$',\n            valueType: 'literal'\n          }\n        },\n        {\n          id: 'email_and_group',\n          type: 'andGroup',\n          label: 'Email validation group',\n          children: ['email_required', 'email_format'],\n          config: {\n            type: 'booleanGroup',\n            operator: 'and'\n          }\n        }\n      ],\n      ['email_and_group'],\n      ['email', 'validation', 'format', 'required'],\n      ['email']\n    ).subscribe();\n  }\n\n  private generateTemplateId(): string {\n    return `template_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  private cloneTemplateNodes(nodes: RuleNode[]): RuleNode[] {\n    const idMap = new Map<string, string>();\n    \n    // First pass: generate new IDs\n    nodes.forEach(node => {\n      idMap.set(node.id, this.generateNodeId());\n    });\n\n    // Second pass: clone nodes with new IDs\n    return nodes.map(node => {\n      const cloned: RuleNode = {\n        ...node,\n        id: idMap.get(node.id)!,\n        children: node.children?.map(childId => idMap.get(childId) || childId)\n      };\n\n      // Replace template variables in config\n      if (cloned.config) {\n        cloned.config = this.replaceTemplateVariables(cloned.config);\n      }\n\n      return cloned;\n    });\n  }\n\n  private generateNodeId(): string {\n    return `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  private replaceTemplateVariables(config: any): any {\n    // Deep clone and replace variables like {{fieldName}}\n    const configStr = JSON.stringify(config);\n    // For now, return as-is. In real implementation, would replace template variables\n    return JSON.parse(configStr);\n  }\n\n  private incrementTemplateUsage(templateId: string): void {\n    const templates = this.templatesSubject.value;\n    const template = templates.find(t => t.id === templateId);\n    \n    if (template) {\n      template.metadata = {\n        ...template.metadata,\n        usageCount: (template.metadata?.usageCount || 0) + 1,\n        lastUsed: new Date()\n      };\n      this.saveTemplatesToStorage();\n    }\n  }\n\n  private addToRecentlyUsed(template: RuleTemplate): void {\n    const recent = this.recentlyUsedSubject.value;\n    const filtered = recent.filter(t => t.id !== template.id);\n    const updated = [template, ...filtered].slice(0, 10);\n    \n    this.recentlyUsedSubject.next(updated);\n    localStorage.setItem(`${this.STORAGE_KEY}-recent`, JSON.stringify(updated));\n  }\n\n  private getTemplateComplexity(template: RuleTemplate): 'simple' | 'medium' | 'complex' {\n    return this.calculateComplexity(template.nodes);\n  }\n\n  private calculateComplexity(nodes: RuleNode[]): 'simple' | 'medium' | 'complex' {\n    if (nodes.length <= 2) return 'simple';\n    if (nodes.length <= 5) return 'medium';\n    return 'complex';\n  }\n\n  private detectComplexFeatures(template: RuleTemplate): string[] {\n    const features: string[] = [];\n    \n    template.nodes.forEach(node => {\n      if (node.type.includes('Group')) {\n        features.push('Boolean Logic');\n      }\n      if (node.type === 'functionCall') {\n        features.push('Custom Functions');\n      }\n      if (node.type.includes('If')) {\n        features.push('Conditional Validation');\n      }\n      if (['forEach', 'uniqueBy', 'minLength', 'maxLength'].includes(node.type)) {\n        features.push('Collection Validation');\n      }\n    });\n\n    return [...new Set(features)];\n  }\n\n  private getCategoryDisplayName(category: string): string {\n    const names: Record<string, string> = {\n      'validation': 'Field Validation',\n      'business': 'Business Rules',\n      'collection': 'Collection Validation',\n      'conditional': 'Conditional Logic',\n      'workflow': 'Workflow Rules',\n      'security': 'Security Validation',\n      'custom': 'Custom Templates'\n    };\n    \n    return names[category] || category.charAt(0).toUpperCase() + category.slice(1);\n  }\n\n  private getCategoryDescription(category: string): string {\n    const descriptions: Record<string, string> = {\n      'validation': 'Templates for field validation and format checking',\n      'business': 'Templates for business logic and rules',\n      'collection': 'Templates for array and collection validation',\n      'conditional': 'Templates with conditional logic and branching',\n      'workflow': 'Templates for workflow and process validation',\n      'security': 'Templates for security and access control',\n      'custom': 'User-created custom templates'\n    };\n    \n    return descriptions[category] || `Templates in ${category} category`;\n  }\n\n  private getDefaultIconForCategory(category: string): string {\n    const icons: Record<string, string> = {\n      'validation': 'check_circle',\n      'business': 'business',\n      'collection': 'list',\n      'conditional': 'alt_route',\n      'workflow': 'workflow',\n      'security': 'security',\n      'custom': 'extension'\n    };\n    \n    return icons[category] || 'folder';\n  }\n\n  private incrementVersion(version: string): string {\n    const parts = version.split('.');\n    const patch = parseInt(parts[2] || '0') + 1;\n    return `${parts[0]}.${parts[1]}.${patch}`;\n  }\n}","import { Injectable } from '@angular/core';\nimport { RuleNode, RuleNodeConfig } from '../models/rule-builder.model';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\n\n/**\n * Validation issue severity levels\n */\nexport enum ValidationSeverity {\n  ERROR = 'error',\n  WARNING = 'warning',\n  INFO = 'info'\n}\n\n/**\n * Validation issue categories\n */\nexport enum ValidationCategory {\n  STRUCTURE = 'structure',\n  DEPENDENCY = 'dependency',\n  BUSINESS_LOGIC = 'business_logic',\n  PERFORMANCE = 'performance',\n  SEMANTIC = 'semantic'\n}\n\n/**\n * Validation issue details\n */\nexport interface ValidationIssue {\n  /** Unique identifier for this issue */\n  id: string;\n  /** Issue severity level */\n  severity: ValidationSeverity;\n  /** Issue category */\n  category: ValidationCategory;\n  /** Human-readable message */\n  message: string;\n  /** Affected node ID */\n  nodeId: string;\n  /** Suggested fix (optional) */\n  suggestion?: string;\n  /** Additional context data */\n  context?: Record<string, any>;\n}\n\n/**\n * Validation result for a rule tree\n */\nexport interface RuleValidationResult {\n  /** Whether validation passed */\n  isValid: boolean;\n  /** Total number of issues found */\n  issueCount: number;\n  /** Issues found during validation */\n  issues: ValidationIssue[];\n  /** Performance metrics */\n  metrics: {\n    validationTime: number;\n    nodeCount: number;\n    maxDepth: number;\n    complexity: number;\n  };\n}\n\n/**\n * Validation configuration options\n */\nexport interface ValidationConfig {\n  /** Enable strict validation mode */\n  strict?: boolean;\n  /** Maximum allowed tree depth */\n  maxDepth?: number;\n  /** Maximum allowed complexity score */\n  maxComplexity?: number;\n  /** Enable performance warnings */\n  enablePerformanceWarnings?: boolean;\n  /** Custom validation rules */\n  customRules?: ValidationRule[];\n}\n\n/**\n * Custom validation rule interface\n */\nexport interface ValidationRule {\n  /** Rule identifier */\n  id: string;\n  /** Rule description */\n  description: string;\n  /** Validation function */\n  validate: (node: RuleNode, context: ValidationContext) => ValidationIssue[];\n}\n\n/**\n * Validation context passed to validators\n */\nexport interface ValidationContext {\n  /** Registry service for node resolution */\n  registry: RuleNodeRegistryService;\n  /** Current validation config */\n  config: ValidationConfig;\n  /** Visited nodes (for cycle detection) */\n  visitedNodes: Set<string>;\n  /** Current depth level */\n  currentDepth: number;\n  /** All nodes in the tree */\n  allNodes: Map<string, RuleNode>;\n}\n\n/**\n * Centralized service for validating rule business logic and integrity\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class RuleValidationService {\n  private defaultConfig: ValidationConfig = {\n    strict: false,\n    maxDepth: 10,\n    maxComplexity: 100,\n    enablePerformanceWarnings: true,\n    customRules: []\n  };\n\n  constructor(private nodeRegistry: RuleNodeRegistryService) {}\n\n  /**\n   * Validate a complete rule tree\n   */\n  validateRuleTree(rootNode: RuleNode, config?: Partial<ValidationConfig>): RuleValidationResult {\n    const startTime = performance.now();\n    const validationConfig = { ...this.defaultConfig, ...config };\n    \n    // Collect all nodes in the tree\n    const allNodes = this.collectAllNodes(rootNode);\n    \n    const context: ValidationContext = {\n      registry: this.nodeRegistry,\n      config: validationConfig,\n      visitedNodes: new Set(),\n      currentDepth: 0,\n      allNodes\n    };\n\n    const issues: ValidationIssue[] = [];\n\n    // Run core validations\n    issues.push(...this.validateStructure(rootNode, context));\n    issues.push(...this.validateDependencies(rootNode, context));\n    issues.push(...this.validateBusinessLogic(rootNode, context));\n    issues.push(...this.validatePerformance(rootNode, context));\n\n    // Run custom validation rules\n    if (validationConfig.customRules) {\n      for (const rule of validationConfig.customRules) {\n        issues.push(...rule.validate(rootNode, context));\n      }\n    }\n\n    const endTime = performance.now();\n    const metrics = this.calculateMetrics(rootNode, allNodes, endTime - startTime);\n\n    return {\n      isValid: !issues.some(issue => issue.severity === ValidationSeverity.ERROR),\n      issueCount: issues.length,\n      issues,\n      metrics\n    };\n  }\n\n  /**\n   * Validate a single node\n   */\n  validateNode(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n\n    // Basic structure validation\n    if (!node.id) {\n      issues.push({\n        id: `missing-id-${Date.now()}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.STRUCTURE,\n        message: 'Node is missing required ID',\n        nodeId: node.id || 'unknown'\n      });\n    }\n\n    if (!node.config) {\n      issues.push({\n        id: `missing-config-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.STRUCTURE,\n        message: 'Node is missing configuration',\n        nodeId: node.id\n      });\n      return issues; // Cannot continue without config\n    }\n\n    if (!node.config.type) {\n      issues.push({\n        id: `missing-type-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.STRUCTURE,\n        message: 'Node configuration is missing type',\n        nodeId: node.id\n      });\n    }\n\n    // Type-specific validation\n    issues.push(...this.validateNodeByType(node, context));\n\n    return issues;\n  }\n\n  private validateStructure(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    \n    // Check for cycles\n    if (context.visitedNodes.has(node.id)) {\n      issues.push({\n        id: `cycle-detected-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.STRUCTURE,\n        message: `Circular dependency detected at node ${node.id}`,\n        nodeId: node.id,\n        suggestion: 'Remove circular references in the rule tree'\n      });\n      return issues;\n    }\n\n    context.visitedNodes.add(node.id);\n    context.currentDepth++;\n\n    // Check max depth\n    if (context.currentDepth > context.config.maxDepth!) {\n      issues.push({\n        id: `max-depth-exceeded-${node.id}`,\n        severity: ValidationSeverity.WARNING,\n        category: ValidationCategory.PERFORMANCE,\n        message: `Maximum tree depth (${context.config.maxDepth}) exceeded`,\n        nodeId: node.id,\n        suggestion: 'Consider flattening the rule structure'\n      });\n    }\n\n    // Validate current node\n    issues.push(...this.validateNode(node, context));\n\n    // Recursively validate children\n    if (node.children) {\n      for (const childId of node.children) {\n        const childNode = context.registry.getNode(childId);\n        if (childNode) {\n          issues.push(...this.validateStructure(childNode, { ...context }));\n        } else {\n          issues.push({\n            id: `missing-child-${childId}`,\n            severity: ValidationSeverity.ERROR,\n            category: ValidationCategory.DEPENDENCY,\n            message: `Child node ${childId} not found in registry`,\n            nodeId: node.id,\n            suggestion: 'Remove reference to missing child or add the missing node'\n          });\n        }\n      }\n    }\n\n    context.visitedNodes.delete(node.id);\n    context.currentDepth--;\n\n    return issues;\n  }\n\n  private validateDependencies(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n\n    // Validate parent-child relationships\n    if (node.children) {\n      for (const childId of node.children) {\n        const childNode = context.registry.getNode(childId);\n        if (childNode && childNode.parentId !== node.id) {\n          issues.push({\n            id: `parent-mismatch-${childId}`,\n            severity: ValidationSeverity.WARNING,\n            category: ValidationCategory.DEPENDENCY,\n            message: `Child node ${childId} does not reference correct parent`,\n            nodeId: node.id,\n            suggestion: 'Update parent reference in child node'\n          });\n        }\n      }\n    }\n\n    // Validate orphaned nodes\n    if (node.parentId) {\n      const parentNode = context.registry.getNode(node.parentId);\n      if (!parentNode) {\n        issues.push({\n          id: `orphaned-node-${node.id}`,\n          severity: ValidationSeverity.WARNING,\n          category: ValidationCategory.DEPENDENCY,\n          message: `Node references non-existent parent ${node.parentId}`,\n          nodeId: node.id,\n          suggestion: 'Remove parent reference or add the missing parent node'\n        });\n      } else if (!parentNode.children?.includes(node.id)) {\n        issues.push({\n          id: `missing-child-ref-${node.id}`,\n          severity: ValidationSeverity.WARNING,\n          category: ValidationCategory.DEPENDENCY,\n          message: `Parent node ${node.parentId} does not reference this child`,\n          nodeId: node.id,\n          suggestion: 'Add child reference in parent node'\n        });\n      }\n    }\n\n    return issues;\n  }\n\n  private validateBusinessLogic(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n\n    if (!node.config) return issues;\n\n    // Type-specific business logic validation\n    switch (node.config.type) {\n      case 'fieldCondition':\n        issues.push(...this.validateFieldCondition(node, context));\n        break;\n      case 'booleanGroup':\n      case 'andGroup':\n      case 'orGroup':\n      case 'notGroup':\n      case 'xorGroup':\n      case 'impliesGroup':\n        issues.push(...this.validateBooleanGroup(node, context));\n        break;\n      case 'cardinality':\n        issues.push(...this.validateCardinality(node, context));\n        break;\n    }\n\n    return issues;\n  }\n\n  private validatePerformance(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n\n    if (!context.config.enablePerformanceWarnings) return issues;\n\n    // Check for excessive children\n    if (node.children && node.children.length > 20) {\n      issues.push({\n        id: `too-many-children-${node.id}`,\n        severity: ValidationSeverity.WARNING,\n        category: ValidationCategory.PERFORMANCE,\n        message: `Node has ${node.children.length} children, which may impact performance`,\n        nodeId: node.id,\n        suggestion: 'Consider grouping children or simplifying the rule structure'\n      });\n    }\n\n    return issues;\n  }\n\n  private validateNodeByType(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n\n    if (!node.config?.type) return issues;\n\n    // Validate based on expected structure for each type\n    const requiredChildren = this.getRequiredChildrenCount(node.config.type);\n    const actualChildren = node.children?.length || 0;\n\n    if (requiredChildren.min !== undefined && actualChildren < requiredChildren.min) {\n      issues.push({\n        id: `insufficient-children-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: `${node.config.type} requires at least ${requiredChildren.min} children, but has ${actualChildren}`,\n        nodeId: node.id,\n        suggestion: `Add ${requiredChildren.min - actualChildren} more child nodes`\n      });\n    }\n\n    if (requiredChildren.max !== undefined && actualChildren > requiredChildren.max) {\n      issues.push({\n        id: `too-many-children-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: `${node.config.type} allows at most ${requiredChildren.max} children, but has ${actualChildren}`,\n        nodeId: node.id,\n        suggestion: `Remove ${actualChildren - requiredChildren.max} child nodes`\n      });\n    }\n\n    return issues;\n  }\n\n  private validateFieldCondition(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const config = node.config as any;\n\n    if (!config.fieldName) {\n      issues.push({\n        id: `missing-field-name-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: 'Field condition is missing fieldName',\n        nodeId: node.id,\n        suggestion: 'Specify a field name for the condition'\n      });\n    }\n\n    if (!config.operator) {\n      issues.push({\n        id: `missing-operator-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: 'Field condition is missing operator',\n        nodeId: node.id,\n        suggestion: 'Specify a comparison operator'\n      });\n    }\n\n    if (config.value === undefined) {\n      issues.push({\n        id: `missing-value-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: 'Field condition is missing value',\n        nodeId: node.id,\n        suggestion: 'Specify a value for comparison'\n      });\n    }\n\n    return issues;\n  }\n\n  private validateBooleanGroup(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const config = node.config as any;\n\n    if (!config.operator) {\n      issues.push({\n        id: `missing-boolean-operator-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: 'Boolean group is missing operator',\n        nodeId: node.id,\n        suggestion: 'Specify a boolean operator (and, or, not, etc.)'\n      });\n    }\n\n    return issues;\n  }\n\n  private validateCardinality(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const config = node.config as any;\n\n    if (!config.cardinalityType) {\n      issues.push({\n        id: `missing-cardinality-type-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: 'Cardinality rule is missing cardinalityType',\n        nodeId: node.id,\n        suggestion: 'Specify cardinality type (atLeast, exactly, etc.)'\n      });\n    }\n\n    if (typeof config.count !== 'number' || config.count < 0) {\n      issues.push({\n        id: `invalid-cardinality-count-${node.id}`,\n        severity: ValidationSeverity.ERROR,\n        category: ValidationCategory.BUSINESS_LOGIC,\n        message: 'Cardinality rule has invalid count value',\n        nodeId: node.id,\n        suggestion: 'Specify a non-negative number for count'\n      });\n    }\n\n    return issues;\n  }\n\n  private getRequiredChildrenCount(nodeType: string): { min?: number; max?: number } {\n    switch (nodeType) {\n      case 'notGroup':\n        return { min: 1, max: 1 };\n      case 'impliesGroup':\n        return { min: 2, max: 2 };\n      case 'andGroup':\n      case 'orGroup':\n      case 'xorGroup':\n        return { min: 1 };\n      case 'cardinality':\n      case 'atLeast':\n      case 'exactly':\n        return { min: 1 };\n      case 'fieldCondition':\n        return { min: 0, max: 0 };\n      default:\n        return {};\n    }\n  }\n\n  private collectAllNodes(rootNode: RuleNode): Map<string, RuleNode> {\n    const nodes = new Map<string, RuleNode>();\n    const visited = new Set<string>();\n\n    const traverse = (node: RuleNode) => {\n      if (visited.has(node.id)) return;\n      visited.add(node.id);\n      nodes.set(node.id, node);\n\n      if (node.children) {\n        for (const childId of node.children) {\n          const childNode = this.nodeRegistry.getNode(childId);\n          if (childNode) {\n            traverse(childNode);\n          }\n        }\n      }\n    };\n\n    traverse(rootNode);\n    return nodes;\n  }\n\n  private calculateMetrics(rootNode: RuleNode, allNodes: Map<string, RuleNode>, validationTime: number) {\n    let maxDepth = 0;\n    let complexity = 0;\n\n    const calculateDepth = (node: RuleNode, currentDepth: number): number => {\n      maxDepth = Math.max(maxDepth, currentDepth);\n      \n      // Add to complexity based on node type\n      complexity += this.getNodeComplexity(node);\n\n      if (node.children) {\n        for (const childId of node.children) {\n          const childNode = this.nodeRegistry.getNode(childId);\n          if (childNode) {\n            calculateDepth(childNode, currentDepth + 1);\n          }\n        }\n      }\n      \n      return maxDepth;\n    };\n\n    calculateDepth(rootNode, 1);\n\n    return {\n      validationTime,\n      nodeCount: allNodes.size,\n      maxDepth,\n      complexity\n    };\n  }\n\n  private getNodeComplexity(node: RuleNode): number {\n    switch (node.config?.type) {\n      case 'fieldCondition':\n        return 1;\n      case 'booleanGroup':\n        // Check the operator for complexity\n        const booleanConfig = node.config as any;\n        switch (booleanConfig.operator) {\n          case 'and':\n          case 'or':\n            return 2;\n          case 'not':\n            return 1;\n          case 'xor':\n          case 'implies':\n            return 3;\n          default:\n            return 2;\n        }\n      case 'cardinality':\n        return 4;\n      default:\n        return 1;\n    }\n  }\n}","/**\n * Typed error system for Visual Builder operations\n * Provides structured error handling with codes, categories, and context\n */\n\n/**\n * Error categories for classification\n */\nexport enum ErrorCategory {\n  VALIDATION = 'validation',\n  CONVERSION = 'conversion',\n  REGISTRY = 'registry',\n  DSL = 'dsl',\n  CONTEXT = 'context',\n  CONFIGURATION = 'configuration',\n  NETWORK = 'network',\n  INTERNAL = 'internal'\n}\n\n/**\n * Error severity levels\n */\nexport enum ErrorSeverity {\n  LOW = 'low',\n  MEDIUM = 'medium',\n  HIGH = 'high',\n  CRITICAL = 'critical'\n}\n\n/**\n * Base error class for all Visual Builder errors\n */\nexport abstract class VisualBuilderError extends Error {\n  abstract readonly code: string;\n  abstract readonly category: ErrorCategory;\n  abstract readonly severity: ErrorSeverity;\n  \n  public readonly timestamp: Date;\n  public readonly context: Record<string, any>;\n\n  constructor(\n    message: string,\n    context: Record<string, any> = {},\n    public override readonly cause?: Error\n  ) {\n    super(message);\n    this.name = this.constructor.name;\n    this.timestamp = new Date();\n    this.context = context;\n    \n    // Maintain proper stack trace\n    if ((Error as any).captureStackTrace) {\n      (Error as any).captureStackTrace(this, this.constructor);\n    }\n  }\n\n  /**\n   * Get structured error information\n   */\n  toJSON(): ErrorInfo {\n    return {\n      code: this.code,\n      category: this.category,\n      severity: this.severity,\n      message: this.message,\n      timestamp: this.timestamp.toISOString(),\n      context: this.context,\n      stack: this.stack,\n      cause: this.cause ? {\n        name: this.cause.name,\n        message: this.cause.message,\n        stack: this.cause.stack\n      } : undefined\n    };\n  }\n}\n\n/**\n * Validation-related errors\n */\nexport class ValidationError extends VisualBuilderError {\n  readonly code = 'VALIDATION_ERROR';\n  readonly category = ErrorCategory.VALIDATION;\n  readonly severity = ErrorSeverity.HIGH;\n\n  constructor(\n    message: string,\n    public readonly nodeId?: string,\n    public readonly validationRules?: string[],\n    context: Record<string, any> = {}\n  ) {\n    super(message, { nodeId, validationRules, ...context });\n  }\n}\n\n/**\n * Conversion-related errors\n */\nexport class ConversionError extends VisualBuilderError {\n  readonly code: string;\n  readonly category = ErrorCategory.CONVERSION;\n  readonly severity = ErrorSeverity.HIGH;\n\n  constructor(\n    code: string,\n    message: string,\n    public readonly nodeId?: string,\n    context: Record<string, any> = {},\n    cause?: Error\n  ) {\n    super(message, { nodeId, ...context }, cause);\n    this.code = `CONVERSION_${code}`;\n  }\n}\n\n/**\n * Registry-related errors\n */\nexport class RegistryError extends VisualBuilderError {\n  readonly code: string;\n  readonly category = ErrorCategory.REGISTRY;\n  readonly severity = ErrorSeverity.MEDIUM;\n\n  constructor(\n    operation: string,\n    message: string,\n    public readonly nodeId?: string,\n    context: Record<string, any> = {}\n  ) {\n    super(message, { operation, nodeId, ...context });\n    this.code = `REGISTRY_${operation.toUpperCase()}`;\n  }\n}\n\n/**\n * DSL parsing and processing errors\n */\nexport class DslError extends VisualBuilderError {\n  readonly code: string;\n  readonly category = ErrorCategory.DSL;\n  readonly severity = ErrorSeverity.HIGH;\n\n  constructor(\n    type: 'PARSING' | 'VALIDATION' | 'EXPORT' | 'IMPORT',\n    message: string,\n    public readonly expression?: string,\n    public readonly position?: { start: number; end: number },\n    context: Record<string, any> = {}\n  ) {\n    super(message, { expression, position, ...context });\n    this.code = `DSL_${type}`;\n  }\n}\n\n/**\n * Context management errors\n */\nexport class ContextError extends VisualBuilderError {\n  readonly code: string;\n  readonly category = ErrorCategory.CONTEXT;\n  readonly severity = ErrorSeverity.MEDIUM;\n\n  constructor(\n    operation: string,\n    message: string,\n    public readonly scopeId?: string,\n    public readonly variablePath?: string,\n    context: Record<string, any> = {}\n  ) {\n    super(message, { operation, scopeId, variablePath, ...context });\n    this.code = `CONTEXT_${operation.toUpperCase()}`;\n  }\n}\n\n/**\n * Configuration errors\n */\nexport class ConfigurationError extends VisualBuilderError {\n  readonly code = 'CONFIGURATION_ERROR';\n  readonly category = ErrorCategory.CONFIGURATION;\n  readonly severity = ErrorSeverity.HIGH;\n\n  constructor(\n    message: string,\n    public readonly configPath?: string,\n    public readonly expectedType?: string,\n    context: Record<string, any> = {}\n  ) {\n    super(message, { configPath, expectedType, ...context });\n  }\n}\n\n/**\n * Internal system errors\n */\nexport class InternalError extends VisualBuilderError {\n  readonly code = 'INTERNAL_ERROR';\n  readonly category = ErrorCategory.INTERNAL;\n  readonly severity = ErrorSeverity.CRITICAL;\n\n  constructor(\n    message: string,\n    context: Record<string, any> = {},\n    cause?: Error\n  ) {\n    super(message, context, cause);\n  }\n}\n\n/**\n * Structured error information\n */\nexport interface ErrorInfo {\n  code: string;\n  category: ErrorCategory;\n  severity: ErrorSeverity;\n  message: string;\n  timestamp: string;\n  context: Record<string, any>;\n  stack?: string;\n  cause?: {\n    name: string;\n    message: string;\n    stack?: string;\n  };\n}\n\n/**\n * Error handler for collecting and processing errors\n */\nexport class ErrorHandler {\n  private errors: VisualBuilderError[] = [];\n  private maxErrors = 100;\n\n  /**\n   * Handle an error\n   */\n  handle(error: Error | VisualBuilderError): void {\n    let visualBuilderError: VisualBuilderError;\n\n    if (error instanceof VisualBuilderError) {\n      visualBuilderError = error;\n    } else {\n      // Wrap generic errors\n      visualBuilderError = new InternalError(\n        error.message,\n        { originalName: error.name },\n        error\n      );\n    }\n\n    this.errors.push(visualBuilderError);\n\n    // Maintain max errors limit\n    if (this.errors.length > this.maxErrors) {\n      this.errors = this.errors.slice(-this.maxErrors);\n    }\n\n    // Log based on severity\n    this.logError(visualBuilderError);\n  }\n\n  /**\n   * Get all errors\n   */\n  getErrors(): VisualBuilderError[] {\n    return [...this.errors];\n  }\n\n  /**\n   * Get errors by category\n   */\n  getErrorsByCategory(category: ErrorCategory): VisualBuilderError[] {\n    return this.errors.filter(error => error.category === category);\n  }\n\n  /**\n   * Get errors by severity\n   */\n  getErrorsBySeverity(severity: ErrorSeverity): VisualBuilderError[] {\n    return this.errors.filter(error => error.severity === severity);\n  }\n\n  /**\n   * Clear all errors\n   */\n  clear(): void {\n    this.errors = [];\n  }\n\n  /**\n   * Get error statistics\n   */\n  getStatistics(): ErrorStatistics {\n    const stats: ErrorStatistics = {\n      total: this.errors.length,\n      byCategory: {} as Record<ErrorCategory, number>,\n      bySeverity: {} as Record<ErrorSeverity, number>,\n      recent: this.errors.slice(-10)\n    };\n\n    // Count by category\n    for (const category of Object.values(ErrorCategory)) {\n      stats.byCategory[category] = this.errors.filter(e => e.category === category).length;\n    }\n\n    // Count by severity\n    for (const severity of Object.values(ErrorSeverity)) {\n      stats.bySeverity[severity] = this.errors.filter(e => e.severity === severity).length;\n    }\n\n    return stats;\n  }\n\n  private logError(error: VisualBuilderError): void {\n    const errorInfo = error.toJSON();\n    \n    switch (error.severity) {\n      case ErrorSeverity.CRITICAL:\n        console.error('🔴 CRITICAL ERROR:', errorInfo);\n        break;\n      case ErrorSeverity.HIGH:\n        console.error('🟠 HIGH SEVERITY:', errorInfo);\n        break;\n      case ErrorSeverity.MEDIUM:\n        console.warn('🟡 MEDIUM SEVERITY:', errorInfo);\n        break;\n      case ErrorSeverity.LOW:\n        console.log('🟢 LOW SEVERITY:', errorInfo);\n        break;\n    }\n  }\n}\n\n/**\n * Error statistics interface\n */\nexport interface ErrorStatistics {\n  total: number;\n  byCategory: Record<ErrorCategory, number>;\n  bySeverity: Record<ErrorSeverity, number>;\n  recent: VisualBuilderError[];\n}\n\n/**\n * Global error handler instance\n */\nexport const globalErrorHandler = new ErrorHandler();\n\n/**\n * Utility function to create typed errors\n */\nexport const createError = {\n  validation: (message: string, nodeId?: string, rules?: string[]) => \n    new ValidationError(message, nodeId, rules),\n    \n  conversion: (code: string, message: string, nodeId?: string) => \n    new ConversionError(code, message, nodeId),\n    \n  registry: (operation: string, message: string, nodeId?: string) => \n    new RegistryError(operation, message, nodeId),\n    \n  dsl: (type: 'PARSING' | 'VALIDATION' | 'EXPORT' | 'IMPORT', message: string, expression?: string) => \n    new DslError(type, message, expression),\n    \n  context: (operation: string, message: string, scopeId?: string, variablePath?: string) => \n    new ContextError(operation, message, scopeId, variablePath),\n    \n  configuration: (message: string, configPath?: string, expectedType?: string) => \n    new ConfigurationError(message, configPath, expectedType),\n    \n  internal: (message: string, cause?: Error) => \n    new InternalError(message, {}, cause)\n};","import { Injectable } from '@angular/core';\nimport {\n  DslParser,\n  DslValidator,\n  ValidationIssue,\n  ValidationSeverity,\n  ValidationIssueType,\n  FunctionRegistry,\n} from '@praxisui/specification';\nimport { ContextProvider } from '@praxisui/specification';\n\n/**\n * Configuration for parsing DSL expressions\n */\nexport interface DslParsingConfig {\n  /** Available function registry */\n  functionRegistry?: FunctionRegistry<any>;\n  /** Context provider for variable resolution */\n  contextProvider?: ContextProvider;\n  /** Known field names for validation */\n  knownFields?: string[];\n  /** Enable performance warnings */\n  enablePerformanceWarnings?: boolean;\n  /** Maximum expression complexity */\n  maxComplexity?: number;\n}\n\n/**\n * Result of parsing a DSL expression\n */\nexport interface DslParsingResult<T extends object = any> {\n  /** Whether parsing was successful */\n  success: boolean;\n  /** Parsed specification (if successful) */\n  specification?: any; // Would be Specification<T> but avoiding circular import\n  /** Validation issues found */\n  issues: ValidationIssue[];\n  /** Performance metrics */\n  metrics?: {\n    parseTime: number;\n    complexity: number;\n  };\n}\n\n/**\n * Dedicated service for DSL parsing and validation\n * Extracted from SpecificationBridgeService to follow SRP\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class DslParsingService {\n  constructor() {}\n\n  /**\n   * Parse a DSL expression into a specification\n   */\n  parseDsl<T extends object = any>(\n    dslExpression: string,\n    config?: DslParsingConfig,\n  ): DslParsingResult<T> {\n    const startTime = performance.now();\n    const issues: ValidationIssue[] = [];\n\n    try {\n      const validator = new DslValidator({\n        knownFields: config?.knownFields,\n        functionRegistry: config?.functionRegistry,\n        enablePerformanceWarnings: config?.enablePerformanceWarnings,\n        maxComplexity: config?.maxComplexity,\n      });\n      const validationIssues = validator.validate(dslExpression);\n      issues.push(...validationIssues);\n\n      const criticalErrors = issues.filter(\n        (issue) => issue.severity === ValidationSeverity.ERROR,\n      );\n      if (criticalErrors.length > 0) {\n        return {\n          success: false,\n          issues,\n          metrics: {\n            parseTime: performance.now() - startTime,\n            complexity: this.calculateComplexity(dslExpression),\n          },\n        };\n      }\n\n      const parser = new DslParser<any>(config?.functionRegistry);\n      const specification = parser.parse(dslExpression);\n      const endTime = performance.now();\n\n      return {\n        success: true,\n        specification,\n        issues,\n        metrics: {\n          parseTime: endTime - startTime,\n          complexity: this.calculateComplexity(dslExpression),\n        },\n      };\n    } catch (error) {\n      issues.push({\n        type: ValidationIssueType.SYNTAX_ERROR,\n        severity: ValidationSeverity.ERROR,\n        message: `Failed to parse DSL: ${\n          error instanceof Error ? error.message : 'Unknown error'\n        }`,\n        position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n      });\n\n      return {\n        success: false,\n        issues,\n        metrics: {\n          parseTime: performance.now() - startTime,\n          complexity: this.calculateComplexity(dslExpression),\n        },\n      };\n    }\n  }\n\n  /**\n   * Validate DSL syntax without parsing\n   */\n  validateDsl(\n    dslExpression: string,\n    config?: DslParsingConfig,\n  ): ValidationIssue[] {\n    try {\n      const validator = new DslValidator({\n        knownFields: config?.knownFields,\n        functionRegistry: config?.functionRegistry,\n        enablePerformanceWarnings: config?.enablePerformanceWarnings,\n        maxComplexity: config?.maxComplexity,\n      });\n      return validator.validate(dslExpression);\n    } catch (error) {\n      return [\n        {\n          type: ValidationIssueType.SYNTAX_ERROR,\n          severity: ValidationSeverity.ERROR,\n          message: `Validation failed: ${\n            error instanceof Error ? error.message : 'Unknown error'\n          }`,\n          position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n        },\n      ];\n    }\n  }\n\n  /**\n   * Get suggestions for DSL completion\n   */\n  getDslSuggestions(\n    partialExpression: string,\n    cursorPosition: number,\n    config?: DslParsingConfig,\n  ): string[] {\n    try {\n      // This would typically use a language service or parser\n      const suggestions: string[] = [];\n\n      // Add field suggestions\n      if (config?.knownFields) {\n        const currentToken = this.getCurrentToken(\n          partialExpression,\n          cursorPosition,\n        );\n        const matchingFields = config.knownFields.filter((field) =>\n          field.toLowerCase().startsWith(currentToken.toLowerCase()),\n        );\n        suggestions.push(...matchingFields);\n      }\n\n      // Add operator suggestions\n      const operators = [\n        '==',\n        '!=',\n        '>',\n        '<',\n        '>=',\n        '<=',\n        'contains',\n        'startsWith',\n        'endsWith',\n      ];\n      suggestions.push(...operators);\n\n      // Add function suggestions\n      if (config?.functionRegistry) {\n        // Would get function names from registry\n        suggestions.push('sum()', 'count()', 'avg()', 'max()', 'min()');\n      }\n\n      return suggestions;\n    } catch (error) {\n      console.warn('Failed to get DSL suggestions:', error);\n      return [];\n    }\n  }\n\n  /**\n   * Format DSL expression for readability\n   */\n  formatDsl(dslExpression: string): string {\n    try {\n      // Simple formatting rules\n      return dslExpression\n        .replace(/\\s*&&\\s*/g, ' && ')\n        .replace(/\\s*\\|\\|\\s*/g, ' || ')\n        .replace(/\\s*==\\s*/g, ' == ')\n        .replace(/\\s*!=\\s*/g, ' != ')\n        .replace(/\\s*>=\\s*/g, ' >= ')\n        .replace(/\\s*<=\\s*/g, ' <= ')\n        .replace(/\\s*>\\s*/g, ' > ')\n        .replace(/\\s*<\\s*/g, ' < ')\n        .replace(/\\(\\s+/g, '(')\n        .replace(/\\s+\\)/g, ')')\n        .trim();\n    } catch (error) {\n      console.warn('Failed to format DSL:', error);\n      return dslExpression;\n    }\n  }\n\n  /**\n   * Check if DSL expression is syntactically valid\n   */\n  isValidDsl(dslExpression: string, config?: DslParsingConfig): boolean {\n    const issues = this.validateDsl(dslExpression, config);\n    return !issues.some((issue) => issue.severity === 'error');\n  }\n\n  private calculateComplexity(dslExpression: string): number {\n    // Simple complexity calculation based on operators and nesting\n    let complexity = 1;\n\n    // Count operators\n    complexity += (dslExpression.match(/&&|\\|\\|/g) || []).length * 2;\n    complexity += (dslExpression.match(/==|!=|>=|<=|>|</g) || []).length;\n\n    // Count parentheses (nesting)\n    complexity += (dslExpression.match(/\\(/g) || []).length;\n\n    // Count function calls\n    complexity += (dslExpression.match(/\\w+\\(/g) || []).length * 3;\n\n    return complexity;\n  }\n\n  private getCurrentToken(expression: string, cursorPosition: number): string {\n    // Extract the current word/token at cursor position\n    const beforeCursor = expression.substring(0, cursorPosition);\n    const afterCursor = expression.substring(cursorPosition);\n\n    const beforeMatch = beforeCursor.match(/(\\w+)$/);\n    const afterMatch = afterCursor.match(/^(\\w*)/);\n\n    const before = beforeMatch ? beforeMatch[1] : '';\n    const after = afterMatch ? afterMatch[1] : '';\n\n    return before + after;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ContextProvider } from '@praxisui/specification';\n/**\n * Context variable definition used by the context management service\n * Renamed to avoid conflicts with other ContextVariable interfaces\n */\nexport interface ContextEntry {\n  /** Full path identifier for the variable */\n  path: string;\n  /** Actual value of the variable */\n  value: unknown;\n  /** Optional type hint for validation */\n  type?: string;\n}\n\n/**\n * Configuration for contextual specification support\n */\nexport interface ContextualConfig {\n  /** Context variables available for token resolution */\n  contextVariables?: ContextEntry[];\n  /** Context provider instance */\n  contextProvider?: ContextProvider;\n  /** Enable strict validation of context tokens */\n  strictContextValidation?: boolean;\n}\n\n/**\n * Context variable value with metadata\n */\nexport interface ContextValue {\n  /** The actual value */\n  value: any;\n  /** Variable type */\n  type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n  /** Whether the value is computed */\n  computed?: boolean;\n  /** Last updated timestamp */\n  lastUpdated?: Date;\n}\n\n/**\n * Context scope for variable resolution\n */\nexport interface ContextScope {\n  /** Scope identifier */\n  id: string;\n  /** Scope name */\n  name: string;\n  /** Parent scope (for hierarchical contexts) */\n  parentId?: string;\n  /** Variables in this scope */\n  variables: Map<string, ContextValue>;\n}\n\n/**\n * Dedicated service for context management and variable resolution\n * Extracted from SpecificationBridgeService to follow SRP\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ContextManagementService {\n  private scopes = new Map<string, ContextScope>();\n  private globalScope: ContextScope;\n\n  constructor() {\n    // Initialize global scope\n    this.globalScope = {\n      id: 'global',\n      name: 'Global Context',\n      variables: new Map(),\n    };\n    this.scopes.set('global', this.globalScope);\n  }\n\n  /**\n   * Create a context provider from context variables\n   */\n  createContextProvider(contextVariables: ContextEntry[]): ContextProvider {\n    const variableMap = new Map<string, any>();\n\n    for (const variable of contextVariables) {\n      variableMap.set(variable.path, variable.value);\n\n      // Also add with dot notation if path contains dots\n      if (variable.path.includes('.')) {\n        const segments = variable.path.split('.');\n        let current = variableMap;\n\n        // Create nested structure\n        for (let i = 0; i < segments.length - 1; i++) {\n          const segment = segments[i];\n          if (!current.has(segment)) {\n            current.set(segment, new Map());\n          }\n          current = current.get(segment);\n        }\n\n        current.set(segments[segments.length - 1], variable.value);\n      }\n    }\n\n    return {\n      hasValue: (path: string) => this.hasContextValue(path, variableMap),\n      getValue: (path: string) => this.getContextValue(path, variableMap),\n    };\n  }\n\n  /**\n   * Create a new context scope\n   */\n  createScope(id: string, name: string, parentId?: string): ContextScope {\n    if (this.scopes.has(id)) {\n      throw new Error(`Context scope '${id}' already exists`);\n    }\n\n    if (parentId && !this.scopes.has(parentId)) {\n      throw new Error(`Parent scope '${parentId}' does not exist`);\n    }\n\n    const scope: ContextScope = {\n      id,\n      name,\n      parentId,\n      variables: new Map(),\n    };\n\n    this.scopes.set(id, scope);\n    return scope;\n  }\n\n  /**\n   * Set a variable in a specific scope\n   */\n  setVariable(\n    scopeId: string,\n    name: string,\n    value: any,\n    type?: ContextValue['type'],\n  ): void {\n    const scope = this.scopes.get(scopeId);\n    if (!scope) {\n      throw new Error(`Context scope '${scopeId}' does not exist`);\n    }\n\n    const contextValue: ContextValue = {\n      value,\n      type: type || this.inferType(value),\n      lastUpdated: new Date(),\n    };\n\n    scope.variables.set(name, contextValue);\n  }\n\n  /**\n   * Get a variable value from a scope (with inheritance)\n   */\n  getVariable(scopeId: string, name: string): ContextValue | undefined {\n    const scope = this.scopes.get(scopeId);\n    if (!scope) {\n      return undefined;\n    }\n\n    // Check current scope\n    if (scope.variables.has(name)) {\n      return scope.variables.get(name);\n    }\n\n    // Check parent scopes recursively\n    if (scope.parentId) {\n      return this.getVariable(scope.parentId, name);\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get all variables in a scope (including inherited)\n   */\n  getAllVariables(scopeId: string): Map<string, ContextValue> {\n    const allVariables = new Map<string, ContextValue>();\n\n    // Collect variables from parent scopes first (so they can be overridden)\n    this.collectVariablesRecursive(scopeId, allVariables);\n\n    return allVariables;\n  }\n\n  /**\n   * Validate context variables\n   */\n  validateContext(contextVariables: ContextEntry[]): {\n    isValid: boolean;\n    issues: string[];\n  } {\n    const issues: string[] = [];\n    const paths = new Set<string>();\n\n    for (const variable of contextVariables) {\n      // Check for duplicate paths\n      if (paths.has(variable.path)) {\n        issues.push(`Duplicate context variable path: ${variable.path}`);\n      }\n      paths.add(variable.path);\n\n      // Validate path format\n      if (!this.isValidPath(variable.path)) {\n        issues.push(`Invalid context variable path: ${variable.path}`);\n      }\n\n      // Validate value type consistency\n      if (variable.type && typeof variable.value !== variable.type) {\n        issues.push(\n          `Type mismatch for ${variable.path}: expected ${variable.type}, got ${typeof variable.value}`,\n        );\n      }\n    }\n\n    return {\n      isValid: issues.length === 0,\n      issues,\n    };\n  }\n\n  /**\n   * Create a scoped context provider\n   */\n  createScopedProvider(scopeId: string): ContextProvider {\n    const variables = this.getAllVariables(scopeId);\n\n    return {\n      hasValue: (path: string) => variables.has(path),\n      getValue: (path: string) => {\n        const contextValue = variables.get(path);\n        return contextValue ? contextValue.value : undefined;\n      },\n    };\n  }\n\n  /**\n   * Merge multiple context providers\n   */\n  mergeProviders(...providers: ContextProvider[]): ContextProvider {\n    return {\n      hasValue: (path: string) =>\n        providers.some((provider) => provider.hasValue(path)),\n      getValue: (path: string) => {\n        // Return from the first provider that has the value\n        for (const provider of providers) {\n          if (provider.hasValue(path)) {\n            return provider.getValue(path);\n          }\n        }\n        return undefined;\n      },\n    };\n  }\n\n  /**\n   * Get context statistics\n   */\n  getContextStatistics(scopeId?: string): {\n    scopeCount: number;\n    variableCount: number;\n    totalSize: number;\n    scopes: { id: string; name: string; variableCount: number }[];\n  } {\n    const scopesToCheck = scopeId ? [scopeId] : Array.from(this.scopes.keys());\n    let totalVariables = 0;\n    let totalSize = 0;\n    const scopeStats: { id: string; name: string; variableCount: number }[] =\n      [];\n\n    for (const id of scopesToCheck) {\n      const scope = this.scopes.get(id);\n      if (scope) {\n        const variableCount = scope.variables.size;\n        totalVariables += variableCount;\n\n        // Estimate size\n        for (const [, value] of scope.variables) {\n          totalSize += this.estimateSize(value.value);\n        }\n\n        scopeStats.push({\n          id: scope.id,\n          name: scope.name,\n          variableCount,\n        });\n      }\n    }\n\n    return {\n      scopeCount: scopesToCheck.length,\n      variableCount: totalVariables,\n      totalSize,\n      scopes: scopeStats,\n    };\n  }\n\n  private hasContextValue(\n    path: string,\n    variableMap: Map<string, any>,\n  ): boolean {\n    // Check direct path\n    if (variableMap.has(path)) {\n      return true;\n    }\n\n    // Check dot notation path\n    if (path.includes('.')) {\n      const segments = path.split('.');\n      let current: any = variableMap;\n\n      for (const segment of segments) {\n        if (current instanceof Map && current.has(segment)) {\n          current = current.get(segment);\n        } else {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  private getContextValue(path: string, variableMap: Map<string, any>): any {\n    // Check direct path\n    if (variableMap.has(path)) {\n      return variableMap.get(path);\n    }\n\n    // Check dot notation path\n    if (path.includes('.')) {\n      const segments = path.split('.');\n      let current: any = variableMap;\n\n      for (const segment of segments) {\n        if (current instanceof Map && current.has(segment)) {\n          current = current.get(segment);\n        } else {\n          return undefined;\n        }\n      }\n\n      return current;\n    }\n\n    return undefined;\n  }\n\n  private collectVariablesRecursive(\n    scopeId: string,\n    variables: Map<string, ContextValue>,\n  ): void {\n    const scope = this.scopes.get(scopeId);\n    if (!scope) return;\n\n    // First collect from parent (so child can override)\n    if (scope.parentId) {\n      this.collectVariablesRecursive(scope.parentId, variables);\n    }\n\n    // Then add/override with current scope variables\n    for (const [name, value] of scope.variables) {\n      variables.set(name, value);\n    }\n  }\n\n  private isValidPath(path: string): boolean {\n    // Basic path validation\n    return /^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(path);\n  }\n\n  private inferType(value: any): ContextValue['type'] {\n    if (Array.isArray(value)) return 'array';\n    if (value === null || value === undefined) return 'object';\n\n    const type = typeof value;\n    if (type === 'string' || type === 'number' || type === 'boolean') {\n      return type;\n    }\n\n    return 'object';\n  }\n\n  private estimateSize(value: any): number {\n    try {\n      return JSON.stringify(value).length;\n    } catch {\n      return 0;\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { DslExporter, ExportOptions } from '@praxisui/specification';\nimport { RuleNode, RuleNodeType, RuleNodeTypeString } from '../models/rule-builder.model';\nimport { ConverterFactoryService } from './converters/converter-factory.service';\nimport {\n  DslParsingService,\n  DslParsingConfig,\n  DslParsingResult,\n} from './dsl/dsl-parsing.service';\nimport {\n  ContextManagementService,\n  ContextualConfig,\n} from './context/context-management.service';\nimport {\n  ConversionError,\n  createError,\n  globalErrorHandler,\n} from '../errors/visual-builder-errors';\n\n/**\n * Simplified service for core rule conversion operations\n * Replaces the God Service anti-pattern from SpecificationBridgeService\n * Focuses only on conversion between RuleNodes and Specifications\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class RuleConversionService {\n  private dslExporter: DslExporter;\n\n  constructor(\n    private converterFactory: ConverterFactoryService,\n    private dslParsingService: DslParsingService,\n    private contextManagementService: ContextManagementService,\n  ) {\n    this.dslExporter = new DslExporter({\n      prettyPrint: true,\n      indentSize: 2,\n      maxLineLength: 80,\n      useParentheses: 'auto',\n      includeMetadata: true,\n      metadataPosition: 'before',\n    });\n  }\n\n  /**\n   * Convert a RuleNode tree to a Specification instance\n   * Core conversion functionality with clean error handling\n   */\n  convertRuleToSpecification<T extends object = any>(\n    node: RuleNode,\n  ): Specification<T> {\n    if (!node) {\n      const error = createError.conversion(\n        'INVALID_INPUT',\n        'Node cannot be null or undefined',\n      );\n      globalErrorHandler.handle(error);\n      throw error;\n    }\n\n    if (!node.config?.type) {\n      const error = createError.conversion(\n        'MISSING_CONFIGURATION',\n        `Node ${node.id} is missing configuration or type`,\n        node.id,\n      );\n      globalErrorHandler.handle(error);\n      throw error;\n    }\n\n    try {\n      return this.converterFactory.convert<T>(node);\n    } catch (error) {\n      const conversionError = createError.conversion(\n        'CONVERSION_FAILED',\n        `Failed to convert node ${node.id}`,\n        node.id,\n      );\n      globalErrorHandler.handle(conversionError);\n      throw conversionError;\n    }\n  }\n\n  /**\n   * Convert a Specification back to a RuleNode tree\n   * Simplified reverse conversion\n   */\n  convertSpecificationToRule<T extends object = any>(\n    spec: Specification<T>,\n  ): RuleNode {\n    if (!spec) {\n      throw new ConversionError(\n        'INVALID_INPUT',\n        'Specification cannot be null or undefined',\n      );\n    }\n\n    try {\n      const specJson = spec.toJSON();\n      return this.jsonToRuleNode(specJson);\n    } catch (error) {\n      throw new ConversionError(\n        'REVERSE_CONVERSION_FAILED',\n        'Failed to convert specification to rule node',\n        undefined,\n        {},\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Export a RuleNode tree to DSL format\n   */\n  exportRuleToDsl<T extends object = any>(\n    node: RuleNode,\n    options?: Partial<ExportOptions>,\n  ): string {\n    try {\n      const specification = this.convertRuleToSpecification<T>(node);\n      if (options) {\n        // Create a new exporter with custom options\n        const customExporter = new DslExporter(options);\n        return customExporter.export(specification);\n      }\n      return this.dslExporter.export(specification);\n    } catch (error) {\n      throw new ConversionError(\n        'DSL_EXPORT_FAILED',\n        `Failed to export rule to DSL`,\n        undefined,\n        {},\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Import a RuleNode tree from DSL format\n   */\n  importRuleFromDsl<T extends object = any>(\n    dslExpression: string,\n    config?: DslParsingConfig,\n  ): DslParsingResult<T> {\n    if (!dslExpression || dslExpression.trim().length === 0) {\n      throw new ConversionError(\n        'INVALID_INPUT',\n        'DSL expression cannot be empty',\n      );\n    }\n\n    try {\n      return this.dslParsingService.parseDsl<T>(dslExpression, config);\n    } catch (error) {\n      throw new ConversionError(\n        'DSL_IMPORT_FAILED',\n        'Failed to import rule from DSL',\n        undefined,\n        {},\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Create a contextual specification from a RuleNode\n   */\n  createContextualSpecification<T extends object = any>(\n    node: RuleNode,\n    contextConfig: ContextualConfig,\n  ): Specification<T> {\n    try {\n      const contextProvider =\n        contextConfig.contextProvider ||\n        (contextConfig.contextVariables\n          ? this.contextManagementService.createContextProvider(\n              contextConfig.contextVariables,\n            )\n          : undefined);\n\n      if (!contextProvider) {\n        throw new ConversionError(\n          'MISSING_CONTEXT',\n          'Context provider or context variables are required for contextual specification',\n        );\n      }\n\n      // Convert the rule normally first\n      const baseSpecification = this.convertRuleToSpecification<T>(node);\n\n      // TODO: Wrap in contextual specification\n      // This would require ContextualSpecification from @praxisui/specification\n      return baseSpecification;\n    } catch (error) {\n      throw new ConversionError(\n        'CONTEXTUAL_CONVERSION_FAILED',\n        'Failed to create contextual specification',\n        undefined,\n        {},\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Validate that a rule can be converted\n   */\n  validateConversion(node: RuleNode): ConversionValidationResult {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    // Basic validation\n    if (!node) {\n      errors.push('Node cannot be null or undefined');\n      return { isValid: false, errors, warnings };\n    }\n\n    if (!node.id) {\n      errors.push('Node is missing required ID');\n    }\n\n    if (!node.config) {\n      errors.push(`Node ${node.id} is missing configuration`);\n      return { isValid: false, errors, warnings };\n    }\n\n    if (!node.config.type) {\n      errors.push(`Node ${node.id} is missing type in configuration`);\n    }\n\n    // Check if converter exists\n    const factoryValidation = this.converterFactory.validateNode(node);\n    if (!factoryValidation.isValid) {\n      errors.push(...factoryValidation.errors);\n    }\n\n    // Warnings for potential issues\n    if (node.children && node.children.length > 20) {\n      warnings.push(\n        `Node ${node.id} has many children (${node.children.length}) which may impact performance`,\n      );\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n      warnings,\n    };\n  }\n\n  /**\n   * Get conversion statistics\n   */\n  getConversionStatistics(): ConversionStatistics {\n    const factoryStats = this.converterFactory.getStatistics();\n\n    return {\n      supportedNodeTypes: factoryStats.supportedTypes.length,\n      registeredConverters: factoryStats.converterCount,\n      availableNodeTypes: factoryStats.supportedTypes,\n      converterNames: factoryStats.converterNames,\n    };\n  }\n\n  private jsonToRuleNode(json: any): RuleNode {\n    // Simplified JSON to RuleNode conversion\n    // This would need to be implemented based on the actual JSON structure\n    // from @praxisui/specification\n\n    const children: string[] | undefined = Array.isArray(json.children)\n      ? json.children.map((child: any) => String(child))\n      : undefined;\n\n    const config: Record<string, unknown> = {\n      type: json.config?.type || json.type || 'fieldCondition',\n    };\n\n    if (json.config?.fieldName || json.config?.field) {\n      config['fieldName'] = json.config.fieldName || json.config.field;\n    }\n    if (json.config?.operator !== undefined) {\n      config['operator'] = json.config.operator;\n    }\n    if (json.config?.value !== undefined) {\n      config['value'] = json.config.value;\n    }\n\n    return {\n      id: String(json.id || `node-${Date.now()}`),\n      type: (config['type'] as RuleNodeType | RuleNodeTypeString) || 'fieldCondition',\n      config: config as any,\n      children,\n    };\n  }\n}\n\n/**\n * Result of conversion validation\n */\nexport interface ConversionValidationResult {\n  isValid: boolean;\n  errors: string[];\n  warnings: string[];\n}\n\n/**\n * Statistics about conversion capabilities\n */\nexport interface ConversionStatistics {\n  supportedNodeTypes: number;\n  registeredConverters: number;\n  availableNodeTypes: string[];\n  converterNames: string[];\n}\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { RuleBuilderState, RuleNode } from '../models/rule-builder.model';\n\n/**\n * Placeholder Visual Rule Builder Component\n * \n * This is a placeholder component for the template integration example.\n * In a real implementation, this would be the main visual rule builder interface.\n */\n@Component({\n  selector: 'praxis-visual-rule-builder',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"visual-rule-builder-placeholder\">\n      <div class=\"placeholder-content\">\n        <h3>Visual Rule Builder</h3>\n        <p>This is a placeholder for the visual rule builder component.</p>\n        <p>Current state has {{ nodeCount }} nodes.</p>\n        \n        <div class=\"builder-actions\">\n          <button type=\"button\" (click)=\"addSampleNode()\">Add Sample Node</button>\n          <button type=\"button\" (click)=\"clearNodes()\">Clear All</button>\n        </div>\n\n        <div class=\"state-display\" *ngIf=\"nodeCount > 0\">\n          <h4>Current Nodes:</h4>\n          <ul>\n            <li *ngFor=\"let nodeId of builderState?.rootNodes\">\n              Node: {{ nodeId }}\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .visual-rule-builder-placeholder {\n      padding: 24px;\n      border: 2px dashed #ccc;\n      border-radius: 8px;\n      background: #f9f9f9;\n      text-align: center;\n      min-height: 300px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .placeholder-content {\n      max-width: 400px;\n    }\n\n    .placeholder-content h3 {\n      margin: 0 0 16px 0;\n      color: #666;\n    }\n\n    .placeholder-content p {\n      margin: 8px 0;\n      color: #888;\n    }\n\n    .builder-actions {\n      margin: 20px 0;\n    }\n\n    .builder-actions button {\n      margin: 0 8px;\n      padding: 8px 16px;\n      border: 1px solid #ccc;\n      background: var(--md-sys-color-surface);\n      border-radius: 4px;\n      cursor: pointer;\n    }\n\n    .builder-actions button:hover {\n      background: var(--md-sys-color-surface-variant);\n    }\n\n    .state-display {\n      margin-top: 20px;\n      text-align: left;\n      background: var(--md-sys-color-surface);\n      padding: 16px;\n      border-radius: 4px;\n      border: 1px solid #ddd;\n    }\n\n    .state-display h4 {\n      margin: 0 0 8px 0;\n      color: #333;\n    }\n\n    .state-display ul {\n      margin: 0;\n      padding-left: 20px;\n    }\n\n    .state-display li {\n      color: #666;\n      margin: 4px 0;\n    }\n  `]\n})\nexport class VisualRuleBuilderComponent {\n  @Input() fieldSchemas: any[] = [];\n  @Input() builderState: RuleBuilderState | null = null;\n  \n  @Output() stateChanged = new EventEmitter<RuleBuilderState>();\n  @Output() selectionChanged = new EventEmitter<any[]>();\n\n  get nodeCount(): number {\n    return this.builderState ? Object.keys(this.builderState.nodes).length : 0;\n  }\n\n  addSampleNode(): void {\n    if (!this.builderState) {\n      this.builderState = {\n        nodes: {},\n        rootNodes: [],\n        validationErrors: [],\n        mode: 'visual',\n        isDirty: false,\n        history: [],\n        historyPosition: 0\n      };\n    }\n\n    const nodeId = `sample-node-${Date.now()}`;\n    const sampleNode: RuleNode = {\n      id: nodeId,\n      type: 'fieldCondition',\n      label: 'Sample Rule',\n      config: {\n        type: 'fieldCondition',\n        fieldName: 'email',\n        operator: 'neq',\n        value: ''\n      }\n    };\n\n    const newState: RuleBuilderState = {\n      ...this.builderState,\n      nodes: {\n        ...this.builderState.nodes,\n        [nodeId]: sampleNode\n      },\n      rootNodes: [...this.builderState.rootNodes, nodeId],\n      isDirty: true\n    };\n\n    this.builderState = newState;\n    this.stateChanged.emit(newState);\n    this.selectionChanged.emit([sampleNode]);\n  }\n\n  clearNodes(): void {\n    const newState: RuleBuilderState = {\n      nodes: {},\n      rootNodes: [],\n      validationErrors: [],\n      mode: 'visual',\n      isDirty: false,\n      history: [],\n      historyPosition: 0\n    };\n\n    this.builderState = newState;\n    this.stateChanged.emit(newState);\n    this.selectionChanged.emit([]);\n  }\n}\n","import { Component, Inject, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormArray } from '@angular/forms';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { MatChipInputEvent } from '@angular/material/chips';\n\nimport { RuleTemplate, RuleNode, TemplateMetadata } from '../models/rule-builder.model';\nimport { RuleTemplateService } from '../services/rule-template.service';\nimport { SpecificationBridgeService } from '../services/specification-bridge.service';\n\nexport interface TemplateEditorDialogData {\n  mode: 'create' | 'edit';\n  template?: RuleTemplate;\n  selectedNodes?: RuleNode[];\n  availableCategories?: string[];\n}\n\nexport interface TemplateEditorResult {\n  action: 'save' | 'cancel';\n  template?: RuleTemplate;\n}\n\n@Component({\n  selector: 'praxis-template-editor-dialog',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatDialogModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatButtonModule,\n    MatIconModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatStepperModule,\n    MatCheckboxModule,\n    MatTabsModule,\n    MatDividerModule,\n    MatSnackBarModule\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"template-editor-dialog\">\n      <div mat-dialog-title class=\"dialog-title\">\n        <mat-icon>{{ data.mode === 'create' ? 'add' : 'edit' }}</mat-icon>\n        <span>{{ data.mode === 'create' ? 'Create Template' : 'Edit Template' }}</span>\n      </div>\n\n      <div mat-dialog-content class=\"dialog-content\">\n        <mat-horizontal-stepper #stepper linear>\n          <!-- Step 1: Basic Information -->\n          <mat-step [stepControl]=\"basicInfoForm\" label=\"Basic Information\">\n            <form [formGroup]=\"basicInfoForm\" class=\"step-form\">\n              <div class=\"form-row\">\n                <mat-form-field appearance=\"outline\" class=\"name-field\">\n                  <mat-label>Template Name</mat-label>\n                  <input matInput \n                         formControlName=\"name\"\n                         placeholder=\"Enter template name\"\n                         maxlength=\"100\">\n                  <mat-hint align=\"end\">{{ (basicInfoForm.get('name')?.value || '').length }}/100</mat-hint>\n                  <mat-error *ngIf=\"basicInfoForm.get('name')?.hasError('required')\">\n                    Template name is required\n                  </mat-error>\n                  <mat-error *ngIf=\"basicInfoForm.get('name')?.hasError('minlength')\">\n                    Name must be at least 3 characters\n                  </mat-error>\n                </mat-form-field>\n\n                <mat-form-field appearance=\"outline\" class=\"category-field\">\n                  <mat-label>Category</mat-label>\n                  <mat-select formControlName=\"category\">\n                    <mat-option *ngFor=\"let category of availableCategories\" \n                               [value]=\"category.id\">\n                      <div class=\"category-option\">\n                        <mat-icon>{{ category.icon }}</mat-icon>\n                        <span>{{ category.name }}</span>\n                      </div>\n                    </mat-option>\n                  </mat-select>\n                  <mat-error *ngIf=\"basicInfoForm.get('category')?.hasError('required')\">\n                    Category is required\n                  </mat-error>\n                </mat-form-field>\n              </div>\n\n              <mat-form-field appearance=\"outline\" class=\"description-field\">\n                <mat-label>Description</mat-label>\n                <textarea matInput \n                          formControlName=\"description\"\n                          placeholder=\"Describe what this template does and when to use it\"\n                          rows=\"3\"\n                          maxlength=\"500\"></textarea>\n                <mat-hint align=\"end\">{{ (basicInfoForm.get('description')?.value || '').length }}/500</mat-hint>\n                <mat-error *ngIf=\"basicInfoForm.get('description')?.hasError('required')\">\n                  Description is required\n                </mat-error>\n              </mat-form-field>\n\n              <div class=\"tags-section\">\n                <h4>Tags</h4>\n                <mat-form-field appearance=\"outline\" class=\"tags-input\">\n                  <mat-label>Add tags</mat-label>\n                  <mat-chip-grid #chipList>\n                    <mat-chip-row *ngFor=\"let tag of tags\" \n                             [removable]=\"true\"\n                             (removed)=\"removeTag(tag)\">\n                      {{ tag }}\n                      <mat-icon matChipRemove>cancel</mat-icon>\n                    </mat-chip-row>\n                    <input placeholder=\"Type and press Enter\"\n                           [matChipInputFor]=\"chipList\"\n                           [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n                           [matChipInputAddOnBlur]=\"true\"\n                           (matChipInputTokenEnd)=\"addTag($event)\">\n                  </mat-chip-grid>\n                  <mat-hint>Tags help organize and find templates. Press Enter to add.</mat-hint>\n                </mat-form-field>\n              </div>\n\n              <div class=\"step-actions\">\n                <button mat-flat-button \n                        color=\"primary\"\n                        matStepperNext\n                        [disabled]=\"!basicInfoForm.valid\">\n                  Next: Configure Rules\n                </button>\n              </div>\n            </form>\n          </mat-step>\n\n          <!-- Step 2: Rule Configuration -->\n          <mat-step [stepControl]=\"rulesForm\" label=\"Rule Configuration\">\n            <form [formGroup]=\"rulesForm\" class=\"step-form\">\n              <div class=\"rules-section\">\n                <div class=\"section-header\">\n                  <h4>Template Rules</h4>\n                  <p class=\"section-description\">\n                    {{ data.mode === 'create' ? 'Selected nodes will be included in the template.' : 'Configure the rules included in this template.' }}\n                  </p>\n                </div>\n\n                <div class=\"rules-preview\">\n                  <div class=\"preview-header\">\n                    <mat-icon>rule</mat-icon>\n                    <span>Rule Structure Preview</span>\n                    <span class=\"node-count\">({{ nodeCount }} nodes)</span>\n                  </div>\n\n                  <div class=\"nodes-tree\">\n                    <div *ngFor=\"let node of previewNodes\" \n                         class=\"tree-node\"\n                         [class.root-node]=\"isRootNode(node)\">\n                      <div class=\"node-content\">\n                        <mat-icon class=\"node-icon\">{{ getNodeIcon(node) }}</mat-icon>\n                        <span class=\"node-label\">{{ node.label || node.type }}</span>\n                        <mat-chip class=\"node-type-chip\">{{ node.type }}</mat-chip>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n\n                <div class=\"required-fields-section\">\n                  <h5>Required Fields</h5>\n                  <p class=\"field-description\">\n                    Specify which fields are required for this template to work properly.\n                  </p>\n                  \n                  <mat-form-field appearance=\"outline\" class=\"required-fields-input\">\n                    <mat-label>Required field names</mat-label>\n                    <mat-chip-grid #requiredFieldsList>\n                      <mat-chip-row *ngFor=\"let field of requiredFields\" \n                               [removable]=\"true\"\n                               (removed)=\"removeRequiredField(field)\">\n                        {{ field }}\n                        <mat-icon matChipRemove>cancel</mat-icon>\n                      </mat-chip-row>\n                      <input placeholder=\"Add field name\"\n                             [matChipInputFor]=\"requiredFieldsList\"\n                             [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n                             [matChipInputAddOnBlur]=\"true\"\n                             (matChipInputTokenEnd)=\"addRequiredField($event)\">\n                    </mat-chip-grid>\n                    <mat-hint>Field names that must exist for the template to work correctly</mat-hint>\n                  </mat-form-field>\n                </div>\n\n                <div class=\"template-variables-section\">\n                  <h5>Template Variables</h5>\n                  <p class=\"field-description\">\n                    Variables like {{ '{{fieldName}}' }} will be replaced when the template is applied.\n                  </p>\n                  \n                  <div class=\"detected-variables\">\n                    <mat-chip-set>\n                      <mat-chip *ngFor=\"let variable of detectedVariables\" \n                               color=\"accent\">\n                        {{ variable }}\n                      </mat-chip>\n                    </mat-chip-set>\n                    <p *ngIf=\"detectedVariables.length === 0\" class=\"no-variables\">\n                      No template variables detected in this configuration.\n                    </p>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"step-actions\">\n                <button mat-button matStepperPrevious>\n                  Previous\n                </button>\n                <button mat-flat-button \n                        color=\"primary\"\n                        matStepperNext\n                        [disabled]=\"!rulesForm.valid\">\n                  Next: Advanced Options\n                </button>\n              </div>\n            </form>\n          </mat-step>\n\n          <!-- Step 3: Advanced Options -->\n          <mat-step [stepControl]=\"advancedForm\" label=\"Advanced Options\">\n            <form [formGroup]=\"advancedForm\" class=\"step-form\">\n              <div class=\"advanced-section\">\n                <h4>Template Metadata</h4>\n                \n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"icon-field\">\n                    <mat-label>Icon</mat-label>\n                    <mat-select formControlName=\"icon\">\n                      <mat-option *ngFor=\"let icon of availableIcons\" \n                                 [value]=\"icon.value\">\n                        <div class=\"icon-option\">\n                          <mat-icon>{{ icon.value }}</mat-icon>\n                          <span>{{ icon.label }}</span>\n                        </div>\n                      </mat-option>\n                    </mat-select>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\" class=\"version-field\">\n                    <mat-label>Version</mat-label>\n                    <input matInput \n                           formControlName=\"version\"\n                           placeholder=\"1.0.0\">\n                    <mat-hint>Semantic version (major.minor.patch)</mat-hint>\n                  </mat-form-field>\n                </div>\n\n                <div class=\"author-section\">\n                  <h5>Author Information</h5>\n                  <div class=\"form-row\">\n                    <mat-form-field appearance=\"outline\" class=\"author-name\">\n                      <mat-label>Author Name</mat-label>\n                      <input matInput formControlName=\"authorName\">\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\" class=\"author-email\">\n                      <mat-label>Author Email</mat-label>\n                      <input matInput \n                             type=\"email\"\n                             formControlName=\"authorEmail\">\n                    </mat-form-field>\n                  </div>\n\n                  <mat-form-field appearance=\"outline\" class=\"organization-field\">\n                    <mat-label>Organization</mat-label>\n                    <input matInput formControlName=\"organization\">\n                  </mat-form-field>\n                </div>\n\n                <div class=\"example-section\">\n                  <h5>Usage Example</h5>\n                  <mat-form-field appearance=\"outline\" class=\"example-field\">\n                    <mat-label>Example usage or code snippet</mat-label>\n                    <textarea matInput \n                              formControlName=\"example\"\n                              rows=\"4\"\n                              placeholder=\"Show how to use this template...\"></textarea>\n                  </mat-form-field>\n                </div>\n              </div>\n\n              <div class=\"step-actions\">\n                <button mat-button matStepperPrevious>\n                  Previous\n                </button>\n                <button mat-flat-button \n                        color=\"primary\"\n                        [disabled]=\"!canSave()\"\n                        (click)=\"saveTemplate()\">\n                  {{ data.mode === 'create' ? 'Create Template' : 'Save Changes' }}\n                </button>\n              </div>\n            </form>\n          </mat-step>\n        </mat-horizontal-stepper>\n      </div>\n\n      <div mat-dialog-actions class=\"dialog-actions\">\n        <button mat-button (click)=\"cancel()\">\n          Cancel\n        </button>\n        \n        <div class=\"actions-spacer\"></div>\n        \n        <button mat-button \n                *ngIf=\"data.mode === 'edit'\"\n                color=\"warn\"\n                (click)=\"deleteTemplate()\">\n          <mat-icon>delete</mat-icon>\n          Delete\n        </button>\n        \n        <button mat-button \n                (click)=\"previewTemplate()\"\n                [disabled]=\"!canPreview()\">\n          <mat-icon>preview</mat-icon>\n          Preview\n        </button>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .template-editor-dialog {\n      min-width: 600px;\n      max-width: 800px;\n      max-height: 90vh;\n    }\n\n    .dialog-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin: 0;\n      padding: 24px 24px 0;\n      font-size: 20px;\n      font-weight: 500;\n    }\n\n    .dialog-content {\n      padding: 16px 24px;\n      max-height: calc(90vh - 120px);\n      overflow-y: auto;\n    }\n\n    .step-form {\n      padding: 16px 0;\n      min-height: 400px;\n    }\n\n    .form-row {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 16px;\n    }\n\n    .name-field,\n    .category-field {\n      flex: 1;\n    }\n\n    .description-field,\n    .tags-input,\n    .required-fields-input,\n    .example-field,\n    .organization-field {\n      width: 100%;\n    }\n\n    .icon-field,\n    .version-field {\n      flex: 1;\n    }\n\n    .author-name,\n    .author-email {\n      flex: 1;\n    }\n\n    .category-option,\n    .icon-option {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .tags-section,\n    .required-fields-section,\n    .template-variables-section,\n    .author-section,\n    .example-section {\n      margin-bottom: 24px;\n    }\n\n    .tags-section h4,\n    .author-section h5,\n    .example-section h5,\n    .required-fields-section h5,\n    .template-variables-section h5 {\n      margin: 0 0 8px 0;\n      font-size: 14px;\n      font-weight: 500;\n      color: var(--md-sys-color-on-surface);\n    }\n\n    .section-header {\n      margin-bottom: 16px;\n    }\n\n    .section-header h4 {\n      margin: 0 0 4px 0;\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    .section-description,\n    .field-description {\n      margin: 0;\n      font-size: 13px;\n      color: var(--md-sys-color-on-surface-variant);\n    }\n\n    .rules-preview {\n      background: var(--md-sys-color-surface-container);\n      border-radius: 8px;\n      padding: 16px;\n      margin-bottom: 24px;\n    }\n\n    .preview-header {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-bottom: 12px;\n      font-size: 14px;\n      font-weight: 500;\n      color: var(--md-sys-color-on-surface);\n    }\n\n    .node-count {\n      font-weight: 400;\n      color: var(--md-sys-color-on-surface-variant);\n    }\n\n    .nodes-tree {\n      max-height: 200px;\n      overflow-y: auto;\n    }\n\n    .tree-node {\n      padding: 8px 0;\n      border-left: 2px solid transparent;\n      padding-left: 16px;\n    }\n\n    .tree-node.root-node {\n      border-left-color: var(--md-sys-color-primary);\n      background: color-mix(in srgb, var(--md-sys-color-primary) 5%, transparent);\n    }\n\n    .node-content {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .node-icon {\n      font-size: 16px;\n      width: 16px;\n      height: 16px;\n      color: var(--md-sys-color-primary);\n    }\n\n    .node-label {\n      flex: 1;\n      font-size: 13px;\n    }\n\n    .node-type-chip {\n      font-size: 10px;\n      height: 18px;\n      line-height: 18px;\n    }\n\n    .detected-variables {\n      margin-top: 8px;\n    }\n\n    .no-variables {\n      font-size: 12px;\n      color: var(--md-sys-color-on-surface-variant);\n      font-style: italic;\n      margin: 8px 0;\n    }\n\n    .step-actions {\n      display: flex;\n      gap: 8px;\n      justify-content: flex-end;\n      margin-top: 24px;\n      padding-top: 16px;\n      border-top: 1px solid var(--md-sys-color-outline-variant);\n    }\n\n    .dialog-actions {\n      padding: 16px 24px;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .actions-spacer {\n      flex: 1;\n    }\n\n    /* Stepper customization */\n    ::ng-deep .mat-stepper-horizontal {\n      margin-top: 8px;\n    }\n\n    ::ng-deep .mat-step-header {\n      pointer-events: none;\n    }\n\n    ::ng-deep .mat-step-header.cdk-keyboard-focused,\n    ::ng-deep .mat-step-header.cdk-program-focused,\n    ::ng-deep .mat-step-header:hover {\n      background-color: transparent;\n    }\n\n    /* Responsive adjustments */\n    @media (max-width: 768px) {\n      .template-editor-dialog {\n        min-width: 320px;\n        max-width: 95vw;\n      }\n      \n      .form-row {\n        flex-direction: column;\n      }\n      \n      .name-field,\n      .category-field,\n      .icon-field,\n      .version-field,\n      .author-name,\n      .author-email {\n        flex: none;\n        width: 100%;\n      }\n    }\n  `]\n})\nexport class TemplateEditorDialogComponent implements OnInit {\n  basicInfoForm: FormGroup;\n  rulesForm: FormGroup;\n  advancedForm: FormGroup;\n\n  tags: string[] = [];\n  requiredFields: string[] = [];\n  separatorKeysCodes: number[] = [ENTER, COMMA];\n\n  availableCategories = [\n    { id: 'validation', name: 'Field Validation', icon: 'check_circle' },\n    { id: 'business', name: 'Business Rules', icon: 'business' },\n    { id: 'collection', name: 'Collection Validation', icon: 'list' },\n    { id: 'conditional', name: 'Conditional Logic', icon: 'alt_route' },\n    { id: 'workflow', name: 'Workflow Rules', icon: 'workflow' },\n    { id: 'security', name: 'Security Validation', icon: 'security' },\n    { id: 'custom', name: 'Custom Templates', icon: 'extension' }\n  ];\n\n  availableIcons = [\n    { value: 'rule', label: 'Rule' },\n    { value: 'check_circle', label: 'Check Circle' },\n    { value: 'business', label: 'Business' },\n    { value: 'list', label: 'List' },\n    { value: 'alt_route', label: 'Alt Route' },\n    { value: 'workflow', label: 'Workflow' },\n    { value: 'security', label: 'Security' },\n    { value: 'extension', label: 'Extension' },\n    { value: 'widgets', label: 'Widgets' },\n    { value: 'settings', label: 'Settings' }\n  ];\n\n  previewNodes: RuleNode[] = [];\n  detectedVariables: string[] = [];\n\n  get nodeCount(): number {\n    return this.previewNodes.length;\n  }\n\n  constructor(\n    private dialogRef: MatDialogRef<TemplateEditorDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: TemplateEditorDialogData,\n    private fb: FormBuilder,\n    private templateService: RuleTemplateService,\n    private bridgeService: SpecificationBridgeService,\n    private snackBar: MatSnackBar\n  ) {\n    this.basicInfoForm = this.createBasicInfoForm();\n    this.rulesForm = this.createRulesForm();\n    this.advancedForm = this.createAdvancedForm();\n  }\n\n  ngOnInit(): void {\n    this.loadTemplateData();\n    this.setupPreviewNodes();\n    this.detectTemplateVariables();\n  }\n\n  private createBasicInfoForm(): FormGroup {\n    return this.fb.group({\n      name: ['', [Validators.required, Validators.minLength(3)]],\n      description: ['', Validators.required],\n      category: ['', Validators.required]\n    });\n  }\n\n  private createRulesForm(): FormGroup {\n    return this.fb.group({\n      // Form controls for rule configuration\n    });\n  }\n\n  private createAdvancedForm(): FormGroup {\n    return this.fb.group({\n      icon: ['rule'],\n      version: ['1.0.0'],\n      authorName: [''],\n      authorEmail: [''],\n      organization: [''],\n      example: ['']\n    });\n  }\n\n  private loadTemplateData(): void {\n    if (this.data.mode === 'edit' && this.data.template) {\n      const template = this.data.template;\n      \n      this.basicInfoForm.patchValue({\n        name: template.name,\n        description: template.description,\n        category: template.category\n      });\n\n      this.tags = [...template.tags];\n      this.requiredFields = [...(template.requiredFields || [])];\n\n      this.advancedForm.patchValue({\n        icon: template.icon || 'rule',\n        version: template.metadata?.version || '1.0.0',\n        authorName: template.metadata?.author?.name || '',\n        authorEmail: template.metadata?.author?.email || '',\n        organization: template.metadata?.author?.organization || '',\n        example: template.example || ''\n      });\n\n      this.previewNodes = template.nodes;\n    }\n  }\n\n  private setupPreviewNodes(): void {\n    if (this.data.mode === 'create' && this.data.selectedNodes) {\n      this.previewNodes = this.data.selectedNodes;\n    }\n  }\n\n  private detectTemplateVariables(): void {\n    // Detect template variables like {{fieldName}} in node configurations\n    const variables = new Set<string>();\n    \n    this.previewNodes.forEach(node => {\n      const configStr = JSON.stringify(node.config);\n      const matches = configStr.match(/\\{\\{([^}]+)\\}\\}/g);\n      \n      if (matches) {\n        matches.forEach(match => {\n          const variable = match.slice(2, -2).trim();\n          variables.add(variable);\n        });\n      }\n    });\n\n    this.detectedVariables = Array.from(variables);\n  }\n\n  // Template methods\n  addTag(event: MatChipInputEvent): void {\n    const value = (event.value || '').trim();\n    \n    if (value && !this.tags.includes(value)) {\n      this.tags.push(value);\n    }\n\n    event.chipInput!.clear();\n  }\n\n  removeTag(tag: string): void {\n    const index = this.tags.indexOf(tag);\n    if (index >= 0) {\n      this.tags.splice(index, 1);\n    }\n  }\n\n  addRequiredField(event: MatChipInputEvent): void {\n    const value = (event.value || '').trim();\n    \n    if (value && !this.requiredFields.includes(value)) {\n      this.requiredFields.push(value);\n    }\n\n    event.chipInput!.clear();\n  }\n\n  removeRequiredField(field: string): void {\n    const index = this.requiredFields.indexOf(field);\n    if (index >= 0) {\n      this.requiredFields.splice(index, 1);\n    }\n  }\n\n  isRootNode(node: RuleNode): boolean {\n    if (this.data.mode === 'edit' && this.data.template) {\n      return this.data.template.rootNodes.includes(node.id);\n    }\n    // For create mode, assume all selected nodes are potential root nodes\n    return true;\n  }\n\n  getNodeIcon(node: RuleNode): string {\n    const icons: Record<string, string> = {\n      'fieldCondition': 'compare_arrows',\n      'andGroup': 'join_inner',\n      'orGroup': 'join_full',\n      'notGroup': 'block',\n      'requiredIf': 'star_border',\n      'visibleIf': 'visibility',\n      'forEach': 'repeat',\n      'uniqueBy': 'fingerprint'\n    };\n    \n    return icons[node.type] || 'rule';\n  }\n\n  canSave(): boolean {\n    return this.basicInfoForm.valid && \n           this.rulesForm.valid && \n           this.advancedForm.valid &&\n           this.previewNodes.length > 0;\n  }\n\n  canPreview(): boolean {\n    return this.basicInfoForm.valid && this.previewNodes.length > 0;\n  }\n\n  saveTemplate(): void {\n    if (!this.canSave()) {\n      return;\n    }\n\n    const basicInfo = this.basicInfoForm.value;\n    const advancedInfo = this.advancedForm.value;\n\n    const templateData: Partial<RuleTemplate> = {\n      name: basicInfo.name,\n      description: basicInfo.description,\n      category: basicInfo.category,\n      tags: this.tags,\n      nodes: this.previewNodes,\n      rootNodes: this.previewNodes.map(n => n.id), // Simplified for demo\n      requiredFields: this.requiredFields,\n      icon: advancedInfo.icon,\n      example: advancedInfo.example,\n      metadata: {\n        version: advancedInfo.version,\n        author: {\n          name: advancedInfo.authorName,\n          email: advancedInfo.authorEmail,\n          organization: advancedInfo.organization\n        },\n        complexity: this.calculateComplexity(),\n        metrics: {\n          nodeCount: this.previewNodes.length\n        }\n      }\n    };\n\n    if (this.data.mode === 'create') {\n      this.templateService.createTemplate(\n        templateData.name!,\n        templateData.description!,\n        templateData.category!,\n        templateData.nodes!,\n        templateData.rootNodes!,\n        templateData.tags,\n        templateData.requiredFields\n      ).subscribe({\n        next: (template) => {\n          // Update with additional metadata\n          this.templateService.updateTemplate(template.id, {\n            icon: templateData.icon,\n            example: templateData.example,\n            metadata: templateData.metadata\n          }).subscribe({\n            next: (updatedTemplate) => {\n              this.dialogRef.close({\n                action: 'save',\n                template: updatedTemplate\n              } as TemplateEditorResult);\n            }\n          });\n        },\n        error: (error) => {\n          this.snackBar.open(`Failed to create template: ${error.message}`, 'Close', {\n            duration: 5000\n          });\n        }\n      });\n    } else if (this.data.template) {\n      this.templateService.updateTemplate(this.data.template.id, templateData).subscribe({\n        next: (template) => {\n          this.dialogRef.close({\n            action: 'save',\n            template\n          } as TemplateEditorResult);\n        },\n        error: (error) => {\n          this.snackBar.open(`Failed to update template: ${error.message}`, 'Close', {\n            duration: 5000\n          });\n        }\n      });\n    }\n  }\n\n  previewTemplate(): void {\n    // Implementation would show template preview\n    this.snackBar.open('Template preview would be shown here', 'Close', {\n      duration: 3000\n    });\n  }\n\n  deleteTemplate(): void {\n    if (this.data.mode === 'edit' && this.data.template) {\n      const confirmMessage = `Are you sure you want to delete the template \"${this.data.template.name}\"?`;\n      \n      if (confirm(confirmMessage)) {\n        this.templateService.deleteTemplate(this.data.template.id).subscribe({\n          next: () => {\n            this.dialogRef.close({\n              action: 'save',\n              template: undefined\n            } as TemplateEditorResult);\n          },\n          error: (error) => {\n            this.snackBar.open(`Failed to delete template: ${error.message}`, 'Close', {\n              duration: 5000\n            });\n          }\n        });\n      }\n    }\n  }\n\n  cancel(): void {\n    this.dialogRef.close({\n      action: 'cancel'\n    } as TemplateEditorResult);\n  }\n\n  private calculateComplexity(): 'simple' | 'medium' | 'complex' {\n    const nodeCount = this.previewNodes.length;\n    if (nodeCount <= 2) return 'simple';\n    if (nodeCount <= 5) return 'medium';\n    return 'complex';\n  }\n}\n","import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  MatDialogModule,\n  MatDialogRef,\n  MAT_DIALOG_DATA,\n} from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nimport { RuleTemplate, RuleNode } from '../models/rule-builder.model';\n\nexport interface TemplatePreviewDialogData {\n  template: RuleTemplate;\n}\n\n@Component({\n  selector: 'praxis-template-preview-dialog',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatDialogModule,\n    MatButtonModule,\n    MatIconModule,\n    PraxisIconDirective,\n    MatChipsModule,\n    MatDividerModule,\n    MatCardModule,\n    MatExpansionModule,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"template-preview-dialog\">\n      <div mat-dialog-title class=\"dialog-title\">\n        <div class=\"title-content\">\n          <mat-icon [praxisIcon]=\"data.template.icon || 'rule'\"></mat-icon>\n          <div class=\"title-text\">\n            <h2>{{ data.template.name }}</h2>\n            <p class=\"template-category\">{{ data.template.category }}</p>\n          </div>\n        </div>\n        <div class=\"title-actions\">\n          <mat-chip\n            class=\"complexity-chip\"\n            [class]=\"\n              'complexity-' + (data.template.metadata?.complexity || 'unknown')\n            \"\n          >\n            {{ data.template.metadata?.complexity || 'unknown' }}\n          </mat-chip>\n        </div>\n      </div>\n\n      <div mat-dialog-content class=\"dialog-content\">\n        <!-- Template Description -->\n        <div class=\"template-info\">\n          <h3>Description</h3>\n          <p class=\"template-description\">{{ data.template.description }}</p>\n\n          <div class=\"template-tags\" *ngIf=\"data.template.tags.length > 0\">\n            <h4>Tags</h4>\n            <mat-chip-set>\n              <mat-chip *ngFor=\"let tag of data.template.tags\" class=\"tag-chip\">\n                {{ tag }}\n              </mat-chip>\n            </mat-chip-set>\n          </div>\n        </div>\n\n        <mat-divider></mat-divider>\n\n        <!-- Template Metadata -->\n        <div class=\"template-metadata\">\n          <h3>Template Information</h3>\n          <div class=\"metadata-grid\">\n            <div class=\"metadata-item\" *ngIf=\"data.template.metadata?.version\">\n              <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n              <span class=\"label\">Version:</span>\n              <span class=\"value\">{{ data.template.metadata?.version }}</span>\n            </div>\n            <div\n              class=\"metadata-item\"\n              *ngIf=\"data.template.metadata?.usageCount\"\n            >\n              <mat-icon [praxisIcon]=\"'trending_up'\"></mat-icon>\n              <span class=\"label\">Usage Count:</span>\n              <span class=\"value\">{{\n                data.template.metadata?.usageCount\n              }}</span>\n            </div>\n            <div\n              class=\"metadata-item\"\n              *ngIf=\"data.template.metadata?.createdAt\"\n            >\n              <mat-icon [praxisIcon]=\"'schedule'\"></mat-icon>\n              <span class=\"label\">Created:</span>\n              <span class=\"value\">{{\n                formatDate(data.template.metadata?.createdAt)\n              }}</span>\n            </div>\n            <div\n              class=\"metadata-item\"\n              *ngIf=\"data.template.metadata?.updatedAt\"\n            >\n              <mat-icon [praxisIcon]=\"'update'\"></mat-icon>\n              <span class=\"label\">Updated:</span>\n              <span class=\"value\">{{\n                formatDate(data.template.metadata?.updatedAt)\n              }}</span>\n            </div>\n            <div\n              class=\"metadata-item\"\n              *ngIf=\"data.template.metadata?.author?.name\"\n            >\n              <mat-icon [praxisIcon]=\"'person'\"></mat-icon>\n              <span class=\"label\">Author:</span>\n              <span class=\"value\">{{\n                data.template.metadata?.author?.name\n              }}</span>\n            </div>\n            <div class=\"metadata-item\">\n              <mat-icon [praxisIcon]=\"'account_tree'\"></mat-icon>\n              <span class=\"label\">Nodes:</span>\n              <span class=\"value\">{{ data.template.nodes.length }}</span>\n            </div>\n          </div>\n        </div>\n\n        <mat-divider></mat-divider>\n\n        <!-- Rule Structure Preview -->\n        <div class=\"rule-structure\">\n          <h3>Rule Structure</h3>\n          <div class=\"structure-container\">\n            <mat-expansion-panel\n              *ngFor=\"let rootNodeId of data.template.rootNodes; let i = index\"\n              [expanded]=\"i === 0\"\n              class=\"root-node-panel\"\n            >\n              <mat-expansion-panel-header>\n                <mat-panel-title>\n                  <mat-icon>{{\n                    getNodeIcon(getRootNode(rootNodeId))\n                  }}</mat-icon>\n                  <span>{{\n                    getRootNode(rootNodeId)?.label ||\n                      getRootNode(rootNodeId)?.type ||\n                      'Unknown Node'\n                  }}</span>\n                </mat-panel-title>\n                <mat-panel-description>\n                  {{ getNodeDescription(getRootNode(rootNodeId)) }}\n                </mat-panel-description>\n              </mat-expansion-panel-header>\n\n              <div class=\"node-details\">\n                <div class=\"node-tree\">\n                  <div\n                    class=\"tree-node\"\n                    *ngFor=\"let node of getNodeHierarchy(rootNodeId)\"\n                    [style.margin-left.px]=\"node.level * 20\"\n                  >\n                    <div class=\"node-content\">\n                      <mat-icon class=\"node-icon\">{{\n                        getNodeIcon(node.node)\n                      }}</mat-icon>\n                      <span class=\"node-label\">{{\n                        node.node.label || node.node.type\n                      }}</span>\n                      <mat-chip class=\"node-type-chip\" size=\"small\">{{\n                        node.node.type\n                      }}</mat-chip>\n                    </div>\n                    <div class=\"node-config\" *ngIf=\"node.node.config\">\n                      <pre class=\"config-preview\">{{\n                        formatConfig(node.node.config)\n                      }}</pre>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </mat-expansion-panel>\n          </div>\n        </div>\n\n        <!-- Required Fields -->\n        <div\n          class=\"required-fields\"\n          *ngIf=\"\n            data.template.requiredFields &&\n            data.template.requiredFields.length > 0\n          \"\n        >\n          <mat-divider></mat-divider>\n          <h3>Required Fields</h3>\n          <mat-chip-set>\n            <mat-chip\n              *ngFor=\"let field of data.template.requiredFields\"\n              color=\"accent\"\n              class=\"required-field-chip\"\n            >\n              {{ field }}\n            </mat-chip>\n          </mat-chip-set>\n          <p class=\"fields-note\">\n            These fields must be available in your form schema for the template\n            to work correctly.\n          </p>\n        </div>\n\n        <!-- Example Usage -->\n        <div class=\"example-usage\" *ngIf=\"data.template.example\">\n          <mat-divider></mat-divider>\n          <h3>Example Usage</h3>\n          <div class=\"example-content\">\n            <pre class=\"example-code\">{{ data.template.example }}</pre>\n          </div>\n        </div>\n      </div>\n\n      <div mat-dialog-actions class=\"dialog-actions\">\n        <button mat-button (click)=\"cancel()\">Close</button>\n\n        <div class=\"actions-spacer\"></div>\n\n        <button mat-stroked-button color=\"primary\" (click)=\"exportTemplate()\">\n          <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n          Export\n        </button>\n\n        <button mat-flat-button color=\"primary\" (click)=\"applyTemplate()\">\n          <mat-icon [praxisIcon]=\"'play_arrow'\"></mat-icon>\n          Apply Template\n        </button>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .template-preview-dialog {\n        min-width: 500px;\n        max-width: 700px;\n      }\n\n      .dialog-title {\n        padding: 24px 24px 0;\n        margin: 0;\n      }\n\n      .title-content {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        margin-bottom: 8px;\n      }\n\n      .title-content mat-icon {\n        font-size: 32px;\n        width: 32px;\n        height: 32px;\n        color: var(--md-sys-color-primary);\n      }\n\n      .title-text h2 {\n        margin: 0;\n        font-size: 24px;\n        font-weight: 500;\n      }\n\n      .template-category {\n        margin: 4px 0 0 0;\n        font-size: 14px;\n        color: var(--md-sys-color-on-surface-variant);\n        text-transform: capitalize;\n      }\n\n      .title-actions {\n        display: flex;\n        justify-content: flex-end;\n        margin-bottom: 16px;\n      }\n\n      .complexity-chip {\n        font-size: 11px;\n      }\n\n      .complexity-simple { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); }\n\n      .complexity-medium { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); }\n\n      .complexity-complex { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); }\n\n      .dialog-content {\n        padding: 16px 24px;\n        max-height: 70vh;\n        overflow-y: auto;\n      }\n\n      .template-info h3,\n      .template-metadata h3,\n      .rule-structure h3,\n      .required-fields h3,\n      .example-usage h3 {\n        margin: 0 0 12px 0;\n        font-size: 16px;\n        font-weight: 500;\n        color: var(--md-sys-color-primary);\n      }\n\n      .template-description {\n        margin: 0 0 16px 0;\n        line-height: 1.5;\n      }\n\n      .template-tags h4 {\n        margin: 0 0 8px 0;\n        font-size: 14px;\n        font-weight: 500;\n      }\n\n      .tag-chip {\n        margin-right: 4px;\n        margin-bottom: 4px;\n      }\n\n      .metadata-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n        gap: 12px;\n        margin-bottom: 16px;\n      }\n\n      .metadata-item {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px;\n        background: var(--md-sys-color-surface-variant);\n        border-radius: 8px;\n      }\n\n      .metadata-item mat-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n        color: var(--md-sys-color-primary);\n      }\n\n      .metadata-item .label {\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      .metadata-item .value {\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .structure-container {\n        margin-top: 8px;\n      }\n\n      .root-node-panel {\n        margin-bottom: 8px;\n      }\n\n      .node-details {\n        padding: 0 16px 16px;\n      }\n\n      .tree-node {\n        margin-bottom: 8px;\n        padding: 8px;\n        border-left: 2px solid var(--md-sys-color-outline);\n        background: var(--md-sys-color-surface-variant);\n        border-radius: 4px;\n      }\n\n      .node-content {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 4px;\n      }\n\n      .node-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n        color: var(--md-sys-color-primary);\n      }\n\n      .node-label {\n        flex: 1;\n        font-weight: 500;\n      }\n\n      .node-type-chip {\n        font-size: 10px;\n        height: 20px;\n        line-height: 20px;\n      }\n\n      .node-config {\n        margin-top: 4px;\n      }\n\n      .config-preview {\n        font-size: 11px;\n        margin: 0;\n        padding: 4px 8px;\n        background: var(--md-sys-color-surface);\n        border-radius: 4px;\n        border: 1px solid var(--md-sys-color-outline);\n        overflow-x: auto;\n      }\n\n      .required-field-chip {\n        margin-right: 4px;\n        margin-bottom: 4px;\n      }\n\n      .fields-note {\n        margin: 12px 0 0 0;\n        font-size: 13px;\n        color: var(--md-sys-color-on-surface-variant);\n        font-style: italic;\n      }\n\n      .example-content {\n        background: var(--md-sys-color-surface-variant);\n        border-radius: 8px;\n        padding: 16px;\n      }\n\n      .example-code {\n        margin: 0;\n        font-family: 'Courier New', monospace;\n        font-size: 12px;\n        line-height: 1.4;\n        overflow-x: auto;\n      }\n\n      .dialog-actions {\n        padding: 16px 24px;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .actions-spacer {\n        flex: 1;\n      }\n\n      mat-divider {\n        margin: 16px 0;\n      }\n\n      /* Responsive adjustments */\n      @media (max-width: 768px) {\n        .template-preview-dialog {\n          min-width: 320px;\n          max-width: 95vw;\n        }\n\n        .metadata-grid {\n          grid-template-columns: 1fr;\n        }\n\n        .title-content {\n          flex-direction: column;\n          align-items: flex-start;\n        }\n      }\n    `,\n  ],\n})\nexport class TemplatePreviewDialogComponent {\n  constructor(\n    private dialogRef: MatDialogRef<TemplatePreviewDialogComponent>,\n    @Inject(MAT_DIALOG_DATA) public data: TemplatePreviewDialogData,\n  ) {}\n\n  getRootNode(nodeId: string): RuleNode | undefined {\n    return this.data.template.nodes.find((n) => n.id === nodeId);\n  }\n\n  getNodeHierarchy(rootNodeId: string): { node: RuleNode; level: number }[] {\n    const result: { node: RuleNode; level: number }[] = [];\n    const visited = new Set<string>();\n\n    const traverse = (nodeId: string, level: number) => {\n      if (visited.has(nodeId)) return;\n      visited.add(nodeId);\n\n      const node = this.data.template.nodes.find((n) => n.id === nodeId);\n      if (!node) return;\n\n      result.push({ node, level });\n\n      // Traverse children\n      if (node.children) {\n        node.children.forEach((childId) => {\n          if (typeof childId === 'string') {\n            traverse(childId, level + 1);\n          }\n        });\n      }\n    };\n\n    traverse(rootNodeId, 0);\n    return result;\n  }\n\n  getNodeIcon(node?: RuleNode): string {\n    if (!node) return 'help';\n\n    const icons: Record<string, string> = {\n      fieldCondition: 'compare_arrows',\n      andGroup: 'join_inner',\n      orGroup: 'join_full',\n      notGroup: 'block',\n      requiredIf: 'star_border',\n      visibleIf: 'visibility',\n      disabledIf: 'disabled_by_default',\n      readonlyIf: 'lock',\n      forEach: 'repeat',\n      uniqueBy: 'fingerprint',\n      minLength: 'expand_less',\n      maxLength: 'expand_more',\n      functionCall: 'functions',\n      fieldToField: 'compare',\n      custom: 'extension',\n    };\n\n    return icons[node.type] || 'rule';\n  }\n\n  getNodeDescription(node?: RuleNode): string {\n    if (!node) return '';\n\n    switch (node.type) {\n      case 'fieldCondition':\n        return 'Field validation rule';\n      case 'andGroup':\n        return 'All conditions must be true';\n      case 'orGroup':\n        return 'At least one condition must be true';\n      case 'notGroup':\n        return 'Condition must be false';\n      case 'requiredIf':\n        return 'Field becomes required when condition is met';\n      case 'visibleIf':\n        return 'Field becomes visible when condition is met';\n      case 'disabledIf':\n        return 'Field becomes disabled when condition is met';\n      case 'readonlyIf':\n        return 'Field becomes readonly when condition is met';\n      case 'forEach':\n        return 'Apply validation to each array item';\n      case 'uniqueBy':\n        return 'Ensure array items are unique by specified fields';\n      case 'minLength':\n        return 'Array must have minimum number of items';\n      case 'maxLength':\n        return 'Array must not exceed maximum items';\n      default:\n        return node.label || 'Custom rule';\n    }\n  }\n\n  formatConfig(config: any): string {\n    try {\n      // Create a simplified version for display\n      const simplified = { ...config };\n\n      // Remove verbose properties for cleaner display\n      delete simplified.type;\n      if (simplified.metadata) {\n        delete simplified.metadata;\n      }\n\n      return JSON.stringify(simplified, null, 2);\n    } catch {\n      return 'Invalid configuration';\n    }\n  }\n\n  formatDate(date?: Date | string): string {\n    if (!date) {\n      return 'Unknown';\n    }\n\n    try {\n      return new Intl.DateTimeFormat('en-US', {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit',\n      }).format(new Date(date));\n    } catch {\n      return 'Invalid date';\n    }\n  }\n\n  applyTemplate(): void {\n    this.dialogRef.close('apply');\n  }\n\n  exportTemplate(): void {\n    this.dialogRef.close('export');\n  }\n\n  cancel(): void {\n    this.dialogRef.close();\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  ReactiveFormsModule,\n  FormBuilder,\n  FormGroup,\n  FormControl,\n  FormsModule,\n} from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nimport { Subject, Observable, BehaviorSubject, combineLatest } from 'rxjs';\nimport {\n  takeUntil,\n  debounceTime,\n  distinctUntilChanged,\n  startWith,\n  map,\n} from 'rxjs/operators';\n\nimport {\n  RuleTemplate,\n  TemplateMetadata,\n  RuleNode,\n} from '../models/rule-builder.model';\nimport {\n  RuleTemplateService,\n  TemplateCategory,\n  TemplateSearchCriteria,\n  TemplateStats,\n} from '../services/rule-template.service';\nimport {\n  TemplateEditorDialogComponent,\n  TemplateEditorDialogData,\n  TemplateEditorResult,\n} from './template-editor-dialog.component';\nimport { TemplatePreviewDialogComponent } from './template-preview-dialog.component';\n\n/**\n * Template display mode\n */\nexport type TemplateDisplayMode = 'grid' | 'list' | 'compact';\n\n/**\n * Template sort option\n */\nexport interface TemplateSortOption {\n  field: keyof RuleTemplate | keyof TemplateMetadata;\n  direction: 'asc' | 'desc';\n  label: string;\n}\n\n@Component({\n  selector: 'praxis-template-gallery',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    MatCardModule,\n    MatButtonModule,\n    MatIconModule,\n    MatInputModule,\n    MatSelectModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatTabsModule,\n    MatDialogModule,\n    MatSnackBarModule,\n    MatMenuModule,\n    MatBadgeModule,\n    MatProgressSpinnerModule,\n    MatExpansionModule,\n    MatDividerModule,\n    MatSlideToggleModule,\n    PraxisIconDirective,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"template-gallery\">\n      <!-- Header Section -->\n      <div class=\"gallery-header\">\n        <div class=\"header-content\">\n          <div class=\"title-section\">\n            <h2 class=\"gallery-title\">\n              <mat-icon [praxisIcon]=\"'widgets'\"></mat-icon>\n              Rule Templates\n            </h2>\n            <p class=\"gallery-subtitle\">\n              Reusable rule patterns for faster development\n            </p>\n          </div>\n\n          <div class=\"header-actions\">\n            <button\n              mat-stroked-button\n              color=\"primary\"\n              (click)=\"showCreateTemplateDialog()\"\n              matTooltip=\"Create new template\"\n            >\n              <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n              Create Template\n            </button>\n\n            <button\n              mat-stroked-button\n              (click)=\"importTemplate()\"\n              matTooltip=\"Import template from file\"\n            >\n              <mat-icon [praxisIcon]=\"'upload'\"></mat-icon>\n              Import\n            </button>\n\n            <button\n              mat-icon-button\n              [matMenuTriggerFor]=\"viewMenu\"\n              matTooltip=\"View options\"\n            >\n              <mat-icon [praxisIcon]=\"'view_module'\"></mat-icon>\n            </button>\n\n            <mat-menu #viewMenu=\"matMenu\">\n              <button mat-menu-item (click)=\"setDisplayMode('grid')\">\n                <mat-icon [praxisIcon]=\"'view_module'\"></mat-icon>\n                Grid View\n              </button>\n              <button mat-menu-item (click)=\"setDisplayMode('list')\">\n                <mat-icon [praxisIcon]=\"'view_list'\"></mat-icon>\n                List View\n              </button>\n              <button mat-menu-item (click)=\"setDisplayMode('compact')\">\n                <mat-icon [praxisIcon]=\"'view_compact'\"></mat-icon>\n                Compact View\n              </button>\n            </mat-menu>\n          </div>\n        </div>\n\n        <!-- Statistics Bar -->\n        <div class=\"stats-bar\" *ngIf=\"stats$ | async as stats\">\n          <div class=\"stat-item\">\n            <mat-icon [praxisIcon]=\"'widgets'\"></mat-icon>\n            <span>{{ stats.totalTemplates }} Templates</span>\n          </div>\n          <div class=\"stat-item\">\n            <mat-icon>folder</mat-icon>\n            <span>{{ stats.categoriesCount }} Categories</span>\n          </div>\n          <div class=\"stat-item\" *ngIf=\"stats.mostUsedTemplate\">\n            <mat-icon>trending_up</mat-icon>\n            <span>Most Used: {{ stats.mostUsedTemplate.name }}</span>\n          </div>\n        </div>\n      </div>\n\n      <!-- Search and Filters -->\n      <div class=\"search-section\">\n        <form [formGroup]=\"searchForm\" class=\"search-form\">\n          <div class=\"search-row\">\n            <mat-form-field appearance=\"outline\" class=\"search-input\">\n              <mat-label>Search templates...</mat-label>\n              <input\n                matInput\n                formControlName=\"query\"\n                placeholder=\"Name, description, or tags\"\n              />\n              <mat-icon matSuffix>search</mat-icon>\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\" class=\"category-select\">\n              <mat-label>Category</mat-label>\n              <mat-select formControlName=\"category\">\n                <mat-option value=\"\">All Categories</mat-option>\n                <mat-option\n                  *ngFor=\"let category of categories$ | async\"\n                  [value]=\"category.id\"\n                >\n                  <div class=\"category-option\">\n                    <mat-icon>{{ category.icon }}</mat-icon>\n                    <span>{{ category.name }}</span>\n                    <span\n                      [matBadge]=\"category.templates.length || 0\"\n                      matBadgeColor=\"primary\"\n                      matBadgeSize=\"small\"\n                    ></span>\n                  </div>\n                </mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\" class=\"complexity-select\">\n              <mat-label>Complexity</mat-label>\n              <mat-select formControlName=\"complexity\">\n                <mat-option value=\"\">Any Complexity</mat-option>\n                <mat-option value=\"simple\">Simple</mat-option>\n                <mat-option value=\"medium\">Medium</mat-option>\n                <mat-option value=\"complex\">Complex</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\" class=\"sort-select\">\n              <mat-label>Sort by</mat-label>\n              <mat-select formControlName=\"sortBy\">\n                <mat-option value=\"name\">Name</mat-option>\n                <mat-option value=\"usageCount\">Usage Count</mat-option>\n                <mat-option value=\"createdAt\">Created Date</mat-option>\n                <mat-option value=\"updatedAt\">Updated Date</mat-option>\n                <mat-option value=\"complexity\">Complexity</mat-option>\n              </mat-select>\n            </mat-form-field>\n          </div>\n\n          <!-- Tags Filter -->\n          <div class=\"tags-section\" *ngIf=\"popularTags.length > 0\">\n            <span class=\"tags-label\">Popular tags:</span>\n            <mat-chip-listbox class=\"tags-list\">\n              <mat-chip-option\n                *ngFor=\"let tag of popularTags\"\n                [selected]=\"selectedTags.has(tag)\"\n                (click)=\"toggleTag(tag)\"\n              >\n                {{ tag }}\n              </mat-chip-option>\n            </mat-chip-listbox>\n          </div>\n\n          <!-- Active Filters -->\n          <div class=\"active-filters\" *ngIf=\"hasActiveFilters()\">\n            <span class=\"filters-label\">Active filters:</span>\n            <mat-chip-set class=\"filter-chips\">\n              <mat-chip\n                *ngIf=\"searchForm.get('category')?.value\"\n                (removed)=\"clearFilter('category')\"\n              >\n                Category:\n                {{ getCategoryName(searchForm.get('category')?.value || '') }}\n                <mat-icon matChipRemove>cancel</mat-icon>\n              </mat-chip>\n              <mat-chip\n                *ngIf=\"searchForm.get('complexity')?.value\"\n                (removed)=\"clearFilter('complexity')\"\n              >\n                Complexity: {{ searchForm.get('complexity')?.value || '' }}\n                <mat-icon matChipRemove>cancel</mat-icon>\n              </mat-chip>\n              <mat-chip\n                *ngFor=\"let tag of Array.from(selectedTags)\"\n                (removed)=\"toggleTag(tag)\"\n              >\n                {{ tag }}\n                <mat-icon matChipRemove>cancel</mat-icon>\n              </mat-chip>\n            </mat-chip-set>\n            <button\n              mat-button\n              color=\"warn\"\n              class=\"clear-all-button\"\n              (click)=\"clearAllFilters()\"\n            >\n              Clear All\n            </button>\n          </div>\n        </form>\n      </div>\n\n      <!-- Recently Used Section -->\n      <div\n        class=\"recently-used-section\"\n        *ngIf=\"recentlyUsed$ | async as recentTemplates\"\n      >\n        <div *ngIf=\"recentTemplates.length > 0\">\n          <h3 class=\"section-title\">\n            <mat-icon>history</mat-icon>\n            Recently Used\n          </h3>\n          <div class=\"recent-templates\">\n            <div\n              *ngFor=\"let template of recentTemplates.slice(0, 5)\"\n              class=\"recent-template-item\"\n            >\n              <button\n                mat-stroked-button\n                class=\"recent-template-button\"\n                (click)=\"applyTemplate(template)\"\n                [matTooltip]=\"template.description\"\n              >\n                <mat-icon>{{ template.icon || 'rule' }}</mat-icon>\n                <span>{{ template.name }}</span>\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Templates Grid/List -->\n      <div class=\"templates-section\">\n        <div class=\"templates-header\">\n          <h3 class=\"section-title\">\n            <mat-icon>library_books</mat-icon>\n            Templates\n            <span class=\"template-count\"\n              >({{ (filteredTemplates$ | async)?.length || 0 }})</span\n            >\n          </h3>\n\n          <div class=\"view-toggle\">\n            <mat-slide-toggle [(ngModel)]=\"showPreview\">\n              Show Preview\n            </mat-slide-toggle>\n          </div>\n        </div>\n\n        <div\n          class=\"templates-container\"\n          [class.grid-view]=\"displayMode === 'grid'\"\n          [class.list-view]=\"displayMode === 'list'\"\n          [class.compact-view]=\"displayMode === 'compact'\"\n        >\n          <div\n            *ngFor=\"\n              let template of filteredTemplates$ | async;\n              trackBy: trackByTemplateId\n            \"\n            class=\"template-card\"\n          >\n            <!-- Grid View Template Card -->\n            <mat-card *ngIf=\"displayMode === 'grid'\" class=\"template-grid-card\">\n              <mat-card-header>\n                <div mat-card-avatar class=\"template-icon\">\n                  <mat-icon>{{ template.icon || 'rule' }}</mat-icon>\n                </div>\n                <mat-card-title>{{ template.name }}</mat-card-title>\n                <mat-card-subtitle>{{ template.category }}</mat-card-subtitle>\n\n                <div class=\"card-actions\">\n                  <button\n                    mat-icon-button\n                    [matMenuTriggerFor]=\"templateMenu\"\n                    (click)=\"$event.stopPropagation()\"\n                  >\n                    <mat-icon>more_vert</mat-icon>\n                  </button>\n\n                  <mat-menu #templateMenu=\"matMenu\">\n                    <button mat-menu-item (click)=\"applyTemplate(template)\">\n                      <mat-icon>play_arrow</mat-icon>\n                      Apply Template\n                    </button>\n                    <button mat-menu-item (click)=\"previewTemplate(template)\">\n                      <mat-icon>preview</mat-icon>\n                      Preview\n                    </button>\n                    <button mat-menu-item (click)=\"editTemplate(template)\">\n                      <mat-icon>edit</mat-icon>\n                      Edit\n                    </button>\n                    <button mat-menu-item (click)=\"duplicateTemplate(template)\">\n                      <mat-icon>content_copy</mat-icon>\n                      Duplicate\n                    </button>\n                    <button mat-menu-item (click)=\"exportTemplate(template)\">\n                      <mat-icon>download</mat-icon>\n                      Export\n                    </button>\n                    <mat-divider></mat-divider>\n                    <button\n                      mat-menu-item\n                      color=\"warn\"\n                      (click)=\"deleteTemplate(template)\"\n                    >\n                      <mat-icon>delete</mat-icon>\n                      Delete\n                    </button>\n                  </mat-menu>\n                </div>\n              </mat-card-header>\n\n              <mat-card-content>\n                <p class=\"template-description\">{{ template.description }}</p>\n\n                <div class=\"template-tags\">\n                  <mat-chip-set>\n                    <mat-chip\n                      *ngFor=\"let tag of template.tags.slice(0, 3)\"\n                      class=\"template-tag\"\n                    >\n                      {{ tag }}\n                    </mat-chip>\n                    <mat-chip\n                      *ngIf=\"template.tags.length > 3\"\n                      class=\"more-tags\"\n                    >\n                      +{{ template.tags.length - 3 }}\n                    </mat-chip>\n                  </mat-chip-set>\n                </div>\n\n                <div class=\"template-metadata\">\n                  <div class=\"metadata-item\">\n                    <mat-icon>complexity</mat-icon>\n                    <span>{{\n                      template.metadata?.complexity || 'unknown'\n                    }}</span>\n                  </div>\n                  <div\n                    class=\"metadata-item\"\n                    *ngIf=\"template.metadata?.usageCount\"\n                  >\n                    <mat-icon>trending_up</mat-icon>\n                    <span>{{ template.metadata?.usageCount }} uses</span>\n                  </div>\n                  <div class=\"metadata-item\">\n                    <mat-icon>schedule</mat-icon>\n                    <span>{{\n                      getRelativeDate(template.metadata?.updatedAt)\n                    }}</span>\n                  </div>\n                </div>\n\n                <!-- Template Preview -->\n                <div class=\"template-preview\" *ngIf=\"showPreview\">\n                  <div class=\"preview-header\">\n                    <mat-icon>preview</mat-icon>\n                    <span>Structure Preview</span>\n                  </div>\n                  <div class=\"preview-content\">\n                    <div class=\"node-tree\">\n                      <div\n                        *ngFor=\"let nodeId of template.rootNodes\"\n                        class=\"root-node\"\n                      >\n                        {{ getNodeLabel(template, nodeId) }}\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </mat-card-content>\n\n              <mat-card-actions align=\"end\">\n                <button\n                  mat-button\n                  color=\"primary\"\n                  (click)=\"applyTemplate(template)\"\n                >\n                  <mat-icon>play_arrow</mat-icon>\n                  Apply\n                </button>\n                <button mat-button (click)=\"previewTemplate(template)\">\n                  <mat-icon>preview</mat-icon>\n                  Preview\n                </button>\n              </mat-card-actions>\n            </mat-card>\n\n            <!-- List View Template Card -->\n            <mat-card *ngIf=\"displayMode === 'list'\" class=\"template-list-card\">\n              <div class=\"list-card-content\">\n                <div class=\"template-info\">\n                  <div class=\"template-header\">\n                    <mat-icon class=\"template-icon\">{{\n                      template.icon || 'rule'\n                    }}</mat-icon>\n                    <div class=\"template-details\">\n                      <h4 class=\"template-name\">{{ template.name }}</h4>\n                      <p class=\"template-description\">\n                        {{ template.description }}\n                      </p>\n                    </div>\n                  </div>\n\n                  <div class=\"template-meta\">\n                    <span class=\"category-badge\">{{ template.category }}</span>\n                    <span\n                      class=\"complexity-badge\"\n                      [class]=\"\n                        'complexity-' +\n                        (template.metadata?.complexity || 'unknown')\n                      \"\n                    >\n                      {{ template.metadata?.complexity || 'unknown' }}\n                    </span>\n                    <span\n                      class=\"usage-count\"\n                      *ngIf=\"template.metadata?.usageCount\"\n                    >\n                      {{ template.metadata?.usageCount }} uses\n                    </span>\n                  </div>\n                </div>\n\n                <div class=\"template-actions\">\n                  <button\n                    mat-flat-button\n                    color=\"primary\"\n                    (click)=\"applyTemplate(template)\"\n                  >\n                    Apply\n                  </button>\n                  <button\n                    mat-stroked-button\n                    (click)=\"previewTemplate(template)\"\n                  >\n                    Preview\n                  </button>\n                  <button\n                    mat-icon-button\n                    [matMenuTriggerFor]=\"listTemplateMenu\"\n                  >\n                    <mat-icon>more_vert</mat-icon>\n                  </button>\n\n                  <mat-menu #listTemplateMenu=\"matMenu\">\n                    <button mat-menu-item (click)=\"editTemplate(template)\">\n                      <mat-icon>edit</mat-icon>\n                      Edit\n                    </button>\n                    <button mat-menu-item (click)=\"duplicateTemplate(template)\">\n                      <mat-icon>content_copy</mat-icon>\n                      Duplicate\n                    </button>\n                    <button mat-menu-item (click)=\"exportTemplate(template)\">\n                      <mat-icon>download</mat-icon>\n                      Export\n                    </button>\n                    <button mat-menu-item (click)=\"deleteTemplate(template)\">\n                      <mat-icon>delete</mat-icon>\n                      Delete\n                    </button>\n                  </mat-menu>\n                </div>\n              </div>\n            </mat-card>\n\n            <!-- Compact View Template Card -->\n            <div\n              *ngIf=\"displayMode === 'compact'\"\n              class=\"template-compact-card\"\n            >\n              <div class=\"compact-content\">\n                <mat-icon class=\"compact-icon\">{{\n                  template.icon || 'rule'\n                }}</mat-icon>\n                <div class=\"compact-info\">\n                  <span class=\"compact-name\">{{ template.name }}</span>\n                  <span class=\"compact-category\">{{ template.category }}</span>\n                </div>\n                <div class=\"compact-actions\">\n                  <button\n                    mat-icon-button\n                    (click)=\"applyTemplate(template)\"\n                    matTooltip=\"Apply template\"\n                  >\n                    <mat-icon>play_arrow</mat-icon>\n                  </button>\n                  <button\n                    mat-icon-button\n                    (click)=\"previewTemplate(template)\"\n                    matTooltip=\"Preview template\"\n                  >\n                    <mat-icon>preview</mat-icon>\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <!-- Empty State -->\n          <div\n            *ngIf=\"(filteredTemplates$ | async)?.length === 0\"\n            class=\"empty-state\"\n          >\n            <mat-icon class=\"empty-icon\">widgets</mat-icon>\n            <h3>No templates found</h3>\n            <p>Try adjusting your search criteria or create a new template.</p>\n            <button mat-flat-button color=\"primary\" (click)=\"clearAllFilters()\">\n              Clear Filters\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      :host { --vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,0.08)); --vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,0.18)); --vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,0.32)); }\n      .template-gallery {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        background: var(--md-sys-color-background);\n      }\n\n      .gallery-header {\n        background: var(--md-sys-color-surface);\n        border-bottom: 1px solid var(--md-sys-color-outline);\n        padding: 16px 24px;\n      }\n\n      .header-content {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 16px;\n      }\n\n      .title-section {\n        flex: 1;\n      }\n\n      .gallery-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin: 0;\n        font-size: 24px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      .gallery-subtitle {\n        margin: 4px 0 0 32px;\n        color: var(--md-sys-color-on-surface-variant);\n        font-size: 14px;\n      }\n\n      .header-actions {\n        display: flex;\n        gap: 8px;\n        align-items: center;\n      }\n\n      .stats-bar {\n        display: flex;\n        gap: 24px;\n        padding: 12px 0;\n        border-top: 1px solid var(--md-sys-color-outline);\n      }\n\n      .stat-item {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        font-size: 13px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .stat-item mat-icon {\n        font-size: 16px;\n        width: 16px;\n        height: 16px;\n      }\n\n      .search-section {\n        padding: 16px 24px;\n        background: var(--md-sys-color-surface-variant);\n        border-bottom: 1px solid var(--md-sys-color-outline);\n      }\n\n      .search-form {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .search-row {\n        display: flex;\n        gap: 16px;\n        align-items: flex-start;\n      }\n\n      .search-input {\n        flex: 2;\n        min-width: 300px;\n      }\n\n      .category-select,\n      .complexity-select,\n      .sort-select {\n        flex: 1;\n        min-width: 150px;\n      }\n\n      .category-option {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        width: 100%;\n      }\n\n      .tags-section {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        flex-wrap: wrap;\n      }\n\n      .tags-label {\n        font-size: 13px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .tags-list {\n        flex: 1;\n      }\n\n      .active-filters {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        flex-wrap: wrap;\n        padding: 8px 0;\n        border-top: 1px solid var(--md-sys-color-outline);\n      }\n\n      .filters-label {\n        font-size: 13px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .filter-chips {\n        flex: 1;\n      }\n\n      .clear-all-button {\n        font-size: 12px;\n      }\n\n      .recently-used-section {\n        padding: 16px 24px;\n      }\n\n      .section-title {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin: 0 0 16px 0;\n        font-size: 16px;\n        font-weight: 500;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      .template-count {\n        font-size: 14px;\n        font-weight: 400;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .recent-templates {\n        display: flex;\n        gap: 12px;\n        flex-wrap: wrap;\n      }\n\n      .recent-template-button {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px 16px;\n      }\n\n      .templates-section {\n        flex: 1;\n        padding: 0 24px 24px;\n        overflow: auto;\n      }\n\n      .templates-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 16px;\n      }\n\n      .view-toggle {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .templates-container {\n        min-height: 200px;\n      }\n\n      /* Grid View */\n      .templates-container.grid-view {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n        gap: 16px;\n      }\n\n      .template-grid-card {\n        height: fit-content;\n        transition:\n          transform 0.2s ease,\n          box-shadow 0.2s ease;\n      }\n\n      .template-grid-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px var(--vb-shadow-medium-color); }\n\n      .template-icon {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 40px;\n        height: 40px;\n        border-radius: 50%;\n        background: var(--md-sys-color-primary-container);\n        color: var(--md-sys-color-on-primary-container);\n      }\n\n      .card-actions {\n        margin-left: auto;\n      }\n\n      .template-description {\n        font-size: 14px;\n        line-height: 1.4;\n        margin: 0 0 12px 0;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .template-tags {\n        margin-bottom: 12px;\n      }\n\n      .template-tag {\n        font-size: 11px;\n        height: 20px;\n        line-height: 20px;\n      }\n\n      .more-tags { background: var(--md-sys-color-surface-variant); color: var(--md-sys-color-on-surface-variant); }\n\n      .template-metadata {\n        display: flex;\n        gap: 16px;\n        flex-wrap: wrap;\n        margin-bottom: 12px;\n      }\n\n      .metadata-item {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .metadata-item mat-icon {\n        font-size: 14px;\n        width: 14px;\n        height: 14px;\n      }\n\n      .template-preview {\n        margin-top: 12px;\n        padding: 8px;\n        background: var(--md-sys-color-surface-variant);\n        border-radius: 4px;\n      }\n\n      .preview-header {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 12px;\n        font-weight: 500;\n        margin-bottom: 8px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .preview-header mat-icon {\n        font-size: 14px;\n        width: 14px;\n        height: 14px;\n      }\n\n      .node-tree {\n        font-size: 11px;\n        font-family: monospace;\n      }\n\n      .root-node {\n        padding: 2px 0;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      /* List View */\n      .templates-container.list-view {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .template-list-card {\n        padding: 12px 16px;\n      }\n\n      .list-card-content {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        gap: 16px;\n      }\n\n      .template-info {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .template-header {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n      }\n\n      .template-details {\n        flex: 1;\n      }\n\n      .template-name {\n        margin: 0;\n        font-size: 16px;\n        font-weight: 500;\n      }\n\n      .template-meta {\n        display: flex;\n        gap: 8px;\n        align-items: center;\n      }\n\n      .category-badge,\n      .complexity-badge {\n        font-size: 11px;\n        padding: 2px 6px;\n        border-radius: 12px;\n        background: var(--md-sys-color-surface-variant);\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .complexity-simple {\n        background: var(--md-sys-color-tertiary-container);\n        color: var(--md-sys-color-on-tertiary-container);\n      }\n\n      .complexity-medium {\n        background: var(--md-sys-color-secondary-container);\n        color: var(--md-sys-color-on-secondary-container);\n      }\n\n      .complexity-complex {\n        background: var(--md-sys-color-error-container);\n        color: var(--md-sys-color-on-error-container);\n      }\n\n      .usage-count {\n        font-size: 11px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .template-actions {\n        display: flex;\n        gap: 8px;\n        align-items: center;\n      }\n\n      /* Compact View */\n      .templates-container.compact-view {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .template-compact-card {\n        padding: 8px 12px;\n        border: 1px solid var(--md-sys-color-outline);\n        border-radius: 4px;\n        background: var(--md-sys-color-surface);\n      }\n\n      .compact-content {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n      }\n\n      .compact-icon {\n        color: var(--md-sys-color-primary);\n      }\n\n      .compact-info {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n      }\n\n      .compact-name {\n        font-size: 14px;\n        font-weight: 500;\n      }\n\n      .compact-category {\n        font-size: 12px;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .compact-actions {\n        display: flex;\n        gap: 4px;\n      }\n\n      /* Empty State */\n      .empty-state {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        padding: 48px 24px;\n        text-align: center;\n        color: var(--md-sys-color-on-surface-variant);\n      }\n\n      .empty-icon {\n        font-size: 64px;\n        width: 64px;\n        height: 64px;\n        margin-bottom: 16px;\n        color: var(--md-sys-color-outline);\n      }\n\n      .empty-state h3 {\n        margin: 0 0 8px 0;\n        color: var(--md-sys-color-on-surface);\n      }\n\n      .empty-state p {\n        margin: 0 0 16px 0;\n        max-width: 400px;\n      }\n\n      /* Responsive adjustments */\n      @media (max-width: 1024px) {\n        .templates-container.grid-view {\n          grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n        }\n\n        .search-row {\n          flex-wrap: wrap;\n        }\n\n        .search-input {\n          flex: 1 1 100%;\n        }\n      }\n\n      @media (max-width: 768px) {\n        .header-content {\n          flex-direction: column;\n          gap: 16px;\n          align-items: flex-start;\n        }\n\n        .templates-container.grid-view {\n          grid-template-columns: 1fr;\n        }\n\n        .stats-bar {\n          flex-wrap: wrap;\n          gap: 12px;\n        }\n\n        .gallery-subtitle {\n          margin-left: 0;\n        }\n      }\n    `,\n  ],\n})\nexport class TemplateGalleryComponent implements OnInit, OnDestroy {\n  @Input() availableFields: string[] = [];\n\n  @Output() templateApplied = new EventEmitter<RuleTemplate>();\n  @Output() templateCreated = new EventEmitter<RuleTemplate>();\n  @Output() templateDeleted = new EventEmitter<string>();\n\n  private destroy$ = new Subject<void>();\n\n  searchForm: FormGroup;\n  displayMode: TemplateDisplayMode = 'grid';\n  showPreview = false;\n  selectedTags = new Set<string>();\n  popularTags: string[] = [];\n\n  // Observables\n  templates$!: Observable<RuleTemplate[]>;\n  categories$!: Observable<TemplateCategory[]>;\n  recentlyUsed$!: Observable<RuleTemplate[]>;\n  stats$!: Observable<TemplateStats>;\n  filteredTemplates$: Observable<RuleTemplate[]>;\n\n  Array = Array; // For template usage\n\n  constructor(\n    private templateService: RuleTemplateService,\n    private fb: FormBuilder,\n    private dialog: MatDialog,\n    private snackBar: MatSnackBar,\n  ) {\n    this.searchForm = this.createSearchForm();\n    this.templates$ = this.templateService.getTemplates();\n    this.categories$ = this.templateService.getCategories();\n    this.recentlyUsed$ = this.templateService.recentlyUsed$;\n    this.stats$ = this.templateService.getTemplateStats();\n    this.filteredTemplates$ = this.createFilteredTemplatesStream();\n  }\n\n  ngOnInit(): void {\n    this.setupFormSubscriptions();\n    this.loadPopularTags();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private createSearchForm(): FormGroup {\n    return this.fb.group({\n      query: [''],\n      category: [''],\n      complexity: [''],\n      sortBy: ['name'],\n    });\n  }\n\n  private createFilteredTemplatesStream(): Observable<RuleTemplate[]> {\n    return combineLatest([\n      this.templates$,\n      this.searchForm.valueChanges.pipe(\n        startWith(this.searchForm.value),\n        debounceTime(300),\n        distinctUntilChanged(),\n      ),\n    ]).pipe(\n      map(([templates, filters]) => {\n        const criteria: TemplateSearchCriteria = {\n          query: filters.query || undefined,\n          category: filters.category || undefined,\n          complexity: filters.complexity || undefined,\n          tags:\n            this.selectedTags.size > 0\n              ? Array.from(this.selectedTags)\n              : undefined,\n        };\n\n        // Apply filters\n        let filtered = this.filterTemplates(templates, criteria);\n\n        // Apply sorting\n        filtered = this.sortTemplates(filtered, filters.sortBy);\n\n        return filtered;\n      }),\n    );\n  }\n\n  private setupFormSubscriptions(): void {\n    // Additional subscriptions can be added here\n  }\n\n  private loadPopularTags(): void {\n    this.stats$.pipe(takeUntil(this.destroy$)).subscribe((stats) => {\n      this.popularTags = stats.popularTags.slice(0, 10);\n    });\n  }\n\n  private filterTemplates(\n    templates: RuleTemplate[],\n    criteria: TemplateSearchCriteria,\n  ): RuleTemplate[] {\n    let filtered = templates;\n\n    if (criteria.query) {\n      const query = criteria.query.toLowerCase();\n      filtered = filtered.filter(\n        (t) =>\n          t.name.toLowerCase().includes(query) ||\n          t.description.toLowerCase().includes(query) ||\n          t.tags.some((tag) => tag.toLowerCase().includes(query)),\n      );\n    }\n\n    if (criteria.category) {\n      filtered = filtered.filter((t) => t.category === criteria.category);\n    }\n\n    if (criteria.complexity) {\n      filtered = filtered.filter(\n        (t) => t.metadata?.complexity === criteria.complexity,\n      );\n    }\n\n    if (criteria.tags && criteria.tags.length > 0) {\n      filtered = filtered.filter((t) =>\n        criteria.tags!.some((tag) => t.tags.includes(tag)),\n      );\n    }\n\n    return filtered;\n  }\n\n  private sortTemplates(\n    templates: RuleTemplate[],\n    sortBy: string,\n  ): RuleTemplate[] {\n    return [...templates].sort((a, b) => {\n      switch (sortBy) {\n        case 'name':\n          return a.name.localeCompare(b.name);\n        case 'usageCount':\n          return (b.metadata?.usageCount || 0) - (a.metadata?.usageCount || 0);\n        case 'createdAt':\n          const aCreated = a.metadata?.createdAt || new Date(0);\n          const bCreated = b.metadata?.createdAt || new Date(0);\n          return bCreated.getTime() - aCreated.getTime();\n        case 'updatedAt':\n          const aUpdated = a.metadata?.updatedAt || new Date(0);\n          const bUpdated = b.metadata?.updatedAt || new Date(0);\n          return bUpdated.getTime() - aUpdated.getTime();\n        case 'complexity':\n          const complexityOrder = { simple: 0, medium: 1, complex: 2 };\n          const aComplexity =\n            complexityOrder[a.metadata?.complexity || 'simple'];\n          const bComplexity =\n            complexityOrder[b.metadata?.complexity || 'simple'];\n          return aComplexity - bComplexity;\n        default:\n          return 0;\n      }\n    });\n  }\n\n  // Template methods\n  trackByTemplateId(index: number, template: RuleTemplate): string {\n    return template.id;\n  }\n\n  setDisplayMode(mode: TemplateDisplayMode): void {\n    this.displayMode = mode;\n  }\n\n  toggleTag(tag: string): void {\n    if (this.selectedTags.has(tag)) {\n      this.selectedTags.delete(tag);\n    } else {\n      this.selectedTags.add(tag);\n    }\n    // Trigger filter update\n    this.searchForm.updateValueAndValidity();\n  }\n\n  hasActiveFilters(): boolean {\n    const values = this.searchForm.value;\n    return !!(\n      values?.category ||\n      values?.complexity ||\n      this.selectedTags.size > 0\n    );\n  }\n\n  clearFilter(field: string): void {\n    this.searchForm.patchValue({ [field]: '' });\n  }\n\n  clearAllFilters(): void {\n    this.searchForm.reset();\n    this.selectedTags.clear();\n  }\n\n  getCategoryName(categoryId: string): string {\n    const categoryNames: Record<string, string> = {\n      validation: 'Field Validation',\n      business: 'Business Rules',\n      collection: 'Collection Validation',\n      conditional: 'Conditional Logic',\n      workflow: 'Workflow Rules',\n      security: 'Security Validation',\n      custom: 'Custom Templates',\n    };\n    return (\n      categoryNames[categoryId] ||\n      categoryId.charAt(0).toUpperCase() + categoryId.slice(1)\n    );\n  }\n\n  getRelativeDate(date?: Date | string): string {\n    if (!date) {\n      return 'Unknown';\n    }\n\n    const target = new Date(date);\n    const now = new Date();\n    const diff = now.getTime() - target.getTime();\n    const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n    if (days === 0) return 'Today';\n    if (days === 1) return 'Yesterday';\n    if (days < 7) return `${days} days ago`;\n    if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n    if (days < 365) return `${Math.floor(days / 30)} months ago`;\n    return `${Math.floor(days / 365)} years ago`;\n  }\n\n  getNodeLabel(template: RuleTemplate, nodeId: string): string {\n    const node = template.nodes.find((n) => n.id === nodeId);\n    return node?.label || node?.type || 'Unknown';\n  }\n\n  // Template actions\n  showCreateTemplateDialog(selectedNodes?: RuleNode[]): void {\n    const dialogData: TemplateEditorDialogData = {\n      mode: 'create',\n      selectedNodes: selectedNodes || [],\n      availableCategories: [\n        'validation',\n        'business',\n        'collection',\n        'conditional',\n        'workflow',\n        'security',\n        'custom',\n      ],\n    };\n\n    const dialogRef = this.dialog.open(TemplateEditorDialogComponent, {\n      width: '800px',\n      maxWidth: '90vw',\n      maxHeight: '90vh',\n      data: dialogData,\n      disableClose: true,\n    });\n\n    dialogRef\n      .afterClosed()\n      .subscribe((result: TemplateEditorResult | undefined) => {\n        if (result?.action === 'save' && result.template) {\n          this.templateCreated.emit(result.template);\n          this.snackBar.open(\n            `Template \"${result.template.name}\" created successfully`,\n            'Close',\n            {\n              duration: 3000,\n            },\n          );\n        }\n      });\n  }\n\n  importTemplate(): void {\n    // Create file input element\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = '.json,.template.json';\n    input.multiple = false;\n\n    input.onchange = (event: any) => {\n      const file = event.target?.files?.[0];\n      if (!file) return;\n\n      const reader = new FileReader();\n      reader.onload = (e) => {\n        try {\n          const content = e.target?.result as string;\n          this.templateService.importTemplate(content).subscribe({\n            next: (template) => {\n              this.templateCreated.emit(template);\n              this.snackBar.open(\n                `Template \"${template.name}\" imported successfully`,\n                'Close',\n                {\n                  duration: 3000,\n                },\n              );\n            },\n            error: (error) => {\n              this.snackBar.open(\n                `Failed to import template: ${error.message}`,\n                'Close',\n                {\n                  duration: 5000,\n                },\n              );\n            },\n          });\n        } catch (error) {\n          this.snackBar.open('Invalid template file format', 'Close', {\n            duration: 5000,\n          });\n        }\n      };\n      reader.readAsText(file);\n    };\n\n    input.click();\n  }\n\n  applyTemplate(template: RuleTemplate): void {\n    this.templateService.applyTemplate(template.id).subscribe({\n      next: (result) => {\n        if (result.success) {\n          this.templateApplied.emit(template);\n          this.snackBar.open(\n            `Template \"${template.name}\" applied successfully`,\n            'Close',\n            {\n              duration: 3000,\n            },\n          );\n        } else {\n          this.snackBar.open(\n            `Failed to apply template: ${result.errors.join(', ')}`,\n            'Close',\n            {\n              duration: 5000,\n            },\n          );\n        }\n      },\n      error: (error) => {\n        this.snackBar.open(\n          `Error applying template: ${error.message}`,\n          'Close',\n          {\n            duration: 5000,\n          },\n        );\n      },\n    });\n  }\n\n  previewTemplate(template: RuleTemplate): void {\n    // Create a simple preview dialog showing template structure\n    const dialogRef = this.dialog.open(TemplatePreviewDialogComponent, {\n      width: '600px',\n      maxWidth: '90vw',\n      data: { template },\n      panelClass: 'template-preview-dialog',\n    });\n\n    // Handle actions from preview\n    dialogRef.afterClosed().subscribe((action?: string) => {\n      if (action === 'apply') {\n        this.applyTemplate(template);\n      } else if (action === 'export') {\n        this.exportTemplate(template);\n      }\n    });\n  }\n\n  editTemplate(template: RuleTemplate): void {\n    const dialogData: TemplateEditorDialogData = {\n      mode: 'edit',\n      template: template,\n      availableCategories: [\n        'validation',\n        'business',\n        'collection',\n        'conditional',\n        'workflow',\n        'security',\n        'custom',\n      ],\n    };\n\n    const dialogRef = this.dialog.open(TemplateEditorDialogComponent, {\n      width: '800px',\n      maxWidth: '90vw',\n      maxHeight: '90vh',\n      data: dialogData,\n      disableClose: true,\n    });\n\n    dialogRef\n      .afterClosed()\n      .subscribe((result: TemplateEditorResult | undefined) => {\n        if (result?.action === 'save' && result.template) {\n          this.snackBar.open(\n            `Template \"${result.template.name}\" updated successfully`,\n            'Close',\n            {\n              duration: 3000,\n            },\n          );\n        }\n      });\n  }\n\n  duplicateTemplate(template: RuleTemplate): void {\n    this.templateService.duplicateTemplate(template.id).subscribe({\n      next: (duplicated) => {\n        this.snackBar.open(\n          `Template duplicated as \"${duplicated.name}\"`,\n          'Close',\n          {\n            duration: 3000,\n          },\n        );\n      },\n      error: (error) => {\n        this.snackBar.open(\n          `Failed to duplicate template: ${error.message}`,\n          'Close',\n          {\n            duration: 5000,\n          },\n        );\n      },\n    });\n  }\n\n  exportTemplate(template: RuleTemplate): void {\n    this.templateService\n      .exportTemplate(template.id, { format: 'json', prettyPrint: true })\n      .subscribe({\n        next: (jsonData) => {\n          this.downloadFile(\n            jsonData,\n            `${template.name}.template.json`,\n            'application/json',\n          );\n          this.snackBar.open('Template exported successfully', 'Close', {\n            duration: 3000,\n          });\n        },\n        error: (error) => {\n          this.snackBar.open(\n            `Failed to export template: ${error.message}`,\n            'Close',\n            {\n              duration: 5000,\n            },\n          );\n        },\n      });\n  }\n\n  deleteTemplate(template: RuleTemplate): void {\n    if (\n      confirm(\n        `Are you sure you want to delete the template \"${template.name}\"?`,\n      )\n    ) {\n      this.templateService.deleteTemplate(template.id).subscribe({\n        next: () => {\n          this.templateDeleted.emit(template.id);\n          this.snackBar.open('Template deleted successfully', 'Close', {\n            duration: 3000,\n          });\n        },\n        error: (error) => {\n          this.snackBar.open(\n            `Failed to delete template: ${error.message}`,\n            'Close',\n            {\n              duration: 5000,\n            },\n          );\n        },\n      });\n    }\n  }\n\n  private downloadFile(\n    content: string,\n    filename: string,\n    contentType: string,\n  ): void {\n    const blob = new Blob([content], { type: contentType });\n    const url = window.URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = filename;\n    link.click();\n    window.URL.revokeObjectURL(url);\n  }\n}\n","/*\n * Public API Surface of praxis-visual-builder\n */\n\n// Main visual builder library\nexport * from './lib/praxis-visual-builder';\n\n// Core models\nexport * from './lib/models/field-schema.model';\nexport * from './lib/models/rule-builder.model';\nexport * from './lib/models/array-field-schema.model';\n\n// Services\nexport * from './lib/services/field-schema.service';\nexport * from './lib/services/rule-builder.service';\nexport { SpecificationBridgeService } from './lib/services/specification-bridge.service';\nexport type { SpecificationContextualConfig } from './lib/services/specification-bridge.service';\nexport * from './lib/services/round-trip-validator.service';\nexport * from './lib/services/export-integration.service';\nexport * from './lib/services/webhook-integration.service';\nexport * from './lib/services/rule-template.service';\nexport * from './lib/services/rule-validation.service';\nexport * from './lib/services/rule-node-registry.service';\nexport * from './lib/services/converters/converter-factory.service';\nexport * from './lib/services/rule-conversion.service';\nexport * from './lib/services/dsl/dsl-parsing.service';\nexport { ContextManagementService } from './lib/services/context/context-management.service';\nexport type {\n  ContextScope,\n  ContextEntry,\n  ContextValue,\n} from './lib/services/context/context-management.service';\nexport {\n  VisualBuilderError,\n  ValidationError as VBValidationError,\n  ConversionError,\n  RegistryError,\n  DslError,\n  ContextError,\n  ConfigurationError,\n  InternalError,\n  ErrorCategory,\n  ErrorSeverity,\n  ErrorHandler,\n  globalErrorHandler,\n  createError,\n} from './lib/errors/visual-builder-errors';\nexport type {\n  ErrorInfo,\n  ErrorStatistics,\n} from './lib/errors/visual-builder-errors';\n\n// Components\nexport * from './lib/components/rule-editor.component';\nexport * from './lib/components/rule-canvas.component';\nexport * from './lib/components/rule-node.component';\nexport * from './lib/components/field-condition-editor.component';\nexport * from './lib/components/conditional-validator-editor.component';\nexport * from './lib/components/collection-validator-editor.component';\nexport * from './lib/components/metadata-editor.component';\nexport * from './lib/components/dsl-viewer.component';\nexport * from './lib/components/json-viewer.component';\nexport * from './lib/components/round-trip-tester.component';\nexport * from './lib/components/export-dialog.component';\nexport * from './lib/components/dsl-linter.component';\nexport * from './lib/components/visual-rule-builder.component';\nexport * from './lib/components/template-gallery.component';\nexport * from './lib/components/template-editor-dialog.component';\nexport * from './lib/components/template-preview-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i6","i7","i8","i9","i3","i5","i12","i1","i2","i4","i1.RuleNodeRegistryService","i1.FieldConditionConverter","i2.BooleanGroupConverter","i3.CardinalityConverter","i2.ConverterFactoryService","i1.SpecificationBridgeService","uuidv4","i2.RoundTripValidatorService","i1.RoundTripValidatorService","i2.RuleBuilderService","i11","i13","i1.RuleBuilderService","i2.SpecificationBridgeService","i3.ExportIntegrationService","i10","i14","i15","i16","i17","debounceTime","distinctUntilChanged","takeUntil","i2.FieldSchemaService","i2.ExportIntegrationService","ValidationSeverity","i1.ConverterFactoryService","i2.DslParsingService","i3.ContextManagementService","i3.RuleTemplateService","i4.SpecificationBridgeService","i1.RuleTemplateService"],"mappings":"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"}